From 05af95dade5ea1def96d280755646f961a46fe53 Mon Sep 17 00:00:00 2001 From: shaw Date: Thu, 5 Feb 2026 09:53:20 +0800 Subject: [PATCH] =?UTF-8?q?fix(gateway):=20=E4=BF=AE=E5=A4=8D=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E5=90=8D=E8=BD=AC=E6=8D=A2=E7=A0=B4=E5=9D=8F=20Anthro?= =?UTF-8?q?pic=20=E7=89=B9=E6=AE=8A=E5=B7=A5=E5=85=B7=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 未知工具名不再进行 PascalCase/snake_case 转换,保持原样透传。 修复 text_editor_20250728 等 Anthropic 特殊工具被错误转换的问题。 --- backend/internal/service/gateway_service.go | 46 ++++----------------- 1 file changed, 9 insertions(+), 37 deletions(-) diff --git a/backend/internal/service/gateway_service.go b/backend/internal/service/gateway_service.go index b2ac1efa..8c88c0a9 100644 --- a/backend/internal/service/gateway_service.go +++ b/backend/internal/service/gateway_service.go @@ -20,7 +20,6 @@ import ( "strings" "sync/atomic" "time" - "unicode" "github.com/Wei-Shaw/sub2api/internal/config" "github.com/Wei-Shaw/sub2api/internal/pkg/claude" @@ -620,35 +619,6 @@ func stripToolPrefix(value string) string { return toolPrefixRe.ReplaceAllString(value, "") } -func toPascalCase(value string) string { - if value == "" { - return value - } - normalized := toolNameBoundaryRe.ReplaceAllString(value, " ") - tokens := make([]string, 0) - for _, token := range strings.Fields(normalized) { - expanded := toolNameCamelRe.ReplaceAllString(token, "$1 $2") - parts := strings.Fields(expanded) - if len(parts) > 0 { - tokens = append(tokens, parts...) - } - } - if len(tokens) == 0 { - return value - } - var builder strings.Builder - for _, token := range tokens { - lower := strings.ToLower(token) - if lower == "" { - continue - } - runes := []rune(lower) - runes[0] = unicode.ToUpper(runes[0]) - _, _ = builder.WriteString(string(runes)) - } - return builder.String() -} - func toSnakeCase(value string) string { if value == "" { return value @@ -664,16 +634,15 @@ func normalizeToolNameForClaude(name string, cache map[string]string) string { return name } stripped := stripToolPrefix(name) + // 只对已知的工具名进行映射,未知工具名保持原样 + // 避免破坏 Anthropic 特殊工具(如 text_editor_20250728) mapped, ok := claudeToolNameOverrides[strings.ToLower(stripped)] if !ok { - mapped = toPascalCase(stripped) - } - if mapped != "" && cache != nil && mapped != stripped { - cache[mapped] = stripped - } - if mapped == "" { return stripped } + if cache != nil && mapped != stripped { + cache[mapped] = stripped + } return mapped } @@ -682,15 +651,18 @@ func normalizeToolNameForOpenCode(name string, cache map[string]string) string { return name } stripped := stripToolPrefix(name) + // 优先从请求时建立的映射中查找 if cache != nil { if mapped, ok := cache[stripped]; ok { return mapped } } + // 已知工具名的硬编码映射 if mapped, ok := openCodeToolOverrides[stripped]; ok { return mapped } - return toSnakeCase(stripped) + // 未知工具名保持原样,避免破坏 Anthropic 特殊工具 + return stripped } func normalizeParamNameForOpenCode(name string, cache map[string]string) string {