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.ts的DEFAULT_WEIGHTS);三层弹性架构见 RESILIENCE_GUIDE.md。
三层弹性容错机制:一次彻底区分
OmniRoute 中有三个相关但截然不同的临时故障机制。调试路由行为时务必区分它们的作用域。可对照三层弹性架构图(源文件:resilience-3layers.mmd)快速定位。
Provider Circuit Breaker(Provider 熔断器)
作用域:整个 Provider,例如glm、openai、anthropic。
目的:当某个 Provider 在上游/服务层反复失败时停止向其发送流量,避免一个不健康的 Provider 拖慢每一个请求。
实现:
- 核心类:
src/shared/utils/circuitBreaker.ts - 聊天门控/执行接线:
src/sse/handlers/chatHelpers.ts、src/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.ts的STATE常量),并在failureThreshold/resetTimeout之外支持按失败类型(kindThresholds)区分阈值、指数退避(maxBackoffMultiplier、backoffEscalationCount)与状态迁移历史记录(transitionHistory)。
默认值(见 open-sse/config/constants.ts 的PROVIDER_PROFILES,均可通过OMNIROUTE_CIRCUIT_BREAKER_*环境变量覆盖):
| Provider 类型 | 熔断阈值 | 重置超时 |
|---|---|---|
| OAuth | 8(OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD) | 60000ms(OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS) |
| API Key | 12(OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD) | 30000ms(OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS) |
| 本地(local) | 2(OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD) | 15000ms(OMNIROUTE_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_THRESHOLD、MAX_BACKOFF_MULTIPLIER、BACKOFF_ESCALATION_COUNT)。以当前源码为准。
哪些状态会触发 Provider 熔断:只有 Provider 级失败状态码会 trip Provider 熔断器:
(408, 500, 502, 503, 504);不要因为常见账户/Key/模型错误(如大多数401、403或429场景)而 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()会清除testStatus、rateLimitedUntil、错误字段和backoffLevel。
默认连接冷却行为(以 constants.ts 的PROVIDER_PROFILES为准):
- OAuth 基础冷却:
5000ms(transientCooldown)。 - API Key 基础冷却:
3000ms(transientCooldown)。 - API Key 遇到
429时应优先遵循上游重试指示(Retry-After、reset 头或可解析的 reset 文本)。 - 反复的可恢复失败使用指数退避:
baseCooldownMs * 2 ** failureIndex;防惊群(anti-thundering-herd)硬守卫会阻止同一连接上的并行失败叠加冷却或翻倍backoffLevel。
终端状态不是冷却:banned、expired、credits_exhausted在有意的状态保持为不可用,直到凭据/设置变更或操作员重置。不要用临时冷却状态覆盖终端状态。
Model Lockout(模型锁定)
作用域:Provider + 连接 + 模型。
目的:当仅某个模型不可用或被配额限制时,避免禁用整个连接。
示例:
- 按模型计配额的 Provider 返回
429。 - 本地 Provider 对缺失模型返回
404。 - Provider 特有的模式/模型许可失败,如特定 Grok 模式。
Model Lockout 位于open-sse/services/accountFallback.ts,允许同一连接继续服务其他模型。它默认关闭(src/lib/resilience/settings.ts中enabled: 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
- ESLint:
no-eval、no-implied-eval、no-new-func= 全仓库错误;no-explicit-any=open-sse/和tests/内为警告 - TypeScript:
strict: 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.ts的resolvePublicCred()嵌入——绝不作为字符串字面量。强制模式见 PUBLIC_CREDS.md - 错误响应(HTTP/SSE/Executor/MCP handler):必须通过
open-sse/utils/error.ts的buildErrorBody()或sanitizeErrorMessage()——绝不在响应体里放原始err.stack或err.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
- 在
src/shared/constants/providers.ts注册(加载时经 Zod 验证) - 如需自定义逻辑,在
open-sse/executors/添加 executor(继承BaseExecutor) - 若非 OpenAI 格式,在
open-sse/translator/添加 translator - 若基于 OAuth,在
src/lib/oauth/constants/oauth.ts添加 OAuth 配置——如果上游 CLI 提供公共 client_id/secret,通过resolvePublicCred()嵌入(见 PUBLIC_CREDS.md),绝不作为字面量 - 在
open-sse/config/providerRegistry.ts注册模型 - 在
tests/unit/编写测试(若新增嵌入式默认值,需包含 publicCreds 大小确认)
新增一个 API 路由
- 在
src/app/api/v1/your-route/下创建目录 - 创建带
GET/POSThandler 的route.ts - 遵循模式:CORS → Zod body 验证 → 可选认证 → Handler 委托
- Handler 放在
open-sse/handlers/(从那里 import,不要内联) - 错误响应使用
open-sse/utils/error.ts的buildErrorBody()/errorResponse()(自动 sanitize——绝不把原始err.stack/err.message放进 body)。见 ERROR_SANITIZATION.md - 添加测试——至少包含一个断言错误响应不泄漏堆栈(
!body.error.message.includes("at /"))
新增一个 DB 模块
- 创建
src/lib/db/yourModule.ts——从./core.ts导入getDbInstance - 为领域表导出 CRUD 函数
- 如需新表,在
src/lib/db/migrations/添加迁移 - 从
src/lib/localDb.ts再导出(仅加入再导出列表) - 编写测试
新增一个 MCP 工具
- 在
open-sse/mcp-server/tools/添加工具定义:Zod 输入 schema + async handler - 注册到工具集(由
createMcpServer()组装) - 分配到合适的作用域
- 编写测试(工具调用记录在
mcp_audit表)
新增一个 A2A 技能
- 在
src/lib/a2a/skills/创建技能(已存在 5 个:smart-routing、quota-management、provider-discovery、cost-analysis、health-report) - 技能接收任务上下文(消息、元数据)→ 返回结构化结果
- 在
src/lib/a2a/taskExecution.ts的A2A_SKILL_HANDLERS注册 - 在
src/app/.well-known/agent.json/route.ts发布(agent card) - 在
tests/unit/编写测试 - 在 A2A-SERVER.md 的技能表中补充文档
新增一个 Cloud Agent
- 在
src/lib/cloudAgent/agents/创建继承CloudAgentBase的 Agent 类(已存在 3 个:codex-cloud、devin、jules) - 实现
createTask、getStatus、approvePlan、sendMessage、listSources - 在
src/lib/cloudAgent/registry.ts注册 - 如需 OAuth/凭据管理,添加到
src/lib/oauth/providers/ - 编写测试 + 在 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 可选值:db、sse、oauth、dashboard、api、cli、docker、ci、mcp、a2a、memory、skills
Husky 钩子:
- pre-commit:lint-staged +
check-docs-sync+check:any-budget:t11 - pre-push:
npm 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-sse→open-sse/,@omniroute/open-sse/*→open-sse/* - 默认端口:20128(API 与仪表盘同端口)
- 数据目录:
DATA_DIR环境变量,默认~/.omniroute/ - 核心环境变量:
PORT、JWT_SECRET、API_KEY_SECRET、INITIAL_PASSWORD、REQUIRE_API_KEY、APP_LOG_LEVEL - 初始化:
cp .env.example .env,然后生成JWT_SECRET(openssl rand -base64 48)和API_KEY_SECRET(openssl rand -hex 32)
硬性规则清单
- 绝不提交机密或凭据
- 绝不在
localDb.ts添加逻辑 - 绝不使用
eval()/new Function()/隐式 eval - 绝不直接提交到
main - 绝不在路由中写原始 SQL——使用
src/lib/db/模块 - 绝不静默吞掉 SSE 流中的错误
- 始终用 Zod schema 验证输入
- 修改生产代码时始终附带测试
- 覆盖率必须 ≥75%(语句、行、函数)/≥70%(分支)。当前实测约 82%
- 未经操作员明确许可,绝不绕过 Husky 钩子(
--no-verify、--no-gpg-sign) - 绝不将公共上游 OAuth client_id/secret 或 Firebase Web key 作为字符串字面量嵌入——始终通过
resolvePublicCred()(open-sse/utils/publicCreds.ts)。见 PUBLIC_CREDS.md - 绝不在 HTTP/SSE/Executor 响应中返回原始
err.stack/err.message——始终通过buildErrorBody()或sanitizeErrorMessage()(open-sse/utils/error.ts)。见 ERROR_SANITIZATION.md - 绝不在
exec()/spawn()中字符串插值外部路径或运行时值——改用env选项传入。参考:src/mitm/cert/install.ts::updateNssDatabases - 绝不忽略 CodeQL/Secret-Scanning 警告:(a) 先查阅上述模式文档判断是否适用,(b) 在忽略注释中记录技术理由。先例:
js/stack-trace-exposure在调用点经sanitizeErrorMessage()路由后判定为已知 CodeQL 限制(无法识别自定义 sanitizer),引用 ERROR_SANITIZATION.md 标记为 false positive - 绝不公开会 spawn 子进程的路由(
/api/mcp/、/api/cli-tools/runtime/),除非在src/server/authz/routeGuard.ts的isLocalOnlyPath()分类中。回环强制在任何认证检查之前无条件发生——经隧道泄漏的 JWT 不能触发进程 spawn。见 ROUTE_GUARD_TIERS.md - 绝不包含署名给 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 Agent | docs/frameworks/CLOUD_AGENT.md |
| Guardrails(PII/注入/视觉) | docs/security/GUARDRAILS.md |
| 公共上游凭据(Gemini 等) | docs/security/PUBLIC_CREDS.md |
| 错误消息消毒 | docs/security/ERROR_SANITIZATION.md |
| Evals | docs/frameworks/EVALS.md |
| 合规/审计 | docs/security/COMPLIANCE.md |
| Webhooks | docs/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 参考 + OpenAPI | docs/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),仅供参考