diff --git a/src/renderer/src/config/models.ts b/src/renderer/src/config/models.ts index be66317d88..5f7e3362ae 100644 --- a/src/renderer/src/config/models.ts +++ b/src/renderer/src/config/models.ts @@ -2616,7 +2616,7 @@ export const THINKING_TOKEN_MAP: Record = 'qwen3-.*$': { min: 0, max: 38912 }, // Claude models - 'claude-3[.-]7.*sonnet.*$': { min: 0, max: 64000 } + 'claude-3[.-]7.*sonnet.*$': { min: 1024, max: 64000 } } export const findTokenLimit = (modelId: string): { min: number; max: number } | undefined => { diff --git a/src/renderer/src/providers/AiProvider/AnthropicProvider.ts b/src/renderer/src/providers/AiProvider/AnthropicProvider.ts index 159b5f4292..cf6d76108a 100644 --- a/src/renderer/src/providers/AiProvider/AnthropicProvider.ts +++ b/src/renderer/src/providers/AiProvider/AnthropicProvider.ts @@ -13,7 +13,7 @@ import { WebSearchToolResultError } from '@anthropic-ai/sdk/resources' import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant' -import { isClaudeReasoningModel, isReasoningModel, isWebSearchModel } from '@renderer/config/models' +import { findTokenLimit, isClaudeReasoningModel, isReasoningModel, isWebSearchModel } from '@renderer/config/models' import { getStoreSetting } from '@renderer/hooks/useSettings' import i18n from '@renderer/i18n' import { getAssistantSettings, getDefaultModel, getTopNamingModel } from '@renderer/services/AssistantService' @@ -189,7 +189,16 @@ export default class AnthropicProvider extends BaseProvider { const effortRatio = EFFORT_RATIO[reasoningEffort] - const budgetTokens = Math.floor((maxTokens || DEFAULT_MAX_TOKENS) * effortRatio * 0.8) + const budgetTokens = Math.max( + 1024, + Math.floor( + Math.min( + (findTokenLimit(model.id)?.max! - findTokenLimit(model.id)?.min!) * effortRatio + + findTokenLimit(model.id)?.min!, + (maxTokens || DEFAULT_MAX_TOKENS) * effortRatio + ) + ) + ) return { type: 'enabled', diff --git a/src/renderer/src/providers/AiProvider/OpenAIProvider.ts b/src/renderer/src/providers/AiProvider/OpenAIProvider.ts index cae673437d..51690fe791 100644 --- a/src/renderer/src/providers/AiProvider/OpenAIProvider.ts +++ b/src/renderer/src/providers/AiProvider/OpenAIProvider.ts @@ -1,3 +1,4 @@ +import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant' import { findTokenLimit, getOpenAIWebSearchParams, @@ -275,7 +276,10 @@ export default class OpenAIProvider extends BaseOpenAIProvider { return {} } const effortRatio = EFFORT_RATIO[reasoningEffort] - const budgetTokens = Math.floor((findTokenLimit(model.id)?.max || 0) * effortRatio) + const budgetTokens = Math.floor( + (findTokenLimit(model.id)?.max! - findTokenLimit(model.id)?.min!) * effortRatio + findTokenLimit(model.id)?.min! + ) + // OpenRouter models if (model.provider === 'openrouter') { if (isSupportedReasoningEffortModel(model)) { @@ -319,10 +323,11 @@ export default class OpenAIProvider extends BaseOpenAIProvider { // Claude models if (isSupportedThinkingTokenClaudeModel(model)) { + const maxTokens = assistant.settings?.maxTokens return { thinking: { type: 'enabled', - budget_tokens: budgetTokens + budget_tokens: Math.max(1024, Math.min(budgetTokens, (maxTokens || DEFAULT_MAX_TOKENS) * effortRatio)) } } } @@ -1142,8 +1147,8 @@ export default class OpenAIProvider extends BaseOpenAIProvider { stream } - if (this.provider.id !== 'github') { - body.enable_thinking = false; // qwen3 + if (isSupportedThinkingTokenQwenModel(model)) { + body.enable_thinking = false // qwen3 } try {