diff --git a/apps/web/app/api/chat/_lib/model-selection.ts b/apps/web/app/api/chat/_lib/model-selection.ts index bd7ded148..cd7f40508 100644 --- a/apps/web/app/api/chat/_lib/model-selection.ts +++ b/apps/web/app/api/chat/_lib/model-selection.ts @@ -1,4 +1,5 @@ import type { AgentModelSelection } from "@open-harness/agent"; +import { resolveAvailableModelId } from "@/lib/model-availability"; import { type ModelVariant, resolveModelSelection } from "@/lib/model-variants"; import { DEFAULT_MODEL_ID } from "@/lib/models"; @@ -23,8 +24,16 @@ export function resolveChatModelSelection({ return { id: DEFAULT_MODEL_ID as AgentModelSelection["id"] }; } + const availableModelId = resolveAvailableModelId(selection.resolvedModelId); + if (availableModelId !== selection.resolvedModelId) { + console.warn( + `${missingVariantLabel} "${requestedModelId}" resolves to disabled model "${selection.resolvedModelId}". Falling back to default model.`, + ); + return { id: DEFAULT_MODEL_ID as AgentModelSelection["id"] }; + } + return { - id: selection.resolvedModelId as AgentModelSelection["id"], + id: availableModelId as AgentModelSelection["id"], ...(selection.providerOptionsByProvider ? { providerOptionsOverrides: selection.providerOptionsByProvider, diff --git a/apps/web/lib/model-availability.ts b/apps/web/lib/model-availability.ts new file mode 100644 index 000000000..d6a5e9c5d --- /dev/null +++ b/apps/web/lib/model-availability.ts @@ -0,0 +1,21 @@ +import { DEFAULT_MODEL_ID } from "@/lib/models"; + +const DISABLED_MODEL_IDS = new Set(["openai/gpt-5.4-pro"]); + +export function isModelDisabled(modelId: string): boolean { + return DISABLED_MODEL_IDS.has(modelId); +} + +export function filterDisabledModels( + models: T[], +): T[] { + return models.filter((model) => !isModelDisabled(model.id)); +} + +export function resolveAvailableModelId(modelId: string): string { + if (isModelDisabled(modelId)) { + return DEFAULT_MODEL_ID; + } + + return modelId; +} diff --git a/apps/web/lib/models-with-context.ts b/apps/web/lib/models-with-context.ts index 7356119b2..3ca1b8c22 100644 --- a/apps/web/lib/models-with-context.ts +++ b/apps/web/lib/models-with-context.ts @@ -1,6 +1,7 @@ import "server-only"; import { gateway } from "ai"; +import { filterDisabledModels } from "./model-availability"; import type { AvailableModel, AvailableModelCost } from "./models"; const MODELS_DEV_URL = "https://models.dev/api.json"; @@ -173,7 +174,9 @@ export async function fetchAvailableLanguageModels(): Promise< AvailableModel[] > { const { models } = await gateway.getAvailableModels(); - return models.filter((model) => model.modelType === "language"); + return filterDisabledModels( + models.filter((model) => model.modelType === "language"), + ); } export async function fetchAvailableLanguageModelsWithContext(): Promise<