跳到主要内容

Session

查看 Markdown

持久化 Agent Session 是承载一段对话的一次 Flow run。每次模型调用和每次 Tool Call 都在一个 Step 中运行。因此崩溃、部署或长时间等待都不会重复已经完成的工作。

持久化 Agent Session

一次 Flow run 就是一个 Agent Session,Flow ID 就是 Session ID。Session Flow 由 Dex Agents 构建:Python 中是 dex-agents package,TypeScript 中是 @superdurable/dex-agents。框架适配器在其上接入一个 Agent 框架。

Session 把对话保存在 Attribute 中。Session 等待下一条用户消息时不占用 Worker 的 task slot。

模型调用在 RunModel Step 中运行。在大多数 harness 中,每个 RunModel Step 进行一次模型调用,每次 Tool Call 在自己的 Step 中运行。一个 turn 的 Step 如下:

Step作用
RunModel进行一次模型调用并记录响应。
CallTool运行一次读操作或幂等写操作调用。Dex 可以重试它。
CallSingleAttemptTool运行一次其他写操作调用。Dex 最多运行它一次。
AwaitToolApproval等待人批准或拒绝一次 Tool Call。见 审批。
ResumeTurn等待这次模型响应的所有 tool result,然后回到 RunModel。

同一次模型响应中的 Tool Call 并行运行。全部完成后,ResumeTurn 把它们的结果发给模型。

延迟与成本

每个 Session Step 都是 SYNC 的:Dex 在 Worker 拿到 Step 之前提交它的开始,在 Session 继续之前提交它的结果,两者都写入对象存储。如果模型在一个 turn 中请求三个 tool 然后作答,这个 turn 需要六个 Step:两个 RunModel、三个 tool Step 和一个 ResumeTurn。性能 测得,在一台 2 vCPU 的 server 上、负载为峰值一半时,一个 SYNC Step 的 p50 约为 105 ms。三个 tool Step 并行运行,所以这个 turn 依次等待四个 Step。按这个 p50 计算,它们在模型和 tool 本身的时间之外,给这个 turn 增加约 0.4 秒。

RunModel Step 在 30 分钟内最多尝试三次。每次重试都会把模型调用再发给 provider 一次,因此要再付一次 token 费用。对于昂贵的调用,可以用 Python 中的 run_model_limit 或 TypeScript 中的 runModelLimit 减少尝试次数。默认值见 Step timeouts(英文)。

崩溃只会重复当时正在运行的 Step。Dex 不会重放整个循环。因此 Agent 代码不需要遵守确定性规则,代码修改会在下一个 Step 生效。

有两个 harness 会把更多工作放进一个 Step:

  • Claude Agent SDK。 Claude Code CLI 在一个 RunModel Step 中运行 turn 的一个 segment。Segment 包含模型调用和读操作 Tool Call,失败的 segment 会整体重新运行。写操作一次一个地离开 segment,各自在自己的 Step 中运行,所以它们永远不会并行。
  • LangChain 与 LangGraph。 一个 RunModel Step 把 graph 运行到它的下一批 Tool Call。Graph 在途中可能进行多次模型调用,重试时会把它们一起重复。

Session 记住什么

一个 Session 保存一段对话:它的 message、Tool Call 以及 Tool Call 的结果。新的 Session 从空白开始。Dex Agents 没有在不同 Session 之间共享的 memory。

长期 memory,例如用户的偏好或过往订单,请保存在你自己掌控的存储中。它可以是你的数据库,也可以是你为每个用户保留的一个 Flow。给 Agent 一个读取它的 tool,以及一个使用合适 policy 写入它的 tool。

已停止的 Session 在保留期内仍然可读,之后 Dex 会删除它。默认值见 History and retention(英文)。

框架支持

框架支持介绍你的框架怎样运行一个 turn、有哪些 Session 功能,以及它的限制。

下一步