AI 跑通的,Amber 封存。(Freeze what works.)
跑通一次,随时再用。
Amber 把「和 LLM agent 一起跑通的一次操作」封存成经过审核的确定性应用,在飞书里、网站上一键执行,也可以定时运行。执行时不经过模型。
定位:AI 当驻场工程师,Amber 负责交付。 对不写代码的同事来说,AI 助手就像身边的驻场工程师(FDE):听需求、写脚本、把事情跑通。Amber 负责把它做出来的东西交付成团队能长期依赖的工具:审核把关、锁定版本、以真实身份执行、人人一键可用、按时自动运行,需要时改版或下线。
Amber 是琥珀。琥珀把一瞬间的东西封存起来,过很多年取出来还是原样。Amber 做的是同一件事:把和 AI 一起跑通的那一次操作封存起来,以后每次执行都和审核通过时一模一样,不会因为模型换了想法而变。
- 封存:审核通过后代码按哈希锁定,改一个字都要重新审核。
- 一次成形,长期保存:Run it once. Keep it forever.(跑通一次,随时再用)
- Logo:一滴琥珀里封着一条斜杠「/」,代表一个被封存的应用。
- 提交:agent 提交一份草稿,包含参数和一段 Python 脚本,以及它要用到的能力(密钥、服务、运行环境等)。草稿里的任何内容都不被信任。
- 认领:Amber 在应用所属的群或私聊里发出认领卡。认领人以自己的身份(来自飞书事件,而不是 agent)试运行一次,确认后提交审核。同一个人在私聊里重新提交、上一版还没提交审核时,新版本直接替换上一版。
- 审核:Amber 把完整代码和它声明的能力写进飞书知识库文档,并发起飞书审批;所有审核人都同意才生效。通过的版本按哈希锁定,每次执行前都核对。
- 执行:
- 在飞书里
@Amber或私聊发应用名,用卡片表单填参数执行。 - 在网站上选应用执行,图表和表格完整显示(飞书卡片里每张表最多显示 100 行)。
- 跟自己的 agent 说,agent 用
amber命令行调用。不需要身份的应用直接执行,结果交给 agent;需要身份的,Amber 发一张确认卡,谁点就以谁的身份执行,结果只显示在卡片上。声明了「结果可以交给 agent」的只读应用例外:agent 在和用户的私聊里用amber read发起,用户在私聊卡片上允许(本次,或这个 agent 会话一段时间)后以他的身份执行,结果加密交给这个 agent,用来读他自己的消息、邮件、文档。
- 在飞书里
- 定时:审核时允许定时的应用(新草稿默认允许),可以在网站上或由 agent 发起、人在卡片上确认,建成定时任务,以创建人的身份运行。脚本没有输出时不发消息,适合做监控。
- 改版与下线:同名提交就是新版本,认领卡和审核文档附代码差异,只有原创建人能认领,审核通过后自动替换;挂在旧版本上的定时任务暂停,创建人确认后换绑。创建人或管理员可以下线应用。
执行身份
- 每次执行都有一个真实的执行人:发消息或点卡片的人、网站上登录的人、定时任务的创建人。身份只来自飞书事件或网站登录,agent 和脚本给不出身份。
- 调用内部服务(比如数仓 data-mcp):Amber 在每次调用经过时,当场签发一张代表执行人的短时效 Ed25519 签名凭证,服务按执行人的权限返回数据。脚本拿到的只是一次性的调用票据。见可信身份。
- 以执行人本人的飞书身份运行:应用声明后,谁执行就以谁的飞书身份调用 lark-cli 或飞书接口,可以读自己的妙记和群消息、在自己的云空间建文档。每人授权一次(私聊 Amber 或网站上),只保存加密的刷新令牌。见以你本人的飞书身份运行。
脚本能用的能力(都写在应用定义里,随代码一起审核)
- 沙箱:每次执行都在 macOS 沙箱里运行,只能读写本次运行的临时目录和系统工具链;Amber 和执行端的密钥、
~/.ssh、钥匙串都打不开。 - 运行环境与执行端:数据在别的机器上时(比如机器人建的台账),在那台机器装执行端、登记运行环境(可以直接从 botmux 机器人导出),管理员批准后,应用就在那个环境里执行。见执行端。
- 网络白名单:应用不能直连网络,经代理只能访问执行位置白名单里的地址(默认放行飞书)。确实需要时才声明可以访问外网。
- 内置大模型服务:把文字交给 Amber 做总结、分类、改写。模型没有任何工具,默认不保存会话,脚本拿不到账号凭证。见主要场景。
- 密钥:像生产部署的环境变量。应用声明名字,值由创建人或管理员在私聊或网站上填写,加密保存,只交给这个应用,输出里出现会被遮成
***,agent 拿不到。 - 配置项:每次执行都一样的值,创建人在网站上设置一次,执行人改不了。
- 运行时限与并发:管理员在网站上设置,默认 60 秒,应用最长可以申请到 10 分钟。
输出
- 脚本输出 Markdown,
```vega-lite图表和```table数据表由各渠道自己适配:飞书卡片转成原生图表和表格,网站上完整显示。 - 输出里写
@名字,正式运行时会真正 @ 到群里的人或机器人,把结果交给下一步处理。
页面、触发器与分享
- 页面应用:agent 写的网页发布到 Amber,在网站上打开;页面通过审核过的应用查数、写飞书,以打开页面的人自己的身份执行。页面运行在单独的域名和隔离框里,不能联网。见页面应用。
- 触发器:提交审核、执行失败、定时任务有输出、执行端离线等事件发生时,私聊通知你,或在群里 @机器人让 agent 接着处理。见触发器。
- 分享:应用默认只有创建人能用。可以复制给同群的人、上架到 Amber Store 让别人各装一份、由管理员设为全局应用,或者在离职、退群时由管理员重新分配。见应用的分享。
管理
- 网站上的系统管理:审批执行端、设置运行限制、网络白名单、卡片页脚;在应用页面上设为全局应用。
- 审计日志:认领、审核、执行、大模型调用、飞书授权、分享、密钥和配置项的修改、登录等都会记录,可以按类别、群、关键字筛选。
- 只有「应用」一个概念:应用 = 参数 + 一段脚本 + 它声明的能力。没有执行器、渲染器、步骤这些概念。
- 应用不写路径:能访问哪些数据由它选的运行环境决定,不选环境就只能用本次运行的临时目录。
- 不区分读写:脚本会不会改数据,由沙箱、审核人和服务方的权限共同把关。应用只有两个选项,随代码一起审核:
confirm(执行前要在表单上确认)和schedulable(允许定时执行)。认领时一律试运行,试运行就是真实执行一次。 - 能力全部显式声明:密钥、服务、飞书身份、大模型、运行环境、联网都写在应用定义里,审核时一眼可见,没声明的拿不到。
| 文档 | 内容 |
|---|---|
| 快速上手 | 给使用者:从一次操作到一个能反复用的应用 |
| Amber 机器人对话 · 和自己的 agent 协作 · 网站操作 | 在飞书、agent、网站上执行应用和管理定时任务 |
| 主要场景的实现方式 | 查数出报表、定时监控、密钥、读机器人的台账、@ 人或机器人、写飞书文档、配置项、页面、大模型总结 |
| 页面应用 | agent 写的网页,发布到 Amber 即可打开,以打开页面的人自己的身份执行 |
| 触发器 | 某件事发生时私聊通知你,或在群里 @机器人让 agent 接着处理 |
| 以你本人的飞书身份运行 | 读自己的妙记、群消息,写自己的文档;怎么授权飞书 |
| 应用的分享 | 四种分享方式的区别和怎么选 |
| 示例应用 | 仓库 samples/ 里的天气、密钥保管箱、群聊日报、我的飞书数据:怎么安装、怎么用 |
| 常见问题 | 使用中的常见疑问 |
| 审核指南 · 管理员手册 | 给审核人和管理员 |
| 安装与部署 | 环境要求、配置文件、launchd 常驻、nginx、运维 |
| 飞书应用配置 | 权限清单、长连接事件、审批定义、知识库、发布检查 |
| 执行端 | 在数据所在的机器上执行:装执行端、登记运行环境 |
| 概念模型 · 脚本约定 | 给开发人员:对象之间的关系、脚本的输入输出与沙箱 |
| agent 接入:命令行、skill 与接口 | 安装、命令、三档行为、定时任务、触发器、接口、读取密钥、读取个人数据 |
| 可信身份 · 完整示例 | 身份从哪来、网站登录、执行身份凭证与服务方验证 |
| 运行环境定义格式 | 运行环境的 JSON 格式规范(amber-env/1),独立于 Amber,其他 agent 平台和沙箱可以照着移植 |
| 给 agent 的 skill | agent 怎么调用 Amber、怎么提交新应用 |
npm install
node src/main.ts # 飞书长连接 + agent 接口 127.0.0.1:7341 + 网站 127.0.0.1:7342配置文件、飞书应用权限、launchd 常驻和 nginx 见安装与部署与飞书应用配置。
MIT。web/vendor/ 下的前端库保留各自原有的许可证,见 web/vendor/README.md。
