Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion apps/web/app/api/chat/_lib/model-selection.ts
Original file line number Diff line number Diff line change
@@ -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";

Expand All @@ -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,
Expand Down
21 changes: 21 additions & 0 deletions apps/web/lib/model-availability.ts
Original file line number Diff line number Diff line change
@@ -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<T extends { id: string }>(
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;
}
5 changes: 4 additions & 1 deletion apps/web/lib/models-with-context.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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<
Expand Down
Loading