news 2026/9/4 1:44:55

基于LiteLLM构建统一AI API网关:团队协作中的密钥管理与模型路由实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于LiteLLM构建统一AI API网关:团队协作中的密钥管理与模型路由实践

给一个多人协作的 AI 应用团队搭过接口的朋友都知道,最麻烦的往往不是模型效果本身,而是每个成员各自存了一堆 API Key:模型供应商不同、Base URL 不同、调用地址散落各处,密钥一旦提交到 Git 仓库,就有被盗刷的风险。把这个场景抽象一下,其实团队需要的是一个统一 AI API 网关:把多个模型供应商的接口收拢到一个入口,所有成员只从网关拿独立的虚拟 Key,由网关负责路由、鉴权、限流和用量统计。这篇文章会从零开始,用开源项目 LiteLLM 搭建这样一套网关,并把它接入到 OpenAI 客户端 SDK 中,让朋友或队友用统一地址调用不同厂商的模型。需要提前说明的是,这里说的“共享”只覆盖一个合规前提:使用团队自己从官方渠道合法购买的 API Key,通过网关集中管理;不涉及共享订阅会员、转售密钥或绕过任何付费限制。

1. 先搞清楚统一 AI API 网关到底解决什么问题

1.1 多人协作时,密钥分散带来的三个风险

很多小团队一开始是让每个人自己去注册模型服务商,自己保存 API Key。这种方式在一个人写 Demo 时没问题,但一旦变成多人协作,问题就会慢慢暴露出来。

第一个风险是密钥泄露面变大。API Key 会出现在环境变量、IDE 配置、命令行历史、部署服务器的.env文件甚至聊天记录里。只要有一处被提交到公开仓库,整个账号都等于暴露了,别人可以拿着这个 Key 直接调用模型,费用却记在你的账单上。

第二个风险是调用入口不统一。A 成员的项目调用 OpenAI,B 成员的项目调用 DeepSeek,C 成员又用通义千问。每个项目的base_urlapi_key都不一样,哪天想换模型供应商,就得逐个项目改配置,非常容易漏改。

第三个风险是成本无法归属。几个人共用同一个 Key 时,没有独立的用量统计,月底看账单只能知道总花费,谁也说不清每个模型、每个功能模块分别花了多少。预算一旦失控,定位成本也很困难。

1.2 网关的四个职责:路由、鉴权、限流、审计

统一 AI API 网关本质上是一个轻量级代理服务,客户端请求先发给网关,网关再转发给上游模型供应商。

第一个职责是路由。网关维护一张模型映射表,把客户端请求的model_name映射到上游真实模型 ID。比如客户端请求deepseek-chat,网关转发给 DeepSeek 的官方接口;客户端请求gpt-4o-mini,网关转发给 OpenAI 的官方接口。对调用方来说,只需要知道网关的地址和网关定义的模型名,不需要关心上游细节。

第二个职责是鉴权。网关向团队成员分发虚拟 Key,每个虚拟 Key 可以绑定一组允许使用的模型。成员调用时只能使用自己的虚拟 Key,管理员可以随时吊销某个 Key,而不需要更换上游供应商密钥。

第三个职责是限流。网关可以按虚拟 Key 设置每分钟请求数上限、每分钟 Token 数上限和总预算,避免某个成员误用死循环直接耗尽账户余额。

第四个职责是审计。每次请求的模型、Token 数、费用、调用来源都会记录到日志里,管理员可以通过接口查询,做到成本可追溯。

1.3 合规前提:只共享 API 入口,不共享账号会员

这一条必须单独说明。日常交流中,有人会把“和朋友分享服务”理解成把某个会员账号转发给朋友使用,或者建立一个接口转发服务,让没有购买额度的人绕过官网限制使用模型。这类做法通常违反模型供应商的服务条款,还可能导致账号封禁、Key 泄露、费用纠纷,不展开做教程也不建议尝试。

本文的方案是另一条合法路径:你和朋友在同一个项目或技术小组里,各自通过官方渠道购买 API 额度,然后把密钥统一放到自己的网关服务器上。网关只解决“多人如何安全地共用一套模型调用入口”的问题,所有人使用的仍然是合法购买的额度,没有绕过任何官方限制。

2. 技术选型和环境准备:用 LiteLLM 从零搭建

2.1 为什么选择 LiteLLM

