From f74dbd60804d263e52a105064f795eb3246b4af5 Mon Sep 17 00:00:00 2001 From: Charles Packer Date: Tue, 17 Feb 2026 23:19:28 -0800 Subject: [PATCH] fix: align codex plus-pro routing and gpt-5.3-codex defaults (#1009) --- src/models.json | 10 +++++----- src/tests/cli/subagentDisplay.test.ts | 2 +- .../tools/model-provider-detection.test.ts | 20 +++++++++++++++++++ src/tools/manager.ts | 14 ++++++++++--- 4 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 src/tests/tools/model-provider-detection.test.ts diff --git a/src/models.json b/src/models.json index f1a33a4..c29708d 100644 --- a/src/models.json +++ b/src/models.json @@ -193,7 +193,7 @@ "description": "GPT-5.3 Codex (no reasoning) via ChatGPT Plus/Pro", "updateArgs": { "reasoning_effort": "none", - "verbosity": "medium", + "verbosity": "low", "context_window": 272000, "max_output_tokens": 128000 } @@ -205,7 +205,7 @@ "description": "GPT-5.3 Codex (low reasoning) via ChatGPT Plus/Pro", "updateArgs": { "reasoning_effort": "low", - "verbosity": "medium", + "verbosity": "low", "context_window": 272000, "max_output_tokens": 128000 } @@ -217,7 +217,7 @@ "description": "GPT-5.3 Codex (med reasoning) via ChatGPT Plus/Pro", "updateArgs": { "reasoning_effort": "medium", - "verbosity": "medium", + "verbosity": "low", "context_window": 272000, "max_output_tokens": 128000 } @@ -230,7 +230,7 @@ "isFeatured": true, "updateArgs": { "reasoning_effort": "high", - "verbosity": "medium", + "verbosity": "low", "context_window": 272000, "max_output_tokens": 128000 } @@ -242,7 +242,7 @@ "description": "GPT-5.3 Codex (max reasoning) via ChatGPT Plus/Pro", "updateArgs": { "reasoning_effort": "xhigh", - "verbosity": "medium", + "verbosity": "low", "context_window": 272000, "max_output_tokens": 128000 } diff --git a/src/tests/cli/subagentDisplay.test.ts b/src/tests/cli/subagentDisplay.test.ts index 466f739..05bafb9 100644 --- a/src/tests/cli/subagentDisplay.test.ts +++ b/src/tests/cli/subagentDisplay.test.ts @@ -27,7 +27,7 @@ describe("getSubagentModelDisplay", () => { "lc-anthropic/claude-haiku-4-5-20251001", ); expect(display).toEqual({ - label: "claude-haiku-4-5-20251001", + label: "Haiku 4.5", isByokProvider: true, isOpenAICodexProvider: false, }); diff --git a/src/tests/tools/model-provider-detection.test.ts b/src/tests/tools/model-provider-detection.test.ts new file mode 100644 index 0000000..486dcd6 --- /dev/null +++ b/src/tests/tools/model-provider-detection.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, test } from "bun:test"; +import { isOpenAIModel } from "../../tools/manager"; + +describe("isOpenAIModel", () => { + test("detects openai handles", () => { + expect(isOpenAIModel("openai/gpt-5.2-codex")).toBe(true); + }); + + test("detects chatgpt-plus-pro handles", () => { + expect(isOpenAIModel("chatgpt-plus-pro/gpt-5.3-codex")).toBe(true); + }); + + test("detects chatgpt-plus-pro model ids via models.json metadata", () => { + expect(isOpenAIModel("gpt-5.3-codex-plus-pro-high")).toBe(true); + }); + + test("does not detect anthropic handles", () => { + expect(isOpenAIModel("anthropic/claude-sonnet-4-6")).toBe(false); + }); +}); diff --git a/src/tools/manager.ts b/src/tools/manager.ts index 81fb955..628f2bf 100644 --- a/src/tools/manager.ts +++ b/src/tools/manager.ts @@ -7,6 +7,7 @@ import { runPostToolUseHooks, runPreToolUseHooks, } from "../hooks"; +import { OPENAI_CODEX_PROVIDER_NAME } from "../providers/openai-codex-provider"; import { telemetry } from "../telemetry"; import { debugLog } from "../utils/debug"; import { TOOL_DEFINITIONS, type ToolName } from "./toolDefinitions"; @@ -805,10 +806,17 @@ export async function loadTools(modelIdentifier?: string): Promise { export function isOpenAIModel(modelIdentifier: string): boolean { const info = getModelInfo(modelIdentifier); if (info?.handle && typeof info.handle === "string") { - return info.handle.startsWith("openai/"); + return ( + info.handle.startsWith("openai/") || + info.handle.startsWith(`${OPENAI_CODEX_PROVIDER_NAME}/`) + ); } - // Fallback: treat raw handle-style identifiers as OpenAI if they start with openai/ - return modelIdentifier.startsWith("openai/"); + // Fallback: treat raw handle-style identifiers as OpenAI for openai/* + // and ChatGPT OAuth Codex provider handles. + return ( + modelIdentifier.startsWith("openai/") || + modelIdentifier.startsWith(`${OPENAI_CODEX_PROVIDER_NAME}/`) + ); } export function isGeminiModel(modelIdentifier: string): boolean {