Merge PR #23: update plan_sop.md and subagent_sop.md
This commit is contained in:
@@ -1,70 +1,70 @@
|
|||||||
# Plan Mode SOP
|
# Plan Mode SOP
|
||||||
|
**触发**:3步以上有依赖/多文件协同/条件分支/需并行 | **禁用**:1-2步简单任务直接做
|
||||||
> 简单任务(1-2步可完成)禁用本SOP,直接做。
|
**工作目录**:`./plan_XXX/`(XXX=任务英文短名)
|
||||||
|
## 规划态(按序执行)
|
||||||
文件命名:`./plan_XXX.md`(XXX = 任务英文短名)。结果文件放 `./`,路径回填计划文件。禁建子目录。
|
**步骤1:创建文件夹 + 存checkpoint**
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 规划态(按序执行,不可跳步)
|
|
||||||
|
|
||||||
[] **步骤1:存checkpoint(含格式模板)**
|
|
||||||
|
|
||||||
调用 `update_working_checkpoint`,**必须**使用以下格式([格式]字段不可省略):
|
|
||||||
```
|
```
|
||||||
[任务] 产出 plan_XXX.md | [需求] 用户原始需求一句话
|
[任务] 产出 ./plan_XXX/plan.md | [需求] 一句话 | [约束] 关键限制
|
||||||
[格式] 骨架每项必须用 - [ ] 开头,禁止###标题。模板:- [ ] 项目简述 | 方法:做法 | 验证:判据
|
[进度] 即将读领域SOP | ⚡写完plan后必须重读本SOP步骤3切换执行态
|
||||||
[进度] 即将读领域SOP | ⚡写完plan后必须重读本SOP步骤3,按其模板切checkpoint再执行
|
|
||||||
```
|
```
|
||||||
|
**步骤2:读领域SOP → 写plan骨架**
|
||||||
[] **步骤2:读领域SOP → 写plan骨架 `./plan_XXX.md`**
|
先读相关SOP,立即写骨架。允许"⚠待确认",禁止以"没调研清楚"推迟。
|
||||||
|
**骨架格式**:
|
||||||
先读取相关领域SOP了解步骤,然后**立即**写骨架。不需要完美,**允许方法写"⚠待确认"**。禁止以"还没调研清楚"为由推迟。
|
|
||||||
|
|
||||||
**⚠ 骨架格式以checkpoint中[格式]字段为准,不要模仿领域SOP的排版。**
|
|
||||||
|
|
||||||
骨架模板:
|
|
||||||
```
|
```
|
||||||
# 任务标题
|
# 任务标题
|
||||||
需求:一句话 | 约束:关键限制
|
需求:一句话 | 约束:关键限制
|
||||||
|
1. [ ] 步骤1简述
|
||||||
- [ ] 项目1简述 | 方法:具体做法 | 验证:完成判据
|
2. [P] 步骤2简述(并行,读subagent_sop.md执行Map模式)
|
||||||
- [ ] 项目2简述 | 方法:⚠待确认 | 验证:完成判据
|
依赖:1
|
||||||
- [ ] 项目3简述 | 方法:具体做法 | 验证:完成判据
|
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。**
|
|
||||||
|
|
||||||
[] **步骤3:转入执行态(⛔ 不可跳过)**
|
|
||||||
|
|
||||||
**写完plan骨架后,必须先执行此步骤再开始做任何项目。**
|
|
||||||
调用 `update_working_checkpoint`,只放**当前一步**(禁止塞全部步骤):
|
|
||||||
```
|
```
|
||||||
[执行] 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.md → 定位当前`[ ]`项
|
||||||
1. 读 `plan_XXX.md` → 定位当前 `- [ ]` 项
|
2. **检查并行**:
|
||||||
2. 执行该项(参照领域SOP)
|
```
|
||||||
3. 按checkpoint中⚡指令完成收尾(标[x]→找下步→更新checkpoint)
|
IF has_mark('[P]'):
|
||||||
4. 全部完成 → 汇总结果 → 清理checkpoint
|
CALL file_read('subagent_sop.md')
|
||||||
|
# 按SOP创建context.json(含绝对路径)+ input.txt
|
||||||
---
|
# ⚠ subagent必须从context.json读取绝对路径写入文件
|
||||||
|
ELSE:
|
||||||
## 项目类型(三选一或嵌套)
|
执行当前步骤
|
||||||
- **步骤**:有先后依赖,顺序执行
|
```
|
||||||
- **方面**:并行独立,无依赖
|
3. 执行该项
|
||||||
- **分支**:条件未知,尝试X → 成功走Y / 失败走Z
|
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 执行
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
## Task Mode 文件IO协议
|
## Task Mode 文件IO协议
|
||||||
|
|
||||||
- 目录:`temp/{task_name}/`(相对代码根GenericAgent/),主agent cwd在temp/时即 `./{task_name}/`
|
- 目录:`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 → 启动 → 轮询 output.txt → 读回复 → 写 reply.txt 继续 → 不写则5min自动退出
|
||||||
- input.txt原则:写目标+约束,可指定SOP名。禁写具体实现步骤——除非主agent已读过该SOP确认正确。凭印象猜的步骤会误导subagent
|
- input.txt原则:写目标+约束,可指定SOP名。禁写具体实现步骤——除非主agent已读过该SOP确认正确。凭印象猜的步骤会误导subagent
|
||||||
- output.txt:首轮对话的流式输出(持续append),用mtime/size判断更新
|
- output.txt:首轮对话的流式输出(持续append),用mtime/size判断更新
|
||||||
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
```python
|
```python
|
||||||
task_dir = os.path.join(agent_root, 'temp', task_name)
|
task_dir = os.path.join(agent_root, 'temp', task_name)
|
||||||
|
creation_flags = 0x08000000 if platform.system() == 'Windows' else 0
|
||||||
proc = subprocess.Popen(
|
proc = subprocess.Popen(
|
||||||
[sys.executable, 'agentmain.py', '--task', task_name],
|
[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'),
|
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'))
|
stderr=open(os.path.join(task_dir, 'stderr.log'), 'w', encoding='utf-8'))
|
||||||
```
|
```
|
||||||
@@ -41,9 +42,35 @@ proc = subprocess.Popen(
|
|||||||
**核心优势**:独立上下文。避免处理文档A的长上下文污染处理文档B的质量
|
**核心优势**:独立上下文。避免处理文档A的长上下文污染处理文档B的质量
|
||||||
**约束**:
|
**约束**:
|
||||||
- 文件系统共享是优点:不同agent处理不同输入文件,产生不同输出文件
|
- 文件系统共享是优点:不同agent处理不同输入文件,产生不同输出文件
|
||||||
- 共享资源冲突:键鼠/浏览器主体不可共享(浏览器可分tab但需谨慎)
|
- 共享资源冲突:键鼠不可共享;浏览器暂时不可并行使用,避免同时操作同一标签页
|
||||||
- 不满足map模式的任务 → 主agent顺序执行即可,别用subagent
|
- 不满足map模式的任务 → 主agent顺序执行即可,别用subagent
|
||||||
**标准流程(map-reduce)**:
|
**标准流程(map-reduce)**:
|
||||||
1. 主agent准备阶段:爬取/dump数据,存为多个独立输入文件
|
1. 主agent准备阶段:爬取/dump数据,存为多个独立输入文件
|
||||||
2. 分发:对每个文件启动一个subagent处理(主agent自己也可以处理其中一个)
|
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必须存在"]
|
||||||
|
}
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user