fix: enrich image failure audit metadata
This commit is contained in:
@@ -1085,6 +1085,7 @@ pub(crate) fn attach_puzzle_level_asset_bundle(
|
||||
|
||||
pub(crate) async fn generate_puzzle_initial_ui_background_required(
|
||||
state: &PuzzleApiState,
|
||||
request_context: &RequestContext,
|
||||
owner_user_id: &str,
|
||||
session_id: &str,
|
||||
draft: &PuzzleResultDraftRecord,
|
||||
@@ -1093,6 +1094,7 @@ pub(crate) async fn generate_puzzle_initial_ui_background_required(
|
||||
let prompt = resolve_puzzle_initial_ui_background_prompt(draft, target_level);
|
||||
let generated = generate_puzzle_ui_background_image(
|
||||
state,
|
||||
request_context,
|
||||
owner_user_id,
|
||||
session_id,
|
||||
target_level.level_name.as_str(),
|
||||
@@ -1104,6 +1106,7 @@ pub(crate) async fn generate_puzzle_initial_ui_background_required(
|
||||
|
||||
pub(crate) async fn generate_puzzle_level_asset_bundle_required(
|
||||
state: &PuzzleApiState,
|
||||
request_context: &RequestContext,
|
||||
owner_user_id: &str,
|
||||
session_id: &str,
|
||||
target_level: &PuzzleDraftLevelRecord,
|
||||
@@ -1111,6 +1114,7 @@ pub(crate) async fn generate_puzzle_level_asset_bundle_required(
|
||||
) -> Result<GeneratedPuzzleLevelAssetBundle, AppError> {
|
||||
generate_puzzle_level_asset_bundle(
|
||||
state,
|
||||
request_context,
|
||||
owner_user_id,
|
||||
session_id,
|
||||
target_level.level_name.as_str(),
|
||||
@@ -1175,6 +1179,7 @@ pub(crate) fn find_puzzle_level_for_initial_asset_check<'a>(
|
||||
|
||||
pub(crate) async fn compile_puzzle_draft_with_initial_cover(
|
||||
state: &PuzzleApiState,
|
||||
request_context: &RequestContext,
|
||||
session_id: String,
|
||||
owner_user_id: String,
|
||||
prompt_text: Option<&str>,
|
||||
@@ -1195,6 +1200,7 @@ pub(crate) async fn compile_puzzle_draft_with_initial_cover(
|
||||
})?;
|
||||
let mut target_level = select_puzzle_level_for_api(&draft, None)?;
|
||||
let fallback_level_name = target_level.level_name.clone();
|
||||
let (_, profile_id) = build_stable_puzzle_work_ids(&compiled_session.session_id);
|
||||
let image_prompt = resolve_puzzle_draft_cover_prompt(
|
||||
prompt_text,
|
||||
&target_level.picture_description,
|
||||
@@ -1209,6 +1215,7 @@ pub(crate) async fn compile_puzzle_draft_with_initial_cover(
|
||||
let mut candidates = generate_puzzle_image_candidates(
|
||||
state,
|
||||
owner_user_id.as_str(),
|
||||
Some(profile_id.as_str()),
|
||||
&compiled_session.session_id,
|
||||
&target_level.level_name,
|
||||
&image_prompt,
|
||||
@@ -1262,6 +1269,7 @@ pub(crate) async fn compile_puzzle_draft_with_initial_cover(
|
||||
{
|
||||
let asset_bundle = generate_puzzle_level_asset_bundle_required(
|
||||
state,
|
||||
request_context,
|
||||
owner_user_id.as_str(),
|
||||
compiled_session.session_id.as_str(),
|
||||
&target_level,
|
||||
@@ -1369,7 +1377,6 @@ pub(crate) async fn compile_puzzle_draft_with_initial_cover(
|
||||
Err(error)
|
||||
}
|
||||
})?;
|
||||
let (_, profile_id) = build_stable_puzzle_work_ids(&compiled_session.session_id);
|
||||
match state
|
||||
.spacetime_client()
|
||||
.update_puzzle_work(PuzzleWorkUpsertRecordInput {
|
||||
@@ -1441,6 +1448,7 @@ pub(crate) async fn compile_puzzle_draft_with_initial_cover(
|
||||
|
||||
pub(crate) async fn compile_puzzle_draft_with_uploaded_cover(
|
||||
state: &PuzzleApiState,
|
||||
request_context: &RequestContext,
|
||||
session_id: String,
|
||||
owner_user_id: String,
|
||||
prompt_text: Option<&str>,
|
||||
@@ -1544,6 +1552,7 @@ pub(crate) async fn compile_puzzle_draft_with_uploaded_cover(
|
||||
.await?;
|
||||
let asset_bundle = generate_puzzle_level_asset_bundle_required(
|
||||
state,
|
||||
request_context,
|
||||
owner_user_id.as_str(),
|
||||
compiled_session.session_id.as_str(),
|
||||
&target_level,
|
||||
|
||||
@@ -78,6 +78,7 @@ pub(crate) async fn create_uploaded_puzzle_image_candidate(
|
||||
pub(crate) async fn generate_puzzle_image_candidates(
|
||||
state: &PuzzleApiState,
|
||||
owner_user_id: &str,
|
||||
profile_id: Option<&str>,
|
||||
session_id: &str,
|
||||
level_name: &str,
|
||||
prompt: &str,
|
||||
@@ -150,6 +151,11 @@ pub(crate) async fn generate_puzzle_image_candidates(
|
||||
// 中文注释:SpacetimeDB reducer 不能做外部 I/O,参考图读取与外部生图都必须停留在 api-server。
|
||||
// 中文注释:拼图作品资产统一按 1:1 正方形生成,前端运行时也按正方形棋盘切块承载。
|
||||
let settings = require_puzzle_vector_engine_settings(state)?;
|
||||
let settings = PuzzleVectorEngineSettings {
|
||||
external_api_audit_user_id: Some(owner_user_id.to_string()),
|
||||
external_api_audit_profile_id: profile_id.map(ToOwned::to_owned),
|
||||
..settings
|
||||
};
|
||||
let vector_engine_started_at = Instant::now();
|
||||
let generated = if should_use_reference_image_generation {
|
||||
let reference_image = reference_image.as_ref().ok_or_else(|| {
|
||||
@@ -255,12 +261,18 @@ pub(crate) async fn generate_puzzle_image_candidates(
|
||||
|
||||
pub(crate) async fn generate_puzzle_ui_background_image(
|
||||
state: &PuzzleApiState,
|
||||
request_context: &RequestContext,
|
||||
owner_user_id: &str,
|
||||
session_id: &str,
|
||||
level_name: &str,
|
||||
prompt: &str,
|
||||
) -> Result<GeneratedPuzzleUiBackgroundResponse, AppError> {
|
||||
let settings = require_openai_image_settings(state.root_state())?;
|
||||
let settings = require_openai_image_settings(state.root_state())?
|
||||
.with_external_api_audit_context(
|
||||
Some(owner_user_id.to_string()),
|
||||
Some(session_id.to_string()),
|
||||
)
|
||||
.with_external_api_audit_request_id(Some(request_context.request_id().to_string()));
|
||||
let http_client = build_openai_image_http_client(&settings)?;
|
||||
let generated = create_openai_image_generation(
|
||||
&http_client,
|
||||
@@ -292,12 +304,14 @@ pub(crate) async fn generate_puzzle_ui_background_image(
|
||||
|
||||
pub(crate) async fn generate_puzzle_level_asset_bundle(
|
||||
state: &PuzzleApiState,
|
||||
request_context: &RequestContext,
|
||||
owner_user_id: &str,
|
||||
session_id: &str,
|
||||
level_name: &str,
|
||||
puzzle_image: &PuzzleDownloadedImage,
|
||||
) -> Result<GeneratedPuzzleLevelAssetBundle, AppError> {
|
||||
let settings = require_puzzle_vector_engine_settings(state)?;
|
||||
let settings = require_puzzle_vector_engine_settings(state)?
|
||||
.with_external_api_audit_request_id(Some(request_context.request_id().to_string()));
|
||||
let http_client = build_puzzle_image_http_client(state, PuzzleImageModel::GptImage2)?;
|
||||
let puzzle_reference = build_puzzle_downloaded_image_reference(puzzle_image);
|
||||
let scene_generated = create_puzzle_vector_engine_image_generation(
|
||||
|
||||
@@ -71,12 +71,14 @@ pub async fn generate_puzzle_onboarding_work(
|
||||
|
||||
let now = current_utc_micros();
|
||||
let session_id = build_prefixed_uuid_id("puzzle-onboarding-");
|
||||
let onboarding_profile_id = format!("onboarding-profile-{now}");
|
||||
let naming = generate_puzzle_first_level_name(&state, prompt_text.as_str()).await;
|
||||
let tags =
|
||||
generate_puzzle_work_tags(&state, naming.level_name.as_str(), prompt_text.as_str()).await;
|
||||
let candidates = generate_puzzle_image_candidates(
|
||||
&state,
|
||||
"onboarding-guest",
|
||||
Some(onboarding_profile_id.as_str()),
|
||||
session_id.as_str(),
|
||||
naming.level_name.as_str(),
|
||||
prompt_text.as_str(),
|
||||
@@ -132,7 +134,7 @@ pub async fn generate_puzzle_onboarding_work(
|
||||
));
|
||||
let item = PuzzleWorkProfileRecord {
|
||||
work_id: format!("onboarding-work-{now}"),
|
||||
profile_id: format!("onboarding-profile-{now}"),
|
||||
profile_id: onboarding_profile_id,
|
||||
owner_user_id: "onboarding-guest".to_string(),
|
||||
source_session_id: None,
|
||||
author_display_name: "陶泥儿主".to_string(),
|
||||
@@ -675,6 +677,7 @@ pub async fn execute_puzzle_agent_action(
|
||||
async {
|
||||
compile_puzzle_draft_with_initial_cover(
|
||||
&state,
|
||||
&request_context,
|
||||
compile_session_id.clone(),
|
||||
owner_user_id.clone(),
|
||||
prompt_text,
|
||||
@@ -689,6 +692,7 @@ pub async fn execute_puzzle_agent_action(
|
||||
} else {
|
||||
compile_puzzle_draft_with_uploaded_cover(
|
||||
&state,
|
||||
&request_context,
|
||||
compile_session_id.clone(),
|
||||
owner_user_id.clone(),
|
||||
prompt_text,
|
||||
@@ -861,9 +865,11 @@ pub async fn execute_puzzle_agent_action(
|
||||
.await?,
|
||||
]
|
||||
} else {
|
||||
let (_, profile_id) = build_stable_puzzle_work_ids(&session.session_id);
|
||||
generate_puzzle_image_candidates(
|
||||
&state,
|
||||
owner_user_id.as_str(),
|
||||
Some(profile_id.as_str()),
|
||||
&session.session_id,
|
||||
&target_level.level_name,
|
||||
&prompt,
|
||||
@@ -920,6 +926,7 @@ pub async fn execute_puzzle_agent_action(
|
||||
})?;
|
||||
let asset_bundle = generate_puzzle_level_asset_bundle_required(
|
||||
&state,
|
||||
&request_context,
|
||||
owner_user_id.as_str(),
|
||||
&session.session_id,
|
||||
&target_level,
|
||||
@@ -1079,6 +1086,7 @@ pub async fn execute_puzzle_agent_action(
|
||||
);
|
||||
let generated = generate_puzzle_ui_background_image(
|
||||
&state,
|
||||
&request_context,
|
||||
owner_user_id.as_str(),
|
||||
&session.session_id,
|
||||
&target_level.level_name,
|
||||
|
||||
@@ -31,6 +31,9 @@ pub(crate) struct PuzzleVectorEngineSettings {
|
||||
pub(crate) api_key: String,
|
||||
pub(crate) request_timeout_ms: u64,
|
||||
pub(crate) external_api_audit_state: Option<AppState>,
|
||||
pub(crate) external_api_audit_user_id: Option<String>,
|
||||
pub(crate) external_api_audit_profile_id: Option<String>,
|
||||
pub(crate) external_api_audit_request_id: Option<String>,
|
||||
}
|
||||
|
||||
pub(crate) struct PuzzleGeneratedImages {
|
||||
@@ -100,8 +103,19 @@ impl PuzzleVectorEngineSettings {
|
||||
api_key: self.api_key.clone(),
|
||||
request_timeout_ms: self.request_timeout_ms,
|
||||
external_api_audit_state: self.external_api_audit_state.clone(),
|
||||
external_api_audit_user_id: self.external_api_audit_user_id.clone(),
|
||||
external_api_audit_profile_id: self.external_api_audit_profile_id.clone(),
|
||||
external_api_audit_request_id: self.external_api_audit_request_id.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn with_external_api_audit_request_id(
|
||||
mut self,
|
||||
request_id: Option<String>,
|
||||
) -> Self {
|
||||
self.external_api_audit_request_id = request_id;
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) struct ParsedPuzzleImageDataUrl {
|
||||
@@ -177,6 +191,9 @@ pub(crate) fn require_puzzle_vector_engine_settings(
|
||||
api_key: api_key.to_string(),
|
||||
request_timeout_ms: state.vector_engine_image_request_timeout_ms().max(1),
|
||||
external_api_audit_state: Some(state.root_state().clone()),
|
||||
external_api_audit_user_id: None,
|
||||
external_api_audit_profile_id: None,
|
||||
external_api_audit_request_id: None,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user