【AgentScope Java新手村系列】(12)计划模式

简介: 计划模式 — enablePlanMode() 让 LLM 强制先写计划再执行,内置 plan_enter/write/exit 与 todo_write 工具。

第十二章 计划模式:enablePlanMode() 让 LLM 先写计划再执行,支持中途改计划

"用户让 agent 调研 5 件事。1.x 时代我们用 PlanNotebook 让 agent 自己写计划;2.0 把这个能力下沉到 HarnessAgent.enablePlanMode(),多了 plan_enter / plan_write / plan_exit / todo_write 一套内置工具——LLM 在 plan 模式下会强制先写计划再执行。"

本章你将学到:如何开启 plan mode、4 个内置工具各自做什么、怎么让用户中途改计划、以及 plan 与 subagent 的协作。

12.1 Plan 模式解决了什么问题?

没有 plan 模式时,agent 收到一个复杂任务(比如"给我从零搭一个用户认证系统")后,ReAct 循环是:

思考 → 调工具 → 看结果 → 思考 → 调工具 → 看结果 → ...

每一步都是临场判断。这会导致三个问题:

风险 例子
跳过关键步骤 先写代码再想数据库表结构,改四五轮
做多余的事 用户只要登录,agent 把 OAuth2.0、SAML、FIDO 全实现了
人无法中途介入 agent 一口气跑到底,发现方向错了已经晚了——之前的所有操作都是破坏性的

Plan 模式把一次复杂任务拆成两个阶段

PLAN 阶段(只读)                  BUILD 阶段(执行)
───────────────────              ─────────────────
agent 看文件、调研项目现状          agent 按 plans/PLAN.md 一步步做
agent 把计划写入 plans/PLAN.md       每条做完勾掉 todo
⚠ 此时所有非只读工具被阻止          限制解除,可以写文件、调 API、部署
                                                  │
    人看完 PLAN.md 说"行" ──────→ 放行              │
    人看完 PLAN.md 说"不行,改" → agent 用 plan_write 修订
    人看完 PLAN.md 说"别做了" ──→ 止损,零破坏

核心思想:让人在 agent 动手之前有"一票否决权"。 这就像装修队先出图纸给你审,审过了再砸墙布线——而不是一进门就开始砸。

对于"今天天气怎么样"这种单步任务,plan 模式毫无意义。对于"从零搭建一个项目"、"同时调研 5 件事"、"批量重构代码"这类多步任务,plan 模式是防止 agent 跑偏的最后一道防线。

12.2 1.x PlanNotebook → 2.0 plan mode

1.x 的 PlanNotebook 是一个"让 agent 写计划的笔记本"对象,业务方需要:

  • 手动 notebook.createPlan(...)
  • 写自己的 ReActAgent 适配层让 agent 知道有 PlanNotebook
  • 计划改起来需要主动调用

2.0 把"写计划"做成 agent 运行模式之一:

  • enablePlanMode(true) 一行开启
  • 内置 4 个工具:plan_enter / plan_write / plan_exit / todo_write
  • PlanModeMiddleware 在 PLAN 阶段拦截所有非只读工具调用,返回 DENIED
  • LLM 调了 plan_enter 才进入只读阶段,调了 plan_exit 才恢复执行能力
  • 计划文件落在 workspace/plans/PLAN.md,可读、可改、可被 git 管理

⚠️ 2.0 重大变更

1.x 的 io.agentscope.core.plan.PlanNotebook 在 2.0 中被移除。本章 12.8 给出从 PlanNotebook 到 plan mode 的最小迁移。

12.3 第一个 plan mode 例子

import io.agentscope.core.agent.RuntimeContext;
import io.agentscope.core.message.UserMessage;
import io.agentscope.core.model.DashScopeChatModel;
import io.agentscope.harness.HarnessAgent;

import java.nio.file.Path;
import java.util.List;

public class Chapter12_PlanMode {
   

    public static void main(String[] args) {
   
        HarnessAgent agent = HarnessAgent.builder()
                .name("project_planner")
                .sysPrompt("你是一个项目经理,会用 plan mode 写计划。")
                .model(DashScopeChatModel.builder()
                        .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                        .modelName("qwen-plus")
                        .build())
                .workspace(Path.of("./workspace"))
                .enablePlanMode(true)        // 开启 plan mode
                .build();

        agent.call(
                List.of(new UserMessage("user", """
                        我下周要办一场 200 人技术大会,请帮我做一份执行计划:
                        - 场地
                        - 议程
                        - 嘉宾
                        - 报名
                        - 现场
                        """)),
                RuntimeContext.empty())
                .block();

        // 跑完看 workspace/plans/PLAN.md —— agent 把计划写在这里
    }
}

