From 304789620b670bed53a7d5987ac191e4098db593 Mon Sep 17 00:00:00 2001 From: weishu Date: Tue, 24 Mar 2026 12:04:47 +0800 Subject: [PATCH] Fix reason effort setting not working. close #346, close #333 --- cli/src/codex/appServerTypes.ts | 2 +- cli/src/codex/loop.ts | 3 ++- cli/src/codex/runCodex.ts | 9 ++++++--- cli/src/codex/utils/appServerConfig.test.ts | 16 ++++++++++++++-- cli/src/codex/utils/appServerConfig.ts | 1 + cli/src/commands/codex.ts | 19 +++++++++++++++++-- 6 files changed, 41 insertions(+), 9 deletions(-) diff --git a/cli/src/codex/appServerTypes.ts b/cli/src/codex/appServerTypes.ts index acc1b951..fdb7fcf6 100644 --- a/cli/src/codex/appServerTypes.ts +++ b/cli/src/codex/appServerTypes.ts @@ -101,7 +101,7 @@ export type SandboxPolicy = excludeSlashTmp?: boolean; }; -export type ReasoningEffort = 'low' | 'medium' | 'high' | 'auto'; +export type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh'; export type ReasoningSummary = 'auto' | 'none' | 'brief' | 'detailed'; export type CollaborationMode = { diff --git a/cli/src/codex/loop.ts b/cli/src/codex/loop.ts index 5860d0c0..013fd07c 100644 --- a/cli/src/codex/loop.ts +++ b/cli/src/codex/loop.ts @@ -6,6 +6,7 @@ import { codexLocalLauncher } from './codexLocalLauncher'; import { codexRemoteLauncher } from './codexRemoteLauncher'; import { ApiClient, ApiSessionClient } from '@/lib'; import type { CodexCliOverrides } from './utils/codexCliOverrides'; +import type { ReasoningEffort } from './appServerTypes'; import type { CodexCollaborationMode, CodexPermissionMode } from '@hapi/protocol/types'; export type PermissionMode = CodexPermissionMode; @@ -14,7 +15,7 @@ export interface EnhancedMode { permissionMode: PermissionMode; model?: string; collaborationMode: CodexCollaborationMode; - modelReasoningEffort?: string; + modelReasoningEffort?: ReasoningEffort; } interface LoopOptions { diff --git a/cli/src/codex/runCodex.ts b/cli/src/codex/runCodex.ts index 3708159e..d94286a1 100644 --- a/cli/src/codex/runCodex.ts +++ b/cli/src/codex/runCodex.ts @@ -12,6 +12,7 @@ import { isPermissionModeAllowedForFlavor } from '@hapi/protocol'; import { CodexCollaborationModeSchema, PermissionModeSchema } from '@hapi/protocol/schemas'; import { formatMessageWithAttachments } from '@/utils/attachmentFormatter'; import { getInvokedCwd } from '@/utils/invokedCwd'; +import type { ReasoningEffort } from './appServerTypes'; export { emitReadyIfIdle } from './utils/emitReadyIfIdle'; @@ -21,7 +22,7 @@ export async function runCodex(opts: { permissionMode?: PermissionMode; resumeSessionId?: string; model?: string; - modelReasoningEffort?: string; + modelReasoningEffort?: ReasoningEffort; }): Promise { const workingDirectory = getInvokedCwd(); const startedBy = opts.startedBy ?? 'terminal'; @@ -81,7 +82,8 @@ export async function runCodex(opts: { sessionInstance.setCollaborationMode(currentCollaborationMode); logger.debug( `[Codex] Synced session config for keepalive: ` + - `permissionMode=${currentPermissionMode}, model=${currentModel ?? 'auto'}, collaborationMode=${currentCollaborationMode}` + `permissionMode=${currentPermissionMode}, model=${currentModel ?? 'auto'}, ` + + `modelReasoningEffort=${currentModelReasoningEffort ?? 'default'}, collaborationMode=${currentCollaborationMode}` ); }; @@ -102,7 +104,8 @@ export async function runCodex(opts: { const messagePermissionMode = currentPermissionMode; logger.debug( `[Codex] User message received with permission mode: ${currentPermissionMode}, ` + - `model: ${currentModel ?? 'auto'}, collaborationMode: ${currentCollaborationMode}` + `model: ${currentModel ?? 'auto'}, modelReasoningEffort: ${currentModelReasoningEffort ?? 'default'}, ` + + `collaborationMode: ${currentCollaborationMode}` ); const enhancedMode: EnhancedMode = { diff --git a/cli/src/codex/utils/appServerConfig.test.ts b/cli/src/codex/utils/appServerConfig.test.ts index f135a1ba..0951b413 100644 --- a/cli/src/codex/utils/appServerConfig.test.ts +++ b/cli/src/codex/utils/appServerConfig.test.ts @@ -102,7 +102,12 @@ describe('appServerConfig', () => { threadId: 'thread-1', message: 'hello', cwd: '/workspace/project', - mode: { permissionMode: 'read-only', model: 'o3', collaborationMode: 'default' } + mode: { + permissionMode: 'read-only', + model: 'o3', + modelReasoningEffort: 'high', + collaborationMode: 'default' + } }); expect(params.threadId).toBe('thread-1'); @@ -114,6 +119,7 @@ describe('appServerConfig', () => { mode: 'default', settings: { model: 'o3', + reasoning_effort: 'high', developer_instructions: codexSystemPrompt } }); @@ -125,13 +131,19 @@ describe('appServerConfig', () => { threadId: 'thread-1', message: 'hello', cwd: '/workspace/project', - mode: { permissionMode: 'default', model: 'o3', collaborationMode: 'plan' } + mode: { + permissionMode: 'default', + model: 'o3', + modelReasoningEffort: 'high', + collaborationMode: 'plan' + } }); expect(params.collaborationMode).toEqual({ mode: 'plan', settings: { model: 'o3', + reasoning_effort: 'high', developer_instructions: codexSystemPrompt } }); diff --git a/cli/src/codex/utils/appServerConfig.ts b/cli/src/codex/utils/appServerConfig.ts index 4529bd60..12565909 100644 --- a/cli/src/codex/utils/appServerConfig.ts +++ b/cli/src/codex/utils/appServerConfig.ts @@ -152,6 +152,7 @@ export function buildTurnStartParams(args: { mode: collaborationMode, settings: { model, + ...(args.mode?.modelReasoningEffort ? { reasoning_effort: args.mode.modelReasoningEffort } : {}), developer_instructions: developerInstructions } }; diff --git a/cli/src/commands/codex.ts b/cli/src/commands/codex.ts index 0848c85f..f5273063 100644 --- a/cli/src/commands/codex.ts +++ b/cli/src/commands/codex.ts @@ -4,6 +4,21 @@ import { initializeToken } from '@/ui/tokenInit' import { maybeAutoStartServer } from '@/utils/autoStartServer' import type { CommandDefinition } from './types' import type { CodexPermissionMode } from '@hapi/protocol/types' +import type { ReasoningEffort } from '@/codex/appServerTypes' + +function parseReasoningEffort(value: string): ReasoningEffort { + switch (value) { + case 'none': + case 'minimal': + case 'low': + case 'medium': + case 'high': + case 'xhigh': + return value + default: + throw new Error('Invalid --model-reasoning-effort value') + } +} export const codexCommand: CommandDefinition = { name: 'codex', @@ -18,7 +33,7 @@ export const codexCommand: CommandDefinition = { permissionMode?: CodexPermissionMode resumeSessionId?: string model?: string - modelReasoningEffort?: string + modelReasoningEffort?: ReasoningEffort } = {} const unknownArgs: string[] = [] @@ -50,7 +65,7 @@ export const codexCommand: CommandDefinition = { if (!effort) { throw new Error('Missing --model-reasoning-effort value') } - options.modelReasoningEffort = effort + options.modelReasoningEffort = parseReasoningEffort(effort) } else { unknownArgs.push(arg) }