最后更新于 2026 年 8 月 12 日,命令与 endpoint 已核对 OmniRoute 当前默认分支、release 文档、Cursor 官方文档及 Anthropic 网关文档。
症状: 你把 http://localhost:20128/v1 同时填进 Cursor 和 Claude Code,结果一端报鉴权错误,另一端模型列表为空。
最快解法: 保留同一个 OmniRoute 实例,但不要复用完全相同的 URL;Claude Code 使用不带 /v1 的网关根地址,Cursor 则先区分桌面端、Cursor CLI 和 MCP,再选择兼容入口。
这篇文章适合同时使用 Cursor 与 Claude Code、想统一维护模型凭据和路由规则的个人开发者,也适合需要持续运行 AI Gateway 的 Agent 工程师,以及正在设计多 provider 容错和权限隔离的小团队负责人。
同一网关,不同入口
典型失败配置是这样:
Cursor: http://localhost:20128/v1
Claude Code: http://localhost:20128/v1
问题不在于 OmniRoute 不能同时服务两个客户端,而在于两个客户端使用的协议入口不同。OmniRoute 可以作为统一网关,把多个 provider 接到同一个服务实例;但客户端是否使用 OpenAI 兼容路径、Anthropic Messages 路径,取决于客户端自身的配置方式。
请求链路应该理解为:
Cursor 桌面端或 Cursor CLI
│
├─ 兼容入口 /v1,或客户端支持的自定义 endpoint
│
▼
OmniRoute:http://主机:20128
│
├─ Provider A
├─ Provider B
└─ Provider C
Claude Code 的链路不同:
Claude Code
│
└─ ANTHROPIC_BASE_URL=http://主机:20128
│
└─ 客户端继续请求网关下的 Anthropic Messages 路径
OmniRoute 的 CLI 配置文档明确把 Claude Code 的 ANTHROPIC_BASE_URL 定义为网关根地址,并注明不要添加 /v1;Anthropic 的网关说明也采用统一 endpoint,而不是把 OpenAI 兼容路径机械套到 Claude Code 上。(github.com)
这里有 3 个容易被忽略的限制:
- 路径限制:
/v1适合 OpenAI 兼容请求,不等于所有客户端都接受它。 - 协议限制: Claude Code 依赖 Anthropic Messages API 的请求格式,不只是修改一个 URL。
- 功能限制: Cursor 自定义 API key 只覆盖标准聊天模型,Tab Completion 等专用功能仍可能使用 Cursor 自身模型。(docs.cursor.com)
因此,“共用一个网关实例”是正确目标,“两个客户端填完全相同 URL”不是正确配置方法。
最小可用闭环
先不要同时调 Cursor、Claude Code、MCP 和远程访问。按照下面的顺序,把 OmniRoute 单独验收,再接客户端。
1.安装并启动网关
按 OmniRoute 当前快速开始文档,最小安装方式是:
npm install -g omniroute
omniroute
默认控制台位于:
http://localhost:20128
OpenAI 兼容 API 位于:
http://localhost:20128/v1
官方快速开始同时给出了 /v1/models 的验证方式,并要求先在控制台连接至少一个 provider。(github.com)
如果你更偏向服务常驻,也可以使用 Docker:
docker run -d \
--name omniroute \
--restart unless-stopped \
-p 127.0.0.1:20128:20128 \
-v omniroute-data:/app/data \
diegosouzapw/omniroute:latest
本地绑定 127.0.0.1 的好处是默认不暴露到局域网;代价是其他设备无法直接访问。远程 Mac 场景不能照抄这个绑定方式,必须改为受控的可达地址,并配合防火墙、HTTPS 或 Tailnet。
2.创建推理 API key
在 OmniRoute 控制台创建用于推理请求的 API key。不要把管理 token 和推理 key 混在一起:
- 推理 key:用于
/v1/models、聊天请求等 API 调用。 - 远程管理 token:用于 CLI 连接、读取配置和执行管理操作。
- 客户端密钥:只给需要调用模型的 Cursor 或 Claude Code 使用。
远程模式文档说明,管理 token 与推理 API key 是两套不同凭据;远程 token 还可以按 read、write、admin 进行权限区分。(github.com)
3.读取模型目录
先验证网关确实能看到模型:
curl http://localhost:20128/v1/models \
-H "Authorization: Bearer YOUR_INFERENCE_KEY"
如果返回空目录,不要急着改 Cursor 配置。优先检查:
- provider 是否完成连接;
- provider 的 key 是否过期;
- 模型是否被禁用;
- OmniRoute 是否启动的是你刚刚配置的实例;
- API key 是否属于当前实例。
控制台页面能打开,只能证明前端端口可访问,不能证明推理 API、模型目录和 provider 都正常。
4.发送最小对话请求
使用一个明确存在的模型 ID,或者先用项目支持的 auto 路由:
curl http://localhost:20128/v1/chat/completions \
-H "Authorization: Bearer YOUR_INFERENCE_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "auto",
"messages": [
{
"role": "user",
"content": "只返回:gateway-ok"
}
]
}'
验收标准不是“返回了一个网页”,而是同时满足:
✅ /v1/models 能返回模型目录;
✅ /v1/chat/completions 能返回有效响应;
✅ 响应中能确认实际使用的模型或 provider;
✅ 更换模型选择后,请求仍然经过同一个 OmniRoute 实例。
Claude Code 的根地址规则
主流程:直接让 Claude Code 读取环境变量
Claude Code 配置 OmniRoute 时,关键变量如下:
export ANTHROPIC_BASE_URL="http://localhost:20128"
export ANTHROPIC_AUTH_TOKEN="YOUR_INFERENCE_KEY"
export ANTHROPIC_MODEL="YOUR_MODEL_ID"
claude
注意第一行没有 /v1。OmniRoute 的 Claude Code 配置说明指出,Claude Code 会在网关根地址后继续拼接自己的 Messages API 路径;如果你写成 http://localhost:20128/v1,最终路径可能会多出一层 /v1,从而出现 404、鉴权失败或网关完全没有请求记录。(github.com)
Anthropic 官方网关文档也使用 ANTHROPIC_BASE_URL=https://gateway.example.com 这种根地址形式,并把统一入口与 fallback、负载均衡联系起来。(docs.anthropic.com)
变量修改后必须重新启动 Claude Code。环境变量通常在进程启动时读取,已经打开的终端会话不会自动刷新。
⚠️ 如果你用
settings.json保存环境变量,密钥不要提交到 Git 仓库。团队环境应使用每个开发者独立的推理 key,并通过网关日志追踪调用来源。
OmniRoute 还提供自动配置路径,例如:
omniroute setup-claude
omniroute launch
也可以按模型生成 profile:
omniroute setup-claude --only YOUR_PROVIDER
omniroute launch --profile YOUR_PROFILE
自动配置适合你希望减少手工字段错误的情况;手动环境变量更适合临时测试和远程脚本。本文建议先采用手动主流程,确认根地址、认证和模型都正常后,再切换到自动 profile。
模型列表为空时的处理
Claude Code 的模型发现并不等于 OmniRoute 的完整模型目录。项目文档说明,原生 /model 选择器只会显示符合其发现规则的模型;非 Claude 命名的模型可能不会自动出现。此时可以显式指定:
export ANTHROPIC_MODEL="provider/model-id"
claude
如果你需要排查模型发现,再根据当前 Claude Code 版本和 OmniRoute 文档启用相应的 gateway discovery 变量。不要自行添加上下文窗口数字,也不要把某个模型的输出上限当成所有 provider 的统一能力。
Cursor 桌面端、CLI 与 MCP
配置差异
Cursor 不是单一路径。至少要拆成下面 3 类:
| 接入方式 | endpoint 能力 | 适合做什么 | 主要限制 |
|---|---|---|---|
| Cursor 桌面端 | 通过设置页配置 provider 与 API key | 标准聊天模型 | 专用功能可能继续使用 Cursor 自身模型 |
| Cursor CLI | 支持 --endpoint 等 CLI 参数 |
脚本、远程终端、自动化任务 | 只覆盖 CLI 支持的功能 |
| MCP | 配置工具服务器地址 | 调用外部工具与工作流 | MCP 地址不是模型推理 endpoint |
Cursor 官方文档明确说明,自定义 API key 只适用于标准聊天模型,专用模型功能不会全部改走你的 provider。(docs.cursor.com) Cursor CLI 文档则提供了 --endpoint、CURSOR_API_KEY 和登录状态检查等能力。(docs.cursor.com)
所以,不要把 MCP 的 URL 填到模型设置里,也不要假设 Cursor 桌面端的每一次补全、Tab Completion 或后台 Agent 请求都会经过 OmniRoute。
排查顺序
遇到 Cursor 验证失败,按这个顺序走:
- 确认你使用的是桌面端还是
cursor-agentCLI。 - 桌面端先检查 provider 类型、API key 和模型名称。
- CLI 先运行
cursor-agent status,确认认证状态和 endpoint。 - CLI 临时指定 endpoint,避免旧配置干扰:
export CURSOR_API_KEY="YOUR_INFERENCE_KEY"
cursor-agent \
--endpoint "http://localhost:20128/v1" \
"只返回:cursor-ok"
- 在 OmniRoute 日志中确认确实出现请求。
- 最后再测试工具调用、补全和 MCP,不要把它们混在第一次验证中。
OmniRoute 的 CLI 集成文档对 Cursor 的处理方式是输出应用内配置步骤,而不是替桌面端写入完整配置文件;这是因为 Cursor 桌面端配置并非普通的公开文本配置。
fallback 不生效的原因
模型能调用,不代表多模型 fallback 已经生效。最常见的错误是只接入了一个 provider,然后把 auto 当成了备用链。
至少要准备两个可用目标:
首选:provider-a/model-a
备用:provider-b/model-b
三种模式要分开理解:
- 单模型直连: 请求固定发给一个模型,额度耗尽后只能失败。
- 自动路由: OmniRoute 根据当前可用性、额度、延迟或策略选择目标。
- 自定义 fallback 链: 你明确规定首选和后备顺序,故障时切换到下一个目标。
项目仓库把 quota、健康状态、成本、延迟和成功率列为自动路由参考因素,并提供 priority、headroom、reset-aware 等策略。这里的策略能力属于项目文档说明,不应当写成独立第三方性能结论。(github.com)
可重复的故障演练
按以下步骤验证,而不是等真实额度耗尽:
- 连接 provider-a 和 provider-b。
- 固定首选模型或 combo 顺序。
- 暂时撤销 provider-a 的 key,或让该 provider 返回可识别的失败。
- 发送同一个最小请求。
- 检查 OmniRoute 路由日志。
- 确认最终响应来自 provider-b。
- 恢复 provider-a,再重复一次,确认不会永久卡在备用目标。
成功标准包括 3 项:
✅ 日志显示首选目标失败;
✅ 路由决策显示切换动作;
✅ 最终响应的模型或 provider 标识发生变化。
经验判断:如果日志里根本没有第二次尝试,问题通常不是“额度不够”,而是你使用了单模型直连、fallback 链没有保存,或者两个目标实际指向同一个 provider 账户。
远程 Mac 的访问边界
本机测试时,localhost 最简单。Cursor、Claude Code 和 OmniRoute 在同一台 Mac 上,回环地址不会经过局域网,也不需要额外开放端口。
远程 Mac 则必须改成客户端可达的地址:
export ANTHROPIC_BASE_URL="https://mac-gateway.example.com"
Cursor CLI:
cursor-agent \
--endpoint "https://mac-gateway.example.com/v1" \
"检查远程网关"
远程部署至少要处理 4 个问题:
- 网络可达: 客户端能否访问远程 Mac 的监听地址。
- 访问范围: 不要把管理控制台和推理 API 无限制暴露到公网。
- 凭据隔离: 推理 key、管理 token、provider key 分开保存。
- 自动恢复: Mac 重启、OmniRoute 重启或网络短暂中断后,服务能否自动拉起。
OmniRoute 远程模式支持通过 omniroute connect 连接另一台机器,并使用受限访问 token;官方文档建议优先采用 HTTPS 或 Tailnet,而不是直接裸露一个 HTTP 主机地址。(github.com)
双工具交付验收
完成部署后,不要只验收“能不能发一句话”。你可以按下面的决策条件选择部署方式:
- 若只是个人短时测试,且 Mac 不会休眠: 先在本机运行 OmniRoute。
- 若需要跨设备访问: 把 OmniRoute 迁移到持续在线的远程 Mac。
- 若 Cursor 与 Claude Code 要共享同一组路由规则: provider 和 fallback 放在网关侧,不要分别在客户端维护两套。
- 若团队成员需要不同权限: 每人使用独立推理 key,管理操作使用受限 token。
- 若需要 MCP 工具: 单独验收 MCP 服务,不要用 MCP 连通性证明模型 endpoint 正常。
- 若 fallback 没有完成一次真实切换: 暂时不要把环境交付给团队,回退到单 provider 的显式模型配置。
最终验收表可以这样执行:
| 验收项 | 通过标准 |
|---|---|
| OmniRoute 服务 | 控制台可访问,API 端口持续监听 |
| 模型目录 | /v1/models 返回已连接模型 |
| Cursor 桌面端 | 标准聊天模型完成一次验证 |
| Cursor CLI | --endpoint 请求进入网关日志 |
| Claude Code | 根地址不带 /v1,最小任务成功 |
| 模型切换 | 显式指定第二个模型后请求成功 |
| fallback | 首选失败后出现第二目标请求 |
| 长任务 | 多轮任务不中途丢失连接 |
| 密钥权限 | 客户端不能执行不必要的管理操作 |
| 重启恢复 | 网关重启后客户端可重新连接 |
当前方案如果是“每个客户端单独配置 provider”,真实缺点通常是凭据重复、fallback 规则不一致、额度耗尽后难以追踪,而且本地 Mac 休眠或网络变化会直接中断长任务。对短时实验来说,本地运行最省步骤;但需要持续在线、跨设备调用或团队共享时,受控的远程 Mac 更适合作为 OmniRoute 和编码 Agent 的常驻环境。
如果你已经完成本地双工具验证,下一步应根据在线时长、跨设备访问和团队权限需求评估远程部署,而不是继续给两个客户端复制同一条 URL。你可以先查看 MacHTML 的帮助中心 了解远程环境交付方式;如果本地设备经常休眠、网络变化频繁,再结合 MacHTML 的美国节点方案 判断是否需要一台持续在线的云端 Mac。
延伸阅读: AI 编程工具算力对比:了解不同客户端与终端智能体的内存占用和云端部署取舍 模型故障转移与供应商路由:设计主备模型、限流重试和降级演练
用 MacHTML 快速部署多模型开发环境
需要运行 OmniRoute、Cursor 或 Claude Code 时,MacHTML 提供开通即用的远程 Mac 环境。 通过远程桌面与控制台完成依赖安装、网关配置和故障演练,减少本地环境折腾。 按需选择远程 Mac 配置与使用时长,以更灵活的成本满足开发、测试和持续运行需求。 现在开通 MacHTML,快速获得可远程交付的 Mac 环境,让多模型网关部署更高效。