LLM Gateway 选型

我主要是个人使用,拥有数个 LLM Provider 的多个 API Key。需要一个工具或者平台来进行管理。主要需求有

  1. 可观测性,想知道消耗多少 token,缓存命中率,失效原因,工具调用情况,能像 claude-tap 那样能看到具体的 HTTP 请求响应
  2. 虚拟 API Key,使用时不暴露真实的 provider 的 API key,这样能够在平台层就区分每个工具的使用情况,以及可以分享给其他人临时使用
  3. 负载均衡,回退机制,可以在一个 key 失效的情况下使用另一个 key 顶上
  4. 最好还能有 prompt 的修改功能,我实在看不惯 claude code 在 system prompt 里面给自己打广告的行为

在 cuihuan/awesome-ai-gateway: ⚡ Awesome AI Gateway 推荐列表中调研了很久,主要产品也都尝试过,最终选择了 Bifrost,这些是不选其它的理由:

  • OpenRouter,不支持国内的模型供应商,也没有办法通过修改 baseURL 的方式来支持,并且它的 BYOK 机制居然是收费的
  • Cloudfare AI gateway,也不能用国内模型,就没尝试
  • LiteLLM,没有 WebUI
  • NewAPI,我不想当一个中转站,它的这些销售功能即便开启了自用模式也没有办法关掉
  • Claude Code Router,很可惜是个桌面端应用,而我想部署在服务端容器中,给我运行在各处的 AI Agent 使用
  • 9router,没有模型名的映射功能,以及其他宣传点和我的需求对不上
  • Higress,UI 真简单,而且我需要 AI Gateway 而不是 API Gateway
  • claude-code-hub,没有详细请求日志,会修改转发的请求 Header,而且现在处于大型重构节点上,未来许有变化。还有一点就是整个项目特别是文档,过于 Vibe 了,信息熵太低
  • LLMRelayService,开发者出发点跟我差不多,个人使用,无商业化,但是目前使用中,它的这个缓存命中率居然全是 100%,感觉数据不太对

但 Bifrost 也不是完美的,不足也有

  • AI 时代居然缺少 i18n 支持
  • 自托管版本会展示很多企业版本中的功能,就像广告一样
  • 不支持订阅,只能使用 API Key

Docker 容器设置时区

一般 TZ 改改就行了,但 Alpine 上不一定稳,得这样,连环境变量都不用设了

services:
  app:
    volumes:
      - /usr/share/zoneinfo:/usr/share/zoneinfo:ro
      - /etc/localtime:/etc/localtime:ro

一般如果主机上 /etc/localtime 是 symlink 的,只挂在 /etc/localtime 就足够了。

特别是遇到容器中 /etc/localtime 也自带 symlink 的,就必须不要再挂 /usr/share/zoneinfo Docker 镜像中的 symlink 无法被 bind mount 覆盖

Docker 容器使用自签名证书

之前把证书 给 Docker Daemon 启用 TLS 验证 安装在主机上之后,容器中想用就得 update-ca-certificate 运行一次真麻烦,直接挂载是最简单的。

services:
  app:
    volumes:
      - /etc/ssl/certs:/etc/ssl/certs:ro

不过先记得安装

root@docker:~# step certificate install ~/.step/certs/root_ca.crt
Certificate /root/.step/certs/root_ca.crt has been installed.
X.509v3 Root CA Certificate (ECDSA P-384) [Serial: 7460...9431]
  Subject:     Kokomi Network Root V1
  Issuer:      Kokomi Network Root V1
  Valid from:  2025-08-30T09:18:31Z
          to:  2055-08-23T09:18:31Z