Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions open-sse/config/providers/registry/opencode/go/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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 },
Expand Down
20 changes: 19 additions & 1 deletion open-sse/config/providers/registry/opencode/zen/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
Expand Down
43 changes: 43 additions & 0 deletions tests/unit/opencode-zen-muse-spark-targetformat-11046.test.ts
Original file line number Diff line number Diff line change
@@ -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`
);
}
});
Loading