goose 中如何用 Edit in Place 与 Fork Session 修正走偏的对话方向?
【免费下载链接】goosean open source, extensible AI agent that goes beyond code suggestions - install, execute, edit, and test with any LLM项目地址: https://gitcode.com/GitHub_Trending/goose3/goose
在 goose 中持续迭代一个任务时,对话经常会在某条消息上走偏:要么你发出的 prompt 不清楚、缺少关键信息,要么 goose 误解了意图往错误方向执行,之后的多轮消息和工具调用都建立在这个错误起点上。继续发消息纠正往往收效有限,因为错误起点仍然留在上下文里。goose 提供了两种会话内操作来解决这个问题:Edit in Place直接改写历史、从编辑点重新开始;Fork Session则在保留原会话的前提下,基于编辑后的消息开一条新分支去探索。两者都适用于 goose Desktop 和 goose CLI,且会话存储在同一个数据库中,Desktop 创建的会话可以在 CLI 中恢复,反之亦然。
先判断:走偏的会话该覆盖还是保留
两种操作的后果完全不同,选错会导致上下文丢失,动手前先按文档给出的适用条件做判断:
| 操作 | 对原会话的影响 | 适合的场景 |
|---|---|---|
| Edit in Place | 当前会话中编辑点之后的所有消息和响应上下文被删除,会话从该点继续 | 确认后面的内容不再需要,想从某一点彻底重开(例如修正最后一条消息里的一个路径) |
| Fork Session | 原会话保持不变,新建一个包含"编辑点及之前历史"的新会话 | 已有不错的进展但想换一种做法,希望保留原会话作为参照(例如对比两种不同 prompt 的效果) |
文档用一个消息流示例说明 Edit in Place 的截断效果:一段有五轮消息的对话,编辑第 3 条消息后,第 4、5 条的消息与响应上下文全部被删除,会话从第 3 条继续。
文档还给出两条选择建议,可以直接对照自己的情况:
- Preserving Progress:当你已经取得良好进展但想尝试不同方向时,用 Fork Session。这样如果新方向行不通,随时可以回到原会话。
- When to Edit vs. Interrupt:当对话已经走偏时,编辑早期消息比用新消息或中断来纠偏更有效——编辑消息是重写历史,而中断只影响当前消息之后的对话。
在 goose Desktop 中操作
两条路径的第一步相同:把鼠标悬停在会话中任何一条历史消息上,点击出现的Edit按钮,在行内编辑器中修改内容,再决定保存方式。
Edit in Place:覆盖当前会话
- 悬停在要修改的历史消息上
- 点击
Edit按钮 - 在行内编辑器中修改内容
- 点击
Edit in Place保存修改并重新向 goose 提问
保存后,goose 会删除该消息之后的全部会话历史,并基于编辑后的上下文从该点继续响应。
需要注意文档中的明确警告:Edit in Place 会把编辑点之后的会话历史永久从会话中删除,同时移出 goose 的上下文。只有在你不需要 goose 记住编辑点之后的内容时才选这个方式。
Fork Session:保留原会话开新分支
- 悬停在要修改的历史消息上
- 点击
Edit按钮 - 在行内编辑器中修改内容
- 点击
Fork Session保存修改并开启新会话;也可以使用快捷键Cmd+Enter(macOS)或Ctrl+Enter(Windows/Linux)
goose 会创建一个新会话,其中包含直到并包括你编辑后的那条消息的对话历史。新会话的显示名带 "(edited)" 后缀,原会话保持原样。
这里容易和另一个功能混淆,文档专门做了区分:
- Fork Session(消息上的 Edit 按钮):创建只包含"某个编辑点及之前"历史的新会话,用于从对话的某个特定位置探索不同做法。
- Duplicate Session(会话列表中的 Copy 按钮):完整复制整个会话,用于保存一个可用的会话或复用其配置。
在 goose CLI 中操作
CLI 通过goose session的--edit和--fork参数实现同样两个操作。--edit打开的是把整段会话序列化为 YAML 的编辑器(优先使用$VISUAL,其次$EDITOR,都没有时用vi);--edit必须与--resume一起使用,可以与--fork组合。
先找到目标会话的 ID。会话 ID 格式为YYYYMMDD_<COUNT>,可用goose session list查看(也可用--name按名称定位会话)。
CLI 版 Edit in Place
goose session --resume <session-id> --edit<session-id>替换为要编辑的会话 ID,例如20251108_2。文档给出的完整写法是:
goose session --resume --session-id 20251108_2 --edit编辑器中 YAML 的编辑方式与 UI 版语义略有差别,需要留意:
- 编辑并保存后,goose 从编辑后的会话继续;
- YAML 中你保留的其后的消息会留在会话和 goose 的上下文中;
- 想让 goose"忘记"后面的消息,就从 YAML 中删除对应消息。
也就是说,CLI 下"截断到哪里"由你删除哪些 YAML 内容决定,而不是自动删除编辑点之后的所有消息。
CLI 版 Fork Session
--edit与--fork组合使用,从编辑结果创建新会话:
goose session --resume <session-id> --fork --edit也可以附加--history在恢复时显示此前的消息(文档示例):
goose session --resume --session-id 20251108_2 --fork --edit --history保存编辑后,goose 创建包含编辑后对话的新会话并从中恢复,原会话保持不变。
另外,只使用--fork而不加--edit,则是不经过编辑的整会话复制(相当于 UI 的 Duplicate):
# Fork 最近的会话 goose session --resume --fork # 按名称 fork 指定会话 goose session --resume --fork --name my-project验证操作是否生效
文档给出了两种操作生效后可观察的结果,可据此核对:
Edit in Place:编辑点之后的历史不再出现在会话中,goose 从编辑后的消息处按新上下文响应(UI 版会直接删除后续历史;CLI 版以你在 YAML 中留下的消息为准)。
Fork Session:会话列表中出现一个新会话。UI 中新会话名为原会话名加 "(edited)" 后缀,原会话内容不变;CLI 中可以用goose session list确认新会话已创建。文档中一个goose session list -l 1的示例输出(文档示例,实际会话名与 ID 因人而异):
Available sessions: 20260213_9 - react-migration - 2026-02-13 16:20:37 UTC其中20260213_9就是可用于--session-id的会话 ID。
限制与边界
- 删除不可逆:UI 版 Edit in Place 对编辑点之后历史的删除是永久性的,且移出 goose 上下文,操作前确认后面的内容确实不需要。
- CLI 编辑的截断语义不同:CLI 下
--edit不会自动删除编辑点之后的消息,留在 YAML 里的消息会保留在会话和上下文中,需要手动从 YAML 删除。 - Fork 与 Duplicate 的边界:Fork Session 只带"编辑点及之前"的历史;需要完整复制(含元数据、provider 与模型配置、扩展配置、recipe 信息)时用 Duplicate Session /
--fork(无--edit)。 - 迭代式纠偏:文档建议的日常工作方式是先用基础 prompt 起步,再根据 goose 的响应边编辑边细化,而不是一开始就追求一条完美 prompt;结合 Fork Session 可以同时保留验证过的方向。
完整操作细节见 In-Session Actions 文档,--edit与--fork参数定义见 goose CLI 命令文档,会话的恢复与复制操作见 Session Management 文档。
【免费下载链接】goosean open source, extensible AI agent that goes beyond code suggestions - install, execute, edit, and test with any LLM项目地址: https://gitcode.com/GitHub_Trending/goose3/goose
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考