OmniRoute 贡献开发指南:从零开始理解 AI 网关的架构、调试与开发规范
2026/9/10 6:00:35 网站建设 项目流程

OmniRoute 贡献开发指南:从零开始理解 AI 网关的架构、调试与开发规范

【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150+ free), 1200+ models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline & Copilot. Quota-aware auto-fallback, RTK+Caveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550+ contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute

本文以 OmniRoute 项目根目录的CLAUDE.md(及仓库内各文档、源码与测试)为核心骨架,系统讲解如何快速上手开发、理解统一 AI 网关的分层架构与请求处理管线、掌握三层弹性容错机制(Provider Circuit Breaker、Connection Cooldown、Model Lockout)的区别与调试方法,并遵守从代码风格、数据库约束、安全红线到测试覆盖率的完整质量门槛。读完本文,你将具备在 OmniRoute 仓库中进行新 Provider 接入、新 API 路由、新 DB 模块、新 MCP 工具等常见开发任务的实战能力。

快速上手:开发环境与常用命令

OmniRoute 是一个单仓库(monorepo),核心由src/(Next.js 16 应用)、open-sse/(流式引擎工作区)、electron/(桌面应用)、tests/(测试)组成。在根目录执行以下命令即可完成从安装到校验的完整循环:

npm install # 安装依赖(自动从 .env.example 生成 .env) npm run dev # 启动开发服务器,默认 http://localhost:20128 npm run build # 生产构建(Next.js 16 standalone) npm run lint # ESLint(预期 0 错误;警告为历史遗留) npm run typecheck:core # TypeScript 类型检查(应保持干净) npm run typecheck:noimplicit:core # 严格检查(不允许任何隐式 any) npm run test:coverage # 单元测试 + 覆盖率门槛(75/75/75/70 —— 语句/行/函数/分支) npm run check # lint + 测试合并执行 npm run check:cycles # 检测循环依赖

说明:文档中提到的覆盖率为语句/行/函数 75%、分支 70%,当前仓库 package.json 中test:coverage的 c8 参数基线为 statements/lines/functions 60%、branches 60% 的托底门槛,硬性质量门保持在更高水位,详见后文「测试策略与覆盖率门」。

运行测试的三种方式

# 单个测试文件(Node.js 原生测试运行器 —— 适用于大部分测试) node --import tsx/esm --test tests/unit/your-file.test.ts # Vitest(MCP 服务器、autoCombo、缓存相关) npm run test:vitest # 全部测试套件 npm run test:all

完整的测试矩阵见 CONTRIBUTING.md → "Running Tests";深入架构见 AGENTS.md。

项目结构:分层一览

OmniRoute 的架构围绕"一个端点、多家 Provider、自动回退"展开,代码按职责清晰分层:

层级位置职责
API 路由src/app/api/v1/Next.js App Router —— 入口点
处理器open-sse/handlers/请求处理(chat、embeddings 等)
执行器open-sse/executors/按 Provider 定制的 HTTP 分发
翻译器open-sse/translator/格式转换(OpenAI↔Claude↔Gemini)
转换器open-sse/transformer/响应 API ↔ chat completions
服务open-sse/services/组合路由、限流、缓存等
数据库src/lib/db/110+ 个顶层 SQLite 领域模块,130+ 个迁移
领域/策略src/domain/策略引擎、成本规则、回退逻辑
MCP 服务器open-sse/mcp-server/107 个独立工具,3 种传输(stdio/SSE/Streamable HTTP),32 个作用域
A2A 服务器src/lib/a2a/JSON-RPC 2.0 Agent 协议
技能src/lib/skills/可扩展的技能框架
记忆src/lib/memory/持久化对话记忆

monorepo 构成:src/(Next.js 16 应用)、open-sse/(流式引擎工作区)、electron/(桌面应用)、tests/bin/(CLI 入口)。

请求管线:一次 Chat 请求的完整旅程

Client → /v1/chat/completions (Next.js route) → CORS → Zod validation → auth? → policy check → prompt injection guard → handleChatCore() [open-sse/handlers/chatCore.ts] → cache check → rate limit → combo routing? → resolveComboTargets() → handleSingleModel() per target → translateRequest() → getExecutor() → executor.execute() → fetch() upstream → retry w/ backoff → response translation → SSE stream or JSON → If Responses API: responsesTransformer.ts TransformStream

