一个 Key,一个端点,所有模型随便切。本文带你 5 分钟完成 LLM 网关的搭建和模型切换。


你大概率遇到过这个场景

PM 说:“这个 prompt,你用 DeepSeek、通义千问、GLM 都跑一遍,对比一下效果。”

你的操作:

  1. 打开 DeepSeek 的项目 → 找到 DeepSeek 的 Key → 改代码 → 调 API → 看结果
  2. 切到通义千问的项目 → 找到通义的 Key → 改代码 → 调 API → 看结果
  3. 切到 GLM 的项目 → 找到 GLM 的 Key → 改代码 → 调 API → 看结果

完了还要把每个模型的输出整理到一个表格里,发给 PM。

三个模型,三套 Key,三次代码改动。如果测五个模型呢?十个呢?

这就是 LLM 网关要解决的问题。


什么是 LLM 网关

一句话:LLM 网关是你应用和所有大模型之间的统一入口。

以前:
你的应用 →  DeepSeek API(Key 1)
你的应用 →  通义千问 API(Key 2)
你的应用 →  智谱 GLM API(Key 3)
你的应用 →  豆包 API(Key 4)
...

现在:
你的应用 →  自己的网关 :8787 → DeepSeek
                              → 通义千问
                              → 智谱 GLM
                              → 豆包
                              → ...

你的代码只需要知道网关的地址,网关帮你把请求路由到正确的模型厂商。

切换模型 = 改一个 HTTP Header 参数。


5 分钟上手

前置条件

  • Node.js ≥ 18
  • Docker(用于 Redis)
  • 至少一个模型厂商的 API Key(比如 DeepSeek 的)

第一步:启动网关

git clone https://github.com/EmilyLi2026/OneLLM.git
cd OneLLM/gateway-core
npm install

# 启动 Redis
docker-compose up -d redis

# 启动网关
npm run dev:node

看到 Gateway running on port 8787,你的网关就起来了。一分钟。

第二步:发第一个请求

用你的 DeepSeek Key 试试:

curl http://localhost:8787/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "x-portkey-provider: deepseek" \
  -H "x-portkey-api-key: sk-你的DeepSeek-Key" \
  -d '{
    "model": "deepseek-chat",
    "messages": [{"role": "user", "content": "用一句话解释什么是机器学习"}]
  }'

返回结果跟直接调 DeepSeek API 一模一样。网关只是帮你做了透明转发。

第三步:见证"一行代码切换"

现在,假设你要切换到通义千问。你需要做的:

# 改两个 Header,其他一字不动:
-H "x-portkey-provider: dashscope"       # deepseek → dashscope
-H "x-portkey-api-key: sk-你的通义-Key"   # DeepSeek Key → 通义 Key
curl http://localhost:8787/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "x-portkey-provider: dashscope" \
  -H "x-portkey-api-key: sk-你的通义千问-Key" \
  -d '{
    "model": "qwen3-turbo",
    "messages": [{"role": "user", "content": "用一句话解释什么是机器学习"}]
  }'

切换到智谱 GLM:

-H "x-portkey-provider: zhipu"
-H "x-portkey-api-key: sk-你的智谱-Key"
-d '{"model": "glm-4-flash", ...}'

切换到 Moonshot / Kimi:

-H "x-portkey-provider: moonshot"
-H "x-portkey-api-key: sk-你的Kimi-Key"
-d '{"model": "moonshot-v1-8k", ...}'

同一个端点,同一个端口,同一套代码。 唯一变化的,就是那个 x-portkey-provider 的值。


这跟你的代码有什么关系?

大部分 AI 项目用的是 OpenAI SDK。OneLLM 的 API 是完全 OpenAI 兼容的。你只需要把 base_urlhttps://api.openai.com 改成 http://localhost:8787/v1

Python:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8787/v1",  # 改成你的网关地址
    api_key="sk-your-deepseek-key"         # 你用的模型厂商的 Key
)

# 调 DeepSeek
response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "Hello"}]
)

# 切换到通义千问?改一行:
response = client.chat.completions.create(
    model="qwen3-turbo",      # model 换了
    messages=[{"role": "user", "content": "Hello"}],
    extra_headers={"x-portkey-provider": "dashscope"}  # 加一行就行
)

Node.js:

const OpenAI = require('openai');
const client = new OpenAI({
  baseURL: 'http://localhost:8787/v1',
  apiKey: 'sk-your-key',
});

// 切换模型 → 改 extra_headers
const response = await client.chat.completions.create({
  model: 'qwen3-turbo',
  messages: [{ role: 'user', content: 'Hello' }],
}, {
  headers: { 'x-portkey-provider': 'dashscope' }
});

curl(通用):

# 模板:一个脚本调所有模型
for provider in deepseek dashscope zhipu moonshot; do
  curl -s http://localhost:8787/v1/chat/completions \
    -H "x-portkey-provider: $provider" \
    -H "x-portkey-api-key: $KEY" \
    -d "{\"model\": \"$MODEL\", \"messages\": [...]}" \
    | jq '.choices[0].message.content'
done

改了 base_url 这一行之后,你再也不需要为了换模型改代码。


🔥 进阶:虚拟 Key——连厂商 Key 都不用暴露

上面的方式还有一个问题:你的代码里还是需要知道各厂商的原始 API Key。如果有人离职呢?如果 Key 泄露了呢?

这时候,启动管理后台,创建虚拟 Key

