- 放进 state 的 planning artifact
- 与执行 prompt 分离的 planner prompt
- 一个只处理 planning 边界的
decide()override
相比第 1 课的变化
| 设计分支 | 第 1 课 | 第 2 课 |
|---|---|---|
| 控制流 | 每步都走默认 LLM 路径 | 只有 planning 边界由 decide() 拦截 |
| Prompting | 单个 ReAct system prompt | planning prompt + execution prompt |
| State | scratchpad + task fields | 增加 plan_steps 与 cursor |
| Parser | ReActTextParser | 执行阶段仍是 ReActTextParser |
| Tools | 紧凑 coding tools | 保持不变 |
| Memory / History | 除 state 外没有额外层 | 仍不引入 memory 或 compaction |
双 prompt 架构
这一课会显式使用两份 prompt 契约。Planner prompt
PLAN_DRAFT_PROMPT。
Executor prompt
PLAN_EXEC_SYSTEM_PROMPT。
这一课想让你建立的设计意识是:
- planning 和 acting 可以使用不同 prompt
- 但它们仍然流经同一个
AgentModule + Engineruntime
这一课里的 parser 逻辑
planner path 不使用ReActTextParser。
它通常是这样工作的:
_plan()渲染PLAN_DRAFT_PROMPTNumberedPlanBuilder调用同一个 LLM harness- builder 把编号列表解析成
list[str]
ReActTextParser。
这已经体现了一个非常关键的 QitOS 设计点:
同一个 agent 的不同阶段可以使用不同 parsing contracts,只要控制边界是显式的。
model harness 依旧保持“无聊”
和第 1 课一样,这一课仍然使用:- 这样你能单独观察 planning 带来的变化
- prompt 与 parser 的变化更容易解释
- 课程一次只引入一个真正的新变量
在 state 中加入计划与 cursor
新 state 只增加执行真正需要的字段:这是课程里第一次把隐藏 reasoning artifact 显式写进 state。为什么这么做:
- trace 可以直接展示它
prepare()可以显式暴露它reduce()可以推进它- 以后若需要,也可以主动重写它
使用专用的 plan builder
planner 通常在构造时初始化:调用方式类似:正确的 QitOS 做法是:让 planning 变成有名字的 artifact,并且有自己清晰的 parser,而不是混进主 scratchpad 的一段自由文本。
把 decide 只用作 planning gate
这一课的控制逻辑通常非常小:其中最重要的是最后一句:
return None一旦 plan 已经存在,Engine 会重新回到默认模型路径:prompt -> ReActTextParser -> Decision -> tool execution所以第 2 课不是替换 runtime,而是在 runtime 上加了一道显式控制边界。把执行 prompt 与 parser 明确绑定
执行阶段仍是:同时:因此 planning 阶段和 execution 阶段是清晰分离的:
- planning:编号列表 builder
- execution:ReAct 文本协议
让 prepare 显式展示 plan
prepare() 现在不再只渲染任务,而是同时渲染当前计划进度:- 一个任务
- 一份显式计划
- 当前要执行的单个 plan item
故意保持 memory 与 history 简单
第 2 课依旧不引入:
- memory adapter
HistoryPolicy调优CompactHistory
为什么 PlanAct 仍然是同一个内核
很多人一旦想到 planning,就会下意识引入:- 单独的 planner service
- 框架之外的 planner-executor loop
- 第二个 agent runtime
- planner 只是另一种受控模型调用
- plan 只是另一种 state artifact
- 执行仍然走普通 Engine path
完整示例
完整可运行代码位于:第 3 课会新增什么
第 3 课依旧不换内核,但 agent 会真正变成长时运行工作流。 这意味着你将第一次认真面对:- preset toolsets,而不是手工 wiring
- workflow-oriented system prompt
- 显式 history control
- context compaction 与 memory 何时成为必要设计问题
下一课:Claude Code 风格 agent
从 pattern 设计走向长时运行的 workspace agent
相关指南:Memory 与 History
在进入长时运行前,先回顾 state、history、compaction 与 memory 的边界