所有 API 路由遵循统一模式:Route → CORS preflight → Zod body validation → Optional auth(extractApiKey/isValidApiKey)→ API key 策略执行 → Handler 委托(open-sse)。OmniRoute 没有全局 Next.js middleware——所有拦截都是路由级的。

Combo 路由open-sse/services/combo.ts)支持 19 种公开策略:priority、weighted、fill-first、round-robin、p2c、random、least-used、cost-optimized、reset-aware、reset-window、headroom、strict-random、auto、lkgp、context-optimized、cache-optimized、context-relay、fusion、pipeline。每个目标通过handleSingleModel()执行,该函数用每目标错误处理和熔断检查包装handleChatCore()。关于 13 因子的 Auto-Combo 评分见 AUTO-COMBO.md(当前实现为 16 因子评分,见open-sse/services/autoCombo/scoring.tsDEFAULT_WEIGHTS);三层弹性架构见 RESILIENCE_GUIDE.md。

三层弹性容错机制:一次彻底区分

OmniRoute 中有三个相关但截然不同的临时故障机制。调试路由行为时务必区分它们的作用域。可对照三层弹性架构图(源文件:resilience-3layers.mmd)快速定位。

Provider Circuit Breaker(Provider 熔断器)

作用域:整个 Provider,例如glmopenaianthropic

目的:当某个 Provider 在上游/服务层反复失败时停止向其发送流量,避免一个不健康的 Provider 拖慢每一个请求。

实现

  • 核心类:src/shared/utils/circuitBreaker.ts
  • 聊天门控/执行接线:src/sse/handlers/chatHelpers.tssrc/sse/handlers/chat.ts
  • 运行时状态 API:src/app/api/monitoring/health/route.ts
  • 共享包装器:open-sse/services/accountFallback.ts
  • 持久化状态表:domain_circuit_breakers

状态

  • CLOSED:正常放行流量。
  • OPEN:Provider 被临时阻断;调用方会收到 provider-circuit-open 响应,或 Combo 路由转向其他目标。
  • HALF_OPEN:重置超时已到;允许一个探测请求。成功则熔断关闭,失败则重新打开。

从源码看,熔断器还包含DEGRADED中间态(src/shared/utils/circuitBreaker.tsSTATE常量),并在failureThreshold/resetTimeout之外支持按失败类型(kindThresholds)区分阈值、指数退避(maxBackoffMultiplierbackoffEscalationCount)与状态迁移历史记录(transitionHistory)。

默认值(见 open-sse/config/constants.ts 的PROVIDER_PROFILES,均可通过OMNIROUTE_CIRCUIT_BREAKER_*环境变量覆盖):

Provider 类型熔断阈值重置超时
OAuth8OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD60000msOMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS
API Key12OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD30000msOMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS
本地(local)2OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD15000msOMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS

注:文档原文给出的阈值为 OAuth 3/60s、API Key 5/30s、Local 2/15s;当前仓库 constants.ts 已根据规模化后的连接数上调为 OAuth 8/60s、API Key 12/30s、Local 2/15s,并新增了 Provider 级整体熔断(OMNIROUTE_PROVIDER_BREAKER_*_FAILURE_THRESHOLD_WINDOW_MS_COOLDOWN_MS)与自适应熔断 v2(DEGRADATION_THRESHOLDMAX_BACKOFF_MULTIPLIERBACKOFF_ESCALATION_COUNT)。以当前源码为准。

哪些状态会触发 Provider 熔断:只有 Provider 级失败状态码会 trip Provider 熔断器:

(408, 500, 502, 503, 504);

不要因为常见账户/Key/模型错误(如大多数401403429场景)而 trip 整个 Provider 的熔断器。这些通常属于连接冷却或模型锁定范围。一个普通的 API Key Provider403应该是可恢复的,除非它被归类为终端性 Provider/账户错误。

