---
title: "Session"
description: "持久化 Agent Session 是承载一段对话的一次 Flow run。每次模型调用和每次 Tool Call 都在一个 Step 中运行。因此崩溃、部署或长时间等待都不会重复已经完成的工作。"
canonical_url: "https://docs.superdurable.io/zh-Hans/agent-frameworks/sessions/"
source: "docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/agent-frameworks/sessions.mdx"
locale: "zh-Hans"
---

> 供 AI Agent 使用的全部页面索引：https://docs.superdurable.io/zh-Hans/llms.txt

# Session

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

> **图示**：你的应用的 Client 把消息发送到 Session Flow。在 Flow 内部，你的框架的 Agent Loop 以 Step 运行：模型调用（RunModel）、Tool Call（CallTool）、审批（AwaitToolApproval），然后是下一次模型调用。Turn 继续之前，Dex 先记录每个 Step 的结果，这些 Step 调用你的模型和 Tool。

<a id="a-durable-agent-session"></a>

## 持久化 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。见 [审批](https://docs.superdurable.io/zh-Hans/agent-frameworks/approvals.md)。 |
| `ResumeTurn`            | 等待这次模型响应的所有 tool result，然后回到 `RunModel`。                                                         |

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

<a id="latency-and-cost"></a>

### 延迟与成本

每个 Session Step 都是 SYNC 的：Dex 在 Worker 拿到 Step 之前提交它的开始，在 Session 继续之前提交它的结果，两者都写入对象存储。如果模型在一个 turn 中请求三个 tool 然后作答，这个 turn 需要六个 Step：两个 `RunModel`、三个 tool Step 和一个 `ResumeTurn`。[性能](https://docs.superdurable.io/zh-Hans/intro/performance.md#latency-below-the-peak) 测得，在一台 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](https://docs.superdurable.io/zh-Hans/reference/agents/workers.md#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 在途中可能进行多次模型调用，重试时会把它们一起重复。

<a id="what-a-session-remembers"></a>

### Session 记住什么

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

长期 memory，例如用户的偏好或过往订单，请保存在你自己掌控的存储中。它可以是你的数据库，也可以是你为每个用户保留的一个 Flow。给 Agent 一个读取它的 tool，以及一个使用合适 [policy](https://docs.superdurable.io/zh-Hans/agent-frameworks/tool-calls.md#tool-policies-and-approvals) 写入它的 tool。

已停止的 Session 在保留期内仍然可读，之后 Dex 会删除它。默认值见 [History and retention](https://docs.superdurable.io/zh-Hans/reference/agents/session-limits.md#history)（英文）。

<a id="how-each-framework-runs-a-turn"></a>

<a id="features-by-harness"></a>

<a id="limits"></a>

<a id="framework-support"></a>

## 框架支持

[框架支持](https://docs.superdurable.io/zh-Hans/agent-frameworks/framework-support.md)介绍你的框架怎样运行一个 turn、有哪些 Session 功能，以及它的限制。

<a id="next"></a>

## 下一步

- [Tool Call](https://docs.superdurable.io/zh-Hans/agent-frameworks/tool-calls.md)
- [部署期间的 RPC](https://docs.superdurable.io/zh-Hans/agent-frameworks/production.md#rpcs-during-a-deploy)：没有 Worker 运行时 `send_user_message` 会怎样
- [Agents reference](https://docs.superdurable.io/zh-Hans/reference/agents.md)（英文）
