diff --git a/src/web-server/models-dev/pricing-resolver.ts b/src/web-server/models-dev/pricing-resolver.ts index 26733980..daad1c92 100644 --- a/src/web-server/models-dev/pricing-resolver.ts +++ b/src/web-server/models-dev/pricing-resolver.ts @@ -174,9 +174,11 @@ export function resolveModelsDevPricing( const provider = options.provider ?? prefixed.provider; const modelId = prefixed.model; - return ( - resolveProviderModel(registry, provider, modelId) ?? resolveUnambiguousModel(registry, modelId) - ); + if (provider) { + return resolveProviderModel(registry, provider, modelId); + } + + return resolveUnambiguousModel(registry, modelId); } export function getKnownModelsDevModels(): string[] { diff --git a/tests/unit/model-pricing.test.ts b/tests/unit/model-pricing.test.ts index 8e1141a0..baa7e11a 100644 --- a/tests/unit/model-pricing.test.ts +++ b/tests/unit/model-pricing.test.ts @@ -327,6 +327,11 @@ describe('model-pricing', () => { name: 'GPT-5.5', cost: { input: 5, output: 30, cache_read: 0.5 }, }, + 'openai-exclusive-model': { + id: 'openai-exclusive-model', + name: 'OpenAI Exclusive Model', + cost: { input: 9, output: 18 }, + }, }, }, 'github-copilot': { @@ -373,6 +378,18 @@ describe('model-pricing', () => { expect(hasCustomPricing('gpt-5.5', { provider: 'openai' })).toBe(true); }); + it('does not use another provider pricing when explicit provider lookup misses', () => { + const fallback = getModelPricing('unknown-model-xyz'); + + expect(getModelPricing('openai-exclusive-model', { provider: 'github-copilot' })).toEqual( + fallback + ); + expect(getModelPricing('github-copilot/openai-exclusive-model')).toEqual(fallback); + expect(hasCustomPricing('openai-exclusive-model', { provider: 'github-copilot' })).toBe( + false + ); + }); + it('calculates cost with provider-aware models.dev pricing', () => { const usage: TokenUsage = { inputTokens: 1_000_000,