修复冲突错误

This commit is contained in:
kdletters
2026-05-19 00:07:43 +08:00
parent d1adfa3406
commit 5e03b3d2f2
4 changed files with 62 additions and 3972 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1154,20 +1154,17 @@ pub(crate) async fn compile_puzzle_draft_with_initial_cover(
&target_level.picture_description, &target_level.picture_description,
&draft.summary, &draft.summary,
); );
let image_level_name = if target_level.level_name.trim().is_empty() { let generated_naming =
build_fallback_puzzle_first_level_name(&target_level.picture_description) generate_puzzle_first_level_name(state, &target_level.picture_description).await;
} else { target_level.level_name = generated_naming.level_name.clone();
target_level.level_name.clone() target_level.ui_background_prompt = generated_naming.ui_background_prompt.clone();
}; let mut generated_metadata = generated_naming;
// 中文注释:首图 prompt 只依赖画面描述关卡名分支可以和生图分支并行OSS 临时路径使用已有名或确定性兜底名 // 点击生成草稿时一次性完成首图生成、UI 背景生成与正式图选定,前端只展示进度,不再承担业务编排
let level_name_future =
generate_puzzle_first_level_name(state, &target_level.picture_description);
// 点击生成草稿时一次性完成首图生成与正式图选定,前端只展示进度,不再承担业务编排。
let candidates_future = generate_puzzle_image_candidates( let candidates_future = generate_puzzle_image_candidates(
state, state,
owner_user_id.as_str(), owner_user_id.as_str(),
&compiled_session.session_id, &compiled_session.session_id,
&image_level_name, &target_level.level_name,
&image_prompt, &image_prompt,
reference_image_src, reference_image_src,
true, true,
@@ -1175,33 +1172,26 @@ pub(crate) async fn compile_puzzle_draft_with_initial_cover(
1, 1,
target_level.candidates.len(), target_level.candidates.len(),
); );
let (generated_naming, candidates_result) = tokio::join!(level_name_future, candidates_future); let ui_background_future = generate_puzzle_initial_ui_background_required(
target_level.level_name = generated_naming.level_name.clone();
target_level.ui_background_prompt = generated_naming.ui_background_prompt.clone();
let mut generated_metadata = generated_naming;
let candidates = candidates_result?;
let selected_candidate_id = candidates
.iter()
.find(|candidate| candidate.record.selected)
.or_else(|| candidates.first())
.map(|candidate| candidate.record.candidate_id.clone())
.ok_or_else(|| {
AppError::from_status(StatusCode::BAD_GATEWAY).with_details(json!({
"provider": PUZZLE_AGENT_API_BASE_PROVIDER,
"message": "拼图候选图生成结果为空",
}))
})?;
if let Some(refined_naming) = generate_puzzle_first_level_name_from_image(
state, state,
target_level.picture_description.as_str(), owner_user_id.as_str(),
&candidates[0].downloaded_image, compiled_session.session_id.as_str(),
) &draft,
.await &target_level,
);
// 中文注释:命名稳定后并行发起首关图与 UI 背景,避免两次外部生图串行等待。
let (candidates_result, ui_background_result) =
tokio::join!(candidates_future, ui_background_future);
let mut candidates = candidates_result?;
if let Some(first_candidate) = candidates.first()
&& let Some(refined_naming) = generate_puzzle_first_level_name_from_image(
state,
target_level.picture_description.as_str(),
&first_candidate.downloaded_image,
)
.await
{ {
target_level.level_name = refined_naming.level_name; target_level.level_name = refined_naming.level_name;
if refined_naming.ui_background_prompt.is_some() {
target_level.ui_background_prompt = refined_naming.ui_background_prompt;
}
if refined_naming.work_description.is_some() { if refined_naming.work_description.is_some() {
generated_metadata.work_description = refined_naming.work_description; generated_metadata.work_description = refined_naming.work_description;
} }
@@ -1214,15 +1204,22 @@ pub(crate) async fn compile_puzzle_draft_with_initial_cover(
let generated_level_name = target_level.level_name.clone(); let generated_level_name = target_level.level_name.clone();
let mut updated_levels = let mut updated_levels =
build_puzzle_levels_with_primary_update(&draft, &target_level, reference_image_src); build_puzzle_levels_with_primary_update(&draft, &target_level, reference_image_src);
for candidate in &mut candidates {
candidate.record.prompt = image_prompt.clone();
}
let selected_candidate_id = candidates
.iter()
.find(|candidate| candidate.record.selected)
.or_else(|| candidates.first())
.map(|candidate| candidate.record.candidate_id.clone())
.ok_or_else(|| {
AppError::from_status(StatusCode::BAD_GATEWAY).with_details(json!({
"provider": PUZZLE_AGENT_API_BASE_PROVIDER,
"message": "拼图候选图生成结果为空",
}))
})?;
// 中文注释:拼图草稿音频生成临时关闭,首版生成只补首图与 UI 背景。 // 中文注释:拼图草稿音频生成临时关闭,首版生成只补首图与 UI 背景。
let (ui_prompt, ui_background) = generate_puzzle_initial_ui_background_required( let (ui_prompt, ui_background) = ui_background_result?;
state,
owner_user_id.as_str(),
compiled_session.session_id.as_str(),
&draft,
&target_level,
)
.await?;
attach_puzzle_level_ui_background( attach_puzzle_level_ui_background(
&mut updated_levels, &mut updated_levels,
target_level.level_id.as_str(), target_level.level_id.as_str(),
@@ -1443,11 +1440,6 @@ pub(crate) async fn compile_puzzle_draft_with_uploaded_cover(
&target_level.picture_description, &target_level.picture_description,
&draft.summary, &draft.summary,
); );
let image_level_name = if target_level.level_name.trim().is_empty() {
build_fallback_puzzle_first_level_name(&target_level.picture_description)
} else {
target_level.level_name.clone()
};
// 中文注释:关闭 AI 重绘时首关图不请求 VectorEngine上传图直接成为首关正式图候选。 // 中文注释:关闭 AI 重绘时首关图不请求 VectorEngine上传图直接成为首关正式图候选。
let candidate_id = format!( let candidate_id = format!(
"{}-candidate-{}", "{}-candidate-{}",
@@ -1466,21 +1458,8 @@ pub(crate) async fn compile_puzzle_draft_with_uploaded_cover(
target_level.picture_description.as_str(), target_level.picture_description.as_str(),
&uploaded_downloaded_image, &uploaded_downloaded_image,
); );
let persist_upload_future = persist_puzzle_generated_asset( let (mut generated_naming, refined_naming) =
state, tokio::join!(level_name_future, image_level_name_future);
owner_user_id.as_str(),
&compiled_session.session_id,
image_level_name.as_str(),
candidate_id.as_str(),
"uploaded-direct",
uploaded_downloaded_image.clone(),
current_utc_micros(),
);
let (mut generated_naming, refined_naming, persisted_upload_result) = tokio::join!(
level_name_future,
image_level_name_future,
persist_upload_future
);
if let Some(refined_naming) = refined_naming { if let Some(refined_naming) = refined_naming {
generated_naming.level_name = refined_naming.level_name; generated_naming.level_name = refined_naming.level_name;
if refined_naming.ui_background_prompt.is_some() { if refined_naming.ui_background_prompt.is_some() {
@@ -1499,18 +1478,30 @@ pub(crate) async fn compile_puzzle_draft_with_uploaded_cover(
generated_metadata.level_name = target_level.level_name.clone(); generated_metadata.level_name = target_level.level_name.clone();
generated_metadata.ui_background_prompt = target_level.ui_background_prompt.clone(); generated_metadata.ui_background_prompt = target_level.ui_background_prompt.clone();
let generated_level_name = target_level.level_name.clone(); let generated_level_name = target_level.level_name.clone();
let persisted_upload = persisted_upload_result?;
let mut updated_levels = let mut updated_levels =
build_puzzle_levels_with_primary_update(&draft, &target_level, reference_image_src); build_puzzle_levels_with_primary_update(&draft, &target_level, reference_image_src);
// 中文注释:直用上传图时同样只补 UI 背景;音频生成入口临时关闭。 let persist_upload_future = persist_puzzle_generated_asset(
let (ui_prompt, ui_background) = generate_puzzle_initial_ui_background_required( state,
owner_user_id.as_str(),
&compiled_session.session_id,
target_level.level_name.as_str(),
candidate_id.as_str(),
"uploaded-direct",
uploaded_downloaded_image.clone(),
current_utc_micros(),
);
let ui_background_future = generate_puzzle_initial_ui_background_required(
state, state,
owner_user_id.as_str(), owner_user_id.as_str(),
compiled_session.session_id.as_str(), compiled_session.session_id.as_str(),
&draft, &draft,
&target_level, &target_level,
) );
.await?; // 中文注释:直用上传图时并行完成上传图持久化与 UI 背景生成;音频生成入口临时关闭。
let (persisted_upload_result, ui_background_result) =
tokio::join!(persist_upload_future, ui_background_future);
let persisted_upload = persisted_upload_result?;
let (ui_prompt, ui_background) = ui_background_result?;
attach_puzzle_level_ui_background( attach_puzzle_level_ui_background(
&mut updated_levels, &mut updated_levels,
target_level.level_id.as_str(), target_level.level_id.as_str(),

View File

@@ -664,9 +664,9 @@ pub async fn execute_puzzle_agent_action(
"compile_puzzle_draft", "compile_puzzle_draft",
"首关拼图草稿", "首关拼图草稿",
if ai_redraw { if ai_redraw {
"已编译首关草稿、生成首关画面并写入正式草稿。" "已编译首关草稿、并行生成首关画面和 UI 背景并写入正式草稿。"
} else { } else {
"已编译首关草稿,并直接应用上传图片为第一关图片。" "已编译首关草稿,并直接应用上传图片、生成 UI 背景为第一关图片。"
}, },
session, session,
) )

View File

@@ -338,7 +338,7 @@ pub(super) fn map_puzzle_work_summary_response(
.saturating_sub(item.point_incentive_claimed_points), .saturating_sub(item.point_incentive_claimed_points),
publish_ready: item.publish_ready, publish_ready: item.publish_ready,
generation_status, generation_status,
levels: Vec::new(), levels: item.levels.iter().map(|x|map_puzzle_draft_level_response(x.clone())).collect(),
} }
} }
@@ -603,4 +603,4 @@ pub(super) fn build_puzzle_welcome_text(seed_text: &str) -> String {
} }
"拼图创作信息已准备好。".to_string() "拼图创作信息已准备好。".to_string()
} }