pageqa 0.1.0 → 0.2.2

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 CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  用自然语言驱动的页面测试 agent。基于 **pi-agent-core**(状态化 LLM agent)编排测试步骤,**browserskill(`bsk`)** 驱动真实浏览器执行,自然语言解析由可配置的 LLM 端点完成。最终产出可读文本报告与机器可读 JSON 报告,返回可接入 CI 的退出码。
4
4
 
5
+ <https://github.com/user-attachments/assets/d5315f93-7e02-4445-a7cf-506b3bfcaa2d>
6
+
5
7
  - 运行时:**Node.js + TypeScript**,npm 分发,CLI 入口。
6
8
  - 浏览器驱动:**browserskill(`bsk`)**,连接一个已运行的真实浏览器(Chrome/Edge),支持公开页与登录态页面。
7
9
  - 自然语言驱动:**pi-agent-core** 状态化 agent,把自然语言意图解析为浏览器操作步骤并自动编排;LLM 后端通过可配置的 OpenAI 兼容端点接入(base URL / API Key / 模型均可配置)。
@@ -12,16 +14,21 @@
12
14
 
13
15
  `bsk` 是连接真实浏览器(Chrome/Edge)的驱动,本项目通过它执行页面操作。
14
16
 
15
- - 项目主页与安装方式:**https://github.com/Tencent/BrowserSkill**
16
- - 按仓库 README 安装 `bsk` CLI 并启动 daemon,然后连接一个已登录的浏览器(支持公开页与登录态页面)。
17
+ - 项目主页与安装方式:**<https://github.com/Tencent/BrowserSkill>**
18
+ - 按仓库 README **安装 `bsk` CLI**(只需装一次)。
19
+
20
+ > **无需手动启动 daemon**:运行 `pageqa` 时会自动检查并在 daemon 未运行时后台启动它(`bsk daemon start`),每个进程只启动一次。你也可以用 `bsk status` 查看状态。
21
+
22
+ **浏览器连接仍需你来做**(这是物理操作,pageqa 无法自动完成):在浏览器中安装 bsk 扩展并完成连接。若启动时检测不到任何已连接浏览器,pageqa 会明确报错并提示你先连接,而不是卡死。
17
23
 
18
24
  验证安装与连接:
25
+
19
26
  ```bash
20
- bsk status # 确认 daemon 已启动且已连接浏览器
21
- bsk session start # 创建 session(CLI 也会自动创建)
27
+ bsk status # 查看 daemon 与已连接浏览器
28
+ bsk session start # 可选:手动创建 session(不传 --session 时 pageqa 会自动创建)
22
29
  ```
23
30
 
24
- > 提示:本工具的 `--session <id>` 即来自 `bsk session start` 返回的 `session_id`;不传时 CLI 会自动新建一个(前提 daemon 已连浏览器)。
31
+ > 提示:本工具的 `--session <id>` 即来自 `bsk session start` 返回的 `session_id`;不传时 CLI 会自动新建一个(前提已有浏览器连接)。
25
32
 
26
33
  ### 2. LLM 后端(可配置 OpenAI 兼容端点)
27
34
 
@@ -31,6 +38,7 @@ bsk session start # 创建 session(CLI 也会自动创建)
31
38
  - 默认 Key:`codebuddy-proxy-key`
32
39
 
33
40
  可用环境变量覆盖(优先级高于配置文件):
41
+
34
42
  - `PAGEQA_LLM_BASE_URL`
35
43
  - `PAGEQA_LLM_API_KEY`
36
44
  - `PAGEQA_LLM_MODEL`
@@ -54,15 +62,71 @@ bsk session start # 创建 session(CLI 也会自动创建)
54
62
  - **优先级(高 → 低)**:环境变量 `PAGEQA_LLM_*` > 用户配置文件 `config.json` > 内置默认值。
55
63
  - 例如要改用其他兼容 OpenAI 的端点,把 `baseUrl`/`apiKey`/`model` 改掉即可,无需改代码。
