From 926068b14fc661e915a0247e9ecb5949fb95b4f7 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 24 Apr 2026 19:07:36 +0100 Subject: [PATCH] test(deepseek): add live model smoke --- extensions/deepseek/deepseek.live.test.ts | 60 +++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 extensions/deepseek/deepseek.live.test.ts diff --git a/extensions/deepseek/deepseek.live.test.ts b/extensions/deepseek/deepseek.live.test.ts new file mode 100644 index 00000000000..a9ba504f86e --- /dev/null +++ b/extensions/deepseek/deepseek.live.test.ts @@ -0,0 +1,60 @@ +import { completeSimple, type Model } from "@mariozechner/pi-ai"; +import { describe, expect, it } from "vitest"; +import { + createSingleUserPromptMessage, + extractNonEmptyAssistantText, + isLiveTestEnabled, +} from "../../src/agents/live-test-helpers.js"; +import { buildDeepSeekProvider } from "./provider-catalog.js"; + +const DEEPSEEK_KEY = process.env.DEEPSEEK_API_KEY ?? ""; +const DEEPSEEK_LIVE_MODEL = process.env.OPENCLAW_LIVE_DEEPSEEK_MODEL?.trim() || "deepseek-v4-flash"; +const LIVE = isLiveTestEnabled(["DEEPSEEK_LIVE_TEST"]); + +const describeLive = LIVE && DEEPSEEK_KEY ? describe : describe.skip; + +function forceDeepSeekNonThinkingPath(payload: unknown): void { + if (!payload || typeof payload !== "object") { + return; + } + const request = payload as Record; + request.thinking = { type: "disabled" }; + delete request.reasoning_effort; +} + +function resolveDeepSeekLiveModel(): Model<"openai-completions"> { + const provider = buildDeepSeekProvider(); + const model = provider.models?.find((entry) => entry.id === DEEPSEEK_LIVE_MODEL); + if (!model) { + throw new Error(`DeepSeek bundled catalog does not include ${DEEPSEEK_LIVE_MODEL}`); + } + return { + provider: "deepseek", + baseUrl: provider.baseUrl, + ...model, + api: "openai-completions", + } as Model<"openai-completions">; +} + +describeLive("deepseek plugin live", () => { + it("returns assistant text from the bundled V4 model catalog", async () => { + const res = await completeSimple( + resolveDeepSeekLiveModel(), + { + messages: createSingleUserPromptMessage(), + }, + { + apiKey: DEEPSEEK_KEY, + maxTokens: 64, + onPayload: forceDeepSeekNonThinkingPath, + }, + ); + + if (res.stopReason === "error") { + throw new Error(res.errorMessage || "DeepSeek returned error with no message"); + } + + const text = extractNonEmptyAssistantText(res.content); + expect(text.length).toBeGreaterThan(0); + }, 60_000); +});