为 Raw 成功响应收紧类型透传
使用 typed JSON DTO 提取并原样转发 b64_json 不解码图片内容且忽略 output_format 回显
This commit is contained in:
@@ -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()]
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user