Merge pull request '修复冲突错误' (#26) from master into release
Reviewed-on: #26
This commit was merged in pull request #26.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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(),
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user