熔断器采用惰性恢复,而非后台定时器。当OPEN到期时,getStatus()canExecute()getRetryAfterMs()等读路径会把状态刷新为HALF_OPEN,避免仪表盘和 Combo 候选构建器永远排除一个已过期的 Provider。

Connection Cooldown(连接冷却)

作用域:单个 Provider 连接/账户/Key。

目的:临时排除一个坏 Key/账户,同时允许同一 Provider 的其他连接继续服务请求。

实现

  • 写入/更新路径:src/sse/services/auth.ts::markAccountUnavailable()
  • 账户选择/过滤:src/sse/services/auth.ts::getProviderCredentials...
  • 冷却计算:open-sse/services/accountFallback.ts::checkFallbackError()
  • 设置:src/lib/resilience/settings.ts

Provider 连接上的关键字段:

rateLimitedUntil; testStatus: "unavailable"; lastError; lastErrorType; errorCode; backoffLevel;

账户选择时,一个连接在以下情况被排除:

new Date(rateLimitedUntil).getTime() > Date.now();

冷却同样是惰性的:当rateLimitedUntil位于过去时,连接重新变得合格。成功使用时,clearAccountError()会清除testStatusrateLimitedUntil、错误字段和backoffLevel

默认连接冷却行为(以 constants.ts 的PROVIDER_PROFILES为准):

  • OAuth 基础冷却:5000mstransientCooldown)。
  • API Key 基础冷却:3000mstransientCooldown)。
  • API Key 遇到429时应优先遵循上游重试指示(Retry-After、reset 头或可解析的 reset 文本)。
  • 反复的可恢复失败使用指数退避:
baseCooldownMs * 2 ** failureIndex;

防惊群(anti-thundering-herd)硬守卫会阻止同一连接上的并行失败叠加冷却或翻倍backoffLevel

终端状态不是冷却bannedexpiredcredits_exhausted在有意的状态保持为不可用,直到凭据/设置变更或操作员重置。不要用临时冷却状态覆盖终端状态。

Model Lockout(模型锁定)

作用域:Provider + 连接 + 模型。

目的:当仅某个模型不可用或被配额限制时,避免禁用整个连接。

示例:

  • 按模型计配额的 Provider 返回429
  • 本地 Provider 对缺失模型返回404
  • Provider 特有的模式/模型许可失败,如特定 Grok 模式。

Model Lockout 位于open-sse/services/accountFallback.ts,允许同一连接继续服务其他模型。它默认关闭src/lib/resilience/settings.tsenabled: false,详见 RESILIENCE_GUIDE.md 的配置表),并支持自定义冷却窗口与失败计数上限;当锁定期满后再次失败的模型会继续升级冷却而不是从 1 重新计数。

调试指导

  • 如果一个 Provider 的所有 Key 都被排除,同时检查 Provider 熔断状态和每个连接的rateLimitedUntil/testStatus
  • 如果一个 Provider 在重置窗口之后仍被永久排除,检查代码是否读取了原始state而不是使用getStatus()/canExecute()
  • 如果一个 Provider Key 失败但其他 Key 应正常工作,优先考虑连接冷却而非 Provider 熔断器。
  • 如果只有单个模型失败,优先考虑模型锁定而非连接冷却。
  • 如果一个状态应当自恢复,它应拥有未来的时间戳/重置超时和一个能在过期时刷新状态的读路径。终端状态需要手动凭据或配置变更。

核心规范:代码风格、数据库与错误处理

代码风格

  • 2 空格缩进、分号、双引号、100 字符宽度、es5 trailing comma(通过 lint-staged 由 Prettier 强制执行)
  • Import 顺序:外部 → 内部(@/@omniroute/open-sse)→ 相对路径
  • 命名:文件=camelCase/kebab-case、组件=PascalCase、常量=UPPER_SNAKE
  • ESLintno-evalno-implied-evalno-new-func= 全仓库错误;no-explicit-any=open-sse/tests/内为警告
  • TypeScriptstrict: false、目标 ES2022、模块 esnext、解析 bundler。优先显式类型

