手把手搭建 LLM 聚合网关:统一管理多模型与预算

384 次阅读 0 点赞 0 评论 10 分钟原创技术教程

本教程带你从零部署 Otari 网关,统一对接 40+ 模型提供商。学完可独立完成网关部署、配置多提供商、创建虚拟 API Key、设置预算上限,并通过 OpenAI SDK 无缝调用多模型,实现项目级成本隔离与用量追踪。

#LLM #网关 #AI #OpenAI #API #成本优化 #开源教程 #Docker
手把手搭建 LLM 聚合网关:统一管理多模型与预算

手把手搭建 LLM 聚合网关:统一管理多模型与预算

团队接入了三个大模型提供商,每个都有自己的 API Key,计费方式各不相同。更头疼的是有人超量调用导致月底账单爆炸,查日志查了整整一个下午。如果你也碰到过类似的问题——钥匙散落在各个配置文件里、分不清哪个应用用了多少钱、想统一做流量控制和成本分摊——这篇教程就是为你准备的。

我会带你一步步搭建一个 LLM 聚合网关,用一个统一的 endpoint 对接 40+ 模型提供商,发虚拟 Key、设预算、看用量,全部在本地搞定。这个项目叫 Otari,由 Mozilla AI 团队开源,完全兼容 OpenAI 接口,你现在用 OpenAI SDK 写的代码,只需改一个 base_url 就能无缝切换过来。

前置条件

开始之前,确认你的机器满足以下条件:

  • 已安装 Docker 和 Docker Compose
  • 至少有一个模型提供商的 API Key(比如 OpenAI)
  • 了解基础的 curl 和 Shell 操作

为什么用 Docker?因为 Otari 依赖 PostgreSQL 做数据持久化,Compose 一键拉起网关 + 数据库,比手动装数据库省心太多。生产环境也推荐这种架构。


第一步:用 Docker 快速跑起来

打开终端,执行以下命令启动临时实例:

bash 复制代码
docker run --rm -p 8000:8000 \
  -e OTARI_MASTER_KEY=SET_A_MASTER_KEY \
  -e OPENAI_API_KEY=你的OPENAI_KEY \
  -e OTARI_CONFIG_YAML='
default_pricing: true
providers:
  openai:
    api_key: ${OPENAI_API_KEY}
' \
  mzdotai/otari:latest \
  otari serve

这段命令做了什么?

  • -p 8000:8000:把网关的 8000 端口映射到宿主机,方便本地调试
  • OTARI_MASTER_KEY:网关的管理密钥,后续创建虚拟 Key、进 Dashboard 都需要它
  • OTARI_CONFIG_YAML:内联配置,告诉 Otari 你启用了哪些提供商
  • default_pricing: true:开启默认计费,网关能自动估算每次调用的成本

启动成功后你会看到类似提示:

复制代码
No API keys found. Created bootstrap key for first run. Save this now:
tk-abc123...

把这个 Key 记下来,它是网关自动创建的启动密钥,后续调用全靠它。


第二步:发送第一个请求

新开一个终端,验证网关能否正常工作:

bash 复制代码
curl http://localhost:8000/api/v1/chat/completions \
  -H "Authorization: Bearer tk-你的启动密钥" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai:gpt-6-luna",
    "messages": [{"role": "user", "content": "用一句话介绍 Otari"}]
  }'

注意 model 字段的格式:提供商名:模型名。如果用 Anthropic,可以换成 anthropic:claude-sonnet-5-5。

正常返回标准 OpenAI 兼容格式响应。这就是 Otari 的核心价值:代码不需要改,只要把 base_url 指向网关,模型调用就走网关了。

用 OpenAI Python SDK 调用示例:

python 复制代码
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/api/v1",
    api_key="tk-你的启动密钥"
)

response = client.chat.completions.create(
    model="openai:gpt-6-luna",
    messages=[{"role": "user", "content": "你好,Otari!"}]
)
print(response.choices[0].message.content)

只需改 base_url 这一个地方,现有项目里的调用完全不用动。迁移成本几乎为零。


第三步:搭建持久化生产实例

刚才的容器是临时的(--rm),停了数据就没了。真正用起来你需要持久化存储。

bash 复制代码
## 克隆项目
git clone https://github.com/mozilla-ai/otari
cd otari

## 复制配置模板
cp config.example.yml config.yml

## 编辑 config.yml,设置你的 master key、提供商凭证