市面上的 LLM Gateway 工具不少,但对零基础用户来说,LiteLLM 有几个明显的优势。

首先,它是开源项目,采用宽松的开源许可证,可以免费部署在自己的服务器上,数据不会经过第三方中转平台。其次,它支持大量主流模型供应商,包括 OpenAI、Anthropic、DeepSeek、通义、Kimi、Azure OpenAI 等,基本覆盖国内技术团队常用的选择。第三,它对外提供 OpenAI 兼容接口,也就是说 OpenAI SDK、LangChain 等生态里的工具可以直接把base_url指向 LiteLLM,代码改动量很小。第四,它内置虚拟 Key 管理、预算控制、请求日志等能力,不需要自己从零实现一套鉴权和统计系统。

需要说明的是,LiteLLM 版本更新比较快,具体接口和字段在不同版本可能有一些差异。本文以当前主流用法为例,落地前建议去官方仓库查看对应版本文档。

2.2 环境要求和部署方式

搭建 LiteLLM 有两种常见方式:直接使用 Python 虚拟环境安装,或者使用 Docker 部署。

对于零基础场景,最推荐的是用 Docker Compose 部署,因为环境隔离彻底、启动简单、日志查看也方便。本地只需要安装 Docker 和 Docker Compose,不需要关心 Python 版本和依赖冲突。

如果本机还没有 Docker,需要先安装 Docker Engine。Linux 服务器可以参考 Docker 官方安装文档,Windows 和 macOS 可以安装 Docker Desktop。安装完成后,通过下面命令确认环境可用:

docker --version docker compose version

如果不想用 Docker,也可以使用 Python 虚拟环境:

python -m venv .venv source .venv/bin/activate pip install 'litellm[proxy]'

2.3 准备合规 API Key 和端口规划

在开始部署前,需要准备以下内容:

一是上游模型服务的 API Key。例如 DeepSeek 的 Key、OpenAI 的 Key,具体从各官方平台申请。这些都是你或团队自己购买的额度,后续统一放到网关配置中。

二是服务器地址和端口。LiteLLM 默认监听 4000 端口,如果部署在云服务器上,需要在安全组或防火墙中放行 4000 端口。建议先只用 HTTP 在测试环境验证,后续上线再加 Nginx 和 HTTPS。

三是管理端密钥。LiteLLM 的管理员调用接口需要 master key,这个 Key 只保存在服务器环境变量里,不能写进代码仓库。

学习环境可以直接在本机验证;如果要在团队中使用,建议准备一台内存至少 1GB 的云服务器,因为 LiteLLM 本身占用资源不高,主要吃内存用于缓存和日志。

3. 最小可运行配置:用 config.yaml 把第一个模型跑起来

3.1 项目目录和 config.yaml

建议新建一个独立目录管理网关配置,以ai-gateway为例,目录结构如下:

ai-gateway/ ├── config.yaml ├── .env └── docker-compose.yml

其中config.yaml是 LiteLLM 的核心配置,示例内容如下:

model_list: - model_name: deepseek-chat litellm_params: model: deepseek/deepseek-chat api_key: os.environ/DEEPSEEK_API_KEY - model_name: gpt-4o-mini litellm_params: model: gpt-4o-mini api_key: os.environ/OPENAI_API_KEY general_settings: master_key: os.environ/LITELLM_MASTER_KEY

.env文件保存敏感信息,内容如下:

DEEPSEEK_API_KEY=sk-你的deepseek密钥 OPENAI_API_KEY=sk-你的openai密钥 LITELLM_MASTER_KEY=sk-master-123456

注意.env不要提交到 Git,建议加入.gitignore

3.2 配置逐行拆解

model_list是路由表,每一项定义一个对外暴露的模型。model_name是客户端请求时使用的模型名称,建议命名简单直观;litellm_params.model是上游真实模型 ID,DeepSeek 使用deepseek/deepseek-chat这种“服务商/模型名”的写法,OpenAI 直接写gpt-4o-mini,LiteLLM 会根据前缀识别服务商。

api_key设置为os.environ/DEEPSEEK_API_KEY,表示从环境变量读取密钥,而不是直接写在 YAML 里。这样即使配置文件被误传,也不会泄露密钥。

general_settings.master_key是管理员密钥,用于调用/key/generate/spend/logs等管理接口。换到生产环境时,这个密钥至少要改成随机长字符串。

