from polos import workflow, WorkflowContext
@workflow(id="order_processing")
async def order_processing(ctx: WorkflowContext, payload: OrderPayload) -> OrderResult:
# Step 1: Process payment
result = await ctx.step.agent_invoke_and_wait(
"start_order",
order_agent.with_input(
f"Process payment for order {payload.order_id}. "
f"Charge customer {payload.customer_id} for ${payload.amount:.2f}."
)
)
output: OrderAgentOutput = result.result
charge_id = output.action_details.charge_id
# Step 2: Check if fraud review is requested
if output.action_requested == "fraud_review":
# Suspend for human review (up to 24 hours)
resume_data = await ctx.step.suspend(
"fraud_review",
data={
"order_id": payload.order_id,
"amount": payload.amount,
"charge_id": charge_id,
"message": "Please review this order for fraud",
},
timeout=86400,
)
if not resume_data.get("data", {}).get("approved", False):
return OrderResult(status="rejected", charge_id=charge_id)
# Fraud approved - send confirmation
await ctx.step.agent_invoke_and_wait(
"send_confirmation",
order_agent.with_input(
f"Fraud review APPROVED for order {payload.order_id}. "
f"Send confirmation email to {payload.customer_email}."
)
)
return OrderResult(
status="completed",
charge_id=charge_id,
fraud_review_required=True,
fraud_approved=True,
)
# No fraud review needed - agent already sent confirmation
return OrderResult(status="completed", charge_id=charge_id)