ARTICLE / 产品

把「未知工具」默认当成写操作:OpenBot 的四个设计取舍

OpenBot 是 CopilotKit 在 2026-08-17 建仓的一个自托管工作台,MIT 许可,定位是「AI 同事」:每个 Bot 有自己的电脑(容器里的 Chromium、登录态、工作目录),跑在服务器端,你可以从 Mac、Windows、Web、iOS、Android、Slack、Teams 连进去。

仓里 12056 个 star、37 个 release,很容易被写成一份功能清单。它的差异在四个取舍上,每一个都把安全成本放进了产品结构,而不是文档的注意事项。

CopilotKit/OpenBot 仓库页截图 CopilotKit/OpenBot 仓库页截图 来源:GitHub CopilotKit/OpenBot 仓库页,github.com,截取日期 2026-11-14

取舍一:审计行先于动作

README 里对执行路径的描述很明确:网关是唯一入口,它从服务端持有的快照解析目标、评估策略、写审计行,然后才调用那台电脑。原话是「没有任何路径能在记录存在之前行动」。

这句话和常见的「操作后写日志」是两种东西。事后日志的可靠性取决于日志模块本身是否正常工作;审计先行意味着,如果写不进审计行,动作就发不出去。

配套的是可读的拒绝理由:/admin/audit 列出被允许、被拒绝、失败的调用,每一次拒绝都带上导致它的那条规则。运维时最怕的是「被拦了但不知道为什么」,这一点它给了答案。

取舍二:不在目录里的一律按写入

MCP 工具的分类规则是这份 README 里最值得抄的一条,但方向比「默认拒绝」更细。

未知工具(目录里根本没有的)和自定义服务器的工具,一律按写处理。目录内的工具则反过来:服务器宣传了某个目录工具、却没把它标成写类时,按读处理。

两条合起来看,规则是「目录是唯一可以被信任的清单」:进了目录、且被明确归类的,才享受按读放行的待遇;不在清单里的,默认按写。这个方向的成本和收益都很清楚——接一个新工具先要进目录评审,否则它只能走写路径。

它同时解决了一个现实问题:Bot 被告知它有哪些连接器、哪些没有授权。没有授权的,它会直接说「没给我这个权限」,而不是跑到厂商网站上乱试。

取舍三:隔离粒度定在「人」

每个使用者分一个电脑容器,容器里有目录和浏览器配置文件,每个 Bot 在其中各有一份配置;需要更细时,勾一个 Bot 的 Isolated 就给它单独一个容器。宿主支持时,COMPUTER_RUNTIME=runsc 能把这些容器跑在 gVisor 里。

容器的绑定策略是回环加每容器独立 token:电脑只监听 127.0.0.1,访问要带该容器的 token。README 写得很直白——知道端口不等于能摸到一个已登录的浏览器。

它也诚实标注了残留风险:supervisor 同样绑在回环,但它持有 Docker socket,它的 token 是共享秘密而不是网络边界。这句自我限定比很多产品文档的「安全隔离」要可信。

取舍四:治理挂在协议上,不挂在框架上

任何讲 AG-UI 的端点就是一个 Bot。LangGraph、Mastra、CrewAI、Pydantic AI、Google ADK 写的,或者手写的,接进来都一样。执行平台也可以自选:Bedrock AgentCore、Claude 托管 Agent、自建基础设施,通过一个 AG-UI 端点接上。

好处是换模型、换框架不动治理层——身份、权限、审批、审计都在工作台这一侧。对一个要长期维护内部 Agent 平台的团队,这比「支持多少框架」的清单重要。

端点注册也有校验:用与浏览器导航相同的目标检查,注册时校验一次,之后每一次重定向再校验一次。自定义端点的鉴权头只写不读(write-only),存进去就取不回来。

这些取舍的代价

四条设计都不便宜。

容器化意味着每个使用者、每个隔离 Bot 都要一份运行时,笔记本上跑得动,团队规模上去就得 Kubernetes 加 PostgreSQL;README 给了单机镜像和集群两条路,也把 COMPUTER_RUNTIME=runsc 标成「宿主支持时可用」。

默认按写处理意味着前期的策略梳理成本,以及「Bot 说没权限」时的一轮配置返工。审计先行意味着审计存储是硬依赖,写不进去就动不了。

还有一条是产品上的取舍:这套东西的治理能力集中在工作台,一旦你为了省事绕过它直连容器或直连 MCP 服务器,前面四条就全部失效。README 把「网关是唯一入口」写得这么硬,反过来说也是它最脆的地方。

什么时候值得用

如果只是想让一个 Agent 帮你跑几条命令,这套东西太重了。它的形状是给「多人共用一个 Agent 平台」的团队准备的:需要知道谁让 Bot 做了什么、被哪条规则拦了、哪些凭据存在哪里。

按这个标准,它至少在三个点上比自研更容易交付:审计前置、未知按写、每容器回环加 token。这三点都不需要你从头想清楚,仓库里的默认行为已经摆在那里。

参考来源

  • GitHub CopilotKit/OpenBot 仓库 README,https://github.com/CopilotKit/OpenBot (采集日期 2026-11-14)