数据库

  • 始终通过src/lib/db/领域模块访问数据库——绝不在路由或处理器中写原始 SQL
  • 绝不src/lib/localDb.ts中添加逻辑(它只是再导出层)
  • 绝不localDb.ts做 barrel import——应导入具体的db/模块
  • DB 单例:getDbInstance()来自src/lib/db/core.ts(WAL journaling)
  • 迁移:src/lib/db/migrations/——带版本号的 SQL 文件,幂等,在事务中执行

错误处理

  • 使用具体错误类型的 try/catch,配合 pino context 记录日志
  • 不要吞掉 SSE 流中的错误——使用 abort 信号进行清理
  • 返回正确的 HTTP 状态码(4xx/5xx)

安全红线:不可逾越的硬性规则

  • 绝不使用eval()new Function()或隐式 eval
  • 所有输入通过 Zod schema 验证
  • 静态凭据加密(AES-256-GCM)
  • 上游 header 白名单:src/shared/constants/upstreamHeaders.ts——编辑时保持 sanitize、Zod schema 和单元测试同步
  • 公共上游凭据(Gemini/Antigravity/Windsurf 风格的 OAuth client_id/secret + 从公共 CLI 提取的 Firebase Web key):必须通过open-sse/utils/publicCreds.tsresolvePublicCred()嵌入——绝不作为字符串字面量。强制模式见 PUBLIC_CREDS.md
  • 错误响应(HTTP/SSE/Executor/MCP handler):必须通过open-sse/utils/error.tsbuildErrorBody()sanitizeErrorMessage()——绝不在响应体里放原始err.stackerr.message。见 ERROR_SANITIZATION.md
  • 由变量构造的 shell 命令:当exec()/spawn()需要运行时值时,通过env选项传入(自动 shell-escape)——绝不将不可信/外部路径字符串插值进脚本体。参考:src/mitm/cert/install.ts::updateNssDatabases
  • 优先使用安全默认库(如 Helmet.js、DOMPurify、ssrf-req-filter、safe-regex、Google Tink)而非自定义实现

常见开发场景演练

