diff --git a/apps/web/src/lib/ai-gateway/providers/vercel/index.test.ts b/apps/web/src/lib/ai-gateway/providers/vercel/index.test.ts index ccb740b268..39987cd973 100644 --- a/apps/web/src/lib/ai-gateway/providers/vercel/index.test.ts +++ b/apps/web/src/lib/ai-gateway/providers/vercel/index.test.ts @@ -1,5 +1,8 @@ import { describe, it, expect } from '@jest/globals'; -import { getAnthropicProviderOptionsForVercel } from '@/lib/ai-gateway/providers/vercel'; +import { + getAnthropicProviderOptionsForVercel, + shouldRouteToVercel, +} from '@/lib/ai-gateway/providers/vercel'; import type { GatewayRequest } from '@/lib/ai-gateway/providers/openrouter/types'; describe('getAnthropicProviderOptionsForVercel', () => { @@ -62,3 +65,17 @@ describe('getAnthropicProviderOptionsForVercel', () => { ); }); }); + +describe('shouldRouteToVercel', () => { + it('excludes DeepSeek models (Vercel does not provide reasoning_content passthrough)', async () => { + const request: GatewayRequest = { + kind: 'chat_completions', + body: { + model: 'deepseek/deepseek-v4-pro', + messages: [{ role: 'user', content: 'hello' }], + }, + }; + + expect(await shouldRouteToVercel('deepseek/deepseek-v4-pro', request, 'seed')).toBe(false); + }); +}); diff --git a/apps/web/src/lib/ai-gateway/providers/vercel/index.ts b/apps/web/src/lib/ai-gateway/providers/vercel/index.ts index 62d2ab3eb0..927e4e4c10 100644 --- a/apps/web/src/lib/ai-gateway/providers/vercel/index.ts +++ b/apps/web/src/lib/ai-gateway/providers/vercel/index.ts @@ -58,6 +58,14 @@ export async function shouldRouteToVercel( return false; } + // DeepSeek models excluded — Vercel AI Gateway routes directly to DeepSeek which rejects + // requests where assistant messages omit `reasoning_content` in thinking mode. OpenRouter + // handles that translation from `providerOptions.openrouter.reasoning_details`; Vercel does not. + if (requestedModel.startsWith('deepseek/')) { + console.debug(`[shouldRouteToVercel] DeepSeek models excluded (reasoning_content passthrough)`); + return false; + } + console.debug('[shouldRouteToVercel] randomizing user to either OpenRouter or Vercel'); const passedRandomization = getRandomNumber('vercel_routing_' + randomSeed, 100) < (await getVercelRoutingPercentage());