import { describe, expect, it } from "vitest"; import { getCapabilitiesForModel } from "../../open-sse/providers/capabilities.js"; import { PROVIDER_MODELS } from "../../open-sse/config/providerModels.js"; import { getThinkingLevels } from "../../open-sse/providers/thinkingLevels.js"; import { FORMATS } from "../../open-sse/translator/formats.js"; import { OpenCodeExecutor } from "../../open-sse/executors/opencode.js"; import "../translator/registerAll.js"; import { translateRequest } from "../../open-sse/translator/index.js"; const MODEL = "muse-spark-1.2-contributor-free"; const PROVIDER = "opencode"; const input = [{ type: "message", role: "user", content: [{ type: "input_text", text: "Think, then answer: 2 + 2?" }], }]; describe("OpenCode Free Muse Spark thinking", () => { it("advertises reasoning and the requested model limits", () => { expect(PROVIDER_MODELS.oc?.some((model) => model.id === MODEL)).toBe(true); expect(getCapabilitiesForModel(PROVIDER, MODEL)).toMatchObject({ reasoning: true, thinkingFormat: "openai", contextWindow: 1048576, maxOutput: 131072, }); expect(getCapabilitiesForModel(PROVIDER, `oc/${MODEL}`)).toMatchObject({ reasoning: true, contextWindow: 1048576, maxOutput: 131072, }); expect(getThinkingLevels(PROVIDER, MODEL)).toEqual([ "none", "minimal", "low", "medium", "high", "xhigh", ]); }); it("clamps max to xhigh and emits the Responses reasoning shape", () => { const body = { input, reasoning: { effort: "max" }, max_tokens: 131072, }; const out = new OpenCodeExecutor().transformRequest(MODEL, body, true, { connectionId: "opencode-muse-spark-test", }); expect(out.reasoning).toEqual({ effort: "xhigh", summary: "auto" }); expect(out.reasoning_effort).toBeUndefined(); expect(out.max_output_tokens).toBe(131072); expect(out.max_tokens).toBeUndefined(); }); it("leaves the other free models on Chat Completions", () => { const executor = new OpenCodeExecutor(); const body = { messages: [{ role: "user", content: "hi" }], max_tokens: 1024 }; executor.transformRequest("big-pickle", body, true, {}); expect(executor.buildUrl("big-pickle")).toBe("https://opencode.ai/zen/v1/chat/completions"); expect(body.max_tokens).toBe(1024); expect(body.max_output_tokens).toBeUndefined(); }); it("translates Chat Completions max thinking into a Responses request", () => { const body = { model: `oc/${MODEL}`, messages: [{ role: "user", content: "Think, then answer: 2 + 2?" }], reasoning_effort: "max", max_tokens: 131072, }; const translated = translateRequest( FORMATS.OPENAI, FORMATS.OPENAI_RESPONSES, MODEL, body, true, {}, PROVIDER, ); const out = new OpenCodeExecutor().transformRequest(MODEL, translated, true, { connectionId: "opencode-muse-spark-translation-test", }); expect(out.reasoning).toEqual({ effort: "xhigh", summary: "auto" }); expect(out.max_output_tokens).toBe(131072); expect(out.max_tokens).toBeUndefined(); }); });