From 666e4aaca22d4462ec0a6b77a79182d2cca6f27c Mon Sep 17 00:00:00 2001 From: Dizzle <112548150+maxmad64bis@users.noreply.github.com> Date: Sat, 22 Aug 2026 01:55:07 +0200 Subject: [PATCH] fix(providers): route Muse Spark to the Responses API on opencode-zen too (#11049) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ⭐5 — Muse Spark responde só na Responses API; #10874 corrigiu só o provider `opencode`, mas `opencode-zen` (faltava targetFormat em 2 entries) e `opencode-go` (6 entries effort-tier) nunca receberam. Espelha a declaração. freebuff NÃO tocado (backend codebuff.com /chat/completions distinto, verificado). TDD 2/2 + 18/18 irmãos. Fecha #11048. Base-red #9985 inherited. --- .../providers/registry/opencode/go/index.ts | 6 +++ .../providers/registry/opencode/zen/index.ts | 20 ++++++++- ...-zen-muse-spark-targetformat-11046.test.ts | 43 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 tests/unit/opencode-zen-muse-spark-targetformat-11046.test.ts diff --git a/open-sse/config/providers/registry/opencode/go/index.ts b/open-sse/config/providers/registry/opencode/go/index.ts index bf0c94ed90..e0ab4a05f5 100644 --- a/open-sse/config/providers/registry/opencode/go/index.ts +++ b/open-sse/config/providers/registry/opencode/go/index.ts @@ -138,6 +138,7 @@ export const opencode_goProvider: RegistryEntry = { supportsVision: true, supportsAudio: true, supportsVideo: true, + targetFormat: "openai-responses", }, { id: "muse-spark-1.2-contributor-minimal", @@ -148,6 +149,7 @@ export const opencode_goProvider: RegistryEntry = { supportsVision: true, supportsAudio: true, supportsVideo: true, + targetFormat: "openai-responses", }, { id: "muse-spark-1.2-contributor-low", @@ -158,6 +160,7 @@ export const opencode_goProvider: RegistryEntry = { supportsVision: true, supportsAudio: true, supportsVideo: true, + targetFormat: "openai-responses", }, { id: "muse-spark-1.2-contributor-medium", @@ -168,6 +171,7 @@ export const opencode_goProvider: RegistryEntry = { supportsVision: true, supportsAudio: true, supportsVideo: true, + targetFormat: "openai-responses", }, { id: "muse-spark-1.2-contributor-high", @@ -178,6 +182,7 @@ export const opencode_goProvider: RegistryEntry = { supportsVision: true, supportsAudio: true, supportsVideo: true, + targetFormat: "openai-responses", }, { id: "muse-spark-1.2-contributor-xhigh", @@ -188,6 +193,7 @@ export const opencode_goProvider: RegistryEntry = { supportsVision: true, supportsAudio: true, supportsVideo: true, + targetFormat: "openai-responses", }, // #8353: Grok 4.5 + effort tiers from the OpenCode Go registry. { id: "grok-4.5", name: "Grok 4.5", supportsReasoning: true }, diff --git a/open-sse/config/providers/registry/opencode/zen/index.ts b/open-sse/config/providers/registry/opencode/zen/index.ts index 73da9c5dc5..fb53b90a62 100644 --- a/open-sse/config/providers/registry/opencode/zen/index.ts +++ b/open-sse/config/providers/registry/opencode/zen/index.ts @@ -51,7 +51,25 @@ export const opencode_zenProvider: RegistryEntry = { { id: "grok-4.6", name: "Grok 4.6" }, // ── Muse ─────────────────────────────────────────────────── - { id: "muse-spark-1.2", name: "Muse Spark 1.2" }, + // Muse Spark is served by OpenCode Zen only on the OpenAI Responses API + // endpoint, not /chat/completions (see the opencode provider's own + // muse-spark entries, #10874/#10867) — this provider is a separate + // registry entry for the same upstream and never got the same + // targetFormat declaration, so requests routed here still hit + // /chat/completions with a mismatched or unanswerable body and the + // upstream returns an empty message. + { + id: "muse-spark-1.2", + name: "Muse Spark 1.2", + supportsReasoning: true, + targetFormat: "openai-responses", + }, + { + id: "muse-spark-1.2-contributor-free", + name: "Muse Spark 1.2 Contributor Free", + supportsReasoning: true, + targetFormat: "openai-responses", + }, // ── DeepSeek ──────────────────────────────────────────────── { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro" }, diff --git a/tests/unit/opencode-zen-muse-spark-targetformat-11046.test.ts b/tests/unit/opencode-zen-muse-spark-targetformat-11046.test.ts new file mode 100644 index 0000000000..300cebfb55 --- /dev/null +++ b/tests/unit/opencode-zen-muse-spark-targetformat-11046.test.ts @@ -0,0 +1,43 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { opencode_zenProvider } from "../../open-sse/config/providers/registry/opencode/zen/index.ts"; +import { opencode_goProvider } from "../../open-sse/config/providers/registry/opencode/go/index.ts"; + +// opencode-zen and opencode-go both serve the same upstream family +// (opencode.ai/zen/*) as the opencode provider for Muse Spark, but neither +// got the targetFormat:"openai-responses" declaration that #10874 added to +// the opencode provider's entries — so requests routed to either still hit +// /chat/completions and the upstream returns an empty message. +test("muse-spark-1.2 and muse-spark-1.2-contributor-free route to the Responses API on opencode-zen too", () => { + for (const id of ["muse-spark-1.2", "muse-spark-1.2-contributor-free"]) { + const model = opencode_zenProvider.models.find((m) => m.id === id); + assert.ok(model, `${id} should be registered in the opencode-zen provider`); + assert.equal( + model?.targetFormat, + "openai-responses", + `${id} must target the Responses API, not the default chat/completions pass-through` + ); + assert.equal(model?.supportsReasoning, true); + } +}); + +test("all muse-spark-1.2-contributor effort-tier entries route to the Responses API on opencode-go too", () => { + const ids = [ + "muse-spark-1.2-contributor", + "muse-spark-1.2-contributor-minimal", + "muse-spark-1.2-contributor-low", + "muse-spark-1.2-contributor-medium", + "muse-spark-1.2-contributor-high", + "muse-spark-1.2-contributor-xhigh", + ]; + for (const id of ids) { + const model = opencode_goProvider.models.find((m) => m.id === id); + assert.ok(model, `${id} should be registered in the opencode-go provider`); + assert.equal( + model?.targetFormat, + "openai-responses", + `${id} must target the Responses API, not the default chat/completions pass-through` + ); + } +});