From 9c466d9861a6371089ada7729d87bbd954e6aa48 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Mon, 14 Sep 2026 14:49:20 -0700 Subject: [PATCH 1/2] fix(providers): Baseten routed rows must not advertise text.verbosity Baseten documents its Model APIs as Chat Completions compatible. `text.verbosity` is an OpenAI Responses parameter, so there is nothing on that wire for it to become, but the Baseten registry entry carried no opt-out and every routed row serialized support_verbosity: true with default_verbosity: "low". Codex seeds its picker from that and sends text.verbosity on the turn. Provider-wide rather than per-model, matching the xAI and Ollama opt-outs: Baseten's catalog is live-discovered, so a slug that arrives later supports it no more than the seeded ones do. Closes #4630 --- src/providers/registry/entries-extended.ts | 7 ++++++ .../catalog-verbosity-default.test.ts | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/providers/registry/entries-extended.ts b/src/providers/registry/entries-extended.ts index 2a92a9b832..5cea61a84f 100644 --- a/src/providers/registry/entries-extended.ts +++ b/src/providers/registry/entries-extended.ts @@ -110,6 +110,13 @@ export const PROVIDER_REGISTRY_EXTENDED: readonly ProviderRegistryEntry[] = [ // Baseten says models outside its reasoning table do not support reasoning. Keep // unknown/new live slugs conservative until an official-docs registry refresh proves it. reasoningEfforts: [], + // `text.verbosity` is an OpenAI Responses parameter. Baseten documents its Model + // APIs as Chat Completions compatible, so there is nothing on that wire for it to + // become, and a routed row must not inherit the Codex template's verbosity picker + // (#4630: Codex sent `text: { verbosity: "low" }` and the turn 400'd before any + // model output). Provider-wide rather than per-model because this catalog is live- + // discovered: a slug that arrives tomorrow supports it no more than the seeded ones. + supportsVerbosity: false, modelReasoningEfforts: BASETEN_MODEL_REASONING_EFFORTS, modelReasoningEffortMap: BASETEN_MODEL_REASONING_EFFORT_MAP, modelDefaultReasoningEfforts: BASETEN_MODEL_DEFAULT_REASONING_EFFORTS, diff --git a/tests/codex-integration/catalog-verbosity-default.test.ts b/tests/codex-integration/catalog-verbosity-default.test.ts index 1ed5c8f164..7ca7058ccb 100644 --- a/tests/codex-integration/catalog-verbosity-default.test.ts +++ b/tests/codex-integration/catalog-verbosity-default.test.ts @@ -61,6 +61,30 @@ describe("catalog — default_verbosity is dropped when verbosity is unsupported expect(kiro?.default_verbosity).toBeUndefined(); }); + test("GREEN: a Baseten routed row opts out, defaults included", async () => { + // #4630: Baseten Model APIs are Chat Completions only, so `text.verbosity` + // — a Responses-only parameter — has nowhere to land. Advertising it made + // Codex send `text: { verbosity: "low" }` and the turn 400 before any model + // output. The opt-out is provider-wide because Baseten's catalog is live- + // discovered: a slug that arrives tomorrow supports it no more than this one. + const models = await gatherRoutedModels({ + providers: { + baseten: { + adapter: "openai-chat", + baseUrl: "https://inference.baseten.co/v1", + authMode: "key", + liveModels: false, + models: ["deepseek-ai/DeepSeek-V4.1-Flash"], + }, + }, + }); + const entries = buildCatalogEntries(null, [], models); + const baseten = entries.find(e => e.slug?.startsWith("baseten/")); + + expect(baseten?.support_verbosity).toBe(false); + expect(baseten?.default_verbosity).toBeUndefined(); + }); + test("CONTROL: rows that never declare a capability keep the permissive default", async () => { const models = await gatherRoutedModels({ providers: { From 29996e108d5421d55334d35d23d20535459f9f18 Mon Sep 17 00:00:00 2001 From: Abhishek Sharma Date: Mon, 14 Sep 2026 17:12:12 -0700 Subject: [PATCH 2/2] test(catalog): cover the live-discovered baseten slug, not just the seeded one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The opt-out is provider-wide because baseten is liveModels: true — a per-model pin would leave tomorrow's discovered id advertising the control again. The original case seeded a static model, so that reasoning was a comment rather than something the suite checked. This one seeds no models and lets a stubbed /models response supply the slug. Raised in review of #4660 by @coderabbitai and @lidge-jun. --- .../catalog-verbosity-default.test.ts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/codex-integration/catalog-verbosity-default.test.ts b/tests/codex-integration/catalog-verbosity-default.test.ts index 7ca7058ccb..a3224b5b3c 100644 --- a/tests/codex-integration/catalog-verbosity-default.test.ts +++ b/tests/codex-integration/catalog-verbosity-default.test.ts @@ -85,6 +85,36 @@ describe("catalog — default_verbosity is dropped when verbosity is unsupported expect(baseten?.default_verbosity).toBeUndefined(); }); + test("GREEN: a slug that only live discovery knows about opts out too", async () => { + // The opt-out is provider-wide precisely because baseten is `liveModels: true`: + // a pinned per-model map would leave tomorrow's discovered id advertising the + // control again. Seeding NO static models and letting discovery supply the slug + // is what makes that claim testable rather than a comment (raised in review of + // #4660 by @coderabbitai and @lidge-jun). + globalThis.fetch = (async (input: RequestInfo | URL) => { + if (!String(input).includes("/models")) return new Response(null, { status: 404 }); + return Response.json({ data: [{ id: "deepseek-ai/DeepSeek-V4.1-Flash" }] }); + }) as typeof fetch; + + const models = await gatherRoutedModels({ + providers: { + baseten: { + adapter: "openai-chat", + baseUrl: "https://inference.baseten.co/v1", + authMode: "key", + apiKey: "test-key", + liveModels: true, + }, + }, + }); + const entries = buildCatalogEntries(null, [], models); + const baseten = entries.find(e => e.slug?.startsWith("baseten/")); + + expect(baseten, "live discovery must have produced a routed baseten row").toBeDefined(); + expect(baseten?.support_verbosity).toBe(false); + expect(baseten?.default_verbosity).toBeUndefined(); + }); + test("CONTROL: rows that never declare a capability keep the permissive default", async () => { const models = await gatherRoutedModels({ providers: {