news 2026/9/10 12:29:47

OmniRoute 开发者实战指南:从架构分层、三层弹性机制到代码规范的源码级解读

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OmniRoute 开发者实战指南:从架构分层、三层弹性机制到代码规范的源码级解读

OmniRoute 开发者实战指南:从架构分层、三层弹性机制到代码规范的源码级解读

【免费下载链接】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

本指南以仓库内开发者向导 docs/i18n/gu/CLAUDE.md(古吉拉特语版CLAUDE.md)为核心骨架,并结合当前仓库源码(src/open-sse/tests/)逐条核实展开。读者读完后,可以快速掌握 OmniRoute 的代码库分层与请求管线、三类"熔断/冷却"运行时弹性机制的设计与排查方法,以及新 Provider、新 API 路由、新 MCP 工具等常见开发场景的标准操作流程与硬性工程纪律。

OmniRoute 是一个统一的 AI 代理/路由器:一个入口端点,聚合数百家 LLM 提供商,内置自动回退(auto-fallback)与配额感知路由。对开发者而言,真正重要的是理解"代码放哪里、请求怎么走、失败如何分级处理、改了代码必须遵守哪些规则"。本文把CLAUDE.md中零散的工程约定,还原成一份可以照着上手的开发地图。

快速开始:环境与基础命令

仓库使用 npm 作为包管理器,开发服务器默认监听http://localhost:20128(API 与 Dashboard 共用同一端口)。按以下顺序完成首次启动:

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 # 更严格的检查(不允许任何 noImplicitAny 逸出) npm run test:coverage # 单元测试 + 覆盖率门槛(75/75/75/70 — 语句/行/函数/分支) npm run check # lint + 测试 组合 npm run check:cycles # 循环依赖检测

运行测试

项目测试以 Node.js 原生测试运行器为主,Vitest 仅用于 MCP 服务端、autoCombo、缓存等特定子集:

# 单文件测试(Node.js 原生测试运行器 — 覆盖大多数测试) node --import tsx/esm --test tests/unit/your-file.test.ts # Vitest(MCP server、autoCombo、缓存) npm run test:vitest # 全部测试套件 npm run test:all

完整测试矩阵见 CONTRIBUTING.md 的"运行测试"章节;深入架构说明见 AGENTS.md。

代码库分层:一份"地图式"总览

OmniRoute 采用 monorepo 结构,核心目录职责如下(原文表格,补充了实际路径):

层级位置职责
API 路由src/app/api/v1/Next.js 应用路由 — 请求入口
Handlersopen-sse/handlers/请求处理(chat、embeddings 等)
Executorsopen-sse/executors/Provider 专属 HTTP 派发
Translatorsopen-sse/translator/格式转换(OpenAI ↔ Claude ↔ Gemini)
Transformeropen-sse/transformer/响应 API ↔ Chat Completions
Servicesopen-sse/services/Combo 路由、限流、缓存等
Databasesrc/lib/db/110 个顶层 SQLite 领域模块,130 个迁移
Domain/Policysrc/domain/策略引擎、成本规则、回退逻辑
MCP Serveropen-sse/mcp-server/107 个唯一工具,3 种传输(stdio / SSE / Streamable HTTP),32 个作用域
A2A Serversrc/lib/a2a/JSON-RPC 2.0 智能体协议
Skillssrc/lib/skills/可扩展的技能框架
Memorysrc/lib/memory/持续对话记忆

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

说明:文档记录时点提供商数量为 329 家,项目 README 当前宣传口径为 352+ 家,数字随版本持续增长,属正常演进。

请求管线:一次/v1/chat/completions的完整旅程

原文给出了端到端管线,这是理解"为什么每个模块放在哪里"的关键:

Client → /v1/chat/completions (Next.js 路由) → CORS → Zod 校验 → auth? → 策略检查 → Prompt 注入防护 → handleChatCore() [open-sse/handlers/chatCore.ts] → 缓存检查 → 限流 → Combo 路由? → resolveComboTargets() → 每个目标调用 handleSingleModel() → translateRequest() → getExecutor() → executor.execute() → fetch() upstream → 带退避的重试 → 响应翻译 → SSE 流或 JSON → 若为 Responses API: responsesTransformer.ts TransformStream

所有 API 路由遵循一套统一模式:Route → CORS preflight → Zod body 校验 → 可选 auth(extractApiKey/isValidApiKey)→ API 密钥策略执行 → Handler 委托(open-sse)。项目没有全局 Next.js 中间件——横切关注点按路由隔离。

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()。Auto-Combo 的 13 因子评分见 docs/routing/AUTO-COMBO.md,三层弹性详见 docs/architecture/RESILIENCE_GUIDE.md。

三层弹性机制:Provider 熔断 / 连接冷却 / 模型锁定

