连接已经显示成功,但 Claude Code 仍然调用本机模型,或者 omniroute connect 一直超时。
最快的处理顺序是:先用健康检查和远程上下文确认服务端可达,再检查访问地址、令牌范围、反向代理和客户端配置;不要一开始就重装 OmniRoute,也不要为了排障关闭认证、开放全部端口。
先按时间表完成本周排障动作
第 1 个时间段:确认远程服务真的可用。检查进程、监听端口、健康端点、启动日志和持久化目录,证明请求已经抵达远程实例,而不是只证明某个进程存在。
第 2 个时间段:确认连接目标和权限。核对主机名、端口、HTTPS 路径、omniroute contexts 当前上下文,以及访问令牌是否属于 OmniRoute,而不是某个上游模型的 API Key。
第 3 个时间段:确认客户端和长连接。分别验证模型目录、只读命令、配置写入、实际模型调用和流式请求;修复后再测试服务器重启、令牌撤销和断线恢复。
这篇文章适合 3 类人:从笔记本连接远程 OmniRoute、需要定位连接或模型列表失败的个人开发者;让多个 AI 编程工具共用持续在线网关的团队;以及使用云端 Mac 作为远程执行端、必须验证重启和长任务恢复的开发者。
先排除“连上了,但其实连的是本机”
这是 Remote Mode 最容易误判的一类故障:终端显示 connect 成功,随后执行 models list 也没有明显报错,但模型目录、配置文件和调用日志仍然来自本机。官方文档说明,远程上下文会影响后续 CLI 命令;如果显式传入 --remote,则会覆盖当前上下文。setup-* 命令还会读取目标 OmniRoute 的实时模型目录,并把配置写到本地工具目录。(github.com)
识别信号:
- 远程服务器的请求日志没有新增记录;
- 本机关闭 OmniRoute 后,命令结果发生变化;
- 远程实例有模型 A,本机有模型 B,但客户端仍显示模型 B;
- 生成的 Claude Code、Codex 或其他工具配置中仍出现
localhost; contexts use切换后,模型列表没有变化。
取证命令:
omniroute contexts
omniroute contexts use <远程上下文名>
omniroute models list
omniroute setup-claude \
--remote https://<远程域名> \
--api-key '<OmniRoute访问令牌>' \
--dry-run
如果版本支持显式远程参数,优先用 --remote 进行一次对照测试;同时在远程服务器查看访问日志。不要根据界面上的实例名称判断请求路径,必须以远程日志、模型目录或请求时间戳作为证据。
处理结论:
- 远程日志没有请求:问题仍在地址、代理、令牌或客户端目标;
- 远程日志有请求但模型不一致:检查模型目录缓存、上下文切换和客户端生成配置;
- 远程日志与本机日志同时有请求:说明多个工具或环境变量仍在使用不同入口。
修复后验证:
关闭本机 OmniRoute,只保留远程实例运行;然后执行一次 models list 和一次最小模型调用。如果结果仍然可用,且远程日志出现对应请求,才能判定客户端真正指向远程。
按服务状态确认远程实例没有假在线
远程 AI 网关最常见的假象是“进程存在,但服务不可用”。例如进程卡在启动阶段、数据库目录不可写、端口只监听回环地址,或者重启后数据目录改变,都会让客户端看到超时、空模型或认证异常。
官方设置文档列出,OmniRoute 默认 API 与控制台使用 20128 端口,API 基础路径通常是 /v1;同时,doctor、status 和 logs 可用于无界面诊断。(github.com)
识别信号:
ps能看到进程,但本机访问健康端点失败;- 端口处于监听状态,却只绑定
127.0.0.1; - 重启后提供商、模型或令牌全部消失;
- 日志出现数据库锁、权限拒绝、环境变量解析失败或端口占用;
- 服务启动成功,但首次请求一直没有响应。
取证命令:
omniroute doctor --json
omniroute status
omniroute logs --follow
ss -lntp | grep '<端口>'
curl -i http://127.0.0.1:<端口>/
curl -i http://127.0.0.1:<端口>/v1/models
Mac 或部分系统没有 ss 时,可以改用:
lsof -nP -iTCP:<端口> -sTCP:LISTEN
处理结论:
先确认服务本身能够在远程主机本地响应,再处理公网或私网入口。若本机健康检查失败,继续修改防火墙和反向代理没有意义;若本机成功、外部失败,故障才进入网络层。
持久化目录也必须纳入检查。官方文档说明,DATA_DIR 用于保存数据库与配置;卸载程序并不必然等于删除数据,而完整卸载会永久清除配置、密钥和数据库。(github.com)
修复后验证:
记录以下 4 项证据:启动日志位置、健康端点响应、监听地址、数据目录。然后重启服务,再重复同一组检查。重启后如果模型、提供商和访问令牌状态保持一致,才说明远程实例具备可持续运行条件。
处理连接超时:分清网络不可达和应用无响应
当 omniroute connect 长时间没有响应时,不能直接归因于 OmniRoute 本身。需要从本地到远程主机逐层测试:域名解析、TCP 端口、HTTPS 握手、代理路径,最后才是应用认证。
dig +short <远程域名>
nc -vz <远程域名> <端口>
curl -vkI https://<远程域名>/
curl -vk https://<远程域名>/v1/models \
-H "Authorization: Bearer <OmniRoute访问令牌>"
识别信号:
- 域名没有解析结果:先修复 DNS;
- TCP 无法建立:检查安全组、防火墙、隧道和监听范围;
- TCP 成功但 HTTPS 卡住:检查证书、路径重写和反向代理;
/v1/models返回401或403:网络已通,进入令牌排查;- 返回
404:重点检查代理是否丢失了/v1或其他路径前缀。
处理结论:
远程入口应采用最小暴露原则:优先使用 HTTPS、私有网络、受控隧道或访问白名单,只暴露实际需要的 API 路径。不能用“关闭认证”“开放全部端口”或把管理界面直接暴露到公网作为修复办法。
如果是云端 Mac,尤其要确认系统睡眠、网络切换、登录会话和后台进程管理是否会中断网关。需要长期在线时,远程 Mac 的持续运行条件应单独验收,而不是只验证一次 SSH 能否登录;Vuncloud 的云端 Mac 使用说明可作为环境交付前的检查入口。
修复后验证:
在远程主机本地执行一次请求,在外部客户端执行一次相同请求,再比较两处日志。只有“本地成功、外部成功、远程日志可对应”同时成立,才能排除网络入口问题。
核对访问令牌:不要把上游 Key 当成远程凭据
OmniRoute 的远程 CLI 访问令牌与上游模型 Key 不是同一种凭据。官方 Remote Mode 文档将令牌分为 read、write 和 admin 等作用域;官方 API 文档也说明,不同管理接口会要求管理级认证。(github.com)
遇到远程令牌认证失败时,先不要重复生成所有密钥,而应核对 4 个事实:
- 令牌是否由远程 OmniRoute 创建,而非某个模型供应商后台生成;
- 请求头是否为
Authorization: Bearer <令牌>; - 令牌是否已撤销、过期或被服务器重启后的数据目录覆盖;
- 当前命令需要的权限是否超过令牌作用域。
取证命令:
omniroute contexts
omniroute tokens list
curl -i https://<远程域名>/v1/models \
-H "Authorization: Bearer <OmniRoute访问令牌>"
不要把真实令牌写进 shell 历史、截图、Git 仓库或共享配置文件。排障时可以使用占位符:
export OMNIROUTE_API_KEY='<OmniRoute访问令牌>'
权限验证应分层进行:
- 只读:列出模型、查看状态;
- 配置修改:写入客户端配置或更新网关设置;
- 模型调用:发送一个最小请求;
- 管理操作:仅由明确需要的管理员账户执行。
如果只读命令成功、配置修改失败,不要把它判断为网络故障,而应回退到令牌范围。修复后撤销旧令牌,再用新令牌重复只读、修改和模型调用,确认最小权限已经足够。
⚠️ 经验判断:令牌“能登录”不等于令牌“能完成任务”。远程团队至少应把查看状态、配置修改和管理操作分配给不同权限范围。
检查反向代理:路径、HTTPS 和流式连接要一起看
反向代理后,Claude Code 无法连接时,常见原因不是证书本身,而是代理只转发了首页,没有完整转发 /v1、模型列表和流式请求路径。
可以先绕过代理,在远程主机本地请求;若本地成功,再用外部 HTTPS 地址请求同一个 API 路径。两次请求的状态码、响应头和远程日志必须逐项对照。
需要检查:
- 上游地址是否指向实际 API 端口;
/v1是否被错误重写或重复拼接;- HTTPS 终止后,后端是否仍生成正确的外部地址;
- SSE 或分块响应是否被代理缓存;
- 代理的读取超时和空闲连接设置是否覆盖长任务;
- WebSocket 或其他升级请求是否需要单独转发。
官方设置文档给出的当前参考值包括:REQUEST_TIMEOUT_MS 默认 600000 毫秒,STREAM_IDLE_TIMEOUT_MS 默认继承该值,TCP 连接超时 FETCH_CONNECT_TIMEOUT_MS 默认 30000 毫秒,API Bridge 的 Keep-Alive 超时为 5000 毫秒;这些是 OmniRoute 当前文档参数,不应被当成所有代理的通用配置。(github.com)
修复后验证:
先测试非流式模型列表,再测试短流式请求,最后测试超过普通响应时间的长任务。若只有长任务中断,优先比较 OmniRoute、反向代理和客户端三层的超时设置,而不是重新生成令牌。
用决策条件选择下一步,而不是反复重装
- 若远程主机本地健康检查失败,选择“服务状态与数据目录排查”;不要先改客户端。
- 若本地成功、外部 TCP 失败,选择“防火墙、隧道、监听地址排查”;不要开放全部端口。
- 若 TCP 成功、API 返回
401或403,选择“令牌来源与权限范围排查”;不要混用上游模型 Key。 - 若远程日志没有请求、但本地模型可用,选择“上下文和客户端配置排查”;不要相信界面显示名称。
- 若模型列表成功、长任务中断,选择“HTTPS、SSE、代理空闲连接和流式超时排查”;不要只增加客户端重试次数。
- 若重启后配置消失,选择“持久化目录和服务启动方式排查”;不要把每次重启都当作新的连接问题。
用两张表完成修复后的远程验收
下面的验收矩阵适合个人开发者,也适合团队把故障交接给其他维护人员。表中的端口和超时参数仅对应当前官方文档记录,部署版本变化时应重新执行 omniroute --help 并对照官方 Wiki。(github.com)
| 验收项目 | 操作 | 合格证据 | 不合格时回退 |
|---|---|---|---|
| 服务状态 | 运行 doctor、查看启动日志 |
健康检查成功,日志无启动错误 | 服务进程、数据目录、环境变量 |
| 远程地址 | 本地执行 DNS、TCP、HTTPS 测试 | 外部请求抵达远程日志 | 域名、防火墙、隧道、代理 |
| 访问令牌 | 用只读令牌请求模型目录 | 返回远程模型,状态码正常 | 令牌来源、状态、作用域 |
| 客户端目标 | 执行 contexts 与 setup-claude --dry-run |
配置指向远程地址,不含本机入口 | 上下文、环境变量、生成文件 |
| 模型调用 | 发起一次最小请求 | 远程日志出现对应模型调用 | 模型 ID、上游连接、权限 |
| 长任务 | 执行流式请求并观察连接 | 流式响应未被代理截断 | SSE、代理超时、空闲连接 |
| 重启恢复 | 重启远程服务后重复测试 | 模型、令牌和配置保持可用 | 持久化目录、启动服务、密钥存储 |
不同使用场景的入口选择也可以按下面的条件处理:
| 当前条件 | 优先方案 | 不建议的做法 |
|---|---|---|
| 只有本地网络可访问 | HTTPS、私有网络或受控隧道 | 临时开放全部端口 |
| 单人笔记本连接 | 一个只读或任务所需的最小权限令牌 | 把管理员令牌复制到多个工具 |
| 团队共享网关 | 按成员或工具分配作用域令牌 | 所有人共用同一个管理员凭据 |
| Claude Code 连接成功但模型为空 | 显式 --remote,重新读取远程模型目录 |
只修改本机模型名称 |
| 长任务频繁中断 | 对齐 OmniRoute 与代理的流式超时 | 无限增加客户端重试 |
| 远程 Mac 经常离线 | 先验收持续运行、重启和网络恢复 | 把一次成功连接当成长期可用 |
记录故障层、证据位置和接管方式
排障结束后,至少留下 4 项记录:
- 故障层:服务、网络、认证、客户端、代理或流式请求;
- 修复动作:修改了哪个地址、令牌、配置或服务参数;
- 证据位置:启动日志、远程访问日志、模型目录响应或配置文件;
- 复发接管方式:由谁执行重启、令牌撤销、代理恢复和客户端重新绑定。
如果远程 OmniRoute 重启后客户端无法恢复,应先确认服务端健康、数据目录未改变,再切换远程 context,最后重新生成客户端配置。官方 CLI 集成文档显示,setup-claude 等命令可以从远程模型目录生成本地配置,也支持 --dry-run 预览写入内容。(github.com)
当问题最终被定位为本机关闭、网络入口不稳定,或共享环境没有持续运行能力时,继续把 OmniRoute 放在个人电脑上并不是长期稳妥的方案:本机会睡眠或断网,团队无法统一接管,重启后的配置和日志也更难集中管理。此时,租用 Vuncloud 的远程 Mac 可以把持续在线、重启恢复和团队交付验收放到同一套环境中;如果需要比较不同地区的云端 Mac 方案,可进一步查看 云端 Mac 租用方案。不过,长期固定重负载、必须接入本地物理设备,或已经拥有稳定机房环境的团队,仍应先评估自购设备和本地部署是否更合适。
为远程开发准备一台稳定的 Mac
使用 Vuncloud Mac 云租用,快速获得独立远程 Mac 环境,减少本地设备与网络配置带来的连接障碍。
支持远程桌面操作,适合开发、测试及需要持续运行命令行服务的工作场景。