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
+59
View File
@@ -305,6 +305,65 @@ func TestUploadGeneratedAssetStoresAudioLocalWhenNoChannels(t *testing.T) {
}
}
func TestUploadGeneratedRawMediaValueReplacesGeminiInlineDataWithAssetRef(t *testing.T) {
storageDir := t.TempDir()
service := &Service{cfg: config.Config{LocalGeneratedStorageDir: storageDir}}
payload := append([]byte{0x89, 'P', 'N', 'G', 0x0d, 0x0a, 0x1a, 0x0a}, bytes.Repeat([]byte{0}, 160)...)
raw := map[string]any{
"candidates": []any{
map[string]any{
"content": map[string]any{
"parts": []any{
map[string]any{
"inlineData": map[string]any{
"mimeType": "image/png",
"data": base64.StdEncoding.EncodeToString(payload),
},
},
},
},
},
},
}
index := 0
uploaded, changed, err := service.uploadGeneratedRawMediaValue(context.Background(), "task-raw", "chat.completions", raw, "", nil, defaultGeneratedAssetUploadPolicy(), nil, &index)
if err != nil {
t.Fatalf("upload raw media: %v", err)
}
if !changed {
t.Fatal("expected raw inlineData to be replaced")
}
uploadedRaw := uploaded.(map[string]any)
candidates := uploadedRaw["candidates"].([]any)
candidate := candidates[0].(map[string]any)
content := candidate["content"].(map[string]any)
parts := content["parts"].([]any)
part := parts[0].(map[string]any)
inlineData := part["inlineData"].(map[string]any)
data, ok := inlineData["data"].(map[string]any)
if !ok {
t.Fatalf("inlineData.data should be an asset reference, got %+v", inlineData["data"])
}
ref, _ := data["assetRef"].(map[string]any)
if ref["sha256"] == "" || ref["contentType"] != "image/png" || ref["size"] != len(payload) {
t.Fatalf("unexpected asset ref: %+v", ref)
}
if urlValue := stringFromAny(data["url"]); !strings.HasPrefix(urlValue, "/static/generated/gateway-result-task-raw-01-") || !strings.HasSuffix(urlValue, ".png") {
t.Fatalf("unexpected raw media URL: %s", urlValue)
}
if inlineData["data"] == base64.StdEncoding.EncodeToString(payload) {
t.Fatal("raw inlineData still contains base64 payload")
}
entries, err := os.ReadDir(storageDir)
if err != nil {
t.Fatalf("read generated storage: %v", err)
}
if len(entries) != 1 || !strings.HasSuffix(entries[0].Name(), ".png") {
t.Fatalf("expected one generated PNG, got %+v", entries)
}
}
func TestUploadFileStoresLocalWhenNoChannels(t *testing.T) {
storageDir := t.TempDir()
service := &Service{cfg: config.Config{