From a815be6a20a12e6fb9f0a6118db3045cad5b4079 Mon Sep 17 00:00:00 2001 From: DhanushSantosh Date: Fri, 9 Jan 2026 00:45:31 +0530 Subject: [PATCH] fix: update model resolver for codex- prefix and fix thinking/reasoning separation - Add codex- prefix support in model resolver - Fix modelSupportsThinking() to properly detect provider types - Update CODEX_MODEL_PREFIXES to include codex- prefix --- apps/ui/src/lib/utils.ts | 30 +++++++++++++++++++++-------- libs/model-resolver/src/resolver.ts | 11 ++++++++--- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/apps/ui/src/lib/utils.ts b/apps/ui/src/lib/utils.ts index cd04b3ed..e96d587c 100644 --- a/apps/ui/src/lib/utils.ts +++ b/apps/ui/src/lib/utils.ts @@ -10,12 +10,27 @@ export function cn(...inputs: ClassValue[]) { /** * Determine if the current model supports extended thinking controls * Note: This is for Claude's "thinking levels" only, not Codex's "reasoning effort" + * + * Rules: + * - Claude models: support thinking (sonnet-4.5-thinking, opus-4.5-thinking, etc.) + * - Cursor models: NO thinking controls (handled internally by Cursor CLI) + * - Codex models: NO thinking controls (they use reasoningEffort instead) */ export function modelSupportsThinking(_model?: ModelAlias | string): boolean { if (!_model) return true; - // Codex models don't support Claude thinking levels - they use reasoning effort instead - if (_model.startsWith('gpt-') && _model in CODEX_MODEL_CONFIG_MAP) { + // Cursor models - don't show thinking controls + if (_model.startsWith('cursor-')) { + return false; + } + + // Codex models - use reasoningEffort, not thinkingLevel + if (_model.startsWith('codex-')) { + return false; + } + + // Bare gpt- models (legacy) - assume Codex, no thinking controls + if (_model.startsWith('gpt-')) { return false; } @@ -35,13 +50,12 @@ export function getProviderFromModel(model?: string): ModelProvider { return 'cursor'; } - // Check for Codex/OpenAI models (gpt- prefix or o-series) - const CODEX_MODEL_PREFIXES = ['gpt-']; - const OPENAI_O_SERIES_PATTERN = /^o\d/; + // Check for Codex/OpenAI models (codex- prefix, gpt- prefix, or o-series) if ( - CODEX_MODEL_PREFIXES.some((prefix) => model.startsWith(prefix)) || - OPENAI_O_SERIES_PATTERN.test(model) || - model.startsWith('codex:') + model.startsWith('codex-') || + model.startsWith('codex:') || + model.startsWith('gpt-') || + /^o\d/.test(model) ) { return 'codex'; } diff --git a/libs/model-resolver/src/resolver.ts b/libs/model-resolver/src/resolver.ts index 2bcd9714..96848f57 100644 --- a/libs/model-resolver/src/resolver.ts +++ b/libs/model-resolver/src/resolver.ts @@ -21,7 +21,7 @@ import { } from '@automaker/types'; // Pattern definitions for Codex/OpenAI models -const CODEX_MODEL_PREFIXES = ['gpt-']; +const CODEX_MODEL_PREFIXES = ['codex-', 'gpt-']; const OPENAI_O_SERIES_PATTERN = /^o\d/; const OPENAI_O_SERIES_ALLOWED_MODELS = new Set(); @@ -62,6 +62,12 @@ export function resolveModelString( return modelKey; } + // Codex model with explicit prefix (e.g., "codex-gpt-5.1-codex-max") - pass through unchanged + if (modelKey.startsWith(PROVIDER_PREFIXES.codex)) { + console.log(`[ModelResolver] Using Codex model: ${modelKey}`); + return modelKey; + } + // Full Claude model string - pass through unchanged if (modelKey.includes('claude-')) { console.log(`[ModelResolver] Using full Claude model string: ${modelKey}`); @@ -75,8 +81,7 @@ export function resolveModelString( return resolved; } - // OpenAI/Codex models - check BEFORE bare Cursor models since they overlap - // (Cursor supports gpt models, but bare "gpt-*" should route to Codex) + // OpenAI/Codex models - check for codex- or gpt- prefix if ( CODEX_MODEL_PREFIXES.some((prefix) => modelKey.startsWith(prefix)) || (OPENAI_O_SERIES_PATTERN.test(modelKey) && OPENAI_O_SERIES_ALLOWED_MODELS.has(modelKey))