优化中间输出频率/plan_sop重构/autofill batch示例/README便携版链接
This commit is contained in:
@@ -60,6 +60,8 @@ The agent doesn't just execute — it **learns and remembers**.
|
|||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
|
> 💡 **Windows零基础用户**:不知道Python是什么?[下载便携版](http://kw.fudan.edu.cn/resources/PC-Agent-Portable.zip)(19MB,解压即用)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Clone
|
# 1. Clone
|
||||||
git clone https://github.com/lsdefine/pc-agent-loop.git
|
git clone https://github.com/lsdefine/pc-agent-loop.git
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ if __name__ == '__main__':
|
|||||||
while True:
|
while True:
|
||||||
dq = agent.put_task(raw, source='task')
|
dq = agent.put_task(raw, source='task')
|
||||||
while 'done' not in (item := dq.get(timeout=120)):
|
while 'done' not in (item := dq.get(timeout=120)):
|
||||||
if 'next' in item and random.random() < 0.05: # 1/20的概率写一次中间结果
|
if 'next' in item and random.random() < 0.95: # 概率写一次中间结果
|
||||||
with open(f'{d}/output{nround}.txt', 'w', encoding='utf-8') as f: f.write(item.get('next', ''))
|
with open(f'{d}/output{nround}.txt', 'w', encoding='utf-8') as f: f.write(item.get('next', ''))
|
||||||
with open(f'{d}/output{nround}.txt', 'w', encoding='utf-8') as f: f.write(item['done'] + '\n[ROUND END]\n')
|
with open(f'{d}/output{nround}.txt', 'w', encoding='utf-8') as f: f.write(item['done'] + '\n[ROUND END]\n')
|
||||||
for _ in range(150): # 等reply.txt,5分钟超时
|
for _ in range(150): # 等reply.txt,5分钟超时
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
"parameters": {"type": "object", "properties": {
|
"parameters": {"type": "object", "properties": {
|
||||||
"script": {"type": "string", "description": "要执行的 JavaScript 代码或JS文件路径。"},
|
"script": {"type": "string", "description": "要执行的 JavaScript 代码或JS文件路径。"},
|
||||||
"save_to_file": {"type": "string", "description": "结果存文件,适合返回值较长时。不支持await。", "default": ""},
|
"save_to_file": {"type": "string", "description": "结果存文件,适合返回值较长时。不支持await。", "default": ""},
|
||||||
"no_monitor": {"type": "boolean", "description": "跳过页面变更监控,仅读取信息时用,省2-3秒。", "default": false}}, "required": ["script"]}
|
"no_monitor": {"type": "boolean", "description": "跳过页面变更监控,省2-3秒。仅在纯读取信息时设置,页面操作时不要设置。", "default": false}}, "required": ["script"]}
|
||||||
}},
|
}},
|
||||||
{"type": "function", "function": {
|
{"type": "function", "function": {
|
||||||
"name": "update_working_checkpoint",
|
"name": "update_working_checkpoint",
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ L3: ../memory/ (记录库层 - 包含 .md/.py 等各类文件)
|
|||||||
**特征**:
|
**特征**:
|
||||||
- 体积限制:≤ 30 行(硬约束),< 1k tokens(期望)。严禁填写细节(除非极高频任务)
|
- 体积限制:≤ 30 行(硬约束),< 1k tokens(期望)。严禁填写细节(除非极高频任务)
|
||||||
- 内容:两层「场景关键词→记忆定位」映射 + RULES(红线规则 + 高频犯错点)
|
- 内容:两层「场景关键词→记忆定位」映射 + RULES(红线规则 + 高频犯错点)
|
||||||
- 第一层:高频场景 key→value(直接给出 sop/py/L2 section 名),自包含可只写一个词
|
- 第一层:高频场景 key→value(直接给出 sop/py/L2 section 名),自包含名称只写一词不重复翻译
|
||||||
- 第二层:低频场景仅列关键词,需要时 read L2 或 ls L3 自行定位
|
- 第二层:低频场景仅列关键词,需要时 read L2 或 ls L3 自行定位
|
||||||
- 作用:触发词,不索引则不知道有此能力
|
- 核心:场景触发词极重要(不索引则不知有此能力),但严禁写How-to细节
|
||||||
- RULES:压缩版避坑准则,包含:
|
- RULES:压缩版避坑准则,包含:
|
||||||
- 红线规则(致命型):违反会导致进程终止或系统崩溃(如 `禁无条件杀python(会杀自己)`)
|
- 红线规则(致命型):违反会导致进程终止或系统崩溃(如 `禁无条件杀python(会杀自己)`)
|
||||||
- 红线规则(隐蔽型):违反不报错但产生错误结果(如 `搜索用google不用百度`)
|
- 红线规则(隐蔽型):违反不报错但产生错误结果(如 `搜索用google不用百度`)
|
||||||
|
|||||||
@@ -1,40 +1,36 @@
|
|||||||
# Plan Mode SOP
|
# Plan Mode SOP
|
||||||
|
|
||||||
## 1. 分类:识别任务结构
|
> 简单任务(1-2步可完成)无需本SOP,直接做。
|
||||||
分析子任务间关系,选择匹配的结构:
|
|
||||||
|
|
||||||
- **Sequential** — 步骤间有输入输出依赖 (部署/ETL/构建)
|
## 0. 基本协议
|
||||||
- **MapReduce** — 多独立维度,各自深入后汇总 (5P/SWOT/多文件审查)
|
|
||||||
- **Branch** — 结果不确定,按条件选路径 (调试/探测/方案选择)
|
|
||||||
- **Loop** — 重复直到满足条件 (优化/翻页/迭代修改)
|
|
||||||
- **DAG** — 混合依赖,部分可并行 (项目开发)
|
|
||||||
|
|
||||||
可嵌套:大结构某步内部用另一种结构
|
进入 plan mode 后,立即调用 `update_working_checkpoint`,内容包含:
|
||||||
|
|
||||||
## 2. 分解模板
|
1. **PLAN**:初始为 `[ ] 规划` `[ ] 执行`,规划完成后展开为详细 checklist
|
||||||
|
2. **RULES**(以下三条原文写入,每次 update 必须保留):
|
||||||
|
- 一次只做一步,完成后标 [x] 并 update checkpoint
|
||||||
|
- 每次 checkpoint 必须保留完整 PLAN + RULES
|
||||||
|
- 全部 [x] 才可收尾
|
||||||
|
|
||||||
**Sequential:** `[ ] A → [ ] B → [ ] C`
|
## 1. 规划阶段
|
||||||
|
|
||||||
**MapReduce:**
|
初始 checkpoint:`[ ] 规划` `[ ] 执行`。"规划"完成 = 展开执行步骤并 update checkpoint。
|
||||||
```
|
|
||||||
MAP [子流程: 读现状→分析→输出]:
|
|
||||||
[ ] 维度1: ...
|
|
||||||
[ ] 维度2: ...
|
|
||||||
REDUCE:
|
|
||||||
[ ] 汇总 → 终稿
|
|
||||||
```
|
|
||||||
|
|
||||||
**Branch:** `[ ] 尝试X → 成功:[ ]Y / 失败:[ ]Z`
|
### 1a. 读 SOP
|
||||||
|
查 insight 找相关 SOP 并读取——SOP 提供任务骨架,直接指导分解。无则跳过。不确定性最高的环节先探,其结果可能推翻整个计划。
|
||||||
|
|
||||||
**Loop:** `[ ] LOOP(max=N): 执行→检查→调整`
|
### 1b. 分类
|
||||||
|
从依赖关系读出结构:有依赖→Sequential | 无依赖→MapReduce | 条件未知→Branch。可嵌套。
|
||||||
|
|
||||||
**DAG:** `[ ] A → [ ]{B,C}并行 → [ ]D汇聚`
|
### 1c. 分解
|
||||||
|
按结构展开 checklist(每步须有独立完成判据,否则继续拆)。update checkpoint 并标 `[x] 规划`。
|
||||||
|
- Seq: `[ ]A → [ ]B → [ ]C`
|
||||||
|
- MR: `MAP: [ ]D1 [ ]D2 … REDUCE: [ ]汇总`
|
||||||
|
- Branch: `[ ]尝试X → 成功:[ ]Y / 失败:[ ]Z`
|
||||||
|
|
||||||
## 3. 写入 checkpoint
|
## 2. 执行注意
|
||||||
|
|
||||||
=== PLAN (结构类型) ===
|
- 计划有误时回到规划修正,不硬凑;不可逆操作前多验证一步
|
||||||
...
|
- MapReduce 的 MAP 可用 subagent 并行执行
|
||||||
=== PLAN RULES ===
|
- 步骤间用尽量用文件传递中间结果和汇总,不靠上下文记忆
|
||||||
- 每完成/跳过一步,重新 update working checkpoint
|
- 收尾:全部 `[x]` 后汇总结果,清理 checkpoint
|
||||||
- 任何 checkpoint update 必须保留 PLAN
|
|
||||||
================
|
|
||||||
@@ -67,7 +67,10 @@ document.body.appendChild(el); // 响应写回el.textContent
|
|||||||
|
|
||||||
## autofill获取
|
## autofill获取
|
||||||
检测:web_scan输出input带`data-autofilled="true"`,value显示为受保护提示(非真实值,Chrome安全保护需点击释放)
|
检测:web_scan输出input带`data-autofilled="true"`,value显示为受保护提示(非真实值,Chrome安全保护需点击释放)
|
||||||
- ⭐首选CDP:tabs获取tabId→CDP mousePressed点击输入框→autofill值释放→JS读`.value`(无需前台)
|
- ⭐首选CDP batch一次完成:tabs获tabId→mousePressed+mouseReleased点击**任一**输入框→全部autofill字段值释放→JS读`.value`
|
||||||
|
- ⚠点击一个autofill字段会释放页面上所有autofill字段的值,无需逐个点击
|
||||||
|
- ⚠必须mousePressed+mouseReleased配对才算完整点击
|
||||||
|
- batch示例:`{cmd:'batch',commands:[{cmd:'tabs'},{cmd:'cdp',tabId:'$0.0.id',method:'Input.dispatchMouseEvent',params:{type:'mousePressed',x:X,y:Y,button:'left',clickCount:1}},{cmd:'cdp',tabId:'$0.0.id',method:'Input.dispatchMouseEvent',params:{type:'mouseReleased',x:X,y:Y,button:'left',clickCount:1}}]}`
|
||||||
- 备选PostMessage物理点击(仅Windows/需前台):枚举Chrome窗口标题匹配→rect*dpr→WM_LBUTTONDOWN/UP到Chrome_RenderWidgetHostHWND子窗口
|
- 备选PostMessage物理点击(仅Windows/需前台):枚举Chrome窗口标题匹配→rect*dpr→WM_LBUTTONDOWN/UP到Chrome_RenderWidgetHostHWND子窗口
|
||||||
- 坑:多RenderWidgetHostHWND共存,必须按父窗口标题匹配再取子窗口
|
- 坑:多RenderWidgetHostHWND共存,必须按父窗口标题匹配再取子窗口
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user