- 作者:@josevalim
- 支持者:@benbrandt
电梯演讲
您提议进行什么更改?我们提议添加基于现有会话”分叉”新会话的能力。 这将允许我们使用当前对话作为上下文来生成拉取 请求描述、摘要等,而不会污染用户历史记录。
现状
今天的事情是如何运作的,这导致了什么问题?我们为什么要改变?想象一下,我们想要总结当前对话以用于未来的聊天。如果我们发送一条消息 要求摘要,它将成为其上下文的一部分,影响未来的用户交互。 因此,我们希望能够分叉会话、发出额外消息,然后关闭分叉。
我们提议对此做什么
您提议如何改善情况?添加一个 “session/fork” 方法。
美好的未来
一旦这个功能存在,事情将如何发展?我们将能够实现需要使用当前聊天而不会污染其历史的功能,范围从摘要到潜在的子代理。 我也可以看到此功能在将来扩展以支持可选 消息 ID,因此分叉发生在特定消息上,允许客户端实现 类似编辑以前消息的功能。
实施细节和计划
告诉我更多关于您的实施。您的详细实施计划是什么?我们提议添加一个新的 “session/fork” 方法。代理必须通过在其功能中返回
session: { fork : {} } 来声明此选项可用。该对象保留用于声明未来功能,例如从特定消息、工具调用或类似内容分叉。
然后客户端能够请求给定会话的分叉:
session/load 相同的选项,例如 cwd 和 mcpServers。
类似地,代理将响应可选数据,例如配置选项,与 session/load 相同。
如果特定会话或给定选项不支持分叉,代理可能会回复错误,例如如果代理不支持与初始会话不同工作目录的分叉。
常见问题
在编写本文档的过程中或随后的讨论中出现了哪些问题?Q:是否应该引入新方法还是扩展 “session/new”? 它们必须不同,因为它们实际上需要不同的选项。 例如,“session/new” 有诸如功能和 MCP 之类的选项,这些选项在分叉时不建议设置, 因为正在分叉的上下文是用其他工具构建的,分叉可能接受 messageId 作为检查点。 Q:分叉是否只接受
sessionId 或也接受其他选项,类似于 session/load?
最初,我们提议只接受 sessionId,但这将使在不活动的会话中分叉更加困难,
例如在 claude-code-acp 等代理中,因为 Claude 不保留会话的配置 MCP 服务器。
将分叉限制为仅已 active 的会话将限制其有用性。
此外,允许传递不同选项还允许通过使用新选项对它们进行分叉来动态添加 MCP 服务器到现有会话的功能(如果代理支持)。如果不支持,客户端仍然可以显示适当的错误消息。
您考虑了哪些替代方法,为什么选择这一个?
没有。这个提案受到 Claude Agent SDK 中公开的功能的启发。它也必须针对其他代理进行验证。修订历史
- 2025-11-17:提到功能格式,更新 FAQ。
- 2025-11-20:添加请求格式并更新功能格式。
- 2025-12-10:调整 fork 选项以与
session/load保持一致。