3.3 用 Docker Compose 启动

docker-compose.yml中写入:

services: litellm: image: ghcr.io/berriai/litellm:main-stable container_name: ai-gateway restart: unless-stopped env_file: - .env ports: - "4000:4000" volumes: - ./config.yaml:/app/config.yaml command: ["--config", "/app/config.yaml", "--port", "4000"]

然后启动:

docker compose up -d

首次启动会拉取镜像,需要一点时间。启动完成后查看日志:

docker compose logs -f litellm

看到类似“Uvicorn running on http://0.0.0.0:4000”的日志,说明服务已经正常启动。

3.4 验证网关是否存活

用 curl 检查健康接口:

curl http://127.0.0.1:4000/health/liveliness

正常返回:

{"status": "ok"}

如果是云服务器,可以换成公网 IP 测试,但必须先确认防火墙和安全组放行 4000 端口。这一步没跑通,后面所有调用都会失败,所以建议作为第一个验收点。

4. 配置详解:模型路由、Master Key 和虚拟 Key

4.1 模型路由的映射关系

理解 LiteLLM 的配置,最关键的是搞清楚两层模型名。

第一层是客户端可见的model_name,第二层是上游服务商的真实模型 ID。客户端请求到达网关时,LiteLLM 根据model_name查表,找到对应的litellm_params.model,再带着该模型的上游 API Key 去请求供应商。

这种设计的好处是:上游模型可以在不改动客户端代码的情况下切换。比如把deepseek-chat指向另一个同类型模型,客户端代码仍保持model="deepseek-chat",只需要调整配置并重启网关。

配置字段速查如下:

配置字段作用示例
model_name客户端请求时使用的模型名deepseek-chat
litellm_params.model上游真实模型 IDdeepseek/deepseek-chat
litellm_params.api_key上游供应商 API Keyos.environ/DEEPSEEK_API_KEY
general_settings.master_key管理端 Master Keyos.environ/LITELLM_MASTER_KEY

4.2 Master Key 和虚拟 Key 的分工

这里需要区分两类 Key。

Master Key 是管理员密钥,权限最大,可以调用管理接口,也可以生成和注销其他 Key。这个 Key 绝对不能发给普通成员。

虚拟 Key 是给普通成员使用的调用凭据,由管理员通过 Master Key 生成。虚拟 Key 可以绑定指定模型、设置预算和限流。朋友或团队成员只拿到虚拟 Key,拿不到上游供应商的 Key。

这样做的好处很明显:即使某个虚拟 Key 泄露,管理员可以单独注销它,不需要更换上游供应商密钥;同时由于虚拟 Key 绑定了模型范围和预算,即使被滥用,损失也可控。

4.3 限流与预算参数速查

LiteLLM 在生成虚拟 Key 时支持多个控制参数,常用字段如下:

参数含义示例值
models允许该 Key 使用的模型列表["deepseek-chat"]
max_budget该 Key 的累计费用上限10表示 10 美元
budget_duration预算周期30d表示 30 天
rpm_limit每分钟最多请求数60
tpm_limit每分钟最多 Token 数100000

字段大小写和具体格式在不同 LiteLLM 版本可能略有差异,生产环境要以当前官方文档为准。原则是:能设置预算就设置预算,宁可先收紧再放开。

5. 让朋友接入:OpenAI SDK、requests 和 curl 都能调用

5.1 给朋友生成一个独立虚拟 Key

使用 Master Key 调用生成接口:

curl -X POST 'http://服务器IP:4000/key/generate' \ -H 'Authorization: Bearer sk-master-123456' \ -H 'Content-Type: application/json' \ -d '{ "models": ["deepseek-chat", "gpt-4o-mini"], "max_budget": 20, "budget_duration": "30d", "info": {"note": "friend-a"} }'

返回结果会包含生成的虚拟 Key,类似:

{ "key": "sk-新生成的虚拟Key", "models": ["deepseek-chat", "gpt-4o-mini"], "max_budget": 20, "budget_duration": "30d" }

把返回的key值单独发给对应的朋友,不要发到群共享。

5.2 用 OpenAI SDK 接入

因为 LiteLLM 对外提供 OpenAI 兼容接口,朋友的项目只需要把base_url改成你的网关地址,把api_key改成虚拟 Key。

Python 示例:

