diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index 390d0adee..55e2e64aa 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -14,6 +14,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/` keeps resolving instead of fuzzy-falling-back to the `-wm` SKU some accounts reject. +- Fixed GitHub Copilot `grok-4.6` / `grok-4.6-1m` failing with HTTP 400 `unsupported_api_for_model` by routing them through the OpenAI Responses API (`/responses`) instead of `/chat/completions`, matching `grok-4.5`. Stale cached completion routes are invalidated on refresh ([#8807](https://github.com/can1357/oh-my-pi/issues/8807)). ## [17.3.6] - 2026-08-17 diff --git a/packages/catalog/src/models.json b/packages/catalog/src/models.json index e7215b13a..1315b34e8 100644 --- a/packages/catalog/src/models.json +++ b/packages/catalog/src/models.json @@ -24448,7 +24448,7 @@ "grok-4.6": { "id": "grok-4.6", "name": "Grok 4.6", - "api": "openai-completions", + "api": "openai-responses", "provider": "github-copilot", "baseUrl": "https://api.githubcopilot.com", "reasoning": true, @@ -24468,18 +24468,14 @@ "User-Agent": "opencode/1.3.15", "X-GitHub-Api-Version": "2026-06-01" }, - "compat": { - "supportsStore": false, - "supportsDeveloperRole": false, - "supportsReasoningEffort": false - }, "thinking": { "mode": "effort", "efforts": [ "minimal", "low", "medium", - "high" + "high", + "xhigh" ] } }, diff --git a/packages/catalog/src/provider-models/openai-compat.ts b/packages/catalog/src/provider-models/openai-compat.ts index 7fc21a0ab..24bf52b5e 100644 --- a/packages/catalog/src/provider-models/openai-compat.ts +++ b/packages/catalog/src/provider-models/openai-compat.ts @@ -5081,8 +5081,18 @@ export interface GithubCopilotModelManagerConfig { const COPILOT_ANTHROPIC_MODEL_PATTERN = /^claude-(haiku|sonnet|opus|fable|mythos)-\d/; const isCopilotResponsesModelId = (modelId: string): boolean => - modelId === "grok-4.5" || modelId.startsWith("gpt-5") || modelId.startsWith("oswe") || modelId.startsWith("mai-"); -const COPILOT_CACHE_INVALIDATED_MODEL_IDS = ["grok-4.5", "grok-4.5-1m", "mai-code-1-flash-picker"]; + modelId === "grok-4.5" || + modelId === "grok-4.6" || + modelId.startsWith("gpt-5") || + modelId.startsWith("oswe") || + modelId.startsWith("mai-"); +const COPILOT_CACHE_INVALIDATED_MODEL_IDS = [ + "grok-4.5", + "grok-4.5-1m", + "grok-4.6", + "grok-4.6-1m", + "mai-code-1-flash-picker", +]; function inferCopilotApi(modelId: string): Api { if (COPILOT_ANTHROPIC_MODEL_PATTERN.test(modelId)) { diff --git a/packages/catalog/test/github-copilot-model-limits.test.ts b/packages/catalog/test/github-copilot-model-limits.test.ts index b3aff18a2..ad777511f 100644 --- a/packages/catalog/test/github-copilot-model-limits.test.ts +++ b/packages/catalog/test/github-copilot-model-limits.test.ts @@ -390,9 +390,23 @@ describe("github copilot model limits mapping", () => { const model = models.find(candidate => candidate.id === "grok-4.5"); expect(model?.api).toBe("openai-responses"); }); + it("routes grok-4.6 to the openai-responses endpoint (#8807)", async () => { + const { models } = await discoverCopilotModels({ + data: [ + { + id: "grok-4.6", + name: "Grok 4.6", + }, + ], + }); + + const model = models.find(candidate => candidate.id === "grok-4.6"); + expect(model?.api).toBe("openai-responses"); + }); for (const migration of [ { id: "mai-code-1-flash-picker", name: "MAI-Code-1-Flash" }, { id: "grok-4.5", name: "Grok 4.5" }, + { id: "grok-4.6", name: "Grok 4.6" }, ]) { it(`refreshes a cached ${migration.name} completion route after the endpoint migration`, async () => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), `pi-ai-copilot-${migration.id}-cache-`));