跑完 workspace/plans/PLAN.md 大致是:

# 大会执行计划(2026-06-15)

## Step 1 — 锁定场地
- 目标:杭州某酒店宴会厅
- 负责:行政
- 完成标准:拿到合同 + 付款凭证

## Step 2 — 公布议程
- 目标:议程在官网公开
- 依赖:Step 1

... (后续 4 步)

12.4 四个内置 plan 工具

工具 何时被调用 副作用
plan_enter agent 决定"这是个多步任务" 写入 workspace/plans/PLAN.md 头部,进入 plan 模式
plan_write 写或修订 PLAN.md 里的步骤 修改 workspace/plans/PLAN.md
plan_exit agent 完成所有计划步骤 PLAN.md 收尾,更新状态为 DONE
todo_write 任何时候记录子任务 写入 AgentState 的 todo 列表,配合 Session 持久化

todo_write 严格说不是"plan 工具",而是"todo 工具"——但 plan mode 下两者是配对的:plan 管"长期大计划",todo 管"短期可勾掉的清单"。

12.5 用户中途改计划

workspace/plans/PLAN.md 是普通 Markdown,agent 在每轮推理时都会读一遍当前 PLAN.md。这意味着:

用户:把 step 3 的'嘉宾'改成都用远程连线的形式。

agent:
  1. 读当前 PLAN.md
  2. 调用 plan_write 改 step 3
  3. 输出确认

人也可以直接编辑 PLAN.md——下一轮 agent 看到的是人编辑后的版本。

12.6 plan + subagent 协作

enablePlanMode() 不影响 subagent 调度——agent_spawn / agent_send / agent_list 仍然可用。一个常见模式:

主 agent 拿到任务:
1. plan_enter,写下 5 步
2. 第 1 步:spawn subagent A(同步)
3. 第 2 步:spawn subagent B(同步)
4. 第 3、4 步:async spawn C、D
5. todo_write 跟踪
6. 等 C、D 回来,todo 勾掉
7. plan_exit

HarnessAgent.builder().enablePlanMode(true) + 多个 subagent 一起用,是 2.0 推荐的中型工作流模式。

12.7 plan 模式的"自动门控"

Plan mode 下,prompt 里强制设定了“agent 在写完 plan 之前不会调用任何业务工具”的规则。这是 2.0 优于 1.x 的安全设计:

  • 1.x:LLM 可能跳过 PlanNotebook 直接动手做事。
  • 2.0:plan mode 下必须先 plan_enter,用户可以在 plan 阶段介入。

如果你想"先看 plan 再放行"——给 plan_enter 配一个 Permission 规则 ASK

import io.agentscope.core.permission.*;

PermissionContextState perms = PermissionContextState.builder()
        .mode(PermissionMode.ACCEPT_EDITS)
        .addAskRule("plan_enter",
                new PermissionRule("plan_enter", null, PermissionBehavior.ASK, "userSettings"))
        .build();

这样每次 plan_enter 时前端会弹出"agent 写了如下 plan,是否放行?",体现了HITL 模式(Human In The Loop)。

12.8 最小迁移清单(1.x PlanNotebook → 2.0 plan mode)

1.x 用法 2.0 等价
PlanNotebook.createPlan(...) enablePlanMode(true) + LLM 自己调 plan_enter
notebook.addStep(...) plan_write
notebook.finishStep(idx) plan_write 改对应 step 状态
notebook.getCurrentPlan() workspace/plans/PLAN.md
业务方主动调 notebook.xxx LLM 在 plan mode 下自动调

12.9 完整可运行示例

public class Chapter12_PlanWithSubagent {
   

