diff --git a/apps/web/src/lib/ai-gateway/providers/anthropic.constants.ts b/apps/web/src/lib/ai-gateway/providers/anthropic.constants.ts index f20d4d0abf..51122ea183 100644 --- a/apps/web/src/lib/ai-gateway/providers/anthropic.constants.ts +++ b/apps/web/src/lib/ai-gateway/providers/anthropic.constants.ts @@ -133,5 +133,5 @@ export function isOpusModel(requestedModel: string) { } export function isFableModel(requestedModel: string) { - return requestedModel.includes('fable'); + return requestedModel.includes('claude-fable'); } diff --git a/apps/web/src/lib/ai-gateway/providers/openrouter/index.test.ts b/apps/web/src/lib/ai-gateway/providers/openrouter/index.test.ts index a983f8a1cc..23e790e8fb 100644 --- a/apps/web/src/lib/ai-gateway/providers/openrouter/index.test.ts +++ b/apps/web/src/lib/ai-gateway/providers/openrouter/index.test.ts @@ -17,6 +17,7 @@ import { kiloExclusiveModels, } from '@/lib/ai-gateway/models'; import type { KiloExclusiveModel } from '@/lib/ai-gateway/providers/kilo-exclusive-model'; +import { isFableModel } from '@/lib/ai-gateway/providers/anthropic.constants'; jest.mock('@/lib/ai-gateway/providers/gateway-models-cache', () => ({ getOpenRouterModelsMetadata: jest.fn(() => Promise.resolve({})), @@ -171,6 +172,13 @@ describe('shouldSuppressOpenRouterModel', () => { }); }); +describe('isFableModel', () => { + it('only matches Claude Fable model IDs', () => { + expect(isFableModel('anthropic/claude-fable-5')).toBe(true); + expect(isFableModel('vendor/fable-model')).toBe(false); + }); +}); + describe('disabled paid Kilo-exclusive model fallback', () => { beforeEach(() => { kiloExclusiveModels.push(disabledPaidModel); diff --git a/apps/web/src/lib/ai-gateway/providers/openrouter/index.ts b/apps/web/src/lib/ai-gateway/providers/openrouter/index.ts index d57b604274..a27be1e2d4 100644 --- a/apps/web/src/lib/ai-gateway/providers/openrouter/index.ts +++ b/apps/web/src/lib/ai-gateway/providers/openrouter/index.ts @@ -27,6 +27,7 @@ import { normalizeInferenceProviderId } from '@/lib/ai-gateway/providers/openrou import { getTerminalBenchSummaries, terminalBenchFor } from '@/lib/model-stats/terminal-bench'; import { isFreeNemotronModel, NVIDIA_TRIAL_TOS } from '@/lib/ai-gateway/providers/nvidia'; import { applyCustomPricingToModel } from '@/lib/ai-gateway/custom-pricing'; +import { isFableModel } from '@/lib/ai-gateway/providers/anthropic.constants'; // Re-export from shared module for backwards compatibility export { normalizeModelId } from '@/lib/ai-gateway/model-utils'; @@ -128,7 +129,9 @@ async function enhancedModelList(models: OpenRouterModel[]) { (model: OpenRouterModel) => !kiloExclusiveModels.some( m => m.public_id === model.id && shouldSuppressOpenRouterModel(m) - ) && !isForbiddenFreeModel(model.id) + ) && + !isForbiddenFreeModel(model.id) && + !isFableModel(model.id) ) .map(model => { const preferredProvider = getPreferredProviderOrder(model.id).at(0);