学习如果想有成效,就必须专心。学习本身是一件艰苦的事,只有付出艰苦的劳动,才会有相应的收获。——谷超豪

Open-Inspect:让编码代理在后台持续推进工作的开源系统

项目地址:https://github.com/ColeMurray/background-agents

写代码这件事,常常并不只发生在编辑器前的一段专注时间里。

一个需求需要拆解,一处异常需要排查,一组改动需要验证,多个仓库之间可能还存在相互关联的调整。真正耗时的部分,往往不是发出第一句指令,而是等待环境准备、等待代码分析、等待任务执行、等待结果回传,以及等待一个能够被审阅的拉取请求出现。

Open-Inspect 是一个开源的后台编码代理系统。它受到 Ramp Inspect 的启发,目标是让编码任务能够在后台运行:当人们继续处理其他工作时,代理可以在独立的开发环境中完成任务、处理代码、创建拉取请求,并通过网页、Slack、GitHub 拉取请求、Linear 问题或 Webhook 等入口与团队协作。

它试图将编码代理从一次性的对话窗口,变成一个持续运转的工作单元。

不必守在屏幕前等待任务结束

Open-Inspect 的核心,是后台运行的编码代理。

用户可以提交任务,然后将注意力转向别的事情。代理会在后台环境中继续工作,并拥有 Node.js、Python、git、浏览器自动化、VS Code 等开发工具。它不是只接收一句指令后给出文本回答,而是能够在完整开发环境中展开实际的软件开发工作。

这种形态让任务执行拥有了更清晰的节奏:

  • 人发出需求
  • 系统准备会话与沙箱
  • 代理在后台处理工作
  • 会话持续流式回传状态与结果
  • 代码改动可以形成拉取请求
  • 团队成员能够进入同一个会话,实时观察与协作

后台代理并不意味着过程不可见。相反,Open-Inspect 将会话、实时状态、事件流、产物与协作成员放入系统中,使任务能够在后台推进,也能够被前台观察。

从网页到 Slack,从 GitHub 到 Linear

编码工作并不总是从同一个入口开始。

有时,任务来自网页中的一段需求描述。有时,团队成员在 Slack 中提到一个机器人。有时,代码审查中的拉取请求需要自动检查。有时,一个 Linear 问题本身就是开发任务的起点。有时,外部系统通过 Webhook 发来信号,希望自动触发后续工作。

Open-Inspect 为这些工作入口提供了连接方式。

Web UI

网页界面提供完整的会话管理能力,包含实时流式输出、模型与推理强度选择、终端面板,以及多人协作状态。

在这里,会话不再只是孤立的一次交互,而是一段可管理的任务过程。用户可以创建会话、查看任务状态、观察沙箱运行情况,并通过界面继续补充指令。

Slack Bot

Slack 机器人支持通过提及或私信启动会话,也支持 PNG、JPEG、WebP 与 GIF 作为提示附件。任务执行后的结果会回到对应的消息线程中。

Slack 中的交流通常快速、碎片化且与上下文紧密相连。将编码会话放进消息线程,意味着任务可以从团队原本的沟通位置自然发起。

GitHub Bot

GitHub 机器人可以在拉取请求打开时进行自动审查,也可以响应拉取请求评论中的提及。相关配置可以按仓库进行设置。

这让代理能够进入代码审查的现场。当代码变更已经摆在拉取请求中时,机器人可以围绕这一变更启动工作。

Linear Bot

Linear 机器人支持在问题中提及或分配代理,以启动编码会话。它能够发布进度活动,并将最终形成的拉取请求与问题关联起来。

需求、问题、进度与代码变更由此拥有了一条连续的路径:从问题开始,到任务执行,再到拉取请求。

Webhooks

Webhook 为外部系统提供了通过已认证 HTTP POST 触发会话的方式。对于已有事件系统、内部平台或外部服务而言,这使编码代理能够成为自动化流程中的一个执行环节。

一个会话,可以容纳多人协作

Open-Inspect 支持多人会话。

多个用户可以进入同一个会话中协作,系统会显示当前活跃成员,并将实时流式信息同步给所有已连接的客户端。不同成员发出的提示会与其身份关联,提交中的作者信息也会反映提示的发起者。

这让代理会话不仅是人与机器之间的单线沟通,也可以成为团队共同参与的工作空间。

