From 4d89b290287f18928fb8ea395750cc02be2c04f7 Mon Sep 17 00:00:00 2001 From: roboomp Date: Wed, 15 Jul 2026 20:13:11 +0000 Subject: [PATCH] fix(catalog): routed copilot mai-code models to responses api GitHub Copilot's mai-code-1-flash-picker (and other mai-* models) are served only through the /responses endpoint; the classifier routed them to /chat/completions, which returned 400 unsupported_api_for_model. Added the mai- prefix to isCopilotResponsesModelId so both dynamic discovery (inferCopilotApi) and bundled resolution (COPILOT_API_RESOLUTION_RULES) select openai-responses, and updated the bundled models.json entry to match. Fixes #5612 --- packages/catalog/CHANGELOG.md | 4 ++++ packages/catalog/src/models.json | 7 +------ .../catalog/src/provider-models/openai-compat.ts | 2 +- .../test/github-copilot-model-limits.test.ts | 16 ++++++++++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/catalog/CHANGELOG.md b/packages/catalog/CHANGELOG.md index 7124fdc93..53a5bb5de 100644 --- a/packages/catalog/CHANGELOG.md +++ b/packages/catalog/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed GitHub Copilot `mai-code-1-flash-picker` (and other `mai-*` models) to route through the `/responses` endpoint instead of `/chat/completions`, which rejected them with `400 unsupported_api_for_model` ([#5612](https://github.com/can1357/oh-my-pi/issues/5612)). + ## [16.5.2] - 2026-07-14 ### Fixed diff --git a/packages/catalog/src/models.json b/packages/catalog/src/models.json index c7fdd1695..acc14ac00 100644 --- a/packages/catalog/src/models.json +++ b/packages/catalog/src/models.json @@ -19406,7 +19406,7 @@ "mai-code-1-flash-picker": { "id": "mai-code-1-flash-picker", "name": "MAI-Code-1-Flash", - "api": "openai-completions", + "api": "openai-responses", "provider": "github-copilot", "baseUrl": "https://api.githubcopilot.com", "reasoning": true, @@ -19425,11 +19425,6 @@ "User-Agent": "opencode/1.3.15", "X-GitHub-Api-Version": "2026-06-01" }, - "compat": { - "supportsStore": false, - "supportsDeveloperRole": false, - "supportsReasoningEffort": false - }, "thinking": { "mode": "effort", "efforts": [ diff --git a/packages/catalog/src/provider-models/openai-compat.ts b/packages/catalog/src/provider-models/openai-compat.ts index f358bf4e5..5215372fd 100644 --- a/packages/catalog/src/provider-models/openai-compat.ts +++ b/packages/catalog/src/provider-models/openai-compat.ts @@ -3724,7 +3724,7 @@ export interface GithubCopilotModelManagerConfig { const COPILOT_ANTHROPIC_MODEL_PATTERN = /^claude-(haiku|sonnet|opus|fable|mythos)-\d/; const isCopilotResponsesModelId = (modelId: string): boolean => - modelId.startsWith("gpt-5") || modelId.startsWith("oswe"); + modelId.startsWith("gpt-5") || modelId.startsWith("oswe") || modelId.startsWith("mai-"); 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 c21802a5d..283509603 100644 --- a/packages/catalog/test/github-copilot-model-limits.test.ts +++ b/packages/catalog/test/github-copilot-model-limits.test.ts @@ -303,6 +303,22 @@ describe("github copilot model limits mapping", () => { // not the OpenAI global reference (1050k). expect(model?.contextWindow).toBe(272_000); }); + it("routes mai-code models to the openai-responses endpoint (#5612)", async () => { + // Copilot's /chat/completions rejects mai-* models with + // `unsupported_api_for_model` (400); they are served only via /responses. + const { models } = await discoverCopilotModels({ + data: [ + { + id: "mai-code-1-flash-picker", + name: "MAI-Code-1-Flash", + }, + ], + }); + + const model = models.find(candidate => candidate.id === "mai-code-1-flash-picker"); + expect(model).toBeDefined(); + expect(model?.api).toBe("openai-responses"); + }); }); /**