装了 5 个 AI 编程 Agent 之后,我写了个面板把它们全管起来了——顺便验出中转站有没有偷换模型

4 阅读7分钟

起因:装 Agent 很爽,管 Agent 很崩溃

我机器上现在同时装着 Claude Code、Codex CLI、Cursor、Gemini CLI、opencode。每多装一个,就多一份要伺候的东西:

  • 换一个 API 中转商,要挨个去开 ~/.claude/settings.json~/.codex/config.toml~/.gemini/settings.json,三个文件三种格式;
  • 同一个 MCP Server 要在每个 Agent 里各装一遍,装完过两周就想不起来到底哪几个装了;
  • 这个月一共烧了多少钱?每家后台各看各的,本地跑的那些根本没人统计;
  • 买的是「Claude Opus 无限量」,实际给你的是什么模型,你其实并不知道。

所以有了 Casbin Gateway:一个本地的 AI 编程 Agent 管理面板。Apache 2.0 开源,Go + React,一条命令装完,Windows / macOS / Linux 都有。

GitHub:github.com/apache/casb…

一、杀手锏:你买的那个 API,背后真是卖给你的模型吗?

先说最想安利的功能,因为这个是别处基本没有的。

中转站可以做很多你看不出来的事:拿便宜模型冒充贵的、把根本没命中的缓存算成命中收你钱、宣称支持某个参数但实际收了个 200 就悄悄丢掉、甚至在你的请求前面偷偷塞一段自己的 prompt。这些在流量里都是看不出来的——返回结构完全合法,模型名字是它自己填的,你无从对证。

Gateway 的 Authenticity 页面会自动向上游发一组探针去问它:

  • 答话的到底是不是你点的那个模型?(在中转商的端点上,这个字段就是它自己想写什么写什么,所以只算一半分)
  • 模型自己说是谁训练的?
  • 请求前面有没有被人塞东西?
  • 同一个问题连问几遍,是不是同一个模型在答?
  • 文档里写支持的参数(logprobsn、停止词)到底是老实执行了、明确拒绝了,还是收了 200 然后偷偷丢掉?
  • 一个题库,全是有唯一正确答案的题,从数一个单词里有几个字母到《滕王阁序》是谁写的;
  • 两级嵌套的 tool schema 在强制调用下还活不活得下来;
  • 事件流里该有的字段有没有;缓存计费实不实;两次一模一样的请求收费一不一样;厂商自己的响应头在不在。

最后给 0100 分和 AF 等级,直接挂在首页每个供应商上面。

关键是 每条测试用例都是公开的:它问了什么、发出去的原始请求长什么样、怎么判分、占多少权重,全写在页面上。你可以改权重、关掉某条、改问法,也可以按自己的需求加题——毕竟一个不公开方法的评分,本来也不能当证据。「恢复默认」会把内置的那套放回来,你自己加的题不动。

一次探针花那个 provider 几分钱,报告里会写清楚花了多少。报告还有个不花钱的下半部分:从 Gateway 已经存下来的记录里算,这个上游实际有多少缓存如实计费了、失败率多少、响应多慢、有多少流量根本查不到价格。

二、换中转商,点一下就换完

第二常用的功能。

Providers 页面加一个供应商(预置 44 家厂商,或者直接填任意 OpenAI / Anthropic 兼容的 base URL),Agents 页面点一下绑定,Gateway 就把配置按那个 Agent 自己的格式写进它自己的文件里。下次想换,再点一下,不用再打开任何一个 json / toml。

写之前有 Preview,能看到即将写进去的确切内容;写完发现不对有 Restore

顺带一个副作用:Gateway 在中间会翻译协议,所以 Codex 可以跑 DeepSeek、Claude Code 可以跑 Kimi。如果上游本来就说同一种协议,那就一个字节不动地透传。

还有一种情况是没有 API Key——比如你的 Codex 是用 ChatGPT 订阅登录的。这时把供应商的鉴权方式设成「用调用方自己的登录」,Gateway 不持有任何 key,只是把 Agent 自己带的凭证转发上去,记录和路由照做。

三、这个月到底花了多少钱

Usage 页面按天、按模型、按 Agent 拆开。

