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
@@ -76,6 +76,52 @@ func TestHydrateProviderRequestAssetsConvertsBase64ArrayField(t *testing.T) {
}
}
func TestHydrateProviderRequestAssetsConvertsGeminiInlineDataAssetToRawBase64(t *testing.T) {
storageDir := t.TempDir()
fileName := "gateway-request-asset-gemini-inline.png"
payload := []byte("gemini inline image bytes")
if err := os.WriteFile(filepath.Join(storageDir, fileName), payload, 0o644); err != nil {
t.Fatalf("write request asset: %v", err)
}
service := &Service{cfg: config.Config{LocalUploadedStorageDir: storageDir}}
body := map[string]any{
"contents": []any{
map[string]any{
"role": "user",
"parts": []any{
map[string]any{
"inlineData": map[string]any{
"mimeType": "image/png",
"data": map[string]any{
"assetRef": map[string]any{
"sha256": "sha-gemini-inline",
"contentType": "image/png",
"url": "/static/uploaded/" + fileName,
"storageProvider": "local_static",
},
"url": "/static/uploaded/" + fileName,
},
},
},
},
},
},
}
hydrated, err := service.hydrateProviderRequestAssets(context.Background(), body, store.RuntimeModelCandidate{Provider: "gemini"})
if err != nil {
t.Fatalf("hydrate request assets: %v", err)
}
contents := hydrated["contents"].([]any)
content := contents[0].(map[string]any)
parts := content["parts"].([]any)
part := parts[0].(map[string]any)
inlineData := part["inlineData"].(map[string]any)
if got, want := stringFromAny(inlineData["data"]), base64.StdEncoding.EncodeToString(payload); got != want {
t.Fatalf("unexpected hydrated inlineData base64: got %q want %q", got, want)
}
}
func TestHydrateProviderRequestAssetsConvertsVolcesImageURLAssetToDataURL(t *testing.T) {
storageDir := t.TempDir()
fileName := "gateway-request-asset-chat-image.png"