From 497673bf6bdab783b767641bb5228e914960a879 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Wed, 19 Aug 2026 02:18:39 +0800 Subject: [PATCH] feat(antigravity): add `video_url` content part support to OpenAI request conversion Closes: #5056 --- .../antigravity_openai_request.go | 8 +++++ .../antigravity_openai_request_test.go | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go index ee936642d..f03020a50 100644 --- a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go +++ b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request.go @@ -201,6 +201,14 @@ func ConvertOpenAIRequestToAntigravity(modelName string, inputRawJSON []byte, _ partItems = append(partItems, part) } } + case "video_url": + videoURL := item.Get("video_url.url").String() + if len(videoURL) > 5 { + pieces := strings.SplitN(videoURL[5:], ";", 2) + if len(pieces) == 2 && len(pieces[1]) > 7 { + partItems = append(partItems, antigravityOpenAIInlineDataPart(pieces[0], pieces[1][7:], false)) + } + } case "file": filename := item.Get("file.filename").String() fileData := item.Get("file.file_data").String() diff --git a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request_test.go b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request_test.go index 33bd0e4c4..ac884848e 100644 --- a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request_test.go +++ b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_request_test.go @@ -421,3 +421,37 @@ func assertNoResponseSchemaAliases(t *testing.T, out []byte) { } } } + +func TestConvertOpenAIRequestToAntigravityTranslatesVideoURL(t *testing.T) { + inputJSON := []byte(`{ + "model": "gemini-3.7-flash-high", + "messages": [{ + "role": "user", + "content": [ + {"type": "text", "text": "Name the colours in order"}, + {"type": "video_url", "video_url": {"url": "data:video/mp4;base64,AAAAIGZ0eXBtcDQy"}} + ] + }] + }`) + + out := ConvertOpenAIRequestToAntigravity("gemini-3.7-flash-high", inputJSON, false) + parts := gjson.GetBytes(out, "request.contents.0.parts").Array() + if len(parts) != 2 { + t.Fatalf("parts length = %d, want 2. Output: %s", len(parts), out) + } + + if got := parts[0].Get("text").String(); got != "Name the colours in order" { + t.Fatalf("parts[0].text = %q, want 'Name the colours in order'", got) + } + + inlineData := parts[1].Get("inlineData") + if !inlineData.Exists() { + t.Fatalf("parts[1].inlineData missing. Output: %s", out) + } + if got := inlineData.Get("mimeType").String(); got != "video/mp4" { + t.Fatalf("inlineData.mimeType = %q, want video/mp4. Output: %s", got, out) + } + if got := inlineData.Get("data").String(); got != "AAAAIGZ0eXBtcDQy" { + t.Fatalf("inlineData.data = %q, want AAAAIGZ0eXBtcDQy. Output: %s", got, out) + } +}