From 65e73eee0227123e532510d86216407da5ccf342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 8 Sep 2026 23:25:47 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=20Raw=20=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=88=90=E5=8A=9F=E8=BF=BD=E8=B8=AA=20?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=88=90=E5=8A=9F=E4=BB=BB=E5=8A=A1=E4=B8=8E?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E6=95=B0=E9=87=8F=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E4=B8=8A=E6=B8=B8=E5=93=8D=E5=BA=94=E5=92=8C=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E9=98=B6=E6=AE=B5=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server-rs/crates/api-server/src/raw_image.rs | 32 +++++++++++++++++-- .../src/vector_engine/raw_edit.rs | 2 +- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/server-rs/crates/api-server/src/raw_image.rs b/server-rs/crates/api-server/src/raw_image.rs index a41bcfd73..2ef7a9be1 100644 --- a/server-rs/crates/api-server/src/raw_image.rs +++ b/server-rs/crates/api-server/src/raw_image.rs @@ -25,7 +25,9 @@ use crate::{ }, request_context::RequestContext, state::AppState, + tracking::record_external_generation_run_after_success, }; +use time::OffsetDateTime; #[derive(Clone, Debug, Deserialize)] #[serde(rename_all = "camelCase", deny_unknown_fields)] @@ -66,8 +68,7 @@ pub(crate) async fn edit_raw_image( let prepared = tokio::task::spawn_blocking(move || prepare_request(payload)) .await .map_err(|error| { - AppError::from_status(StatusCode::INTERNAL_SERVER_ERROR) - .with_message(error.to_string()) + AppError::from_status(StatusCode::INTERNAL_SERVER_ERROR).with_message(error.to_string()) })??; let settings = require_openai_image_settings(&state)?.with_external_api_audit_context( &request_context, @@ -79,6 +80,17 @@ pub(crate) async fn edit_raw_image( let request_id = request_context.request_id().to_string(); let points_cost = raw_image_edit_price(&state, prepared.width, prepared.height).await?; let audit_settings = settings.clone(); + let tracking_state = audit_settings.external_api_audit_state.clone(); + let tracking_payload = json!({ + "width": prepared.width, + "height": prepared.height, + "promptChars": prepared.prompt.chars().count(), + "hasMask": prepared.options.mask.is_some(), + "quality": prepared.options.quality.as_deref(), + "background": prepared.options.background.as_deref(), + "outputFormat": prepared.options.output_format.as_deref(), + }); + let started_at_micros = (OffsetDateTime::now_utc().unix_timestamp_nanos() / 1_000) as i64; let operation = async move { let generated = match create_vector_engine_raw_image_edit( &provider_settings, @@ -95,6 +107,7 @@ pub(crate) async fn edit_raw_image( return Err(map_platform_image_error(error)); } }; + let task_id = generated.task_id.clone(); let data = generated .images .into_iter() @@ -102,6 +115,21 @@ pub(crate) async fn edit_raw_image( b64_json: BASE64_STANDARD.encode(image.bytes), }) .collect(); + if let Some(state) = tracking_state.as_ref() { + record_external_generation_run_after_success( + state, + platform_image::VECTOR_ENGINE_PROVIDER, + "raw_image_edit", + "raw_image_edit", + tracking_payload, + started_at_micros, + true, + None, + Some(task_id), + Some(json!({ "imageCount": data.len() })), + ) + .await; + } Ok::<_, AppError>(RawImageEditResponse { data }) }; let result = with_editor_generation_durable_billing_boundary( diff --git a/server-rs/crates/platform-image/src/vector_engine/raw_edit.rs b/server-rs/crates/platform-image/src/vector_engine/raw_edit.rs index be96e8515..faa042e43 100644 --- a/server-rs/crates/platform-image/src/vector_engine/raw_edit.rs +++ b/server-rs/crates/platform-image/src/vector_engine/raw_edit.rs @@ -174,7 +174,7 @@ pub async fn create_vector_engine_raw_image_edit( tracing::info!( provider = VECTOR_ENGINE_PROVIDER, endpoint = %url, - status, + status = status.as_u16(), prompt_chars, reference_image_count, elapsed_ms = started_at.elapsed().as_millis() as u64,