在一个多人会话里,团队成员可以同时关注任务进展。有人提出初始需求,有人补充约束,有人查看终端输出,有人等待结果。代理继续执行,信息则持续流动。

对于协作开发而言,任务本身通常不属于某一个人的孤岛。Open-Inspect 让会话具备了多人同时参与的能力,使背景中的自动化工作也能拥有共同的上下文。

提交归属,让提示与代码作者保持连接

当代理根据提示修改代码并产生提交时,提交归属是一个重要问题。

Open-Inspect 会将提交归属到发送提示的用户。README 中给出了对应的 git 身份配置方式:

1
2
3
4
await configureGitIdentity({
name: author.scmName,
email: author.scmEmail,
});

这种设计让提交记录能够保留提示发起者的信息。对于多人协作的会话而言,不同用户提出的工作请求不会在提交历史中失去来源。

系统也支持创建拉取请求,并使用用户的 GitHub OAuth Token 创建拉取请求,以保证归属正确,同时使用户只能在自己拥有写权限的仓库中创建拉取请求。

对于通过其他方式登录而没有源代码管理令牌的用户,拉取请求会回退到共享 GitHub App 机器人。

一次会话,处理多个仓库

许多真实任务并不局限于一个仓库。

一次改动可能涉及服务端、前端、共享库或多个独立项目。Open-Inspect 支持多仓库会话,让一个会话能够在同一个沙箱中处理多个仓库。

用户可以在创建会话时选择最多十个仓库。这些仓库会并排克隆到同一个沙箱中,代理可以进行协调修改,并为每个仓库创建对应的拉取请求。

系统也支持环境这一概念。

环境可以保存为一个具名的仓库集合,并拥有自己的密钥范围与可选预构建镜像。对经常需要一起工作的仓库而言,环境让多仓库协作不必每次都从头选择。

一个环境可以承载一组固定的工作上下文:哪些仓库会一起出现,哪些密钥会被注入,是否使用预构建镜像。它让多仓库任务拥有可复用的起点。

为重复工作准备的托管技能

编码代理的能力不仅来自模型,也来自任务开始前得到的指令与资料。

Open-Inspect 提供托管技能能力,用于创建可复用的指令和辅助文件,并在会话启动时提供给代理。

这些技能可以被分配到全局范围,也可以分配给指定仓库或环境。用户还可以保存个人配置文件,以便反复使用常见的技能组合。每个会话能够固定使用特定的技能版本,从而让行为具有可重复性。

对于经常出现的工程规范、开发流程、项目约束或任务类型,可复用的技能让代理不必每次都从零开始理解要求。

它像是为代理准备的一套工作手册:会话启动时,代理能够带着这套手册进入任务,而不是只带着一条临时输入。

从预热到快照,让会话更快进入工作状态

启动速度决定了后台代理是否足够自然地融入日常工作。

Open-Inspect 在会话启动上采用多层预热机制。

文件系统快照

每次提示之后,沙箱状态都会被保存。后续会话可以恢复已有状态,而不是重新克隆仓库。

这使连续任务能够延续之前的工作空间。代码、依赖、环境状态与已有上下文不必完全从头准备。

预构建镜像

预构建镜像可以按仓库或按环境启用。镜像每三十分钟使用最新提交与依赖重新构建。

当仓库或环境已经具备可用镜像时,新会话能够更快获得相应的开发基础。

主动预热

当用户开始输入提示时,沙箱就可以开始启动,而不必等到按下发送键。

输入尚未结束,环境已经开始准备。这种提前发生的动作,让等待时间被尽可能压缩到后台。

多模型支持,让代理选择更贴近任务

Open-Inspect 支持多个模型提供方,并且可以为每个会话选择模型与推理强度。

支持范围包括 Anthropic Claude、OpenAI Codex、xAI Grok、OpenCode Zen 与 Z.AI Coding Plan。

README 中列出的模型包含:

提供方 模型
Anthropic Claude Haiku 4.5、Sonnet 4.5、Sonnet 4.6、Sonnet 5、Opus 4.5、Opus 4.6、Opus 4.7、Opus 4.8、Opus 5、Fable 5、Fable 5.1
OpenAI GPT 5.4、GPT 5.5、5.3 Codex、5.3 Codex Spark
xAI 与 SuperGrok Grok 模型
OpenCode Zen Kimi K2.5、Kimi K2.6、Kimi K3、MiniMax M2.5、Qwen3.7 Max、GLM 5、GLM 5.1、GLM 5.2
Z.AI Coding Plan GLM 5.2、GLM 5.3

