From 2666708c30f54d99d4858b39905d0dd7011c8703 Mon Sep 17 00:00:00 2001 From: Darley Date: Thu, 29 Jan 2026 04:13:07 +0800 Subject: [PATCH] fix: skip empty text parts and messages to avoid Gemini API error When Claude API sends an assistant message with empty text content like: {"role":"assistant","content":[{"type":"text","text":""}]} The translator was creating a part object {} with no data field, causing Gemini API to return error: "required oneof field 'data' must have one initialized field" This fix: 1. Skips empty text parts (text="") during translation 2. Skips entire messages when their parts array becomes empty This ensures compatibility when clients send empty assistant messages in their conversation history. --- .../claude/antigravity_claude_request.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/internal/translator/antigravity/claude/antigravity_claude_request.go b/internal/translator/antigravity/claude/antigravity_claude_request.go index e87a7d6b..9bef7125 100644 --- a/internal/translator/antigravity/claude/antigravity_claude_request.go +++ b/internal/translator/antigravity/claude/antigravity_claude_request.go @@ -155,10 +155,13 @@ func ConvertClaudeRequestToAntigravity(modelName string, inputRawJSON []byte, _ clientContentJSON, _ = sjson.SetRaw(clientContentJSON, "parts.-1", partJSON) } else if contentTypeResult.Type == gjson.String && contentTypeResult.String() == "text" { prompt := contentResult.Get("text").String() - partJSON := `{}` - if prompt != "" { - partJSON, _ = sjson.Set(partJSON, "text", prompt) + // Skip empty text parts to avoid Gemini API error: + // "required oneof field 'data' must have one initialized field" + if prompt == "" { + continue } + partJSON := `{}` + partJSON, _ = sjson.Set(partJSON, "text", prompt) clientContentJSON, _ = sjson.SetRaw(clientContentJSON, "parts.-1", partJSON) } else if contentTypeResult.Type == gjson.String && contentTypeResult.String() == "tool_use" { // NOTE: Do NOT inject dummy thinking blocks here. @@ -285,6 +288,13 @@ func ConvertClaudeRequestToAntigravity(modelName string, inputRawJSON []byte, _ } } + // Skip messages with empty parts array to avoid Gemini API error: + // "required oneof field 'data' must have one initialized field" + partsCheck := gjson.Get(clientContentJSON, "parts") + if !partsCheck.IsArray() || len(partsCheck.Array()) == 0 { + continue + } + contentsJSON, _ = sjson.SetRaw(contentsJSON, "-1", clientContentJSON) hasContents = true } else if contentsResult.Type == gjson.String {