Merge PR #8980: fix(catalog): route opencode-go muse-spark to responses api (@roboomp)

This commit is contained in:
can1357
2026-08-19 11:52:54 +02:00
3 changed files with 25 additions and 0 deletions
+1
View File
@@ -16,6 +16,7 @@
- Fixed SuperGrok (`xai-oauth`) Grok 4.6 hiding the thinking-level picker: the Responses effort-capable allowlist now includes `grok-4.6`, so `/model` can select the documented `low`/`medium`/`high`/`xhigh` ladder (`max` is rejected by api.x.ai).
- Marked CoreWeave runtime discovery as authoritative so stale bundled model ids that the endpoint no longer serves stop appearing as selectable models.
- ChatGPT Codex discovery that advertises only worker `-wm` SKUs now also registers the plain model route, so a configured `openai-codex/<model>` keeps resolving instead of fuzzy-falling-back to the `-wm` SKU some accounts reject.
- Fixed `opencode-go/muse-spark-1.2` (and `muse-spark-1.2-contributor`) failing every tool-call turn with `OpenAI completions stream closed before a finish_reason was received`. The Go gateway serves these ids only at `/zen/go/v1/responses`, but the `/zen/go/v1/models` discovery omits the `provider.npm` hint, so the resolver fell through to `openai-completions`; both ids are now pinned to `openai-responses` like `deepseek-v4-flash` ([#8957](https://github.com/can1357/oh-my-pi/issues/8957)).
## [17.3.6] - 2026-08-17
@@ -5715,8 +5715,17 @@ const OPENCODE_ZEN_API_RESOLUTION = createOpenCodeApiResolution("https://opencod
// /zen/go/v1/chat/completions route does not work for this model while
// /zen/go/v1/responses does (user-verified against the live gateway,
// 2026-08-08; Flash only — deepseek-v4-pro serves fine on chat completions).
//
// muse-spark-1.2 / muse-spark-1.2-contributor are the same inverse case: the
// Go gateway's /zen/go/v1/models discovery drops the `provider.npm` hint, so
// without an override they fall through to openai-completions even though the
// gateway only serves them at /zen/go/v1/responses (@ai-sdk/openai per
// https://opencode.ai/docs/go/#endpoints). The completions parser then closes
// the stream with no finish_reason on every tool-call turn (#8957).
const OPENCODE_GO_API_RESOLUTION = createOpenCodeApiResolution("https://opencode.ai/zen/go", {
"deepseek-v4-flash": "openai-responses",
"muse-spark-1.2": "openai-responses",
"muse-spark-1.2-contributor": "openai-responses",
"minimax-m2.7": "openai-completions",
"minimax-m3": "openai-completions",
"minimax-m3-free": "openai-completions",
@@ -54,6 +54,21 @@ describe("OpenCode provider discovery", () => {
});
});
test("routes opencode-go muse-spark-1.2 to the responses API (#8957)", () => {
const descriptor = MODELS_DEV_PROVIDER_DESCRIPTORS.find(item => item.providerId === "opencode-go");
// The Go /zen/go/v1/models discovery drops the provider.npm hint for the
// muse-spark ids, so without an override they fall through to
// openai-completions even though the gateway only serves them at
// /zen/go/v1/responses. Sending completions requests closes the stream
// with no finish_reason on every tool-call turn.
for (const id of ["muse-spark-1.2", "muse-spark-1.2-contributor"]) {
expect(descriptor?.resolveApi?.(id, { tool_call: true })).toEqual({
api: "openai-responses",
baseUrl: "https://opencode.ai/zen/go/v1",
});
}
});
test("replaces stale bundled Zen models with each credential's live endpoint list", async () => {
const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "pi-catalog-opencode-zen-"));
try {