fix: surface resilient subject asset generation

This commit is contained in:
2026-05-18 18:15:45 +08:00
parent cc4c021074
commit 095c6f1c00
8 changed files with 251 additions and 177 deletions

View File

@@ -4505,6 +4505,8 @@ def generate_subject_assets(job_id: str, idx: int, element_id: str, req: Generat
)
models = [GPT_IMAGE_MODEL]
generated: list[SubjectAsset] = []
generation_errors: list[str] = []
first_generation_error: RuntimeError | None = None
try:
for view, view_label in _subject_view_labels(req.subject_kind, req.views):
closeup_view = view in {"bust", "back_detail", "bust_front", "bust_left_45", "bust_right_45", "back_neck_detail"} or "detail" in view
@@ -4572,7 +4574,11 @@ def generate_subject_assets(job_id: str, idx: int, element_id: str, req: Generat
raise RuntimeError("subject asset edit reference image missing")
img_bytes, _mode = _image_edit_call(model_src, prompt, models=models, fallback_text=False, max_attempts=3, max_side=1280)
except RuntimeError as e:
raise HTTPException(_image_error_status(e), f"subject asset {view} failed: {e}")
if first_generation_error is None:
first_generation_error = e
generation_errors.append(f"{view_label}: {e}")
print(f"[subject assets] view failed job={job_id} view={view} error={e}", flush=True)
continue
asset_id = f"subject_{idx:03d}_{element_id}_{view}_{uuid.uuid4().hex[:8]}"
out_path = job_dir(job_id) / "assets" / f"{asset_id}.jpg"
@@ -4596,6 +4602,11 @@ def generate_subject_assets(job_id: str, idx: int, element_id: str, req: Generat
try: p.unlink()
except OSError: pass
if not generated:
if first_generation_error:
raise HTTPException(_image_error_status(first_generation_error), f"subject assets failed: {'; '.join(generation_errors[:3])}")
raise HTTPException(500, "subject assets failed: no images generated")
src = _source_frame_path(job_id, idx)
new_frames = []
for f in job.frames:
@@ -4614,7 +4625,13 @@ def generate_subject_assets(job_id: str, idx: int, element_id: str, req: Generat
current_assets = [asset for asset in current_assets if asset.view not in replaced_views]
e.subject_assets = current_assets + generated
new_frames.append(f)
update(job, frames=new_frames, message=f"主体资产包生成完成 · {el.name_zh} · {len(generated)}")
if generation_errors:
msg = f"主体资产包部分生成完成 · {el.name_zh} · {len(generated)} 张,失败 {len(generation_errors)}"
error_msg = "".join(generation_errors[:3])
else:
msg = f"主体资产包生成完成 · {el.name_zh} · {len(generated)}"
error_msg = ""
update(job, frames=new_frames, message=msg, error=error_msg)
return job