From 7b52054ff51d86142996b4d14be982513ba5146d Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Fri, 22 May 2026 20:09:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=A7=A3=E9=99=A4=20max/xhigh=20effort?= =?UTF-8?q?=20=E7=BA=A7=E5=88=AB=E7=9A=84=E6=A8=A1=E5=9E=8B=E7=99=BD?= =?UTF-8?q?=E5=90=8D=E5=8D=95=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/__tests__/effort.test.ts | 58 ++++++++++++++++++++++++++++++ src/utils/effort.ts | 45 +++++------------------ 2 files changed, 66 insertions(+), 37 deletions(-) diff --git a/src/utils/__tests__/effort.test.ts b/src/utils/__tests__/effort.test.ts index ed6658fbf..4424321c6 100644 --- a/src/utils/__tests__/effort.test.ts +++ b/src/utils/__tests__/effort.test.ts @@ -274,3 +274,61 @@ describe('resolvePickerEffortPersistence', () => { expect(result).toBeUndefined() }) }) + +// ─── modelSupportsMaxEffort ──────────────────────────────────────────── + +describe('modelSupportsMaxEffort', () => { + test('returns true for opus-4-7', async () => { + const { modelSupportsMaxEffort } = await import('src/utils/effort.js') + expect(modelSupportsMaxEffort('claude-opus-4-7-20250918')).toBe(true) + }) + + test('returns true for opus-4-6', async () => { + const { modelSupportsMaxEffort } = await import('src/utils/effort.js') + expect(modelSupportsMaxEffort('claude-opus-4-6-20250514')).toBe(true) + }) + + test('returns true for sonnet models', async () => { + const { modelSupportsMaxEffort } = await import('src/utils/effort.js') + expect(modelSupportsMaxEffort('claude-sonnet-4-6-20250514')).toBe(true) + }) + + test('returns true for haiku models', async () => { + const { modelSupportsMaxEffort } = await import('src/utils/effort.js') + expect(modelSupportsMaxEffort('claude-haiku-4-5-20251001')).toBe(true) + }) + + test('returns true for deepseek models', async () => { + const { modelSupportsMaxEffort } = await import('src/utils/effort.js') + expect(modelSupportsMaxEffort('deepseek-v4-pro')).toBe(true) + }) + + test('returns true for unknown models', async () => { + const { modelSupportsMaxEffort } = await import('src/utils/effort.js') + expect(modelSupportsMaxEffort('some-random-model')).toBe(true) + }) +}) + +// ─── modelSupportsXhighEffort ────────────────────────────────────────── + +describe('modelSupportsXhighEffort', () => { + test('returns true for opus-4-7', async () => { + const { modelSupportsXhighEffort } = await import('src/utils/effort.js') + expect(modelSupportsXhighEffort('claude-opus-4-7-20250918')).toBe(true) + }) + + test('returns true for sonnet models', async () => { + const { modelSupportsXhighEffort } = await import('src/utils/effort.js') + expect(modelSupportsXhighEffort('claude-sonnet-4-6-20250514')).toBe(true) + }) + + test('returns true for haiku models', async () => { + const { modelSupportsXhighEffort } = await import('src/utils/effort.js') + expect(modelSupportsXhighEffort('claude-haiku-4-5-20251001')).toBe(true) + }) + + test('returns true for unknown models', async () => { + const { modelSupportsXhighEffort } = await import('src/utils/effort.js') + expect(modelSupportsXhighEffort('some-random-model')).toBe(true) + }) +}) diff --git a/src/utils/effort.ts b/src/utils/effort.ts index 9a7824a86..9d8fe8a0a 100644 --- a/src/utils/effort.ts +++ b/src/utils/effort.ts @@ -67,51 +67,22 @@ export function modelSupportsEffort(model: string): boolean { return getAPIProvider() === 'firstParty' } -// @[MODEL LAUNCH]: Add the new model to the allowlist if it supports 'max' effort. -// Per API docs, 'max' is Opus 4.6/4.7 only for public models — other models return an error. -// However, DeepSeek V4 Pro also supports max effort when using Anthropic-compatible API. -export function modelSupportsMaxEffort(model: string): boolean { - const supported3P = get3PModelCapabilityOverride(model, 'max_effort') +// Effort max/xhigh restrictions removed — all models that support effort +// can now use these levels. API errors are the user's responsibility. +export function modelSupportsMaxEffort(_model: string): boolean { + const supported3P = get3PModelCapabilityOverride(_model, 'max_effort') if (supported3P !== undefined) { return supported3P } - // Support DeepSeek V4 Pro specifically (Anthropic-compatible API) - if (model.toLowerCase().includes('deepseek-v4-pro')) { - return true - } - if ( - model.toLowerCase().includes('opus-4-7') || - model.toLowerCase().includes('opus-4-6') - ) { - return true - } - if (process.env.USER_TYPE === 'ant' && resolveAntModel(model)) { - return true - } - return false + return true } -// @[MODEL LAUNCH]: Add the new model to the allowlist if it supports 'xhigh' effort. -// 'xhigh' was introduced with Opus 4.7 as a level between 'high' and 'max'. -export function modelSupportsXhighEffort(model: string): boolean { - const supported3P = get3PModelCapabilityOverride(model, 'xhigh_effort') +export function modelSupportsXhighEffort(_model: string): boolean { + const supported3P = get3PModelCapabilityOverride(_model, 'xhigh_effort') if (supported3P !== undefined) { return supported3P } - if ( - getAPIProvider() === 'openai' && - isChatGPTAuthMode() && - isChatGPTCodexReasoningModel(model) - ) { - return true - } - if (model.toLowerCase().includes('opus-4-7')) { - return true - } - if (process.env.USER_TYPE === 'ant' && resolveAntModel(model)) { - return true - } - return false + return true } export function isEffortLevel(value: string): value is EffortLevel {