diff --git a/packages/types/src/__tests__/deepseek-v4-pro.test.ts b/packages/types/src/__tests__/deepseek-v4-pro.test.ts new file mode 100644 index 0000000000..210519f3da --- /dev/null +++ b/packages/types/src/__tests__/deepseek-v4-pro.test.ts @@ -0,0 +1,37 @@ +import { basetenModels, deepSeekModels, fireworksModels, opencodeGoModels } from "../providers/index.js" + +describe("DeepSeek V4 Pro 0813 provider catalogs", () => { + it.each([ + ["DeepSeek", deepSeekModels["deepseek-v4-pro"]], + ["OpenCode Go", opencodeGoModels["deepseek-v4-pro"]], + ])("labels the first-party API checkpoint through %s", (_provider, model) => { + expect(model).toBeDefined() + expect(model?.displayName).toBe("DeepSeek V4 Pro 0813") + expect(model?.contextWindow).toBeGreaterThanOrEqual(1_000_000) + }) + + it("uses first-party capabilities and OpenCode Go pricing", () => { + expect(deepSeekModels["deepseek-v4-pro"].supportsImages).toBe(false) + expect(opencodeGoModels["deepseek-v4-pro"]).toMatchObject({ + inputPrice: 0.435, + outputPrice: 0.87, + cacheReadsPrice: 0.003625, + }) + }) + + // Self-hosted providers serve the published preview weights, not the checkpoint behind DeepSeek's API alias. + it.each([ + ["Fireworks AI", fireworksModels["accounts/fireworks/models/deepseek-v4-pro"]], + ["Baseten", basetenModels["deepseek-ai/DeepSeek-V4-Pro"]], + ])("does not apply the API checkpoint label to %s", (_provider, model) => { + expect(model).toBeDefined() + expect("displayName" in model && typeof model.displayName === "string" ? model.displayName : "").not.toContain( + "0813", + ) + expect(model?.contextWindow).toBeGreaterThanOrEqual(1_000_000) + }) + + it("does not infer an unverified Baseten cache-write price", () => { + expect(basetenModels["deepseek-ai/DeepSeek-V4-Pro"]).not.toHaveProperty("cacheWritesPrice") + }) +}) diff --git a/packages/types/src/providers/baseten.ts b/packages/types/src/providers/baseten.ts index 27b8cbff4a..fd2a98fdd4 100644 --- a/packages/types/src/providers/baseten.ts +++ b/packages/types/src/providers/baseten.ts @@ -83,6 +83,19 @@ export const basetenModels = { description: "DeepSeek's hybrid reasoning model with efficient long context scaling with GPT-5 level performance", }, + "deepseek-ai/DeepSeek-V4-Pro": { + displayName: "DeepSeek V4 Pro", + maxTokens: 384_000, + contextWindow: 1_000_000, + supportsImages: false, + supportsPromptCache: true, + supportsMaxTokens: true, + inputPrice: 1.74, + outputPrice: 3.48, + cacheReadsPrice: 0.145, + description: + "DeepSeek V4 Pro is a 1.6T-parameter mixture-of-experts model with a 1M context window for advanced reasoning, coding, and agentic workloads.", + }, "openai/gpt-oss-120b": { maxTokens: 16_384, contextWindow: 128_072, diff --git a/packages/types/src/providers/deepseek.ts b/packages/types/src/providers/deepseek.ts index 9387d6a4ae..950e43e558 100644 --- a/packages/types/src/providers/deepseek.ts +++ b/packages/types/src/providers/deepseek.ts @@ -25,9 +25,10 @@ export const deepSeekModels = { description: `DeepSeek-V4-Flash is DeepSeek's fast, cost-efficient V4 model. It supports thinking and non-thinking modes, JSON output, tool calls, chat prefix completion (beta), and FIM completion (beta) in non-thinking mode.`, }, "deepseek-v4-pro": { + displayName: "DeepSeek V4 Pro 0813", maxTokens: 384_000, contextWindow: 1_000_000, - supportsImages: true, + supportsImages: false, supportsPromptCache: true, supportsReasoningEffort: ["disable", "high", "max"], // Updated 2026-08-01 preserveReasoning: true, @@ -37,7 +38,7 @@ export const deepSeekModels = { outputPrice: 0.87, // $0.87 per million tokens - Updated 2026-08-01 cacheWritesPrice: 0.435, // $0.435 per million tokens (cache miss) - Updated 2026-08-01 cacheReadsPrice: 0.003625, // $0.003625 per million tokens (cache hit) - Updated 2026-08-01 - description: `DeepSeek-V4-Pro is DeepSeek's strongest V4 model for reasoning, coding, long-context, and agentic workloads. It supports thinking and non-thinking modes, JSON output, tool calls, chat prefix completion (beta), and FIM completion (beta) in non-thinking mode.`, + description: `DeepSeek-V4-Pro-0813 is DeepSeek's strongest V4 model for reasoning, coding, long-context, and agentic workloads. It supports thinking and non-thinking modes, JSON output, tool calls, chat prefix completion (beta), and FIM completion (beta) in non-thinking mode.`, }, } as const satisfies Record diff --git a/packages/types/src/providers/opencode-go.ts b/packages/types/src/providers/opencode-go.ts index bd60c4d349..7381713349 100644 --- a/packages/types/src/providers/opencode-go.ts +++ b/packages/types/src/providers/opencode-go.ts @@ -295,6 +295,7 @@ export const opencodeGoModels: Record = { // --- DeepSeek --- "deepseek-v4-pro": { + displayName: "DeepSeek V4 Pro 0813", maxTokens: 384_000, contextWindow: 1_000_000, supportsImages: false, @@ -308,11 +309,11 @@ export const opencodeGoModels: Record = { supportsReasoningEffort: ["disable", "low", "medium", "high", "xhigh"], preserveReasoning: true, reasoningEffort: "high", - inputPrice: 1.74, - outputPrice: 3.48, - cacheReadsPrice: 0.0145, + inputPrice: 0.435, + outputPrice: 0.87, + cacheReadsPrice: 0.003625, description: - "DeepSeek-V4-Pro is DeepSeek's strongest V4 model for reasoning, coding, long-context, and agentic workloads. Available via the Opencode Go plan.", + "DeepSeek-V4-Pro-0813 is DeepSeek's strongest V4 model for reasoning, coding, long-context, and agentic workloads. Available via the Opencode Go plan.", }, "deepseek-v4-flash": { maxTokens: 384_000, diff --git a/src/api/providers/__tests__/deepseek.spec.ts b/src/api/providers/__tests__/deepseek.spec.ts index 4f3cccdc08..f887cefeb1 100644 --- a/src/api/providers/__tests__/deepseek.spec.ts +++ b/src/api/providers/__tests__/deepseek.spec.ts @@ -243,7 +243,7 @@ describe("DeepSeekHandler", () => { expect(model.info).toBeDefined() expect(model.info.maxTokens).toBe(384_000) expect(model.info.contextWindow).toBe(1_000_000) - expect(model.info.supportsImages).toBe(true) + expect(model.info.supportsImages).toBe(false) expect(model.info.supportsPromptCache).toBe(true) expect((model.info as ModelInfo).preserveReasoning).toBe(true) expect((model.info as ModelInfo).reasoningEffort).toBe("high")