From f38866344a52942d2d62e79ed12ca7d5a5f9bf0b Mon Sep 17 00:00:00 2001 From: Luca Steeb Date: Wed, 23 Jul 2025 20:48:23 +0200 Subject: [PATCH] feat(models): refactor model id and add model names Refactored model schema to use `id` and optional `name` instead of `model`. Updated relevant components, providers, and logic to handle changes. Improved readability and maintainability of model handling code. --- .github/workflows/claude-code-review.yml | 12 +++-- apps/api/src/routes/activity.spec.ts | 2 +- apps/api/src/routes/activity.ts | 4 +- apps/gateway/src/api.e2e.ts | 16 +++--- apps/gateway/src/chat/chat.ts | 16 +++--- apps/gateway/src/lib/costs.ts | 2 +- apps/gateway/src/models/models.ts | 8 +-- apps/next/src/app/providers/[id]/page.tsx | 4 +- .../src/components/activity/recent-logs.tsx | 4 +- .../components/dashboard/activity-chart.tsx | 14 ++--- apps/next/src/components/models-supported.tsx | 14 ++--- .../src/components/models/models-list.tsx | 4 +- .../components/playground/model-selector.tsx | 18 ++++--- .../components/usage/model-usage-table.tsx | 14 ++--- apps/next/src/lib/api/v1.d.ts | 2 +- apps/next/src/types/activity.ts | 4 +- .../src/components/activity/recent-logs.tsx | 4 +- .../components/dashboard/activity-chart.tsx | 8 +-- apps/ui/src/components/models-supported.tsx | 14 ++--- apps/ui/src/components/models/models-list.tsx | 4 +- .../components/playground/model-selector.tsx | 16 +++--- .../components/usage/model-usage-table.tsx | 14 ++--- apps/ui/src/lib/api/v1.d.ts | 2 +- apps/ui/src/routes/providers/$id.tsx | 6 +-- apps/ui/src/types/activity.ts | 2 +- packages/models/src/helpers.ts | 2 +- packages/models/src/models.spec.ts | 2 +- packages/models/src/models.ts | 12 ++++- packages/models/src/models/alibaba.ts | 9 ++-- packages/models/src/models/anthropic.ts | 21 +++++--- packages/models/src/models/deepseek.ts | 12 +++-- packages/models/src/models/google.ts | 54 ++++++++++++------- packages/models/src/models/llmgateway.ts | 6 ++- packages/models/src/models/meta.ts | 12 +++-- packages/models/src/models/mistral.ts | 3 +- packages/models/src/models/moonshot.ts | 3 +- packages/models/src/models/openai.ts | 33 ++++++++---- packages/models/src/models/perplexity.ts | 9 ++-- packages/models/src/models/xai.ts | 21 +++++--- packages/models/src/provider-api.ts | 4 +- 40 files changed, 243 insertions(+), 168 deletions(-) diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index 40aabfb7be..385ee8c904 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -30,8 +30,8 @@ jobs: # Check if this is a comment event with @claude mention if [[ "${{ github.event_name }}" == "issue_comment" ]]; then - COMMENT_BODY="${{ github.event.comment.body }}" - if [[ "$COMMENT_BODY" == *"@claude"* ]] || [[ "$COMMENT_BODY" == *"@Claude"* ]]; then + # Use environment variable to safely handle multiline content with quotes + if echo "$COMMENT_BODY" | grep -i "@claude" > /dev/null; then CLAUDE_REQUESTED=true echo "Claude was mentioned in comment" fi @@ -39,9 +39,7 @@ jobs: # Check if PR title or description contains request for Claude if [[ "${{ github.event_name }}" == "pull_request" ]]; then - PR_TITLE="${{ github.event.pull_request.title }}" - PR_BODY="${{ github.event.pull_request.body }}" - if [[ "$PR_TITLE" == *"@claude"* ]] || [[ "$PR_TITLE" == *"@Claude"* ]] || [[ "$PR_BODY" == *"@claude"* ]] || [[ "$PR_BODY" == *"@Claude"* ]]; then + if echo "$PR_TITLE" | grep -i "@claude" > /dev/null || echo "$PR_BODY" | grep -i "@claude" > /dev/null; then CLAUDE_REQUESTED=true echo "Claude was mentioned in PR title or description" fi @@ -54,6 +52,10 @@ jobs: echo "claude_requested=false" >> $GITHUB_OUTPUT echo "Claude review not requested - skipping" fi + env: + COMMENT_BODY: ${{ github.event.comment.body }} + PR_TITLE: ${{ github.event.pull_request.title }} + PR_BODY: ${{ github.event.pull_request.body }} - name: Check if most recent commit is from Claude id: check-author diff --git a/apps/api/src/routes/activity.spec.ts b/apps/api/src/routes/activity.spec.ts index 8fd5ee1588..75b6d729ac 100644 --- a/apps/api/src/routes/activity.spec.ts +++ b/apps/api/src/routes/activity.spec.ts @@ -203,7 +203,7 @@ describe("activity endpoint", () => { // Check model breakdown const modelData = firstDay.modelBreakdown[0]; - expect(modelData).toHaveProperty("model"); + expect(modelData).toHaveProperty("id"); expect(modelData).toHaveProperty("provider"); expect(modelData).toHaveProperty("requestCount"); expect(modelData).toHaveProperty("inputTokens"); diff --git a/apps/api/src/routes/activity.ts b/apps/api/src/routes/activity.ts index d1870062b9..9a97aa5c43 100644 --- a/apps/api/src/routes/activity.ts +++ b/apps/api/src/routes/activity.ts @@ -9,7 +9,7 @@ export const activity = new OpenAPIHono(); // Define the response schema for model-specific usage const modelUsageSchema = z.object({ - model: z.string(), + id: z.string(), provider: z.string(), requestCount: z.number(), inputTokens: z.number(), @@ -208,7 +208,7 @@ activity.openapi(getActivity, async (c) => { if (!dayModelMap.has(modelKey)) { dayModelMap.set(modelKey, { - model, + id: model, provider, requestCount: 0, inputTokens: 0, diff --git a/apps/gateway/src/api.e2e.ts b/apps/gateway/src/api.e2e.ts index aa5c344397..780f5a9dcc 100644 --- a/apps/gateway/src/api.e2e.ts +++ b/apps/gateway/src/api.e2e.ts @@ -44,7 +44,7 @@ if (hasOnlyModels) { const filteredModels = models // Filter out auto/custom models - .filter((model) => !["custom", "auto"].includes(model.model)) + .filter((model) => !["custom", "auto"].includes(model.id)) // Filter out deactivated models .filter((model) => !model.deactivatedAt || new Date() <= model.deactivatedAt); @@ -64,7 +64,7 @@ const testModels = filteredModels if (fullMode) { // test root model without a specific provider testCases.push({ - model: model.model, + model: model.id, providers: model.providers.filter( (provider: ProviderModelMapping) => provider.test !== "skip", ), @@ -84,9 +84,9 @@ const testModels = filteredModels } testCases.push({ - model: `${provider.providerId}/${model.model}`, + model: `${provider.providerId}/${model.id}`, providers: [provider], - originalModel: model.model, // Keep track of the original model for reference + originalModel: model.id, // Keep track of the original model for reference }); } @@ -118,9 +118,9 @@ const providerModels = filteredModels } testCases.push({ - model: `${provider.providerId}/${model.model}`, + model: `${provider.providerId}/${model.id}`, provider, - originalModel: model.model, // Keep track of the original model for reference + originalModel: model.id, // Keep track of the original model for reference }); } @@ -465,7 +465,7 @@ describe("e2e", () => { test.each( testModels.filter((m) => { - const modelDef = models.find((def) => def.model === m.model); + const modelDef = models.find((def) => def.id === m.model); return (modelDef as any)?.jsonOutput === true; }), )("JSON output $model", getTestOptions(), async ({ model }) => { @@ -791,7 +791,7 @@ describe("e2e", () => { Authorization: `Bearer real-token`, }, body: JSON.stringify({ - model: multiProviderModel.model, + model: multiProviderModel.id, messages: [ { role: "user", diff --git a/apps/gateway/src/chat/chat.ts b/apps/gateway/src/chat/chat.ts index 505d672b00..77ec4ca8bf 100644 --- a/apps/gateway/src/chat/chat.ts +++ b/apps/gateway/src/chat/chat.ts @@ -944,7 +944,7 @@ chat.openapi(completions, async (c) => { requestedModel = modelName as Model; } else { // First try to find by base model name - let modelDef = models.find((m) => m.model === modelName); + let modelDef = models.find((m) => m.id === modelName); if (!modelDef) { modelDef = models.find((m) => @@ -977,7 +977,7 @@ chat.openapi(completions, async (c) => { requestedModel = modelName as Model; } } - } else if (models.find((m) => m.model === modelInput)) { + } else if (models.find((m) => m.id === modelInput)) { requestedModel = modelInput as Model; } else if ( models.find((m) => m.providers.find((p) => p.modelName === modelInput)) @@ -988,7 +988,7 @@ chat.openapi(completions, async (c) => { const provider = model?.providers.find((p) => p.modelName === modelInput); throw new HTTPException(400, { - message: `Model ${modelInput} must be requested with a provider prefix. Use the format: ${provider?.providerId}/${model?.model}`, + message: `Model ${modelInput} must be requested with a provider prefix. Use the format: ${provider?.providerId}/${model?.id}`, }); } else { throw new HTTPException(400, { @@ -1028,7 +1028,7 @@ chat.openapi(completions, async (c) => { }; } else { modelInfo = - models.find((m) => m.model === requestedModel) || + models.find((m) => m.id === requestedModel) || models.find((m) => m.providers.find((p) => p.modelName === requestedModel), ); @@ -1190,7 +1190,7 @@ chat.openapi(completions, async (c) => { } for (const modelDef of models) { - if (modelDef.model === "auto" || modelDef.model === "custom") { + if (modelDef.id === "auto" || modelDef.id === "custom") { continue; } @@ -1263,7 +1263,7 @@ chat.openapi(completions, async (c) => { }); } - const modelWithPricing = models.find((m) => m.model === usedModel); + const modelWithPricing = models.find((m) => m.id === usedModel); if (modelWithPricing) { const cheapestResult = getCheapestFromAvailableProviders( @@ -1313,12 +1313,12 @@ chat.openapi(completions, async (c) => { } else { finalModelInfo = models.find( (m) => - m.model === usedModel || + m.id === usedModel || m.providers.some((p) => p.modelName === usedModel), ); } - const baseModelName = finalModelInfo?.model || usedModel; + const baseModelName = finalModelInfo?.id || usedModel; let url: string | undefined; diff --git a/apps/gateway/src/lib/costs.ts b/apps/gateway/src/lib/costs.ts index 74c22b8595..b4c40c1dfd 100644 --- a/apps/gateway/src/lib/costs.ts +++ b/apps/gateway/src/lib/costs.ts @@ -28,7 +28,7 @@ export function calculateCosts( }, ) { // Find the model info - try both base model name and provider model name - let modelInfo = models.find((m) => m.model === model) as ModelDefinition; + let modelInfo = models.find((m) => m.id === model) as ModelDefinition; if (!modelInfo) { modelInfo = models.find((m) => diff --git a/apps/gateway/src/models/models.ts b/apps/gateway/src/models/models.ts index f3acc9ec91..1760bd06f8 100644 --- a/apps/gateway/src/models/models.ts +++ b/apps/gateway/src/models/models.ts @@ -107,10 +107,10 @@ modelsApi.openapi(listModels, async (c) => { firstProviderWithPricing?.imageInputPrice?.toString() || "0"; return { - id: model.model, - name: model.model, + id: model.id, + name: model.name || model.id, created: Math.floor(Date.now() / 1000), // Current timestamp in seconds - description: `${model.model} provided by ${model.providers.map((p) => p.providerId).join(", ")}`, + description: `${model.id} provided by ${model.providers.map((p) => p.providerId).join(", ")}`, architecture: { input_modalities: inputModalities, output_modalities: ["text"] as ["text"], @@ -159,7 +159,7 @@ modelsApi.openapi(listModels, async (c) => { Math.max(...model.providers.map((p) => p.contextSize || 0)) || undefined, // TODO: supported_parameters should come from model definitions when available - supported_parameters: getSupportedParameters(model.model), + supported_parameters: getSupportedParameters(model.id), // Add model-level capabilities json_output: model.jsonOutput || false, deprecated_at: model.deprecatedAt?.toISOString(), diff --git a/apps/next/src/app/providers/[id]/page.tsx b/apps/next/src/app/providers/[id]/page.tsx index accd1eff41..f593322d97 100644 --- a/apps/next/src/app/providers/[id]/page.tsx +++ b/apps/next/src/app/providers/[id]/page.tsx @@ -45,12 +45,12 @@ export default async function ProviderPage({ params }: ProviderPageProps) {

