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
This commit is contained in:
@@ -95,7 +95,7 @@ func RequestOpenAI2ClaudeMessage(textRequest dto.GeneralOpenAIRequest) (*ClaudeR
|
|||||||
}
|
}
|
||||||
|
|
||||||
if claudeRequest.MaxTokens == 0 {
|
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 &&
|
if model_setting.GetClaudeSettings().ThinkingAdapterEnabled &&
|
||||||
|
|||||||
@@ -14,16 +14,18 @@ import (
|
|||||||
// ClaudeSettings 定义Claude模型的配置
|
// ClaudeSettings 定义Claude模型的配置
|
||||||
type ClaudeSettings struct {
|
type ClaudeSettings struct {
|
||||||
HeadersSettings map[string]map[string][]string `json:"model_headers_settings"`
|
HeadersSettings map[string]map[string][]string `json:"model_headers_settings"`
|
||||||
|
DefaultMaxTokens map[string]int `json:"default_max_tokens"`
|
||||||
ThinkingAdapterEnabled bool `json:"thinking_adapter_enabled"`
|
ThinkingAdapterEnabled bool `json:"thinking_adapter_enabled"`
|
||||||
ThinkingAdapterMaxTokens int `json:"thinking_adapter_max_tokens"`
|
|
||||||
ThinkingAdapterBudgetTokensPercentage float64 `json:"thinking_adapter_budget_tokens_percentage"`
|
ThinkingAdapterBudgetTokensPercentage float64 `json:"thinking_adapter_budget_tokens_percentage"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 默认配置
|
// 默认配置
|
||||||
var defaultClaudeSettings = ClaudeSettings{
|
var defaultClaudeSettings = ClaudeSettings{
|
||||||
HeadersSettings: map[string]map[string][]string{},
|
HeadersSettings: map[string]map[string][]string{},
|
||||||
ThinkingAdapterEnabled: true,
|
ThinkingAdapterEnabled: true,
|
||||||
ThinkingAdapterMaxTokens: 8192,
|
DefaultMaxTokens: map[string]int{
|
||||||
|
"default": 8192,
|
||||||
|
},
|
||||||
ThinkingAdapterBudgetTokensPercentage: 0.8,
|
ThinkingAdapterBudgetTokensPercentage: 0.8,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,6 +39,10 @@ func init() {
|
|||||||
|
|
||||||
// GetClaudeSettings 获取Claude配置
|
// GetClaudeSettings 获取Claude配置
|
||||||
func GetClaudeSettings() *ClaudeSettings {
|
func GetClaudeSettings() *ClaudeSettings {
|
||||||
|
// check default max tokens must have default key
|
||||||
|
if _, ok := claudeSettings.DefaultMaxTokens["default"]; !ok {
|
||||||
|
claudeSettings.DefaultMaxTokens["default"] = 8192
|
||||||
|
}
|
||||||
return &claudeSettings
|
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,7 +3,6 @@ import { Card, Spin, Tabs } from '@douyinfe/semi-ui';
|
|||||||
|
|
||||||
|
|
||||||
import { API, showError, showSuccess } from '../helpers';
|
import { API, showError, showSuccess } from '../helpers';
|
||||||
import SettingsChats from '../pages/Setting/Operation/SettingsChats.js';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import SettingGeminiModel from '../pages/Setting/Model/SettingGeminiModel.js';
|
import SettingGeminiModel from '../pages/Setting/Model/SettingGeminiModel.js';
|
||||||
import SettingClaudeModel from '../pages/Setting/Model/SettingClaudeModel.js';
|
import SettingClaudeModel from '../pages/Setting/Model/SettingClaudeModel.js';
|
||||||
@@ -15,7 +14,7 @@ const ModelSetting = () => {
|
|||||||
'gemini.version_settings': '',
|
'gemini.version_settings': '',
|
||||||
'claude.model_headers_settings': '',
|
'claude.model_headers_settings': '',
|
||||||
'claude.thinking_adapter_enabled': true,
|
'claude.thinking_adapter_enabled': true,
|
||||||
'claude.thinking_adapter_max_tokens': 8192,
|
'claude.default_max_tokens': '',
|
||||||
'claude.thinking_adapter_budget_tokens_percentage': 0.8,
|
'claude.thinking_adapter_budget_tokens_percentage': 0.8,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -30,7 +29,8 @@ const ModelSetting = () => {
|
|||||||
if (
|
if (
|
||||||
item.key === 'gemini.safety_settings' ||
|
item.key === 'gemini.safety_settings' ||
|
||||||
item.key === 'gemini.version_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);
|
item.value = JSON.stringify(JSON.parse(item.value), null, 2);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
export default function SettingClaudeModel(props) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -23,7 +28,7 @@ export default function SettingClaudeModel(props) {
|
|||||||
const [inputs, setInputs] = useState({
|
const [inputs, setInputs] = useState({
|
||||||
'claude.model_headers_settings': '',
|
'claude.model_headers_settings': '',
|
||||||
'claude.thinking_adapter_enabled': true,
|
'claude.thinking_adapter_enabled': true,
|
||||||
'claude.thinking_adapter_max_tokens': 8192,
|
'claude.default_max_tokens': '',
|
||||||
'claude.thinking_adapter_budget_tokens_percentage': 0.8,
|
'claude.thinking_adapter_budget_tokens_percentage': 0.8,
|
||||||
});
|
});
|
||||||
const refForm = useRef();
|
const refForm = useRef();
|
||||||
@@ -102,12 +107,21 @@ export default function SettingClaudeModel(props) {
|
|||||||
</Row>
|
</Row>
|
||||||
<Row>
|
<Row>
|
||||||
<Col span={8}>
|
<Col span={8}>
|
||||||
<Form.InputNumber
|
<Form.TextArea
|
||||||
label={t('缺省 MaxTokens')}
|
label={t('缺省 MaxTokens')}
|
||||||
field={'claude.thinking_adapter_max_tokens'}
|
field={'claude.default_max_tokens'}
|
||||||
initValue={''}
|
placeholder={t('为一个 JSON 文本,例如:') + '\n' + JSON.stringify(CLAUDE_DEFAULT_MAX_TOKENS, null, 2)}
|
||||||
extraText={t('客户端没有指定MaxTokens时的缺省值')}
|
extraText={t('示例') + '\n' + JSON.stringify(CLAUDE_DEFAULT_MAX_TOKENS, null, 2)}
|
||||||
onChange={(value) => setInputs({ ...inputs, 'claude.thinking_adapter_max_tokens': value })}
|
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>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
|||||||
Reference in New Issue
Block a user