Handle Gemini inline data in asset and size processing

This commit is contained in:
2026-06-15 00:14:40 +08:00
parent b860ef37e8
commit 10ec25d87b
10 changed files with 380 additions and 18 deletions
@@ -533,7 +533,8 @@ func strictRequestBase64Field(key string, path []string) bool {
lower == "b64" ||
strings.Contains(lower, "base64") ||
strings.Contains(lower, "_b64") ||
(parent == "input_audio" && lower == "data")
(parent == "input_audio" && lower == "data") ||
((parent == "inlinedata" || parent == "inline_data") && lower == "data")
}
func likelyRequestBase64MediaField(key string, path []string, value string) bool {
@@ -37,6 +37,22 @@ func TestRequestAssetFromValueDetectsDataURLAndRawBase64(t *testing.T) {
}
}
func TestRequestAssetFromValueDetectsGeminiInlineData(t *testing.T) {
payload := base64.StdEncoding.EncodeToString([]byte("inline gemini image"))
decoded, ok, err := requestAssetFromValue(
"data",
[]string{"contents", "[0]", "parts", "[0]", "inlineData"},
payload,
map[string]any{"mimeType": "image/png"},
)
if err != nil {
t.Fatalf("decode Gemini inlineData: %v", err)
}
if !ok || decoded.ContentType != "image/png" || string(decoded.Bytes) != "inline gemini image" {
t.Fatalf("unexpected Gemini inlineData asset: ok=%v decoded=%+v", ok, decoded)
}
}
func TestCanonicalConversationMessageHashUsesTextAndAssetRefs(t *testing.T) {
message := map[string]any{
"role": "user",