ClaudeCode: 怎么规划任务

在claude code源码当中,当用户下达任务后,会由plan agent进行任务拆解,但是当任务复杂并且拆解的任务数量过多时,模型非常容易忘记后续的任务,因此一个行之有效的方法就是设置一个TodoManager,强制让AI大模型将任务转化为todo list,然后再调用大模型进行下一步的规划。

核心思想

  1. LLM绑定工具,包括文件读写,执行命令,编辑文件,以及任务更新等
  2. 使用TodoManager让模型自己管理任务状态(待办/进行中/完成)
  3. 模型连续3轮不更新任务-> 自动注入提醒
  4. 全程不写四执行步骤,模型自主规划,自主推进

核心创新点

模型自己追踪进度,而不是程序硬编码流程

nag reminder提醒机制,3轮不更新todo就强制提醒

同一时间只能有一个任务进行,防止模型发生混乱

流程分析

下面我们来分析一下流程:

  1. 如果超过三次没有调用todo工具,则直接在messages中插入一条提醒消息, 并计数归零
python 复制代码
if rounds_since_todo >= 3:
    # 将提醒作为一条独立的 user 消息注入
    messages.append({
        "role": "user",
        "content": "<reminder>Update your todos.</reminder>"
    })
    # 注意:注入提醒后,计数器重置为 0 或保持?原逻辑没有重置,这里保持原样:
    # 提醒只是附加消息,不影响计数,但为避免无限提醒,可以重置 rounds_since_todo = 0
    # 建议根据需求调整,以下重置为 0 更合理:
    rounds_since_todo = 0
  1. 当大模型接受到这条最新的消息后,则会调用todo工具,其中todo工具的distpatch map是这么定义的:
python 复制代码
{
    "name": "todo", 
     "description": "Update task list. Track progress on multi-step tasks.",
     "input_schema": {
         "type": "object", 
         "properties": {
             "items": {
                 "type": "array", 
                 "items": {
                     "type": "object", 
                     "properties": {"id": {"type": "string"}, "text": {"type": "string"}, "status": {"type": "string", "enum": ["pending", "in_progress", "completed"]}}, "required": ["id", "text", "status"]}}}, "required": ["items"]}},

从代码中我们可以看出,大模型会返回一个items列表,该任务列表中会详细列举任务的id, text, 状态

然后我们看一下当大模型返回todo列表后,程序会遍历items, 检查是否所有的to do list是否合法,以及当前输入in_progress的任务是否只有一个,如果都符合要求,则进行render。 将render后的字符串组转成消息,发送给大模型,进行下一轮的任务。

这里提一下render的规则:

如果是pending任务: 渲染成: #item_id #itemtext

如果是in_progress任务: 渲染成: \> #item_id #itemtext

如果是completed任务: 渲染成: x #item_id #itemtext

python 复制代码
def update(self, items: list) -> str:
    if len(items) > 20:
        raise ValueError("Max 20 todos allowed")
    validated = []
    in_progress_count = 0
    for i, item in enumerate(items):
        text = str(item.get("text", "")).strip()
        status = str(item.get("status", "pending")).lower()
        item_id = str(item.get("id", str(i + 1)))
        if not text:
            raise ValueError(f"Item {item_id}: text required")
        if status not in ("pending", "in_progress", "completed"):
            raise ValueError(f"Item {item_id}: invalid status '{status}'")
        if status == "in_progress":
            in_progress_count += 1
        validated.append({"id": item_id, "text": text, "status": status})
    if in_progress_count > 1:
        raise ValueError("Only one task can be in_progress at a time")
    self.items = validated
    return self.render()

// reader函数 
def render(self) -> str:
    if not self.items:
        return "No todos."
    lines = []
    for item in self.items:
        marker = {"pending": "[ ]", "in_progress": "[>]", "completed": "[x]"}[item["status"]]
        lines.append(f"{marker} #{item['id']}: {item['text']}")
    done = sum(1 for t in self.items if t["status"] == "completed")
    lines.append(f"\n({done}/{len(self.items)} completed)")
    return "\n".join(lines)
相关推荐
FanetheDivine39 分钟前
学习Agent开发 10.延迟工具 deferred tools
agent·ai编程
为你学会写情书2 小时前
Agent 开发框架深度对比——LangGraph、AutoGen、CrewAI 与 Microsoft Agent Framework 该选谁
agent
染指11102 小时前
135.Agent-多Agent框架-LangChain多智能体(SubAgents子代理)
数据库·人工智能·设计模式·langchain·agent·agents
为你学会写情书2 小时前
Agent 能力评测——2026 年基准测试全景与模型真实能力画像
agent
lucas_AI2 小时前
别等上下文爆了才压缩:AutoCompact 教编码智能体主动「断舍离」
llm·agent
用户3134672143542 小时前
Agent相关 - agent_scratchpad 到底该放哪?一个隐蔽的顺序坑
langchain·llm·agent
七夜zippoe3 小时前
多 Agent 协作架构:Pipeline 模式——串行流水线设计与实战
ai·架构·pipeline·agent·串行流水线
浮生望4 小时前
大模型结构化输出怎么选:从 JSON.parse、OutputParser 到 Zod
llm
AINative软件工程4 小时前
LLM Prompt Registry 工程实践:集中管理 Prompt,让模型调用不再散落在代码各处
后端·python·llm
Patrick在香港4 小时前
MCP 的 initialize 握手真的没了?67 行标准库实测 2026-07-28 规范
python·agent·claude·mcp·json-rpc