From 8e92bd295232745e6f7321f2293189f16b685ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 22 Sep 2026 12:20:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=B8=A6=E5=8F=82=E8=80=83?= =?UTF-8?q?=E5=9B=BE=E7=9A=84=E4=BE=BF=E6=8D=B7=E7=94=9F=E6=88=90=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E6=A8=A1=E5=9E=8B=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - create_image_generation 在参考图非空时改用 gpt-image-2.5-sunburst-c,与 generate→edits 分支和任务边界 editor_image_generation_concrete_model 判据一致 - 新增 image_generation_with_references_uses_the_edit_concrete_model,断言带参考图的生成请求落到 /v1/images/edits 且 multipart 提交编辑 concrete model --- .../src/image_provider/runtime/executor.rs | 8 ++++- .../platform-image/tests/image_provider.rs | 32 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/server-rs/crates/platform-image/src/image_provider/runtime/executor.rs b/server-rs/crates/platform-image/src/image_provider/runtime/executor.rs index 8cec1ae9d..0f25bcd58 100644 --- a/server-rs/crates/platform-image/src/image_provider/runtime/executor.rs +++ b/server-rs/crates/platform-image/src/image_provider/runtime/executor.rs @@ -44,7 +44,13 @@ pub async fn create_image_generation( create_image_generation_with_model( http_client, settings, - GPT_IMAGE_2_5_GENERATION_MODEL, + // 带参考图时执行路径会走 /v1/images/edits,必须与任务边界的 + // `editor_image_generation_concrete_model` 判据一致,提交编辑 concrete model。 + if reference_images.is_empty() { + GPT_IMAGE_2_5_GENERATION_MODEL + } else { + GPT_IMAGE_2_5_EDIT_MODEL + }, prompt, negative_prompt, size, diff --git a/server-rs/crates/platform-image/tests/image_provider.rs b/server-rs/crates/platform-image/tests/image_provider.rs index ce56436fb..c1ca9439d 100644 --- a/server-rs/crates/platform-image/tests/image_provider.rs +++ b/server-rs/crates/platform-image/tests/image_provider.rs @@ -639,6 +639,38 @@ async fn image_edit_does_not_cross_model_when_unsupported() { server.abort(); } +#[tokio::test] +async fn image_generation_with_references_uses_the_edit_concrete_model() { + let (base_url, server, requests) = start_http_response_sequence(vec![MockResponse { + status: "200 OK", + content_type: "application/json", + body: r#"{"data":[{"b64_json":"iVBORw0KGgpyZXN0"}]}"#, + }]) + .await; + let settings = test_image_provider_settings(base_url); + let http_client = build_image_http_client(&settings).expect("client should build"); + + let generated = create_image_generation( + &http_client, + &settings, + "测试提示词", + None, + "1024x1024", + 1, + &["data:image/png;base64,iVBORw0KGgpyZXN0".to_string()], + "测试 ImageProvider 图片生成失败", + ) + .await + .expect("referenced generation should go through the edit endpoint"); + + assert_eq!(generated.images.len(), 1); + let requests = requests.lock().await; + assert_eq!(requests.len(), 1); + assert!(requests[0].starts_with("POST /v1/images/edits")); + assert!(requests[0].contains(&format!("\r\n\r\n{GPT_IMAGE_2_5_EDIT_MODEL}\r\n"))); + server.abort(); +} + #[tokio::test] async fn image_generation_does_not_fallback_on_auth_failure() { let (base_url, server, requests) = start_http_response_sequence(vec![MockResponse {