Open-Inspect:受Ramp启发的开源编码代理,功能丰富且支持多模型!
后台代理:Open-Inspect
Open-Inspect是一个受Ramp的Inspect启发的开源后台代理编码系统。
概览
Open-Inspect提供了一个托管的后台编码代理,具备以下功能:当你专注于其他事务时,它能在后台处理任务;可访问完整的开发环境(Node.js、Python、git、浏览器自动化、VS Code);支持从任何地方进行连接,包括Web UI、Slack、GitHub PR、Linear问题或Webhook;支持多人会话,多人可实时协作;能创建PR,并将提交正确归因于发起提示的用户;可按计划运行,如Cron作业、Sentry警报和Webhook触发的自动化任务;能生成并行子任务,这些子任务可在独立的沙箱中同时运行;可选择使用不同的AI模型,如Anthropic Claude、OpenAI Codex(通过ChatGPT订阅)或OpenCode Zen。
安全模型(仅单租户)
重要提示:此系统仅设计用于单租户部署,即所有用户都是同一组织的受信任成员,且可访问相同的仓库。
工作原理
该系统使用共享的GitHub App安装来进行git操作(克隆、拉取、推送)。控制平面在服务器端生成短期安装令牌,并根据需要通过git凭证助手将其提供给沙箱。这意味着:所有用户共享相同的GitHub App凭证。GitHub App必须安装在你组织的仓库上,系统的任何用户都可以访问该App有权限访问的任何仓库;系统在创建会话前不会验证用户是否有权限访问特定仓库;创建PR时使用GitHub用户的OAuth令牌。对于使用GitHub登录的用户,会使用其GitHub OAuth令牌创建PR,确保正确归因,且用户只能在有写入权限的仓库上创建PR。以其他方式(如Google)登录的用户没有SCM令牌,因此他们的PR会使用共享的GitHub App机器人。
令牌架构
| 令牌类型 | 用途 | 范围 |
|---|---|---|
| GitHub App令牌 | 代理git克隆/拉取/推送认证 | App已安装的所有仓库 |
| 用户OAuth令牌 | 创建PR、获取用户信息 | 用户有权限访问的仓库 |
| 沙箱认证令牌 | 沙箱到控制平面的会话调用 | 单个会话 |
| WebSocket令牌 | 实时会话认证 | 单个会话 |
为何仅支持单租户
此架构遵循Ramp的Inspect设计,该设计是为内部使用而构建的,所有员工都是受信任的,并且可以访问公司仓库。对于多租户部署,你需要:为每个租户安装GitHub App;在会话创建时进行访问验证;在数据模型中实现租户隔离。
部署建议
部署在你组织的SSO/VPN之后,确保只有授权员工可以访问Web界面;仅在预期的仓库上安装GitHub App,因为App的安装范围决定了系统可以访问的内容;限制登录方式,配置允许的GitHub用户、电子邮件域名或活跃的GitHub组织成员身份(ALLOWED_GITHUB_ORGS);使用GitHub的仓库选择功能,在安装App时选择特定的仓库,而不是“所有仓库”。
架构
┌──────────────────┐
│ Clients │
│ ┌──────────────┐ │
│ │ Web / Slack │ │
│ │ GitHub / Lin.│ │
│ │ Webhooks │ │
│ └──────────────┘ │
└────────┬─────────┘
▼
┌────────────────────────────────────────────────────────────────────┐
│ Control Plane (Cloudflare) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Durable Objects (per session) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌───────────────┐ │ │
│ │ │ SQLite │ │WebSocket│ │ Event │ │ GitHub │ │ │
│ │ │ DB │ │ Hub │ │ Stream │ │ Integration │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └───────────────┘ │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ D1 Database (repo-scoped secrets) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└────────────────────────────────┬───────────────────────────────────┘
▼
┌────────────────────────────────────────────────────────────────────┐
│ Data Plane (Sandbox Backend) │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Session Sandbox │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ Supervisor│──│ OpenCode │──│ Bridge │─────────────────┼──┼──▶ Control Plane │
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ │ │ │ │ │ │ │ │ │ │ Full Dev Environment │ │
│ │ │ (Node.js, Python, git, agent-browser) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────┘
软件包
| 软件包 | 描述 |
|---|---|
| control-plane | Cloudflare Workers + Durable Objects |
| web | Next.js Web客户端 |
| sandbox-runtime | 共享的沙箱内代理运行时 |
| modal-infra | Modal沙箱基础设施 |
| daytona-infra | Daytona快照基础设施 |
| opencomputer-infra | OpenComputer模板基础设施 |
| slack-bot | Slack集成(通过消息启动会话) |
| github-bot | GitHub集成(自动审查、@提及) |
| linear-bot | Linear集成(将问题转化为编码会话) |
| shared | 共享类型和实用工具 |
快速开始
若要获取实际的设置指南(本地 + 贡献者 + 部署路径),请从docs/SETUP_GUIDE.md开始;部署说明请参考docs/GETTING_STARTED.md;若要了解架构和核心概念,请阅读docs/HOW_IT_WORKS.md;若要设置定期任务,请参阅docs/AUTOMATIONS.md。
关键特性
1.快速启动:通过多层预热,会话几乎可以立即启动:文件系统快照:每次提示后,沙箱状态会被保存,后续会话将恢复状态,而非重新克隆;预构建镜像:可按仓库(设置 > 镜像)或按环境(设置 > 环境)进行切换,每30分钟使用最新提交和依赖项重新构建;主动预热:在你开始输入时,沙箱就会开始启动,无需按下回车键。
2.多仓库会话与环境:一个会话可以在单个沙箱中处理多个仓库:临时集合:在新会话选择器中最多选择10个仓库,每个仓库会并排克隆,代理可以进行协调更改,并为每个仓库打开一个PR;环境:将仓库集合保存为一个命名环境,设置自己的密钥范围和可选的预构建镜像,然后像选择任何仓库一样从选择器中启动它。模型相关内容请参阅docs/HOW_IT_WORKS.md,环境预构建请参阅docs/IMAGE_PREBUILD.md。
3.多人会话:多个用户可以在同一会话中协作:在线状态指示器显示谁处于活跃状态;在git提交中,提示会归因于其作者;实时流式传输到所有连接的客户端。
4.提交归因:提交会归因于发送提示的用户:
// 为每个提示配置git身份
await configureGitIdentity({
name: author.scmName,
email: author.scmEmail,
});5.多供应商模型支持:选择适合你任务的AI模型,并可对每个会话的推理工作进行控制:
| 供应商 | 模型 |
|---|---|
| Anthropic | Claude Haiku 4.5、Sonnet 4.5/4.6、Opus 4.5/4.6/4.7/4.8、Fable 5 |
| OpenAI | GPT 5.4、GPT 5.5、5.3 Codex、5.3 Codex Spark |
| OpenCode Zen | Kimi K2.5/K2.6、MiniMax M2.5、Qwen3.7 Max、GLM 5/5.1(可选加入)、Z.AI Coding Plan GLM 5.2(可选加入) |
客户端集成
可在团队日常工作的任何地方与代理进行交互:Web UI:提供完整的会话管理功能,包括实时流式传输、模型/推理选择器、终端面板和多人在线状态显示;Slack机器人:通过@提及或私信启动会话,结果会以线程形式回复。可通过App Home设置每个用户的模型和分支偏好。具体请参阅Slack集成文档;GitHub机器人:在PR打开时自动审查,或响应PR评论中的@提及。可按仓库进行配置。具体请参阅GitHub集成文档;Linear机器人:在问题中提及或分配代理以启动编码会话,发布进度活动并链接生成的PR。具体请参阅Linear集成文档;Webhook:通过经过身份验证的HTTP POST从任何外部系统触发会话。
自动化
可安排定期任务或对外部事件做出反应,无需人工干预:Cron调度:支持每小时、每天、每周、每月或自定义的5字段Cron表达式,并支持时区设置;Sentry警报:在出现新错误、回归或关键指标警报时自动进行分类;入站Webhook:使用JSONPath条件过滤器来决定哪些有效负载可以启动会话;多仓库分发:一个计划的自动化任务可以在最多10个仓库上运行,为每个仓库打开一个单独的会话和拉取请求;连续失败3次后自动暂停,提供手动触发按钮,并记录完整的运行历史。设置说明请参阅docs/AUTOMATIONS.md。
沙箱环境
每个会话都在一个隔离的沙箱后端中运行,具备完整的开发环境:预安装软件:Node.js 22、Python 3.12、Bun、git、GitHub CLI、build-essential;浏览器自动化:agent-browser CLI搭配无头Chromium,可用于截图、视觉差异比较和UI验证;Code-server:可选的基于浏览器的VS Code,连接到会话工作区;Web终端:由ttyd驱动的终端,可从会话UI访问;端口隧道:通过加密隧道暴露最多10个开发服务器端口。在.openinspect/start.sh运行之前,URL可在沙箱内的/workspace/.tunnels.env中找到(详细信息);密钥管理:采用AES-256-GCM加密,支持全局、按仓库或按环境的作用域,在启动时作为环境变量注入。支持批量粘贴导入.env文件。
子任务生成
代理可以将工作分解为并行的子会话:spawn-task可在其自己的沙箱中创建一个子会话,并立即返回;父任务继续工作,子任务在单独的分支上并行运行;提供get-task-status和cancel-task进行协调;实施深度限制和按仓库的防护措施。
仓库生命周期脚本
仓库可以在.openinspect/下定义两个可选的启动脚本:
#.openinspect/setup.sh (配置脚本)
#!/bin/bash
npm install
pip install -r requirements.txt
#.openinspect/start.sh (运行时启动脚本)
#!/bin/bash
docker compose up -d postgres redissetup.sh用于镜像构建和全新会话。在使用预构建镜像和恢复快照启动时会跳过该脚本。对于全新会话,setup.sh失败不会导致会话启动失败,但在镜像构建模式下失败则会导致构建失败;start.sh在每个非构建会话启动时运行(全新、预构建镜像、恢复快照)。如果该脚本存在且失败,则会话启动失败;默认超时时间:SETUP_TIMEOUT_SECONDS(默认300秒),START_TIMEOUT_SECONDS(默认120秒);两个钩子都会接收到OPENINSPECT_BOOT_MODE(build、fresh、repo_image、snapshot_restore)。当共享安装有权限时,钩子中的git操作可以对配置的SCM主机上的其他私有仓库进行身份验证。许可证
MIT
致谢
受Ramp的Inspect启发,并使用以下技术构建:Modal - 云沙箱基础设施;Daytona - 云开发沙箱;Vercel Sandbox - 云沙箱基础设施;OpenComputer - 云沙箱基础设施;Cloudflare Workers - 边缘计算;OpenCode - 编码代理运行时;Next.js - Web框架
