尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OmniRoute 弹性网关开发指南:请求管线、三层故障隔离机制与代码库扩展实践

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, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRouteOmniRoute 是一个统一的大模型 AI 网关/路由器一个端点聚合数百家 LLM Provider并提供自动故障转移auto-fallback与组合路由combo routing。本文以仓库根目录的 CLAUDE.md荷兰语本地化版 docs/i18n/nl/CLAUDE.md为骨架面向在 OmniRoute 代码库中开发、调试与扩展的工程师与 AI Agent系统讲解其请求管线、核心的三层弹性运行时Provider 熔断器 / 连接冷却 / 模型锁定以及新增 Provider、API 路由、DB 模块、MCP 工具、A2A Skill 等常见改动场景的完整流程。读完本文你将能够准确地区分 OmniRoute 的三种故障隔离机制的触发范围与恢复语义读懂熔断与冷却的判定代码并遵循仓库的工程约定安全地提交改动。一、快速上手启动、构建与测试1.1 标准命令集OmniRoute 仓库的日常开发命令如下npm install会自动从.env.example生成.envnpm 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 — statements/lines/functions/branches npm run check # lint test 合并执行 npm run check:cycles # 检测循环依赖1.2 运行测试的三种方式仓库同时使用 Node.js 原生测试运行器绝大多数测试与 VitestMCP-server、autoCombo、cache 相关# 单个测试文件Node.js 原生测试运行器 node --import tsx/esm --test tests/unit/your-file.test.ts # Vitest 套件MCP-server、autoCombo、cache npm run test:vitest # 全部测试套件 npm run test:all完整的测试矩阵见 CONTRIBUTING.md 中的 Tests Uitvoeren运行测试章节深入的架构分析见 AGENTS.md。二、项目全景代码仓库分层OmniRoute 的架构核心是一个端点、多 Provider、自动回退。按文档记录其组成层级如下各层职责在代码仓库中均有对应目录层级位置职责API Routessrc/app/api/v1/Next.js App Router 层外部请求的访问入口Handlersopen-sse/handlers/请求处理chat、embeddings 等Executorsopen-sse/executors/Provider 特有的 HTTP 分发逻辑Translatorsopen-sse/translator/格式转换OpenAI ↔ Claude ↔ GeminiTransformeropen-sse/transformer/Responses API ↔ Chat Completions 应答转换Servicesopen-sse/services/Combo 路由、速率限制、缓存等核心服务Databasesrc/lib/db/110 个顶层 SQLite 领域模块、130 个迁移Domein/Beleid领域/策略src/domain/策略引擎、成本规则、回退逻辑MCP Serveropen-sse/mcp-server/107 个独立工具、3 种传输stdio / SSE / Streamable HTTP、32 个 scopeA2A Serversrc/lib/a2a/JSON-RPC 2.0 智能体协议Vaardigheden技能src/lib/skills/可扩展技能框架Geheugen记忆src/lib/memory/持久化对话记忆仓库本身是 monorepo 结构src/Next.js 16 应用、open-sse/流式引擎 workspace、electron/桌面应用、tests/、bin/CLI 入口。三、请求管线一次 /v1/chat/completions 的完整旅程所有请求都会经过一条一致的处理管线从客户端请求到流式响应Client → /v1/chat/completions (Next.js route) → CORS → Zod 校验 → auth? → 策略检查 → 提示注入保护 → handleChatCore() [open-sse/handlers/chatCore.ts] → 缓存检查 → 速率限制 → combo 路由? → resolveComboTargets() → 每个目标调用 handleSingleModel() → translateRequest() → getExecutor() → executor.execute() → fetch() 上游请求 → 带 backoff 的重试 → 响应转换 → SSE 流或 JSON → 若为 Responses APIresponsesTransformer.ts 的 TransformStreamAPI 路由遵循统一模式Route → CORS preflight → Zod body 校验 → 可选 authextractApiKey/isValidApiKey→ API Key 策略强制 → handler 委托open-sse。值得注意的是仓库不使用全局 Next.js middleware所有拦截都是路由级别的。Combo 组合路由open-sse/services/combo.ts提供了 19 种公开策略priority优先级、weighted加权、fill-first、round-robin、p2cPower of Two Choices、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。四、核心主题三层弹性运行时Resilience Runtime这是整个代码库中最关键、也最容易被混淆的部分。OmniRoute 对瞬时故障有三个相关但不同的机制调试路由行为时必须严格区分它们的作用范围OmniRoute 三层弹性机制示意图4.1 第一层Provider 熔断器Circuit Breaker作用范围整个 Provider例如glm、openai、anthropic。目的当某个 Provider 在上游/服务层面反复失败时停止向其发送流量避免一个不健康的 Provider 拖慢每一次请求。实现位置均可在仓库中验证核心类src/shared/utils/circuitBreaker.tsChat gate/执行接线src/sse/handlers/chatHelpers.ts、src/sse/handlers/chat.ts运行时状态 APIsrc/app/api/monitoring/health/route.ts共享封装open-sse/services/accountFallback.ts持久化状态表domain_circuit_breakers状态机源码中的STATE常量CLOSED正常通行。DEGRADED失败率升高请求仍放行但会记录告警日志这是 circuitBreaker.ts 中相对文档的增强默认在达到熔断阈值 60% 时进入降级态即degradationThreshold。OPENProvider 被临时屏蔽调用方收到 provider-circuit-open 响应或 combo 路由跳过该目标转向其他目标。HALF_OPENresetTimeout已到期允许放行一个探测请求。探测成功则关闭熔断器失败则重新打开。默认阈值与重置窗口文档记录的经典默认值出自open-sse/config/constants.tsOAuth Provider阈值3重置超时60s。API Key Provider阈值5重置超时30s。本地 Provider阈值2重置超时15s。需要说明的是当前 open-sse/config/constants.ts 中PROVIDER_PROFILES的实际默认值已经演进为OAuth 阈值8重置60000ms、API Key 阈值12重置30000ms、本地阈值2重置15000ms并且所有阈值、失败窗口、冷却时间均支持通过OMNIROUTE_CIRCUIT_BREAKER_*与OMNIROUTE_PROVIDER_BREAKER_*系列环境变量覆盖运维无需重新编译即可调节敏感度。调试时请以当前环境的实际配置为准。熔断器只应由 Provider 级别的错误状态触发(408, 500, 502, 503, 504);不要因为普通的账户/密钥/模型错误如绝大多数401、403、429触发整个 Provider 的熔断——这些错误通常应归属于连接冷却connection cooldown或模型锁定model lockout。例如一个通用 API Key Provider 返回的403应当可以自然恢复除非它被分类为终态的 Provider/账户错误。源码中的熔断器还有几个值得注意的实现细节circuitBreaker.ts惰性恢复lazy recovery熔断器不使用后台定时器。当OPEN超时后像getStatus()、canExecute()、getRetryAfterMs()这样的读取路径会在被调用时把状态刷新为HALF_OPEN从而保证 dashboard 和 combo 候选构建器不会永远把已过期的 Provider 排除在外。自适应退避resetTimeout会随打开→探测→再打开的循环次数指数级放大上限为maxBackoffMultiplier默认 16 倍防止故障 Provider 反复干扰路由。按失败类型计数kindFailureCounts允许对不同FailureKind如rate_limit、quota_exhausted、transient设置独立阈值关键失败类型甚至可以配置immediateOpen直接跳过DEGRADED立即熔断。状态持久化熔断状态通过 domainState 持久化到domain_circuit_breakers表进程重启后可恢复同时注册表设有 500 个条目的上限与 5 分钟一次的闲置清理扫描避免高基数熔断器名长期占用内存。本地执行错误隔离isLocalExecutionError()与isLocalStreamLifecycleError()会把ENOENT/EACCES/EPIPE等本地主机执行错误以及客户端中止AbortError识别为非Provider 故障避免网关自身桥接层的 bug 或用户主动断开导致整个 Provider 被拉黑。4.2 第二层连接冷却Connection Cooldown作用范围单条 Provider 连接 / 账户 / 密钥。目的暂时跳过一条坏密钥/坏账户同时同一 Provider 的其他连接继续正常服务请求。实现位置写入/更新路径src/sse/services/auth.ts::markAccountUnavailable()账户选择/过滤src/sse/services/auth.ts::getProviderCredentials...冷却计算open-sse/services/accountFallback.ts 的checkFallbackError()配置项src/lib/resilience/settings.tsProvider 连接上的关键字段rateLimitedUntil; testStatus: unavailable; lastError; lastErrorType; errorCode; backoffLevel;账户选择阶段连接在以下条件成立时被跳过new Date(rateLimitedUntil).getTime() Date.now();冷却同样是惰性的当rateLimitedUntil已过期连接会重新进入候选池。成功使用后clearAccountError()会清空testStatus、rateLimitedUntil、错误字段与backoffLevel见 auth.ts 的clearAccountError。连接冷却的默认行为OAuth 基础冷却5s源码中oauth.transientCooldown 5000。API Key 基础冷却3s源码中apikey.transientCooldown 3000。API Key 收到429时应优先采纳上游重试提示Retry-After头、X-RateLimit-Reset头或响应体中可解析的重置时间文本源码parseResetFromHeaders()支持秒数与 HTTP 日期两种Retry-After格式getUpstreamRetryHint()会依次尝试 header → JSON body → 错误文本。反复出现的可恢复错误使用指数退避baseCooldownMs * 2 ** failureIndex;源码中getScaledCooldown(baseCooldownMs, level 1, maxBackoffSteps)即实现该公式并用maxBackoffSteps封顶退避层级用maxCooldownMs封顶冷却时长。防惊群anti-thundering herd保护markAccountUnavailable为每条连接维护互斥锁auth.ts 中的markMutexes。同一连接上并发到达的失败不会反复延长冷却或对backoffLevel重复加一——若该连接已被并发请求标记为不可用existingCooldownMs Date.now()后续标记会直接跳过。终态不是冷却banned、expired、credits_exhausted等终态应保持不可用直到凭据/配置被修改或运维手动重置。绝不能用临时冷却状态覆盖终态源码isTerminalConnectionStatus()会拦截这类覆盖。4.3 第三层模型锁定Model Lockout作用范围Provider 连接 模型三级粒度。目的当某个连接上的某一个模型不可用或配额受限时避免把整条连接都关停让该连接继续为其他模型服务。典型触发场景按模型计配额的 Provider 对特定模型返回429。本地 Provider 对单个缺失模型返回404。Provider 特有的模式/模型权限错误例如被选中的 Grok 模式。模型锁定实现在 open-sse/services/accountFallback.tsrecordModelLockoutFailure/hasPerModelQuota/isModelLockedOut等内存中维护modelLockouts映射并带清理与溢出保护。判定时仅当hasPerModelQuota(provider, model, ...)成立才会进入模型级处理确保429/404只作用于单个模型而非整条连接。4.4 三层机制的调试准则文档给出了明确的故障归因决策树是排查路由问题时的第一参考症状优先检查方向某 Provider 所有密钥都被跳过同时检查 Provider 熔断器状态与每条连接的rateLimitedUntil/testStatus重置窗口过后 Provider 仍被永久排除检查代码是否读取了原始state而非getStatus()/canExecute()读取路径未触发惰性恢复只有一条 Provider 密钥失败、其余正常优先归因于连接冷却而非 Provider 熔断器只有某一个模型失败优先归因于模型锁定而非连接冷却某状态本应自愈该状态必须有未来的时间戳/重置超时且读取路径要能刷新过期状态永久状态则需要人工修改凭据或配置从源码看这套归因顺序正是checkFallbackError()的真实判定链路终态deactivated、retired model→ 401/403 类 → 409 绑定错误 → 429 配额 → 4xx/5xx 可重试集合并最终通过reason字段把错误归入熔断器、连接冷却或模型锁定之一。五、工程约定代码风格、数据库与错误处理5.1 代码风格2 空格缩进、分号、双引号、100 字符宽度、ES5 尾逗号由 lint-staged 通过 Prettier 强制。Import 顺序外部 → 内部/、omniroute/open-sse→ 相对路径。命名文件 camelCase/kebab-case组件 PascalCase常量 UPPER_SNAKE。ESLintno-eval、no-implied-eval、no-new-func全局为 errorno-explicit-any在open-sse/与tests/为 warning。TypeScriptstrict: falsetarget ES2022module esnextresolution bundler优先显式类型。5.2 数据库约定始终通过src/lib/db/领域模块访问数据——绝不在路由或 handler 中写裸 SQL。绝不向src/lib/localDb.ts添加逻辑它只是 re-export 层。绝不从localDb.ts做 barrel import——应导入具体的db/模块。DB 单例getDbInstance()来自src/lib/db/core.tsWAL journaling。迁移src/lib/db/migrations/中的版本化 SQL 文件幂等在事务中执行。5.3 错误处理try/catch 使用具体错误类型用 pino 上下文记录日志。绝不在 SSE 流中吞掉错误——清理应使用 abort 信号。返回正确的 HTTP 状态码4xx/5xx。5.4 安全红线绝不使用eval()、new Function()或隐式 eval。所有输入用 Zod schema 校验。凭据落盘加密AES-256-GCM。上游 header 黑名单src/shared/constants/upstreamHeaders.ts——修改时须同步更新 sanitization、Zod schema 与单元测试。公开上游凭据Gemini / Antigravity / Windsurf 风格、从公开 CLI 提取的 OAuth client_id/secret 与 Firebase Web 密钥必须通过resolvePublicCred()open-sse/utils/publicCreds.ts嵌入绝不写成字符串字面量。详见 docs/security/PUBLIC_CREDS.md。错误响应HTTP / SSE / executor / MCP handler必须经buildErrorBody()或sanitizeErrorMessage()open-sse/utils/error.ts处理——绝不把原始err.stack或err.message放进响应体。详见 docs/security/ERROR_SANITIZATION.md。由变量拼接的 Shell 命令调用exec()/spawn()时若脚本需要运行时值必须通过env选项传递自动做 shell 转义——绝不在脚本体中插值不可信/外部路径。参考实现src/mitm/cert/install.ts::updateNssDatabases。Secure-by-default 优先新增安全敏感表面时优先选用社区维护的 secure-defaults 清单awesome-secure-defaults中列出的成熟库Helmet.js、DOMPurify、ssrf-req-filter、safe-regex、Google Tink 等而非自研实现。六、常见改动场景从 Provider 到 A2A Skill 的扩展向导6.1 新增一个 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()嵌入见 docs/security/PUBLIC_CREDS.md绝不写成字面量。在 open-sse/config/providerRegistry.ts 注册模型。在tests/unit/编写测试若新增了内嵌默认值还需包含 publicCreds 形状断言。6.2 新增一个 API 路由在src/app/api/v1/your-route/下创建目录。创建route.ts实现GET/POSThandlers。遵循统一模式CORS → Zod body 校验 → 可选 auth → handler 委托。Handler 放在open-sse/handlers/从那里 import不要内联。错误响应使用buildErrorBody()/errorResponse()自动净化绝不把err.stack/err.message原样放入 body见 docs/security/ERROR_SANITIZATION.md。添加测试——至少包含一条断言错误响应不泄漏堆栈!body.error.message.includes(at /)。6.3 新增一个 DB 模块创建src/lib/db/yourModule.ts从./core.ts导入getDbInstance。为领域表导出 CRUD 函数。若需要新表在src/lib/db/migrations/添加迁移。从src/lib/localDb.tsre-export只追加到 re-export 列表。编写测试。6.4 新增一个 MCP 工具在open-sse/mcp-server/tools/添加工具定义Zod 输入 schema 异步 handler。在 toolset 中注册由createMcpServer()连接。分配到合适的 scope(s)。编写测试工具调用会记录到mcp_audit表。6.5 新增一个 A2A Skill在src/lib/a2a/skills/创建 skill已有 5 个smart-routing、quota-management、provider-discovery、cost-analysis、health-report。Skill 接收任务上下文消息、元数据→ 返回结构化结果。在src/lib/a2a/taskExecution.ts的A2A_SKILL_HANDLERS注册。在src/app/.well-known/agent.json/route.tsAgent Card暴露。在tests/unit/编写测试。在 docs/frameworks/A2A-SERVER.md 的 skill 表中补充文档。6.6 新增一个 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/。添加测试并在 docs/frameworks/CLOUD_AGENT.md 记录。6.7 新增 Guardrail / Eval / Skill / Webhook 事件Guardrailsrc/lib/guardrails/→ 文档 docs/security/GUARDRAILS.mdEval 套件src/lib/evals/→ 文档 docs/frameworks/EVALS.mdSkill沙箱src/lib/skills/→ 文档 docs/frameworks/SKILLS.mdWebhook 事件src/lib/webhookDispatcher.ts→ 文档 docs/frameworks/WEBHOOKS.md七、参考文档索引进行任何非平凡改动前先阅读对应的深入分析文档领域文档仓库导航docs/architecture/REPOSITORY_MAP.md架构docs/architecture/ARCHITECTURE.md工程参考docs/architecture/CODEBASE_DOCUMENTATION.mdAuto-Combo13 因子评分、19 策略docs/routing/AUTO-COMBO.md弹性3 机制docs/architecture/RESILIENCE_GUIDE.md推理回放docs/routing/REASONING_REPLAY.md技能框架docs/frameworks/SKILLS.md记忆系统FTS5 Qdrantdocs/frameworks/MEMORY.md云智能体docs/frameworks/CLOUD_AGENT.md安全措施PII / 注入 / 幻觉防护docs/security/GUARDRAILS.md公开上游凭据Gemini 等docs/security/PUBLIC_CREDS.md错误信息净化docs/security/ERROR_SANITIZATION.md评测docs/frameworks/EVALS.md合规 / 审计docs/security/COMPLIANCE.mdWebhooksdocs/frameworks/WEBHOOKS.md鉴权管线docs/architecture/AUTHZ_GUIDE.md隐身TLS / 指纹docs/security/STEALTH_GUIDE.md智能体协议A2A / ACP / Clouddocs/frameworks/AGENT_PROTOCOLS_GUIDE.mdMCP Serverdocs/frameworks/MCP-SERVER.mdA2A Serverdocs/frameworks/A2A-SERVER.mdAPI 参考 OpenAPIdocs/reference/API_REFERENCE.md docs/reference/openapi.yamlProvider 目录自动生成docs/reference/PROVIDER_REFERENCE.md发布流程docs/ops/RELEASE_CHECKLIST.md八、测试策略与覆盖率门禁测试类型命令单元测试npm run test:unit单文件node --import tsx/esm --test tests/unit/file.test.tsVitestMCP、autoCombonpm run test:vitestE2EPlaywrightnpm run test:e2e协议 E2EMCPA2Anpm run test:protocols:e2e生态测试npm run test:ecosystem覆盖率门禁npm run test:coverage75/75/75/70 — statements/lines/functions/branches覆盖率报告npm run coverage:reportPR 规则凡修改src/、open-sse/、electron/或bin/中的生产代码必须在同一 PR 中附带或更新测试。测试层级偏好单元测试优先 → 集成测试多模块或 DB 状态→ E2E仅限 UI/工作流。Bug 复现应在修复之前或随修复一起编码为自动化测试。Copilot 覆盖率策略当 PR 修改生产代码且覆盖率低于 75%statements/lines/functions或 70%branches时不只是上报——应补充或更新测试、重新运行覆盖率门禁再请求确认并在 PR 报告中附上执行的命令、修改的测试文件与最终覆盖率结果。当前仓库实测覆盖率约为 82%。九、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 Commitsfeat(db): 添加 circuit breaker——scope 包括db、sse、oauth、dashboard、api、cli、docker、ci、mcp、a2a、memory、skillsHusky hookspre-commitlint-staged check-docs-synccheck:any-budget:t11pre-pushnpm run test:unit十、运行环境运行时Node.js ≥20.20.2 21或 ≥22.22.2 23或 ≥24 25ES Modules。TypeScript5.9target ES2022module esnextresolution bundler。路径别名/*→src/、omniroute/open-sse→open-sse/、omniroute/open-sse/*→open-sse/*。默认端口20128API 与 dashboard 同端口。数据目录DATA_DIR环境变量默认~/.omniroute/。关键环境变量PORT、JWT_SECRET、API_KEY_SECRET、INITIAL_PASSWORD、REQUIRE_API_KEY、APP_LOG_LEVEL。初始化cp .env.example .env然后生成JWT_SECRETopenssl rand -base64 48与API_KEY_SECRETopenssl rand -hex 32。十一、十六条红线规则绝不提交密钥或凭据。绝不向localDb.ts添加逻辑。绝不使用eval()/new Function()/ 隐式 eval。绝不直接提交到main。绝不在路由中写裸 SQL——使用src/lib/db/模块。绝不在 SSE 流中静默吞掉错误。始终用 Zod schema 校验输入。修改生产代码时始终附带测试。覆盖率必须保持 ≥75%statements、lines、functions/ ≥70%branches。未经运维明确批准绝不绕过 Husky hooks--no-verify、--no-gpg-sign。绝不把公开上游 OAuth client_id/secret 或 Firebase Web 密钥写成字符串字面量——始终通过resolvePublicCred()open-sse/utils/publicCreds.ts见 docs/security/PUBLIC_CREDS.md。绝不在 HTTP / SSE / executor 响应中返回原始err.stack/err.message——始终经buildErrorBody()或sanitizeErrorMessage()open-sse/utils/error.ts见 docs/security/ERROR_SANITIZATION.md。绝不把外部路径或运行时值字符串插值进传给exec()/spawn()的 shell 脚本——改用env选项传递。参考src/mitm/cert/install.ts::updateNssDatabases。绝不在未先核对上述模式文档并记录技术理由的情况下忽略 CodeQL / Secret-Scanning 告警。js/stack-trace-exposure对已走sanitizeErrorMessage()的调用点属于已知 CodeQL 限制可标注为 false positive 并引用 docs/security/ERROR_SANITIZATION.md。绝不暴露会启动子进程的路由/api/mcp/、/api/cli-tools/runtime/除非在src/server/authz/routeGuard.ts中已通过isLocalOnlyPath()分类。Loopback 强制在一切 auth 检查之前无条件执行——即使 JWT 经隧道泄漏也无法触发进程启动。见 docs/security/ROUTE_GUARD_TIERS.md。绝不添加将功劳归于 AI 助手 / LLM / 自动化账户的Co-Authored-By尾注如名字含 Claude、GPT、Copilot、Bot或 bot 所有的anthropic.com/openai.com/noreply.github.com邮箱——这类尾注会把提交归属引向 bot 账户掩盖真实作者。人类协作者包括从上游移植到 OmniRoute 的 PR 作者与 issue 报告者可以且应当使用标准Co-authored-by: Name email尾注获得署名上游移植工作流/port-upstream-features、/port-upstream-issues依赖这一机制。结语OmniRoute 的弹性体系用一句话概括就是熔断器管Provider 挂了冷却管这条连接挂了锁定管这个模型挂了。三者范围层层收窄、恢复方式各不相同惰性刷新 vs 时间戳过期 vs 仅限单模型调试时务必先定位故障粒度再对照本文第 4.4 节的决策表选择正确的检查路径。在此基础上结合第 6 节的标准扩展流程与第 11 节的红线规则即可安全、合规地为这个多 Provider 智能网关添加新能力并确保每次改动都通过覆盖率为 75/75/75/70 的质量门禁。【免费下载链接】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, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表