From ea16ea1ecea2519433032a3ea9be4694169456d1 Mon Sep 17 00:00:00 2001 From: xiajiadi <187861803+xiajiadi@users.noreply.github.com> Date: Fri, 4 Sep 2026 17:07:04 +0800 Subject: [PATCH 1/2] test: cover DeepSeek Vision image payload --- tests/unit/deepseek-vision.test.ts | 90 ++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 tests/unit/deepseek-vision.test.ts diff --git a/tests/unit/deepseek-vision.test.ts b/tests/unit/deepseek-vision.test.ts new file mode 100644 index 00000000..7a439bc2 --- /dev/null +++ b/tests/unit/deepseek-vision.test.ts @@ -0,0 +1,90 @@ +import { createDeepSeek } from "@ai-sdk/deepseek" +import { generateText } from "ai" +import { describe, expect, it } from "vitest" + +describe("DeepSeek V4 Vision image input", () => { + it("includes image content in the chat completion request", async () => { + let requestBody: + | { + messages: Array<{ + role: string + content: string | Array> + }> + } + | undefined + + const provider = createDeepSeek({ + apiKey: "test-key", + baseURL: "https://example.test", + fetch: async (_input, init) => { + const body = init?.body + const rawBody = + typeof body === "string" + ? body + : new TextDecoder().decode(body as Uint8Array) + requestBody = JSON.parse(rawBody) + + return new Response( + JSON.stringify({ + id: "test-response", + object: "chat.completion", + created: 1, + model: "deepseek-v4-flash-vision-exp", + choices: [ + { + index: 0, + message: { role: "assistant", content: "ok" }, + finish_reason: "stop", + }, + ], + usage: { + prompt_tokens: 1, + completion_tokens: 1, + total_tokens: 2, + }, + }), + { + status: 200, + headers: { "content-type": "application/json" }, + }, + ) + }, + }) + + await generateText({ + model: provider("deepseek-v4-flash-vision-exp"), + messages: [ + { + role: "user", + content: [ + { type: "text", text: "Describe this image." }, + { + type: "image", + image: "data:image/png;base64,aGVsbG8=", + mediaType: "image/png", + }, + ], + }, + ], + }) + + if (requestBody === undefined) { + throw new Error("DeepSeek request was not captured") + } + + const userMessage = requestBody.messages.find( + (message) => message.role === "user", + ) + expect(userMessage?.content).toEqual( + expect.arrayContaining([ + { type: "text", text: "Describe this image." }, + { + type: "image_url", + image_url: { + url: "data:image/png;base64,aGVsbG8=", + }, + }, + ]), + ) + }) +}) From 58b73ef761d8a5e5b2afa2c360428d3dea996312 Mon Sep 17 00:00:00 2001 From: xiajiadi <187861803+xiajiadi@users.noreply.github.com> Date: Fri, 4 Sep 2026 17:07:05 +0800 Subject: [PATCH 2/2] fix: support DeepSeek Vision image input --- package-lock.json | 51 +++++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 72b0d346..8db5b6bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@ai-sdk/amazon-bedrock": "^4.0.1", "@ai-sdk/anthropic": "^3.0.0", "@ai-sdk/azure": "^3.0.0", - "@ai-sdk/deepseek": "^2.0.0", + "@ai-sdk/deepseek": "^2.0.62", "@ai-sdk/gateway": "^3.0.0", "@ai-sdk/google": "^3.0.0", "@ai-sdk/google-vertex": "^4.0.16", @@ -238,13 +238,13 @@ } }, "node_modules/@ai-sdk/deepseek": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/@ai-sdk/deepseek/-/deepseek-2.0.20.tgz", - "integrity": "sha512-MAL04sDTOWUiBjAGWaVgyeE4bYRb9QpKYRlIeCTZFga6I8yQs50XakhWEssrmvVihdpHGkqpDtCHsFqCydsWLA==", + "version": "2.0.62", + "resolved": "https://registry.npmjs.org/@ai-sdk/deepseek/-/deepseek-2.0.62.tgz", + "integrity": "sha512-9gtHuDMxd/OIwb0x2M5vLQfhRTIKc3kfOq+QCXZBZSb4P0XR9cJanu3FTkH2zbgJvyUWpOwDq2rDGogQ5/Pn1w==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.8", - "@ai-sdk/provider-utils": "4.0.15" + "@ai-sdk/provider": "3.0.15", + "@ai-sdk/provider-utils": "4.0.50" }, "engines": { "node": ">=18" @@ -253,6 +253,45 @@ "zod": "^3.25.76 || ^4.1.8" } }, + "node_modules/@ai-sdk/deepseek/node_modules/@ai-sdk/provider": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.15.tgz", + "integrity": "sha512-XeZW1CcDF2GMbH4wejW6xBRI2QCOgnkVYUnxoeDadB1mf85riL2bMUeDoh+6gJ/r4mjNfzUPW8OjLjvwTP0u1Q==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/deepseek/node_modules/@ai-sdk/provider-utils": { + "version": "4.0.50", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.50.tgz", + "integrity": "sha512-YAcB+7M1JhAYsHorTrWyldCyZihjCKr/QRXH2vFrara/+lwqNE7q5KzoucKLZ7ktFiUonhnhFhRoiymsq/2K2Q==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "3.0.15", + "@standard-schema/spec": "^1.1.0", + "eventsource-parser": "^3.0.8", + "undici": "^6.28.0" + }, + "engines": { + "node": ">=18.17" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/deepseek/node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/@ai-sdk/gateway": { "version": "3.0.55", "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.55.tgz", diff --git a/package.json b/package.json index 41071be7..59410216 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@ai-sdk/amazon-bedrock": "^4.0.1", "@ai-sdk/anthropic": "^3.0.0", "@ai-sdk/azure": "^3.0.0", - "@ai-sdk/deepseek": "^2.0.0", + "@ai-sdk/deepseek": "^2.0.62", "@ai-sdk/gateway": "^3.0.0", "@ai-sdk/google": "^3.0.0", "@ai-sdk/google-vertex": "^4.0.16",