diff --git a/relay/channel/aws/adaptor.go b/relay/channel/aws/adaptor.go index e419f8b8..7f2a2841 100644 --- a/relay/channel/aws/adaptor.go +++ b/relay/channel/aws/adaptor.go @@ -39,7 +39,7 @@ func (a *Adaptor) GetRequestURL(info *relaycommon.RelayInfo) (string, error) { } func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Header, info *relaycommon.RelayInfo) error { - model_setting.GetClaudeSettings().WriteHeaders(req) + model_setting.GetClaudeSettings().WriteHeaders(info.OriginModelName, req) return nil } diff --git a/relay/channel/claude/adaptor.go b/relay/channel/claude/adaptor.go index bd29988d..bf03e5f5 100644 --- a/relay/channel/claude/adaptor.go +++ b/relay/channel/claude/adaptor.go @@ -56,7 +56,7 @@ func (a *Adaptor) SetupRequestHeader(c *gin.Context, req *http.Header, info *rel anthropicVersion = "2023-06-01" } req.Set("anthropic-version", anthropicVersion) - model_setting.GetClaudeSettings().WriteHeaders(req) + model_setting.GetClaudeSettings().WriteHeaders(info.OriginModelName, req) return nil } diff --git a/setting/model_setting/claude.go b/setting/model_setting/claude.go index 215b9a1e..7da52ec8 100644 --- a/setting/model_setting/claude.go +++ b/setting/model_setting/claude.go @@ -13,15 +13,15 @@ import ( // ClaudeSettings 定义Claude模型的配置 type ClaudeSettings struct { - HeadersSettings map[string][]string `json:"headers_settings"` - ThinkingAdapterEnabled bool `json:"thinking_adapter_enabled"` - ThinkingAdapterMaxTokens int `json:"thinking_adapter_max_tokens"` - ThinkingAdapterBudgetTokensPercentage float64 `json:"thinking_adapter_budget_tokens_percentage"` + HeadersSettings map[string]map[string][]string `json:"model_headers_settings"` + 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][]string{}, + HeadersSettings: map[string]map[string][]string{}, ThinkingAdapterEnabled: true, ThinkingAdapterMaxTokens: 8192, ThinkingAdapterBudgetTokensPercentage: 0.8, @@ -40,11 +40,13 @@ func GetClaudeSettings() *ClaudeSettings { return &claudeSettings } -func (c *ClaudeSettings) WriteHeaders(headers *http.Header) { - for key, values := range c.HeadersSettings { - headers.Del(key) - for _, value := range values { - headers.Add(key, value) +func (c *ClaudeSettings) WriteHeaders(originModel string, httpHeader *http.Header) { + if headers, ok := c.HeadersSettings[originModel]; ok { + for headerKey, headerValues := range headers { + httpHeader.Del(headerKey) + for _, headerValue := range headerValues { + httpHeader.Add(headerKey, headerValue) + } } } } diff --git a/web/src/components/ModelSetting.js b/web/src/components/ModelSetting.js index 219caee1..037457f5 100644 --- a/web/src/components/ModelSetting.js +++ b/web/src/components/ModelSetting.js @@ -13,7 +13,7 @@ const ModelSetting = () => { let [inputs, setInputs] = useState({ 'gemini.safety_settings': '', 'gemini.version_settings': '', - 'claude.headers_settings': '', + 'claude.model_headers_settings': '', 'claude.thinking_adapter_enabled': true, 'claude.thinking_adapter_max_tokens': 8192, 'claude.thinking_adapter_budget_tokens_percentage': 0.8, @@ -30,7 +30,7 @@ const ModelSetting = () => { if ( item.key === 'gemini.safety_settings' || item.key === 'gemini.version_settings' || - item.key === 'claude.headers_settings' + item.key === 'claude.model_headers_settings' ) { 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 23ba7820..246ddffc 100644 --- a/web/src/pages/Setting/Model/SettingClaudeModel.js +++ b/web/src/pages/Setting/Model/SettingClaudeModel.js @@ -11,7 +11,9 @@ import { useTranslation } from 'react-i18next'; import Text from '@douyinfe/semi-ui/lib/es/typography/text'; const CLAUDE_HEADER = { - 'anthropic-beta': ['output-128k-2025-02-19', 'token-efficient-tools-2025-02-19'], + 'claude-3-7-sonnet-20250219-thinking': { + 'anthropic-beta': ['output-128k-2025-02-19', 'token-efficient-tools-2025-02-19'], + } }; export default function SettingClaudeModel(props) { @@ -19,7 +21,7 @@ export default function SettingClaudeModel(props) { const [loading, setLoading] = useState(false); const [inputs, setInputs] = useState({ - 'claude.headers_settings': '', + 'claude.model_headers_settings': '', 'claude.thinking_adapter_enabled': true, 'claude.thinking_adapter_max_tokens': 8192, 'claude.thinking_adapter_budget_tokens_percentage': 0.8, @@ -82,9 +84,9 @@ export default function SettingClaudeModel(props) { setInputs({ ...inputs, 'claude.headers_settings': value })} + onChange={(value) => setInputs({ ...inputs, 'claude.model_headers_settings': value })} />