feat: support max reasoning effort and rebuild release

This commit is contained in:
shiyue
2026-08-11 08:11:58 +08:00
parent 70be7eb279
commit e7d28935ef
8 changed files with 107 additions and 12 deletions

View File

@@ -4621,12 +4621,16 @@ function assertMultiAgentV2CompatibilityContract() {
const frontendSource = fs.readFileSync(PUBLIC_APP_PATH, 'utf8');
assert(
/CODEX_REASONING_LEVELS\s*=\s*new Set\(\[[^\]]*'ultra'/.test(serverSource),
'Codex config model parsing should accept the ultra reasoning level'
/CODEX_REASONING_LEVELS\s*=\s*new Set\(\[[^\]]*'max'[^\]]*'ultra'/.test(serverSource),
'Codex config model parsing should accept the max and ultra reasoning levels'
);
assert(
/low\|medium\|high\|xhigh\|ultra/.test(runtimeSource),
'Codex CLI model suffix parsing should accept ultra'
/low\|medium\|high\|xhigh\|max\|ultra/.test(runtimeSource),
'Codex CLI model suffix parsing should accept max and ultra'
);
assert(
frontendSource.includes("{ value: 'max', label: 'max'"),
'Codex model picker should expose max reasoning'
);
assert(
frontendSource.includes("{ value: 'ultra', label: 'ultra'"),
@@ -5665,7 +5669,7 @@ async function main() {
}, null, 2));
createFakeClaudeHistory(homeDir);
createFakeCodexConfig(homeDir, { reasoningEffort: 'ultra' });
createFakeCodexConfig(homeDir, { reasoningEffort: 'max' });
const codexFixture = createFakeCodexHistory(homeDir);
const codexAppImportFixture = createFakeCodexHistory(homeDir, {
threadId: 'codexapp-import-thread',
@@ -5815,7 +5819,7 @@ async function main() {
ws.send(JSON.stringify({ type: 'new_session', agent: 'codex', cwd: codexInitCwd, mode: 'plan' }));
const codexSession = await nextMessage(messages, ws, (msg) => msg.type === 'session_info' && msg.agent === 'codex' && msg.cwd === codexInitCwd);
assert(codexSession.mode === 'plan', 'Codex new_session should follow requested mode');
assert(codexSession.model === 'gpt-5.5(ultra)', 'Codex new_session should preserve ultra from ~/.codex/config.toml');
assert(codexSession.model === 'gpt-5.5(max)', 'Codex new_session should preserve max from ~/.codex/config.toml');
ws.send(JSON.stringify({ type: 'set_session_pinned', sessionId: codexSession.sessionId, pinned: true }));
const pinnedAck = await nextMessage(messages, ws, (msg) => msg.type === 'session_pinned' && msg.sessionId === codexSession.sessionId);
@@ -6441,7 +6445,7 @@ async function main() {
.find((line) => line.includes(`"event":"process_spawn"`) && line.includes(firstMessageSession.sessionId.slice(0, 8)));
assert(spawnLine && !spawnLine.includes('--search') && spawnLine.includes('--image'), 'Codex exec should attach images and not append unsupported --search flag');
const parsedSpawnLine = JSON.parse(spawnLine);
assert(parsedSpawnLine.args.includes('model_reasoning_effort="ultra"'), 'Codex exec should pass the ultra reasoning level through model_reasoning_effort');
assert(parsedSpawnLine.args.includes('model_reasoning_effort="max"'), 'Codex exec should pass the max reasoning level through model_reasoning_effort');
const allSpawnsForSession = processLog
.trim()
@@ -6506,7 +6510,7 @@ async function main() {
].join('\n'));
ws.send(JSON.stringify({ type: 'new_session', agent: 'codexapp', cwd: codexAppCwd, mode: 'yolo' }));
const codexAppSession = await nextMessage(messages, ws, (msg) => msg.type === 'session_info' && msg.agent === 'codexapp' && msg.cwd === codexAppCwd);
assert(codexAppSession.model === 'gpt-5.5(ultra)', 'Codex App new_session should preserve the ultra default Codex model');
assert(codexAppSession.model === 'gpt-5.5(max)', 'Codex App new_session should preserve the max default Codex model');
ws.send(JSON.stringify({ type: 'composer_suggestions', requestId: 'reg-codexapp-skill', trigger: '$', query: 'reg', sessionId: codexAppSession.sessionId, agent: 'codexapp' }));
const codexAppSkillComposer = await nextMessage(messages, ws, (msg) => msg.type === 'composer_suggestions' && msg.requestId === 'reg-codexapp-skill');
@@ -6522,7 +6526,7 @@ async function main() {
assert(/"hasDeveloperInstructions":true/.test(codexAppDefaultCollab.text || ''), 'Codex App collaboration settings should include sub-agent developer instructions');
assert(/"hasSchemaDrivenSubagents":true/.test(codexAppDefaultCollab.text || ''), 'Codex App collaboration settings should use runtime-schema-driven sub-agent guidance');
assert(/"hasLegacyV1Guidance":false/.test(codexAppDefaultCollab.text || ''), 'Codex App collaboration settings should omit legacy V1 fork/wait guidance');
assert(/"reasoningEffort":"ultra"/.test(codexAppDefaultCollab.text || ''), 'Codex App collaboration settings should pass ultra reasoning_effort');
assert(/"reasoningEffort":"max"/.test(codexAppDefaultCollab.text || ''), 'Codex App collaboration settings should pass max reasoning_effort');
assert(/"hasTopLevelModel":false/.test(codexAppDefaultCollab.text || ''), 'Codex App collaboration turn should not duplicate model at top level');
assert(/"hasTopLevelEffort":false/.test(codexAppDefaultCollab.text || ''), 'Codex App collaboration turn should not duplicate effort at top level');
await nextMessage(messages, ws, (msg) => msg.type === 'done' && msg.sessionId === codexAppSession.sessionId);