跳到主要内容

Agent 快速开始

查看 Markdown

把你所用框架的 Agent 作为持久化 Dex Session 运行,然后在对话中途停止它,看它继续运行。整个过程大约 10 分钟。

1. 获取示例并运行

在一个终端中运行 dexcli dev(安装 dexcli)。在第二个终端中下载示例,并向 Agent 询问一个订单:

curl -sL https://codeload.github.com/superdurable/dex/tar.gz/main | tar -xz --strip-components=3 dex-main/examples/python/agent-harnesses
cd agent-harnesses
uv sync --locked
uv run --frozen python -m agent_harness_examples.quick_start claude-agent-sdk "Look up order 1001"

需要 Python 3.11 或更高版本以及 uv。它会调用 Claude,所以先设置 ANTHROPIC_API_KEY。

它会打印 Session ID 和 Agent 的回复:

Session claude-agent-sdk-quick-start-<8 hex digits>
Agent: <the model's reply about order 1001>

例子: examples/python/agent-harnesses/agent_harness_examples/quick_start/__main__.py

这个 Agent 是一个小型订单客服 Agent,有两个 tool。look_up_order 读取订单,因此 Dex 可以重试它。cancel_order 取消尚未发货的订单;它是写操作,所以最多运行一次,并且要等人批准后才运行。

2. 批准一次写操作

用消息 Cancel order 1002 运行同一条命令。程序会停下来询问:

cancel_order wants to run with {"order_id":"1002","reason":"requested by the customer"}. Approve? [y/N]

Session 在 AwaitToolApproval 中等待。输入 y,Agent 就会取消订单并回复。审批 介绍应用如何读取并答复正在等待的调用,以及人如何在 Dex Web 中批准它。

3. 在 Agent 等待时停止程序

再次要求取消订单 1002;每次不带 --session-id 运行都会启动一个新 Session。程序请你批准时,按 Ctrl+C。程序、它的 Worker 和 Client 都会停止,而 Session 仍在 Dex 中等待。

在同一个文件夹中再次运行第 1 步的命令,用 --session-id SESSION_ID 替换消息。新的 Worker 启动,程序会询问同一个 cancel_order 调用。输入 y。订单只取消一次,重启之前的模型调用仍然是已完成状态。

  1. WorkerRunModel 调用模型。模型请求调用 cancel_order。
  2. Dex Servercancel_order 在 AwaitToolApproval 中等待。这个等待由 Dex Server 保管。
  3. WorkerWorker 停止。
  4. Dex Server审批继续在 Dex Server 上等待,不需要 Worker。
  5. 重启后的 WorkerWorker 重新启动并连接 Dex。
  6. Dex Server你在程序的提示符处批准 cancel_order,Dex Server 记录这个答复。
  7. 重启后的 Workercancel_order 只运行一次。模型写出回复。
  8. Dex Server这一轮完成。
停止前的模型调用保持已完成,cancel_order 只运行了一次。

4. 在 tool 运行时停止

在 Tool Call 中途崩溃是更难处理的情况。示例可以放慢每次 Tool Call,让你有时间停止它。

  1. 在第 1 步的命令前加上 DEX_ORDER_DESK_TOOL_DELAY_SECONDS=20,询问订单 1001。
  2. 在 20 秒内像崩溃那样杀掉程序。崩溃相当于 kill 信号;Ctrl+C 会先让正在运行的调用完成。
pkill -9 -f agent_harness_examples.quick_start

例子: examples/python/agent-harnesses/agent_harness_examples/quick_start/__main__.py

  1. 带上 --session-id、不带消息,再次运行程序。Agent 会回复订单信息。
  2. 查看这次 Tool Call 是如何运行的:
dexcli flow history --all SESSION_ID | jq '.events[]
| select(.payload.context.stepType == "CallTool")
| .payload.context | {finalAttempt, failure: .lastFailureInfo.details.detail}'

finalAttempt 是 2。第一次尝试在 Worker 断开时失败;因为 look_up_order 是读操作,Dex 在新的 Worker 上再次运行了它。它之前的模型调用只运行了一次。

现在对写操作做同样的事:设置延迟后要求取消订单 1002,批准它,在 20 秒内杀掉程序,再带上 --session-id 运行。Dex 把 cancel_order 记录为 outcome_unknown,并且不会再运行第二次,因为它是非幂等写操作。Agent 会告诉用户结果未知,由你的应用在任何人重试之前先检查订单系统。核对 outcome_unknown 介绍具体做法。

是什么让它变得持久

这个示例先按框架本身的写法写好 Agent,再把它包装进 Dex Agent Session,并为每个 tool 指定策略。你的代码有哪些变化给出了每个框架的两个版本。

下一步

  • 把 Dex 加入你的 Agent 把这个 Agent 移到你自己的应用中,提供完整文件和一个 web app。
  • Session 解释哪些内容在重启后保留了下来,以及你所用框架的 turn 如何对应到 Step。
  • Tool Call 解释为什么 cancel_order 最多运行一次,以及写操作可能运行两次的那一种少见情况。
  • 内置 Agent Loop 不用框架构建 Agent。
  • 订单客服 Agent 是完整的示例,包含它的 HTTP route。