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

手把手搭建 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。
总结
今天完成了四件事:
- 用 Docker 一键跑起 Otari 网关
- 通过 curl 和 OpenAI SDK 发第一条请求,验证兼容性
- 搭建带 PostgreSQL 的持久化生产实例
- 实战创建虚拟 Key、设置预算,实现项目级成本隔离
下一步建议:
- 去 Dashboard 探索 Routing 功能,给关键应用配置自动 failover
- 查看 Otari 的
--profile code-exec --profile web-search等扩展能力,开启代码沙箱和联网搜索 - 把生产环境的 base_url 换上服务器地址,配合 Nginx + HTTPS 直接对外暴露
如果你团队里有人在为多模型 Key 管理和成本分摊头疼,半小时部署,长期受益。