    public static void main(String[] args) {
   
        DashScopeChatModel model = DashScopeChatModel.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .modelName("qwen-plus")
                .build();

        SubagentDeclaration research = SubagentDeclaration.builder()
                .name("research")
                .description("做单点调研;输入主题,输出 200 字摘要")
                .inlineAgentsBody("你是一个研究员,每主题输出 200 字摘要。")
                .build();

        HarnessAgent agent = HarnessAgent.builder()
                .name("research_lead")
                .sysPrompt("""
                        你是一个研究主管。接到多主题调研任务时:
                        1. 先 plan_enter 写出计划
                        2. 对每个主题 async spawn research subagent
                        3. 用 todo_write 跟踪每个 subagent 的状态
                        4. 等所有 subagent 回来后 plan_exit
                        """)
                .model(model)
                .workspace(Path.of("./workspace"))
                .subagent(research)
                .enablePlanMode(true)
                .build();

        agent.call(
                List.of(new UserMessage("user", """
                        请调研以下 3 个主题:
                        1. 杭州咖啡店数量
                        2. 上海咖啡店数量
                        3. 成都咖啡店数量
                        """)),
                RuntimeContext.empty())
                .block();
    }
}

跑完你会看到:

workspace/
├── plans/
│   └── PLAN.md          # 3 步计划
└── state/
    └── session-*.json   # 包含 todo 列表

12.10 本章小结

  • HarnessAgent.enablePlanMode(true) 开启 plan mode,强制 agent 先 plan 再 act。
  • 4 个内置工具:plan_enter / plan_write / plan_exit / todo_write
  • workspace/plans/PLAN.md 是普通 Markdown,可以被人编辑、git 管理。
  • plan mode 不影响 subagent:可以一边写计划一边 spawn。
  • Permission 规则可以让用户在 plan_enter 时介入。
目录
相关文章
|
3天前
|
云安全 人工智能 运维
阿里云SecOps Agent,全新安全跨产品执行体验
自然语言驱动 云安全中心/WAF/CFW/ 等多款安全产品联动
1592 2
|
3天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
557 3
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
14天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。
|
15天前
|
JavaScript 定位技术 API
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
CodeGraph 是一款爆火的本地代码智能工具,通过 tree-sitter 解析 AST 构建结构化知识图谱(存于 SQLite),为编程 Agent 提前生成“代码地图”。它显著降低 Agent 在中大型项目中的探索成本——实测工具调用减少71%、Token 降57%、速度提升46%,支持19+语言及主流框架路由识别,完全离线、无需 API Key。
898 11
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
|
2天前
|
人工智能 监控 前端开发
Electron 监控:让桌面 Agent 监控触手可及
一行代码实现Electron桌面端全景监控,自动还原崩溃现场、预警内存泄漏、全链路追踪、 SSE流式响应与交互埋点,让 AI 助手运行状态清晰可见,助力快速恢复稳定与流畅。
177 126
|
2天前
|
消息中间件 人工智能 Kafka
AI 时代,实时入湖正在告别 ETL:从 Kafka 到 Iceberg 的架构减法
本文围绕“零 ETL”这一趋势,讨论流数据入湖为什么需要做架构减法,并结合 Kafka × Table Bucket 的实践,分析一种将通用入湖能力前移到消息与表存储链路中的方案,如何在降低复杂度的同时,兼顾实时性、一致性、Schema 演进、CDC 语义与开放生态兼容。
182 121
|
7天前
|
缓存 人工智能 运维
GLM 5.2自托管全流程实战:硬件选型、vLLM/SGLang部署与成本盈亏测算
2026年智谱发布GLM 5.2超大混合专家模型,区别于以往仅开放API的闭源大模型,该模型权重以MIT开源协议对外发布,企业与开发者可完整下载、本地审计、私有化部署,实现数据不出环境、自定义微调、自主调度推理资源。GLM 5.2拥有753B总参数,原生支持百万级上下文窗口,在代码生成、长文档推理、数学逻辑等多项基准测试中对标国际顶尖商用模型,是首款可完整自托管的前沿代码向大模型。
610 0
|
15天前
|
人工智能 运维 JavaScript
阿里云Qoder CN(原通义灵码)全解析 产品形态、版本划分与技术适配说明
在AI辅助开发与智能办公工具持续普及的当下,阿里云旗下原通义灵码正式更名为Qoder CN,同时延伸出QoderWork CN、Qoder CN CLI、Qoder CN Mobile等多款配套产品,形成覆盖代码开发、日常办公、终端交互、移动端使用的完整工具矩阵。Qoder CN核心定位为AI智能编码助手,深度适配主流代码编辑器、集成开发环境以及终端场景;QoderWork CN则偏向桌面端综合办公辅助,二者面向不同使用场景,划分了多个版本档位,搭配差异化资源配额、功能权限与计费规则,同时兼容多款主流大模型。
969 8

热门文章

最新文章