From cfd3f6c0732f2b9aaab4fb80f75e871792ecd1d1 Mon Sep 17 00:00:00 2001 From: "1808837298@qq.com" <1808837298@qq.com> Date: Fri, 28 Feb 2025 17:53:08 +0800 Subject: [PATCH] feat: Enhance Claude default max tokens configuration - Replace ThinkingAdapterMaxTokens with a more flexible DefaultMaxTokens map - Add support for model-specific default max tokens configuration - Update relay and web interface to use the new configuration approach - Implement a fallback mechanism for default max tokens --- relay/channel/claude/relay-claude.go | 2 +- setting/model_setting/claude.go | 21 ++++++++++++--- web/src/components/ModelSetting.js | 6 ++--- .../pages/Setting/Model/SettingClaudeModel.js | 26 ++++++++++++++----- 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/relay/channel/claude/relay-claude.go b/relay/channel/claude/relay-claude.go index 3b62a742..e32ee817 100644 --- a/relay/channel/claude/relay-claude.go +++ b/relay/channel/claude/relay-claude.go @@ -95,7 +95,7 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR } if claudeRequest.MaxTokens == 0 { - claudeRequest.MaxTokens = uint(model_setting.GetClaudeSettings().ThinkingAdapterMaxTokens) + claudeRequest.MaxTokens = uint(model_setting.GetClaudeSettings().GetDefaultMaxTokens(textRequest.Model)) } if model_setting.GetClaudeSettings().ThinkingAdapterEnabled && diff --git a/setting/model_setting/claude.go b/setting/model_setting/claude.go index 7da52ec8..04983182 100644 --- a/setting/model_setting/claude.go +++ b/setting/model_setting/claude.go @@ -14,16 +14,18 @@ import ( // ClaudeSettings 定义Claude模型的配置 type ClaudeSettings struct { HeadersSettings map[string]map[string][]string `json:"model_headers_settings"` + DefaultMaxTokens map[string]int `json:"default_max_tokens"` ThinkingAdapterEnabled bool `json:"thinking_adapter_enabled"` - ThinkingAdapterMaxTokens int `json:"thinking_adapter_max_tokens"` ThinkingAdapterBudgetTokensPercentage float64 `json:"thinking_adapter_budget_tokens_percentage"` } // 默认配置 var defaultClaudeSettings = ClaudeSettings{ - HeadersSettings: map[string]map[string][]string{}, - ThinkingAdapterEnabled: true, - ThinkingAdapterMaxTokens: 8192, + HeadersSettings: map[string]map[string][]string{}, + ThinkingAdapterEnabled: true, + DefaultMaxTokens: map[string]int{ + "default": 8192, + }, ThinkingAdapterBudgetTokensPercentage: 0.8, } @@ -37,6 +39,10 @@ func init() { // GetClaudeSettings 获取Claude配置 func GetClaudeSettings() *ClaudeSettings { + // check default max tokens must have default key + if _, ok := claudeSettings.DefaultMaxTokens["default"]; !ok { + claudeSettings.DefaultMaxTokens["default"] = 8192 + } return &claudeSettings } @@ -50,3 +56,10 @@ func (c *ClaudeSettings) WriteHeaders(originModel string, httpHeader *http.Heade } } } + +func (c *ClaudeSettings) GetDefaultMaxTokens(model string) int { + if maxTokens, ok := c.DefaultMaxTokens[model]; ok { + return maxTokens + } + return c.DefaultMaxTokens["default"] +} diff --git a/web/src/components/ModelSetting.js b/web/src/components/ModelSetting.js index 037457f5..904b4015 100644 --- a/web/src/components/ModelSetting.js +++ b/web/src/components/ModelSetting.js @@ -3,7 +3,6 @@ import { Card, Spin, Tabs } from '@douyinfe/semi-ui'; import { API, showError, showSuccess } from '../helpers'; -import SettingsChats from '../pages/Setting/Operation/SettingsChats.js'; import { useTranslation } from 'react-i18next'; import SettingGeminiModel from '../pages/Setting/Model/SettingGeminiModel.js'; import SettingClaudeModel from '../pages/Setting/Model/SettingClaudeModel.js'; @@ -15,7 +14,7 @@ const ModelSetting = () => { 'gemini.version_settings': '', 'claude.model_headers_settings': '', 'claude.thinking_adapter_enabled': true, - 'claude.thinking_adapter_max_tokens': 8192, + 'claude.default_max_tokens': '', 'claude.thinking_adapter_budget_tokens_percentage': 0.8, }); @@ -30,7 +29,8 @@ const ModelSetting = () => { if ( item.key === 'gemini.safety_settings' || item.key === 'gemini.version_settings' || - item.key === 'claude.model_headers_settings' + item.key === 'claude.model_headers_settings'|| + item.key === 'claude.default_max_tokens' ) { item.value = JSON.stringify(JSON.parse(item.value), null, 2); } diff --git a/web/src/pages/Setting/Model/SettingClaudeModel.js b/web/src/pages/Setting/Model/SettingClaudeModel.js index 246ddffc..76ee8cfa 100644 --- a/web/src/pages/Setting/Model/SettingClaudeModel.js +++ b/web/src/pages/Setting/Model/SettingClaudeModel.js @@ -16,6 +16,11 @@ const CLAUDE_HEADER = { } }; +const CLAUDE_DEFAULT_MAX_TOKENS = { + 'default': 8192, + 'claude-3-7-sonnet-20250219-thinking': 8192, +} + export default function SettingClaudeModel(props) { const { t } = useTranslation(); @@ -23,7 +28,7 @@ export default function SettingClaudeModel(props) { const [inputs, setInputs] = useState({ 'claude.model_headers_settings': '', 'claude.thinking_adapter_enabled': true, - 'claude.thinking_adapter_max_tokens': 8192, + 'claude.default_max_tokens': '', 'claude.thinking_adapter_budget_tokens_percentage': 0.8, }); const refForm = useRef(); @@ -102,12 +107,21 @@ export default function SettingClaudeModel(props) { - setInputs({ ...inputs, 'claude.thinking_adapter_max_tokens': value })} + field={'claude.default_max_tokens'} + placeholder={t('为一个 JSON 文本,例如:') + '\n' + JSON.stringify(CLAUDE_DEFAULT_MAX_TOKENS, null, 2)} + extraText={t('示例') + '\n' + JSON.stringify(CLAUDE_DEFAULT_MAX_TOKENS, null, 2)} + autosize={{ minRows: 6, maxRows: 12 }} + trigger='blur' + stopValidateWithError + rules={[ + { + validator: (rule, value) => verifyJSON(value), + message: t('不是合法的 JSON 字符串') + } + ]} + onChange={(value) => setInputs({ ...inputs, 'claude.default_max_tokens': value })} />