diff --git a/memory/plan_sop.md b/memory/plan_sop.md index 7208eff..bdfff2b 100644 --- a/memory/plan_sop.md +++ b/memory/plan_sop.md @@ -1,70 +1,70 @@ # Plan Mode SOP - -> 简单任务(1-2步可完成)禁用本SOP,直接做。 - -文件命名:`./plan_XXX.md`(XXX = 任务英文短名)。结果文件放 `./`,路径回填计划文件。禁建子目录。 - ---- - -## 规划态(按序执行,不可跳步) - -[] **步骤1:存checkpoint(含格式模板)** - -调用 `update_working_checkpoint`,**必须**使用以下格式([格式]字段不可省略): +**触发**:3步以上有依赖/多文件协同/条件分支/需并行 | **禁用**:1-2步简单任务直接做 +**工作目录**:`./plan_XXX/`(XXX=任务英文短名) +## 规划态(按序执行) +**步骤1:创建文件夹 + 存checkpoint** ``` -[任务] 产出 plan_XXX.md | [需求] 用户原始需求一句话 -[格式] 骨架每项必须用 - [ ] 开头,禁止###标题。模板:- [ ] 项目简述 | 方法:做法 | 验证:判据 -[进度] 即将读领域SOP | ⚡写完plan后必须重读本SOP步骤3,按其模板切checkpoint再执行 +[任务] 产出 ./plan_XXX/plan.md | [需求] 一句话 | [约束] 关键限制 +[进度] 即将读领域SOP | ⚡写完plan后必须重读本SOP步骤3切换执行态 ``` - -[] **步骤2:读领域SOP → 写plan骨架 `./plan_XXX.md`** - -先读取相关领域SOP了解步骤,然后**立即**写骨架。不需要完美,**允许方法写"⚠待确认"**。禁止以"还没调研清楚"为由推迟。 - -**⚠ 骨架格式以checkpoint中[格式]字段为准,不要模仿领域SOP的排版。** - -骨架模板: +**步骤2:读领域SOP → 写plan骨架** +先读相关SOP,立即写骨架。允许"⚠待确认",禁止以"没调研清楚"推迟。 +**骨架格式**: ``` # 任务标题 需求:一句话 | 约束:关键限制 - -- [ ] 项目1简述 | 方法:具体做法 | 验证:完成判据 -- [ ] 项目2简述 | 方法:⚠待确认 | 验证:完成判据 -- [ ] 项目3简述 | 方法:具体做法 | 验证:完成判据 +1. [ ] 步骤1简述 +2. [P] 步骤2简述(并行,读subagent_sop.md执行Map模式) + 依赖:1 +3. [?] 步骤3(条件分支) + 条件:X成功→3.1,否则→3.2 ``` +**标记**:`[ ]`待做 | `[✓]`完成 | `[✗]`失败 | `[P]`并行 | `[?]`条件分支 +**[P]标记条件**(全YES才可标): +□ 2+步骤可同时? □ 无数据依赖? □ 产出不同文件? □ 节省>20%时间? +**子任务目录**:subagent产出放 `./plan_XXX/subtask_name/` +**探索规则**:有⚠项→逐项探索,每轮更新plan+checkpoint | 连续3轮无进展→用当前最佳方案 +**⛔ 写完骨架后禁止执行。必须先完成步骤3。** -- 有⚠待确认项 → 逐项探索补充,**每轮必须更新plan文件 + checkpoint的[进度]** -- 连续3轮探索无实质进展 → **必须停止**,用当前最佳方案替代 -- 无⚠待确认项 → 直接进入步骤3 - -**⛔ 写完骨架后禁止执行任何项目。必须先完成步骤3。** - -[] **步骤3:转入执行态(⛔ 不可跳过)** - -**写完plan骨架后,必须先执行此步骤再开始做任何项目。** -调用 `update_working_checkpoint`,只放**当前一步**(禁止塞全部步骤): +**步骤3:转入执行态** ``` -[执行] plan_XXX.md | 当前:Step1简述 | ⚡完成后必须:1.file_patch plan把当前步[ ]改[x] 2.读plan找下个[ ] 3.update_working_checkpoint为下步(保留本模板格式) +CALL update_working_checkpoint( + key_info='[执行] plan.md | 当前:1.1 | ⚡有[P]标记必须读subagent_sop.md执行Map模式' +) ``` - -**执行循环(每步重复):** -1. 读 `plan_XXX.md` → 定位当前 `- [ ]` 项 -2. 执行该项(参照领域SOP) -3. 按checkpoint中⚡指令完成收尾(标[x]→找下步→更新checkpoint) -4. 全部完成 → 汇总结果 → 清理checkpoint - ---- - -## 项目类型(三选一或嵌套) -- **步骤**:有先后依赖,顺序执行 -- **方面**:并行独立,无依赖 -- **分支**:条件未知,尝试X → 成功走Y / 失败走Z - +## 执行态循环 +1. 读plan.md → 定位当前`[ ]`项 +2. **检查并行**: + ``` + IF has_mark('[P]'): + CALL file_read('subagent_sop.md') + # 按SOP创建context.json(含绝对路径)+ input.txt + # ⚠ subagent必须从context.json读取绝对路径写入文件 + ELSE: + 执行当前步骤 + ``` +3. 执行该项 +4. **收尾(必须执行,不可跳过)**: + ``` + # ⚠ 进度标记更新是强制要求,每步完成后必须执行 + file_patch(plan, '[ ] 当前步骤' → '[✓] 当前步骤') + file_read(plan) # 验证标记已更新 + 找下一步 + update_working_checkpoint('[进度] 步骤N已完成 | 下一步:...') + ``` +5. **Checkpoint验证(每3步或关键节点)**: + ``` + file_read(plan) # 检查:所有已执行步骤是否标[✓] + IF 有遗漏标记: + 立即补标 file_patch(...) + ``` +6. 全部完成 → 汇总结果 → 清理checkpoint +## 失败处理 +1. **记录**:checkpoint中 `step_X: [FAILED] 原因 (retry: N/3)` +2. **重试**:网络超时→自动重试3次(2s/4s/8s) | 配置错误→询问用户 | 其他→标[✗]跳过 +3. **subagent失败**:查stderr.log→明确错误主agent修正重启 | 未知错误重试1次 | 最多重启2次 +4. **依赖传播**:步骤失败后,后续依赖项标[SKIP] ## 强制约束 - -- 每项**必须**有独立完成判据,禁止笼统描述 -- 禁止出现"处理所有文件"类表述,**必须**展开为具体条目 -- 一次只做一项,禁止批量执行 -- 计划有误回到规划态修正,禁止硬凑 -- 不可逆操作前多验证一步 -- 并行方面可用 subagent 执行 \ No newline at end of file +- 每项必须有独立完成判据 +- 禁止"处理所有文件",必须展开具体条目 +- 一次只做一项;计划有误回规划态修正 +- 不可逆操作前多验证一步 \ No newline at end of file diff --git a/memory/subagent_sop.md b/memory/subagent_sop.md index 475eac0..92b4da0 100644 --- a/memory/subagent_sop.md +++ b/memory/subagent_sop.md @@ -3,7 +3,7 @@ ## Task Mode 文件IO协议 - 目录:`temp/{task_name}/`(相对代码根GenericAgent/),主agent cwd在temp/时即 `./{task_name}/` -- 启动:`python agentmain.py --task {task_name} [--llm_no N]`(cwd=代码根) +- 启动:`python agentmain.py --task {task_name} [--llm_no N]`(cwd=代码根),其中agentmain.py位于代码根目录 - 流程:写 input.txt → 启动 → 轮询 output.txt → 读回复 → 写 reply.txt 继续 → 不写则5min自动退出 - input.txt原则:写目标+约束,可指定SOP名。禁写具体实现步骤——除非主agent已读过该SOP确认正确。凭印象猜的步骤会误导subagent - output.txt:首轮对话的流式输出(持续append),用mtime/size判断更新 @@ -13,9 +13,10 @@ ```python task_dir = os.path.join(agent_root, 'temp', task_name) +creation_flags = 0x08000000 if platform.system() == 'Windows' else 0 proc = subprocess.Popen( [sys.executable, 'agentmain.py', '--task', task_name], - cwd=agent_root, creationflags=0x08000000, + cwd=agent_root, creationflags=creation_flags, stdout=open(os.path.join(task_dir, 'stdout.log'), 'w', encoding='utf-8'), stderr=open(os.path.join(task_dir, 'stderr.log'), 'w', encoding='utf-8')) ``` @@ -41,9 +42,35 @@ proc = subprocess.Popen( **核心优势**:独立上下文。避免处理文档A的长上下文污染处理文档B的质量 **约束**: - 文件系统共享是优点:不同agent处理不同输入文件,产生不同输出文件 -- 共享资源冲突:键鼠/浏览器主体不可共享(浏览器可分tab但需谨慎) +- 共享资源冲突:键鼠不可共享;浏览器暂时不可并行使用,避免同时操作同一标签页 - 不满足map模式的任务 → 主agent顺序执行即可,别用subagent **标准流程(map-reduce)**: 1. 主agent准备阶段:爬取/dump数据,存为多个独立输入文件 2. 分发:对每个文件启动一个subagent处理(主agent自己也可以处理其中一个) -3. 收集:等所有subagent完成,主agent读取各输出文件,汇总结果 \ No newline at end of file +3. 收集:等所有subagent完成,主agent读取各输出文件,汇总结果 + +## subagent内部plan_mode使用 +**原则**:subagent本身是完整agent,接收多步骤任务时应在内部创建plan管理执行 +**触发条件**:任务包含3个以上子步骤、子步骤之间有依赖关系、需要checkpoint来恢复执行 +**实现方式**: +1. **主agent创建subagent时**:在input.txt中说明任务包含多个步骤,建议使用plan_mode +2. **subagent内部执行**:检测到多步骤任务后,创建 `./subagent_plan.md` 并使用plan_mode执行 +3. **主agent监控**:只关注最终结果(output*.txt),不需要关心subagent内部如何执行 +4. **文件传递机制**:主agent创建subagent时在task_dir中生成 `context.json`,包含所有文件的**绝对路径** + **⚠ subagent启动后第一步必须读取context.json** + **⚠ 所有文件操作必须使用context.json中的绝对路径** +**格式示例**: +```json +{ + "task": "任务描述", + "work_dir": "/absolute/path/to/plan_dir/", + "input_files": { + "paper_info": "/absolute/path/to/paper_info.txt" + }, + "output_files": { + "pdf": "/absolute/path/to/paper.pdf", + "report": "/absolute/path/to/paper_report.md" + }, + "dependencies": ["paper_info.txt必须存在"] +} +``` \ No newline at end of file