Merge PR #23: update plan_sop.md and subagent_sop.md

This commit is contained in:
Liang Jiaqing committed 2026-03-12 22:22:33 +08:00
commit f52975fd95
2 files changed
+90 -63

No files matched your search

+59 -59
View File
@@ -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 执行
- 每项必须有独立完成判据
- 禁止"处理所有文件",必须展开具体条目
- 一次只做一项;计划有误回规划态修正
- 不可逆操作前多验证一步
+31 -4
View File
@@ -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读取各输出文件,汇总结果
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必须存在"]
}
```