from openai import OpenAI client = OpenAI( api_key="sk-虚拟Key", base_url="http://服务器IP:4000/v1", ) resp = client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": "你好,请用三句话介绍微积分"}], ) print(resp.choices[0].message.content)

需要注意,base_url末尾的/v1不能省略,因为 OpenAI SDK 会在后面拼接/chat/completions

5.3 用 requests 直接调用

如果不依赖 SDK,也可以直接用 Python requests 发送请求:

import requests url = "http://服务器IP:4000/v1/chat/completions" headers = { "Authorization": "Bearer sk-虚拟Key", "Content-Type": "application/json", } payload = { "model": "deepseek-chat", "messages": [{"role": "user", "content": "你好"}], } resp = requests.post(url, headers=headers, json=payload, timeout=30) print(resp.status_code) print(resp.json()["choices"][0]["message"]["content"])

这个方式适合 JavaScript、Go 等语言,只要 HTTP 客户端支持 POST JSON 就可以。

5.4 用 curl 快速验证

在服务器本机或任意能访问网关的机器上执行:

curl 'http://服务器IP:4000/v1/chat/completions' \ -H 'Authorization: Bearer sk-虚拟Key' \ -H 'Content-Type: application/json' \ -d '{ "model": "deepseek-chat", "messages": [{"role": "user", "content": "你好"}] }'

正常返回是 OpenAI 格式的 JSON,choices[0].message.content就是模型回复内容。如果返回 401,先检查虚拟 Key 是否正确;如果返回 404,先检查model_name是否和配置一致。

6. 用量查询和费用管理

6.1 查看每个虚拟 Key 的用量

管理员可以通过 Master Key 查询每个虚拟 Key 的消耗:

curl 'http://服务器IP:4000/user/info' \ -H 'Authorization: Bearer sk-master-123456'

返回内容里会包含当前 Key 的花费、请求数、Token 数等信息。这样当朋友反馈“我的请求被拒了”,你可以快速看到是不是预算已经用完。

6.2 查看请求日志

LiteLLM 提供了请求日志查询接口,可以查看每次请求的模型、Token 消耗和费用明细:

curl 'http://服务器IP:4000/spend/logs' \ -H 'Authorization: Bearer sk-master-123456'

这个接口在生产环境非常有用,能帮助团队定位“某个功能突然费用变高”的问题。建议在接入网关后,立即让朋友跑通一次请求,然后在日志里确认这条记录是否存在,这样后面查问题就有据可依。

6.3 预算保护配置

除了在生成虚拟 Key 时设置max_budget,还可以在config.yaml中配置全局预算:

general_settings: master_key: os.environ/LITELLM_MASTER_KEY max_budget: 100

这只是一种基础保护。更稳妥的做法是给每个朋友单独设置预算,目的是隔离风险,避免一个人消耗掉整个团队的额度。预算设置过低会导致请求频繁失败,设置过高则失去保护意义。建议先按每 30 天一个周期设置,观察一周后再调整。

7. 常见问题排查:从现象到根因

7.1 错误现象速查表

问题现象常见原因检查方式处理建议
网关启动失败,端口被占用4000 端口已被占用ss -lntp | grep 4000更换端口或停止占用进程
curl 健康检查不通服务未启动、防火墙未放行docker compose ps/ 安全组规则启动容器并放行端口
返回 401虚拟 Key 错误或已注销检查请求头 Authorization重新生成虚拟 Key
返回 404 或模型不存在请求的model_name不在配置中对比 config.yaml 和请求体统一模型名
上游报 401供应商 API Key 错误或账户欠费查看网关日志中的上游响应检查环境变量和账户状态
调用超时网络问题或上游服务不稳定检查服务器网络、上游状态页增加超时时间并重试
请求被拒绝但费用接近上限虚拟 Key 预算用尽查询/user/info提高预算或续期

7.2 模型访问不了怎么排查

先确认请求头里的虚拟 Key 是网关生成的,不是上游供应商的 Key。然后确认请求体里的modelconfig.yaml中的model_name完全一致,大小写和连字符都不能差。

接着查看网关日志。Docker 部署时执行:

docker compose logs -f litellm

日志中会显示请求路由到了哪个上游地址,以及上游返回的原始错误。这一步能区分问题是出在“网关层面”还是“上游服务商层面”。

7.3 Docker 场景下的日志排查

如果容器启动后立即退出,先看日志:

docker compose logs

