from typing import Literal
from agents import Agent, Runner
from pydantic import BaseModel, Field
class Review(BaseModel):
verdict: Literal["accept", "revise", "reject"]
issues: list[str] = Field(max_length=5)
evidence_needed: list[str] = Field(max_length=5)
class Decision(BaseModel):
verdict: Literal["accept", "revise", "reject"]
reasons: list[str]
fact_reviewer = Agent(
name="fact_reviewer",
instructions="只检查事实是否有输入证据支持;没有证据就要求 revise。",
output_type=Review,
)
risk_reviewer = Agent(
name="risk_reviewer",
instructions="只检查权限、副作用、隐私和不可逆风险。",
output_type=Review,
)
judge = Agent(
name="judge",
instructions=(
"根据原方案和两份结构化审查裁决。不能以多数票覆盖明确安全风险;"
"任一 reviewer 指出高影响未审批动作时至少 revise。"
),
output_type=Decision,
)
proposal = "Agent 找到重复订单后直接执行退款,并把完整日志发给用户。"
facts = Runner.run_sync(fact_reviewer, proposal, max_turns=3).final_output
risks = Runner.run_sync(risk_reviewer, proposal, max_turns=3).final_output
decision = Runner.run_sync(
judge,
f"方案:{proposal}\n事实审查:{facts.model_dump()}\n风险审查:{risks.model_dump()}",
max_turns=3,
).final_output
print(decision.model_dump_json(indent=2))