
























@@ -16,6 +16,19 @@ type PayloadCapture = {
1616payload?: Record<string, unknown>;
1717};
181819+type ThinkingPayload = {
20+type?: unknown;
21+};
22+23+type ReplayToolCall = {
24+id?: unknown;
25+type?: unknown;
26+function?: {
27+name?: unknown;
28+arguments?: unknown;
29+};
30+};
31+1932type RegisteredProvider = Awaited<ReturnType<typeof registerSingleProviderPlugin>>;
20332134const emptyUsage = {
@@ -140,6 +153,23 @@ function requireThinkingWrapper(
140153return wrapper;
141154}
142155156+function readThinking(payload: Record<string, unknown> | undefined): ThinkingPayload | undefined {
157+return payload?.thinking as ThinkingPayload | undefined;
158+}
159+160+function readPayloadMessage(
161+capture: PayloadCapture,
162+index: number,
163+): Record<string, unknown> | undefined {
164+return (capture.payload?.messages as Array<Record<string, unknown>> | undefined)?.[index];
165+}
166+167+function readFirstToolCall(
168+message: Record<string, unknown> | undefined,
169+): ReplayToolCall | undefined {
170+return (message?.tool_calls as ReplayToolCall[] | undefined)?.[0];
171+}
172+143173describe("deepseek provider plugin", () => {
144174it("registers DeepSeek with api-key auth wizard metadata", async () => {
145175const provider = await registerSingleProviderPlugin(deepseekPlugin);
@@ -152,10 +182,11 @@ describe("deepseek provider plugin", () => {
152182expect(provider.label).toBe("DeepSeek");
153183expect(provider.envVars).toEqual(["DEEPSEEK_API_KEY"]);
154184expect(provider.auth).toHaveLength(1);
155-expect(resolved).toMatchObject({
156-provider: { id: "deepseek" },
157-method: { id: "api-key" },
158-});
185+if (!resolved) {
186+throw new Error("expected DeepSeek api-key auth choice");
187+}
188+expect(resolved.provider.id).toBe("deepseek");
189+expect(resolved.method.id).toBe("api-key");
159190});
160191161192it("builds the static DeepSeek model catalog", async () => {
@@ -184,14 +215,11 @@ describe("deepseek provider plugin", () => {
184215it("owns OpenAI-compatible replay policy", async () => {
185216const provider = await registerSingleProviderPlugin(deepseekPlugin);
186217187-expect(provider.buildReplayPolicy?.({ modelApi: "openai-completions" } as never)).toMatchObject(
188-{
189-sanitizeToolCallIds: true,
190-toolCallIdMode: "strict",
191-validateGeminiTurns: true,
192-validateAnthropicTurns: true,
193-},
194-);
218+const replayPolicy = provider.buildReplayPolicy?.({ modelApi: "openai-completions" } as never);
219+expect(replayPolicy?.sanitizeToolCallIds).toBe(true);
220+expect(replayPolicy?.toolCallIdMode).toBe("strict");
221+expect(replayPolicy?.validateGeminiTurns).toBe(true);
222+expect(replayPolicy?.validateAnthropicTurns).toBe(true);
195223});
196224197225it("advertises max thinking levels for DeepSeek V4 models only", async () => {
@@ -256,7 +284,7 @@ describe("deepseek provider plugin", () => {
256284{},
257285);
258286259-expect(capturedPayload).toMatchObject({ thinking: { type: "disabled" } });
287+expect(readThinking(capturedPayload)?.type).toBe("disabled");
260288expect(capturedPayload).not.toHaveProperty("reasoning_effort");
261289262290const wrapThinkingXhigh = requireThinkingWrapper(
@@ -273,10 +301,8 @@ describe("deepseek provider plugin", () => {
273301{},
274302);
275303276-expect(capturedPayload).toMatchObject({
277-thinking: { type: "enabled" },
278-reasoning_effort: "max",
279-});
304+expect(readThinking(capturedPayload)?.type).toBe("enabled");
305+expect(capturedPayload?.reasoning_effort).toBe("max");
280306});
281307282308it("preserves replayed reasoning_content when DeepSeek V4 thinking is enabled", async () => {
@@ -291,24 +317,16 @@ describe("deepseek provider plugin", () => {
291317);
292318await wrapThinkingHigh(model, context, {});
293319294-expect(capture.payload).toMatchObject({
295-thinking: { type: "enabled" },
296-reasoning_effort: "high",
297-});
298-expect((capture.payload?.messages as Array<Record<string, unknown>>)[1]).toMatchObject({
299-role: "assistant",
300-reasoning_content: "call reasoning",
301-tool_calls: [
302-{
303-id: "call_1",
304-type: "function",
305-function: {
306-name: "read",
307-arguments: "{}",
308-},
309-},
310-],
311-});
320+expect(readThinking(capture.payload)?.type).toBe("enabled");
321+expect(capture.payload?.reasoning_effort).toBe("high");
322+const assistantMessage = readPayloadMessage(capture, 1);
323+expect(assistantMessage?.role).toBe("assistant");
324+expect(assistantMessage?.reasoning_content).toBe("call reasoning");
325+const toolCall = readFirstToolCall(assistantMessage);
326+expect(toolCall?.id).toBe("call_1");
327+expect(toolCall?.type).toBe("function");
328+expect(toolCall?.function?.name).toBe("read");
329+expect(toolCall?.function?.arguments).toBe("{}");
312330});
313331314332it("adds blank reasoning_content for replayed tool calls from non-DeepSeek turns", async () => {
@@ -330,20 +348,14 @@ describe("deepseek provider plugin", () => {
330348);
331349await wrapThinkingHigh(model, context, {});
332350333-expect((capture.payload?.messages as Array<Record<string, unknown>>)[1]).toMatchObject({
334-role: "assistant",
335-reasoning_content: "",
336-tool_calls: [
337-{
338-id: "call_1",
339-type: "function",
340-function: {
341-name: "read",
342-arguments: "{}",
343-},
344-},
345-],
346-});
351+const assistantMessage = readPayloadMessage(capture, 1);
352+expect(assistantMessage?.role).toBe("assistant");
353+expect(assistantMessage?.reasoning_content).toBe("");
354+const toolCall = readFirstToolCall(assistantMessage);
355+expect(toolCall?.id).toBe("call_1");
356+expect(toolCall?.type).toBe("function");
357+expect(toolCall?.function?.name).toBe("read");
358+expect(toolCall?.function?.arguments).toBe("{}");
347359});
348360349361it("adds blank reasoning_content for replayed plain assistant messages", async () => {
@@ -369,11 +381,10 @@ describe("deepseek provider plugin", () => {
369381);
370382await wrapThinkingHigh(model, context, {});
371383372-expect((capture.payload?.messages as Array<Record<string, unknown>>)[1]).toMatchObject({
373-role: "assistant",
374-content: "Hello.",
375-reasoning_content: "",
376-});
384+const assistantMessage = readPayloadMessage(capture, 1);
385+expect(assistantMessage?.role).toBe("assistant");
386+expect(assistantMessage?.content).toBe("Hello.");
387+expect(assistantMessage?.reasoning_content).toBe("");
377388});
378389379390it("strips replayed reasoning_content when DeepSeek V4 thinking is disabled", async () => {
@@ -388,7 +399,7 @@ describe("deepseek provider plugin", () => {
388399);
389400await wrapThinkingNone(model, context, {});
390401391-expect(capture.payload).toMatchObject({ thinking: { type: "disabled" } });
402+expect(readThinking(capture.payload)?.type).toBe("disabled");
392403expect(capture.payload).not.toHaveProperty("reasoning_effort");
393404expect((capture.payload?.messages as Array<Record<string, unknown>>)[1]).not.toHaveProperty(
394405"reasoning_content",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。