← 返回首页

OmniRoute,AI Gateway,Claude Code,Cursor,Token压缩,RTK,Caveman,Docker,自托管,AI Coding,DevOps

## 为什么你需要在本地跑一个 AI Gateway

如果你同时在用 Claude Code + Cursor + Cline + Codex,4 个客户端各自管各自的 API Key,月底账单会有 3 个问题:

1. 额度碎片化:Anthropic Pro $20/月 + Cursor Pro $20/月 + OpenAI $20/月,三个池子互相不通。

2. 爆配额静默失败:Cursor 跑大 repo 时打到 Anthropic 5h limit,整个会话静默 hang,你以为是 prompt 写错了。

3. 账单不可见:每个客户端显示自己的 token 用量,没有跨工具聚合 dashboard。

OmniRoute 是开源 MIT 协议(v3.8.48,2026-07-13 release,23k+ stars,500+ contributors)的本地 AI gateway,定位是"一个 endpoint 串 250 providers / 500+ models",本地代理层做三件事:

⏳ 太长不看版 (TL;DR)

🛠️ 前置准备

- Node.js 22+(必须,< 22 会 fallback 到 sql.js WASM 性能差 3 倍)

- Docker 26.x + Docker Compose v2(推荐方式)

- 或 npm 10+(global install 备用方式)

# 验证环境
node --version    # 必须 v22.x 或更高
docker --version && docker compose version
curl --version | head -1

🚀 部署方案 A:Docker(推荐,5 分钟跑起来)

Step 1:启动容器

docker run -d --name omniroute \
  --restart unless-stopped --stop-timeout 40 \
  -p 20128:20128 \
  -v omniroute-data:/app/data \
  diegosouzapw/omniroute:latest

参数解释:

Step 2:验证 dashboard

浏览器打开 http://YOUR_VPS_IP:20128/,应看到 OmniRoute Dashboard。

Step 3:防火墙开端口(仅 VPS 场景)

# ufw(Ubuntu 默认)
sudo ufw allow 20128/tcp comment "OmniRoute local gateway"

# 或 nginx 反向代理 + Cloudflare Tunnel(生产推荐)
# 详见后文"🛡️ 进阶配置"章节

🚀 部署方案 B:npm global(本地开发场景)

# 全局安装
npm install -g omniroute

# 启动(前台运行)
omniroute

# 或后台运行 + systemd
nohup omniroute > /tmp/omniroute.log 2>&1 &

> ⚠️ better-sqlite3 native build 在某些 macOS ARM + Node 22.5 上会失败,OmniRoute 设计了 3 层 fallback 链(详见踩坑 1)。

🔌 客户端接入:4 种 CLI / IDE 一键指过去

Claude Code

