Handle Gemini inline data in asset and size processing
This commit is contained in:
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user