diff --git a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go index 7282ebc89..9dae687ac 100644 --- a/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go +++ b/internal/translator/antigravity/openai/chat-completions/antigravity_openai_response.go @@ -8,6 +8,7 @@ package chat_completions import ( "bytes" "context" + "encoding/json" "fmt" "strings" "sync/atomic" @@ -181,14 +182,23 @@ func ConvertAntigravityResponseToOpenAI(_ context.Context, _ string, originalReq mimeType = "image/png" } imageURL := fmt.Sprintf("data:%s;base64,%s", mimeType, data) - imagePayload := `{"image_url":{"url":""},"type":"image_url"}` - imagePayload, _ = sjson.Set(imagePayload, "image_url.url", imageURL) imagesResult := gjson.Get(template, "choices.0.delta.images") if !imagesResult.Exists() || !imagesResult.IsArray() { template, _ = sjson.SetRaw(template, "choices.0.delta.images", `[]`) } + imageIndex := len(gjson.Get(template, "choices.0.delta.images").Array()) + imagePayload, err := json.Marshal(map[string]any{ + "index": imageIndex, + "type": "image_url", + "image_url": map[string]string{ + "url": imageURL, + }, + }) + if err != nil { + continue + } template, _ = sjson.Set(template, "choices.0.delta.role", "assistant") - template, _ = sjson.SetRaw(template, "choices.0.delta.images.-1", imagePayload) + template, _ = sjson.SetRaw(template, "choices.0.delta.images.-1", string(imagePayload)) } } } diff --git a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_response.go b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_response.go index 2b3ac37e5..f02d36582 100644 --- a/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_response.go +++ b/internal/translator/gemini-cli/openai/chat-completions/gemini-cli_openai_response.go @@ -8,6 +8,7 @@ package chat_completions import ( "bytes" "context" + "encoding/json" "fmt" "strings" "sync/atomic" @@ -170,14 +171,23 @@ func ConvertCliResponseToOpenAI(_ context.Context, _ string, originalRequestRawJ mimeType = "image/png" } imageURL := fmt.Sprintf("data:%s;base64,%s", mimeType, data) - imagePayload := `{"image_url":{"url":""},"type":"image_url"}` - imagePayload, _ = sjson.Set(imagePayload, "image_url.url", imageURL) imagesResult := gjson.Get(template, "choices.0.delta.images") if !imagesResult.Exists() || !imagesResult.IsArray() { template, _ = sjson.SetRaw(template, "choices.0.delta.images", `[]`) } + imageIndex := len(gjson.Get(template, "choices.0.delta.images").Array()) + imagePayload, err := json.Marshal(map[string]any{ + "index": imageIndex, + "type": "image_url", + "image_url": map[string]string{ + "url": imageURL, + }, + }) + if err != nil { + continue + } template, _ = sjson.Set(template, "choices.0.delta.role", "assistant") - template, _ = sjson.SetRaw(template, "choices.0.delta.images.-1", imagePayload) + template, _ = sjson.SetRaw(template, "choices.0.delta.images.-1", string(imagePayload)) } } } diff --git a/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go b/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go index d710b1d6b..d02201058 100644 --- a/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go +++ b/internal/translator/gemini/openai/chat-completions/gemini_openai_response.go @@ -8,6 +8,7 @@ package chat_completions import ( "bytes" "context" + "encoding/json" "fmt" "strings" "sync/atomic" @@ -182,14 +183,23 @@ func ConvertGeminiResponseToOpenAI(_ context.Context, _ string, originalRequestR mimeType = "image/png" } imageURL := fmt.Sprintf("data:%s;base64,%s", mimeType, data) - imagePayload := `{"image_url":{"url":""},"type":"image_url"}` - imagePayload, _ = sjson.Set(imagePayload, "image_url.url", imageURL) imagesResult := gjson.Get(template, "choices.0.delta.images") if !imagesResult.Exists() || !imagesResult.IsArray() { template, _ = sjson.SetRaw(template, "choices.0.delta.images", `[]`) } + imageIndex := len(gjson.Get(template, "choices.0.delta.images").Array()) + imagePayload, err := json.Marshal(map[string]any{ + "index": imageIndex, + "type": "image_url", + "image_url": map[string]string{ + "url": imageURL, + }, + }) + if err != nil { + continue + } template, _ = sjson.Set(template, "choices.0.delta.role", "assistant") - template, _ = sjson.SetRaw(template, "choices.0.delta.images.-1", imagePayload) + template, _ = sjson.SetRaw(template, "choices.0.delta.images.-1", string(imagePayload)) } } } @@ -316,14 +326,23 @@ func ConvertGeminiResponseToOpenAINonStream(_ context.Context, _ string, origina mimeType = "image/png" } imageURL := fmt.Sprintf("data:%s;base64,%s", mimeType, data) - imagePayload := `{"image_url":{"url":""},"type":"image_url"}` - imagePayload, _ = sjson.Set(imagePayload, "image_url.url", imageURL) imagesResult := gjson.Get(template, "choices.0.message.images") if !imagesResult.Exists() || !imagesResult.IsArray() { template, _ = sjson.SetRaw(template, "choices.0.message.images", `[]`) } + imageIndex := len(gjson.Get(template, "choices.0.message.images").Array()) + imagePayload, err := json.Marshal(map[string]any{ + "index": imageIndex, + "type": "image_url", + "image_url": map[string]string{ + "url": imageURL, + }, + }) + if err != nil { + continue + } template, _ = sjson.Set(template, "choices.0.message.role", "assistant") - template, _ = sjson.SetRaw(template, "choices.0.message.images.-1", imagePayload) + template, _ = sjson.SetRaw(template, "choices.0.message.images.-1", string(imagePayload)) } } }