常见原因包括:config.yaml路径错误、环境变量未加载、YAML 语法错误。YAML 对缩进非常敏感,粘贴配置时尤其要注意。

如果改了.env后不生效,需要重新创建容器:

docker compose up -d --force-recreate

修改配置后也建议重启容器,让它重新加载 config.yaml。

8. 从单机 Demo 到生产环境的最佳实践

8.1 安全加固清单

把网关暴露在公网之前,至少完成以下检查:

  • Master Key 使用强随机字符串,只保存在服务器环境变量中。
  • 所有虚拟 Key 都设置了模型白名单和预算上限。
  • 没有对外开放管理接口的默认权限,/key/generate等接口必须带 Master Key。
  • 确认 Docker 容器没有被映射到/key/generate等危险端口之外的地址。
  • .envconfig.yaml中不包含真实密钥的明文提交到 Git。
  • 定期查看/spend/logs,发现异常消耗立即吊销对应虚拟 Key。

这一条值得反复强调:不要图省事把 Master Key 直接发给朋友,也不要关闭鉴权让所有人匿名访问。匿名访问一旦被扫描到,会出现被刷账单的风险。

8.2 Nginx 与 HTTPS 部署

生产环境不建议直接暴露 4000 端口给外部。更常见的做法是用 Nginx 做反向代理,并通过 Let’s Encrypt 配置 HTTPS。

Nginx 配置示例:

server { listen 443 ssl; server_name api.example.com; ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem; location / { proxy_pass http://127.0.0.1:4000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

这样外部地址变成https://api.example.com/v1,数据链路走 TLS 加密,密钥不会以明文形式在公网传输。

8.3 合规提醒和审计建议

网关集中管理了模型访问权限,事实上也是团队的合规边界。建议做好三件事:一是只接入有正规 API 额度且允许合法调用的模型服务;二是保留调用日志,方便核对费用;三是当有人离开团队时,及时吊销对应虚拟 Key,而不是让 Key 继续留在对方手里。

如果团队人数变多,开始涉及费用分摊,可以让每个成员绑定自己的独立虚拟 Key,并通过/spend/logs定期导出账单。这样既清晰,也能避免因为共用同一个 Key 导致的费用纠纷。

8.4 后续扩展路线

这套方案跑通之后,可以根据团队需要继续扩展。

一是接入更多模型。在model_list中新增节点,给每个模型配置独立的上游 Key 即可。客户端代码不用改,只改网关配置。

二是增加负载均衡和故障转移。LiteLLM 支持把同一个模型配置多个上游 Key,或将请求路由到多个供应商,形成高可用。这个适合对稳定性要求更高的场景。

三是基于网关日志做成本报表。把/spend/logs的结果同步到数据库或 BI 工具,按项目、按成员、按模型统计费用。

对于零基础用户,这个项目最大的价值在于:你亲手建起了一个包含“路由、鉴权、限流、审计”四个能力的小型基础设施。以后无论团队接入多少模型,入口永远是那一个地址,密钥管理也有了一条清晰的边界。这就是搭建统一 AI API 网关相比直接发 Key 给朋友最本质的差别。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 1:43:17

TlV2:从脚本碎片化到工程化任务编排的实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 1:43:15

世界模型评测新范式:从Long-Horizon任务到Agent玩家

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 1:41:39

JavaEE物业管理系统实战:从需求分析到部署上线的完整构建指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/4 1:37:18

CPM社团发现算法:从MATLAB实现到复杂网络分析实战

简介:本资源是面向复杂网络分析初学者与科研人员的CPM社团划分算法Matlab实现套件,聚焦解决真实网络中社区结构识别问题,适用于社交网络、生物网络及合作网络等场景的社团探测与可视化分析。压缩包共2026个文件,总大小8.58MB&…

作者头像 李华
网站建设 2026/9/4 1:36:47

Grok机器人改进建议这样提:从模糊愿望到工程级反馈

我连续参加过几次类似的产品改进征集,慢慢发现一个规律:真正能从海量回复中被捞出来讨论的建议,往往不是那些“希望支持某个新功能”的愿望清单,而是能直接回答“项目组拿到这条信息之后,下一步该干什么”的反馈。“Gr…

作者头像 李华
网站建设 2026/9/4 1:36:44

从零开始光学镜头设计:使用开源工具入门成像原理与仿真实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华