这里有个我觉得挺重要的设计:数据是从各个 Agent 自己写在磁盘上的会话记录里读的,不是只统计走了网关的流量。所以哪怕你一条流量都没接进来,装上 Gateway 第一次启动就有数——包括你之前几个月的历史。

价格用的是一张可编辑的价格表,能定时从 models.dev 同步,你自己手改过的价格不会被覆盖。

四、给每个 Agent 定规矩

Permissions 页面,每个 Agent 大约 40 个开关,分六组:终端、读项目、改项目、联网、规划与委派,再加上它装的每个 MCP Server 一个开关。

  • 组头上的开关一键管一整组,展开之后可以细到「能跑命令」「能看正在跑的命令的输出」「能停掉命令」是三个独立开关;
  • 关掉的工具,在请求离开你的机器之前就被从工具列表里摘掉了,模型压根不知道有这么个工具,也就没机会调用;
  • 每个 Agent 给工具起的名字都不一样,Bashshellrun_shell_command 在这里是同一个开关;
  • 每组末尾有个兜底项,管的是「Gateway 还没见过的工具」——这样你关的是一整类,而不是设置那天恰好列出来的那几个;
  • 还能限制模型:只许用某几个,或者除了某几个都行,支持 claude-opus-* 这种通配。想防止手滑用贵模型烧钱,这条最直接。

被拒的请求会按调用方所说的那套 API 返回 permission_error,所以 Agent 看到的是「被拒绝了」,而不是「网关坏了」。

底层是编译成 Casbin 的策略去判的,Advanced 里能看到生成的 model.confpolicy.csv,也可以自己加策略行。

五、剩下几个每天都会碰的

  • 技能 / MCP / 提示词一张表看全:每个 Agent 装了哪些技能、哪些 MCP Server、提示词写了什么,横着排在一起,可以从一个 Agent 复制到另一个,也可以从 GitHub 仓库、zip、本地文件夹装到好几个 Agent 里去。不用同一个 MCP Server 装五遍。
  • 管 Agent 自己的版本:每个 Agent 现在是哪个 build、包管理器那边发到哪个版本了、一键升级;升完发现新版有毛病,一键回到旧版。不管当初是 npm、brew、winget、微软商店还是官方脚本装的,都在同一行上操作,执行的命令会先给你看。
  • 多开:同一个 Agent 开好几个实例,每个有自己的状态目录和账号——比如两个 Claude Desktop 各登各的号。
  • 完整留档:走了网关的请求,完整的 system prompt、每一条消息、每一次工具调用、模型当时被提供了哪些工具的 schema,全都留在你自己机器上。
  • 从链接导入:厂商页面上那种「一键添加到我的 Agent」按钮,点了会打开 Gateway 的导入页,把链接里带的供应商 / MCP / 提示词 / 技能仓库摊开给你看,按下按钮之前什么都不会写

六、装起来

一条命令:

curl -fsSL https://raw.githubusercontent.com/apache/casbin-gateway/master/scripts/install.sh | bash

Windows 用 PowerShell:

irm https://raw.githubusercontent.com/apache/casbin-gateway/master/scripts/install.ps1 | iex

下载当前机器的构建、解压、把 casbin-gateway 放进 PATH、启动、并设置成开机自启。不需要数据库、不需要装 Go 和 Node,数据就是它自己目录下的一个 SQLite 文件。

装完自己开一个窗口,不用登录(它只服务这一台机器);关掉窗口在托盘里继续跑。不想要窗口的话 casbin-gateway start 只跑服务,浏览器打开 http://localhost:17000 一样。

目前认识 29 个 Agent 客户端——Claude Code、Claude Desktop、Codex CLI、Gemini CLI、Cursor、Windsurf、Cline、Qwen Code、iFlow、Kimi Code、CodeBuddy、Zed、Continue、Aider、goose、Crush、Droid、Trae、opencode、OpenClaw 等等。每个客户端在「监控 / 换供应商 / MCP / 技能 / 提示词 / 会话 / 安装」七项上支持到什么程度是逐项标注的,做不到的地方写「—」,不写「即将支持」

演示动图:cdn.casbin.org/img/casbin-…

项目地址:github.com/apache/casb… ,Apache 2.0,欢迎提 issue。