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 {