agentpage 0.0.24 → 0.0.25

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.
Files changed (2) hide show
  1. package/README.md +40 -19
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # AutoPilot
2
2
 
3
+ <p align="center">
4
+ <img src="./assets/logo/contours%20(2).svg" alt="AutoPilot Logo" width="180" />
5
+ </p>
6
+
3
7
  > 浏览器内嵌 AI Agent SDK:让 AI 通过 tool-calling 操作网页。
4
8
 
5
9
  > 核心主张:通过 **Prompt + Tools + 路由**,快速为网站实现 AI 赋能,并构建**前端运行时 AI Skill**。AutoPilot 本质上是一个运行在前端浏览器中的 AI Agent。
@@ -145,8 +149,8 @@ import { WebAgent } from "agentpage";
145
149
 
146
150
  const agent = new WebAgent({
147
151
  token: "your-api-key",
148
- provider: "deepseek", // openai | copilot | anthropic | deepseek
149
- model: "deepseek-chat",
152
+ provider: "doubao", // openai | copilot | anthropic | deepseek | doubao | qwen
153
+ model: "doubao-1.5-pro-32k",
150
154
  // 用户可自定义 Prompt 规则(项目级/路由级)
151
155
  systemPrompt: "You are an assistant for this route. Follow route safety constraints.",
152
156
  memory: true,
@@ -227,9 +231,9 @@ applyRouteSkill(location.pathname);
227
231
  | 参数 | 类型 | 默认值 | 说明 |
228
232
  | --- | --- | --- | --- |
229
233
  | `client` | `AIClient` | - | 自定义 AI 客户端;传入后优先使用该实例,忽略 token/provider/model/baseURL |
230
- | `token` | `string` | `""` | API Token(GitHub PAT / OpenAI API Key / Anthropic Key / DeepSeek Key) |
231
- | `provider` | `string` | `"copilot"` | AI 服务商:`copilot` / `openai` / `anthropic` / `deepseek` |
232
- | `model` | `string` | `"gpt-4o"` | 模型名称(需与 provider 匹配,如 `deepseek-chat`、`claude-sonnet-4-20250514`) |
234
+ | `token` | `string` | `""` | API Token(GitHub PAT / OpenAI API Key / Anthropic Key / DeepSeek Key / Doubao Ark Key / DashScope Key) |
235
+ | `provider` | `string` | `"copilot"` | AI 服务商:`copilot` / `openai` / `anthropic` / `deepseek` / `doubao` / `qwen` |
236
+ | `model` | `string` | `"gpt-4o"` | 模型名称(需与 provider 匹配,如 `doubao-1.5-pro-32k`、`qwen-plus`、`deepseek-chat`) |
233
237
  | `baseURL` | `string` | - | 自定义 API 基础地址(用于代理/私有部署,覆盖 provider 默认端点) |
234
238
  | `stream` | `boolean` | `true` | 是否启用流式返回(SSE);关闭后使用 JSON 非流式响应 |
235
239
  | `dryRun` | `boolean` | `false` | 干运行模式:仅输出 AI 计划调用的工具列表,不执行真实操作 |
@@ -238,6 +242,7 @@ applyRouteSkill(location.pathname);
238
242
  | `memory` | `boolean` | `false` | 是否开启多轮对话记忆(跨 chat 调用保留历史消息) |
239
243
  | `autoSnapshot` | `boolean` | `true` | chat 前是否自动生成首轮页面快照并注入 system prompt |
240
244
  | `snapshotOptions` | `SnapshotOptions` | `{}` | 快照生成参数覆盖(深度、裁剪、剪枝、节点上限等) |
245
+ | `roundStabilityWait` | `RoundStabilityWaitOptions` | `{ enabled: true }` | 轮次后稳定等待配置(loading hidden + DOM stable);`loadingSelectors` 为“与默认值合并去重”,不会覆盖默认列表 |
241
246
 
242
247
  ### 参数详细说明
243
248
 
@@ -282,6 +287,8 @@ type AIClient = {
282
287
  | `openai` | `https://api.openai.com/v1` | `gpt-4o` / `gpt-4o-mini` | 标准 OpenAI 接口 |
283
288
  | `anthropic` | `https://api.anthropic.com` | `claude-sonnet-4-20250514` | Anthropic 原生接口 |
284
289
  | `deepseek` | `https://api.deepseek.com` | `deepseek-chat` | DeepSeek 接口 |
290
+ | `doubao` | `https://ark.cn-beijing.volces.com/api/v3` | `doubao-1.5-pro-32k` | 火山引擎 Ark(OpenAI 兼容) |
291
+ | `qwen` | `https://dashscope.aliyuncs.com/compatible-mode/v1` | `qwen-plus` | 阿里云百炼兼容模式(OpenAI 兼容) |
285
292
 
286
293
  #### `systemPrompt`(Prompt 注册与维护)
287
294
 
@@ -702,7 +709,7 @@ AutoPilot 内置 5 个工具,覆盖浏览器交互的核心能力。所有工
702
709
  | `attribute` | `string` | get_attr/set_attr | 属性名称 |
703
710
  | `className` | `string` | add_class/remove_class | CSS 类名(旧参数名,已被 `value` 兼容) |
704
711
  | `clickCount` | `number` | click | 点击次数(默认 1,双击传 2,三击传 3) |
705
- | `waitMs` | `number` | 所有动作 | 等待元素出现的超时时间(毫秒,默认 2000) |
712
+ | `waitMs` | `number` | 所有动作 | 等待元素出现的超时时间(毫秒,默认 1200) |
706
713
  | `waitSeconds` | `number` | 所有动作 | 等待超时(秒,`waitMs` 优先级更高) |
707
714
  | `force` | `boolean` | 所有动作 | 跳过 actionability 检查(默认 false) |
708
715
 
@@ -812,7 +819,7 @@ AutoPilot 内置 5 个工具,覆盖浏览器交互的核心能力。所有工
812
819
  | `selector` | `string` | wait_for_selector/hidden | 目标元素选择器 |
813
820
  | `state` | `string` | wait_for_selector | 目标状态:`attached`/`visible`/`hidden`/`detached` |
814
821
  | `text` | `string` | wait_for_text | 要等待出现的文本内容 |
815
- | `timeout` | `number` | 所有动作 | 超时时间(毫秒,默认 10000) |
822
+ | `timeout` | `number` | 所有动作 | 超时时间(毫秒,默认 6000) |
816
823
  | `quietMs` | `number` | wait_for_stable | DOM 静默窗口时长(毫秒,默认 300) |
817
824
 
818
825
  **动作详解:**
@@ -1034,6 +1041,8 @@ AI 每一轮不是“凭记忆猜页面”,而是基于最新快照选择可
1034
1041
  例子:
1035
1042
  - 可同轮:同时填写两个已可见输入框
1036
1043
  - 不可同轮:点击“打开弹窗”后立即填写弹窗字段(应等下一轮新快照)
1044
+ - 当前实现:若本轮出现潜在 DOM 变化动作,轮次结束会自动执行双重等待(先 loading hidden,再 DOM quiet window),默认 `quietMs=200`、`timeoutMs=4000`。
1045
+ - `loadingSelectors` 默认内置 AntD / Element Plus / BK / TDesign(TD)及通用加载态选择器;用户自定义会在默认列表基础上追加并去重,不会覆盖默认值。
1037
1046
 
1038
1047
  ---
1039
1048
 
@@ -1083,12 +1092,13 @@ loop 对本轮返回做以下处理:
1083
1092
  1. 执行工具调用批次
1084
1093
  2. 拦截 `page_info.*`(在 loop 内视为冗余,不让其成为主流程)
1085
1094
  3. 处理恢复(元素找不到时自动刷新快照)
1086
- 4. 刷新快照进入下一轮
1087
- 5. 更新下一轮任务文本:
1095
+ 4. 若本轮存在潜在 DOM 变化动作:执行轮次后稳定等待(loading hidden + DOM stable)
1096
+ 5. 刷新快照进入下一轮
1097
+ 6. 更新下一轮任务文本:
1088
1098
  - 优先使用 `REMAINING`
1089
1099
  - 若缺失 `REMAINING` 且本轮有执行动作:按线性任务剔除做启发式推进(避免整段原任务重复)
1090
1100
  - 若缺失 `REMAINING` 且本轮无执行进展:保持当前任务不推进(按协议回退)
1091
- 6. 若“remaining 未完成 + 无工具调用”:
1101
+ 7. 若“remaining 未完成 + 无工具调用”:
1092
1102
  - 不直接结束
1093
1103
  - 下一轮注入 `Protocol violation` 强约束提示,要求“要么给可执行工具调用,要么严格 `REMAINING: DONE`”
1094
1104
 
@@ -1099,12 +1109,12 @@ loop 对本轮返回做以下处理:
1099
1109
  1. 收集失败工具调用(name/input)及失败原因
1100
1110
  2. 将“失败工具集合 + 最新快照 + 当前任务”一起发给模型重试
1101
1111
  3. 在消息中标注重试次数:`attempt x/y`
1102
- 4. 若仍未命中,默认 `await 2000ms` 后刷新快照再重试
1112
+ 4. 若仍未命中,默认 `await 1000ms` 后刷新快照再重试
1103
1113
  5. 超过最大尝试次数后退出重试流,交由模型给出剩余任务或结束
1104
1114
 
1105
1115
  默认参数:
1106
1116
  - `DEFAULT_NOT_FOUND_RETRY_ROUNDS = 2`
1107
- - `DEFAULT_NOT_FOUND_RETRY_WAIT_MS = 2000`
1117
+ - `DEFAULT_NOT_FOUND_RETRY_WAIT_MS = 1000`
1108
1118
 
1109
1119
  ### 4) 停机条件
1110
1120
 
@@ -1429,7 +1439,7 @@ agent.registerTool({
1429
1439
  - `agent-loop`:轮次编排、停机判定、恢复/重试、指标汇总
1430
1440
  - `system-prompt`:系统规则模板
1431
1441
  - `tool-registry`:工具注册/分发/错误兜底
1432
- - `ai-client`:多 provider 协议适配(OpenAI/Copilot/Anthropic/DeepSeek)
1442
+ - `ai-client`:多 provider 协议适配(OpenAI/Copilot/Anthropic/DeepSeek/Doubao/Qwen
1433
1443
  - `web`(浏览器实现):
1434
1444
  - `WebAgent`:入口编排、记忆、autoSnapshot、callbacks
1435
1445
  - `tools`:DOM/导航/页面信息/等待/evaluate
@@ -1523,7 +1533,7 @@ agent.registerTool({
1523
1533
  | 冗余 page_info 拦截 | `page_info.snapshot/query_all/get_url/get_title/get_viewport` | - | 直接返回拦截结果,不执行真实调用 | `recovery.ts#checkRedundantSnapshot` |
1524
1534
  | 连续 snapshot 防抖 | 连续 page_info.snapshot | 阈值=2 | 标记 `REDUNDANT_SNAPSHOT` | `recovery.ts#applySnapshotDebounce` |
1525
1535
  | 元素未找到自动恢复 | `dom` 且结果为 element not found | `DEFAULT_ACTION_RECOVERY_ROUNDS=2`,`DEFAULT_RECOVERY_WAIT_MS=100` | 等待 -> 刷新快照 -> 返回 recovery 结果 | `recovery.ts#handleElementRecovery` |
1526
- | Not-found 重试对话流 | 本轮有 not-found 失败任务 | `DEFAULT_NOT_FOUND_RETRY_ROUNDS=2`,`DEFAULT_NOT_FOUND_RETRY_WAIT_MS=2000` | 注入失败任务上下文 + attempt x/y,必要时等待后重试 | `index.ts` 主循环 |
1536
+ | Not-found 重试对话流 | 本轮有 not-found 失败任务 | `DEFAULT_NOT_FOUND_RETRY_ROUNDS=2`,`DEFAULT_NOT_FOUND_RETRY_WAIT_MS=1000` | 注入失败任务上下文 + attempt x/y,必要时等待后重试 | `index.ts` 主循环 |
1527
1537
  | 导航后上下文刷新 | `navigate` 成功且动作为 goto/back/forward/reload | - | 立即刷新快照 | `recovery.ts#handleNavigationUrlChange` |
1528
1538
  | 空转检测 | 连续只读轮次 | 连续 2 轮 | 返回 -1 终止 | `recovery.ts#detectIdleLoop` |
1529
1539
 
@@ -1776,27 +1786,38 @@ agent.registerTool({
1776
1786
  - `DEFAULT_RECOVERY_WAIT_MS = 100`
1777
1787
  - `DEFAULT_ACTION_RECOVERY_ROUNDS = 2`
1778
1788
  - `DEFAULT_NOT_FOUND_RETRY_ROUNDS = 2`
1779
- - `DEFAULT_NOT_FOUND_RETRY_WAIT_MS = 2000`
1789
+ - `DEFAULT_NOT_FOUND_RETRY_WAIT_MS = 1000`
1780
1790
 
1781
1791
  `src/web/tools/wait-tool.ts`:
1782
1792
 
1783
- - `DEFAULT_TIMEOUT = 10000`
1793
+ - `DEFAULT_TIMEOUT = 6000`
1784
1794
 
1785
1795
  ---
1786
1796
 
1787
1797
  ### 10. 文档与实现一致性清单(维护者必看)
1788
1798
 
1799
+ Agent Loop 机制权威文档:`src/core/agent-loop/LOOP_MECHANISM.md`。
1800
+
1789
1801
  任何涉及“渐进式任务消费”的改动,至少同步以下文件:
1790
1802
 
1791
1803
  1. `src/core/agent-loop/messages.ts`(输入语义)
1792
1804
  2. `src/core/agent-loop/index.ts`(停机判定与推进逻辑)
1793
- 3. `README.md`(机制说明)
1805
+ 3. `src/core/agent-loop/LOOP_MECHANISM.md`(机制权威说明)
1806
+ 4. `README.md`(机制说明)
1794
1807
 
1795
1808
  任何涉及“找不到元素重试流”的改动,至少同步:
1796
1809
 
1797
1810
  1. `src/core/agent-loop/index.ts`
1798
1811
  2. `src/core/agent-loop/recovery.ts`
1799
- 3. `README.md`
1812
+ 3. `src/core/agent-loop/LOOP_MECHANISM.md`
1813
+ 4. `README.md`
1814
+
1815
+ 任何涉及 provider 新增/调整的改动,至少同步:
1816
+
1817
+ 1. `src/core/ai-client/index.ts`(provider 路由)
1818
+ 2. `src/core/ai-client/constants.ts`(默认端点)
1819
+ 3. `src/web/index.ts`(WebAgentOptions 注释/提示)
1820
+ 4. `README.md`(配置示例与支持矩阵)
1800
1821
 
1801
1822
  这样才能保证“实现、提示词、文档”三者一致,不出现行为漂移。
1802
1823
 
@@ -1848,4 +1869,4 @@ MIT
1848
1869
  4. **RefStore - 生命周期图**:从 `chat()` 创建到 `clear()` 释放的完整流程
1849
1870
  5. **AI Client - 自定义接入**:`BaseAIClient` 和纯对象两种方式的代码示例
1850
1871
  6. **快照格式 - 生成管线**:从 `document.body` 到最终文本的 10 步管线流程
1851
- 7. **错误处理 - 恢复常量**:`DEFAULT_ACTION_RECOVERY_ROUNDS=2` / `DEFAULT_NOT_FOUND_RETRY_ROUNDS=2` / `DEFAULT_NOT_FOUND_RETRY_WAIT_MS=2000` 等关键参数说明
1872
+ 7. **错误处理 - 恢复常量**:`DEFAULT_ACTION_RECOVERY_ROUNDS=2` / `DEFAULT_NOT_FOUND_RETRY_ROUNDS=2` / `DEFAULT_NOT_FOUND_RETRY_WAIT_MS=1000` 等关键参数说明
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentpage",
3
- "version": "0.0.24",
3
+ "version": "0.0.25",
4
4
  "description": "Embeddable AI Agent SDK for browsers — let AI operate your web pages via tool-calling",
5
5
  "keywords": [
6
6
  "ai",