可易

添加人工在环审批步骤(预览)

可易团队阅读约 2 分钟

Microsoft Foundry 预览中的长时托管智能体可在审批点暂停并保持任务标识,等人回复后从同一处理函数继续,等待期间不必占着请求。

#添加人工在环审批步骤(预览)

有些智能体工作流必须停下来等人:批准一项操作、回答一个问题,或补上缺失的输入,然后再继续。长时运行的托管智能体(long-running hosted agent)可以无限期暂停以等待该回复,而不必一直占着一条请求,也不会丢掉进度,因为多轮链(multi-turn chain)会在各轮之间保持。

注意

长时运行智能体处于预览(preview)。应用程序接口(API)与包版本可能变更。

暂停与恢复如何工作

@multi_turn_task 链不会在某一轮返回时结束。它会进入 suspended 状态,并在同一个 task_id 下保持存活。同一 task_id 上的下一次输入,会以 ctx.entry_mode == "resumed" 重新进入同一个处理函数。这正是人工在环(human-in-the-loop)暂停的自然形态:

  1. 智能体一直做工作,直到需要一个人来做决定。
  2. 它返回一轮,请求这个决定(链进入暂停)。
  3. 有人回复;你的应用在同一个 task_id 上开始新的一轮。
  4. 处理函数恢复,并带着这个人的回答继续。

因为这条链是持久的,等待可以任意长:几分钟、几小时或几天,并且能熬过容器重启。

实现审批这一轮

from azure.ai.agentserver.core.tasks import multi_turn_task, TaskContext

@multi_turn_task(name="expense-approval")
async def approve(ctx: TaskContext[dict]) -> dict:
    if ctx.entry_mode == "resumed":
        # We're back with the human's decision.
        decision = ctx.input["decision"]
        if decision == "approved":
            await submit_expense(ctx.metadata["expense_id"])
            return {"status": "submitted"}
        return {"status": "rejected"}

    # First turn: prepare the request and ask for a decision.
    expense = await build_expense(ctx.input)
    ctx.metadata["expense_id"] = expense.id          # small watermark, survives the pause
    return {"status": "awaiting_approval", "summary": expense.summary}

从你的应用程序驱动它:

# Turn 1 - agent produces an approval request, then the chain suspends.
r1 = await approve.run(task_id="exp-42", input={"amount": 1200, "category": "travel"})
# ... show r1["summary"] to a human and wait for their reply (could be much later) ...

# Turn 2 - same task_id resumes the suspended chain.
r2 = await approve.run(task_id="exp-42", input={"decision": "approved"})

提示

ctx.metadata 里只保留小引用(一笔费用标识、一个步骤号)。把完整请求、历史或生成的产物放进你自己的存储,或放进框架检查点。见《管理长时运行智能体的状态》。

把框架中断和响应(Responses)一起用

如果你在后台响应之上,基于某个智能体框架来构建(例如 LangGraph 或 Microsoft Agent Framework),就使用该框架自己的中断与审批机制。让响应保持韧性,使这次暂停能熬过重启。设置 resilient_background=True,并在中断点持久化该框架的检查点。恢复时,从该检查点重建。见《崩溃后恢复长时运行的工作》。

清理一条已经结束的链

只有当你显式删除时,才会删掉一条已暂停的链。系统会在一次性 @task 记录完成时自动清理它们。

await approve.delete("exp-42")

PRIMARY_SOURCE: https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/add-human-in-the-loop

  • #人工审批
  • #托管智能体
  • #Microsoft Foundry
  • #长时任务