概述
计划(Planning)是智能体把复杂请求拆分成离散、有序、可追踪步骤的方式。AgentScope 不让模型仅靠自由形式的推理来同时兼顾多步目标,而是提供一小组内置工具,让智能体通过工具调用来维护一份显式、结构化的任务清单 —— 任务的创建、查询与更新都走工具调用。 AgentScope 内置了四个计划相关的工具:
四者都是状态注入式工具(
is_state_injected = True):智能体运行时把当前的 AgentState 注入每次调用,工具直接读写 agent.state.tasks_context。这意味着任务清单以智能体为作用域,并随智能体的状态进行持久化。
使用计划工具
装配工具
像其他内置工具一样实例化并注册到Toolkit:
description 已经包含详细提示,说明何时调用、何时跳过以及如何解读输出,因此不需要额外的系统提示工程。check_permissions() 硬编码为 ALLOW —— 计划工具是纯内存状态变更,不会触发用户提示。
任务生命周期
典型的规划循环如下:1
登记工作
收到新指令时,智能体对每个离散步骤分别调用一次
TaskCreate,提供一句简短的命令式 subject 和更详尽的 description。新任务按创建顺序追加;id 是稳定且单调递增的数字串("1"、"2"……)。2
查看队列
TaskList 返回每个任务一行的紧凑摘要(id、状态、subject、owner、blocked-by),智能体据此挑选下一个可做的任务 —— 通常是 ID 最小且无未解 blocked_by 的 pending 任务。3
认领并开始
开始工作前,智能体调用
TaskUpdate 把任务的 status 置为 in_progress(多智能体场景下还可设置 owner)。4
获取完整上下文
TaskGet 返回特定任务的完整描述、依赖边与元数据 —— 当描述较长时,在执行前调用很有帮助。5
完成或重新规划
完成时,
TaskUpdate 把状态翻转为 completed。若智能体发现了新工作,则回到 TaskCreate;若某个任务已无需做,则把状态置为 deleted(硬删除,同时会修正所有引用了该任务的其他任务的依赖边)。表达依赖
任务暴露两条对称的依赖边:blocks—— 在本任务完成前不能开始的任务 ID 列表。blocked_by—— 必须在本任务开始前完成的任务 ID 列表。
TaskUpdate 接受 add_blocks 与 add_blocked_by 参数。每次调用都会自动修改两端,保持数据一致:
blocks 与 blocked_by 中移除,保证依赖图始终有效。
TaskList 会标注每个仍有未解 blocked_by 的任务,TaskGet 则返回完整的依赖边列表。智能体据此优先选择无阻塞的工作,但执行层面是仅建议性的 —— 运行时不会阻止模型去做一个被阻塞的任务。存储
所有任务状态都存在智能体上,位于agent.state.tasks_context。相关类型如下:
AgentState.tasks_context 是 agent.state 模型上的常规字段,这意味着:
- 可被序列化保存。 保存
agent.state会完整保存任务清单,恢复状态时计划也一并恢复。 - 以智能体为单位。 两个智能体默认不共享任务清单;多智能体协调由开发者自行处理。
- 可在智能体循环之外修改。 任何能拿到
agent.state的代码 —— 中间件、应用代码、评测器 —— 都可以直接读写任务。
自定义任务
由于任务存在agent.state.tasks_context,开发者可以绕过 LLM 直接以编程方式管理任务。常见场景:
- 预置(Seeding):用其他渠道(另一个智能体、工作流引擎、静态分析)生成的现成计划喂给智能体。
- 导入(Importing):从外部追踪系统(Jira、GitHub issues、内部任务库)导入既有工作项。
- 迁移(Migrating):把 state 从一个 agent 实例迁移到另一个,或恢复部分已完成的计划。
- 评测(Evaluation):在智能体推理前由测试 harness 注入 ground-truth 任务。