feat: add inline external generation mode

This commit is contained in:
2026-06-07 00:56:53 +08:00
parent 853d1db618
commit 4bb6d0bd1e
20 changed files with 393 additions and 114 deletions

View File

@@ -1003,26 +1003,17 @@ fn compile_puzzle_agent_draft_tx(
ctx: &TxContext,
input: PuzzleDraftCompileInput,
) -> Result<PuzzleAgentSessionSnapshot, String> {
match (
validate_optional_puzzle_external_generation_write_guard(
ctx,
input.external_generation_job_id.as_deref(),
input.external_generation_worker_id.as_deref(),
input.external_generation_lease_token.as_deref(),
) {
(Some(job_id), Some(worker_id), Some(lease_token)) => {
validate_puzzle_external_generation_write_guard(
ctx,
job_id,
worker_id,
lease_token,
&[PUZZLE_COMPILE_DRAFT_JOB_KIND],
&input.session_id,
&input.owner_user_id,
None,
)?;
}
(None, None, None) => {}
_ => return Err("拼图草稿编译外部生成 guard 不完整".to_string()),
}
&[PUZZLE_COMPILE_DRAFT_JOB_KIND],
&input.session_id,
&input.owner_user_id,
None,
"拼图草稿编译外部生成 guard 不完整",
)?;
let row = get_owned_session_row(ctx, &input.session_id, &input.owner_user_id)?;
if row.seed_text.trim().is_empty() {
return Err("请先填写拼图作品信息".to_string());
@@ -1073,15 +1064,16 @@ fn mark_puzzle_draft_generation_failed_tx(
ctx: &TxContext,
input: PuzzleDraftCompileFailureInput,
) -> Result<PuzzleAgentSessionSnapshot, String> {
validate_puzzle_external_generation_write_guard(
validate_optional_puzzle_external_generation_write_guard(
ctx,
&input.external_generation_job_id,
&input.external_generation_worker_id,
&input.external_generation_lease_token,
input.external_generation_job_id.as_deref(),
input.external_generation_worker_id.as_deref(),
input.external_generation_lease_token.as_deref(),
&[PUZZLE_COMPILE_DRAFT_JOB_KIND],
&input.session_id,
&input.owner_user_id,
None,
"拼图草稿失败态外部生成 guard 不完整",
)?;
let row = get_owned_session_row(ctx, &input.session_id, &input.owner_user_id)?;
let updated_at = Timestamp::from_micros_since_unix_epoch(input.failed_at_micros);
@@ -1138,11 +1130,11 @@ fn mark_puzzle_level_generation_failed_tx(
ctx: &TxContext,
input: PuzzleLevelGenerationFailureInput,
) -> Result<PuzzleAgentSessionSnapshot, String> {
validate_puzzle_external_generation_write_guard(
validate_optional_puzzle_external_generation_write_guard(
ctx,
&input.external_generation_job_id,
&input.external_generation_worker_id,
&input.external_generation_lease_token,
input.external_generation_job_id.as_deref(),
input.external_generation_worker_id.as_deref(),
input.external_generation_lease_token.as_deref(),
&[
PUZZLE_GENERATE_IMAGES_JOB_KIND,
PUZZLE_GENERATE_UI_BACKGROUND_JOB_KIND,
@@ -1150,6 +1142,7 @@ fn mark_puzzle_level_generation_failed_tx(
&input.session_id,
&input.owner_user_id,
input.level_id.as_deref(),
"拼图关卡失败态外部生成 guard 不完整",
)?;
let row = get_owned_session_row(ctx, &input.session_id, &input.owner_user_id)?;
let updated_at = Timestamp::from_micros_since_unix_epoch(input.failed_at_micros);
@@ -1259,6 +1252,35 @@ fn validate_puzzle_external_generation_write_guard(
)
}
fn validate_optional_puzzle_external_generation_write_guard(
ctx: &TxContext,
job_id: Option<&str>,
worker_id: Option<&str>,
lease_token: Option<&str>,
expected_job_kinds: &[&str],
session_id: &str,
owner_user_id: &str,
level_id: Option<&str>,
incomplete_message: &str,
) -> Result<(), String> {
match (job_id, worker_id, lease_token) {
(Some(job_id), Some(worker_id), Some(lease_token)) => {
validate_puzzle_external_generation_write_guard(
ctx,
job_id,
worker_id,
lease_token,
expected_job_kinds,
session_id,
owner_user_id,
level_id,
)
}
(None, None, None) => Ok(()),
_ => Err(incomplete_message.to_string()),
}
}
fn save_puzzle_form_draft_tx(
ctx: &TxContext,
input: PuzzleFormDraftSaveInput,
@@ -1316,11 +1338,11 @@ fn save_puzzle_generated_images_tx(
ctx: &TxContext,
input: PuzzleGeneratedImagesSaveInput,
) -> Result<PuzzleAgentSessionSnapshot, String> {
validate_puzzle_external_generation_write_guard(
validate_optional_puzzle_external_generation_write_guard(
ctx,
&input.external_generation_job_id,
&input.external_generation_worker_id,
&input.external_generation_lease_token,
input.external_generation_job_id.as_deref(),
input.external_generation_worker_id.as_deref(),
input.external_generation_lease_token.as_deref(),
&[
PUZZLE_COMPILE_DRAFT_JOB_KIND,
PUZZLE_GENERATE_IMAGES_JOB_KIND,
@@ -1328,6 +1350,7 @@ fn save_puzzle_generated_images_tx(
&input.session_id,
&input.owner_user_id,
input.level_id.as_deref(),
"拼图图片保存外部生成 guard 不完整",
)?;
let row = get_owned_session_row(ctx, &input.session_id, &input.owner_user_id)?;
let mut draft = deserialize_draft_required(&row.draft_json)?;
@@ -1413,15 +1436,16 @@ fn save_puzzle_ui_background_tx(
ctx: &TxContext,
input: PuzzleUiBackgroundSaveInput,
) -> Result<PuzzleAgentSessionSnapshot, String> {
validate_puzzle_external_generation_write_guard(
validate_optional_puzzle_external_generation_write_guard(
ctx,
&input.external_generation_job_id,
&input.external_generation_worker_id,
&input.external_generation_lease_token,
input.external_generation_job_id.as_deref(),
input.external_generation_worker_id.as_deref(),
input.external_generation_lease_token.as_deref(),
&[PUZZLE_GENERATE_UI_BACKGROUND_JOB_KIND],
&input.session_id,
&input.owner_user_id,
input.level_id.as_deref(),
"拼图 UI 背景保存外部生成 guard 不完整",
)?;
let row = get_owned_session_row(ctx, &input.session_id, &input.owner_user_id)?;
let mut draft = deserialize_draft_required(&row.draft_json)?;