open-agents
志不强者智不达。——墨翟
Open Agents:一套会“自己干活”的云端编码代理参考应用(它不住在沙盒里,它指挥沙盒干活)
Open Agents 站在门口,像个带着工牌的工程队长,先把自我介绍写得清清楚楚:
它是一个 开源参考应用,用来在 Vercel 上构建和运行 后台(background)编码代理(coding agents)。它把你想要的关键部件都端上桌了:Web UI、Agent 运行时、沙盒(Sandbox)编排、GitHub 集成。
它还顺手提醒你一句,语气非常“我懂你要拿我去改造”的那种:
这个仓库的设计目标是:让你 fork 走、再按你的需求改,而不是把它当成一个黑盒产品供着。
它的 GitHub description 也很直给:
An open source template for building cloud agents.
换句话说:Open Agents 不是来当“成品”的,它更像一张 云端代理系统的工程图纸,你可以照着搭,也可以直接拿去改成你自己的代理工厂。
它是什么:三层结构,像一条干净的流水线
Open Agents 把自己拆成了三层,甚至画成了一行非常“工程师友好”的文字图:
1 | Web -> Agent workflow -> Sandbox VM |
它像一个会分工的团队:
- Web:负责认证、会话、聊天、流式 UI(streaming UI)
- Agent workflow:代理作为 durable workflow 在 Vercel 上运行,能多步执行、能持久化、能取消
- Sandbox VM:执行环境,里面有文件系统、shell、git、dev server、预览端口
这三层各司其职,像一支配合默契的小队:一个负责对话和指挥,一个负责持久化决策与步骤推进,一个负责真正下场“敲命令、改文件、跑服务”。
核心决定:最重要的一句——“Agent 不是 Sandbox”
Open Agents 最关键的架构决策写得很硬:
The key architectural decision: the agent is not the sandbox
它强调一件事:
- Agent 不运行在 VM 里
- 它运行在沙盒外面,通过工具去和沙盒交互:读文件、编辑、搜索、跑 shell 命令……
这听起来像一句“位置描述”,但其实是一个会影响所有后续演进的底层选择。因为这带来了一整串非常现实的好处:
- agent 的执行不绑定某一次请求生命周期(不再被请求/响应绑架)
- sandbox 的生命周期可以独立休眠/恢复(你想让它睡就睡,想叫醒就叫醒)
- 模型/供应商选择 与 sandbox 实现可以分别演进(两条腿走路,不互相拖死)
- VM 保持“纯粹执行环境”,不会被迫变成控制平面(不让沙盒变成一个又重又复杂的指挥中心)
Open Agents 像个清醒的架构师:把“控制”和“执行”切开,让系统可以长期演进。
目前能做什么:它已经把“后台编码代理”的骨架搭好
Open Agents 现在的能力列表非常像一份“我已经能上岗”的简历:
- chat 驱动的 coding agent:支持 file、search、shell、task、skill、web 工具
- durable 多步执行:基于 Workflow SDK 的 runs,支持 streaming 和 cancellation
- 隔离的 Vercel sandboxes:支持 snapshot-based resume(快照恢复)
- 在沙盒里 clone repo、创建分支并工作
- 可选:成功后自动 commit、push、创建 PR(auto-commit / auto-PR)
- 通过只读链接分享会话(session sharing)
- 可选:通过 ElevenLabs 做语音输入转写(voice input via transcription)
它不像那种“只能回答问题的聊天机器人”,它更像一个能被调度去干活的后台工人:能跑很久、能中断、能恢复、能把产物推回 GitHub。
运行时细节:它怎么跑得“像后台服务”而不是“像一次请求”?
Open Agents 在 Runtime notes 里把几个重要的实现习惯写得很清楚:
- 聊天请求不是“直接在接口里跑 agent”,而是 启动一个 workflow run
- 每一次 agent turn 都可以跨越多个持久化的 workflow steps
- 如果你断线了,重新连上流,可以继续接到��有 workflow(resumed runs)
- sandboxes 使用 base snapshot,开放端口
3000,5173,4321,8000,并在闲置后 hibernate - auto-commit / auto-PR 是“偏好驱动”的能力,不是永远强制开启的行为
它像一个很懂“线上要活下去”的系统:考虑了中断、恢复、生命周期分离,也考虑了不把所有行为都硬编码成默认。
它真正需要什么:别猜,README 把“硬需求”写在墙上
Open Agents 没玩“装上就跑”的幻觉,它把“今天真实需要的东西”写得很直接,并明确说:
这些 requirements 基于当前
apps/web的代码路径,而不是旧脚本。
最小运行时(Minimum runtime)
只要想让应用能启动并加载服务端状态,硬要求就两条:
1 | POSTGRES_URL= |
能登录并真正使用部署版(Vercel OAuth + token encryption)
如果你想让一个部署是“可用的”,需要加上 token 加密 + Vercel OAuth:
1 | ENCRYPTION_KEY= |
没有这些也能部署,但 Vercel sign-in 不会工作。Open Agents 很诚实:能跑不代表能用。
GitHub repo 访问、push、PR(GitHub App)
如果你想让用户连接 GitHub、给 repo/org 装 app、clone 私有仓库、push 分支、开 PR,那么需要这些 GitHub App 相关变量:
1 | NEXT_PUBLIC_GITHUB_CLIENT_ID= |
可选项(Optional)
1 | REDIS_URL= |
其中几个也写得很明白:
REDIS_URL/KV_URL:可选 skills metadata cache(不配就回退到内存)VERCEL_PROJECT_PRODUCTION_URL:给 metadata 和部分 callback 行为提供 canonical production URLVERCEL_SANDBOX_BASE_SNAPSHOT_ID:覆盖默认 sandbox snapshotELEVENLABS_API_KEY:语音转写
把它部署到 Vercel:它像一本“可执行的上线路径”
Open Agents 的部署步骤不是那种“点点按钮就完事”的软糖,它更像一份做事清晰的 checklist:
Fork this repo.
创建 PostgreSQL,拿到连接串。
生成 secrets:
1
2openssl rand -base64 32 | tr '+/' '-_' | tr -d '=\n' # JWE_SECRET
openssl rand -hex 32 # ENCRYPTION_KEY把 repo 导入 Vercel。
在 Vercel 项目设置里至少加这些 env:
1
2
3POSTGRES_URL=
JWE_SECRET=
ENCRYPTION_KEY=先部署一次,拿到稳定 production URL。
创建 Vercel OAuth app,callback URL:
1
https://YOUR_DOMAIN/api/auth/vercel/callback
加 env 并 redeploy:
1
2NEXT_PUBLIC_VERCEL_APP_CLIENT_ID=
VERCEL_APP_CLIENT_SECRET=想要完整 GitHub-enabled coding-agent 流程:创建 GitHub App,并配置:
- Homepage URL:
https://YOUR_DOMAIN - Callback URL:
https://YOUR_DOMAIN/api/github/app/callback - Setup URL:
https://YOUR_DOMAIN/api/github/app/callback
并在 GitHub App settings 里:
- 启用 “Request user authorization (OAuth) during installation”
- 用 GitHub App 的 Client ID/Secret 填
NEXT_PUBLIC_GITHUB_CLIENT_ID和GITHUB_CLIENT_SECRET - 如果想让 org installs 顺滑,建议把 app 设为 public
- Homepage URL:
加 GitHub App env vars 并 redeploy。
需要的话再加 Redis/KV 和 canonical production URL vars。
它像一个项目经理一样,按顺序把你带到“能用的系统”,并且明确分层:先跑起来、再能登录、再能接 GitHub。
本地启动:它不花哨,但非常直
本地跑起来的姿势也很清爽,用的是 bun:
安装依赖:
1
bun install
创建本地 env:
1
cp apps/web/.env.example apps/web/.env
填好
apps/web/.env中 required values。启动:
1
bun run web
它甚至补了一句:如果你已经 linked 过 Vercel 项目,你当然可以 vc env pull,但现在刻意保持 setup 手动,是为了让你看清楚“哪些值真正重要”。
OAuth 与集成:它把回调地址写到你没法写错
Vercel OAuth
部署环境 callback:
1 | https://YOUR_DOMAIN/api/auth/vercel/callback |
本地开发 callback:
1 | http://localhost:3000/api/auth/vercel/callback |
对应 env:
1 | NEXT_PUBLIC_VERCEL_APP_CLIENT_ID=... |
GitHub App
Open Agents 明确说:不需要单独的 GitHub OAuth App,直接用 GitHub App 的 user authorization flow。
GitHub App 配置:
- Homepage URL:
https://YOUR_DOMAIN - Callback URL:
https://YOUR_DOMAIN/api/github/app/callback - Setup URL:
https://YOUR_DOMAIN/api/github/app/callback - enable “Request user authorization (OAuth) during installation”
- make public(如果你希望 org installs 更干净)
本地开发时:
- callback/setup URL:
http://localhost:3000/api/github/app/callback - homepage:
http://localhost:3000
env:
1 | NEXT_PUBLIC_GITHUB_CLIENT_ID=... # GitHub App Client ID |
GITHUB_APP_PRIVATE_KEY 可以用 PEM(带转义换行)或 base64 PEM。
这部分像一个负责集成的工程师,站在你旁边一条条确认:“回调别写错、slug 别写错、secret 别漏。”
有用的命令:它把日常操作都摆在桌面上
1 | bun run web |
这几条命令像它的日常口头禅:
- “跑起来”
- “检查一下”
- “类型过一遍”
- “CI 跑全套”
- “沙盒快���处理一下”
仓库布局:每个目录都像一个角色
Open Agents 把 repo layout 写得很干净,读起来就像在点名:
1 | apps/web Next.js app, workflows, auth, chat UI |
你能看出来它的边界感:
- Web 是 Web:界面、认证、会话、工作流入口
- Agent 是 Agent:工具、子代理、skills
- Sandbox 是 Sandbox:抽象层 + Vercel sandbox 集成
- Shared 是 Shared:共用工具箱
这也呼应了那句“Agent 不是 Sandbox”:结构上就把它们拆开了,让它们可以分别演进。
apps/web 里的 README:它很 Next.js,但它也有它的底线
apps/web 里还有一个 Next.js 的 README,它会提醒你最关键的一件事:
POSTGRES_URL是必需的,并且 build 时会跑 migrations(通过lib/db/migrate.ts在next build期间自动执行)
它也给出了常见的 dev server 启动方式(npm/yarn/pnpm/bun):
1 | npm run dev |
结尾:Open Agents 更像“参考实现 + 可改造模板”,而不是一个黑盒产品
Open Agents 整个 README 给人的感觉很像一个成熟的系统在自我介绍:
它不炫技,它不吹“全自动”,它把边界、假设、必需条件、可选能力、演进方向写得清清楚楚。
它的态度也很明确:
- 这是一套可以 fork 并改造的参考应用
- 它把 Agent workflow 和 Sandbox VM 分离
- 它专注于“后台、可持久化、可恢复”的运行方式
- 它把 GitHub 集成(clone/push/PR)当成可扩展能力,而不是强行绑死的默认动作
如果你想搭一个“云端后台编码代理”的系统,Open Agents 就像一位不啰嗦但很可靠的领班,递给你一套已经打磨过的工具、流程、结构,然后说:
“拿去 fork,改成你自己的。别把我当黑盒——你要的是一座能持续扩建的工厂。”