# 终端 1:启动管理 API(需要 MySQL)
cd admin-api
cp .env.example .env   # 配置数据库连接
npm install
npx tsx src/db/migrate.ts   # 初始化数据库(含 12 家国产模型预置数据)
npx tsx src/index.ts        # 启动 → :3100

# 终端 2:启动管理控制台
cd admin-console
npm install
npx vite                    # 启动 → :3101

然后在浏览器打开 http://localhost:3101

  1. 创建 Workspace(给你的团队)
  2. 录入 Provider 凭证(把你的 DeepSeek、通义、智谱等 Key 录入,AES-256 加密存储)
  3. 生成虚拟 Key(得到一个 onellm_sk_xxxx 的 Key)
  4. 绑定 Provider(把这个虚拟 Key 绑给你录入的所有厂商 Key)

现在,你的代码只需要一个虚拟 Key

curl http://localhost:8787/v1/chat/completions \
  -H "Authorization: Bearer onellm_sk_xxxx" \
  -H "x-onellm-provider: deepseek" \    # 想用哪个改这个
  -d '{"model": "deepseek-chat", "messages": [...]}'

想切换到通义?改 x-onellm-provider: dashscope。想切 GLM?改 x-onellm-provider: zhipu

同事离职?在后台吊销一个虚拟 Key。 不用去 DeepSeek、通义、智谱、豆包……各家后台轮换 Key。


网关支持哪些模型厂商

OneLLM 内置了 84 家模型厂商的适配器,核心国产模型覆盖:

厂商 provider 参数 代表模型
DeepSeek 深度求索 deepseek deepseek-chat, deepseek-reasoner
阿里通义千问 dashscope qwen3-max, qwen3-turbo
智谱 AI zhipu glm-4.6, glm-4-flash(免费)
月之暗面 Kimi moonshot moonshot-v2-128k
MiniMax 稀宇 minimax abab7.5(1M 上下文)
百度文心 baidu ernie-4.5, ernie-speed(免费)
字节豆包 bytedance doubao-pro-256k
科大讯飞星火 xunfei spark-v4.0
腾讯混元 tencent hunyuan-pro
百川智能 baichuan baichuan4
零一万物 lingyiwanwu yi-large(200K 上下文)
阶跃星辰 stepfun step-2
硅基流动 siliconflow 多模型代理(有免费额度)

加上 OpenAI、Anthropic、Google、Mistral 等国际厂商,总共 84 家,一个端点全搞定。


模型切换的底层是怎么工作的

你可能好奇,网关到底是怎么做到"一行代码切换模型"的。简单说一下:

1. 你的请求到达网关 :8787
2. onellmAuth 中间件提取你的虚拟 Key → 调 Admin API 验证
3. Admin API 返回:
   - 你的身份(user_id, workspace_id)
   - 你绑定的所有 Provider 的真实 Key(解密后)
   - 预算状态(正常/告警/限流/熔断)
4. requestValidator 根据你指定的 provider 参数,选择对应的真实 Key
5. 网关拿着真实 Key 去请求对应厂商的 API
6. 返回结果给你的应用

你拿到的响应,跟直接调厂商 API 完全一致——因为网关没有修改任何业务内容。

但与此同时,网关在背后做了:

  • 记录调用日志:谁、什么时候、用了哪个模型、多少 Token、花了多少钱
  • 预算检查:花费到 70% 发告警,到 85% 限速,到 100% 硬切断
  • 审计追踪:所有 Key 的创建、修改、吊销都被记录,不可篡改

一个真实场景:用脚本批量评测模型

假设你要评测同一个 prompt 在 5 个模型上的效果。没有网关的时候,你需要写 5 个不同的 API 调用脚本(或者一个脚本里 5 套配置)。

有网关后:

#!/bin/bash
# model_compare.sh —— 一行命令对比 5 个模型

PROMPT="请用 200 字介绍量子计算的基本原理"

for provider in deepseek dashscope zhipu moonshot baidu; do
  echo "========== $provider =========="
  curl -s http://localhost:8787/v1/chat/completions \
    -H "Authorization: Bearer onellm_sk_xxxx" \
    -H "Content-Type: application/json" \
    -H "x-onellm-provider: $provider" \
    -d "{\"model\": \"auto\", \"messages\": [{\"role\": \"user\", \"content\": \"$PROMPT\"}]}" \
    | jq -r '.choices[0].message.content'
  echo ""
done

跑一次,5 个模型的输出全出来。想加第六个模型?在 for 循环里加一个 provider 名,完事。

这就是网关的意义:把"接入模型"这件事从代码里剥离出来,变成基础设施。


现在就开始

git clone https://github.com/EmilyLi2026/OneLLM.git
cd OneLLM/gateway-core && npm install && npm run dev:node

三条命令,一分钟,你就能拥有自己的 LLM 网关。

开源、MIT 协议、不收费。如果觉得有用,去 GitHub 给个 ⭐ Star。

遇到问题?去 GitHub Issues 留言,我每天都会看。


聊聊?

如果你也在折腾多模型接入、被 API Key 管理折磨、或者想给团队的 AI 调用加上管控——欢迎直接联系我。
在这里插入图片描述

扫码添加,备注"OneLLM"。不一定秒回,但每条都会看。


下一篇预告:《为什么你的团队需要一个 LLM 网关——不只是代理,是控制平面》。点关注,不错过。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