新增一个 Provider

  1. src/shared/constants/providers.ts注册(加载时经 Zod 验证)
  2. 如需自定义逻辑,在open-sse/executors/添加 executor(继承BaseExecutor
  3. 若非 OpenAI 格式,在open-sse/translator/添加 translator
  4. 若基于 OAuth,在src/lib/oauth/constants/oauth.ts添加 OAuth 配置——如果上游 CLI 提供公共 client_id/secret,通过resolvePublicCred()嵌入(见 PUBLIC_CREDS.md),绝不作为字面量
  5. open-sse/config/providerRegistry.ts注册模型
  6. tests/unit/编写测试(若新增嵌入式默认值,需包含 publicCreds 大小确认)

新增一个 API 路由

  1. src/app/api/v1/your-route/下创建目录
  2. 创建带GET/POSThandler 的route.ts
  3. 遵循模式:CORS → Zod body 验证 → 可选认证 → Handler 委托
  4. Handler 放在open-sse/handlers/(从那里 import,不要内联)
  5. 错误响应使用open-sse/utils/error.tsbuildErrorBody()/errorResponse()(自动 sanitize——绝不把原始err.stack/err.message放进 body)。见 ERROR_SANITIZATION.md
  6. 添加测试——至少包含一个断言错误响应不泄漏堆栈(!body.error.message.includes("at /")

新增一个 DB 模块

  1. 创建src/lib/db/yourModule.ts——从./core.ts导入getDbInstance
  2. 为领域表导出 CRUD 函数
  3. 如需新表,在src/lib/db/migrations/添加迁移
  4. src/lib/localDb.ts再导出(仅加入再导出列表)
  5. 编写测试

新增一个 MCP 工具

  1. open-sse/mcp-server/tools/添加工具定义:Zod 输入 schema + async handler
  2. 注册到工具集(由createMcpServer()组装)
  3. 分配到合适的作用域
  4. 编写测试(工具调用记录在mcp_audit表)

新增一个 A2A 技能

  1. src/lib/a2a/skills/创建技能(已存在 5 个:smart-routing、quota-management、provider-discovery、cost-analysis、health-report)
  2. 技能接收任务上下文(消息、元数据)→ 返回结构化结果
  3. src/lib/a2a/taskExecution.tsA2A_SKILL_HANDLERS注册
  4. src/app/.well-known/agent.json/route.ts发布(agent card)
  5. tests/unit/编写测试
  6. 在 A2A-SERVER.md 的技能表中补充文档

新增一个 Cloud Agent

  1. src/lib/cloudAgent/agents/创建继承CloudAgentBase的 Agent 类(已存在 3 个:codex-cloud、devin、jules)
  2. 实现createTaskgetStatusapprovePlansendMessagelistSources
  3. src/lib/cloudAgent/registry.ts注册
  4. 如需 OAuth/凭据管理,添加到src/lib/oauth/providers/
  5. 编写测试 + 在 CLOUD_AGENT.md 补充文档

新增 Guardrail / Eval / Skill / Webhook 事件

  • Guardrail:src/lib/guardrails/→ 文档:GUARDRAILS.md
  • Eval 套件:src/lib/evals/→ 文档:EVALS.md
  • Skill(沙箱):src/lib/skills/→ 文档:SKILLS.md
  • Webhook 事件:src/lib/webhookDispatcher.ts→ 文档:WEBHOOKS.md

测试策略与覆盖率门

类别命令
单元测试npm run test:unit
单文件node --import tsx/esm --test tests/unit/file.test.ts
Vitest(MCP、autoCombo)npm run test:vitest
E2E(Playwright)npm run test:e2e
协议 E2E(MCP+A2A)npm run test:protocols:e2e
生态npm run test:ecosystem
覆盖率门npm run test:coverage(75/75/75/70 —— 语句/行/函数/分支)
覆盖率报告npm run coverage:report

PR 规则:如果你修改了src/open-sse/electron/bin/中的生产代码,必须在同一 PR 中附带或更新测试。

测试层级优先级:单元优先 → 集成(多模块或 DB 状态)→ e2e(仅 UI/工作流)。Bug 复现应像自动化测试一样编码,先于或伴随修复提交。

Copilot 覆盖率策略:当一个 PR 修改生产代码且覆盖率低于 75%(语句/行/函数)或 70%(分支)时,不要只报告——添加或更新测试、重新运行覆盖率门,然后请求确认。PR 报告中包含已运行的命令、修改的测试文件和最终覆盖率结果。

Git 工作流与提交规范

# 绝不要直接提交到 main git checkout -b feat/your-feature git commit -m "feat: 描述你的变更" git push -u origin feat/your-feature

分支前缀feat/fix/refactor/docs/test/chore/

提交格式(Conventional Commits):feat(db): add circuit breaker—— scope 可选值:dbsseoauthdashboardapiclidockercimcpa2amemoryskills

Husky 钩子

  • pre-commit:lint-staged +check-docs-sync+check:any-budget:t11
  • pre-pushnpm run test:unit

运行环境与关键配置

  • 运行时:Node.js ≥22.22.2 <23 | ≥24 <25(当前 package.json 的engines>=22.22.2 <23 || >=24.0.0 <27)、ES Modules
  • TypeScript:5.9+,目标 ES2022,模块 esnext,解析 bundler
  • 路径别名@/*src/@omniroute/open-sseopen-sse/@omniroute/open-sse/*open-sse/*
  • 默认端口:20128(API 与仪表盘同端口)
  • 数据目录DATA_DIR环境变量,默认~/.omniroute/
  • 核心环境变量PORTJWT_SECRETAPI_KEY_SECRETINITIAL_PASSWORDREQUIRE_API_KEYAPP_LOG_LEVEL
  • 初始化:cp .env.example .env,然后生成JWT_SECRETopenssl rand -base64 48)和API_KEY_SECRETopenssl rand -hex 32

硬性规则清单

  1. 绝不提交机密或凭据
  2. 绝不在localDb.ts添加逻辑
  3. 绝不使用eval()/new Function()/隐式 eval
  4. 绝不直接提交到main
  5. 绝不在路由中写原始 SQL——使用src/lib/db/模块
  6. 绝不静默吞掉 SSE 流中的错误
  7. 始终用 Zod schema 验证输入
  8. 修改生产代码时始终附带测试
  9. 覆盖率必须 ≥75%(语句、行、函数)/≥70%(分支)。当前实测约 82%
  10. 未经操作员明确许可,绝不绕过 Husky 钩子(--no-verify--no-gpg-sign
  11. 绝不将公共上游 OAuth client_id/secret 或 Firebase Web key 作为字符串字面量嵌入——始终通过resolvePublicCred()open-sse/utils/publicCreds.ts)。见 PUBLIC_CREDS.md
  12. 绝不在 HTTP/SSE/Executor 响应中返回原始err.stack/err.message——始终通过buildErrorBody()sanitizeErrorMessage()open-sse/utils/error.ts)。见 ERROR_SANITIZATION.md
  13. 绝不在exec()/spawn()中字符串插值外部路径或运行时值——改用env选项传入。参考:src/mitm/cert/install.ts::updateNssDatabases
  14. 绝不忽略 CodeQL/Secret-Scanning 警告:(a) 先查阅上述模式文档判断是否适用,(b) 在忽略注释中记录技术理由。先例:js/stack-trace-exposure在调用点经sanitizeErrorMessage()路由后判定为已知 CodeQL 限制(无法识别自定义 sanitizer),引用 ERROR_SANITIZATION.md 标记为 false positive
  15. 绝不公开会 spawn 子进程的路由(/api/mcp//api/cli-tools/runtime/),除非在src/server/authz/routeGuard.tsisLocalOnlyPath()分类中。回环强制在任何认证检查之前无条件发生——经隧道泄漏的 JWT 不能触发进程 spawn。见 ROUTE_GUARD_TIERS.md
  16. 绝不包含署名给 AI 助手、LLM 或自动账户的Co-Authored-By尾缀(如含 "Claude"、"GPT"、"Copilot"、"Bot" 名称,或anthropic.com/openai.com/bot 所有的noreply.github.com邮箱)。此类尾缀会在 GitHub 上把提交归属路由到 bot 账户,在 PR 历史中隐藏真正的作者(diegosouzapw)。人类协作者——包括上游 PR 作者和移植到 OmniRoute 的 issue 报告者——可以且应当使用标准Co-authored-by: Name <email>尾缀;上游移植工作流(/port-upstream-features/port-upstream-issues)依赖于此。

参考文档索引

任何非理论性变更之前,先阅读对应领域的深度分析:

领域文档
仓库导航docs/architecture/REPOSITORY_MAP.md
架构docs/architecture/ARCHITECTURE.md
工程参考docs/architecture/CODEBASE_DOCUMENTATION.md
Auto-Combo(评分、策略)docs/routing/AUTO-COMBO.md
弹性(3 种机制)docs/architecture/RESILIENCE_GUIDE.md
推理重放docs/routing/REASONING_REPLAY.md
技能框架docs/frameworks/SKILLS.md
记忆系统(FTS5 + Qdrant)docs/frameworks/MEMORY.md
Cloud Agentdocs/frameworks/CLOUD_AGENT.md
Guardrails(PII/注入/视觉)docs/security/GUARDRAILS.md
公共上游凭据(Gemini 等)docs/security/PUBLIC_CREDS.md
错误消息消毒docs/security/ERROR_SANITIZATION.md
Evalsdocs/frameworks/EVALS.md
合规/审计docs/security/COMPLIANCE.md
Webhooksdocs/frameworks/WEBHOOKS.md
授权管线docs/architecture/AUTHZ_GUIDE.md
隐身(TLS/指纹)docs/security/STEALTH_GUIDE.md
Agent 协议(A2A/ACP/Cloud)docs/frameworks/AGENT_PROTOCOLS_GUIDE.md
MCP 服务器docs/frameworks/MCP-SERVER.md
A2A 服务器docs/frameworks/A2A-SERVER.md
API 参考 + OpenAPIdocs/reference/API_REFERENCE.md+docs/reference/openapi.yaml
Provider 目录(自动生成)docs/reference/PROVIDER_REFERENCE.md
发布流程docs/ops/RELEASE_CHECKLIST.md

【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150+ free), 1200+ models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline & Copilot. Quota-aware auto-fallback, RTK+Caveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550+ contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询