Available Models

{providerModels.map((model) => ( - +
- {model.model} + {model.id} {model.providers[0].modelName} diff --git a/apps/next/src/components/activity/recent-logs.tsx b/apps/next/src/components/activity/recent-logs.tsx index 51eb0c6867..1bf67acf7a 100644 --- a/apps/next/src/components/activity/recent-logs.tsx +++ b/apps/next/src/components/activity/recent-logs.tsx @@ -266,8 +266,8 @@ export function RecentLogs({ initialData }: RecentLogsProps) { All models {models.map((m) => ( - - {m.model} + + {m.id} ))} diff --git a/apps/next/src/components/dashboard/activity-chart.tsx b/apps/next/src/components/dashboard/activity-chart.tsx index 13abd5de26..5183e2e27b 100644 --- a/apps/next/src/components/dashboard/activity-chart.tsx +++ b/apps/next/src/components/dashboard/activity-chart.tsx @@ -36,7 +36,7 @@ import type { TooltipProps } from "recharts"; // Helper function to get all unique models from the data function getUniqueModels( - data: { modelBreakdown: { model: string }[] }[], + data: { modelBreakdown: { id: string }[] }[], ): string[] { if (!data || data.length === 0) { return []; @@ -46,7 +46,7 @@ function getUniqueModels( data.forEach((day) => { if (day.modelBreakdown && day.modelBreakdown.length > 0) { day.modelBreakdown.forEach((model) => { - allModels.add(model.model); + allModels.add(model.id); }); } }); @@ -84,7 +84,7 @@ interface TooltipPayload { totalTokens: number; cost: number; modelBreakdown: { - model: string; + id: string; requestCount: number; cost: number; totalTokens: number; @@ -309,7 +309,7 @@ export function ActivityChart({ initialData }: ActivityChartProps) { | string | number | { - model: string; + id: string; requestCount: number; cost: number; totalTokens: number; @@ -323,14 +323,14 @@ export function ActivityChart({ initialData }: ActivityChartProps) { dayData.modelBreakdown.forEach((model) => { switch (breakdownField) { case "cost": - result[model.model] = model.cost; + result[model.id] = model.cost; break; case "tokens": - result[model.model] = model.totalTokens; + result[model.id] = model.totalTokens; break; case "requests": default: - result[model.model] = model.requestCount; + result[model.id] = model.requestCount; break; } }); diff --git a/apps/next/src/components/models-supported.tsx b/apps/next/src/components/models-supported.tsx index e944553e14..c61d676bd3 100644 --- a/apps/next/src/components/models-supported.tsx +++ b/apps/next/src/components/models-supported.tsx @@ -36,7 +36,7 @@ import { useAppConfig } from "@/lib/config"; import { cn, formatContextSize } from "@/lib/utils"; interface ProviderModel { - model: string; + id: string; providerId: ProviderId; providerName: string; inputPrice?: number; @@ -84,7 +84,7 @@ const groupedProviders = modelDefinitions.reduce< acc[provider.name] = []; } acc[provider.name].push({ - model: def.model, + id: def.id, providerId: map.providerId, providerName: provider.name, inputPrice: map.inputPrice, @@ -100,7 +100,7 @@ const sortedProviderEntries = Object.entries(groupedProviders) .sort(([a], [b]) => a.localeCompare(b)) .map(([providerName, models]) => [ providerName, - [...models].sort((a, b) => a.model.localeCompare(b.model)), + [...models].sort((a, b) => a.id.localeCompare(b.id)), ]) as [string, ProviderModel[]][]; const totalModels = modelDefinitions.length; @@ -316,14 +316,14 @@ export const ModelsSupported = ({ isDashboard }: { isDashboard?: boolean }) => {
{models.map((model) => (
- {model.model} + {model.id} {model.providerName} @@ -333,10 +333,10 @@ export const ModelsSupported = ({ isDashboard }: { isDashboard?: boolean }) => { variant="ghost" size="sm" className="h-6 w-6 p-0 shrink-0" - onClick={() => copyModelName(model.model)} + onClick={() => copyModelName(model.id)} title="Copy model name" > - {copiedModel === model.model ? ( + {copiedModel === model.id ? ( ) : ( diff --git a/apps/next/src/components/models/models-list.tsx b/apps/next/src/components/models/models-list.tsx index 4543408bc8..e747d0bbb0 100644 --- a/apps/next/src/components/models/models-list.tsx +++ b/apps/next/src/components/models/models-list.tsx @@ -12,8 +12,8 @@ export function ModelsList() { return (
{(models as readonly ModelDefinition[]).map((model) => ( - -
{model.model}
+ +
{model.name || model.id}
Providers:
{model.providers.map((provider) => ( diff --git a/apps/next/src/components/playground/model-selector.tsx b/apps/next/src/components/playground/model-selector.tsx index 3bbd0b7f18..c934dc0d13 100644 --- a/apps/next/src/components/playground/model-selector.tsx +++ b/apps/next/src/components/playground/model-selector.tsx @@ -16,7 +16,8 @@ interface ModelSelectorProps { } interface LocalModel { - model: string; + id: string; + name?: string; jsonOutput: boolean; providers: Array<{ providerId: string; @@ -60,13 +61,14 @@ export function ModelSelector({ const typedModel = model as ModelDefinition; return { - model: typedModel.model, + id: typedModel.id, + name: typedModel.name, jsonOutput: typedModel.jsonOutput ?? false, providers: modelProviders, }; }); - const currentModelInfo = uniqueModels.find((m) => m.model === selectedModel); + const currentModelInfo = uniqueModels.find((m) => m.id === selectedModel); return ( @@ -86,7 +88,7 @@ export function ModelSelector({ /> )} - {currentModelInfo?.model || selectedModel} + {currentModelInfo?.name || currentModelInfo?.id || selectedModel}
@@ -94,9 +96,9 @@ export function ModelSelector({ {uniqueModels.map((model) => ( -
+
onModelSelect(model.model)} + onSelect={() => onModelSelect(model.id)} className="flex items-center justify-between py-3" >
@@ -110,8 +112,8 @@ export function ModelSelector({ /> ))}
- {model.model} - {model.model === selectedModel && ( + {model.name || model.id} + {model.id === selectedModel && ( )}
diff --git a/apps/next/src/components/usage/model-usage-table.tsx b/apps/next/src/components/usage/model-usage-table.tsx index 2abb6d59aa..499bc5735f 100644 --- a/apps/next/src/components/usage/model-usage-table.tsx +++ b/apps/next/src/components/usage/model-usage-table.tsx @@ -18,7 +18,7 @@ import { useApi } from "@/lib/fetch-client"; import type { ActivityModelUsage, ActivitT } from "@/types/activity"; -type SortColumn = "model" | "provider" | "requestCount" | "totalTokens"; +type SortColumn = "id" | "provider" | "requestCount" | "totalTokens"; type SortDirection = "asc" | "desc"; interface ModelUsageTableProps { @@ -59,7 +59,7 @@ export function ModelUsageTable({ initialData }: ModelUsageTableProps) { } else { setSortColumn(column); setSortDirection( - column === "model" || column === "provider" ? "asc" : "desc", + column === "id" || column === "provider" ? "asc" : "desc", ); } }; @@ -120,7 +120,7 @@ export function ModelUsageTable({ initialData }: ModelUsageTableProps) { data.activity.forEach((day) => { day.modelBreakdown.forEach((model) => { - const key = `${model.provider}|${model.model}`; + const key = `${model.provider}|${model.id}`; if (modelMap.has(key)) { const existing = modelMap.get(key)!; existing.requestCount += model.requestCount; @@ -162,11 +162,11 @@ export function ModelUsageTable({ initialData }: ModelUsageTableProps) { @@ -209,8 +209,8 @@ export function ModelUsageTable({ initialData }: ModelUsageTableProps) { ? 0 : Math.round((model.totalTokens / totalTokens) * 100); return ( - - {model.model} + + {model.id} {model.provider} {model.requestCount.toLocaleString()} {model.totalTokens.toLocaleString()} diff --git a/apps/next/src/lib/api/v1.d.ts b/apps/next/src/lib/api/v1.d.ts index 06da5d4b81..f301e622a3 100644 --- a/apps/next/src/lib/api/v1.d.ts +++ b/apps/next/src/lib/api/v1.d.ts @@ -603,7 +603,7 @@ export interface paths { cacheCount: number; cacheRate: number; modelBreakdown: { - model: string; + id: string; provider: string; requestCount: number; inputTokens: number; diff --git a/apps/next/src/types/activity.ts b/apps/next/src/types/activity.ts index c0048b24a2..da160c163a 100644 --- a/apps/next/src/types/activity.ts +++ b/apps/next/src/types/activity.ts @@ -1,5 +1,5 @@ export interface ActivityModelUsage { - model: string; + id: string; provider: string; requestCount: number; inputTokens: number; @@ -45,7 +45,7 @@ export type ActivitT = cacheCount: number; cacheRate: number; modelBreakdown: { - model: string; + id: string; provider: string; requestCount: number; inputTokens: number; diff --git a/apps/ui/src/components/activity/recent-logs.tsx b/apps/ui/src/components/activity/recent-logs.tsx index 4d4ce3ef7a..267d43be3c 100644 --- a/apps/ui/src/components/activity/recent-logs.tsx +++ b/apps/ui/src/components/activity/recent-logs.tsx @@ -134,8 +134,8 @@ export function RecentLogs() { All models {models.map((m) => ( - - {m.model} + + {m.id} ))} diff --git a/apps/ui/src/components/dashboard/activity-chart.tsx b/apps/ui/src/components/dashboard/activity-chart.tsx index 80fe5e75a0..b20adefe5c 100644 --- a/apps/ui/src/components/dashboard/activity-chart.tsx +++ b/apps/ui/src/components/dashboard/activity-chart.tsx @@ -42,7 +42,7 @@ function getUniqueModels(data: any[]): string[] { data.forEach((day) => { if (day.modelBreakdown && day.modelBreakdown.length > 0) { day.modelBreakdown.forEach((model: any) => { - allModels.add(model.model); + allModels.add(model.id); }); } }); @@ -284,14 +284,14 @@ export function ActivityChart() { dayData.modelBreakdown.forEach((model) => { switch (breakdownField) { case "cost": - result[model.model] = model.cost; + result[model.id] = model.cost; break; case "tokens": - result[model.model] = model.totalTokens; + result[model.id] = model.totalTokens; break; case "requests": default: - result[model.model] = model.requestCount; + result[model.id] = model.requestCount; break; } }); diff --git a/apps/ui/src/components/models-supported.tsx b/apps/ui/src/components/models-supported.tsx index 9d84ccbe6e..c9923f8773 100644 --- a/apps/ui/src/components/models-supported.tsx +++ b/apps/ui/src/components/models-supported.tsx @@ -21,7 +21,7 @@ import Logo from "@/lib/icons/Logo"; import { cn, formatContextSize } from "@/lib/utils"; interface ProviderModel { - model: string; + id: string; providerId: ProviderId; providerName: string; inputPrice?: number; @@ -49,7 +49,7 @@ const groupedProviders = modelDefinitions.reduce< acc[provider.name] = []; } acc[provider.name].push({ - model: def.model, + id: def.id, providerId: map.providerId, providerName: provider.name, inputPrice: map.inputPrice, @@ -65,7 +65,7 @@ const sortedProviderEntries = Object.entries(groupedProviders) .sort(([a], [b]) => a.localeCompare(b)) .map(([providerName, models]) => [ providerName, - [...models].sort((a, b) => a.model.localeCompare(b.model)), + [...models].sort((a, b) => a.id.localeCompare(b.id)), ]) as [string, ProviderModel[]][]; const totalModels = modelDefinitions.length; @@ -197,14 +197,14 @@ export const ModelsSupported = ({ isDashboard }: { isDashboard?: boolean }) => {
{models.map((model) => (
- {model.model} + {model.id} {model.providerName} @@ -214,10 +214,10 @@ export const ModelsSupported = ({ isDashboard }: { isDashboard?: boolean }) => { variant="ghost" size="sm" className="h-6 w-6 p-0 shrink-0" - onClick={() => copyModelName(model.model)} + onClick={() => copyModelName(model.id)} title="Copy model name" > - {copiedModel === model.model ? ( + {copiedModel === model.id ? ( ) : ( diff --git a/apps/ui/src/components/models/models-list.tsx b/apps/ui/src/components/models/models-list.tsx index 4543408bc8..e747d0bbb0 100644 --- a/apps/ui/src/components/models/models-list.tsx +++ b/apps/ui/src/components/models/models-list.tsx @@ -12,8 +12,8 @@ export function ModelsList() { return (
{(models as readonly ModelDefinition[]).map((model) => ( - -
{model.model}
+ +
{model.name || model.id}
Providers:
{model.providers.map((provider) => ( diff --git a/apps/ui/src/components/playground/model-selector.tsx b/apps/ui/src/components/playground/model-selector.tsx index 3bbd0b7f18..2a60b31d90 100644 --- a/apps/ui/src/components/playground/model-selector.tsx +++ b/apps/ui/src/components/playground/model-selector.tsx @@ -16,7 +16,7 @@ interface ModelSelectorProps { } interface LocalModel { - model: string; + id: string; jsonOutput: boolean; providers: Array<{ providerId: string; @@ -60,13 +60,13 @@ export function ModelSelector({ const typedModel = model as ModelDefinition; return { - model: typedModel.model, + id: typedModel.id, jsonOutput: typedModel.jsonOutput ?? false, providers: modelProviders, }; }); - const currentModelInfo = uniqueModels.find((m) => m.model === selectedModel); + const currentModelInfo = uniqueModels.find((m) => m.id === selectedModel); return ( @@ -86,7 +86,7 @@ export function ModelSelector({ /> )} - {currentModelInfo?.model || selectedModel} + {currentModelInfo?.id || selectedModel}
@@ -94,9 +94,9 @@ export function ModelSelector({ {uniqueModels.map((model) => ( -
+
onModelSelect(model.model)} + onSelect={() => onModelSelect(model.id)} className="flex items-center justify-between py-3" >
@@ -110,8 +110,8 @@ export function ModelSelector({ /> ))}
- {model.model} - {model.model === selectedModel && ( + {model.id} + {model.id === selectedModel && ( )}
diff --git a/apps/ui/src/components/usage/model-usage-table.tsx b/apps/ui/src/components/usage/model-usage-table.tsx index 3412ac97af..49b5edeaf0 100644 --- a/apps/ui/src/components/usage/model-usage-table.tsx +++ b/apps/ui/src/components/usage/model-usage-table.tsx @@ -16,7 +16,7 @@ import { useApi } from "@/lib/fetch-client"; import type { ActivityModelUsage } from "@/types/activity"; -type SortColumn = "model" | "provider" | "requestCount" | "totalTokens"; +type SortColumn = "id" | "provider" | "requestCount" | "totalTokens"; type SortDirection = "asc" | "desc"; export function ModelUsageTable() { @@ -48,7 +48,7 @@ export function ModelUsageTable() { } else { setSortColumn(column); setSortDirection( - column === "model" || column === "provider" ? "asc" : "desc", + column === "id" || column === "provider" ? "asc" : "desc", ); } }; @@ -109,7 +109,7 @@ export function ModelUsageTable() { data.activity.forEach((day) => { day.modelBreakdown.forEach((model) => { - const key = `${model.provider}|${model.model}`; + const key = `${model.provider}|${model.id}`; if (modelMap.has(key)) { const existing = modelMap.get(key)!; existing.requestCount += model.requestCount; @@ -167,11 +167,11 @@ export function ModelUsageTable() { @@ -214,8 +214,8 @@ export function ModelUsageTable() { ? 0 : Math.round((model.totalTokens / totalTokens) * 100); return ( - - {model.model} + + {model.id} {model.provider} {model.requestCount.toLocaleString()} {model.totalTokens.toLocaleString()} diff --git a/apps/ui/src/lib/api/v1.d.ts b/apps/ui/src/lib/api/v1.d.ts index 06da5d4b81..f301e622a3 100644 --- a/apps/ui/src/lib/api/v1.d.ts +++ b/apps/ui/src/lib/api/v1.d.ts @@ -603,7 +603,7 @@ export interface paths { cacheCount: number; cacheRate: number; modelBreakdown: { - model: string; + id: string; provider: string; requestCount: number; inputTokens: number; diff --git a/apps/ui/src/routes/providers/$id.tsx b/apps/ui/src/routes/providers/$id.tsx index 25bd2596b2..aac95c37e9 100644 --- a/apps/ui/src/routes/providers/$id.tsx +++ b/apps/ui/src/routes/providers/$id.tsx @@ -99,9 +99,9 @@ function ProviderPage() { } return { - id: m.model, - name: m.model, - description: `${m.model} model from ${provider.name}`, + id: m.id, + name: (m as any).displayName || m.id, + description: `${m.id} model from ${provider.name}`, tags, contextSize: providerModel.contextSize, inputPrice: providerModel.inputPrice, diff --git a/apps/ui/src/types/activity.ts b/apps/ui/src/types/activity.ts index e870602ebf..90066a621e 100644 --- a/apps/ui/src/types/activity.ts +++ b/apps/ui/src/types/activity.ts @@ -1,5 +1,5 @@ export interface ActivityModelUsage { - model: string; + id: string; provider: string; requestCount: number; inputTokens: number; diff --git a/packages/models/src/helpers.ts b/packages/models/src/helpers.ts index e99b12a737..da9a22c9bd 100644 --- a/packages/models/src/helpers.ts +++ b/packages/models/src/helpers.ts @@ -8,7 +8,7 @@ export function getModelStreamingSupport( modelName: string, providerId?: string, ): boolean | null { - const modelInfo = models.find((m) => m.model === modelName); + const modelInfo = models.find((m) => m.id === modelName); if (!modelInfo) { return null; } diff --git a/packages/models/src/models.spec.ts b/packages/models/src/models.spec.ts index 893959a2d8..359591d79a 100644 --- a/packages/models/src/models.spec.ts +++ b/packages/models/src/models.spec.ts @@ -4,7 +4,7 @@ import { models } from "./models"; describe("Models", () => { it("should not have duplicate model IDs", () => { - const modelIds = models.map((model) => model.model); + const modelIds = models.map((model) => model.id); const uniqueModelIds = new Set(modelIds); diff --git a/packages/models/src/models.ts b/packages/models/src/models.ts index 347810df55..f8d2c99a81 100644 --- a/packages/models/src/models.ts +++ b/packages/models/src/models.ts @@ -66,7 +66,17 @@ export interface ProviderModelMapping { } export interface ModelDefinition { - model: string; + /** + * Unique identifier for the model + */ + id: string; + /** + * Human-readable display name for the model + */ + name?: string; + /** + * Mappings to provider models + */ providers: ProviderModelMapping[]; /** * Whether the model supports JSON output mode diff --git a/packages/models/src/models/alibaba.ts b/packages/models/src/models/alibaba.ts index 373b33784b..ac343bf370 100644 --- a/packages/models/src/models/alibaba.ts +++ b/packages/models/src/models/alibaba.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const alibabaModels = [ { - model: "qwen-plus", + id: "qwen-plus", + name: "Qwen Plus", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -21,7 +22,8 @@ export const alibabaModels = [ jsonOutput: true, }, { - model: "qwen-turbo", + id: "qwen-turbo", + name: "Qwen Turbo", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -40,7 +42,8 @@ export const alibabaModels = [ jsonOutput: true, }, { - model: "qwen3-coder-plus", + id: "qwen3-coder-plus", + name: "Qwen3 Coder Plus", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/anthropic.ts b/packages/models/src/models/anthropic.ts index 1c17fb9983..e513da32f2 100644 --- a/packages/models/src/models/anthropic.ts +++ b/packages/models/src/models/anthropic.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const anthropicModels = [ { - model: "claude-3-7-sonnet", + id: "claude-3-7-sonnet", + name: "Claude 3.7 Sonnet", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -21,7 +22,8 @@ export const anthropicModels = [ ], }, { - model: "claude-3-7-sonnet-20250219", + id: "claude-3-7-sonnet-20250219", + name: "Claude 3.7 Sonnet (2025-02-19)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -40,7 +42,8 @@ export const anthropicModels = [ ], }, { - model: "claude-3-5-sonnet-20241022", + id: "claude-3-5-sonnet-20241022", + name: "Claude 3.5 Sonnet (2024-10-22)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -59,7 +62,8 @@ export const anthropicModels = [ ], }, { - model: "claude-2.1", + id: "claude-2.1", + name: "Claude 2.1", deprecatedAt: new Date("2025-06-15T00:00:00Z"), deactivatedAt: new Date("2025-07-21T16:00:00Z"), providers: [ @@ -77,7 +81,8 @@ export const anthropicModels = [ ], }, { - model: "claude-sonnet-4-20250514", + id: "claude-sonnet-4-20250514", + name: "Claude Sonnet 4 (2025-05-14)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -95,7 +100,8 @@ export const anthropicModels = [ ], }, { - model: "claude-opus-4-20250514", + id: "claude-opus-4-20250514", + name: "Claude Opus 4 (2025-05-14)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -113,7 +119,8 @@ export const anthropicModels = [ ], }, { - model: "claude-3-5-sonnet", + id: "claude-3-5-sonnet", + name: "Claude 3.5 Sonnet", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/deepseek.ts b/packages/models/src/models/deepseek.ts index 88de1edd72..7b002afb83 100644 --- a/packages/models/src/models/deepseek.ts +++ b/packages/models/src/models/deepseek.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const deepseekModels = [ { - model: "deepseek-v3", + id: "deepseek-v3", + name: "DeepSeek V3", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -32,7 +33,8 @@ export const deepseekModels = [ jsonOutput: false, }, { - model: "deepseek-r1", + id: "deepseek-r1", + name: "DeepSeek R1", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -62,7 +64,8 @@ export const deepseekModels = [ jsonOutput: false, }, { - model: "deepseek-r1-0528", + id: "deepseek-r1-0528", + name: "DeepSeek R1 (0528)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -92,7 +95,8 @@ export const deepseekModels = [ jsonOutput: false, }, { - model: "deepseek-r1-distill-llama-70b", + id: "deepseek-r1-distill-llama-70b", + name: "DeepSeek R1 Distill Llama 70B", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/google.ts b/packages/models/src/models/google.ts index 34ab7ca10c..eb6c70fa91 100644 --- a/packages/models/src/models/google.ts +++ b/packages/models/src/models/google.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const googleModels = [ { - model: "gemini-2.5-pro", + id: "gemini-2.5-pro", + name: "Gemini 2.5 Pro", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -20,7 +21,8 @@ export const googleModels = [ ], }, { - model: "gemini-2.5-pro-preview-05-06", + id: "gemini-2.5-pro-preview-05-06", + name: "Gemini 2.5 Pro Preview (05-06)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -38,7 +40,8 @@ export const googleModels = [ ], }, { - model: "gemini-2.5-pro-preview-06-05", + id: "gemini-2.5-pro-preview-06-05", + name: "Gemini 2.5 Pro Preview (06-05)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -56,7 +59,8 @@ export const googleModels = [ ], }, { - model: "gemini-2.5-flash-preview-04-17", + id: "gemini-2.5-flash-preview-04-17", + name: "Gemini 2.5 Flash Preview (04-17)", deprecatedAt: undefined, deactivatedAt: new Date("2025-07-22"), providers: [ @@ -74,7 +78,8 @@ export const googleModels = [ ], }, { - model: "gemini-2.5-flash-preview-05-20", + id: "gemini-2.5-flash-preview-05-20", + name: "Gemini 2.5 Flash Preview (05-20)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -92,7 +97,8 @@ export const googleModels = [ ], }, { - model: "gemini-2.5-flash", + id: "gemini-2.5-flash", + name: "Gemini 2.5 Flash", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -110,7 +116,8 @@ export const googleModels = [ ], }, { - model: "gemini-2.5-flash-preview-04-17-thinking", + id: "gemini-2.5-flash-preview-04-17-thinking", + name: "Gemini 2.5 Flash Preview Thinking (04-17)", deprecatedAt: undefined, deactivatedAt: new Date("2025-07-22"), providers: [ @@ -128,7 +135,8 @@ export const googleModels = [ ], }, { - model: "gemini-1.5-pro", + id: "gemini-1.5-pro", + name: "Gemini 1.5 Pro", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -146,7 +154,8 @@ export const googleModels = [ ], }, { - model: "gemini-1.5-flash", + id: "gemini-1.5-flash", + name: "Gemini 1.5 Flash", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -164,7 +173,8 @@ export const googleModels = [ ], }, { - model: "gemini-1.5-flash-8b", + id: "gemini-1.5-flash-8b", + name: "Gemini 1.5 Flash 8B", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -182,7 +192,8 @@ export const googleModels = [ ], }, { - model: "gemini-2.0-flash-lite", + id: "gemini-2.0-flash-lite", + name: "Gemini 2.0 Flash Lite", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -200,7 +211,8 @@ export const googleModels = [ ], }, { - model: "gemini-2.0-flash", + id: "gemini-2.0-flash", + name: "Gemini 2.0 Flash", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -218,7 +230,8 @@ export const googleModels = [ ], }, { - model: "gemma-3n-e2b-it", + id: "gemma-3n-e2b-it", + name: "Gemma 3n E2B IT", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -236,7 +249,8 @@ export const googleModels = [ ], }, { - model: "gemma-3n-e4b-it", + id: "gemma-3n-e4b-it", + name: "Gemma 3n E4B IT", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -254,7 +268,8 @@ export const googleModels = [ ], }, { - model: "gemma-3-1b-it", + id: "gemma-3-1b-it", + name: "Gemma 3 1B IT", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -272,7 +287,8 @@ export const googleModels = [ ], }, { - model: "gemma-3-4b-it", + id: "gemma-3-4b-it", + name: "Gemma 3 4B IT", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -291,7 +307,8 @@ export const googleModels = [ ], }, { - model: "gemma-3-12b-it", + id: "gemma-3-12b-it", + name: "Gemma 3 12B IT", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -310,7 +327,8 @@ export const googleModels = [ ], }, { - model: "gemma2-9b-it", + id: "gemma2-9b-it", + name: "Gemma2 9B IT", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/llmgateway.ts b/packages/models/src/models/llmgateway.ts index 4f7afa4ee1..a24afc672b 100644 --- a/packages/models/src/models/llmgateway.ts +++ b/packages/models/src/models/llmgateway.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const llmgatewayModels = [ { - model: "custom", // custom provider which expects base URL to be set + id: "custom", // custom provider which expects base URL to be set + name: "Custom Model", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -19,7 +20,8 @@ export const llmgatewayModels = [ ], }, { - model: "auto", // native automatic routing + id: "auto", // native automatic routing + name: "Auto Route", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/meta.ts b/packages/models/src/models/meta.ts index d90e97790b..01cea3495e 100644 --- a/packages/models/src/models/meta.ts +++ b/packages/models/src/models/meta.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const metaModels = [ { - model: "llama-3.1-8b-instruct", + id: "llama-3.1-8b-instruct", + name: "Llama 3.1 8B Instruct", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -42,7 +43,8 @@ export const metaModels = [ ], }, { - model: "llama-3.2-11b-instruct", + id: "llama-3.2-11b-instruct", + name: "Llama 3.2 11B Instruct", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -60,7 +62,8 @@ export const metaModels = [ ], }, { - model: "llama-4-maverick-17b-128e-instruct", + id: "llama-4-maverick-17b-128e-instruct", + name: "Llama 4 Maverick 17B 128E Instruct", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -77,7 +80,8 @@ export const metaModels = [ ], }, { - model: "llama-guard-4-12b", + id: "llama-guard-4-12b", + name: "Llama Guard 4 12B", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/mistral.ts b/packages/models/src/models/mistral.ts index b990b6ad78..ff3311dab3 100644 --- a/packages/models/src/models/mistral.ts +++ b/packages/models/src/models/mistral.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const mistralModels = [ { - model: "mistral-large-latest", + id: "mistral-large-latest", + name: "Mistral Large Latest", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/moonshot.ts b/packages/models/src/models/moonshot.ts index 583143f9cf..ea4d5fdcd2 100644 --- a/packages/models/src/models/moonshot.ts +++ b/packages/models/src/models/moonshot.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const moonshotModels = [ { - model: "kimi-k2", + id: "kimi-k2", + name: "Kimi K2", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/openai.ts b/packages/models/src/models/openai.ts index 96ae5b7ef6..975e0fb5cb 100644 --- a/packages/models/src/models/openai.ts +++ b/packages/models/src/models/openai.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const openaiModels = [ { - model: "gpt-4o-mini", + id: "gpt-4o-mini", + name: "GPT-4o Mini", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -22,7 +23,8 @@ export const openaiModels = [ jsonOutput: true, }, { - model: "gpt-4", + id: "gpt-4", + name: "GPT-4", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -41,7 +43,8 @@ export const openaiModels = [ jsonOutput: false, }, { - model: "gpt-4o", + id: "gpt-4o", + name: "GPT-4o", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -62,7 +65,8 @@ export const openaiModels = [ jsonOutput: true, }, { - model: "gpt-3.5-turbo", + id: "gpt-3.5-turbo", + name: "GPT-3.5 Turbo", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -81,7 +85,8 @@ export const openaiModels = [ jsonOutput: true, }, { - model: "gpt-4-turbo", + id: "gpt-4-turbo", + name: "GPT-4 Turbo", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -100,7 +105,8 @@ export const openaiModels = [ jsonOutput: true, }, { - model: "gpt-4.1", + id: "gpt-4.1", + name: "GPT-4.1", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -119,7 +125,8 @@ export const openaiModels = [ jsonOutput: true, }, { - model: "o1", + id: "o1", + name: "o1", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -157,7 +164,8 @@ export const openaiModels = [ // jsonOutput: true, // }, { - model: "gpt-4.1-mini", + id: "gpt-4.1-mini", + name: "GPT-4.1 Mini", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -176,7 +184,8 @@ export const openaiModels = [ jsonOutput: true, }, { - model: "gpt-4.1-nano", + id: "gpt-4.1-nano", + name: "GPT-4.1 Nano", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -195,7 +204,8 @@ export const openaiModels = [ jsonOutput: true, }, { - model: "o3", + id: "o3", + name: "o3", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -214,7 +224,8 @@ export const openaiModels = [ jsonOutput: true, }, { - model: "o3-mini", + id: "o3-mini", + name: "o3 Mini", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/perplexity.ts b/packages/models/src/models/perplexity.ts index 7809b6125d..809d7672d6 100644 --- a/packages/models/src/models/perplexity.ts +++ b/packages/models/src/models/perplexity.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const perplexityModels = [ { - model: "sonar-reasoning-pro", + id: "sonar-reasoning-pro", + name: "Sonar Reasoning Pro", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -22,7 +23,8 @@ export const perplexityModels = [ jsonOutput: false, }, { - model: "sonar-pro", + id: "sonar-pro", + name: "Sonar Pro", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -42,7 +44,8 @@ export const perplexityModels = [ jsonOutput: false, }, { - model: "sonar", + id: "sonar", + name: "Sonar", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/models/xai.ts b/packages/models/src/models/xai.ts index 6d9c7e6a18..786df68c56 100644 --- a/packages/models/src/models/xai.ts +++ b/packages/models/src/models/xai.ts @@ -2,7 +2,8 @@ import type { ModelDefinition } from "@llmgateway/models"; export const xaiModels = [ { - model: "grok-3", + id: "grok-3", + name: "Grok-3", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -21,7 +22,8 @@ export const xaiModels = [ jsonOutput: true, }, { - model: "grok-3-mini", + id: "grok-3-mini", + name: "Grok-3 Mini", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -40,7 +42,8 @@ export const xaiModels = [ jsonOutput: true, }, { - model: "grok-3-fast", + id: "grok-3-fast", + name: "Grok-3 Fast", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -59,7 +62,8 @@ export const xaiModels = [ jsonOutput: true, }, { - model: "grok-3-mini-fast", + id: "grok-3-mini-fast", + name: "Grok-3 Mini Fast", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -78,7 +82,8 @@ export const xaiModels = [ jsonOutput: true, }, { - model: "grok-2-1212", + id: "grok-2-1212", + name: "Grok-2 (1212)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -97,7 +102,8 @@ export const xaiModels = [ jsonOutput: true, }, { - model: "grok-2-vision-1212", + id: "grok-2-vision-1212", + name: "Grok-2 Vision (1212)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ @@ -117,7 +123,8 @@ export const xaiModels = [ jsonOutput: true, }, { - model: "grok-4-0709", + id: "grok-4-0709", + name: "Grok-4 (0709)", deprecatedAt: undefined, deactivatedAt: undefined, providers: [ diff --git a/packages/models/src/provider-api.ts b/packages/models/src/provider-api.ts index 3c6c3a023f..2944d8bf8d 100644 --- a/packages/models/src/provider-api.ts +++ b/packages/models/src/provider-api.ts @@ -242,7 +242,7 @@ export function getProviderEndpoint( ): string { let modelName = model; if (model && model !== "custom") { - const modelInfo = models.find((m) => m.model === model); + const modelInfo = models.find((m) => m.id === model); if (modelInfo) { const providerMapping = modelInfo.providers.find( (p) => p.providerId === provider, @@ -367,7 +367,7 @@ export function getCheapestModelForProvider( .filter((model) => model.providers.some((p) => p.providerId === provider)) .filter((model) => !model.deprecatedAt || new Date() <= model.deprecatedAt) .map((model) => ({ - model: model.model, + model: model.id, provider: model.providers.find((p) => p.providerId === provider)!, })) .filter(