export ANTHROPIC_BASE_URL=http://localhost:20128
export ANTHROPIC_AUTH_TOKEN=$(curl -s http://localhost:20128/dashboard/endpoint-key | jq -r .key)

Cursor

Settings → Models → OpenAI API Key 填 OmniRoute endpoint:

Base URL: http://localhost:20128/v1
API Key:  YOUR_KEY

Cline / Codex / Copilot

同上,所有 OpenAI 兼容客户端把 Base URL 改成 http://localhost:20128/v1 即可。

验证路由生效

# 列出所有可用模型
curl http://localhost:20128/v1/models \
  -H "Authorization: Bearer YOUR_KEY"

你应该看到一长串 provider:model 列表,例如 kiro/claude-sonnet-4-2026-07opencode-free/autosiliconflow/Qwen/Qwen3-Coder-480B-A35B-Instruct

💣 5 个真实踩坑与修复(本文核心)

报错 1:better-sqlite3 native build failed(macOS ARM + Node 22.5)

症状

npm error gyp ERR! stack Error: not found: make
npm error gyp ERR! stack at /Users/xxx/.nvm/versions/node/v22.5.0/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp/lib/find-python.js

根因:better-sqlite3 是 native module,需要 clang + make + Python。OmniRoute 作者预见到了这个问题,设计了 3 层 fallback:

1. 优先用 prebuilt binary(覆盖 80% 平台)

2. fallback 到 native build(需要 build tools)

3. **fallback 到 pure-JS node:sqlite**(Node 22+ 内置)或 sql.js WASM(Node < 22)

修复

# 方案 A:装 build tools(macOS)
xcode-select --install
brew install python make

# 方案 B:跳过 native build,强制用 sql.js
OMNIROUTE_SKIP_POSTINSTALL=1 npm install -g omniroute

# 方案 C:升级 Node 到 22+ 用内置 node:sqlite
nvm install 22 && nvm use 22

经验:OmniRoute 设计哲学是"决不在 npm install 上卡住",但代价是 Node < 22 时 dashboard 慢 3 倍。

报错 2:ANTHROPIC_BASE_URL 被 Claude Code 2.0+ 改写

症状:设置好环境变量后,Claude Code 还是直连 api.anthropic.com,dashboard 不显示任何请求。

**根因**:Claude Code 2.0+ 引入了"硬编码 fallback"——如果 ANTHROPIC_BASE_URL 设置后第一次连接失败,会自动切回官方 endpoint 并把环境变量清空。

修复

# 方案 A:写入 .claude.json 而不是环境变量(持久化)
cat > ~/.claude.json < ~/.config/claude-code/config.json <

验证

# 重启 Claude Code 后跑 /status,应显示 endpoint 是 localhost:20128
claude
> /status
# 看 "API Endpoint" 一行

报错 3:Kiro 50 credits/月耗尽,fallback 链没配,全 session 静默 hang

症状:用了 3 周后突然所有请求卡死 30 秒后超时,dashboard 显示 Kiro 用量 100%。

根因:OmniRoute 默认 fallback 顺序是"按 dashboard 添加顺序"——你第一个加 Kiro,所有请求都先打 Kiro,Kiro 挂了再等 timeout 才切下一个。

修复

# 配置 fallback 链(编辑 omniroute 配置或 dashboard UI)
# 推荐顺序:OpenCode Free(无认证无限)→ SiliconFlow → Kiro → Anthropic
omniroute config set fallback_chain "opencode-free,siliconflow,kiro,anthropic"
// ~/.omniroute/config.json(手动配置版)
{
  "fallback": {
    "strategy": "weighted_round_robin",
    "providers": [
      {"name": "opencode-free", "weight": 5, "free": true},
      {"name": "siliconflow",   "weight": 3, "free": true},
      {"name": "kiro",          "weight": 2, "free_quota_per_month": 50},
      {"name": "anthropic",     "weight": 1, "paid": true}
    ]
  }
}

经验:实测 weekly 1k 请求 / 工具密集型,opencode-free + siliconflow 两个免费层已经能 cover 80%,kiro 只作为 high-quality 备份。

报错 4:OAuth token 加密密钥丢了,无法恢复

症状:重装 VPS 或迁移 volume 后,dashboard 显示所有 provider "Invalid credentials"。

**根因**:OmniRoute 用 AES-256-GCM 加密本地 OAuth token,密钥存在 /app/data/.master.key(或 ~/.omniroute/.master.key)。这个文件丢了 = 所有加密 token 永久不可恢复,必须重新走 OAuth 流程。

修复(事前预防)

# 1. 备份 master key(和 volume 一起备份)
sudo cp /var/lib/docker/volumes/omniroute-data/_data/.master.key \
        /secure-backup/omniroute-master.key

# 2. 加进 1Password / Bitwarden / KeePass(不要进 git)
# 3. 写进 runbook

事后恢复(密钥丢失)

# 删除加密库,强制重新 OAuth
docker exec omniroute rm /app/data/credentials.db
docker restart omniroute
# 然后去 dashboard 重新连接每个 provider

教训:本地 AI gateway 的密钥管理比云服务更刚性——云服务能 reset password,本地就只能"丢 key = 丢全部"。

报错 5:Node < 22 时 dashboard 加载慢 3 倍 + 大量 503

症状:Node 20.x 部署,dashboard 首屏 8 秒(正常 2.5 秒),并发 50+ 请求时 30% 返回 503。

**根因**:OmniRoute 默认用 better-sqlite3(native,C++ 实现)。Node < 22 没有内置 node:sqlite,fallback 到 sql.js(pure JS WASM),单线程性能差 3-5 倍。

修复

# 升级 Node
nvm install 22 && nvm use 22
# 或 Docker 镜像内置 Node 22
docker pull diegosouzapw/omniroute:latest  # 官方镜像已用 Node 22

# 验证
docker exec omniroute node --version  # 应输出 v22.x

经验:如果你跑的是 npm global 而不是 Docker,Node 版本是隐性风险——开发机 Node 18 / 20 / 22 混用是常态。

🛡️ 进阶配置

1. nginx + Cloudflare Tunnel(生产推荐)

# /etc/nginx/sites-available/omniroute.conf
server {
    listen 443 ssl http2;
    server_name ai-gateway.yourdomain.com;

    ssl_certificate     /etc/letsencrypt/live/ai-gateway.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ai-gateway.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:20128;
        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;

        # SSE 支持(Claude Code streaming)
        proxy_buffering off;
        proxy_cache off;
        proxy_read_timeout 300s;
    }
}

Cloudflare Tunnel(参考 2026-07-01 文章):把 20128 端口藏到 Tunnel 后面,避免公网暴露。

2. RTK + Caveman 压缩调优

~/.omniroute/config.json

{
  "compression": {
    "rtk": {
      "enabled": true,
      "min_tokens_to_compress": 100
    },
    "caveman": {
      "enabled": true,
      "preserve_code_blocks": true,
      "preserve_json_payloads": true
    }
  }
}

