agentpage 0.0.13 → 0.0.15
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 +163 -4
- package/dist/index.d.mts +36 -10
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +946 -402
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -112,6 +112,13 @@ src/
|
|
|
112
112
|
|
|
113
113
|
AI 每一轮不是“凭记忆猜页面”,而是基于最新快照选择可执行动作。
|
|
114
114
|
|
|
115
|
+
可把本轮决策写成一个最小公式:
|
|
116
|
+
|
|
117
|
+
- 输入:`当前快照 S` + `当前任务描述 R`
|
|
118
|
+
- 输出:`当前可执行任务批次 T`(仅包含快照里可见且可操作的目标)
|
|
119
|
+
|
|
120
|
+
也就是:`S + R -> T`
|
|
121
|
+
|
|
115
122
|
快照包含:
|
|
116
123
|
- 元素标签与关键信息
|
|
117
124
|
- hash selector(如 `#a1b2c`)
|
|
@@ -121,10 +128,19 @@ AI 每一轮不是“凭记忆猜页面”,而是基于最新快照选择可
|
|
|
121
128
|
|
|
122
129
|
用户任务会被分解成子任务,按轮次逐步“吃掉”:
|
|
123
130
|
|
|
124
|
-
- 轮次 N
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
131
|
+
- 轮次 N:在快照 `S_n` 上执行当前可做任务 `T_n`
|
|
132
|
+
- 执行后默认先视为成功,并从当前任务 `R_n` 中剔除 `T_n`
|
|
133
|
+
- 得到下一轮任务 `R_(n+1)`,再配合新快照进入下一轮
|
|
134
|
+
- 全部剔除完成后结束
|
|
135
|
+
|
|
136
|
+
任务推进可写成:
|
|
137
|
+
|
|
138
|
+
- 输入:`当前任务 R_n` + `本轮执行 T_n` + `已执行历史 H_n`
|
|
139
|
+
- 输出:`下一轮任务 R_(n+1)`
|
|
140
|
+
|
|
141
|
+
也就是:`R_n + T_n + H_n -> R_(n+1)`
|
|
142
|
+
|
|
143
|
+
其中 `R_(n+1)` 就是下一次发给模型的核心输入之一。
|
|
128
144
|
|
|
129
145
|
新增(渐进式协议):
|
|
130
146
|
- 每轮都会显式携带 `Current remaining instruction`(当前剩余文本)
|
|
@@ -144,6 +160,149 @@ AI 每一轮不是“凭记忆猜页面”,而是基于最新快照选择可
|
|
|
144
160
|
|
|
145
161
|
---
|
|
146
162
|
|
|
163
|
+
## 完整对话流程(执行版)
|
|
164
|
+
|
|
165
|
+
> 目标:每轮都基于“当前快照 + 当前任务”推进,避免 `page_info` 空转。
|
|
166
|
+
|
|
167
|
+
### 0) chat 触发(前端)
|
|
168
|
+
|
|
169
|
+
当调用 `WebAgent.chat()` 时,前端会先做一件事:
|
|
170
|
+
|
|
171
|
+
1. 立即生成首轮快照 `S0`(浏览器端自动完成,不依赖 AI 请求)
|
|
172
|
+
2. 将 `S0` 注入到 system prompt
|
|
173
|
+
3. 将 `S0` 作为 `initialSnapshot` 传入 loop
|
|
174
|
+
|
|
175
|
+
这保证了首轮就是“有快照可执行”的状态。
|
|
176
|
+
|
|
177
|
+
### 1) 每轮输入(给模型)
|
|
178
|
+
|
|
179
|
+
每轮构建消息时,核心输入固定为:
|
|
180
|
+
|
|
181
|
+
- `Current remaining instruction`(当前剩余任务)
|
|
182
|
+
- `Previous round planned task array`(上一轮已执行任务)
|
|
183
|
+
- `Latest DOM snapshot`(当前快照)
|
|
184
|
+
|
|
185
|
+
说明:
|
|
186
|
+
- Round 0 会携带原始任务文本作为起点;
|
|
187
|
+
- Round 1+ 不再重复注入原始 userMessage,避免模型“回头重做”。
|
|
188
|
+
|
|
189
|
+
### 2) 每轮输出(模型返回)
|
|
190
|
+
|
|
191
|
+
模型应返回:
|
|
192
|
+
|
|
193
|
+
- 本轮工具调用批次(能批量就批量)
|
|
194
|
+
- 一行剩余任务协议:
|
|
195
|
+
- `REMAINING: <new remaining instruction>`
|
|
196
|
+
- 或 `REMAINING: DONE`
|
|
197
|
+
|
|
198
|
+
### 3) 每轮执行与状态推进
|
|
199
|
+
|
|
200
|
+
loop 对本轮返回做以下处理:
|
|
201
|
+
|
|
202
|
+
1. 执行工具调用批次
|
|
203
|
+
2. 拦截 `page_info.*`(在 loop 内视为冗余,不让其成为主流程)
|
|
204
|
+
3. 处理恢复(元素找不到时自动刷新快照)
|
|
205
|
+
4. 刷新快照进入下一轮
|
|
206
|
+
5. 更新下一轮任务文本:
|
|
207
|
+
- 优先使用 `REMAINING`
|
|
208
|
+
- 若缺失 `REMAINING`,保持当前任务不推进(按协议回退)
|
|
209
|
+
|
|
210
|
+
### 3.1) 找不到元素重试流(Not-found Retry Dialogue)
|
|
211
|
+
|
|
212
|
+
当执行工具返回“元素未找到”时,不会直接空转看页面,而是进入重试对话流:
|
|
213
|
+
|
|
214
|
+
1. 收集失败工具调用(name/input)及失败原因
|
|
215
|
+
2. 将“失败工具集合 + 最新快照 + 当前任务”一起发给模型重试
|
|
216
|
+
3. 在消息中标注重试次数:`attempt x/y`
|
|
217
|
+
4. 若仍未命中,默认 `await 2000ms` 后刷新快照再重试
|
|
218
|
+
5. 超过最大尝试次数后退出重试流,交由模型给出剩余任务或结束
|
|
219
|
+
|
|
220
|
+
默认参数:
|
|
221
|
+
- `DEFAULT_NOT_FOUND_RETRY_ROUNDS = 2`
|
|
222
|
+
- `DEFAULT_NOT_FOUND_RETRY_WAIT_MS = 2000`
|
|
223
|
+
|
|
224
|
+
### 4) 停机条件
|
|
225
|
+
|
|
226
|
+
- 无工具调用
|
|
227
|
+
- `REMAINING: DONE` 后自然收敛
|
|
228
|
+
- 重复批次防自转触发
|
|
229
|
+
- 达到 `maxRounds`
|
|
230
|
+
|
|
231
|
+
### 5) 线性任务剔除示例(标准范式)
|
|
232
|
+
|
|
233
|
+
总任务:`点击按钮 -> 输入框输入 "abc" -> 发送`
|
|
234
|
+
|
|
235
|
+
- 第 1 轮
|
|
236
|
+
- 当前任务:`点击按钮 -> 输入框输入 "abc" -> 发送`
|
|
237
|
+
- 上一轮已执行:空
|
|
238
|
+
- 本轮执行:`点击按钮`
|
|
239
|
+
- 下一轮任务:`输入框输入 "abc" -> 发送`
|
|
240
|
+
|
|
241
|
+
- 第 2 轮
|
|
242
|
+
- 当前任务:`输入框输入 "abc" -> 发送`
|
|
243
|
+
- 上一轮已执行:`点击按钮`
|
|
244
|
+
- 本轮执行:`输入框输入 "abc"`
|
|
245
|
+
- 下一轮任务:`发送`
|
|
246
|
+
|
|
247
|
+
- 第 3 轮
|
|
248
|
+
- 当前任务:`发送`
|
|
249
|
+
- 上一轮已执行:`点击按钮 -> 输入框输入 "abc"`
|
|
250
|
+
- 本轮执行:`发送`
|
|
251
|
+
- 下一轮任务:`DONE`
|
|
252
|
+
|
|
253
|
+
核心思想:每轮默认“本轮执行成功”,从当前任务中剔除本轮执行项,得到下一轮任务。
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Prompt 设计架构(执行版)
|
|
258
|
+
|
|
259
|
+
### A. System Prompt(全局规则层)
|
|
260
|
+
|
|
261
|
+
由 `src/core/system-prompt.ts` 生成,职责是定义不可变执行约束:
|
|
262
|
+
|
|
263
|
+
- 从当前快照直接执行,不复述任务
|
|
264
|
+
- 任务按“剔除模型”推进(current + previous + this-round -> new remaining)
|
|
265
|
+
- 禁止 `page_info` 作为规划手段
|
|
266
|
+
- 可见目标尽量同轮批量执行
|
|
267
|
+
- DOM 会变化的动作执行后在下一轮继续
|
|
268
|
+
- 统一输出 `REMAINING` 协议
|
|
269
|
+
|
|
270
|
+
### B. Round Messages(轮次状态层)
|
|
271
|
+
|
|
272
|
+
由 `src/core/agent-loop/messages.ts` 构建,职责是把运行时状态传给模型:
|
|
273
|
+
|
|
274
|
+
- `Current remaining instruction`
|
|
275
|
+
- `Done steps (do NOT repeat)`
|
|
276
|
+
- `Previous round planned task array`
|
|
277
|
+
- `Latest DOM snapshot`
|
|
278
|
+
|
|
279
|
+
这层是“每轮变化”的动态上下文。
|
|
280
|
+
|
|
281
|
+
### C. Loop Control(执行控制层)
|
|
282
|
+
|
|
283
|
+
由 `src/core/agent-loop/index.ts` 负责:
|
|
284
|
+
|
|
285
|
+
- 首轮使用前端注入的 `initialSnapshot`
|
|
286
|
+
- 每轮执行后刷新快照
|
|
287
|
+
- 推进 `remainingInstruction`
|
|
288
|
+
- `REMAINING` 缺失时不推进任务(保持当前 remaining)
|
|
289
|
+
- 防空转、防重复、防无限循环
|
|
290
|
+
- DOM 变更动作触发强制断轮(等待下一轮新快照)
|
|
291
|
+
|
|
292
|
+
### D. Recovery & Guard(保护层)
|
|
293
|
+
|
|
294
|
+
由 `src/core/agent-loop/recovery.ts` 提供:
|
|
295
|
+
|
|
296
|
+
- 拦截冗余 `page_info` 调用
|
|
297
|
+
- 元素未命中自动恢复并刷新快照
|
|
298
|
+
- 导航后刷新快照
|
|
299
|
+
- 空转检测
|
|
300
|
+
|
|
301
|
+
由 `src/core/agent-loop/index.ts` 补充:
|
|
302
|
+
- not-found 重试对话流(失败工具聚合 + 尝试次数 + 等待重试)
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
147
306
|
## 完整架构流程图(含链路)
|
|
148
307
|
|
|
149
308
|
### A. 端到端主流程
|
package/dist/index.d.mts
CHANGED
|
@@ -61,7 +61,22 @@ type AIClient = {
|
|
|
61
61
|
}): Promise<AIChatResponse>;
|
|
62
62
|
};
|
|
63
63
|
//#endregion
|
|
64
|
-
//#region src/core/agent-loop/
|
|
64
|
+
//#region src/core/agent-loop/types.d.ts
|
|
65
|
+
type AgentLoopMetrics = {
|
|
66
|
+
roundCount: number;
|
|
67
|
+
totalToolCalls: number;
|
|
68
|
+
successfulToolCalls: number;
|
|
69
|
+
failedToolCalls: number;
|
|
70
|
+
toolSuccessRate: number;
|
|
71
|
+
recoveryCount: number;
|
|
72
|
+
redundantInterceptCount: number;
|
|
73
|
+
snapshotReadCount: number;
|
|
74
|
+
latestSnapshotSize: number;
|
|
75
|
+
avgSnapshotSize: number;
|
|
76
|
+
maxSnapshotSize: number;
|
|
77
|
+
inputTokens: number;
|
|
78
|
+
outputTokens: number;
|
|
79
|
+
};
|
|
65
80
|
/** 工具调用事件回调 — 用于 UI 层实时展示 Agent 进度 */
|
|
66
81
|
type AgentLoopCallbacks = {
|
|
67
82
|
/** AI 返回文本回复时触发 */onText?: (text: string) => void; /** AI 请求调用工具时触发(执行前) */
|
|
@@ -76,7 +91,8 @@ type AgentLoopCallbacks = {
|
|
|
76
91
|
*
|
|
77
92
|
* @param newUrl 当前页面 URL(URL 变化时传入;元素定位失败时为 undefined)
|
|
78
93
|
*/
|
|
79
|
-
onBeforeRecoverySnapshot?: (newUrl?: string) => void;
|
|
94
|
+
onBeforeRecoverySnapshot?: (newUrl?: string) => void; /** 一次 chat 结束后输出结构化运行指标 */
|
|
95
|
+
onMetrics?: (metrics: AgentLoopMetrics) => void;
|
|
80
96
|
};
|
|
81
97
|
type AgentLoopResult = {
|
|
82
98
|
/** AI 的最终文本回复 */reply: string; /** 所有工具调用记录 */
|
|
@@ -85,7 +101,8 @@ type AgentLoopResult = {
|
|
|
85
101
|
input: unknown;
|
|
86
102
|
result: ToolCallResult;
|
|
87
103
|
}>; /** 本轮完整对话消息(含历史 + 本轮,用于多轮记忆累积) */
|
|
88
|
-
messages: AIMessage[];
|
|
104
|
+
messages: AIMessage[]; /** 本次运行统计指标 */
|
|
105
|
+
metrics: AgentLoopMetrics;
|
|
89
106
|
};
|
|
90
107
|
//#endregion
|
|
91
108
|
//#region src/web/ref-store.d.ts
|
|
@@ -155,7 +172,7 @@ declare class RefStore {
|
|
|
155
172
|
get size(): number;
|
|
156
173
|
}
|
|
157
174
|
//#endregion
|
|
158
|
-
//#region src/web/page-info-tool.d.ts
|
|
175
|
+
//#region src/web/tools/page-info-tool.d.ts
|
|
159
176
|
/** 快照配置选项 */
|
|
160
177
|
type SnapshotOptions = {
|
|
161
178
|
/** 最大遍历深度(默认 6) */maxDepth?: number;
|
|
@@ -176,7 +193,10 @@ type SnapshotOptions = {
|
|
|
176
193
|
* 传入 RefStore 实例后,每个元素使用确定性 hash ID 替代完整 XPath,
|
|
177
194
|
* 大幅减少 token 消耗。dom-tool 通过 RefStore.get(id) 解析回 DOM 元素。
|
|
178
195
|
*/
|
|
179
|
-
refStore?: RefStore;
|
|
196
|
+
refStore?: RefStore; /** 最大输出节点数(默认 220),超过后停止继续遍历。 */
|
|
197
|
+
maxNodes?: number; /** 每个父节点最多输出的子元素数(默认 25),超出部分会折叠。 */
|
|
198
|
+
maxChildren?: number; /** 文本截断长度(默认 40)。 */
|
|
199
|
+
maxTextLength?: number;
|
|
180
200
|
};
|
|
181
201
|
/**
|
|
182
202
|
* 生成页面 DOM 快照 — 将 DOM 树转为 AI 可理解的文本描述。
|
|
@@ -201,16 +221,16 @@ type SnapshotOptions = {
|
|
|
201
221
|
declare function generateSnapshot(root?: Element, options?: SnapshotOptions | number): string;
|
|
202
222
|
declare function createPageInfoTool(): ToolDefinition;
|
|
203
223
|
//#endregion
|
|
204
|
-
//#region src/web/dom-tool.d.ts
|
|
224
|
+
//#region src/web/tools/dom-tool.d.ts
|
|
205
225
|
declare function createDomTool(): ToolDefinition;
|
|
206
226
|
//#endregion
|
|
207
|
-
//#region src/web/navigate-tool.d.ts
|
|
227
|
+
//#region src/web/tools/navigate-tool.d.ts
|
|
208
228
|
declare function createNavigateTool(): ToolDefinition;
|
|
209
229
|
//#endregion
|
|
210
|
-
//#region src/web/wait-tool.d.ts
|
|
230
|
+
//#region src/web/tools/wait-tool.d.ts
|
|
211
231
|
declare function createWaitTool(): ToolDefinition;
|
|
212
232
|
//#endregion
|
|
213
|
-
//#region src/web/evaluate-tool.d.ts
|
|
233
|
+
//#region src/web/tools/evaluate-tool.d.ts
|
|
214
234
|
declare function createEvaluateTool(): ToolDefinition;
|
|
215
235
|
//#endregion
|
|
216
236
|
//#region src/web/messaging.d.ts
|
|
@@ -304,7 +324,8 @@ type WebAgentOptions = {
|
|
|
304
324
|
token?: string; /** AI 提供商: "copilot" | "openai" | "anthropic"(默认 "copilot") */
|
|
305
325
|
provider?: string; /** 模型名称(默认 "gpt-4o") */
|
|
306
326
|
model?: string; /** 自定义 API 基础 URL(可选,覆盖 provider 默认值) */
|
|
307
|
-
baseURL?: string; /**
|
|
327
|
+
baseURL?: string; /** 是否启用流式输出(SSE)。默认 true;false 时使用 JSON 非流式响应。 */
|
|
328
|
+
stream?: boolean; /** 是否启用干运行模式 */
|
|
308
329
|
dryRun?: boolean; /** 自定义系统提示词(不传则使用默认 Web 提示词) */
|
|
309
330
|
systemPrompt?: string; /** 最大工具调用轮次(默认 10) */
|
|
310
331
|
maxRounds?: number; /** 是否启用多轮对话记忆(默认 false) */
|
|
@@ -319,6 +340,7 @@ declare class WebAgent {
|
|
|
319
340
|
private provider;
|
|
320
341
|
private model;
|
|
321
342
|
private baseURL?;
|
|
343
|
+
private stream;
|
|
322
344
|
private dryRun;
|
|
323
345
|
private maxRounds;
|
|
324
346
|
private customSystemPrompt?;
|
|
@@ -354,6 +376,10 @@ declare class WebAgent {
|
|
|
354
376
|
setProvider(provider: string): void;
|
|
355
377
|
/** 设置模型 */
|
|
356
378
|
setModel(model: string): void;
|
|
379
|
+
/** 设置是否启用流式输出(SSE) */
|
|
380
|
+
setStream(enabled: boolean): void;
|
|
381
|
+
/** 获取当前流式输出开关状态 */
|
|
382
|
+
getStream(): boolean;
|
|
357
383
|
/** 切换干运行模式 */
|
|
358
384
|
setDryRun(enabled: boolean): void;
|
|
359
385
|
/** 设置自定义系统提示词 */
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/tool-registry.ts","../src/core/types.ts","../src/core/agent-loop/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/tool-registry.ts","../src/core/types.ts","../src/core/agent-loop/types.ts","../src/web/ref-store.ts","../src/web/tools/page-info-tool.ts","../src/web/tools/dom-tool.ts","../src/web/tools/navigate-tool.ts","../src/web/tools/wait-tool.ts","../src/web/tools/evaluate-tool.ts","../src/web/messaging.ts","../src/web/index.ts"],"mappings":"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"}
|