OmniRoute 拥有三个相互关联但范围不同的"即时失败"机制。调试路由行为时必须分清它们的作用域——用错层级排查会得出错误结论。官方三层弹性示意图见 resilience-3layers.svg(源文件:resilience-3layers.mmd)。

第一层:Provider 电路熔断器(范围:整个 Provider,如glmopenaianthropic

目标:阻止向在 upstream/service 层反复失败的 Provider 继续发送流量,避免一个不健康的 Provider 拖慢每一次请求。

实现落点

  • 核心类:circuitBreaker.ts
  • Chat 网关/执行接线: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

状态机(源码在 circuitBreaker.ts 中由canExecute()/getStatus()驱动):

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

默认值演进:原文记录了经典默认值——OAuth Provider 阈值3、重置超时60s;API-Key Provider 阈值5、重置30s;本地 Provider 阈值2、重置15s。需要特别指出的是,随着连接规模扩大(当前已扩展至 500+ 连接量级),open-sse/config/constants.ts 中的默认值已经上调,并且全部可以通过环境变量覆盖:

  • OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD(默认 8)与OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS(默认 60000)
  • OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD(默认 12)与OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS(默认 30000)
  • OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD(默认 2)与OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS(默认 15000)
  • 另有 Provider 级冷却OMNIROUTE_PROVIDER_BREAKER_*_FAILURE_THRESHOLD/_COOLDOWN_MS,以及自适应熔断参数(DEGRADATION_THRESHOLDMAX_BACKOFF_MULTIPLIER

只有 Provider 级失败状态才应触发 Provider 熔断

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

不要因为常见账号/密钥/模型错误(如大多数401403429场景)触发整个 Provider 熔断——这些通常应落入连接冷却或模型锁定。一个普通的 API-Key Provider403只要不被归类为终端 Provider/账号错误,就应当是"可恢复"的。

懒恢复(lazy recovery):熔断器不使用后台定时器。当OPEN到期后,getStatus()canExecute()getRetryAfterMs()等读操作会在读取时将状态刷新为HALF_OPEN(源码中对应_refreshOpenState()),这样 Dashboard 与 Combo 候选构建器不会把已过期的 Provider 永久排除在外。同时状态支持写入domain_circuit_breakers表并在进程重启后恢复(_restoreFromDb()/_persistToDb()),多次OPEN → HALF_OPEN → OPEN循环会触发重置超时的指数级升级(_effectiveResetTimeout(),上限为resetTimeout * maxBackoffMultiplier)。

第二层:连接冷却(范围:单个 Provider 连接/账号/密钥)

目标:立刻放弃一个坏密钥/坏账号,同时允许同一 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

默认连接冷却行为

  • OAuth 基础冷却:5s
  • API-Key 基础冷却:3s
  • API-Key 的429应优先采纳 upstream 的重试建议(Retry-After、reset 头、或可解析的 reset 文本)
  • 反复的可恢复失败使用指数退避:
baseCooldownMs * 2 ** failureIndex;

源码中markAccountUnavailable()还内置了防惊群(Anti-Thundering Herd)互斥锁src/sse/services/auth.ts中按连接维护的 mutex):如果同一连接已被并发请求标记为不可用,则跳过重复标记,避免重置冷却计时器或重复递增backoffLevel。同时终端状态不能被冷却状态覆盖——bannedexpiredcredits_exhausted必须保持可用状态直至凭证/设置被修改或操作员手动重置。

第三层:模型锁定(范围:Provider + 连接 + 模型)

目标:当只有某个模型不可用或受配额限制时,避免封禁整条连接。

典型触发场景:

  • 按模型计配额的 Provider 返回429
  • 本地 Provider 对缺失模型返回404
  • Provider 特定的模式/模型权限失败(如所选 Grok 模式)

模型锁定位于open-sse/services/accountFallback.ts(内部使用modelLockoutsMap 与recordModelLockoutFailure()),允许同一连接继续服务其他模型。锁定同样采用懒清理(约 15 秒一次过期清理),并区分rate_limitquota_exhaustedtransient等失败类别。

排查指南(原文实操要点)

  • 若某 Provider 的所有密钥都被跳过:检查 Provider 熔断器状态与每条连接的rateLimitedUntil/testStatus
  • 若某 Provider 在重置窗口后仍"永久"被排除:检查代码是否直接读原始state而非使用getStatus()/canExecute()(直接读原始状态会绕过懒恢复)。
  • 若某个 Provider 密钥失败但其他应正常工作:优先排查连接冷却,而不是 Provider 熔断。
  • 若只有单个模型失败:优先排查模型锁定,而不是连接冷却。
  • 若某状态应自我恢复:它必须带有未来时间戳/重置超时,以及能刷新过期状态的读路径;永久状态则需要手动凭证或配置变更。

核心工程规范

代码风格

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

数据库

  • 始终通过src/lib/db/领域模块访问数据——绝不在路由或 handler 中写裸 SQL。
  • 绝不src/lib/localDb.ts添加逻辑(它只是重新导出层)。
  • 绝不localDb.ts中使用 barrel 导入——应导入具体的db/模块。
  • DB 单例:getDbInstance()来自src/lib/db/core.ts(WAL 日志模式)。
  • 迁移:src/lib/db/migrations/——带版本号的 SQL 文件,幂等,在事务中执行。

错误处理

  • 使用 try/catch 配合具体错误类型,用 pino 上下文记录日志。
  • 永远不要在 SSE 流中静默吞掉错误——使用 abort 信号做清理。
  • 返回正确的 HTTP 状态码(4xx/5xx)。

安全基线

  • 绝不使用eval()new Function()或 IMPLIED eval。
  • 所有输入用 Zod schema 校验。
  • 静态凭证加密(AES-256-GCM)。
  • Upstream 头拒绝清单:src/shared/constants/upstreamHeaders.ts——编辑时要保持清理逻辑、Zod schema 与单元测试同步。
  • 公开 upstream 凭证(Gemini/Antigravity/Windsurf 风格的 OAuth client_id/secret 与 Firebase Web 密钥,从公开 CLI 提取):必须通过open-sse/utils/publicCreds.tsresolvePublicCred()嵌入——绝不写成字符串字面量。强制模式见 docs/security/PUBLIC_CREDS.md。
  • 错误响应(HTTP / SSE / executor / MCP handler):必须通过open-sse/utils/error.tsbuildErrorBody()sanitizeErrorMessage()处理——绝不把原始err.stackerr.message放进响应体。详见 docs/security/ERROR_SANITIZATION.md。
  • 带变量拼装的 shell 命令:调用exec()/spawn()时,需要运行时值的参数通过env选项传递(自动 shell 转义)——绝不把不可信/外部路径字符串插值进脚本体(参考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/添加执行器(继承BaseExecutor)。
  3. 若为非 OpenAI 格式,在open-sse/translator/添加翻译器。
  4. 若为 OAuth 型,在src/lib/oauth/constants/oauth.ts添加 OAuth 配置——若 upstream CLI 暴露公开 client_id/secret,通过resolvePublicCred()嵌入(见 docs/security/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 校验 → 可选 auth → handler 委托。
  4. handler 放在open-sse/handlers/(从那里导入,不要内联)。
  5. 错误响应使用open-sse/utils/error.tsbuildErrorBody()/errorResponse()(自动清理——绝不把err.stackerr.message原始放入 body)。详见 docs/security/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. 分配适当作用域(scope)。
  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. 在 docs/frameworks/A2A-SERVER.md 的技能表中记录。

新增云 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. 编写测试并在 docs/frameworks/CLOUD_AGENT.md 记录。

新增 Guardrail / Eval / Skill / Webhook 事件

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

测试体系与 PR 纪律

内容命令
单元测试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): 添加电路熔断器—— 作用域包括:dbsseoauthdashboardapiclidockercimcpa2amemoryskills

Husky 钩子

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

环境与关键配置

  • 运行时:Node.js ≥20.20.2 <21 | ≥22.22.2 <23 | ≥24 <25,ES Modules。
  • TypeScript:5.9+,目标 ES2022,模块 esnext,解析 bundler。
  • 路径别名@/*src/@omniroute/open-sseopen-sse/@omniroute/open-sse/*open-sse/*
  • 默认端口:20128(API + Dashboard 同一端口)。
  • 数据目录DATA_DIR环境变量,默认~/.omniroute/
  • 关键 env varsPORTJWT_SECRETAPI_KEY_SECRETINITIAL_PASSWORDREQUIRE_API_KEYAPP_LOG_LEVEL
  • 初始化cp .env.example .env,然后生成JWT_SECRETopenssl rand -base64 48)与API_KEY_SECRETopenssl rand -hex 32)。

硬性规则清单(Non-Negotiable)

  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. 绝不将公开 upstream OAuth client_id/secret 或 Firebase Web 密钥作为字符串字面量嵌入——始终经resolvePublicCred()open-sse/utils/publicCreds.ts)。见 docs/security/PUBLIC_CREDS.md。
  12. 绝不在 HTTP / SSE / executor 响应中返回原始err.stack/err.message——始终经buildErrorBody()sanitizeErrorMessage()open-sse/utils/error.ts)。见 docs/security/ERROR_SANITIZATION.md。
  13. 绝不将外部路径或运行时值字符串插值进传给exec()/spawn()的 shell 脚本——改用env选项传递。参考src/mitm/cert/install.ts::updateNssDatabases
  14. 绝不未经核对上述模式文档就驳回 CodeQL / Secret-Scanning 告警,且驳回注释中必须写明技术理由(如js/stack-trace-exposure已被sanitizeErrorMessage()处理属于已知的 CodeQL 限制,可参照 docs/security/ERROR_SANITIZATION.md 判定为 false positive)。
  15. 绝不将启动子进程的路由(/api/mcp//api/cli-tools/runtime/)纳入未经src/server/authz/routeGuard.tsisLocalOnlyPath()分类的集合。loopback 执行会在任何 auth 检查之前无条件发生——防止通过隧道泄漏的 JWT 被用于触发进程启动。见 docs/security/ROUTE_GUARD_TIERS.md。
  16. 绝不包含将功劳归于 AI 助手、LLM 或自动化账号的Co-Authored-By尾注(如名字含 "Claude"、"GPT"、"Copilot"、"Bot";邮箱位于anthropic.com/openai.com/ 机器人所有的noreply.github.com)。这类尾注会把提交归属路由到 GitHub 上的机器人账号,掩盖 PR 历史中的真实作者。人类协作者(包括 upstream PR 作者与移植到 OmniRoute 的 issue 报告者)应使用标准Co-authored-by: Name <email>尾注获得署名;upstream 移植工作流(/port-upstream-features/port-upstream-issues)依赖这一点。

参考文档索引

进行任何非平凡改动前,先阅读对应领域的深度文档(路径已统一为仓库根相对路径):

领域文档
仓库导航docs/architecture/REPOSITORY_MAP.md
架构docs/architecture/ARCHITECTURE.md
工程上下文docs/architecture/CODEBASE_DOCUMENTATION.md
Auto-Combo(13 因子评分,19 策略)docs/routing/AUTO-COMBO.md
弹性(3 机制)docs/architecture/RESILIENCE_GUIDE.md
Reasoning Replaydocs/routing/REASONING_REPLAY.md
Skills 框架docs/frameworks/SKILLS.md
记忆系统(FTS5 + Qdrant)docs/frameworks/MEMORY.md
云 Agentdocs/frameworks/CLOUD_AGENT.md
Guardrails(PII / 注入 / 视觉)docs/security/GUARDRAILS.md
公开 upstream 凭证(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
Stealth(TLS / 指纹)docs/security/STEALTH_GUIDE.md
Agent 协议(A2A / ACP / Cloud)docs/frameworks/AGENT_PROTOCOLS_GUIDE.md
MCP Serverdocs/frameworks/MCP-SERVER.md
A2A Serverdocs/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

此外,官方深度文档还有 docs/architecture/ADAPTIVE_ROUTING.md(自适应路由策略)与 docs/routing/ROUTER_BACKENDS.md(路由器后端说明),可配合阅读。

小结

对 OmniRoute 的开发者而言,本文还原的CLAUDE.md工程约定可以浓缩为三句话:请求进src/app/api/v1/,逻辑进open-sse/,数据一律走src/lib/db/领域模块;失败先分清楚是 Provider 熔断、连接冷却还是模型锁定,再决定排查方向;任何生产代码改动都必须携带测试并守住 75/70 覆盖率门槛。遵循这套约定,无论是接入第 330+ 个 Provider、新增 MCP 工具,还是排查诡异的回退行为,都能快速定位到正确的代码层与文档,而不是在数万行代码里漫无目的地搜索。

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 12:23:48

Python构建全链路通知监控系统:从API采集到Prometheus可视化

1. 项目概述&#xff1a;Python驱动的全链路通知监控系统这个基于Python构建的通知监控系统框架&#xff0c;本质上是一个高度自动化的运维告警中枢。它通过API接口实时抓取业务指标数据&#xff0c;经过阈值判断后触发邮件通知&#xff08;集成Outlook服务&#xff09;&#x…

作者头像 李华
网站建设 2026/9/10 12:21:09

基于深度学习的情感分析在智慧养老系统中的应用

简介&#xff1a;这是一份基于情感分析的智慧养老系统深度学习课程设计项目&#xff0c;包含Python源码、设计文档和演示PPT等完整材料&#xff0c;适合计算机相关专业的在校学生、教师或企业员工用于课程设计、期末大作业、毕业设计及项目立项演示。项目由个人大三学期课程设计…

作者头像 李华
网站建设 2026/9/10 12:19:16

Go语言Context取消信号机制解析与实践

1. Go Context 取消信号机制深度解析在Go语言并发编程中&#xff0c;Context就像一位交通警察&#xff0c;它协调着各个goroutine的运行节奏。特别是在微服务架构和分布式系统中&#xff0c;Context的取消信号机制成为了控制请求生命周期的核心枢纽。今天我们就来彻底拆解这个看…

作者头像 李华