会话保持对话,而不是文件系统。要快照和还原代理所做的文件更改,请使用文件检查点。
resume 和 fork 的方法,以及关于在主机之间恢复会话需要了解的内容。
选择一种方法
您需要多少会话处理取决于应用的形状。当您发送应该共享上下文的多个提示时,会话管理就会发挥作用。在单个query() 调用中,代理已经根据需要进行了尽可能多的轮次,权限提示和 AskUserQuestion 是在循环中处理的(它们不会结束调用)。
Continue、resume 和 fork
Continue、resume 和 fork 是您在query() 上设置的选项字段(Python 中的 ClaudeAgentOptions,TypeScript 中的 Options)。
Continue 和 resume 都会选择现有会话并添加到其中。区别在于它们如何找到该会话:
- Continue 在当前目录中查找最近的会话。您无需跟踪任何内容。当您的应用一次运行一个对话时效果很好。
- Resume 采用特定的会话 ID。您跟踪 ID。当您有多个会话(例如,多用户应用中每个用户一个)或想要返回到不是最近的会话时需要。
自动会话管理
两个 SDK 都提供了一个接口,可以跨调用为您跟踪会话状态,因此您无需手动传递 ID。将这些用于单个进程中的多轮对话。Python:ClaudeSDKClient
ClaudeSDKClient 在内部处理会话 ID。每次调用 client.query() 都会自动继续同一会话。调用 client.receive_response() 以迭代当前查询的消息。使用客户端作为异步上下文管理器,以便为您处理连接设置和拆卸,或手动调用 connect() 和 disconnect()。
此示例针对同一 client 运行两个查询。第一个要求代理分析一个模块;第二个要求它重构该模块。因为两个调用都通过同一客户端实例进行,第二个查询具有来自第一个查询的完整上下文,无需任何显式 resume 或会话 ID:
Python
ClaudeSDKClient 与独立 query() 函数的详细信息,请参阅 Python SDK 参考。
TypeScript:continue: true
TypeScript SDK 没有像 Python 的 ClaudeSDKClient 那样的会话保持客户端对象。相反,在每个后续 query() 调用上传递 continue: true,SDK 会在当前目录中选择最近的会话。无需 ID 跟踪。
此示例进行两个单独的 query() 调用。第一个创建一个新会话;第二个设置 continue: true,这告诉 SDK 在磁盘上查找并恢复最近的会话。代理具有来自第一个调用的完整上下文:
TypeScript
实验性的 V2 会话 API(提供了带有
send / stream 模式的 createSession())已在 TypeScript Agent SDK 0.3.142 中移除。使用 query() 函数和本页面上描述的会话选项。将会话选项与 query() 一起使用
捕获会话 ID
Resume 和 fork 需要会话 ID。从结果消息上的session_id 字段读取它(Python 中的 ResultMessage,TypeScript 中的 SDKResultMessage),该字段存在于每个结果上,无论成功还是错误。在 TypeScript 中,ID 也可以作为初始化 SystemMessage 上的直接字段更早获得;在 Python 中,它嵌套在 SystemMessage.data 内。
按 ID 恢复
将会话 ID 传递给resume 以返回到该特定会话。代理从会话中断的任何地方继续,具有完整的上下文。恢复的常见原因:
- 跟进已完成的任务。 代理已经分析了某些内容;现在您希望它根据该分析采取行动,而无需重新读取文件。
- 从限制中恢复。 第一次运行以
error_max_turns或error_max_budget_usd结束(请参阅处理结果);使用更高的限制恢复。 - 重启您的进程。 您在关闭前捕获了 ID,并希望恢复对话。
SessionStore 适配器将记录镜像到共享存储。
Fork 以探索替代方案
Forking 创建一个新会话,从原始会话历史记录的副本开始,但从该点开始分支。fork 获得自己的会话 ID;原始的 ID 和历史记录保持不变。您最终会得到两个独立的会话,可以分别恢复。Forking 分支对话历史记录,而不是文件系统。如果 forked 代理编辑文件,这些更改是真实的,对在同一目录中工作的任何会话都可见。要分支和还原文件更改,请使用文件检查点。
session_id 中分析了一个身份验证模块,并希望探索 OAuth2 而不丢失 JWT 焦点线程。第一个块 forks 会话并捕获 fork 的 ID(forked_id);第二个块恢复原始 session_id 以继续沿着 JWT 路径。您现在有两个会话 ID 指向两个单独的历史记录:
forkedId 与原始会话 ID 不同。恢复原始会话仍然继续 JWT 线程,这证实了 fork 没有修改原始历史记录。
跨主机恢复
会话文件是创建它们的机器的本地文件。要在不同的主机上恢复会话(CI 工作者、临时容器、无服务器),您有两个选项:- 移动会话文件。 从第一次运行中保持
~/.claude/projects/<encoded-cwd>/<session-id>.jsonl,并在调用resume之前将其恢复到新主机上的相同路径。cwd必须匹配。 - 不依赖会话恢复。 捕获您需要的结果(分析输出、决定、文件差异)作为应用状态,并将其传递到新会话的提示中。这通常比在周围运送记录文件更强大。
listSessions() 和 getSessionMessages(),Python 中的 list_sessions() 和 get_session_messages()。使用它们来构建自定义会话选择器、清理逻辑或记录查看器。
两个 SDK 也公开了用于查找和改变单个会话的函数:Python 中的 get_session_info()、rename_session() 和 tag_session(),以及 TypeScript 中的 getSessionInfo()、renameSession() 和 tagSession()。使用它们按标签组织会话或给它们人类可读的标题。
相关资源
- 代理循环如何工作:了解会话中的轮次、消息和上下文累积
- 文件检查点:快照和还原代理在会话中所做的文件更改
- Python
ClaudeAgentOptions:Python 的完整会话选项参考 - TypeScript
Options:TypeScript 的完整会话选项参考