mirror of
https://github.com/block/goose.git
synced 2026-04-28 03:29:36 +00:00
Ensure more client (#3787)
Co-authored-by: Douwe Osinga <douwe@squareup.com>
This commit is contained in:
parent
380f23a3b1
commit
a33460244c
3 changed files with 7 additions and 137 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue