




















@@ -309,6 +309,73 @@ describe("deepseek provider plugin", () => {
309309});
310310});
311311312+it("adds blank reasoning_content for replayed plain assistant messages", async () => {
313+let capturedPayload: Record<string, unknown> | undefined;
314+const model = {
315+provider: "deepseek",
316+id: "deepseek-v4-pro",
317+name: "DeepSeek V4 Pro",
318+api: "openai-completions",
319+baseUrl: "https://api.deepseek.com",
320+reasoning: true,
321+input: ["text"],
322+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
323+contextWindow: 1_000_000,
324+maxTokens: 384_000,
325+compat: {
326+supportsUsageInStreaming: true,
327+supportsReasoningEffort: true,
328+maxTokensField: "max_tokens",
329+},
330+} as Model<"openai-completions">;
331+const context = {
332+messages: [
333+{ role: "user", content: "hi", timestamp: 1 },
334+{
335+role: "assistant",
336+api: "openai-completions",
337+provider: "openai",
338+model: "gpt-5.4",
339+content: [{ type: "text", text: "Hello." }],
340+usage: {
341+input: 0,
342+output: 0,
343+cacheRead: 0,
344+cacheWrite: 0,
345+totalTokens: 0,
346+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
347+},
348+stopReason: "stop",
349+timestamp: 2,
350+},
351+{ role: "user", content: "next", timestamp: 3 },
352+],
353+} as Context;
354+const baseStreamFn = (
355+streamModel: Model<"openai-completions">,
356+streamContext: Context,
357+options?: { onPayload?: (payload: unknown, model: unknown) => unknown },
358+) => {
359+capturedPayload = buildOpenAICompletionsParams(streamModel, streamContext, {
360+reasoning: "high",
361+} as never);
362+options?.onPayload?.(capturedPayload, streamModel);
363+const stream = createAssistantMessageEventStream();
364+queueMicrotask(() => stream.end());
365+return stream;
366+};
367+368+const wrapThinkingHigh = createDeepSeekV4ThinkingWrapper(baseStreamFn as never, "high");
369+expect(wrapThinkingHigh).toBeDefined();
370+await wrapThinkingHigh?.(model, context, {});
371+372+expect((capturedPayload?.messages as Array<Record<string, unknown>>)[1]).toMatchObject({
373+role: "assistant",
374+content: "Hello.",
375+reasoning_content: "",
376+});
377+});
378+312379it("strips replayed reasoning_content when DeepSeek V4 thinking is disabled", async () => {
313380let capturedPayload: Record<string, unknown> | undefined;
314381const model = {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。