fix(translator): update HasValidSignature to require modelName parameter for improved validation

This commit is contained in:
Luis Pater
2026-01-21 11:31:37 +08:00
parent a4f8015caa
commit 88bf4e77ec
3 changed files with 7 additions and 7 deletions

View File

@@ -186,8 +186,8 @@ func ClearSignatureCache(sessionID string) {
} }
// HasValidSignature checks if a signature is valid (non-empty and long enough) // HasValidSignature checks if a signature is valid (non-empty and long enough)
func HasValidSignature(signature string) bool { func HasValidSignature(modelName, signature string) bool {
return signature != "" && len(signature) >= MinValidSignatureLen return (signature != "" && len(signature) >= MinValidSignatureLen) || (signature == "skip_thought_signature_validator" && GetModelGroup(modelName) == "gemini")
} }
func GetModelGroup(modelName string) string { func GetModelGroup(modelName string) string {

View File

@@ -132,7 +132,7 @@ func TestHasValidSignature(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
result := HasValidSignature(tt.signature) result := HasValidSignature("claude-sonnet-4-5-thinking", tt.signature)
if result != tt.expected { if result != tt.expected {
t.Errorf("HasValidSignature(%q) = %v, expected %v", tt.signature, result, tt.expected) t.Errorf("HasValidSignature(%q) = %v, expected %v", tt.signature, result, tt.expected)
} }

View File

@@ -156,19 +156,19 @@ func ConvertClaudeRequestToAntigravity(modelName string, inputRawJSON []byte, _
} }
} }
} }
if cache.HasValidSignature(clientSignature) { if cache.HasValidSignature(modelName, clientSignature) {
signature = clientSignature signature = clientSignature
} }
// log.Debugf("Using client-provided signature for thinking block") // log.Debugf("Using client-provided signature for thinking block")
} }
// Store for subsequent tool_use in the same message // Store for subsequent tool_use in the same message
if cache.HasValidSignature(signature) { if cache.HasValidSignature(modelName, signature) {
currentMessageThinkingSignature = signature currentMessageThinkingSignature = signature
} }
// Skip trailing unsigned thinking blocks on last assistant message // Skip trailing unsigned thinking blocks on last assistant message
isUnsigned := !cache.HasValidSignature(signature) isUnsigned := !cache.HasValidSignature(modelName, signature)
// If unsigned, skip entirely (don't convert to text) // If unsigned, skip entirely (don't convert to text)
// Claude requires assistant messages to start with thinking blocks when thinking is enabled // Claude requires assistant messages to start with thinking blocks when thinking is enabled
@@ -223,7 +223,7 @@ func ConvertClaudeRequestToAntigravity(modelName string, inputRawJSON []byte, _
// This is the approach used in opencode-google-antigravity-auth for Gemini // This is the approach used in opencode-google-antigravity-auth for Gemini
// and also works for Claude through Antigravity API // and also works for Claude through Antigravity API
const skipSentinel = "skip_thought_signature_validator" const skipSentinel = "skip_thought_signature_validator"
if cache.HasValidSignature(currentMessageThinkingSignature) { if cache.HasValidSignature(modelName, currentMessageThinkingSignature) {
partJSON, _ = sjson.Set(partJSON, "thoughtSignature", currentMessageThinkingSignature) partJSON, _ = sjson.Set(partJSON, "thoughtSignature", currentMessageThinkingSignature)
} else { } else {
// No valid signature - use skip sentinel to bypass validation // No valid signature - use skip sentinel to bypass validation