fix(providers): route opencode-go/gpt-5.6-luna to /responses (#12196) (#13275)

Merged as part of the 39-PR owner batch of 2026-09-11, validated as a unit.

Boarded into one consolidated worktree cut from `release/v3.8.51` with the other 38 — zero conflicts between them.

- ESLint over every changed file: no errors (the only finding was one suppression entry the batch emptied, pruned on #13243)
- `typecheck:core` clean; `check:dashboard-typecheck` OK (206 pre-existing, within baseline); `check:changelog-integrity` OK
- complexity 2821 / baseline 3218 and cognitive-complexity 1272 / baseline 1437 — both under baseline
- 256 assertions green: 246 under node:test and 10 under vitest, which is where `tests/unit/**/*.test.tsx` actually runs
- `check-file-size`: `chatCore.ts` rebaselined 6144 → 6146 for #13278 and #13276, annotated and landed on #13243

⚠️ base-red inherited: #12732 — the provider count (356 in the docs vs the 358 the modules define) and `open-sse/utils/stream.ts` at 3115 > frozen 3098 both reproduce on the pure tip with zero contribution from this batch.
This commit is contained in:
Diego Rodrigues de Sa e Souza
2026-09-11 22:06:06 -03:00
committed by GitHub
parent 8751f111b2
commit 0569f420be
3 changed files with 44 additions and 0 deletions

View File

@@ -0,0 +1 @@
- fix(providers): route opencode-go/gpt-5.6-luna to /responses instead of /chat/completions (#12196)

View File

@@ -250,6 +250,16 @@ export const opencode_goProvider: RegistryEntry = {
supportedThinkingEfforts: ["none", "low", "high", "max"],
targetFormat: "openai-responses",
},
// #12196: the Go upstream serves this model only on /responses —
// /chat/completions 500s for it. github already declares the same model
// id with targetFormat:"openai-responses" (see github/index.ts).
{
id: "gpt-5.6-luna",
name: "GPT-5.6 Luna",
supportsReasoning: true,
targetFormat: "openai-responses",
maxOutputTokens: 128000,
},
// Console Go free GLM-tier model (live-verified 2026-08-23): the upstream
// rejects every reasoning_effort outside {low, high, max} whenever tools
// are present — "[1210] This model always engages in thinking and cannot

View File

@@ -0,0 +1,33 @@
import assert from "node:assert/strict";
import { test } from "node:test";
import { resolveOpencodeTargetFormat } from "../../open-sse/executors/opencode.ts";
// Issue #12196: opencode-go/gpt-5.6-luna is served by the Go upstream ONLY on
// /responses — /chat/completions 500s for this model. The github provider
// already declares targetFormat:"openai-responses" for the same model id, and
// opencode-go already does the same for deepseek-v4-pro/deepseek-v4-flash on
// this exact provider — but gpt-5.6-luna itself is missing from the
// opencode-go registry, so getModelTargetFormat() falls through to null and
// resolveOpencodeTargetFormat() defaults to "openai", which makes
// OpencodeExecutor.buildUrl() post to /chat/completions instead of /responses.
test("opencode-go/gpt-5.6-luna must resolve to the openai-responses target format", () => {
const resolved = resolveOpencodeTargetFormat("opencode-go", "gpt-5.6-luna");
assert.equal(
resolved,
"openai-responses",
"opencode-go/gpt-5.6-luna resolved to '" +
resolved +
"' instead of 'openai-responses' — OpencodeExecutor.buildUrl() will post to " +
"/chat/completions, which the Go upstream 500s on for this model (issue #12196)"
);
});
// Control: the sibling deepseek-v4-flash entry on the SAME opencode-go
// provider already declares targetFormat:"openai-responses" and must keep
// working — proves the assertion above isn't failing for an unrelated reason
// (e.g. a broken import or alias resolution).
test("control: opencode-go/deepseek-v4-flash already resolves to openai-responses", () => {
const resolved = resolveOpencodeTargetFormat("opencode-go", "deepseek-v4-flash");
assert.equal(resolved, "openai-responses");
});