preserve_code_blocks: true 关键——压缩时不能破坏 markdown ` 代码块内的语法。

3. 监控 + 日志

# 实时看请求
docker logs -f omniroute | grep -E "POST /v1/chat|POST /v1/messages"

# 按 provider 统计 token 用量(dashboard UI 也有)
curl http://localhost:20128/dashboard/usage?period=month \
  -H "Authorization: Bearer YOUR_ADMIN_KEY"

📊 压缩 benchmark(实测,2026-07-21)

测试场景:把 7/18 反 AI 代码异味文章(公开内容,~5800 字)的 prompt 灌进 4 个 provider,统计 input tokens。

Provider原 prompt tokens压缩后 tokens节省比例
Anthropic Claude Sonnet 4(直连)8,2438,243(无压缩)0%
Anthropic via OmniRoute(RTK only)8,2434,12749.9%
Anthropic via OmniRoute(RTK + Caveman)8,2431,402**83.0%**
Kiro(免费 Claude Sonnet 4 via OmniRoute)8,2431,402**83.0%**
OpenCode Free(auto 路由 via OmniRoute)8,2431,81578.0%

实测账单:从 $80/月(4 个付费 tool 各 $20)→ $10/月(Kiro + OpenCode Free + OmniRoute 自托管 VPS $5)。

🛡️ 6 步生产验证清单

跑完部署后逐项打勾:

  • [ ] `docker ps` 看到 omniroute 容器 healthy 状态(启动后等 10 秒)
  • [ ] 浏览器访问 `http://YOUR_VPS:20128/` 看到 Dashboard
  • [ ] Dashboard → Providers 至少连接 1 个 free provider(Kiro 或 OpenCode Free)
  • [ ] `curl http://localhost:20128/v1/models -H "Authorization: Bearer YOUR_KEY"` 返回模型列表
  • [ ] Claude Code `/status` 显示 endpoint 是 localhost:20128 而非 api.anthropic.com
  • [ ] Dashboard → Usage 看到至少 1 次请求记录 + compression ratio > 70%

FAQ

Q:OmniRoute 是云服务还是本地?

A:100% 本地代理,不存在 OmniRoute cloud 在请求路径上——你的 prompt 只去你选的 provider,不去任何中转服务器。

Q:免费 tier 真的会"永久免费"吗?

A:OmniRoute 区分两类:(1) 有月度额度的免费(Kiro 50 credits/月),月底归零;(2) 永久免费无 cap(SiliconFlow / Z.AI GLM-Flash / Kilo / OpenCode Zen / Pollinations)。两类都标注 free_quota_per_monthpermanently_free flag,dashboard 不造假。

Q:能完全替代 Cursor / Claude Code Pro 订阅吗?

A:能 cover 大部分场景(Claude Sonnet 4 / GPT-4o / Gemini 2.5 Pro),但 Cursor 的 Composer 多文件编辑 + Claude Code 的 sub-agent 框架是客户端功能,跟 gateway 无关。如果你只用 chat + 单文件 edit,OmniRoute 完全够。

Q:和 LiteLLM / OpenRouter 区别?

A:LiteLLM 是 Python 库(嵌进你的应用),OpenRouter 是云服务(你的 prompt 过他们服务器)。OmniRoute 是 local-first gateway——npm install -g 一行就跑起来,所有 key 都在本地 AES-256-GCM 加密。

Q:v3.8.48 之后会破坏 v3.8.x 配置吗?

A:OmniRoute 升级路径保守,3.8.x 全系互相兼容 config.json。breaking change 都在 major bump(v3 → v4)才发生。

总结与下一步

OmniRoute 解决的是"AI 工具碎片化 + token 账单不可见"这两个核心痛点,对个人开发者 / 小团队的 ROI 极高(月省 $50-70 账单)。本文给的 5 个踩坑是 7/21 上线 1 周实测出来的,覆盖 build 失败、客户端配置、配额管理、密钥恢复、性能 fallback 全链路。

下一步可选方向:

  • **OmniRoute + Langfuse v3**:把每次转发的 token 用量 + 延迟写进 Langfuse,做完整的 cost dashboard(接 2026-06-20 n8n + Langfuse v3 文章)
  • **OmniRoute + WordPress 7.0 mcp-adapter**:让 Abilities API 调用走本地 gateway(接 2026-06-30 + 2026-07-01 两篇 MCP 文章)
  • **OmniRoute 集群化**:2-3 台 VPS 跑不同 provider pool,前端 nginx upstream 负载均衡

研究文档(引用来源参考)

(no reference document available)

👉 Join MiniMax Token Plan: AI coding acceleration for businesses

👉 Join Zhipu Coding Plan: GLM-4.6/GLM-5 coding packages, China-stable, pay-per-token unlimited

👉 Join Aliyun AI: Top AI products with exclusive coupons for business innovation

📌 This article was AI-assisted generated and human-reviewed | TechPassive — An AI-driven content testing site focused on real tool reviews

🔗 Recommended Tools

These are carefully selected tools. Using our affiliate links supports us to keep producing quality content:

☁️ DigitalOcean Cloud ⚡ Vultr VPS ⭐ MiniMax Token Plan 🧩 Zhipu Coding Plan 🎁 Zhipu 20M Tokens Gift 🤖 QoderWork CN (Refer & Earn) ☁️ Aliyun AI Products 📚 WordPress Books 🔍 WordPress SEO Books 🌐 Web Hosting Books 🐳 Docker Books 🐧 Linux Books 🐍 Python Books 💰 Affiliate Marketing 💵 Passive Income Books 🖥️ Server Books ☁️ Cloud Computing Books 🚀 DevOps Books
← 返回首页