Ensure more client (#3787)
Co-authored-by: Douwe Osinga <douwe@squareup.com>
This commit is contained in:
@@ -8,6 +8,7 @@ import {
|
|||||||
getModelDisplayName,
|
getModelDisplayName,
|
||||||
getProviderDisplayName,
|
getProviderDisplayName,
|
||||||
} from './settings/models/predefinedModelsUtils';
|
} from './settings/models/predefinedModelsUtils';
|
||||||
|
import { ensureClientInitialized } from '../utils';
|
||||||
|
|
||||||
// titles
|
// titles
|
||||||
export const UNKNOWN_PROVIDER_TITLE = 'Provider name lookup';
|
export const UNKNOWN_PROVIDER_TITLE = 'Provider name lookup';
|
||||||
@@ -170,6 +171,7 @@ export const ModelAndProviderProvider: React.FC<ModelAndProviderProviderProps> =
|
|||||||
|
|
||||||
const refreshCurrentModelAndProvider = useCallback(async () => {
|
const refreshCurrentModelAndProvider = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
|
await ensureClientInitialized();
|
||||||
const { model, provider } = await getCurrentModelAndProvider();
|
const { model, provider } = await getCurrentModelAndProvider();
|
||||||
setCurrentModel(model);
|
setCurrentModel(model);
|
||||||
setCurrentProvider(provider);
|
setCurrentProvider(provider);
|
||||||
|
|||||||
@@ -2,10 +2,13 @@ import { useEffect, useState, useCallback, useRef } from 'react';
|
|||||||
import type { View } from '../../../App';
|
import type { View } from '../../../App';
|
||||||
import ModelSettingsButtons from './subcomponents/ModelSettingsButtons';
|
import ModelSettingsButtons from './subcomponents/ModelSettingsButtons';
|
||||||
import { useConfig } from '../../ConfigContext';
|
import { useConfig } from '../../ConfigContext';
|
||||||
import { useModelAndProvider } from '../../ModelAndProviderContext';
|
import {
|
||||||
|
UNKNOWN_PROVIDER_MSG,
|
||||||
|
UNKNOWN_PROVIDER_TITLE,
|
||||||
|
useModelAndProvider,
|
||||||
|
} from '../../ModelAndProviderContext';
|
||||||
import { toastError } from '../../../toasts';
|
import { toastError } from '../../../toasts';
|
||||||
|
|
||||||
import { UNKNOWN_PROVIDER_MSG, UNKNOWN_PROVIDER_TITLE } from './index';
|
|
||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../ui/card';
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../../ui/card';
|
||||||
import ResetProviderSection from '../reset_provider/ResetProviderSection';
|
import ResetProviderSection from '../reset_provider/ResetProviderSection';
|
||||||
|
|
||||||
|
|||||||
@@ -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 };
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user