打开 config.yml,把提供商凭证填进去:

yaml 复制代码
providers:
  openai:
    api_key: sk-openai-xxx
  anthropic:
    api_key: sk-ant-xxx

生成加密密钥(用于数据库里安全存储提供商凭证):

bash 复制代码
grep -qs OTARI_PROVIDER_ACCOUNT_PEPPER .env || echo "OTARI_PROVIDER_ACCOUNT_PEPPER=$(openssl rand -base64 32)" >> .env

启动服务:

bash 复制代码
docker compose pull
docker compose up -d

打开浏览器访问 http://localhost:8000/,进入 Otari 管理 Dashboard。在这里你可以:

  • 管理提供商和模型
  • 创建虚拟 API Key(按用户、按项目、按模型都行)
  • 设置预算上限
  • 查看实时用量和费用
  • 配置路由策略(比如 OpenAI 挂了自动切 Anthropic)

想用 Dashboard 直接录入提供商 Key,还需要在 .env 里设置 OTARI_SECRET_KEY,用 otari gen-secret-key 命令生成 Fernet 密钥填进去。


实战:给两个虚拟项目分发 Key 并设置预算

假设你有两个内部项目——「客服助手」和「数据分析」,你想分别给它们发 Key,并且控制月度花费不超过 50 美元。

步骤 1:在 Dashboard 创建虚拟 Key

登录 Dashboard → Keys → Create Key。

  • 给客服助手创建一个 Key,设置 scope 为 openai:gpt-6-luna(限制只能用便宜的模型)
  • 给数据分析创建一个 Key,设置 scope 为 openai:gpt-6.1-sol(允许用更强的模型)

步骤 2:设置预算

在 Budgets 页面,为每个 Key 设置月度预算上限,比如各 25 美元。当调用量超出预算上限后,Otari 会拒绝后续请求,防止费用失控。

步骤 3:验证预算生效

用客服助手的 Key 发起请求:

bash 复制代码
curl http://localhost:8000/api/v1/chat/completions \
  -H "Authorization: Bearer tk-客服助手虚拟Key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai:gpt-6-luna",
    "messages": [{"role": "user", "content": "你好"}]
  }'

预算已耗尽时,网关会返回 403 状态码(错误码 budget_exceeded)的响应,直接拦截请求,不会转发到 OpenAI。网关在请求转发前就做了一层拦截,省掉了大量重复代码。


常见问题 & 踩坑提醒

Q1:用 OpenAI SDK 时报 401 怎么办?

SDK 里直接传 api_key="tk-xxx" 即可,OpenAI SDK 会自动处理 Authorization 头。不要在代码里手动加 Bearer 前缀。

Q2:想用别的模型提供商怎么加?

在 config.yml 的 providers 部分添加对应配置即可。Otari 支持 40+ 提供商,包括 Anthropic、Google Gemini、Mistral、Cohere 等。

Q3:本地开发不想装 PostgreSQL?

把配置文件里的 database_url 改成 sqlite+aiosqlite:///./otari.db 就能用 SQLite,适合本地调试。生产环境建议用 PostgreSQL。

Q4:网关本身收费吗?

Otari 是 Apache 2.0 开源协议,完全免费。你只需要付模型提供商的费用。

Q5:怎么实现模型调用失败自动重试其他提供商?

在 Dashboard 的 Routing 页面配置 fallback 策略。比如设置:先调 OpenAI,如果 5xx 错误或超时,自动切到 Anthropic。


总结

今天完成了四件事:

  1. 用 Docker 一键跑起 Otari 网关
  2. 通过 curl 和 OpenAI SDK 发第一条请求,验证兼容性
  3. 搭建带 PostgreSQL 的持久化生产实例
  4. 实战创建虚拟 Key、设置预算,实现项目级成本隔离

下一步建议:

  • 去 Dashboard 探索 Routing 功能,给关键应用配置自动 failover
  • 查看 Otari 的 --profile code-exec --profile web-search 等扩展能力,开启代码沙箱和联网搜索
  • 把生产环境的 base_url 换上服务器地址,配合 Nginx + HTTPS 直接对外暴露

如果你团队里有人在为多模型 Key 管理和成本分摊头疼,半小时部署,长期受益。

最后更新:2026-10-19T10:02:26

评论 (0)

发表评论

blog.comments.form.loading
0/500

暂无评论,快来发表第一条评论吧!