【从0到1构建一个ClaudeAgent】规划与协调-TodoWrite
这段代码引入了一个非常关键的概念“自我反思与状态管理”。之前的 Agent 只是单纯的“听指令 - 干活”容易干着干着就忘了初衷或者在复杂的任务中迷失方向。TodoManager就像是给 Agent 装了一个“记事本”和“监工”。Java 实现代码publicclassAgentWithTodo{privatestaticfinalPathWORKDIRPaths.get(System.getProperty(user.dir));// --- 1. 状态管理TodoManager ---// 任务状态枚举publicenumTaskStatus{PENDING(pending),IN_PROGRESS(in_progress),COMPLETED(completed);publicfinalStringlabel;TaskStatus(Stringlabel){this.labellabel;}publicstaticTaskStatusfromLabel(Strings){for(TaskStatusts:values())if(ts.label.equals(s))returnts;returnPENDING;}}// 任务实体publicstaticclassTodoItem{publicStringid;publicStringtext;publicTaskStatusstatus;publicTodoItem(Stringid,Stringtext,Stringstatus){this.idid;this.texttext;this.statusTaskStatus.fromLabel(status);}}// 管理器类publicstaticclassTodoManager{privateListTodoItemitemsnewArrayList();publicStringupdate(ListMapString,ObjectnewItems)throwsException{if(newItems.size()20)thrownewException(Max 20 todos allowed);ListTodoItemvalidatednewArrayList();intinProgressCount0;for(inti0;inewItems.size();i){MapString,ObjectitemnewItems.get(i);Stringtext(String)item.getOrDefault(text,);StringstatusStr(String)item.getOrDefault(status,pending);StringidString.valueOf(item.getOrDefault(id,String.valueOf(i1)));if(text.trim().isEmpty())thrownewException(Item id: text required);TaskStatusstatusTaskStatus.fromLabel(statusStr.toLowerCase());if(statusTaskStatus.IN_PROGRESS)inProgressCount;validated.add(newTodoItem(id,text.trim(),status.label));}if(inProgressCount1)thrownewException(Only one task can be in_progress at a time);this.itemsvalidated;returnrender();}publicStringrender(){if(items.isEmpty())returnNo todos.;StringBuildersbnewStringBuilder();for(TodoItemitem:items){Stringmarkeritem.statusTaskStatus.PENDING?[ ]:item.statusTaskStatus.IN_PROGRESS?[]:[x];sb.append(String.format(%s #%s: %s%n,marker,item.id,item.text));}longdoneitems.stream().filter(i-i.statusTaskStatus.COMPLETED).count();sb.append(String.format(%n(%d/%d completed),done,items.size()));returnsb.toString();}}privatestaticfinalTodoManagerTODO_MANAGERnewTodoManager();// --- 2. 工具定义与分发 ---publicenumToolType{BASH(bash),READ_FILE(read_file),WRITE_FILE(write_file),EDIT_FILE(edit_file),TODO(todo);// 新增 todo 工具publicfinalStringname;ToolType(Stringname){this.namename;}}privatestaticfinalMapString,ToolExecutorTOOL_HANDLERSnewHashMap();static{// ... 省略已有的工具注册// 注册 Todo 工具TOOL_HANDLERS.put(ToolType.TODO.name,args-{SuppressWarnings(unchecked)ListMapString,Objectitems(ListMapString,Object)args.get(items);returnTODO_MANAGER.update(items);});}// --- 3. 核心循环 ---publicstaticvoidagentLoop(ListMapString,Objectmessages){introundsSinceTodo0;// 新增跟踪轮数while(true){// ... 省略相同的 LLM 调用、消息追加、停止检查逻辑// 3. 执行工具ListMapString,ObjecttoolResultsnewArrayList();ListMapString,Objectcontent(ListMapString,Object)response.get(content);booleanusedTodofalse;// 新增标记是否使用了 todo 工具for(MapString,Objectblock:content){if(tool_use.equals(block.get(type))){// ... 省略相同的工具调用逻辑StringtoolName(String)block.get(name);// ... 执行工具if(toolName.equals(todo))usedTodotrue;// 标记 todo 使用}}// 4. 监工逻辑 (Nag Reminder)roundsSinceTodousedTodo?0:roundsSinceTodo1;if(roundsSinceTodo3){// 关键超过3轮没更新就提醒MapString,ObjectnagnewHashMap();nag.put(type,text);nag.put(text,reminderUpdate your todos./reminder);toolResults.add(0,nag);// 插入到结果列表最前面System.out.println( 监工提醒更新待办列表);}// 5. 回传结果// ... 省略相同的回传逻辑}}// --- 4. 工具实现 (简化版) ---// ... 省略已有的工具实现}状态管理TodoManager 类为Agent引入长期记忆和工作进度追踪能力让Agent能记住自己的任务列表和工作状态。// 任务状态枚举publicenumTaskStatus{PENDING(pending),IN_PROGRESS(in_progress),COMPLETED(completed);// 状态枚举明确定义三种状态// 状态驱动Agent根据状态决定下一步操作}// 任务实体 - 数据结构publicstaticclassTodoItem{publicStringid;// 唯一标识publicStringtext;// 任务描述publicTaskStatusstatus;// 状态// 结构化的任务表示// 为LLM提供清晰的上下文}// TodoManager - 核心状态管理publicclassTodoManager{privateListTodoItemitemsnewArrayList();// 状态存储publicStringupdate(ListMapString,ObjectnewItems)throwsException{if(newItems.size()20)thrownewException(Max 20 todos allowed);// 业务规则1限制任务数量防止滥用intinProgressCount0;ListTodoItemvalidatednewArrayList();for(inti0;inewItems.size();i){MapString,ObjectitemnewItems.get(i);Stringtext(String)item.getOrDefault(text,);StringstatusStr(String)item.getOrDefault(status,pending);StringidString.valueOf(item.getOrDefault(id,String.valueOf(i1)));if(text.trim().isEmpty())thrownewException(Item id: text required);// 业务规则2任务文本必填TaskStatusstatusTaskStatus.fromLabel(statusStr.toLowerCase());if(statusTaskStatus.IN_PROGRESS)inProgressCount;// 业务规则3跟踪进行中任务数量}if(inProgressCount1)thrownewException(Only one task can be in_progress at a time);// 业务规则4一次只能进行一个任务聚焦执行this.itemsvalidated;// 原子性更新returnrender();// 返回可视化表示}publicStringrender(){if(items.isEmpty())returnNo todos.;StringBuildersbnewStringBuilder();for(TodoItemitem:items){Stringmarkeritem.statusTaskStatus.PENDING?[ ]:item.statusTaskStatus.IN_PROGRESS?[]:[x];sb.append(String.format(%s #%s: %s%n,marker,item.id,item.text));// 可视化格式[ ] 待办, [] 进行中, [x] 已完成}longdoneitems.stream().filter(i-i.statusTaskStatus.COMPLETED).count();sb.append(String.format(%n(%d/%d completed),done,items.size()));// 进度统计为LLM提供进度反馈returnsb.toString();}}状态持久化Agent有了记忆不再是完全无状态的结构化表示用面向对象的方式管理任务状态业务约束通过校验规则确保状态一致性可视化输出为LLM提供人类可读的进度展示Todo工具集成// 在工具枚举中新增TODO(todo);// 扩展工具集添加状态管理工具// 注册Todo工具实现TOOL_HANDLERS.put(ToolType.TODO.name,args-{SuppressWarnings(unchecked)ListMapString,Objectitems(ListMapString,Object)args.get(items);returnTODO_MANAGER.update(items);// 状态更新工具让LLM能操作任务状态// 接受LLM传入的任务列表更新内部状态});状态操作作为工具将状态管理抽象为工具调用双向通信LLM可以通过工具更新状态也能获取状态统一接口与其他工具使用相同的调用模式监工逻辑Nag Reminder// 在agentLoop中新增introundsSinceTodo0;// 计数器记录多少轮没使用todo工具booleanusedTodofalse;// 标记当前轮是否使用了todo// 执行工具时记录if(toolName.equals(todo))usedTodotrue;// 每轮结束后的监工检查roundsSinceTodousedTodo?0:roundsSinceTodo1;// 重置或递增if(roundsSinceTodo3){// 如果超过3轮没更新待办MapString,ObjectnagnewHashMap();nag.put(type,text);nag.put(text,reminderUpdate your todos./reminder);toolResults.add(0,nag);// 插入到结果列表最前面System.out.println( 监工提醒更新待办列表);// 强制提醒防止LLM忘记更新状态}防遗忘机制LLM可能会忘记更新状态需要外部提醒渐进式提醒容忍短期遗忘超过阈值再干预结构化提示使用特殊标签reminder让LLM识别这是系统提示优先级插入到结果列表最前面确保LLM先看到架构演进与价值从 AgentWithTools 到 AgentWithTodo 的升级维度AgentWithToolsAgentWithTodo状态管理无状态有状态TodoManager进度追踪不支持支持任务进度管理长期记忆不支持支持任务列表记忆监督机制无有监工提醒任务管理工具级项目级