TaskToolSet 暴露四个工具——task_create、task_update、task_get、task_list——对齐 Claude Code v2.1.142+ 的结构化 Task 能力。与 TodoWriteTool 的整表替换不同,Task 工具族采用按服务端分配的 id 增量更新:创建时返回 id,后续用 task_update 局部修改状态、字段或依赖边。
整个看板序列化为单个 JSON blob 写入 tool_context.state["tasks[:<branch>]"],跨轮存活;highwatermark 记录曾分配的最高 id,软删除(status: deleted)后不会复用 id。
- 增量更新:
task_create分配 id;task_update按taskIdpatch,无需重传整板 - 依赖编排:
addBlockedBy/removeBlockedBy(及addBlocks/removeBlocks)维护双向边;上游completed时自动从下游blockedBy移除并返回unblocked - Token 优化:
task_list只返回摘要(省略description);完整详情用task_get - 硬契约校验:
subject非空、状态合法、依赖存在、无环(detect_cycle)、默认至多一个in_progress(enforce_single_in_progress,可关) - 并发安全:
_TaskToolBase在 load → mutate → save 外包task_store_lock(按 session + branch),兼容parallel_tool_calls=True下同批并行调用 - Prompt 自动注入:
DEFAULT_TASK_PROMPT多工具挂载时只注入一次
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
state_key_prefix |
str |
"tasks" |
state key 前缀;勿使用 temp: |
enforce_single_in_progress |
bool |
True |
设置某任务 in_progress 时,若已有其他 in_progress 则拒绝 |
inject_prompt |
bool |
True |
是否向 system instruction 注入 DEFAULT_TASK_PROMPT |
task_create
| 参数 | 必填 | 说明 |
|---|---|---|
subject |
是 | 短标题(祈使句) |
description |
否 | 自由文本详情 |
activeForm |
否 | 进行时文案 |
metadata |
否 | 扩展键值 |
返回 {task: {id, subject}, message}。
task_update
| 参数 | 必填 | 说明 |
|---|---|---|
taskId |
是 | 要更新的任务 id |
status |
否 | pending / in_progress / completed / deleted |
subject / description / activeForm / owner / metadata |
否 | 标量字段 patch |
addBlockedBy / removeBlockedBy |
否 | 上游依赖 id 列表 |
addBlocks / removeBlocks |
否 | 下游阻塞 id 列表 |
返回 {task, unblocked, message};unblocked 为因本次完成而解除阻塞的 pending 任务 id 列表。
task_get:taskId(必填)→ 含 description 的完整记录。
task_list:可选 includeDeleted;返回 {tasks, stats},摘要不含 description。
常见错误码:INVALID_ARGS、INVALID_DEPENDENCY、INVALID_STATUS、NOT_FOUND。
from trpc_agent_sdk.agents import LlmAgent
from trpc_agent_sdk.models import OpenAIModel
from trpc_agent_sdk.tools import TaskToolSet
agent = LlmAgent(
name="task_planner",
model=OpenAIModel(model_name="...", api_key="...", base_url="..."),
instruction="多步项目请用 task_create / task_update 维护看板。",
tools=[TaskToolSet()],
# parallel_tool_calls=True 时,同批多个 task 工具由 task_store_lock 保护 store 一致性
)读回持久化看板(REST / 审计 / demo 收尾):
from trpc_agent_sdk.tools import get_task_store, render_task_list
store = get_task_store(session, branch=agent.name)
print(render_task_list(store))
# ✅ #1 已完成
# 🔄 #2 进行中
# ⬜ #3 待办 (blocked by: 2)#1 设计表结构
├──→ #2 实现 API ──→ #3 单元测试
└──→ #4 编写文档
#1 completed → unblocked: ['2', '4']
#2 completed → unblocked: ['3']
- 规划与执行分离:先
task_create建板并addBlockedBy,再逐项in_progress→completed - 不要编造 id:只使用
task_create返回的 id - 并行调用:开启
parallel_tool_calls=True时,同 board 上的并发task_create/task_update由锁串行化;不同branch仍并行 - 与 TodoWrite 二选一:长板 + 依赖用 Task;短清单用 TodoWrite
| 示例 | 说明 |
|---|---|
| examples/task_tools | 多轮对话:依赖编排、逐项完成、跨轮 get_task_store 读回看板 |
| examples/task_tools_parallel | 验证 parallel_tool_calls 与 task_store_lock(Phase 1–2 无需 API Key) |