diff --git a/ui/desktop/src/components/ModelAndProviderContext.tsx b/ui/desktop/src/components/ModelAndProviderContext.tsx index 27d3164b4793..a8aadbb2caa2 100644 --- a/ui/desktop/src/components/ModelAndProviderContext.tsx +++ b/ui/desktop/src/components/ModelAndProviderContext.tsx @@ -8,6 +8,7 @@ import { getModelDisplayName, getProviderDisplayName, } from './settings/models/predefinedModelsUtils'; +import { ensureClientInitialized } from '../utils'; // titles export const UNKNOWN_PROVIDER_TITLE = 'Provider name lookup'; @@ -170,6 +171,7 @@ export const ModelAndProviderProvider: React.FC = const refreshCurrentModelAndProvider = useCallback(async () => { try { + await ensureClientInitialized(); const { model, provider } = await getCurrentModelAndProvider(); setCurrentModel(model); setCurrentProvider(provider); diff --git a/ui/desktop/src/components/settings/models/ModelsSection.tsx b/ui/desktop/src/components/settings/models/ModelsSection.tsx index 9d87472004c5..0ee9defa76e5 100644 --- a/ui/desktop/src/components/settings/models/ModelsSection.tsx +++ b/ui/desktop/src/components/settings/models/ModelsSection.tsx @@ -2,10 +2,13 @@ import { useEffect, useState, useCallback, useRef } from 'react'; import type { View } from '../../../App'; import ModelSettingsButtons from './subcomponents/ModelSettingsButtons'; import { useConfig } from '../../ConfigContext'; -import { useModelAndProvider } from '../../ModelAndProviderContext'; +import { + UNKNOWN_PROVIDER_MSG, + UNKNOWN_PROVIDER_TITLE, + useModelAndProvider, +} from '../../ModelAndProviderContext'; import { toastError } from '../../../toasts'; -import { UNKNOWN_PROVIDER_MSG, UNKNOWN_PROVIDER_TITLE } from './index'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../ui/card'; import ResetProviderSection from '../reset_provider/ResetProviderSection'; diff --git a/ui/desktop/src/components/settings/models/index.ts b/ui/desktop/src/components/settings/models/index.ts deleted file mode 100644 index cb1a665bbf88..000000000000 --- a/ui/desktop/src/components/settings/models/index.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { initializeAgent } from '../../../agent'; -import { toastError, toastSuccess } from '../../../toasts'; -import { ProviderDetails } from '../../../api'; -import Model, { getProviderMetadata } from './modelInterface'; -import { ProviderMetadata } from '../../../api'; - -// titles -export const UNKNOWN_PROVIDER_TITLE = 'Provider name lookup'; - -// errors -const CHANGE_MODEL_ERROR_TITLE = 'Change failed'; -const SWITCH_MODEL_AGENT_ERROR_MSG = - 'Failed to start agent with selected model -- please try again'; -const CONFIG_UPDATE_ERROR_MSG = 'Failed to update configuration settings -- please try again'; -export const UNKNOWN_PROVIDER_MSG = 'Unknown provider in config -- please inspect your config.yaml'; - -// success -const CHANGE_MODEL_TOAST_TITLE = 'Model changed'; -const SWITCH_MODEL_SUCCESS_MSG = 'Successfully switched models'; - -interface changeModelProps { - model: Model; - writeToConfig: (key: string, value: unknown, is_secret: boolean) => Promise; -} - -// TODO: error handling -export async function changeModel({ model, writeToConfig }: changeModelProps) { - const modelName = model.name; - const providerName = model.provider; - try { - await initializeAgent({ - model: model.name, - provider: model.provider, - }); - } catch (error) { - console.error(`Failed to change model at agent step -- ${modelName} ${providerName}`); - toastError({ - title: CHANGE_MODEL_ERROR_TITLE, - msg: SWITCH_MODEL_AGENT_ERROR_MSG, - traceback: error instanceof Error ? error.message : String(error), - }); - // don't write to config - return; - } - - try { - await writeToConfig('GOOSE_PROVIDER', providerName, false); - await writeToConfig('GOOSE_MODEL', modelName, false); - } catch (error) { - console.error(`Failed to change model at config step -- ${modelName} ${providerName}}`); - toastError({ - title: CHANGE_MODEL_ERROR_TITLE, - msg: CONFIG_UPDATE_ERROR_MSG, - traceback: error instanceof Error ? error.message : String(error), - }); - // agent and config will be out of sync at this point - // TODO: reset agent to use current config settings - } finally { - // show toast - toastSuccess({ - title: CHANGE_MODEL_TOAST_TITLE, - msg: `${SWITCH_MODEL_SUCCESS_MSG} -- using ${model.alias ?? modelName} from ${model.subtext ?? providerName}`, - }); - } -} - -interface getCurrentModelAndProviderProps { - readFromConfig: (key: string, is_secret: boolean) => Promise; - writeToConfig?: (key: string, value: unknown, is_secret: boolean) => Promise; -} - -export async function getCurrentModelAndProvider({ - readFromConfig, - writeToConfig, -}: getCurrentModelAndProviderProps) { - let model: string; - let provider: string; - - // read from config - try { - model = (await readFromConfig('GOOSE_MODEL', false)) as string; - provider = (await readFromConfig('GOOSE_PROVIDER', false)) as string; - } catch (error) { - console.error(`Failed to read GOOSE_MODEL or GOOSE_PROVIDER from config`); - throw error; - } - if (!model || !provider) { - console.log('[getCurrentModelAndProvider] Checking app environment as fallback'); - return getFallbackModelAndProvider(writeToConfig); - } - return { model: model, provider: provider }; -} - -export async function getFallbackModelAndProvider( - writeToConfig?: (key: string, value: unknown, is_secret: boolean) => Promise -) { - const provider = window.appConfig.get('GOOSE_DEFAULT_PROVIDER'); - const model = window.appConfig.get('GOOSE_DEFAULT_MODEL'); - if (provider && model && writeToConfig) { - try { - await writeToConfig('GOOSE_MODEL', model, false); - await writeToConfig('GOOSE_PROVIDER', provider, false); - } catch (error) { - console.error('[getFallbackModelAndProvider] Failed to write to config', error); - } - } - return { model: model, provider: provider }; -} - -interface getCurrentModelAndProviderForDisplayProps { - readFromConfig: (key: string, is_secret: boolean) => Promise; - getProviders: (b: boolean) => Promise; -} - -// returns display name of the provider -export async function getCurrentModelAndProviderForDisplay({ - readFromConfig, - getProviders, -}: getCurrentModelAndProviderForDisplayProps) { - const modelProvider = await getCurrentModelAndProvider({ readFromConfig: readFromConfig }); - const gooseModel = modelProvider.model; - const gooseProvider = modelProvider.provider; - - // lookup display name - let metadata: ProviderMetadata; - - try { - metadata = await getProviderMetadata(String(gooseProvider), getProviders); - } catch (error) { - return { model: gooseModel, provider: gooseProvider }; - } - const providerDisplayName = metadata.display_name; - - return { model: gooseModel, provider: providerDisplayName }; -}