为 Raw 成功响应收紧类型透传

使用 typed JSON DTO 提取并原样转发 b64_json

不解码图片内容且忽略 output_format 回显
This commit is contained in:
2026-09-09 11:44:31 +08:00
parent b3693765ef
commit 6c77de4a36
@@ -1,7 +1,7 @@
use std::time::{Duration, Instant};
use reqwest::multipart::{Form, Part};
use serde_json::Value;
use serde::Deserialize;
use super::{
audit::build_failure_audit,
@@ -26,6 +26,17 @@ pub struct RawImageEditOptions {
pub mask: Option<ReferenceImage>,
}
#[derive(Debug, Deserialize)]
struct RawImageEditResponsePayload {
id: Option<String>,
data: Option<Vec<RawImageEditResponseEntry>>,
}
#[derive(Debug, Deserialize)]
struct RawImageEditResponseEntry {
b64_json: Option<String>,
}
pub const RAW_IMAGE_MAX_EDGE: u32 = GPT_IMAGE_2_MAX_EDGE;
pub const RAW_IMAGE_DIMENSION_ALIGNMENT: u32 = GPT_IMAGE_2_DIMENSION_ALIGNMENT;
pub const RAW_IMAGE_MIN_PIXELS: u64 = GPT_IMAGE_2_MIN_PIXELS;
@@ -221,7 +232,7 @@ pub async fn create_vector_engine_raw_image_edit(
audit: Some(audit),
});
}
let payload: Value = match serde_json::from_str(body.as_str()) {
let payload: RawImageEditResponsePayload = match serde_json::from_str(body.as_str()) {
Ok(payload) => payload,
Err(error) => {
let message = format!("{failure_context}:上游响应不是 JSON{error}");
@@ -249,7 +260,12 @@ pub async fn create_vector_engine_raw_image_edit(
});
}
};
let b64_images = extract_b64_images(&payload);
let b64_images = payload
.data
.unwrap_or_default()
.into_iter()
.filter_map(|entry| entry.b64_json)
.collect::<Vec<_>>();
if b64_images.is_empty() {
let message = format!("{failure_context}:上游未返回 b64_json 图片");
let audit = build_failure_audit(
@@ -275,27 +291,12 @@ pub async fn create_vector_engine_raw_image_edit(
});
}
Ok(RawImageEditResult {
task_id: payload
.get("id")
.and_then(Value::as_str)
.unwrap_or("raw-image-edit")
.to_string(),
task_id: payload.id.unwrap_or_else(|| "raw-image-edit".to_string()),
b64_images,
recovered_failure_audits: Vec::new(),
})
}
fn extract_b64_images(payload: &Value) -> Vec<String> {
payload
.get("data")
.and_then(Value::as_array)
.into_iter()
.flatten()
.filter_map(|entry| entry.get("b64_json").and_then(Value::as_str))
.map(str::to_string)
.collect()
}
fn invalid_request(context: &str, message: String) -> PlatformImageError {
PlatformImageError::InvalidRequest {
provider: VECTOR_ENGINE_PROVIDER,
@@ -390,13 +391,20 @@ mod tests {
#[test]
fn raw_result_forwards_b64_without_decoding_or_using_output_format() {
let payload = json!({
let payload = r#"{
"output_format": "png",
"data": [{"b64_json": "not-base64-but-forwarded", "output_format": "jpeg"}]
});
}"#;
let payload: RawImageEditResponsePayload =
serde_json::from_str(payload).expect("response envelope");
assert_eq!(
extract_b64_images(&payload),
payload
.data
.unwrap_or_default()
.into_iter()
.filter_map(|entry| entry.b64_json)
.collect::<Vec<_>>(),
vec!["not-base64-but-forwarded".to_string()]
);
}