Ensure more client (#3787)

Co-authored-by: Douwe Osinga <douwe@squareup.com>
This commit is contained in:
Douwe Osinga 2025-08-01 19:35:40 +02:00 committed by GitHub
parent 380f23a3b1
commit a33460244c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 7 additions and 137 deletions

View file

@ -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<ModelAndProviderProviderProps> =
const refreshCurrentModelAndProvider = useCallback(async () => {
try {
await ensureClientInitialized();
const { model, provider } = await getCurrentModelAndProvider();
setCurrentModel(model);
setCurrentProvider(provider);

View file

@ -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';

View file

@ -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<void>;
}
// 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<unknown>;
writeToConfig?: (key: string, value: unknown, is_secret: boolean) => Promise<void>;
}
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<void>
) {
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<unknown>;
getProviders: (b: boolean) => Promise<ProviderDetails[]>;
}
// 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 };
}