Bläddra i källkod

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
[email protected] 10 månader sedan
förälder
incheckning
cfd3f6c073

+ 1 - 1
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 &&

+ 17 - 4
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"]
+}

+ 3 - 3
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);
         }

+ 20 - 6
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) {
             </Row>
             <Row>
               <Col span={8}>
-                <Form.InputNumber
+                <Form.TextArea
                   label={t('缺省 MaxTokens')}
-                  field={'claude.thinking_adapter_max_tokens'}
-                  initValue={''}
-                  extraText={t('客户端没有指定MaxTokens时的缺省值')}
-                  onChange={(value) => 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 })}
                 />
               </Col>
             </Row>