fix(images): 优先转换编辑图片为 multipart 二进制

OpenAI 编辑即使声明支持 URL,也必须在 multipart 提交前转存为二进制文件。
This commit is contained in:
2026-07-24 09:04:23 +08:00
parent db640c1211
commit 8df87875de
2 changed files with 13 additions and 5 deletions
+7 -5
View File
@@ -159,9 +159,11 @@ func (s *Service) hydrateProviderRequestAssetString(ctx context.Context, value s
if raw == "" || !imageInputFieldNeedsHydration(path) {
return value, nil
}
style, ok := requestAssetCapabilityHydrationForMedia("image", candidate, raw, "")
if !ok && openAIImageEditRequiresMultipartBytes(candidate) {
style, ok := requestAssetHydrateUnsupported, false
if openAIImageEditRequiresMultipartBytes(candidate) {
style, ok = requestAssetHydrateDataURL, true
} else {
style, ok = requestAssetCapabilityHydrationForMedia("image", candidate, raw, "")
}
if !ok {
return value, nil
@@ -320,12 +322,12 @@ func requestAssetHydrationForField(path []string, asset store.RequestAsset, cand
return requestAssetHydrateDataURL
}
if requestAssetMediaKindForHydration(path, asset) == "image" {
if style, ok := requestAssetCapabilityHydrationForMedia("image", candidate, asset.URL, asset.StorageProvider); ok {
return style
}
if openAIImageEditRequiresMultipartBytes(candidate) {
return requestAssetHydrateDataURL
}
if style, ok := requestAssetCapabilityHydrationForMedia("image", candidate, asset.URL, asset.StorageProvider); ok {
return style
}
}
if mediaURLFieldNeedsHydration(path) {
if style := configuredRequestAssetMediaURLHydration(candidate, requestAssetMediaURLKind(path)); style != "" {
@@ -223,6 +223,12 @@ func TestHydrateProviderRequestAssetsConvertsOpenAIEditImagesForMultipart(t *tes
hydrated, err := service.hydrateProviderRequestAssets(context.Background(), body, store.RuntimeModelCandidate{
Provider: "openai",
ModelType: "image_edit",
Capabilities: map[string]any{
"image_edit": map[string]any{
"support_url_input": true,
"support_base64_input": false,
},
},
})
if err != nil {
t.Fatalf("hydrate OpenAI edit images: %v", err)