在多个模型供应商和编程客户端之间切换时,接口路径、鉴权方式与模型名称往往各不相同,稍有配置偏差就可能出现请求失败。通过统一的大模型网关,可以集中处理密钥分发、用量追踪和协议转换。下面将从地址填写规则入手,梳理常用客户端与配套 CLI 的接入、验证及排错要点。
目前我的网关服务(鉴权 用量追踪 sk虚拟分发 支持OpenAi和Anthropic标准化自动编程) 配套的CLI和web UI 操作功能已经可以正式投入使用(支持对话和任务模式)
本网关对外提供 OpenAI 兼容 的 /v1/* 接口,并内置 Anthropic ↔ OpenAI 方言翻译,因此 Claude Code、CC Switch、OpenCode 以及各类 OpenAI 客户端都能直接接入。
客户端按各自 SDK 的约定拼接请求路径,所以两种方言要填的地址不一样。下方每个客户端段落都标注了它属于哪一种:
网关地址http://192.168.5.34:9000复制
OpenAI 方言http://192.168.5.34:9000/v1复制
OpenCode / DeepSeek Harness / 各类 OpenAI SDK。地址必须带 /v1——这些 SDK 只会再拼 /chat/completions,漏了会返回 405。
Anthropic 方言http://192.168.5.34:9000复制
Claude Code / CC Switch。地址不要带 /v1——这些 SDK 会自己拼 /v1/messages。
健康检查curl http://192.168.5.34:9000/health测试
✓ 网关正常(默认上游可达)
sk- 密钥并绑定上游;普通用户由管理员分配,可在「对话测试」页选择自己的密钥查看。http://192.168.5.34:9000(OpenAI 兼容端点路径为 /v1,Anthropic 方言直接填根地址)。OpenAI 方言
任意支持 OpenAI 协议的客户端。把 base_url 指向 http://192.168.5.34:9000/v1(必须带 /v1:SDK 只会再拼 /chat/completions),api_key 填网关发放的 sk- 密钥即可。
复制
curl http://192.168.5.34:9000/v1/chat/completions
-H "Authorization: Bearer sk-你的密钥"
-H "Content-Type: application/json"
-d '{"model":"你的模型名","messages":[{"role":"user","content":"你好"}],"stream":true}'
Anthropic 方言
Claude Code 走 Anthropic 协议(请求路径 /v1/messages),网关会自动把请求翻译到绑定上游(OpenAI / Ollama / vLLM 等)。ANTHROPIC_BASE_URL 填网关根地址,不要带 /v1——SDK 会自己拼上。模型名填上游真实模型名即可。
复制
# 网关地址与鉴权(必需)
export ANTHROPIC_BASE_URL="http://192.168.5.34:9000"
export ANTHROPIC_AUTH_TOKEN="sk-你的密钥"
# 模型映射:Claude 模型名 → 上游真实模型名
export ANTHROPIC_MODEL="deepseek-v4-pro[1m]"
export ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek-v4-pro[1m]"
export ANTHROPIC_DEFAULT_OPUS_MODEL="deepseek-v4-pro[1m]"
export ANTHROPIC_DEFAULT_HAIKU_MODEL="deepseek-v4-flash"
# 关闭非必要流量上报
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC="1"
Anthropic 方言
CC Switch 可在多个供应商间一键切换。把网关作为 Anthropic 供应商添加:ANTHROPIC_BASE_URL 填网关根地址(不要带 /v1,环境变量同 Claude Code),即可在 Claude Code 等客户端里切换本地 / 云端模型。
复制
{
"env": {
"ANTHROPIC_BASE_URL": "http://192.168.5.34:9000",
"ANTHROPIC_AUTH_TOKEN": "sk-你的密钥",
"ANTHROPIC_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek-v4-pro[1m]",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek-v4-flash",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
}
}
复制
{
"env": {
"ANTHROPIC_BASE_URL": "http://192.168.5.34:9000",
"ANTHROPIC_AUTH_TOKEN": "sk-你的密钥",
"ANTHROPIC_MODEL": "qwen3:8b",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3:8b-nothink",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen3:8b-nothink",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "qwen3:8b-nothink",
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
}
}
OpenAI 方言
OpenCode 通过 OpenAI 兼容 Provider 指向网关,Provider 的 baseURL 填 http://192.168.5.34:9000/v1(必须带 /v1)。写好后运行 opencode auth login 选择 gateway 并粘贴 sk- 密钥(或设置 OPENAI_API_KEY 环境变量)。
复制
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"gateway": {
"npm": "@ai-sdk/openai-compatible",
"name": "LLM API Gateway",
"options": {
"baseURL": "http://192.168.5.34:9000/v1"
},
"models": {
"deepseek-v4-pro[1m]": { "name": "DeepSeek V4 Pro" }
}
}
}
}
OpenAI 方言
dsh 通过自定义 Provider 接入网关,走 OpenAI 方言:api 填 openai-completions,baseURL 填 http://192.168.5.34:9000/v1(必须带 /v1)。在 Web UI 右上角点「打开配置文件」,编辑 ~/.dsh/settings.yaml(Windows 为 C:Users<用户名>.dshsettings.yaml),加入下面两块即可。密钥不写进 yaml——apiKeyEnv 只是引用名,真实密钥用环境变量注入,这也符合网关「上游 Key 不外泄」的口径。
复制
llm-pi-ai:
providers:
{
llm-api-gateway:
{
displayName: llm-api-gateway,
apiKeyEnv: LLM_API_GATEWAY_API_KEY,
api: openai-completions,
baseURL: http://192.168.5.34:9000/v1,
models:
[
{ id: deepseek-v4-flash, name: deepseek-v4-flash },
{ id: deepseek-v4-pro, name: deepseek-v4-pro }
]
}
}
agent-default-model:
provider: llm-api-gateway
model: deepseek-v4-flash
复制
# 密钥用环境变量注入,不要写进 settings.yaml
export LLM_API_GATEWAY_API_KEY="sk-你的密钥"
npx @deepseek-ai/dsh web
看到 405 Method Not Allowed 就是 baseURL 漏了 /v1——请求会落到 /chat/completions 被静态页面接住;这种错法不会返回 401,别去查密钥。
OpenAI 方言Anthropic 方言
配套仓库 llm-api-gateway-cli 用于验证网关除 Web 页面外命令行同样可用。六种模式横跨两种方言,其中原生 Agent(模式六)是终端里干活的推荐方式——自带工具循环,无需安装 Claude Code。
.env 里的 GATEWAY_BASE_URL 填网关根地址(不要带 /v1)——脚本会按方言自己拼:OpenAI 模式的脚本补 /v1,Anthropic 模式的脚本直接用根地址。
复制
git clone https://github.com/boonya-hrgk/llm-api-gateway-cli.git
cd llm-api-gateway-cli
npm install
cp .env.example .env # 再按下面内容编辑 .env
复制
# .env —— 网关根地址(不要带 /v1,脚本会按方言自己拼)
GATEWAY_BASE_URL=http://192.168.5.34:9000
GATEWAY_KEY=sk-你的密钥
GATEWAY_MODEL=deepseek-v4-flash
| 模式 | 脚本 | 方言 | 走网关的端点 |
|---|---|---|---|
| 一 · OpenAI 兼容 | cli-openai.js | OpenAI | /v1/chat/completions |
| 二 · Anthropic 兼容 | cli-anthropic.js | Anthropic | /v1/messages |
| 三 · Claude Code | cli-claude-code.js | Anthropic | /v1/messages |
| 四 · 本地聊天 Web UI | server.js | OpenAI | /v1/chat/completions |
| 五 · 任务模式(真读写目录) | task-server.js | OpenAI | /v1/chat/completions + 工具调用 |
| 六 · 原生 Agent CLI(推荐) | cli-agent.js | OpenAI | /v1/chat/completions + 工具调用 |
复制
npm link # 装成全局命令,之后在任意目录可用
llm-api-gateway-cli # 模式六:原生 Agent 交互,当前目录即工作目录
llm-api-gateway-cli -p "总结这个项目" # 模式六:单轮任务(写入前会确认)
gateway-claude-code # 模式三:进入 Claude Code(需本机已装 claude)
gateway-web # 模式四:本地聊天页 http://127.0.0.1:3100
gateway-task # 模式五:任务模式 http://127.0.0.1:3101
用于确认网关与默认上游是否可达:
复制
curl -i http://192.168.5.34:9000/health
# 默认上游可达 → 200
# HTTP/1.1 200 OK
# {"status":"ok"}
# 默认上游连不上 → 502(注意:网关进程本身仍是好的)
# HTTP/1.1 502 Bad Gateway
# {"detail":"上游未就绪"}
注意:/health 只探测默认上游。它返回 502 的含义是「网关进程正常,但默认上游连不上」,不等于网关故障——你的密钥绑定的可能是另一个上游,照样能用。要确认自己那把密钥通不通,直接发一次真实请求最准。
另外两个探针:/health/live(进程存活)、/health/ready(数据库与可选 Redis 就绪)——未就绪时返回 503。 常见问题见下方「错误码速查」与项目 README 的「常见问题」章节。
网关自身的报错都是 {"detail": "..."} 结构(405 除外——那是请求路径没匹配上代理路由、由静态页面返回的)。上游自己的错误会原样透传,网关不改写状态码与响应体——所以看到 404 model not found 这类,是上游在报,不是网关。
| 状态码 | detail 文案 | 含义与处理 |
|---|---|---|
| 401 | 无效的 API Key | 不是网关发放的 sk- 密钥(例如填了上游真实 Key,或复制不完整) |
| 401 | API Key 已被吊销 | 密钥已吊销,换一把 |
| 401 | API Key 已过期 | 超过设置的过期时间,到「密钥管理」调整或换密钥 |
| 400 | 模型不可用:'xxx' 不在该密钥所绑定上游(…)的可用模型并集内 | 模型准入拦截;这条文案后面会直接列出当前可用的模型 |
| 400 | 请求体不是合法 JSON | 请求体格式错,检查 JSON |
| 400 | 上游为 Anthropic 方言(…),不支持 /v1/embeddings | 该密钥绑的上游是 Anthropic 方言,没有这个端点 |
| 429 | 请求过于频繁,请稍后再试 | 触发限流,按 Retry-After 秒数后重试 |
| 429 | token 配额已用尽(今日/本周/本月),将于配额周期重置后恢复 | 超 token 配额,同上 |
| 429 | 金额配额已用尽(今日/本周/本月),将于配额周期重置后恢复 | 超金额配额,同上 |
| 502 | 未找到可用的上游配置 | 密钥没绑定任何上游,到「密钥管理」绑定 |
| 502 | 上游请求失败,请稍后重试 | 网关连不上下游;真实原因在网关日志里(刻意不向前端暴露上游地址) |
| 405 | (无 JSON 请求体,返回纯文本) | base_url 漏了 /v1,见上方各客户端段落 |
带 429 的响应会附 Retry-After 响应头(单位:秒),照它等待后重试即可。被网关拦下的 401 / 400 / 429 请求不计入调用次数、也不产生费用——网关只对真正放行到上游的请求记账。