56
64
 
65
+ ### 4. Jev 语义断言(可选增强)
66
+
67
+ > **什么是 Jev?** Jev 是 TypeSafe AI 推出的 [System One 模型](https://docs.typesafe.ai),专为结构化决策设计。它不做文本生成,而是直接返回校准后的概率值(如匹配度 0.93)。适合替代原有的字符串包含匹配,做更精准的语义级断言。
68
+
69
+ **启用方式**:在 `~/.pageqa/config.json` 中添加 `jev` 字段,或设置环境变量:
70
+
71
+ ```json
72
+ {
73
+ "baseUrl": "http://127.0.0.1:3000/v1",
74
+ "apiKey": "codebuddy-proxy-key",
75
+ "model": "hunyuan-2.0-instruct",
76
+ "jev": {
77
+ "enabled": true,
78
+ "apiKey": "your-typesafe-api-key",
79
+ "model": "jev-latest",
80
+ "threshold": 0.5
81
+ }
82
+ }
83
+ ```
84
+
85
+ | Jev 配置项 | 说明 | 默认值 |
86
+ | --- | --- | --- |
87
+ | `enabled` | 是否启用 Jev 语义断言 | `false` |
88
+ | `apiKey` | TypeSafe API 密钥 | (无) |
89
+ | `model` | Jev 模型 ID | `jev-latest` |
90
+ | `threshold` | 语义匹配概率阈值(0~1) | `0.5` |
91
+
92
+ **环境变量覆盖**(优先级高于配置文件):
93
+
94
+ - `PAGEQA_JEV_ENABLED=true`
95
+ - `PAGEQA_JEV_API_KEY=<your-key>`
96
+ - `PAGEQA_JEV_MODEL=jev-latest`
97
+ - `PAGEQA_JEV_THRESHOLD=0.6`
98
+
99
+ **获取 API Key**:
100
+
101
+ 1. 访问 [console.typesafe.ai/settings/keys](https://console.typesafe.ai/settings/keys)(需等待早期访问权限)
102
+ 2. 或通过 Vercel AI Gateway 获取
103
+
104
+ **工作原理**:启用后,`assert_text` 工具会将页面快照文本发送给 Jev,由 Jev 判断页面内容是否语义匹配断言期望。相比原有的字符串 `includes` 匹配,Jev 能处理同义词、近义表达、大小写变体等情况,大幅降低误判。
105
+
106
+ **降级机制**:若 Jev API 调用失败(网络/超时/鉴权错误),会自动回退到原有的字符串包含匹配,确保测试不因 Jev 服务中断而失败。
107
+
108
+ **架构示意**:
109
+
110
+ ```text
111
+ 自然语言意图
112
+ └─> pi-agent-core Agent(LLM → 可配置 OpenAI 兼容端点)
113
+ └─> bsk 工具:navigate / snapshot / click / fill / hover / scroll / wait
114
+ └─> 真实浏览器(bsk 连接)
115
+ └─> assert_text ──→ Jev Noul API(可选,语义匹配)
116
+ └─> 结论与证据 → 报告(文本/JSON)+ 退出码
117
+ ```
118
+
57
119
  ## 安装
58
120
 
59
121
  本地开发:
122
+
60
123
  ```bash
61
124
  npm install
62
125
  npm run build
63
126
  ```
64
127
 
65
128
  全局安装(发布后):
129
+
66
130
  ```bash
67
131
  npm install -g pageqa
68
132
  pageqa --init-config # 在用户目录创建配置文件 ~/.pageqa/config.json
@@ -115,6 +179,7 @@ pageqa --suite "打开 https://example.com 并断言标题包含 Example"
115
179
  ```
116
180
 
117
181
  可用工具(`src/bsk/tools.ts`):
182
+
118
183
  - `navigate(url)` 打开网页
119
184
  - `snapshot()` 读取页面 aria 树与可见文本(标题、段落、链接、按钮等)
120
185
  - `click(target)` / `fill(target, value)` / `hover(target)` 元素交互(target 用 `@eN` 引用或 CSS 选择器)
package/dist/agent.d.ts CHANGED
@@ -2,6 +2,7 @@ import { type TestReport } from "./report.js";
2
2
  export interface AgentOptions {
3
3
  session?: string;
4
4
  systemPrompt?: string;
5
+ debug?: boolean;
5
6
  }
6
7
  export interface AgentRunResult {
7
8
  report: TestReport;
@@ -15,6 +16,8 @@ interface Scenario {
15
16
  }
16
17
  /**
17
18
  * 用 pi-agent-core 编排一次自然语言页面测试:注入 bsk 工具,驱动浏览器执行,整理报告。
19
+ * 若配置中启用了 Jev(PAGEQA_JEV_ENABLED=true 且配置了 API Key),
20
+ * 断言环节会使用 Jev 语义判断替代字符串包含匹配。
18
21
  */
19
22
  export declare function runAgent(input: string, opts?: AgentOptions): Promise<AgentRunResult>;
20
23
  /** 把一个脚本拆分为多个场景(按 `## ` 二级标题分隔)。无标题则整体作为一个场景。 */
package/dist/agent.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { Agent } from "@earendil-works/pi-agent-core";
2
2
  import { createLlmBackend } from "./llm.js";
3
- import { createBskTools, ensureSession } from "./bsk/tools.js";
3
+ import { createBskTools, ensureSession, ensureBskReady } from "./bsk/tools.js";
4
+ import { JevClient } from "./jev.js";
5
+ import { loadConfig } from "./config.js";
4
6
  import { buildReport } from "./report.js";
5
7
  const DEFAULT_SYSTEM_PROMPT = [
6
8
  "你是「页面测试 agent」。你根据用户的自然语言测试意图,驱动浏览器完成端到端测试。",
@@ -12,23 +14,108 @@ const DEFAULT_SYSTEM_PROMPT = [
12
14
  "- scroll(target) / wait(ms): 滚动与等待",
13
15
  "- assert_text(expectation): 断言页面是否包含某文本,返回「成立/不成立」与证据",
14
16
  "",
15
- "工作流程:",
16
- "1. 若需要打开页面,先 navigate",
17
- "2. snapshot 读取当前内容并定位要操作的元素。",
17
+ "工作流程(必须严格遵守):",
18
+ "1. 第一步永远是 navigate(url) 打开目标页面,等待其加载完成。",
19
+ "2. navigate 之后立即调用 snapshot() 确认页面已真实打开、读取当前内容并定位元素。",
18
20
  "3. 按用户意图逐步交互;每次交互后如需要可再次 snapshot 确认状态。",
19
- "4. assert_text 校验关键结果,或在 snapshot 基础上自行判断文本/标题是否匹配。",
21
+ "4. 只有在 navigate + snapshot 已成功、页面确为期望页面之后,才能调用 assert_text 校验关键结果。",
20
22
  "5. 最后用简洁中文给出结论:每个断言「成立/不成立」,并附证据(实际看到的标题或文本片段)。",
21
- "6. 不要编造未观察到的内容;若元素不存在或断言失败,明确说明。",
23
+ "",
24
+ "完整性要求(长流程尤其重要):",
25
+ "- 必须按顺序执行完提示中列出的**每一个步骤**(包括以 `### ` 标注的每个子步骤),不得只完成前几步就总结收尾。",
26
+ "- 每完成一个步骤,简要记一句「第 k 步完成:<结果>」,再继续下一步;不要提前输出最终结论。",
27
+ "- 结尾必须单独输出一行进度声明,格式固定:`步骤完成:<已完成步骤数>/<总步骤数>`。",
28
+ " 例如共 7 个步骤且全部完成时输出 `步骤完成:7/7`;只完成 4 步则输出 `步骤完成:4/7`。",
29
+ "- 若某步骤确实无法完成(元素找不到、操作被拒绝等),明确说明该步骤失败及原因,然后继续或终止,但仍要如实输出进度声明。",
30
+ "- 工具调用失败(如 click 找不到元素、超时)不等于该步骤失败:必须先重新 snapshot 定位元素后重试;同一操作连续两次失败才可判定该步骤失败。",
31
+ "",
32
+ "硬性约束(违反即视为测试失败):",
33
+ "- 严禁在 navigate 之前调用 assert_text:页面尚未打开时断言必然不成立,且会误报通过。",
34
+ "- 严禁在尚未 snapshot 确认页面内容的情况下就断言;若 snapshot 返回内容为空或明显不是目标页面,应报告「不成立」并说明原因,而不是编造结论。",
35
+ "- 严禁在步骤未执行完的情况下给出「测试通过」结论;宁可报告某步骤失败,也不要静默省略步骤。",
36
+ "- 不要编造未观察到的内容;若元素不存在、导航失败或页面未打开,明确说明。",
22
37
  "",
23
38
  "只输出测试结论与证据,不要输出多余解释。",
24
39
  ].join("\n");
40
+ // 上下文压力控制:长流程会累积大量页面快照(一次快照几千至上万字符),
41
+ // 默认模型上下文窗口只有 32k token,若不裁剪会把早期的步骤说明挤出上下文,
42
+ // 导致模型「忘记」后续步骤而提前收尾。
43
+ const CONTEXT_CHAR_LIMIT = 40_000;
44
+ const KEEP_RECENT_MESSAGES = 12;
45
+ const MAX_OLD_TOOL_CHARS = 1_500;
46
+ const TRIMMED_MARK = "(较早的快照已省略";
47
+ /** 粗略估算消息文本总字符数。 */
48
+ function estimateChars(messages) {
49
+ let n = 0;
50
+ for (const m of messages) {
51
+ const content = m.content;
52
+ if (typeof content === "string") {
53
+ n += content.length;
54
+ }
55
+ else if (Array.isArray(content)) {
56
+ for (const part of content) {
57
+ if (typeof part?.text === "string")
58
+ n += part.text.length;
59
+ }
60
+ }
61
+ }
62
+ return n;
63
+ }
64
+ /** 截断较早的工具结果(保留最近若干条完整),避免快照把上下文撑爆。 */
65
+ function trimOldToolResults(messages, keepRecent, maxChars) {
66
+ const cut = messages.length - keepRecent;
67
+ if (cut <= 0)
68
+ return messages;
69
+ return messages.map((m, i) => {
70
+ if (i >= cut)
71
+ return m;
72
+ const msg = m;
73
+ if (msg.role !== "toolResult" || !Array.isArray(msg.content))
74
+ return m;
75
+ let changed = false;
76
+ const content = msg.content.map((part) => {
77
+ if (part?.type !== "text" ||
78
+ typeof part.text !== "string" ||
79
+ part.text.length <= maxChars ||
80
+ part.text.includes(TRIMMED_MARK)) {
81
+ return part;
82
+ }
83
+ changed = true;
84
+ return {
85
+ ...part,
86
+ text: part.text.slice(0, maxChars) +
87
+ `\n${TRIMMED_MARK}${part.text.length - maxChars} 字符,如需查看请重新 snapshot)`,
88
+ };
89
+ });
90
+ return changed ? { ...m, content } : m;
91
+ });
92
+ }
25
93
  /**
26
94
  * 用 pi-agent-core 编排一次自然语言页面测试:注入 bsk 工具,驱动浏览器执行,整理报告。
95
+ * 若配置中启用了 Jev(PAGEQA_JEV_ENABLED=true 且配置了 API Key),
96
+ * 断言环节会使用 Jev 语义判断替代字符串包含匹配。
27
97
  */
28
98
  export async function runAgent(input, opts = {}) {
99
+ const debug = opts.debug ?? false;
100
+ const log = debug
101
+ ? (m) => process.stderr.write("[debug] " + m + "\n")
102
+ : () => { };
103
+ const t0 = Date.now();
104
+ log("[runAgent] 开始,输入长度=" + input.length);
29
105
  const { models, model } = createLlmBackend();
106
+ log("[runAgent] LLM 后端已创建,model=" + model.id);
107
+ log("[runAgent] 创建/复用 bsk session...");
108
+ await ensureBskReady(debug);
30
109
  const session = ensureSession(opts.session);
31
- const tools = createBskTools({ session });
110
+ log("[runAgent] bsk session=" + session);
111
+ const jevCfg = loadConfig().jev;
112
+ const jevClient = new JevClient(jevCfg, debug);
113
+ log("[runAgent] Jev enabled=" + jevClient.enabled);
114
+ const tools = createBskTools({ session, jevClient, debug });
115
+ log("[runAgent] 工具数=" +
116
+ tools.length +
117
+ " " +
118
+ tools.map((t) => t.name).join(", "));
32
119
  const events = [];
33
120
  const agent = new Agent({
34
121
  initialState: {
@@ -37,20 +124,61 @@ export async function runAgent(input, opts = {}) {
37
124
  tools,
38
125
  },
39
126
  streamFn: models.streamSimple.bind(models),
127
+ // 上下文超限前,先把较早的页面快照裁剪掉,保住最近的上下文与用例步骤。
128
+ transformContext: async (messages) => {
129
+ const before = estimateChars(messages);
130
+ if (before <= CONTEXT_CHAR_LIMIT)
131
+ return messages;
132
+ const trimmed = trimOldToolResults(messages, KEEP_RECENT_MESSAGES, MAX_OLD_TOOL_CHARS);
133
+ log("[runAgent] 上下文裁剪:" +
134
+ before +
135
+ " -> " +
136
+ estimateChars(trimmed) +
137
+ " 字符(消息 " +
138
+ messages.length +
139
+ " 条)");
140
+ return trimmed;
141
+ },
40
142
  });
41
143
  agent.subscribe((e) => {
42
- if (e.type === "tool_execution_start")
144
+ if (e.type === "tool_execution_start") {
43
145
  events.push("[tool] " + e.toolName);
44
- else if (e.type === "tool_execution_end")
45
- events.push("[tool-ok] " + e.toolName);
46
- else if (e.type === "message_update" && e.assistantMessageEvent?.type === "text_delta") {
146
+ log("[agent] 工具调用开始: " + e.toolName);
147
+ }
148
+ else if (e.type === "tool_execution_end") {
149
+ // 工具失败必须显式记录,否则报告里看不出「某步其实报错了」
150
+ events.push((e.isError ? "[tool-error] " : "[tool-ok] ") + e.toolName);
151
+ log("[agent] 工具调用" + (e.isError ? "失败" : "完成") + ": " + e.toolName);
152
+ }
153
+ else if (e.type === "message_update" &&
154
+ e.assistantMessageEvent?.type === "text_delta") {
47
155
  events.push(e.assistantMessageEvent.delta);
48
156
  }
49
157
  });
158
+ log("[runAgent] 发送 prompt...");
50
159
  await agent.prompt(input);
160
+ log("[runAgent] prompt 完成,等待 idle...");
51
161
  await agent.waitForIdle();
162
+ log("[runAgent] idle 完成,耗时=" + (Date.now() - t0) + "ms");
163
+ // 循环可能因模型报错/上下文超限而提前结束;此时绝不能当成「正常跑完」。
164
+ const agentError = agent.state.errorMessage;
165
+ log("[runAgent] 消息数=" +
166
+ agent.state.messages.length +
167
+ ",错误=" +
168
+ (agentError ?? "无"));
169
+ if (agentError)
170
+ events.push("\n[agent-error] " + agentError + "\n");
52
171
  const transcript = events.join("");
53
172
  const report = buildReport(input, transcript);
173
+ if (agentError) {
174
+ report.status = "fail";
175
+ report.assertions.push({
176
+ expectation: "agent 正常执行完毕(未因错误中断)",
177
+ verdict: "fail",
178
+ evidence: agentError,
179
+ });
180
+ }
181
+ log("[runAgent] 断言数=" + report.assertions.length + ",状态=" + report.status);
54
182
  return {
55
183
  report,
56
184
  text: renderText(report),
@@ -86,7 +214,9 @@ export function splitScenarios(script) {
86
214
  // 一级标题(#)与##之前的开场说明文字:不计入任何场景
87
215
  }
88
216
  flush();
89
- return collected.length ? collected : [{ name: "场景 1", body: script.trim() }];
217
+ return collected.length
218
+ ? collected
219
+ : [{ name: "场景 1", body: script.trim() }];
90
220
  }
91
221
  /** 批量运行多个场景并汇总报告。任一失败则整体失败。 */
92
222
  export async function runSuite(script, opts = {}) {
@@ -96,17 +226,25 @@ export async function runSuite(script, opts = {}) {
96
226
  const r = await runAgent(sc.body, { ...opts, systemPrompt: undefined });
97
227
  results.push(r);
98
228
  }
99
- const overall = results.every((r) => r.report.status === "pass") ? "pass" : "fail";
229
+ const overall = results.every((r) => r.report.status === "pass")
230
+ ? "pass"
231
+ : "fail";
100
232
  const summary = {
101
233
  status: overall,
102
234
  assertions: results.flatMap((r, i) => r.report.assertions.map((a) => ({
103
235
  ...a,
104
236
  expectation: "[" + (scenarios[i]?.name ?? String(i + 1)) + "] " + a.expectation,
105
237
  }))),
106
- summary: "共 " + results.length + " 个场景,通过 " +
107
- results.filter((r) => r.report.status === "pass").length + " 个",
238
+ summary: "共 " +
239
+ results.length +
240
+ " 个场景,通过 " +
241
+ results.filter((r) => r.report.status === "pass").length +
242
+ " 个",
108
243
  transcript: results
109
- .map((r, i) => "## " + (scenarios[i]?.name ?? String(i + 1)) + "\n" + r.transcript.trim())
244
+ .map((r, i) => "## " +
245
+ (scenarios[i]?.name ?? String(i + 1)) +
246
+ "\n" +
247
+ r.transcript.trim())
110
248
  .join("\n\n"),
111
249
  };
112
250
  return {
@@ -143,8 +281,13 @@ function renderSuiteText(summary, results, scenarios) {
143
281
  lines.push("场景数: " + results.length);
144
282
  results.forEach((r, i) => {
145
283
  lines.push("");
146
- lines.push("--- 场景 " + (i + 1) + ":" + (scenarios[i]?.name ?? "") +
147
- " [" + (r.report.status === "pass" ? "PASS" : "FAIL") + "] ---");
284
+ lines.push("--- 场景 " +
285
+ (i + 1) +
286
+ ":" +
287
+ (scenarios[i]?.name ?? "") +
288
+ " [" +
289
+ (r.report.status === "pass" ? "PASS" : "FAIL") +
290
+ "] ---");
148
291
  for (const a of r.report.assertions)
149
292
  lines.push(assertionLine(a));
150
293
  if (r.report.summary)
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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"}
@@ -1,6 +1,14 @@
1
1
  import type { AgentTool } from "@earendil-works/pi-agent-core";
2
+ import { JevClient } from "../jev.js";
3
+ /**
4
+ * 自动确保 bsk 就绪:启动 daemon(若未运行)+ 校验浏览器连接(若未连则报错)。
5
+ * 整个进程只真正执行一次(readyPromise 缓存)。
6
+ */
7
+ export declare function ensureBskReady(debug?: boolean): Promise<void>;
2
8
  export interface BskToolOptions {
3
9
  session: string;
10
+ jevClient?: JevClient;
11
+ debug?: boolean;
4
12
  }
5
13
  /** 构造一组浏览器操作工具,供 page-test agent 调用。 */
6
14
  export declare function createBskTools(opts: BskToolOptions): AgentTool[];