OpenAI 模型可以通过现有的 ChatGPT 订阅使用 OAuth 方式接入,而不需要单独的 API Key。

Anthropic 模型可以通过连接 Claude 订阅的 Claude Agent Harness 运行。Grok 模型可以通过符合条件的 SuperGrok 订阅,借助控制平面管理的 OAuth 使用。

模型选择不再被固定在系统的一处,而是可以随会话变化。不同任务可以拥有不同的模型选择与推理强度。

每个会话,都在独立沙箱中运行

Open-Inspect 的每个会话都运行在隔离的沙箱后端中。

沙箱中预装了以下开发环境与工具:

  • Node.js 22
  • Python 3.12
  • Bun
  • git
  • GitHub CLI
  • build-essential

除了基础开发工具,沙箱还提供浏览器自动化能力。agent-browser CLI 搭配无头 Chromium,可用于截图、视觉差异比较与界面验证。

系统也提供可选的浏览器版 VS Code,并可通过 code-server 连接到会话工作区。终端通过 ttyd 提供,并可从会话界面访问。

对于需要运行本地开发服务的任务,系统支持通过加密隧道暴露最多十个开发服务器端口。对应地址会在 .openinspect/start.sh 执行前写入沙箱中的 /workspace/.tunnels.env

在密钥处理上,系统使用 AES-256-GCM 加密。密钥可以按全局、仓库或环境范围进行配置,并在沙箱启动时以环境变量方式注入。系统也支持批量粘贴导入 .env 内容。

沙箱不是只有代码目录的一块临时空间,而是一个围绕开发任务构建的工作环境:工具、终端、浏览器、编辑器、端口与密钥,都能够在会话需要时进入其中。

控制平面与数据平面,各自承担不同职责

Open-Inspect 的整体架构分为控制平面与数据平面。

控制平面运行在 Cloudflare 上,承担会话管理、实时通信、事件流、GitHub 集成与密钥相关能力。每个会话对应 Durable Objects,内部包含 SQLite 数据库、WebSocket Hub、事件流与 GitHub 集成。

共享状态保存在 D1 数据库中,包含仓库范围的密钥等信息。

数据平面则是沙箱后端。每个会话拥有自己的沙箱,其中包含 Supervisor、Harness 与 Bridge。Harness 可以使用 OpenCode 或 Claude。沙箱运行于完整开发环境中,并通过 Bridge 与控制平面连接。

这种结构让系统中的不同部分各司其职:

  • 控制平面管理会话状态与实时连接
  • 沙箱负责实际执行编码工作
  • GitHub 集成处理仓库访问与拉取请求
  • 密钥以加密形式保存,并在沙箱启动时提供
  • 客户端通过网页、Slack、GitHub、Linear 与 Webhook 进入系统

并行子任务,让复杂工作不必排成长队

复杂任务通常可以被拆成多个部分。

Open-Inspect 支持子会话能力,代理可以将工作分解为并行执行的子任务。子会话会在各自独立的沙箱中运行,并使用不同分支开展工作。

spawn-child 可以创建子会话并立即返回,让父会话继续向前推进。send-child-prompt 可以向已有的直接子会话发送后续指令。get-child-statuscancel-child 则用于协调子会话的状态与执行过程。

系统对深度与仓库范围设置了限制与保护措施。

这种机制让父会话不必停在某一项耗时工作前等待。它可以继续处理其他部分,而子会话在独立沙箱中并行展开。对于包含多项相对独立工作的任务,代理能够将工作切分成多条并行的路径。

自动化任务,让编码代理按计划或事件行动

Open-Inspect 支持自动化能力。

自动化可以按固定计划运行,也可以响应外部事件。它不一定需要人在每一次任务开始时手动发出提示。

支持的自动化方式包括:

  • 按小时、每日、每周、每月运行
  • 使用带时区支持的自定义五字段 Cron 表达式
  • 响应 Sentry 中的新错误、回归或关键指标告警
  • 在 GitHub Actions 工作流完成时启动任务
  • 依据工作流名称与结论进行过滤
  • 通过入站 Webhook 接收外部事件
  • 使用 JSONPath 条件过滤决定哪些载荷能够创建会话
  • 对最多十个仓库进行多仓库扇出执行

