Defer offline batch labeling until after inference results are ready.

Run visualization from pipeline/result paths without vis_pending copies, publish labeled MP4 for browser only after visualize_result_video completes, and purge batch cache after the background labeling task finishes.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin
2026-05-22 11:19:12 +08:00
parent 580e3c0d3b
commit 78f96e24b1
5 changed files with 118 additions and 166 deletions

View File

@@ -29,7 +29,6 @@ from app.services.video_batch_cleanup import (
purge_expired_pipeline_inputs,
purge_expired_visualizations,
purge_surgery_batch_tree,
stage_visualization_pending,
)
from app.algo_host import BatchAlgorithmService
from app.services.voice_terminal_hub import VoiceTerminalHub
@@ -66,12 +65,28 @@ def _require_site_config_path() -> Path:
def _background_finalize_visualization(
runner: BatchAlgorithmService,
surgery_id: str,
*,
video_path: Path,
result_path: Path,
digest: str,
candidate_key: str,
) -> None:
try:
runner.finalize_visualization(surgery_id=surgery_id)
runner.finalize_visualization(
surgery_id=surgery_id,
video_path=video_path,
result_path=result_path,
)
except Exception:
logger.exception("offline batch visualization failed surgery_id={}", surgery_id)
finally:
purge_batch_artifacts(
runner.root_dir,
surgery_id,
digest=digest,
candidate_key=candidate_key,
)
purge_surgery_batch_tree(runner.root_dir, surgery_id)
purge_expired_visualizations(
runner.root_dir,
ttl_hours=float(bp.VIDEO_BATCH_VIS_TTL_HOURS),
@@ -178,23 +193,24 @@ async def offline_batch(
len(result.details),
)
cache_input = result.input_path
if include_visualization:
stage_visualization_pending(
background_tasks.add_task(
_background_finalize_visualization,
runner,
surgery_id,
video_path=result.input_path,
result_path=result.output_path,
digest=result.video_sha256,
candidate_key=result.candidate_cache_key,
)
else:
purge_batch_artifacts(
runner.root_dir,
surgery_id,
source_mp4=cache_input,
result_tsv=result.output_path,
digest=result.video_sha256,
candidate_key=result.candidate_cache_key,
)
background_tasks.add_task(_background_finalize_visualization, runner, surgery_id)
purge_batch_artifacts(
runner.root_dir,
surgery_id,
digest=result.video_sha256,
candidate_key=result.candidate_cache_key,
)
purge_surgery_batch_tree(runner.root_dir, surgery_id)
purge_surgery_batch_tree(runner.root_dir, surgery_id)
visualization_url: str | None = None
if include_visualization: