From b647d187932c76d4003728010daeed9c1b496a6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=9D=E5=BF=83Yearth?= Date: Tue, 11 Aug 2026 16:49:19 +0800 Subject: [PATCH] fix(ai): detect DeepSeek base URLs case-insensitively (#7933) --- packages/ai/scripts/generate-models.ts | 4 ++-- packages/ai/src/api/openai-completions.ts | 4 ++-- packages/ai/test/openai-completions-tool-choice.test.ts | 8 +++++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index 744ced66a..95c939c70 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -625,6 +625,7 @@ function detectOpenAICompletionsCompat(model: Model<"openai-completions">): Open const isNvidia = provider === "nvidia" || baseUrl.includes("integrate.api.nvidia.com"); const isAntLing = provider === "ant-ling" || baseUrl.includes("api.ant-ling.com"); const isTogetherReasoningOnly = isTogether && TOGETHER_REASONING_ONLY_MODELS.has(model.id); + const isDeepSeek = provider === "deepseek" || baseUrl.toLowerCase().includes("deepseek.com"); const isNonStandard = isNvidia || @@ -634,7 +635,7 @@ function detectOpenAICompletionsCompat(model: Model<"openai-completions">): Open baseUrl.includes("api.x.ai") || isTogether || baseUrl.includes("chutes.ai") || - baseUrl.includes("deepseek.com") || + isDeepSeek || isZai || isMoonshot || provider === "opencode" || @@ -643,7 +644,6 @@ function detectOpenAICompletionsCompat(model: Model<"openai-completions">): Open isCloudflareAiGateway || isAntLing; - const isDeepSeek = provider === "deepseek" || baseUrl.includes("deepseek.com"); const useMaxTokens = baseUrl.includes("chutes.ai") || isDeepSeek || diff --git a/packages/ai/src/api/openai-completions.ts b/packages/ai/src/api/openai-completions.ts index 248d73562..73e96e940 100644 --- a/packages/ai/src/api/openai-completions.ts +++ b/packages/ai/src/api/openai-completions.ts @@ -1457,6 +1457,7 @@ function detectCompat(model: Model<"openai-completions">): ResolvedOpenAIComplet const isCloudflareAiGateway = provider === "cloudflare-ai-gateway" || baseUrl.includes("gateway.ai.cloudflare.com"); const isNvidia = provider === "nvidia" || baseUrl.includes("integrate.api.nvidia.com"); const isAntLing = provider === "ant-ling" || baseUrl.includes("api.ant-ling.com"); + const isDeepSeek = provider === "deepseek" || baseUrl.toLowerCase().includes("deepseek.com"); const isNonStandard = isNvidia || @@ -1466,7 +1467,7 @@ function detectCompat(model: Model<"openai-completions">): ResolvedOpenAIComplet baseUrl.includes("api.x.ai") || isTogether || baseUrl.includes("chutes.ai") || - baseUrl.includes("deepseek.com") || + isDeepSeek || isZai || isMoonshot || provider === "opencode" || @@ -1475,7 +1476,6 @@ function detectCompat(model: Model<"openai-completions">): ResolvedOpenAIComplet isCloudflareAiGateway || isAntLing; - const isDeepSeek = provider === "deepseek" || baseUrl.includes("deepseek.com"); const useMaxTokens = baseUrl.includes("chutes.ai") || isDeepSeek || diff --git a/packages/ai/test/openai-completions-tool-choice.test.ts b/packages/ai/test/openai-completions-tool-choice.test.ts index a2a47b7ca..00ded1acf 100644 --- a/packages/ai/test/openai-completions-tool-choice.test.ts +++ b/packages/ai/test/openai-completions-tool-choice.test.ts @@ -1437,11 +1437,17 @@ describe("openai-completions tool_choice", () => { provider: "custom-deepseek", baseUrl: "https://api.deepseek.com", } satisfies Model<"openai-completions">; + const customUppercaseModel = { + ...customModel, + id: "custom-uppercase-deepseek-model", + name: "Custom Uppercase DeepSeek Model", + baseUrl: "https://API.DeepSeek.COM", + } satisfies Model<"openai-completions">; const nativeModels = [ getModel("deepseek", "deepseek-v4-flash")!, getModel("deepseek", "deepseek-v4-pro")!, ] as const; - const cases = [...nativeModels, customModel] as const; + const cases = [...nativeModels, customModel, customUppercaseModel] as const; for (const model of nativeModels) { expect(model.compat?.maxTokensField).toBe("max_tokens");