项目快照:diegosouzapw/OmniRoute,约 68,073 个 Star,9,604 个 Fork;最新推送时间 2026-09-19T08:30:04Z。本文基于仓库公开资料撰写。
项目地址:https://github.com/diegosouzapw/OmniRoute · https://omniroute.online

项目速览(TL;DR)
OmniRoute 是一个采用 TypeScript 编写的开源人工智能网关(AI Gateway)。它通过统一端点连接多个人工智能服务提供商,并提供自动故障转移、路由策略、令牌压缩、MCP、A2A、桌面端和渐进式 Web 应用(PWA)能力。
仓库资料中的 GitHub 元信息显示,该项目有 68073 个 Star、9604 个 Fork,默认分支为 `release/v3.8.51`,许可证为 MIT。README 的不同位置出现了“352 providers”和“359 providers”两组数量,本文不将两者强行合并;具体提供商数量应以当前仓库目录和官网实时目录为准。
- 项目类型:统一人工智能路由与代理网关。
- 主要语言:TypeScript。
- 当前 package 版本:`3.8.51`,来源:`package.json`。
- 许可证:MIT,版权行标注为 `Copyright (c) 2026 diegosouzapw`。
- 运行方式:Node.js、Docker Compose,以及仓库提供的 CLI、桌面端或 PWA 相关构建路径。
定位与目标用户
OmniRoute 的核心定位不是单一模型客户端,而是位于开发工具和多个模型服务之间的统一接入层。调用方只需要面向 OmniRoute 配置端点,网关负责把请求路由到可用的提供商,并在额度或请求状态满足条件时执行后备路由。
它面向需要同时接入 Claude Code、Codex、Cursor、OpenCode、Cline、Copilot 等工具的开发者和团队。根据 README,项目还覆盖 Claude、GPT、Gemini、Kimi、GLM、DeepSeek、MiniMax 等模型类别;具体模型名称、协议差异和可用额度需要以实时目录为准。
- 需要把多个模型提供商收敛到一个端点的个人开发者。
- 需要根据额度、模型能力或路由策略切换后端的研发团队。
- 希望在本地或自有环境管理 API 配置、仪表板和数据目录的部署者。
- 需要将 OpenAI 兼容 API 接入现有工具链的使用者,前提是目标工具与实际配置兼容。
核心功能
核心收益来自“统一入口、路由决策和运行状态管理”的组合,而不是单个模型接口。以下功能均依据 README、`package.json` 或 Docker Compose 资料整理;资料未给出完整请求字段和响应字段,因此不补写未经证实的接口签名。
统一人工智能网关
项目将多个提供商放在同一个网关入口后面,调用方不必为每个后端分别维护 SDK、地址和认证流程。`package.json` 的描述明确包含 OpenAI-compatible APIs,即 OpenAI 兼容 API;兼容范围、流式事件格式和各提供商的特殊参数,官方仓库在给定资料中未完整提供,建议以最新 README 和生成的接口文档为准。
请求进入网关后,路由层需要根据模型、提供商状态、配置策略和额度信息选择后端。资料中存在 `eval:router`、`eval:router:compare`、`eval:router:search` 和 `eval:router:trends` 等脚本,说明仓库包含路由评估和比较工具,但没有提供完整的决策算法说明。
额度感知与自动后备路由
自动后备路由(auto-fallback)用于在当前后端不可用、额度不足或路由条件不满足时,转向其他候选提供商。README 将其描述为 quota-aware auto-fallback,即“额度感知的自动后备”,但给定资料没有定义每个错误码对应的切换条件、重试次数、幂等策略或切换优先级。
README 还说明免费层目录会按共享额度池去重。其统计口径包括 35 个 recurring pool keys、489 个 cataloged free-tier entries,以及具有正向月度预算的 17 个池和五个按模型计算的 Groq 上限;这些数据是目录统计方法,不应直接视为用户账户的可用承诺。
RTK 与 Caveman 堆叠压缩
RTK 和 Caveman 是项目提供的令牌压缩(token compression)链路。README 宣称该组合可节省 15% 至 95% 的令牌,平均值标注为约 89%;这里的数字属于项目 README 的说明,资料没有提供测试数据集、输入类型、模型列表、误差指标或复现实验步骤,因此不能将其理解为所有请求都能达到的固定结果。
`package.json` 提供了 `bench:compression` 和 `eval:compression` 脚本,分别用于压缩基准和压缩评估。压缩会改变发送给模型的上下文表示,生产环境应先检查代码语义、结构化输出、工具调用和长上下文场景是否满足业务要求。
MCP 与 A2A
项目描述包含模型上下文协议(Model Context Protocol,MCP)与代理到代理通信(Agent-to-Agent,A2A)能力。它们用于把工具、上下文或代理间交互接入网关,但给定资料没有列出启用字段、传输协议、认证方式和权限模型,因而不能据此推导具体的 MCP Server 或 A2A Agent 配置。
涉及外部工具或代理时,应把它们视为独立信任边界,限制可访问的数据目录和网络范围。授权、数据处理和审计要求见“安全与合规边界”章节。
桌面端与 PWA
README 和 `package.json` 将 desktop、PWA 列为项目能力。当前给定资料只展示了构建脚本和部分运行时文件,未提供桌面安装包格式、支持的操作系统、PWA 的浏览器兼容矩阵或离线能力说明,官方仓库未提供该信息,建议以最新 README 为准。
系统架构与关键模块
从仓库发布文件、工作区和 Compose 定义可以确认,OmniRoute 由 Node.js 应用、前端或仪表板、路由与服务模块、可选的浏览器运行环境以及多个旁路组件组成。下面描述的是资料能直接支持的模块边界,不把未公开的内部调用链当作确定事实。
应用层与运行时
`package.json` 将项目声明为 ES Module,`"type": "module"`,并通过 `bin/omniroute.mjs` 暴露 `omniroute` 命令,通过 `bin/reset-password.mjs` 暴露 `omniroute-reset-password` 命令。发布文件中包含 `src/server/`、`src/domain/`、`src/lib/`、`src/models/`、`src/sse/`、`src/types/` 和 `src/shared/` 等路径,能够确认这些目录属于发布内容,但给定资料没有逐文件说明其职责。
构建脚本使用 `scripts/build/build-next-isolated.mjs`,开发和启动分别通过 `scripts/dev/run-next.mjs dev` 与 `scripts/dev/run-next.mjs start` 调用。项目还提供 `build:backend`、`build:secure`、`build:contributor` 和 `build:release` 等不同构建入口,适用于不同发布和开发场景。
数据、限流与旁路服务
Docker Compose 将 Redis 定义为“Rate Limiter Backend”,服务名为 `redis`,镜像为 `docker.io/library/redis:8.6.5-alpine`。应用通过 `REDIS_URL` 指向该服务,默认值为 `redis://redis:6379`;Compose 注释明确提示,Redis 默认未配置 `requirepass`,因此部署时不能把未认证 Redis 暴露到不受信任的网络。
Compose 还定义了可选的 `memory`、`bifrost`、`cliproxyapi`、`web`、`cli` 和 `host` 配置档。`memory` 会添加 Qdrant 旁路服务,`bifrost` 会添加 Bifrost Go 旁路服务,`cliproxyapi` 使用 CLIProxyAPI 旁路服务;这些组件是 Compose 资料明确列出的可选路径,不代表所有部署都必须启用。
浏览器与原生模块
Dockerfile 安装了 `libsecret-1-0` 和 `ca-certificates`,构建阶段安装 `python3`、`make` 和 `g++`,用于依赖安装和原生模块编译。Compose 的 `web` 配置档面向 `gemini-web`、`claude-web` 和 `claude-turnstile` 相关服务,并注释为需要 Chromium/Playwright 的路径。
资料同时出现 `src/mitm/tproxy/native`、`build:native:tproxy` 和 `build/wreqJsNative.mjs` 等文件或脚本。它们说明仓库包含原生网络相关构建内容,但未给出该功能的完整使用边界;不要在未获授权的账户、站点或网络上使用相关能力。
依赖与运行环境
运行环境的硬性约束主要来自 `package.json` 的 engines 和 Dockerfile 基础镜像。Node.js 要求为 `>=22.22.2 <23 || >=24.0.0 <27`,Dockerfile 使用 `node:26-trixie-slim` 作为基础镜像。
| 项目 | 资料中的要求 | 来源 | 说明 |
|---|---|---|---|
| 运行时 | Node.js `>=22.22.2 <23 || >=24.0.0 <27` | package.json | 版本范围不包含 Node.js 23。 |
| 容器基础镜像 | `node:26-trixie-slim` | Dockerfile | 用于 Docker 构建的基础阶段。 |
| 项目语言 | TypeScript | GitHub 元信息 | 仓库主要语言标注为 TypeScript。 |
| 工作区 | `open-sse`、`packages/browser-pool` | package.json | 根项目通过 npm workspaces 管理。 |
| 构建工具依赖 | `python3`、`make`、`g++` | Dockerfile | 构建阶段用于原生模块编译。 |
| 可选浏览器依赖 | Chromium/Playwright | docker-compose.yml | `web` 配置档使用的运行路径。 |
资料没有提供完整锁定文件内容、CPU 与内存最低值、生产并发上限或数据库容量建议。部署前应以仓库中的当前 `package-lock.json`、README、Compose 文件和发行说明进行核对。
快速开始
给定资料明确提供了 Docker Compose 的基础配置档启动方式,因此最小闭环采用本地 Compose,而不是臆造 npm 包安装命令。下面命令适用于本地或测试环境,首次运行前需要准备项目目录和 `.env` 文件。
安装与启动
git clone https://github.com/diegosouzapw/OmniRoute.git
cd OmniRoute
cp .env.example .env
docker compose --profile base up -d其中,`git clone` 使用仓库地址获取源代码,`cp .env.example .env` 对应 Compose 注释中的准备步骤,`docker compose --profile base up -d` 是仓库 Compose 注释给出的基础启动方式。敏感配置应写入本地 `.env`,不要将真实 API 密钥提交到版本库。
本地源码构建与验证
npm install
npm run build
npm run omniroute:verify这组命令分别对应依赖安装、`package.json` 的 `build` 脚本和仓库提供的 `omniroute:verify` 校验脚本。Node.js 版本必须满足前述 engines 范围;如果环境不符合,官方仓库未提供兼容保证。
开发模式运行
npm run dev`npm run dev` 会调用 `node --max-old-space-size=8192 scripts/dev/run-next.mjs dev`。命令中的内存参数来自 `package.json`,但资料没有给出开发模式的浏览器访问 URL 或默认监听地址,官方仓库未提供该信息,建议以启动日志和最新 README 为准。
配置说明
Compose 将核心运行参数集中在环境变量中,并把持久化目录映射到 `/app/data`。下表只列出资料中明确出现的字段;“默认值”严格采用 `docker-compose.yml` 的表达,未出现默认值的项目不会补写。
| 字段名 | 类型 | 默认值 | 作用 |
|---|---|---|---|
DATA_DIR |
字符串 | /app/data |
指定应用数据目录,并与 Compose 的数据卷挂载保持一致。 |
OMNIROUTE_BASE_PATH |
字符串 | 空字符串 | 配置 OmniRoute 的基础路径。 |
PORT |
整数 | 20128 |
Compose 环境中的应用端口变量。 |
DASHBOARD_PORT |
整数 | 20128 |
仪表板端口变量。 |
API_PORT |
整数 | 20129 |
API 端口变量。 |
API_HOST |
字符串 | 127.0.0.1 |
API 主机绑定地址。 |
LIVE_WS_PORT |
整数 | 20132 |
实时 WebSocket 端口变量。 |
LIVE_WS_HOST |
字符串 | 127.0.0.1 |
实时 WebSocket 主机绑定地址。 |
LIVE_WS_ALLOWED_ORIGINS |
逗号分隔字符串 | http://localhost:20128,http://127.0.0.1:20128 |
允许访问实时 WebSocket 的来源列表。 |
REDIS_URL |
URL 字符串 | redis://redis:6379 |
指向 Compose Redis 服务,用于限流后端。 |
NODE_OPTIONS |
字符串 | --max-old-space-size=2048 |
Compose 容器中的 Node.js 运行参数。 |
变量的具体校验规则、密钥字段名称和提供商认证字段在给定资料中没有完整展示。需要接入真实服务时,应使用仓库的 `.env.example` 和当前文档确认字段,不应把示例占位符直接当作有效密钥。
进阶用法
进阶部署主要通过 Compose 配置档和 package 脚本展开。选择扩展能力前,应先确认它是否改变网络暴露面、是否需要浏览器运行时,以及是否引入额外的数据持久化需求。
按 Compose 配置档选择组件
docker compose --profile web up -d
docker compose --profile cli up -d
docker compose --profile host up -d
docker compose --profile cliproxyapi up -d
docker compose --profile base --profile memory up -d
docker compose --profile base --profile bifrost up -d`web` 面向带 Chromium/Playwright 的 Web 提供商路径,`cli` 将 CLI 工具安装在容器内,`host` 使用主机挂载的 CLI 二进制文件,`cliproxyapi` 启动 CLIProxyAPI 旁路服务,`memory` 增加 Qdrant,`bifrost` 增加 Bifrost Go 旁路服务。Compose 注释还给出了同时启用多个配置档的写法,实际组合应避免端口或凭据冲突。
构建配置的选择
npm run build:fast:调用快速构建路径,并设置OMNIROUTE_SKIP_STANDALONE=1。npm run build:secure:设置OMNIROUTE_BUILD_PROFILE=minimal后构建。npm run build:backend:设置OMNIROUTE_BUILD_BACKEND_ONLY=1,面向后端构建。npm run build:contributor:使用 contributor 构建配置,并关闭 Turbopack。npm run build:release:清理 `.build` 和 `dist`,完成构建、CLI 构建并写入构建 SHA。
这些脚本由 `package.json` 明确提供,但资料没有给出每种构建产物的部署目录、兼容矩阵和性能差异。选择构建配置时,应以发布目标和仓库当前构建文档为准。
可观测性与运维
项目提供仪表板、免费层页面和 Compose 健康检查,这些能力可用于观察服务状态与额度目录。它们不等同于完整的监控、日志保留、告警或服务等级协议(SLA),资料没有声明 SLA 或正式运维承诺。
- README 指向仪表板的 `/dashboard/free-tiers` 页面,用于查看免费层目录的使用与剩余情况。
- Compose 的公共配置包含 healthcheck,执行命令为
node healthcheck.mjs。 - 健康检查间隔为
30s,超时为5s,重试次数为3,启动等待为15s。 - Compose 设置
stop_grace_period: 40s,用于容器停止时保留退出缓冲时间。 - 应用数据卷为
./data:/app/data,备份策略和数据保留周期未在给定资料中提供。
运维人员应记录路由结果、提供商错误、额度消耗和压缩前后令牌统计,但仓库资料没有给出统一日志字段或指标名称。根据本文作者的经验判断,多提供商网关最需要优先审计的是“请求最终去了哪个后端”和“后备切换是否改变了模型能力”,这些字段应在实际部署前通过仓库文档和测试确认。
安全与合规边界
OmniRoute 会集中处理模型请求、认证信息、上下文和工具调用配置,因此安全边界覆盖密钥、日志、数据目录、外部提供商和旁路服务。以下内容只讨论获得授权的本地、测试或生产环境,不提供面向未授权目标的攻击、绕过检测或账号自动化教程。
凭据与网络隔离
- 把 API 密钥和身份凭据放在本地 `.env` 或受控密钥系统中,不要提交到 Git 历史。
- Compose 注释明确指出 Redis 未配置
requirepass;不要把该 Redis 直接暴露给不受信任的局域网或公网。 API_HOST、LIVE_WS_HOST和LIVE_WS_ALLOWED_ORIGINS会影响访问面,修改前应核对反向代理和来源策略。- 启用 Web、CLI、MCP、A2A 或旁路服务前,分别限制网络出口、文件挂载和可访问的凭据范围。
隐私、授权与第三方条款
请求内容可能被转发到不同人工智能提供商,项目本身的统一入口不会自动消除这些提供商的隐私政策、数据驻留要求或免费层条款。README 将部分提供商标记为 terms-risk catalog 中的 avoid,用户应在业务数据进入网关前审查供应商条款和组织合规要求。
涉及浏览器 Cookie、CLI 登录、代理转发或第三方账号时,只能使用本人或组织明确授权的账户和环境。项目资料没有提供完整的数据删除流程、审计保留策略、加密配置说明或合规认证,官方仓库未提供该信息,不能将 MIT 许可证误解为隐私或安全保证。
许可证与商用条款
仓库使用 MIT License。根据 `LICENSE`,获得软件副本的人员可以不受限制地使用、复制、修改、合并、发布、分发、再许可和销售软件,但必须在所有副本或软件的重要部分中保留版权声明和许可声明。
许可证同时以“按现状”(AS IS)提供软件,不提供适销性、特定用途适用性和不侵权保证,作者在许可证规定范围内不承担相关损害责任。是否满足特定行业、地区、数据处理和第三方服务条款,不能仅凭 MIT 许可证判断。
- 允许商用:MIT 文本明确包含销售和分发权限。
- 分发要求:保留版权声明与 MIT 许可声明。
- 软件担保:许可证明确排除相关担保。
- 第三方组件:发布包包含 `THIRD_PARTY_NOTICES.md`,分发时还应核对其中的通知要求。
以上解释以仓库 LICENSE 为准。项目内第三方依赖、提供商协议和部署环境的额外义务,不因项目采用 MIT 而自动消失。
局限性与已知限制
OmniRoute 的能力范围较大,但给定资料不足以证明所有提供商、模型、协议和部署配置在每个环境中都能等价工作。使用时应把 README 的规模描述、当前目录和实际测试结果区分开。
- README 同时出现 352 和 359 个提供商的表述,数量存在资料版本差异。
- 免费令牌统计采用共享池去重、公开月度预算和特定额度规则计算,不能视为固定配额或服务承诺。
- 自动后备的详细触发条件、重试策略、模型降级关系和幂等行为未在给定资料中完整说明。
- 令牌压缩的 15% 至 95% 节省范围来自 README,缺少本文资料所需的完整基准环境和可复现数据。
- 桌面端、PWA、MCP、A2A 和浏览器相关能力的安装步骤、兼容矩阵与权限模型未完整给出。
- 资料没有提供 SLA、生产并发上限、最低硬件规格和完整灾备方案。
根据本文作者的经验判断,如果业务依赖固定模型版本、固定数据驻留区域或严格可复现的输出,应先锁定后端、关闭未经验证的自动切换路径,并建立自己的回归测试,而不是只依赖统一路由。
适合谁
以下信号同时满足两项或以上时,OmniRoute 更值得进入评估清单;最终选择仍应由实际兼容性和合规测试决定。
- 团队已经使用两个或更多人工智能提供商,希望把认证和调用入口集中管理。
- 开发工具包含 Claude Code、Codex、Cursor、Cline、Copilot 或 OpenCode,并且需要统一路由层。
- 请求量受免费层或多供应商额度约束,需要根据额度状态进行后备路由。
- 组织能够维护 Node.js 或 Docker Compose 服务,并愿意管理 Redis、数据卷和环境变量。
- 团队愿意针对令牌压缩、模型切换和工具调用建立验收测试。
不适合谁
下列情况会显著增加引入成本,或要求先完成额外的安全与合规论证。
- 只调用一个模型提供商,且现有 SDK、密钥管理和监控已经满足需求。
- 不能接受请求被路由到多个第三方,或业务要求数据始终停留在指定区域而当前部署未完成验证。
- 团队没有能力维护 Docker、Node.js、环境变量、Redis 和数据备份。
- 业务要求固定模型、固定提示词处理链和完全可复现的输出,却计划直接启用自动后备与压缩。
- 需要明确 SLA、厂商支持响应时间或合规认证,而项目资料未提供这些承诺。
常见问题与排查(FAQ / Troubleshooting)
为什么 README 中的提供商数量有两个数字
给定资料中同时出现了 352 和 359。它们来自不同的 README 描述位置,不能在没有版本上下文的情况下判定哪一个代表当前目录;应以当前仓库、官网和仪表板目录为准。
启动后不知道访问哪个地址怎么办
Compose 默认变量中包含仪表板端口 `20128`、API 端口 `20129` 和实时 WebSocket 端口 `20132`,主机默认值分别涉及 `127.0.0.1`。具体 URL、路径和反向代理规则在给定资料中未完整说明,应查看启动日志、当前 README 和实际配置。
Redis 是否必须公开端口
不应为了本地工具方便而把未认证 Redis 暴露给不受信任网络。Compose 注释说明应用容器通过 `redis:6379` 访问 Redis,宿主机发布端口只是供宿主机工具或本地开发使用的路径。
如何验证 Node.js 版本
先对照 `package.json` 的 engines:允许 `>=22.22.2 <23` 或 `>=24.0.0 <27`。如果构建失败,先核对 Node.js 版本、工作区清单和原生编译工具,再执行仓库提供的 `npm run omniroute:verify`。
压缩后输出变化怎么办
压缩会改变发送给模型的上下文表示,不能只用令牌数量判断正确性。应使用 `npm run bench:compression` 或 `npm run eval:compression` 进行项目提供的评估,并在业务测试中检查代码、JSON、工具调用和长上下文结果。
为什么某个提供商没有自动切换
资料没有公开所有后备触发条件、错误分类和策略优先级。应先检查额度页面、网关日志、提供商配置和模型名称,再以当前 README 或官方文档确认该后端是否被纳入候选路由。
项目地址与资源
以下链接均来自仓库资料或项目自身列出的官方站点,适合用于获取源代码、文档、发布信息和社区支持。



