feat: add resource library and real image workflow
This commit is contained in:
@@ -26,14 +26,13 @@ with workflow.unsafe.imports_passed_through():
|
||||
from app.workers.activities.review_activities import mark_workflow_failed_activity
|
||||
from app.workers.activities.scene_activities import run_scene_activity
|
||||
from app.workers.activities.tryon_activities import prepare_model_activity, run_tryon_activity
|
||||
from app.workers.workflows.timeout_policy import DEFAULT_ACTIVITY_TIMEOUT, activity_timeout_for_task_queue
|
||||
from app.workers.workflows.types import (
|
||||
PipelineWorkflowInput,
|
||||
StepActivityInput,
|
||||
WorkflowFailureActivityInput,
|
||||
)
|
||||
|
||||
|
||||
ACTIVITY_TIMEOUT = timedelta(seconds=30)
|
||||
ACTIVITY_RETRY_POLICY = RetryPolicy(
|
||||
initial_interval=timedelta(seconds=1),
|
||||
backoff_coefficient=2.0,
|
||||
@@ -64,6 +63,8 @@ class LowEndPipelineWorkflow:
|
||||
try:
|
||||
# 每个步骤都通过 execute_activity 触发真正执行。
|
||||
# workflow 自己不做计算,只负责调度。
|
||||
# prepare_model 的职责是把“模特资源 + 订单上下文”整理成后续可消费的人物底图。
|
||||
# 这一步产出的 prepared.asset_id 会作为 tryon 的 source_asset_id。
|
||||
prepared = await workflow.execute_activity(
|
||||
prepare_model_activity,
|
||||
StepActivityInput(
|
||||
@@ -76,12 +77,14 @@ class LowEndPipelineWorkflow:
|
||||
scene_ref_asset_id=payload.scene_ref_asset_id,
|
||||
),
|
||||
task_queue=IMAGE_PIPELINE_CONTROL_TASK_QUEUE,
|
||||
start_to_close_timeout=ACTIVITY_TIMEOUT,
|
||||
start_to_close_timeout=activity_timeout_for_task_queue(IMAGE_PIPELINE_CONTROL_TASK_QUEUE),
|
||||
retry_policy=ACTIVITY_RETRY_POLICY,
|
||||
)
|
||||
|
||||
current_step = WorkflowStepName.TRYON
|
||||
# 下游步骤通过 source_asset_id 引用上一步生成的资产。
|
||||
# tryon 是换装主步骤:把 prepared 模特图和 garment_asset_id 组合成试衣结果。
|
||||
# 它产出的 tryon_result.asset_id 是后续 scene / qc 的基础输入。
|
||||
tryon_result = await workflow.execute_activity(
|
||||
run_tryon_activity,
|
||||
StepActivityInput(
|
||||
@@ -92,38 +95,46 @@ class LowEndPipelineWorkflow:
|
||||
garment_asset_id=payload.garment_asset_id,
|
||||
),
|
||||
task_queue=IMAGE_PIPELINE_IMAGE_GEN_TASK_QUEUE,
|
||||
start_to_close_timeout=ACTIVITY_TIMEOUT,
|
||||
start_to_close_timeout=activity_timeout_for_task_queue(IMAGE_PIPELINE_IMAGE_GEN_TASK_QUEUE),
|
||||
retry_policy=ACTIVITY_RETRY_POLICY,
|
||||
)
|
||||
|
||||
current_step = WorkflowStepName.SCENE
|
||||
scene_result = await workflow.execute_activity(
|
||||
run_scene_activity,
|
||||
StepActivityInput(
|
||||
order_id=payload.order_id,
|
||||
workflow_run_id=payload.workflow_run_id,
|
||||
step_name=WorkflowStepName.SCENE,
|
||||
source_asset_id=tryon_result.asset_id,
|
||||
scene_ref_asset_id=payload.scene_ref_asset_id,
|
||||
),
|
||||
task_queue=IMAGE_PIPELINE_IMAGE_GEN_TASK_QUEUE,
|
||||
start_to_close_timeout=ACTIVITY_TIMEOUT,
|
||||
retry_policy=ACTIVITY_RETRY_POLICY,
|
||||
)
|
||||
scene_source_asset_id = tryon_result.asset_id
|
||||
if payload.scene_ref_asset_id is not None:
|
||||
current_step = WorkflowStepName.SCENE
|
||||
# scene 是可选步骤。
|
||||
# 有场景图时,用 scene_ref_asset_id 把 tryon 结果合成到目标背景;
|
||||
# 没有场景图时,直接沿用 tryon 结果继续往下走。
|
||||
scene_result = await workflow.execute_activity(
|
||||
run_scene_activity,
|
||||
StepActivityInput(
|
||||
order_id=payload.order_id,
|
||||
workflow_run_id=payload.workflow_run_id,
|
||||
step_name=WorkflowStepName.SCENE,
|
||||
source_asset_id=tryon_result.asset_id,
|
||||
scene_ref_asset_id=payload.scene_ref_asset_id,
|
||||
),
|
||||
task_queue=IMAGE_PIPELINE_IMAGE_GEN_TASK_QUEUE,
|
||||
start_to_close_timeout=activity_timeout_for_task_queue(IMAGE_PIPELINE_IMAGE_GEN_TASK_QUEUE),
|
||||
retry_policy=ACTIVITY_RETRY_POLICY,
|
||||
)
|
||||
scene_source_asset_id = scene_result.asset_id
|
||||
|
||||
current_step = WorkflowStepName.QC
|
||||
# QC 是流程里的“闸门”。
|
||||
# 如果这里不通过,低端流程直接失败,不会再 export。
|
||||
# source_asset_id 指向当前链路里“最接近最终成品”的那张图:
|
||||
# 有场景时是 scene 结果,没有场景时就是 tryon 结果。
|
||||
qc_result = await workflow.execute_activity(
|
||||
run_qc_activity,
|
||||
StepActivityInput(
|
||||
order_id=payload.order_id,
|
||||
workflow_run_id=payload.workflow_run_id,
|
||||
step_name=WorkflowStepName.QC,
|
||||
source_asset_id=scene_result.asset_id,
|
||||
source_asset_id=scene_source_asset_id,
|
||||
),
|
||||
task_queue=IMAGE_PIPELINE_QC_TASK_QUEUE,
|
||||
start_to_close_timeout=ACTIVITY_TIMEOUT,
|
||||
start_to_close_timeout=activity_timeout_for_task_queue(IMAGE_PIPELINE_QC_TASK_QUEUE),
|
||||
retry_policy=ACTIVITY_RETRY_POLICY,
|
||||
)
|
||||
|
||||
@@ -134,16 +145,17 @@ class LowEndPipelineWorkflow:
|
||||
current_step = WorkflowStepName.EXPORT
|
||||
# candidate_asset_ids 是 QC 推荐可导出的候选资产。
|
||||
# 当前 MVP 只会返回一个候选;如果没有,就退回 scene 结果导出。
|
||||
# export 是最后的收口步骤:生成最终交付资产,并把订单状态写成 succeeded。
|
||||
final_result = await workflow.execute_activity(
|
||||
run_export_activity,
|
||||
StepActivityInput(
|
||||
order_id=payload.order_id,
|
||||
workflow_run_id=payload.workflow_run_id,
|
||||
step_name=WorkflowStepName.EXPORT,
|
||||
source_asset_id=(qc_result.candidate_asset_ids or [scene_result.asset_id])[0],
|
||||
source_asset_id=(qc_result.candidate_asset_ids or [scene_source_asset_id])[0],
|
||||
),
|
||||
task_queue=IMAGE_PIPELINE_EXPORT_TASK_QUEUE,
|
||||
start_to_close_timeout=ACTIVITY_TIMEOUT,
|
||||
start_to_close_timeout=activity_timeout_for_task_queue(IMAGE_PIPELINE_EXPORT_TASK_QUEUE),
|
||||
retry_policy=ACTIVITY_RETRY_POLICY,
|
||||
)
|
||||
return {
|
||||
@@ -177,6 +189,6 @@ class LowEndPipelineWorkflow:
|
||||
message=message,
|
||||
),
|
||||
task_queue=IMAGE_PIPELINE_CONTROL_TASK_QUEUE,
|
||||
start_to_close_timeout=ACTIVITY_TIMEOUT,
|
||||
start_to_close_timeout=DEFAULT_ACTIVITY_TIMEOUT,
|
||||
retry_policy=ACTIVITY_RETRY_POLICY,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user