From 6703e75bf318b8c8040d4532c9cfee6c0d028141 Mon Sep 17 00:00:00 2001 From: Antigravity Date: Thu, 28 May 2026 21:44:55 +0000 Subject: [PATCH] refactor(byok): move models suggestions list to server config models-list and fetch dynamically via API --- memento-note/app/api/user/api-keys/route.ts | 3 ++ .../components/ai/byok-settings-panel.tsx | 33 +++++++------------ memento-note/lib/ai/models-list.ts | 11 +++++++ 3 files changed, 26 insertions(+), 21 deletions(-) create mode 100644 memento-note/lib/ai/models-list.ts diff --git a/memento-note/app/api/user/api-keys/route.ts b/memento-note/app/api/user/api-keys/route.ts index 869e4eb..4d0c661 100644 --- a/memento-note/app/api/user/api-keys/route.ts +++ b/memento-note/app/api/user/api-keys/route.ts @@ -22,6 +22,8 @@ const createSchema = z.object({ baseUrl: z.string().url().optional(), }); +import { PROVIDER_MODEL_SUGGESTIONS } from '@/lib/ai/models-list'; + export async function GET() { const session = await auth(); if (!session?.user?.id) { @@ -36,6 +38,7 @@ export async function GET() { return NextResponse.json({ keys: keys.map(toPublicApiKey), allowedProviders: getAllowedByokProviders(await getEffectiveTier(session.user.id)), + providerModels: PROVIDER_MODEL_SUGGESTIONS, }); } diff --git a/memento-note/components/ai/byok-settings-panel.tsx b/memento-note/components/ai/byok-settings-panel.tsx index 7be87ea..d073f2c 100644 --- a/memento-note/components/ai/byok-settings-panel.tsx +++ b/memento-note/components/ai/byok-settings-panel.tsx @@ -27,6 +27,7 @@ type PublicKey = { async function fetchByokKeys(): Promise<{ keys: PublicKey[] allowedProviders: string[] + providerModels: Record }> { const res = await fetch('/api/user/api-keys') if (!res.ok) { @@ -42,18 +43,6 @@ function providerLabel(t: (key: string) => string, provider: string): string { return translated === key ? provider : translated } -const PROVIDER_MODEL_SUGGESTIONS: Record = { - openai: ['gpt-4o-mini', 'gpt-4o', 'gpt-3.5-turbo'], - anthropic: ['claude-3-5-sonnet-latest', 'claude-3-5-haiku-latest', 'claude-3-opus-latest'], - google: ['gemini-1.5-flash', 'gemini-1.5-pro', 'gemini-2.0-flash-exp'], - deepseek: ['deepseek-chat', 'deepseek-coder'], - minimax: ['abab6.5-chat', 'abab6.5s-chat'], - mistral: ['mistral-small-latest', 'mistral-medium-latest', 'mistral-large-latest'], - glm: ['glm-4', 'glm-4-flash'], - openrouter: ['openai/gpt-4o-mini', 'anthropic/claude-3.5-sonnet', 'deepseek/deepseek-chat'], - custom: [], -} - export function ByokSettingsPanel() { const { t } = useLanguage() const queryClient = useQueryClient() @@ -64,9 +53,16 @@ export function ByokSettingsPanel() { const [customModel, setCustomModel] = useState('') const [isCustomModel, setIsCustomModel] = useState(false) + const { data, isLoading, error } = useQuery({ + queryKey: ['user', 'api-keys'], + queryFn: fetchByokKeys, + }) + + const providerModels = data?.providerModels ?? {} + const handleProviderChange = (p: string) => { setProvider(p) - const sug = PROVIDER_MODEL_SUGGESTIONS[p] || [] + const sug = providerModels[p] || [] if (sug.length > 0) { setModel(sug[0]) setIsCustomModel(false) @@ -77,11 +73,6 @@ export function ByokSettingsPanel() { } } - const { data, isLoading, error } = useQuery({ - queryKey: ['user', 'api-keys'], - queryFn: fetchByokKeys, - }) - const invalidate = useCallback(() => { queryClient.invalidateQueries({ queryKey: ['user', 'api-keys'] }) queryClient.invalidateQueries({ queryKey: ['usage', 'current'] }) @@ -240,7 +231,7 @@ export function ByokSettingsPanel() {
- {PROVIDER_MODEL_SUGGESTIONS[provider] && PROVIDER_MODEL_SUGGESTIONS[provider].length > 0 ? ( + {providerModels[provider] && providerModels[provider].length > 0 ? ( = { + openai: ['gpt-4o-mini', 'gpt-4o', 'gpt-4-turbo', 'gpt-3.5-turbo'], + anthropic: ['claude-3-5-sonnet-latest', 'claude-3-5-haiku-latest', 'claude-3-opus-latest'], + google: ['gemini-1.5-flash', 'gemini-1.5-pro', 'gemini-2.0-flash-exp'], + deepseek: ['deepseek-chat', 'deepseek-coder'], + minimax: ['abab6.5-chat', 'abab6.5s-chat'], + mistral: ['mistral-small-latest', 'mistral-medium-latest', 'mistral-large-latest'], + glm: ['glm-4', 'glm-4-flash'], + openrouter: ['openai/gpt-4o-mini', 'anthropic/claude-3.5-sonnet', 'deepseek/deepseek-chat'], + custom: [], +};