一次计划自动化可以在多个仓库中运行,并分别创建会话与拉取请求。

系统会记录完整的运行历史。如果自动化连续失败三次,它会自动暂停。用户也可以手动触发自动化。

这让代理从被动响应输入的工具,进一步成为可以按时间表或事件信号行动的自动化执行者。

仓库启动脚本,让环境准备成为项目的一部分

仓库可以在 .openinspect 目录下定义两个可选脚本。

setup.sh 用于环境准备:

1
2
3
#!/bin/bash
npm install
pip install -r requirements.txt

start.sh 用于运行时启动:

1
2
#!/bin/bash
docker compose up -d postgres redis

setup.sh 会在镜像构建与全新会话中运行。当会话通过预构建镜像或文件系统快照恢复时,系统会跳过该脚本。

对于全新的会话,setup.sh 失败不会阻止会话继续启动。但在镜像构建模式中,setup.sh 失败会导致构建失败。

start.sh 会在所有非构建模式的会话启动时运行,包括全新启动、预构建镜像启动与快照恢复。若该脚本存在且执行失败,会话启动也会失败。

两个脚本都会得到 OPENINSPECT_BOOT_MODE 环境变量。它的取值可以是:

1
2
3
4
build
fresh
repo_image
snapshot_restore

通过这些脚本,仓库能够将自身的依赖安装、服务启动与环境准备要求放进代理会话的启动流程中。

单租户安全模型

Open-Inspect 的安全模型明确面向单租户部署。

系统假定所有用户都是同一组织中受信任的成员,并且拥有对同一批仓库的访问关系。它不适合直接作为多租户系统使用。

系统使用共享的 GitHub App 安装来执行克隆、拉取与推送等 git 操作。控制平面在服务端生成短生命周期安装令牌,并在需要时通过 git 凭据助手提供给沙箱。

这意味着,拥有相应角色并被允许使用仓库的活跃用户,可以访问 GitHub App 已安装到的仓库。系统在创建会话前,不会验证某一位用户是否对特定仓库拥有权限。

创建拉取请求时,GitHub 登录用户会使用自己的 GitHub OAuth Token。这使拉取请求能够拥有正确的用户归属,也确保用户只能在拥有写权限的仓库中创建拉取请求。

系统涉及四类令牌:

令牌类型 用途 范围
GitHub App Token 用于克隆、拉取与推送认证 GitHub App 已安装的全部仓库
User OAuth Token 用于创建拉取请求与获取用户信息 用户有权限访问的仓库
Sandbox Auth Token 用于沙箱与控制平面之间的会话调用 单个会话
WebSocket Token 用于实时会话认证 单个会话

为了将访问范围控制在组织内部,README 给出了几项部署方向:

  • 将系统部署在组织的 SSO 或 VPN 后方
  • 仅将 GitHub App 安装到需要访问的仓库
  • 限制登录用户、邮箱域名或活跃 GitHub 组织成员
  • 在安装 GitHub App 时选择特定仓库,而不是全部仓库

如果需要支持多租户部署,则需要每个租户拥有独立的 GitHub App 安装、在会话创建时执行访问验证,并在数据模型中实现租户隔离。

以开源方式构建后台编码工作流

Open-Inspect 使用 MIT 许可证。

它建立在多种基础设施与工具之上,包括 Modal、Daytona、Vercel Sandbox、OpenComputer、E2B、Cloudflare Workers、OpenCode、Claude Agent SDK 与 Next.js。

这些组件共同构成了它的运行轮廓:边缘控制平面管理会话,云端沙箱提供开发环境,编码代理在环境中执行任务,网页与协作工具承担人与系统的连接,自动化机制则让任务可以按照时间或事件持续触发。

结语

Open-Inspect 想解决的,并不只是如何让模型写出代码。

它关注的是,如何让编码代理拥有真正可以工作的后台环境,如何让任务从网页、Slack、GitHub、Linear 或 Webhook 自然进入系统,如何让多人共同观察和推进同一段工作,如何让提交与拉取请求保留正确归属,以及如何让重复工作通过计划与事件自动发生。

从独立沙箱、浏览器自动化、终端与 VS Code,到多仓库环境、托管技能、预构建镜像、文件系统快照、并行子会话与自动化任务,Open-Inspect 将编码代理放进了一套更完整的工作结构中。

在这里,代理不是只能等待下一句输入的对话对象。

它可以在后台继续前进。