pageqa 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -8
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +27 -9
- package/dist/agent.js.map +1 -1
- package/dist/bsk/tools.d.ts +27 -1
- package/dist/bsk/tools.js +133 -24
- package/dist/bsk/tools.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/locator.d.ts +14 -0
- package/dist/locator.js +15 -7
- package/dist/locator.js.map +1 -1
- package/dist/record.d.ts +2 -11
- package/dist/record.js +4 -5
- package/dist/record.js.map +1 -1
- package/dist/replay.js +9 -7
- package/dist/replay.js.map +1 -1
- package/dist/report.d.ts +10 -3
- package/dist/report.js +13 -4
- package/dist/report.js.map +1 -1
- package/dist/snapshot.d.ts +15 -0
- package/dist/snapshot.js +167 -0
- package/dist/snapshot.js.map +1 -0
- package/examples/smoke-test-page.html +531 -0
- package/examples/smoke-test.md +43 -0
- package/examples/smoke-test.replay.json +389 -0
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -72,7 +72,7 @@ bsk session start # 可选:手动创建 session(不传 --session 时 page
|
|
|
72
72
|
|
|
73
73
|
### 4. Jev 语义断言(可选增强)
|
|
74
74
|
|
|
75
|
-
> **什么是 Jev?** Jev 是 TypeSafe AI 推出的 [System One 模型](https://docs.typesafe.ai),专为结构化决策设计。它不做文本生成,而是直接返回校准后的概率值(如匹配度 0.93
|
|
75
|
+
> **什么是 Jev?** Jev 是 TypeSafe AI 推出的 [System One 模型](https://docs.typesafe.ai),专为结构化决策设计。它不做文本生成,而是直接返回校准后的概率值(如匹配度 0.93)。pageqa 用它做**字面匹配失败后的语义复核**,把「同义词 / 近义表达 / 格式差异」造成的误报 FAIL 纠正过来。
|
|
76
76
|
|
|
77
77
|
**启用方式**:在 `~/.pageqa/config.json` 中添加 `jev` 字段,或设置环境变量:
|
|
78
78
|
|
|
@@ -109,7 +109,7 @@ bsk session start # 可选:手动创建 session(不传 --session 时 page
|
|
|
109
109
|
1. 访问 [console.typesafe.ai/settings/keys](https://console.typesafe.ai/settings/keys)(需等待早期访问权限)
|
|
110
110
|
2. 或通过 Vercel AI Gateway 获取
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
**工作原理(按需调用)**:`assert_text` 先做字符串包含匹配——**字面命中即成立,不调用 Jev**(省掉一次远端往返,也避免把肉眼可见的文本判成不成立);只有**字面未命中**时才把页面快照文本发给 Jev 做一次语义复核,由 Jev 判断页面内容是否语义匹配断言期望(匹配概率 ≥ `threshold` 即成立)。所以 Jev 只用在真正需要它的地方:同义词、近义表达、格式差异导致的误报 FAIL。每条断言最多一次 Jev 调用,长流程不会被逐条断言拖慢。
|
|
113
113
|
|
|
114
114
|
**降级机制**:若 Jev API 调用失败(网络/超时/鉴权错误),会自动回退到原有的字符串包含匹配,确保测试不因 Jev 服务中断而失败。
|
|
115
115
|
|
|
@@ -120,7 +120,7 @@ bsk session start # 可选:手动创建 session(不传 --session 时 page
|
|
|
120
120
|
└─> pi-agent-core Agent(LLM → 可配置 OpenAI 兼容端点)
|
|
121
121
|
└─> bsk 工具:navigate / snapshot / click / fill / hover / scroll / wait
|
|
122
122
|
└─> 真实浏览器(bsk 连接)
|
|
123
|
-
└─> assert_text ──→ Jev Noul API
|
|
123
|
+
└─> assert_text ──→ 字面命中即成立;未命中才问 Jev Noul API(可选,语义复核)
|
|
124
124
|
└─> 结论与证据 → 报告(文本/JSON)+ 退出码
|
|
125
125
|
```
|
|
126
126
|
|
|
@@ -201,6 +201,27 @@ Token 消耗: 输入 446 / 输出 136 / 缓存读 6720 / 缓存写 0 / 合计 73
|
|
|
201
201
|
- JSON 报告(`--json`)中为 `usage` 字段:`{ input, output, cacheRead, cacheWrite, reasoning, total, calls }`。
|
|
202
202
|
- 若 LLM 端点未返回 usage(合计为 0),会在同一行标注「端点未返回 usage」,避免把 0 误读成真实消耗。
|
|
203
203
|
|
|
204
|
+
### 快照瘦身与复用(省 token 与时间)
|
|
205
|
+
|
|
206
|
+
长页面的一次快照几千至上万字符,而它在长流程里要被读几十次——既吃上下文,也吃推理时间。为此 pageqa 对快照做了两件事:
|
|
207
|
+
|
|
208
|
+
**1)瘦身**:只有原文超过 8000 字符才启用,规则保守且不改变定位:
|
|
209
|
+
|
|
210
|
+
- **带 `@eN` 的行永不截断、永不丢弃**(模型靠它点击,录制/回放的语义定位符也靠它解析 role/name);
|
|
211
|
+
- `@eN` 行的**祖先链永不丢弃**(祖先路径是同名元素消歧的依据,见「回放脚本」一节);
|
|
212
|
+
- 元信息行(`@vom`/`@view`/`@layers`/`L1 page`)保留;空行省略;
|
|
213
|
+
- 其余文本行:超过 160 字符才截断(保留开头);瘦身后仍超 20000 字符时,再从最长的非关键行开始整行省略,短文本(标题/标签/状态提示)优先保留;
|
|
214
|
+
- 结尾附一行说明(`[pageqa] 快照已瘦身:a → b 字符…`),让模型知道有些内容没看到,而不是以为页面就这么点内容。
|
|
215
|
+
|
|
216
|
+
因此**模型看到的文本与定位解析用的文本是同一份**,role/name/祖先路径都不变;`--debug` 会打印每次瘦身的字符数变化。
|
|
217
|
+
|
|
218
|
+
**2)复用**:所有会改动页面的动作(`navigate`/`click`/`fill`/`upload`/`hover`/`scroll`/`wait`)都会让上一份快照失效,因此复用只发生在**纯读取之后**:
|
|
219
|
+
|
|
220
|
+
- 模型「刚 `snapshot` 完就 `assert_text`」→ 断言直接复用那份快照,省掉一次 bsk 往返(断言窗口 5s,`snapshot` 自身去重窗口 1s);注意断言的字面匹配用**瘦身前**的完整快照——瘦身只影响喂给模型的上下文,不影响断言所依据的页面全文;
|
|
221
|
+
- 回放中「上一步是断言、下一步要定位元素」同理;而重试前会 `wait`,等待必然置为失效,所以「每次重试重新取快照」的既有行为保持不变。
|
|
222
|
+
|
|
223
|
+
页面自身异步更新带来的偏差,靠短窗口兜住:窗口外一律重新抓取。
|
|
224
|
+
|
|
204
225
|
### 脚本占位符(运行时变量)
|
|
205
226
|
|
|
206
227
|
脚本里可以写 `${timestamp}` 之类的占位符,CLI 在读取脚本时按本机当前时间展开。同一次运行内所有占位符共用同一时刻,所以「名称 + 时间戳」这类用例既不会重名,也不必每次手工改时间戳:
|
|
@@ -250,7 +271,7 @@ pageqa --replay examples/smoke.replay.json --semantic # 断言改用 Jev 语
|
|
|
250
271
|
- **其它失败**(元素找到了但操作报错、断言不成立)→ 记为失败并**继续跑完**,一次拿到整条用例的完整健康报告;报告指出「回放第 n 步(kind)/对应用例第 k 步:<用例原文>」。退出码仍为非零,失败不会被吞掉。
|
|
251
272
|
- **navigate 失败** → 后续步骤没有意义,直接中止。
|
|
252
273
|
- 想回到「一失败就停」的旧行为:加 `--fail-fast`。
|
|
253
|
-
-
|
|
274
|
+
- **断言默认是字符串包含**:零模型回放不碰任何远端服务。录制时**靠 Jev 语义复核才成立**的断言(如「检出成功」「标题包含 Example」这类字面不出现在页面上的措辞)会逐条标记为语义断言:回放**开始前**就提示脚本里有几条这类断言(字面匹配必然不成立),失败时再提示「可加 `--semantic` 重试」。字面命中的断言不标记——回放用字符串匹配同样能通过。
|
|
254
275
|
- **多场景**:一个脚本文件包含全部场景,逐个回放(各自独立 session 与浏览器窗口),任一场景失败则整体失败、退出码 `1`。
|
|
255
276
|
- **源用例变更**:脚本记录源用例内容哈希,回放时若源文件已改动会在 stderr 提示(只警告、不失败),提示你重新生成脚本。
|
|
256
277
|
- **PASS/FAIL 都会生成**:失败轨迹同样能导出,便于排查「模型这次到底做了什么」;但模型一步都没成功执行时脚本为空,回放会直接拒绝执行,不会伪装成「0 步全通过」。
|
|
@@ -283,7 +304,7 @@ pageqa --replay examples/smoke.replay.json --semantic # 断言改用 Jev 语
|
|
|
283
304
|
```
|
|
284
305
|
|
|
285
306
|
- 覆盖的关键节点:脚本读取、LLM 就绪、bsk daemon 启动/就绪耗时、浏览器连接数、session、每一步工具调用(编号 + 名称 + 耗时 + 成败)、自动续跑、最终结论与总耗时。
|
|
286
|
-
- 加 `--debug` 可看到更细的明细:每条 `bsk`
|
|
307
|
+
- 加 `--debug` 可看到更细的明细:每条 `bsk` 命令原文与耗时、快照体积与瘦身统计、快照复用、上下文裁剪、Jev 请求详情。
|
|
287
308
|
- 需要把日志与报告分开处理时:报告在 stdout(`--json` 也走 stdout),日志始终在 stderr,`pageqa --json … > report.json` 即可不受日志干扰。
|
|
288
309
|
|
|
289
310
|
### CLI 选项
|
|
@@ -355,7 +376,7 @@ pageqa examples/element-plus-upload.md
|
|
|
355
376
|
可用工具(`src/bsk/tools.ts`):
|
|
356
377
|
|
|
357
378
|
- `navigate(url)` 打开网页
|
|
358
|
-
- `snapshot()` 读取页面 aria
|
|
379
|
+
- `snapshot()` 读取页面 aria 树与可见文本(标题、段落、链接、按钮等);返回前会做瘦身(见「快照瘦身与复用」),短期内无页面改动时直接复用上一份
|
|
359
380
|
- `click(target)` / `fill(target, value)` / `hover(target)` 元素交互(target 用 `@eN` 引用或 CSS 选择器)
|
|
360
381
|
- `upload(target, file)` 上传本地文件(target 为触发文件选择器的元素,省略则由 bsk 自动查找文件输入框)
|
|
361
382
|
- `scroll(target)` / `wait(ms)` 滚动与等待
|
|
@@ -363,11 +384,13 @@ pageqa examples/element-plus-upload.md
|
|
|
363
384
|
|
|
364
385
|
**长流程保护(自动续跑)**:一轮对话结束后,如果 agent 自报的进度没跑满(`步骤完成:k/n` 且 `k < n`),或者用例里写了断言但报告只解析到一部分,pageqa 会自动补一次「继续执行剩余步骤」的提示并继续跑,最多 5 轮;续跑后进度与断言数都没有推进就停止。这样可以避免模型做完一两步就自行收尾、却让报告看起来正常的情况。
|
|
365
386
|
|
|
387
|
+
断言的准源是 `assert_text` 工具返回的结构化结果(期望值 + 成立/不成立 + 证据),而不是模型自述的措辞:模型常写成「…,断言成立。」,从文本反推既不可靠,也会把一条**全部通过**的用例报成「用例中的断言全部执行(实际 0/N)」的假失败。只有在拿不到工具结果时(回放、纯文本输入)才退回解析结论文本。
|
|
388
|
+
|
|
366
389
|
## 验证
|
|
367
390
|
|
|
368
391
|
```bash
|
|
369
392
|
pnpm test # 端到端冒烟:需 bsk daemon 已连接浏览器 + LLM 端点可用
|
|
370
|
-
pnpm run test:unit # 仅单元测试:不依赖浏览器与 LLM(报告解析 +
|
|
393
|
+
pnpm run test:unit # 仅单元测试:不依赖浏览器与 LLM(报告解析 + 定位符/录制/回放脚本 + 快照瘦身)
|
|
371
394
|
```
|
|
372
395
|
|
|
373
396
|
冒烟测试覆盖:A1 打开+标题断言、A2 元素交互与断言、A3 失败可读原因与退出码、A4 文本/JSON 报告。需 bsk daemon 连接浏览器且 LLM 端点可用。
|
|
@@ -404,6 +427,7 @@ src/
|
|
|
404
427
|
bsk/tools.ts browserskill 操作层与工具层(含 upload 文件上传、录制上报)
|
|
405
428
|
record.ts 录制层(把成功操作与断言记成可回放步骤)
|
|
406
429
|
locator.ts 语义定位符(快照解析 + 回放时按 role/name/序号重定位)
|
|
430
|
+
snapshot.ts 快照瘦身(保留可交互节点与祖先链,截断长文本;降低上下文压力)
|
|
407
431
|
replay.ts 回放脚本(格式、读写校验 + 零模型回放引擎)
|
|
408
432
|
report.ts 报告解析、渲染与套件汇总(LLM 运行与回放共用)
|
|
409
433
|
examples/
|
|
@@ -412,5 +436,5 @@ examples/
|
|
|
412
436
|
element-plus-upload.md 文件上传用例(点击 Click to upload 上传本地图片)
|
|
413
437
|
plm-product-bom.md PLM 长流程用例(建产品→目录→物料→检出→待办同意→BOM 插入)
|
|
414
438
|
tests/smoke.test.mjs 端到端验证
|
|
415
|
-
tests/report.test.mjs / tests/replay.test.mjs 单元测试(无浏览器/LLM 依赖)
|
|
439
|
+
tests/report.test.mjs / tests/replay.test.mjs / tests/snapshot.test.mjs 单元测试(无浏览器/LLM 依赖)
|
|
416
440
|
```
|
package/dist/agent.d.ts
CHANGED
|
@@ -28,7 +28,7 @@ interface Scenario {
|
|
|
28
28
|
/**
|
|
29
29
|
* 用 pi-agent-core 编排一次自然语言页面测试:注入 bsk 工具,驱动浏览器执行,整理报告。
|
|
30
30
|
* 若配置中启用了 Jev(PAGEQA_JEV_ENABLED=true 且配置了 API Key),
|
|
31
|
-
*
|
|
31
|
+
* 断言在**字面包含未命中**时会请 Jev 做一次语义复核(命中则不调用,省一次远端往返)。
|
|
32
32
|
*
|
|
33
33
|
* 无论用例通过、失败还是中途抛错,结束后都会关闭本次的 bsk session,
|
|
34
34
|
* 从而关掉自动化操作的那个浏览器窗口(Agent Window)。
|
package/dist/agent.js
CHANGED
|
@@ -38,6 +38,9 @@ const DEFAULT_SYSTEM_PROMPT = [
|
|
|
38
38
|
"- 很多组件库(如 element-plus 的 el-dropdown)的下拉菜单是**悬停触发**的:必须先用 hover 悬停在触发按钮上、等菜单展开,再 click 菜单项。直接 click 触发按钮常常点不开菜单。",
|
|
39
39
|
"- 判断菜单是否已展开:snapshot 里出现了对应的菜单项(如 menuitem「上传文档」)。若 click 触发按钮后 snapshot 里没有菜单项,改为 hover 再点,不要继续在同一个位置重复 click。",
|
|
40
40
|
"- 页面上可能有多个同名下拉(例如页面级的「操作」与当前区域级的「操作」)。选错会展开完全不同的菜单,后续步骤连锁失败:请按当前操作的区域选择那一个,并在它展开后确认菜单项与用例要求一致。",
|
|
41
|
+
"- `@eN` 编号只在**最近一次 snapshot 的页面状态下**有效:展开/收起下拉菜单、切换路由、提交表单等任何页面变化都会重新编号。若在你上次 snapshot 之后页面又变化过,必须先重新 snapshot 再取用 `@eN`,不得沿用旧编号——沿用会点到编号相同的另一个元素,而且工具不会报错。",
|
|
42
|
+
"- 若快照里找不到目标元素(例如展开的下拉菜单把下方控件遮住了),不要凭编号猜:先重新 snapshot(必要时先收起菜单),等目标元素出现在快照里再操作。",
|
|
43
|
+
"- 声称某一步完成前必须有依据:快照或工具结果里能看到该操作的效果(选中态、填入值、成功提示)。看不到就说明没生效,要重新定位后重做,不要照抄用例描述交差。",
|
|
41
44
|
"",
|
|
42
45
|
"表单提交失败处理(关键,不得跳过):",
|
|
43
46
|
"- 点击「提交 / 确定 / 保存 / 确认」类按钮后,必须先确认动作是否真的成功:弹窗是否关闭、是否出现成功提示、列表数据是否刷新。",
|
|
@@ -143,7 +146,7 @@ function trimOldToolResults(messages, keepRecent, maxChars) {
|
|
|
143
146
|
/**
|
|
144
147
|
* 用 pi-agent-core 编排一次自然语言页面测试:注入 bsk 工具,驱动浏览器执行,整理报告。
|
|
145
148
|
* 若配置中启用了 Jev(PAGEQA_JEV_ENABLED=true 且配置了 API Key),
|
|
146
|
-
*
|
|
149
|
+
* 断言在**字面包含未命中**时会请 Jev 做一次语义复核(命中则不调用,省一次远端往返)。
|
|
147
150
|
*
|
|
148
151
|
* 无论用例通过、失败还是中途抛错,结束后都会关闭本次的 bsk session,
|
|
149
152
|
* 从而关掉自动化操作的那个浏览器窗口(Agent Window)。
|
|
@@ -186,14 +189,24 @@ async function initializeAgent(input, opts, holder) {
|
|
|
186
189
|
log("[runAgent] Jev enabled=" + jevClient.enabled);
|
|
187
190
|
info(`[pageqa] 语义断言(Jev)${jevClient.enabled ? "已启用" : "未启用"}`);
|
|
188
191
|
// 录制器:始终收集本次运行的操作序列,是否落盘由 CLI 的 --emit-script 决定。
|
|
189
|
-
//
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
192
|
+
// 「哪条断言靠 Jev 语义复核才成立」由工具层逐条上报(见 bsk/tools.ts),
|
|
193
|
+
// 不再按「整场是否启用 Jev」一刀切——字面命中的断言回放同样能通过,不必标记。
|
|
194
|
+
const recorder = new Recorder(opts.vars ?? []);
|
|
195
|
+
// 断言结果由工具层逐条上报(见 bsk/tools.ts 的 onExec),报告不再依赖模型措辞。
|
|
196
|
+
const assertions = [];
|
|
193
197
|
const tools = createBskTools({
|
|
194
198
|
session,
|
|
195
199
|
jevClient,
|
|
196
|
-
onExec: (event) =>
|
|
200
|
+
onExec: (event) => {
|
|
201
|
+
recorder.noteTool(event);
|
|
202
|
+
if (event.assert) {
|
|
203
|
+
assertions.push({
|
|
204
|
+
expectation: event.assert.expectation,
|
|
205
|
+
verdict: event.assert.pass ? "pass" : "fail",
|
|
206
|
+
evidence: event.assert.evidence,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
},
|
|
197
210
|
});
|
|
198
211
|
log("[runAgent] 工具数=" +
|
|
199
212
|
tools.length +
|
|
@@ -225,7 +238,7 @@ async function initializeAgent(input, opts, holder) {
|
|
|
225
238
|
},
|
|
226
239
|
});
|
|
227
240
|
subscribeProgress(agent, events, recorder);
|
|
228
|
-
return { agent, events, numbered, steps, recorder, startedAt };
|
|
241
|
+
return { agent, events, numbered, steps, recorder, assertions, startedAt };
|
|
229
242
|
}
|
|
230
243
|
/**
|
|
231
244
|
* 订阅 agent 事件,把工具调用与模型输出记入 events,并把进度回显到 stderr。
|
|
@@ -286,7 +299,12 @@ async function executeWithContinuations(session, input) {
|
|
|
286
299
|
break;
|
|
287
300
|
const transcriptSoFar = events.join("");
|
|
288
301
|
const progress = parseProgress(transcriptSoFar);
|
|
289
|
-
|
|
302
|
+
// 断言进度以工具结果为准(模型自述的措辞时好时坏,可能一条都解析不出来);
|
|
303
|
+
// 只有在拿不到工具结果时才退回按结论文本解析(与 buildReport 同一条规则,
|
|
304
|
+
// 不能用两者较大值——结论文本解析计数一高就会压过可靠的工具结果)。
|
|
305
|
+
const parsed = session.assertions.length > 0
|
|
306
|
+
? session.assertions.length
|
|
307
|
+
: parseAssertions(transcriptSoFar).length;
|
|
290
308
|
const incomplete = progress
|
|
291
309
|
? progress.done < progress.total
|
|
292
310
|
: expectedAssertions > 0 && parsed < expectedAssertions;
|
|
@@ -333,7 +351,7 @@ function finalizeResult(session, input, opts) {
|
|
|
333
351
|
if (agentError)
|
|
334
352
|
events.push("\n[agent-error] " + agentError + "\n");
|
|
335
353
|
const transcript = events.join("");
|
|
336
|
-
const report = buildReport(input, transcript);
|
|
354
|
+
const report = buildReport(input, transcript, session.assertions);
|
|
337
355
|
// 报告里标注回放脚本的落盘位置(真正写文件由 CLI 在运行结束后完成)
|
|
338
356
|
if (opts.scriptPath)
|
|
339
357
|
report.script = opts.scriptPath;
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/bsk/tools.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export interface BskOps {
|
|
|
16
16
|
/** 最近一次快照文本(每次 snapshot / assert_text 都会刷新)。 */
|
|
17
17
|
lastSnapshot(): string;
|
|
18
18
|
navigate(url: string): string;
|
|
19
|
+
/** 读取页面快照(已瘦身);期间无页面改动且间隔很短时复用上一份,不重新抓取。 */
|
|
19
20
|
snapshot(): string;
|
|
20
21
|
click(target: string): string;
|
|
21
22
|
fill(target: string, value: string): string;
|
|
@@ -23,8 +24,29 @@ export interface BskOps {
|
|
|
23
24
|
hover(target: string): string;
|
|
24
25
|
scroll(target: string): string;
|
|
25
26
|
wait(ms: number): string;
|
|
26
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* 断言页面是否包含期望文本:字面包含优先,字面未命中时(Jev 可用)才做语义复核。
|
|
29
|
+
*/
|
|
27
30
|
assertText(expectation: string): Promise<string>;
|
|
31
|
+
/** 最近一次 assertText 是否**靠 Jev 语义判断才成立**(供录制标记语义断言)。 */
|
|
32
|
+
lastAssertSemantic(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 最近一次 assertText 的**结构化结果**(期望值、成立与否、证据)。
|
|
35
|
+
*
|
|
36
|
+
* 报告用它做断言的准源:工具返回的「成立/不成立」是确定性的,而模型自述的措辞
|
|
37
|
+
* 千变万化(「…,断言成立。」这类写法既没有期望值也没法可靠解析),据此解析
|
|
38
|
+
* 会造成「实际已全部通过却报 0/N」的假失败。
|
|
39
|
+
*/
|
|
40
|
+
lastAssert(): AssertOutcome | null;
|
|
41
|
+
}
|
|
42
|
+
/** 一次 assert_text 的结构化结果。 */
|
|
43
|
+
export interface AssertOutcome {
|
|
44
|
+
/** 断言期望(模型传给 assert_text 的 expectation)。 */
|
|
45
|
+
expectation: string;
|
|
46
|
+
/** 是否成立。 */
|
|
47
|
+
pass: boolean;
|
|
48
|
+
/** 证据(页面里看到/没看到什么,或 Jev 语义匹配度)。 */
|
|
49
|
+
evidence: string;
|
|
28
50
|
}
|
|
29
51
|
export declare function createBskOps(session: string, jevClient?: JevClient): BskOps;
|
|
30
52
|
/** 工具层上报的一次执行(供录制回放脚本)。 */
|
|
@@ -37,6 +59,10 @@ export interface BskToolExec {
|
|
|
37
59
|
ok: boolean;
|
|
38
60
|
/** 本次操作**之前**页面最后一次快照文本。 */
|
|
39
61
|
lastSnapshot: string;
|
|
62
|
+
/** 断言是否靠 Jev 语义判断才成立(仅 assert_text 会上报该字段)。 */
|
|
63
|
+
semantic?: boolean;
|
|
64
|
+
/** 断言的结构化结果(仅 assert_text 成功时上报);报告据此判定,而非解析模型措辞。 */
|
|
65
|
+
assert?: AssertOutcome;
|
|
40
66
|
}
|
|
41
67
|
export interface BskToolOptions {
|
|
42
68
|
session: string;
|
package/dist/bsk/tools.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { execFile, execFileSync, spawn } from "node:child_process";
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
import { debugLog, info, timer } from "../log.js";
|
|
4
|
+
import { slimSnapshot } from "../snapshot.js";
|
|
4
5
|
/**
|
|
5
6
|
* browserskill(`bsk`)工具层:把 bsk CLI 命令包装成 pi-agent-core 的 AgentTool。
|
|
6
7
|
*
|
|
@@ -164,13 +165,89 @@ function paramsOf(properties, required = []) {
|
|
|
164
165
|
required,
|
|
165
166
|
};
|
|
166
167
|
}
|
|
168
|
+
/**
|
|
169
|
+
* 连续重复抓取的去重窗口:模型(或回放)在没有任何改页面动作的情况下又要素一份快照时,
|
|
170
|
+
* 直接给上一份,省掉一次 bsk 往返。窗口给得短——它要覆盖的只是「刚看过又要素」这种重复。
|
|
171
|
+
*/
|
|
172
|
+
const SNAPSHOT_DEDUP_MS = 1_000;
|
|
173
|
+
/**
|
|
174
|
+
* 断言可复用快照的窗口。
|
|
175
|
+
*
|
|
176
|
+
* 断言的「当下」比定位更敏感(页面可能已被异步更新),因此只在自上次快照以来
|
|
177
|
+
* 没有任何改页面动作、且间隔很短的条件下复用;窗口外的实情是「模型思考了足够久」,
|
|
178
|
+
* 此时宁可按原行为重新抓取。
|
|
179
|
+
*/
|
|
180
|
+
const SNAPSHOT_ASSERT_MS = 5_000;
|
|
167
181
|
export function createBskOps(session, jevClient) {
|
|
168
182
|
const quiet = ["--session", session, "--quiet"];
|
|
169
183
|
let snapshotText = "";
|
|
184
|
+
/** 同一份快照瘦身前的完整原文(assert_text 的字面匹配必须用它,见 ensureRawSnapshot)。 */
|
|
185
|
+
let snapshotRawText = "";
|
|
186
|
+
let assertSemantic = false;
|
|
187
|
+
let assertOutcome = null;
|
|
188
|
+
/** 最近一次快照的时刻与新鲜度(见 ensureSnapshot)。 */
|
|
189
|
+
let snapshotAt = 0;
|
|
190
|
+
let snapshotFresh = false;
|
|
191
|
+
/** 页面被本工具改动过(或刚刚等待过),之前的快照不再可信。 */
|
|
192
|
+
const markStale = () => {
|
|
193
|
+
snapshotFresh = false;
|
|
194
|
+
};
|
|
195
|
+
/** 真正抓一次快照:瘦身后交给模型,并按需记录瘦身统计。 */
|
|
196
|
+
const takeSnapshot = () => {
|
|
197
|
+
const raw = bsk(["snapshot", ...quiet]);
|
|
198
|
+
const slim = slimSnapshot(raw);
|
|
199
|
+
if (slim.applied) {
|
|
200
|
+
debugLog(`[bsk] snapshot 瘦身:${slim.before} -> ${slim.after} 字符` +
|
|
201
|
+
`(截断 ${slim.truncatedLines} 行、省略 ${slim.droppedLines} 行)`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// 快照体积直接决定上下文压力(长流程易因上下文超限被中断)
|
|
205
|
+
debugLog("[bsk] snapshot 字符数=" + raw.length);
|
|
206
|
+
}
|
|
207
|
+
snapshotRawText = raw;
|
|
208
|
+
snapshotText = slim.text;
|
|
209
|
+
snapshotAt = Date.now();
|
|
210
|
+
snapshotFresh = true;
|
|
211
|
+
return snapshotText;
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* 取快照:自上次快照后页面**没有被本工具改动**、且间隔在 maxAgeMs 内时复用上一份。
|
|
215
|
+
*
|
|
216
|
+
* 所有会改动页面的操作(navigate/click/fill/upload/hover/scroll/wait)都会把快照置为
|
|
217
|
+
* 不新鲜,因此复用只可能发生在「纯读取之后」——最典型的是「刚 snapshot 完就断言」
|
|
218
|
+
* 或回放里「上一步是断言、下一步要定位」。页面自身异步更新导致的偏差由窗口兜住。
|
|
219
|
+
*/
|
|
220
|
+
const ensureSnapshot = (maxAgeMs, label) => {
|
|
221
|
+
const age = Date.now() - snapshotAt;
|
|
222
|
+
if (snapshotFresh && age <= maxAgeMs) {
|
|
223
|
+
debugLog(`[bsk] ${label} 复用 ${age}ms 前的快照(期间页面未被改动)`);
|
|
224
|
+
return snapshotText;
|
|
225
|
+
}
|
|
226
|
+
return takeSnapshot();
|
|
227
|
+
};
|
|
228
|
+
/**
|
|
229
|
+
* 同 ensureSnapshot,但返回**瘦身前**的完整原文。
|
|
230
|
+
*
|
|
231
|
+
* 断言的字面匹配必须基于完整快照:瘦身会截断长文本行、整行省略非关键文本,
|
|
232
|
+
* 拿瘦身文本做 includes,针对长页面文本的断言会假未命中,且证据不会说明漏看。
|
|
233
|
+
* 模型上下文仍吃瘦身文本,省 token 的收益不受影响。
|
|
234
|
+
*/
|
|
235
|
+
const ensureRawSnapshot = (maxAgeMs, label) => {
|
|
236
|
+
const age = Date.now() - snapshotAt;
|
|
237
|
+
if (snapshotFresh && age <= maxAgeMs) {
|
|
238
|
+
debugLog(`[bsk] ${label} 复用 ${age}ms 前的完整快照(期间页面未被改动)`);
|
|
239
|
+
return snapshotRawText;
|
|
240
|
+
}
|
|
241
|
+
takeSnapshot();
|
|
242
|
+
return snapshotRawText;
|
|
243
|
+
};
|
|
170
244
|
return {
|
|
171
245
|
session,
|
|
172
246
|
lastSnapshot: () => snapshotText,
|
|
247
|
+
lastAssertSemantic: () => assertSemantic,
|
|
248
|
+
lastAssert: () => assertOutcome,
|
|
173
249
|
navigate(url) {
|
|
250
|
+
markStale();
|
|
174
251
|
const out = bsk([
|
|
175
252
|
"navigate",
|
|
176
253
|
url,
|
|
@@ -181,17 +258,15 @@ export function createBskOps(session, jevClient) {
|
|
|
181
258
|
return `已导航到 ${url}\n${out}`;
|
|
182
259
|
},
|
|
183
260
|
snapshot() {
|
|
184
|
-
|
|
185
|
-
snapshotText = out;
|
|
186
|
-
// 快照体积直接决定上下文压力(长流程易因上下文超限被中断)
|
|
187
|
-
debugLog("[bsk] snapshot 字符数=" + out.length);
|
|
188
|
-
return out;
|
|
261
|
+
return ensureSnapshot(SNAPSHOT_DEDUP_MS, "snapshot");
|
|
189
262
|
},
|
|
190
263
|
click(target) {
|
|
264
|
+
markStale();
|
|
191
265
|
const out = bsk(["click", target, ...quiet]);
|
|
192
266
|
return `已点击 ${target}\n${out}`;
|
|
193
267
|
},
|
|
194
268
|
fill(target, value) {
|
|
269
|
+
markStale();
|
|
195
270
|
const out = bsk(["fill", target, "--value", value, ...quiet]);
|
|
196
271
|
return `已在 ${target} 填入文本\n${out}`;
|
|
197
272
|
},
|
|
@@ -199,6 +274,7 @@ export function createBskOps(session, jevClient) {
|
|
|
199
274
|
if (!existsSync(file)) {
|
|
200
275
|
throw new Error(`待上传文件不存在:${file}`);
|
|
201
276
|
}
|
|
277
|
+
markStale();
|
|
202
278
|
const args = ["upload"];
|
|
203
279
|
if (target)
|
|
204
280
|
args.push(target);
|
|
@@ -207,42 +283,66 @@ export function createBskOps(session, jevClient) {
|
|
|
207
283
|
return `已上传文件 ${file}\n${out}`;
|
|
208
284
|
},
|
|
209
285
|
hover(target) {
|
|
286
|
+
markStale();
|
|
210
287
|
const out = bsk(["hover", target, ...quiet]);
|
|
211
288
|
return `已悬停 ${target}\n${out}`;
|
|
212
289
|
},
|
|
213
290
|
scroll(target) {
|
|
214
291
|
// scroll-to 同时支持 @eN 引用与 CSS 选择器。
|
|
215
292
|
// (早期实现用 evaluate + querySelector,遇到 @eN 会静默返回 element-not-found。)
|
|
293
|
+
markStale();
|
|
216
294
|
const out = bsk(["scroll-to", target, ...quiet]);
|
|
217
295
|
return `已滚动到 ${target}\n${out}`;
|
|
218
296
|
},
|
|
219
297
|
wait(ms) {
|
|
220
|
-
// wait-ms 是 daemon 端 sleep,不接受 --session
|
|
298
|
+
// wait-ms 是 daemon 端 sleep,不接受 --session。
|
|
299
|
+
// 等待本身就是为了让页面变化(异步渲染/动画/弹窗),因此必须置为不新鲜:
|
|
300
|
+
// 回放的「每步重试前重新取快照」正是靠它生效的。
|
|
301
|
+
markStale();
|
|
221
302
|
bsk(["wait-ms", String(ms)]);
|
|
222
303
|
return `已等待 ${ms}ms`;
|
|
223
304
|
},
|
|
224
305
|
async assertText(expectation) {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
const
|
|
306
|
+
// 断言要的是「当下」+「完整」:只有在期间没有任何改页面动作、且间隔很短时才复用,
|
|
307
|
+
// 并且字面匹配基于瘦身前的完整快照(ensureRawSnapshot 里有原因说明)。
|
|
308
|
+
const snap = ensureRawSnapshot(SNAPSHOT_ASSERT_MS, "assert_text");
|
|
309
|
+
// 本次断言是否「靠语义判断才成立」,每次调用先重置:
|
|
310
|
+
// 只有字面未命中、由 Jev 复核判定成立的断言才为 true。
|
|
311
|
+
assertSemantic = false;
|
|
312
|
+
// 字面包含匹配即默认路径,也是 Jev 不可用时的回退;
|
|
313
|
+
// 结论与证据同时写进 assertOutcome,供报告直接取用(不依赖模型自述措辞)。
|
|
314
|
+
const literalHit = snap.includes(expectation);
|
|
315
|
+
const verdict = (pass, why) => {
|
|
316
|
+
assertOutcome = { expectation, pass, evidence: why };
|
|
317
|
+
return `断言「${expectation}」:${pass ? "成立" : "不成立"}。${why}`;
|
|
318
|
+
};
|
|
319
|
+
const literalWhy = literalHit
|
|
320
|
+
? `页面中包含「${expectation}」`
|
|
321
|
+
: `页面中未找到「${expectation}」`;
|
|
228
322
|
// 防御:快照为空或明显不是已加载页面 → 断言不成立。
|
|
229
323
|
// 浏览器页面还没打开时,bsk 返回的是空串/about:blank/错误信息,
|
|
230
324
|
// 此时不应信任 Jev 或直接判定「成立」(空页面不可能包含断言文本)。
|
|
231
325
|
const snapLen = snap.trim().length;
|
|
232
326
|
const SNAP_MIN_LEN = 30;
|
|
233
327
|
if (snapLen < SNAP_MIN_LEN) {
|
|
234
|
-
return
|
|
328
|
+
return verdict(false, `证据:页面快照为空或过短(${snapLen} 字符),页面可能尚未打开或未导航`);
|
|
235
329
|
}
|
|
236
|
-
//
|
|
330
|
+
// 1) 字面包含命中即成立:这是默认路径,也是绝大多数断言的真实情况。
|
|
331
|
+
// 命中时不再调用 Jev —— 省掉一次远端往返(超时上限 15s),
|
|
332
|
+
// 也避免引入「肉眼可见的文本被判成不成立」这类新的失败来源。
|
|
333
|
+
if (literalHit)
|
|
334
|
+
return verdict(true, literalWhy);
|
|
335
|
+
// 2) 字面未命中才请 Jev 复核:这正是语义判断有价值的场景
|
|
336
|
+
// (同义词/近义表达/格式差异导致的误报 FAIL)。
|
|
237
337
|
if (jevClient?.enabled) {
|
|
238
338
|
try {
|
|
239
339
|
const prob = await jevClient.assertText(snap, expectation);
|
|
240
340
|
const pass = prob >= jevClient.threshold;
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
return
|
|
341
|
+
// 靠语义复核才成立的断言,回放时字符串匹配必然不成立,需要标记
|
|
342
|
+
assertSemantic = pass;
|
|
343
|
+
const pct = (prob * 100).toFixed(1);
|
|
344
|
+
const threshold = (jevClient.threshold * 100).toFixed(0);
|
|
345
|
+
return verdict(pass, `字面未命中,语义匹配度 ${pct}%,${pass ? "超过" : "未达到"}阈值 ${threshold}%`);
|
|
246
346
|
}
|
|
247
347
|
catch (err) {
|
|
248
348
|
// Jev 调用失败:回退到原有的字符串包含逻辑。
|
|
@@ -250,19 +350,14 @@ export function createBskOps(session, jevClient) {
|
|
|
250
350
|
// 却无法从 --debug 日志判断到底是哪一类故障。
|
|
251
351
|
debugLog("[bsk] Jev 断言失败,回退到字符串匹配:" +
|
|
252
352
|
(err instanceof Error ? err.message : String(err)));
|
|
253
|
-
return
|
|
353
|
+
return verdict(literalHit, `${literalWhy}(Jev 不可用,已回退)`);
|
|
254
354
|
}
|
|
255
355
|
}
|
|
256
356
|
// 默认:字符串包含匹配
|
|
257
|
-
return
|
|
357
|
+
return verdict(false, literalWhy);
|
|
258
358
|
},
|
|
259
359
|
};
|
|
260
360
|
}
|
|
261
|
-
/** 字符串包含匹配(默认断言路径,也是 Jev 不可用时的回退)。 */
|
|
262
|
-
function stringAssert(snapshotText, expectation) {
|
|
263
|
-
const hit = snapshotText.includes(expectation);
|
|
264
|
-
return `断言「${expectation}」:${hit ? "成立" : "不成立"}。${hit ? `页面中包含「${expectation}」` : `页面中未找到「${expectation}」`}`;
|
|
265
|
-
}
|
|
266
361
|
/** 构造一组浏览器操作工具,供 page-test agent 调用。 */
|
|
267
362
|
export function createBskTools(opts) {
|
|
268
363
|
const ops = createBskOps(opts.session, opts.jevClient);
|
|
@@ -274,7 +369,21 @@ export function createBskTools(opts) {
|
|
|
274
369
|
const before = ops.lastSnapshot();
|
|
275
370
|
try {
|
|
276
371
|
const text = await fn();
|
|
277
|
-
|
|
372
|
+
const assertion = name === "assert_text" ? ops.lastAssert() : null;
|
|
373
|
+
opts.onExec?.({
|
|
374
|
+
name,
|
|
375
|
+
params,
|
|
376
|
+
ok: true,
|
|
377
|
+
lastSnapshot: before,
|
|
378
|
+
// 逐条上报「这条断言是否靠语义判断才成立」:录制层据此精确标记,
|
|
379
|
+
// 而不是按「整场是否启用 Jev」一刀切(字面命中的断言回放同样能通过)。
|
|
380
|
+
...(name === "assert_text"
|
|
381
|
+
? { semantic: ops.lastAssertSemantic() }
|
|
382
|
+
: {}),
|
|
383
|
+
// 结构化断言结果(期望值 + 成立与否 + 证据):报告直接取用,
|
|
384
|
+
// 不再从模型自述里反推(见 report.ts 的 buildReport)。
|
|
385
|
+
...(assertion ? { assert: assertion } : {}),
|
|
386
|
+
});
|
|
278
387
|
return ok(text);
|
|
279
388
|
}
|
|
280
389
|
catch (err) {
|