WiseriaAI/pie-ai-agent
GitHub: WiseriaAI/pie-ai-agent
一款基于 Chrome 扩展的 AI 浏览器自动化代理,通过自然语言驱动 DOM 操作与跨标签页编排,并以确认卡机制保障高风险操作的可控性。
Stars: 0 | Forks: 0
## 为什么选择 Pie
Pie 将 Chrome 变成了一个浏览器自动化代理。用自然语言描述任务;LLM 会规划步骤并通过类型化的工具注册表来执行它们 —— 包括 DOM 操作、跨标签页编排,以及针对不响应标准 DOM 事件的画布编辑器的 CDP 级别键盘输入。工作流可以被保存为带有明确工具白名单的 Skills(技能)。每一个不可逆或跨域的步骤都会通过确认卡片进行拦截,让你始终保持充分知情且可控的状态。BYOK(自带密钥):粘贴来自八个 LLM 提供商之一的你自己的 API 密钥 —— 在本地加密,无 Pie 后端参与,无遥测数据。
- **通过原生工具调用进行浏览器自动化。** LLM 使用 Anthropic 的 `tool_use` 块或 OpenAI 的 `function_calling` 来驱动类型化的工具注册表 —— DOM 操作(点击、输入、选择、滚动、结构化快照)、跨标签页编排(列出/激活/关闭/分组/移动/获取可读内容),以及针对 Lark Docs 和 Google Docs 等画布编辑器的可选 CDP 键盘注入(`Input.dispatchKeyEvent`、`Input.insertText`)。
- **Skills(技能)作为一等对象。** 保存一个带有作用域工具白名单的提示模板;通过输入 `/skill_name` 来运行它。Agent 也可以编写自己的技能 —— 但会受到 8 道防线的能力边界的限制,使它们无法扩展自身的权限。
- **先询问,后执行。** 每一个高风险操作(表单提交、敏感字段、原始 CDP 输入、跨域标签页操作、关闭固定标签页)都会在执行前弹出确认卡片拦截,展示具体的工具、原始参数以及受影响的域 —— 让你始终保持充分知情且可控的状态。
- **多会话与持久化。** 对话在 Service Worker 重启后依然保留;归档的会话会在存储压力下被驱逐(LRU 算法 + 30 天硬删除)。
- **侧边栏,而非弹窗。** Pie 位于 Chrome 的侧边栏中,在你浏览时始终保持打开 —— 聊天、运行代理任务、管理标签页而不会丢失上下文。
- **BYOK。** 使用来自八个 LLM 提供商之一的你自己的 API 密钥。在 `chrome.storage.local` 中使用 AES-GCM 进行静态加密。无 Pie 后端,无遥测,无代理。参见 [PRIVACY.md](PRIVACY.md)。
## 功能特性
### 页面理解
针对你当前所在的页面提出问题。Pie 会提取可见文本(对凭据字段进行强化过滤),并仅将这部分文本发送给 LLM。页面片段在提示词中会被包裹在 `
` 标记内,以抵御来自页面 DOM 的提示注入攻击。
### 使用工具调用的 Agent 自动化
用自然语言描述一个任务。LLM 会规划步骤并通过 Pie 的工具注册表执行它们,使用你的提供商的原生工具调用协议 —— Anthropic 针对 Claude 的 `tool_use` 块,以及针对其他提供商的 OpenAI `function_calling`。内置的工具集包括:
- **DOM 操作** —— 点击、输入、选择、滚动、交互元素(链接、按钮、输入框)的结构化快照
- **跨标签页工具** —— 列出、激活、关闭、分组/取消分组、移动、从另一个标签页获取可读内容
- **CDP 键盘**(可选加入,默认关闭) —— 针对不响应标准 DOM 事件的 Lark Docs 和 Google Docs 等基于画布的编辑器的 `Input.dispatchKeyEvent` 和 `Input.insertText`
- **Skill 元工具** —— Agent 可以创建/更新/删除/列出自己的技能(参见下文的 *Skill 系统*)
内置了三个跨标签页技能:`auto_group_tabs`、`close_duplicate_tabs`、`close_inactive_tabs`。
### Skill 系统
Skills 是保存了明确工具白名单的提示模板。打开 **Settings → Skills** 来创建、编辑或删除你自己的技能 —— 包括名称、提示模板、参数 JSON 模式,以及该技能允许调用的精确工具集。在聊天中输入 `/skill_name` 即可运行任何技能。
Agent 本身也可以通过 `create_skill` / `update_skill` / `delete_skill` 元工具来编写技能 —— 这对于捕获模型刚刚走过的工作流非常有用,以便在下一个会话中重放。Agent 编写的技能会被标记为 `author='agent'`,并在首次运行时触发一次确认卡片;模型发明的技能绝不会在下一次悄无声息地执行。
技能无法逃脱其声明的工具白名单。每次技能变更都会强制执行八项能力授予不变量 —— 严格的容量上限(≤8 KB 的提示模板,≤2 KB 的参数模式)、禁止元工具嵌套、每次安装 1 MB 的存储预算、针对实时工具注册表的名称验证 —— 因此失控的技能无法扩大自身的权限。
### 高风险操作审批
Pie 会在每个工具调用运行前对其进行分类。任何不可逆或跨域的操作都需要你首先批准确认卡片。
**高风险**触发条件包括:提交表单、在密码/支付/邮箱字段中输入、通过 CDP 的原始键盘输入、关闭固定标签页,以及任何跨域的标签页操作。
确认卡片会向你展示:
- 确切的工具名称以及 Agent 打算传递的原始参数(以便你在运行前发现错误或页面 DOM 中被提示注入的指令)
- 每个受影响标签页的域名和标签标题,当操作将跨越原始任务的固定域名时,会单独标出
- 一对 **Approve**(批准)/ **Reject**(拒绝)选项,以及一个任务级别的 **Discard**(丢弃)选项,适用于当你想完全放弃 Agent 计划的时候
CDP 键盘模拟功能**默认是关闭的** —— 你需要先在设置中选择开启,然后它才能被附加使用。如果你对同一任务拒绝了三次操作,Pie 会自动终止该任务,而不是在你已经不同意的计划上浪费你的 token。
### 支持的提供商
| 提供商 | 备注 |
|---|---|
| Anthropic Claude | 原生 API + 原生 `tool_use` |
| OpenAI | OpenAI `function_calling` |
| Gemini | 原生 API |
| OpenRouter | 兼容 OpenAI |
| DeepSeek | 兼容 OpenAI |
| MiniMax | 兼容 OpenAI |
| ZhiPu (智谱) | 兼容 OpenAI |
| Bailian (百炼) | 兼容 OpenAI |
添加一个提供商只需一个注册表条目和一个主机权限。本地 Ollama 已在 [roadmap](docs/ROADMAP.md) 中。
## 安装
Pie 提供两个面向终端用户的渠道和一个源码构建渠道。请选择适合你的一种。
需要具备支持侧边栏的基于 Chromium 的浏览器 —— Chrome 114+、Edge、Brave、Arc 等。
### 选项 1 — Chrome Web Store(推荐)
点击 **Add to Chrome**,然后将 Pie 固定到工具栏。
### 选项 2 — GitHub Release zip(解压安装)
适用于想要在不使用 Web Store 的情况下安装同一构件的用户,或者在 listing 仍在审核期间:
1. 从 [Releases page](https://github.com/WiseriaAI/pie-ai-agent/releases) 下载最新的 `pie-x.y.z.zip`
2. 将其解压到一个你会保留的目录(Chrome 在运行时会从此目录读取 —— 安装后不要删除它)
3. 打开 `chrome://extensions`
4. 启用右上角的 **Developer mode**
5. 点击 **Load unpacked** 并选择解压后的目录
6. 将 Pie 固定到工具栏;点击图标以打开侧边栏
#### 无损升级
Chrome 从解压目录的路径派生扩展 ID,你的会话 / 加密的 API 密钥 / Skills 都在 `chrome.storage.local` 中归属于该 ID。为了在版本迭代中保留这些数据,请**在原处升级** —— 不要将新版本解压到其他文件夹。
1. 打开 `chrome://extensions` 并找到 Pie 的卡片。记下解压目录的路径(显示在卡片下方,或通过 **Details** → "Source" 查看)
2. 删除该目录的内容,但保留目录本身
3. 将新的 `pie-x.y.z.zip` 解压到同一个目录中
4. 点击 Pie 卡片上的 **↻ reload** 图标
Web Store 用户(一旦选项 1 可用)可以跳过此部分 —— Chrome 会自动更新扩展并且存储会自动结转。
### 选项 3 — 从源码构建(贡献者)
如果你想要 HMR,正在提交 PR,或者只是不信任预构建的二进制文件:
```
git clone https://github.com/WiseriaAI/pie-ai-agent.git
cd Pie
pnpm install
pnpm build
```
然后将生成的 `dist/` 目录作为解压的扩展加载(上述步骤 3–6)。关于内部开发循环,请参见下文的 [Development](#development)。
## 配置
1. 打开侧边栏并切换到 **Settings** 标签页
2. 添加一个提供商条目 —— 粘贴你的 API 密钥,选择一个模型
3. 切换回 **Chat** 并发送一条消息
你的密钥在存入 `chrome.storage.local` 之前会被加密。加密密钥本身在首次运行时于本地生成,并且永远不会离开设备。
## 隐私与安全
- BYOK:你的 API 密钥永远不会离开设备,除非作为直接向提供商 API 发起调用时的 `Authorization` 请求头
- 所有发送给 LLM 的页面内容都被包裹在 `` 标签中,强化了抵御来自页面 DOM 提示注入的能力
- 跨域标签页操作和高风险 DOM 操作需要显式的确认卡片 —— Pie 会在运行前准确向你展示将会发生什么,以及发生在哪个域上
- 无遥测,无分析,无第三方参与
完整策略:[PRIVACY.md](PRIVACY.md)。
## 开发
```
pnpm install
pnpm dev # Vite dev server with HMR
pnpm test # Vitest, single run
pnpm test:watch # Vitest, watch mode
pnpm build # Production build to dist/
```
在开发时,从 `dist/` 加载解压的扩展(在第一次运行 `pnpm dev` 之后),并在每次更改 service-worker 后点击 `chrome://extensions` 中的 **Reload** 按钮。
### 技术栈
- Chrome Extension Manifest V3
- React 19 + TypeScript 6
- TailwindCSS 4 (Vite plugin, 无配置文件)
- Vite 8 + `@crxjs/vite-plugin` 2.4
- pnpm
### 项目布局
| 路径 | 用途 |
|---|---|
| `src/background/` | Service Worker —— 消息路由,Agent 循环调度,保持活跃 |
| `src/sidepanel/` | React 侧边栏 UI (Chat, Settings, 会话抽屉) |
| `src/lib/model-router/` | 统一的 LLM 接口;每个提供商的流式处理 + 工具调用 |
| `src/lib/agent/` | ReAct 循环,工具注册表,风险分类器,提示词构建器 |
| `src/lib/dom-actions/` | 通过 `executeScript` 注入的独立 DOM 操作函数 |
| `src/lib/skills/` | 技能框架:类型,存储,内置技能 |
| `src/lib/sessions/` | 会话生命周期:持久化,归档,多会话沙箱 |
架构说明和不变量追踪位于 `docs/solutions/` 中。项目的复合工程说明和贡献者指南位于 [`CLAUDE.md`](CLAUDE.md) 中。
## 路线图
请参见 [`docs/ROADMAP.md`](docs/ROADMAP.md) 了解推迟的里程碑待办事项。亮点:
- 通过 Ollama 支持本地模型
- 键盘快捷键
- 页面 URL 匹配的技能自动触发
- 操作录制 → 技能自动生成
## 版本控制与发布
Pie 遵循 [Semantic Versioning](https://semver.org)。发布说明位于 [CHANGELOG.md](CHANGELOG.md) 中。
## 许可证
根据 [Apache License, Version 2.0](LICENSE) 授权 — © 2026 Pie Project Contributors。标签:AI助手, Anthropic Claude, BYOK, CDP, Chrome DevTools Protocol, DeepSeek, DLL 劫持, DOM操作, LLM代理, OpenAI GPT, RPA, Skills工作流, 前端自动化, 办公自动化, 大语言模型, 安全确认机制, 工具调用, 数字取证, 无后端本地应用, 浏览器代理, 浏览器自动化, 熵值分析, 自动化攻击, 自动化脚本, 跨标签页管理, 键盘输入控制