Skip to content

Commit 68f379e

Browse files
committed
feat: display friendly model names and add fuzzy label matching
- Add missing model entries (Opus 4.6, dated Sonnet/Haiku variants, DeepSeek v3/r1 aliases, Mistral/Codestral short names, Qwen hyphenated IDs) - Add date-suffix stripping and prefix fallback to getModelLabel so canonical pricing IDs resolve to clean names (e.g. Claude Sonnet 4.5)
1 parent 1bd9c18 commit 68f379e

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

packages/frontend/src/services/providers.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,16 @@ export const PROVIDERS: ProviderDef[] = [
5353
subtitle: "Claude Opus 4, Sonnet 4.5, Haiku",
5454
docsUrl: "https://console.anthropic.com/settings/keys",
5555
models: [
56+
{ label: "Claude Opus 4.6", value: "claude-opus-4-6" },
5657
{ label: "Claude Opus 4", value: "claude-opus-4" },
5758
{ label: "Claude Opus 4 (2025-05-14)", value: "claude-opus-4-20250514" },
5859
{ label: "Claude Sonnet 4.5", value: "claude-sonnet-4-5" },
60+
{ label: "Claude Sonnet 4.5", value: "claude-sonnet-4-5-20250929" },
5961
{ label: "Claude Sonnet 4.5 (2025-04-14)", value: "claude-sonnet-4-5-20250414" },
6062
{ label: "Claude Sonnet 4", value: "claude-sonnet-4" },
6163
{ label: "Claude Sonnet 4 (2025-05-14)", value: "claude-sonnet-4-20250514" },
6264
{ label: "Claude Haiku 4.5", value: "claude-haiku-4-5" },
65+
{ label: "Claude Haiku 4.5 (2025-10-01)", value: "claude-haiku-4-5-20251001" },
6366
{ label: "Claude 3.5 Sonnet", value: "claude-3-5-sonnet-latest" },
6467
{ label: "Claude 3.5 Sonnet (2024-10-22)", value: "claude-3-5-sonnet-20241022" },
6568
{ label: "Claude 3.5 Sonnet (2024-06-20)", value: "claude-3-5-sonnet-20240620" },
@@ -108,8 +111,10 @@ export const PROVIDERS: ProviderDef[] = [
108111
docsUrl: "https://platform.deepseek.com/api_keys",
109112
models: [
110113
{ label: "DeepSeek V3", value: "deepseek-chat" },
114+
{ label: "DeepSeek V3", value: "deepseek-v3" },
111115
{ label: "DeepSeek V3 (0324)", value: "deepseek-chat-0324" },
112116
{ label: "DeepSeek R1", value: "deepseek-reasoner" },
117+
{ label: "DeepSeek R1", value: "deepseek-r1" },
113118
{ label: "DeepSeek R1 (0528)", value: "deepseek-reasoner-0528" },
114119
{ label: "DeepSeek Coder V2", value: "deepseek-coder" },
115120
{ label: "DeepSeek R1 Distill Qwen 32B", value: "deepseek-r1-distill-qwen-32b" },
@@ -127,11 +132,14 @@ export const PROVIDERS: ProviderDef[] = [
127132
subtitle: "Mistral Large, Codestral, Pixtral",
128133
docsUrl: "https://console.mistral.ai/api-keys",
129134
models: [
135+
{ label: "Mistral Large", value: "mistral-large" },
130136
{ label: "Mistral Large (25.01)", value: "mistral-large-latest" },
131137
{ label: "Mistral Large (24.11)", value: "mistral-large-2411" },
138+
{ label: "Mistral Small", value: "mistral-small" },
132139
{ label: "Mistral Small (25.01)", value: "mistral-small-latest" },
133140
{ label: "Mistral Small (24.09)", value: "mistral-small-2409" },
134141
{ label: "Mistral Medium", value: "mistral-medium-latest" },
142+
{ label: "Codestral", value: "codestral" },
135143
{ label: "Codestral (25.01)", value: "codestral-latest" },
136144
{ label: "Codestral Mamba", value: "codestral-mamba-latest" },
137145
{ label: "Mistral Nemo", value: "open-mistral-nemo" },
@@ -178,8 +186,10 @@ export const PROVIDERS: ProviderDef[] = [
178186
{ label: "Qwen3 1.7B", value: "qwen3-1.7b" },
179187
{ label: "Qwen3 0.6B", value: "qwen3-0.6b" },
180188
{ label: "Qwen2.5 72B Instruct", value: "qwen2.5-72b-instruct" },
189+
{ label: "Qwen2.5 72B Instruct", value: "qwen-2.5-72b-instruct" },
181190
{ label: "Qwen2.5 32B Instruct", value: "qwen2.5-32b-instruct" },
182191
{ label: "Qwen2.5 Coder 32B", value: "qwen2.5-coder-32b-instruct" },
192+
{ label: "Qwen2.5 Coder 32B", value: "qwen-2.5-coder-32b-instruct" },
183193
{ label: "QwQ 32B (Reasoning)", value: "qwq-32b" },
184194
],
185195
},
@@ -306,8 +316,19 @@ export function getProvider(id: string): ProviderDef | undefined {
306316
export function getModelLabel(providerId: string, modelValue: string): string {
307317
const prov = getProvider(providerId);
308318
if (!prov) return modelValue;
309-
const m = prov.models.find((m) => m.value === modelValue);
310-
return m?.label ?? modelValue;
319+
// Exact match
320+
const exact = prov.models.find((m) => m.value === modelValue);
321+
if (exact) return exact.label;
322+
// Strip date suffix (e.g. "-20250929") and try again
323+
const stripped = modelValue.replace(/-\d{8}$/, "");
324+
if (stripped !== modelValue) {
325+
const m = prov.models.find((m) => m.value === stripped);
326+
if (m) return m.label;
327+
}
328+
// Prefix match: modelValue starts with a known value
329+
const prefix = prov.models.find((m) => modelValue.startsWith(m.value + "-"));
330+
if (prefix) return prefix.label;
331+
return modelValue;
311332
}
312333

313334
/* ── Auto-assignment ─────────────────────────────── */

0 commit comments

Comments
 (0)