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
本指南基于 OmniRoute 官方代码库文档(英文原版、印尼语版,当前版本 v3.8.51)编写,面向两类读者:准备向 OmniRoute 贡献代码的工程师,以及希望在其上构建集成的开发者。读完本文,你将掌握仓库的完整目录地图、运行时分层(Next.js 应用层 /
open-sse流式引擎工作区)、hub-and-spoke 格式翻译、executor 策略模式、账号回退与组合路由等核心机制,并知道"新增一个 provider / API 路由 / 数据库模块 / MCP 工具"时应该往哪个目录放代码。
1. OmniRoute 是什么:站在客户端与提供商之间的"同声传译"
OmniRoute 是一个运行在AI 客户端(Claude CLI、Codex、Cursor IDE、OpenAI 兼容客户端等)与AI 提供商(Anthropic、Google、OpenAI、AWS、GitHub 等)之间的多提供商代理路由器。它解决的核心痛点是:
不同的 AI 客户端说不同的"语言"(API 格式),不同的提供商也期待不同的"语言"。OmniRoute 在两者之间自动翻译。
可以把它想象成联合国里的同声传译:任何一方可以用自己的语言发言,路由器负责把它转换成对方听得懂的语言。
从仓库证据看,这一"翻译路由器"的角色贯穿始终:open-sse/工作区(npm 包@omniroute/open-sse)拥有独立的translator/(格式转换)、executors/(108 个 provider 专用 HTTP 执行器)、handlers/(请求编排)、services/(80+ 业务服务模块),详见后文各节。
2. 技术栈一览
| 关注点 | 选择 |
|---|---|
| Web 框架 | Next.js 16(App Router、standalone 输出、无全局 middleware) |
| 语言 | TypeScript 6.0+,targetES2022,module: esnext,moduleResolution: bundler |
| 运行时 | Node.js>=22.22.2 <23或>=24.0.0 <27(通过engines与SUPPORTED_NODE_RANGE强制) |
| 数据库 | SQLite(better-sqlite3,单例 + WAL 日志模式) |
| 桌面端 | Electron 41+electron-builder26.10(独立 workspace 位于electron/) |
| 测试 | Node 原生测试运行器(unit/integration)、Vitest(MCP、autoCombo、cache)、Playwright(e2e + protocols-e2e) |
| 构建 | Next.js standalone,经scripts/build/build-next-isolated.mjs |
| 模块系统 | 全 ESM("type": "module") |
| Workspaces | npm workspace,open-sse是唯一子工作区 |
路径别名(见 tsconfig.json):
@/*→src/*@omniroute/open-sse→open-sse/index.ts@omniroute/open-sse/*→open-sse/*
默认 HTTP 端口为20128(API 与仪表盘共享同一进程)。数据目录由环境变量DATA_DIR指定,默认~/.omniroute/。
3. 仓库总体布局
OmniRoute/ ├── src/ Next.js 应用(App Router、libs、domain、server、shared) ├── open-sse/ 流式引擎工作区(@omniroute/open-sse) ├── electron/ 桌面壳(Electron 41 main + preload) ├── bin/ CLI 入口(omniroute、reset-password) ├── tests/ 单元、集成、e2e、protocols-e2e、translator、security、fixtures ├── scripts/ 构建、同步、检查、迁移、运行时辅助脚本 ├── docs/ 公共文档(本文所在目录) ├── public/ 静态资源、PWA manifest、service worker ├── config/ 运行时配置样例 ├── images/ 营销/截图资源 ├── CLAUDE.md Claude Code 的仓库规则 ├── AGENTS.md 面向 Agent 的深层架构参考 ├── package.json v3.8.51,workspace 根 └── tsconfig.json 路径别名 + 核心编译选项4. 核心架构原理:Hub-and-Spoke 翻译
OmniRoute 所有格式翻译都以 OpenAI 格式作为中枢(hub):
客户端格式 → [OpenAI Hub] → 提供商格式 (请求方向) 提供商格式 → [OpenAI Hub] → 客户端格式 (响应方向)这意味着只需要N 个翻译器(每种格式一对),而不是N²(每对格式一个)。从源码看,这一承诺在 open-sse/translator/index.ts 中被严格执行:translateRequest()先尝试"直达路径"(direct translator,例如 Claude→Gemini、非 OpenAI 双边场景),否则回退到 hub-and-spoke 两段式:
Step 1: source → openai(若 source 非 openai) Step 2: openai → target(若 target 非 openai)值得注意的实现细节(源码可证):同一格式直达时translateRequest会跳过转换步骤;而 translateResponse 在流式响应中维护跨 chunk 的state(initState()为每个源格式构建基础状态,OpenAI Responses 还有专门的seq、responseId、函数调用缓冲等字段),并在flush(chunk 为 null)时也把null传给源格式翻译器——这对openai-responses这类需要在终止事件中输出total_tokens的格式至关重要。
5. 模块级详解(open-sse 工作区)
5.1 Config(open-sse/config/)—— 提供商的"唯一事实来源"
所有提供商配置的唯一真源。核心文件与职责如下表:
| 文件 | 用途 |
|---|---|
constants.ts | PROVIDERS对象:每个提供商的 base URL、OAuth 凭据(默认值)、header、默认 system prompt。同时定义HTTP_STATUS、ERROR_TYPES、COOLDOWN_MS、BACKOFF_CONFIG、SKIP_PATTERNS |
credentialLoader.ts | 从data/provider-credentials.json加载外部凭据,合并覆盖到PROVIDERS中硬编码的默认值之上。让密钥远离源码控制,同时保持向后兼容 |
providerModels.ts | 集中式模型注册表:provider 别名 → 模型 ID。提供getModels()、getProviderByAlias()等函数 |
codexInstructions.ts | 注入到 Codex 请求中的系统指令(编辑限制、沙箱规则、审批策略) |
defaultThinkingSignature.ts | Claude 与 Gemini 模型的默认"思考"签名 |
ollamaModels.ts | 本地 Ollama 模型的 schema 定义(名称、大小、家族、量化方式) |
open-sse/config/还包含按格式划分的模型注册表(audioRegistry.ts、embeddingRegistry.ts、imageRegistry.ts、musicRegistry.ts、rerankRegistry.ts、searchRegistry.ts、videoRegistry.ts等)、身份辅助模块(codexIdentity.ts、anthropicHeaders.ts、cliFingerprints.ts)以及云适配器(azureAi.ts、bedrock.ts、watsonx.ts等)。
凭据加载流程:
5.2 Executors(open-sse/executors/)—— Strategy 模式的提供商适配层
Executor 使用Strategy 模式封装"提供商特有逻辑":每个 executor 按需覆写基类方法。基类与主要实现(类图):
当前仓库中 open-sse/executors/ 实际包含108 个 provider 执行器(英文原版文档注明"未列出的 provider 由default.ts用通用 OpenAI 兼容执行器兜底",完整 355 家 provider 目录位于src/shared/constants/providers.ts)。代表性执行器:
| Executor | 提供商 | 主要特化 |
|---|---|---|
base.ts | — | 抽象基类:URL 构建、header、重试逻辑、凭据刷新 |
default.ts | Claude、Gemini、OpenAI、GLM、Kimi、MiniMax 等 | 标准提供商通用 OAuth token 刷新 |
antigravity.ts | Google Cloud Code(Antigravity) | 项目/会话 ID 生成、多 URL 回退、从错误信息解析自定义重试(如 "reset after 2h7m23s") |
cursor.ts | Cursor IDE | 最复杂:SHA-256 checksum 认证、Protobuf 请求编码、二进制 EventStream → SSE 响应解析 |
codex.ts | OpenAI Codex | 注入系统指令、管理思考层级、删除不支持的参数 |
github.ts | GitHub Copilot | 双 token 体系(GitHub OAuth + Copilot token)、模拟 VSCode 请求头 |
kiro.ts | AWS CodeWhisperer(Kiro) | 二进制 AWS EventStream 解析、AMZN 事件帧、token 估算 |
5.3 Handlers(open-sse/handlers/)—— 请求编排层
Handler 是编排层:协调翻译、执行、流式传输与错误处理。核心文件:
| 文件 | 用途 |
|---|---|
chatCore.ts | 中央编排器:完整处理请求生命周期——格式检测 → 翻译 → executor 分发 → 流式/非流式响应 → token 更新 → 错误处理 → 用量记录 |
responsesHandler.ts | OpenAI Responses API 适配器:Responses 格式 → Chat Completions → 送入chatCore→ SSE 再转回 Responses 格式 |
embeddings.ts | 嵌入生成 handler:解析嵌入模型 → 提供商,发送给提供商 API,返回 OpenAI 兼容嵌入响应。支持 6+ 提供商 |
imageGeneration.ts | 图像生成 handler:解析图像模型 → 提供商,支持 OpenAI 兼容模式、Gemini-image(Antigravity)与回退(Nebius),返回 base64 或 URL 图片 |
audioSpeech.ts/audioTranscription.ts | TTS 与 STT |
videoGeneration.ts/musicGeneration.ts | 视频与音乐生成 |
rerank.ts/moderations.ts/search.ts | 重排序、内容审核、联网搜索 |
sseParser.ts/usageExtractor.ts/responseSanitizer.ts | SSE 事件解析、上游 token 统计抽取、剥离提供商噪音字段 |
请求生命周期(chatCore.ts):
5.4 Services(open-sse/services/)—— 支撑业务逻辑
80+ 个服务模块,按关注点划分(节选):
| 关注点 | 文件 |
|---|---|
| Combo 路由 | combo.ts(19 种策略)、comboConfig.ts、comboMetrics.ts、comboAgentMiddleware.ts |
| Auto Combo 引擎 | autoCombo/:engine.ts、scoring.ts、taskFitness.ts、virtualFactory.ts、modePacks.ts、selfHealing.ts等 |
| 弹性/回退 | accountFallback.ts(冷却 + 锁定)、errorClassifier.ts、emergencyFallback.ts、rateLimitManager.ts、accountSelector.ts |
| 配额 | quotaMonitor.ts、quotaPreflight.ts、各*QuotaFetcher.ts、openrouterFreeWindow.ts、antigravityCredits.ts |
| 缓存 | reasoningCache.ts、searchCache.ts、signatureCache.ts、requestDedup.ts |
| 路由智能 | intentClassifier.ts、taskAwareRouter.ts、wildcardRouter.ts、workflowFSM.ts、specificityDetector.ts |
| 模型处理 | model.ts、provider.ts、modelCapabilities.ts、modelDeprecation.ts、modelFamilyFallback.ts、payloadRules.ts |
| Token 与会话 | tokenRefresh.ts、sessionManager.ts、contextManager.ts、systemPrompt.ts、thinkingBudget.ts |
| 压缩 | compression/完整压缩引擎接线 |
| IP / 网络 | ipFilter.ts、webSearchFallback.ts |
Token 刷新去重:tokenRefresh.ts为每个提供商处理 OAuth 刷新(Google、Claude、Codex、GitHub 双 token、Kiro 的 AWS SSO OIDC + Social Auth),并通过refreshPromiseCache对并发请求做 in-flight promise 去重:
账号回退状态机:当提供商返回 429/401/500 时,系统可切换到下一个账号,并施加指数退避冷却:
Combo 模型链:一个 "combo" 把多个provider/model字符串分组,首个失败自动切换下一个:
5.5 Translator(open-sse/translator/)—— 格式翻译引擎
采用自注册插件系统。当前仓库的翻译器构成(英文原版文档):
- 9 个请求翻译器(
translator/request/):antigravity-to-openai、claude-to-gemini、claude-to-openai、gemini-to-openai、openai-responses、openai-to-claude、openai-to-cursor、openai-to-gemini、openai-to-kiro - 9 个响应翻译器(
translator/response/):claude-to-openai、cursor-to-openai、gemini-to-claude、gemini-to-openai、kiro-to-openai、openai-responses、openai-to-antigravity、openai-to-claude等 - 9 个辅助模块(
translator/helpers/):claudeHelper、geminiHelper、maxTokensHelper、openaiHelper、responsesApiHelper、toolCallHelper、schemaCoercion等 - 顶层:
bootstrap.ts、formats.ts、registry.ts、index.ts
自注册插件设计(与源码一致,见 open-sse/translator/index.ts 的bootstrapTranslatorRegistry()与register导出):
// 每个翻译器文件在 import 时调用 register() 注册自己: import { register } from "../registry.js"; register("claude", "openai", translateClaudeToOpenAI); // bootstrap.ts 导入所有翻译器文件,触发注册: import "./request/claude-to-openai.js"; // ← 自注册5.6 Utils(open-sse/utils/)—— 流式原语与提供商辅助
| 文件 | 用途 |
|---|---|
stream.ts | SSE Transform Stream——管道式流式核心。两种模式:TRANSLATE(完整格式翻译)与PASSTHROUGH(规范化 + 用量抽取)。含 chunk 缓冲、用量估算、内容长度跟踪;per-stream 的 encoder/decoder 实例避免共享状态 |
streamHelpers.ts | 底层 SSE 工具:parseSSELine(容忍空白)、hasValuableContent(过滤空 chunk)、fixInvalidId、formatSSE(格式敏感的 SSE 序列化并清理perf_metrics) |
usageTracking.ts | 从任意格式(Claude/OpenAI/Gemini/Responses)抽取 token 用量,按 tool/message 使用独立字符-token 比率估算,并追加安全缓冲(2000 token),过滤格式特有字段,ANSI 彩色控制台输出 |
bypassHandler.ts | 拦截 Claude CLI 的特定模式(标题抽取、预热、计数),不调用任何提供商直接返回伪响应。同时支持流式与非流式。刻意限定在 Claude CLI 范围内 |
networkProxy.ts | 解析指定提供商的出口代理 URL,优先级:提供商特定配置 → 全局配置 → 环境变量(HTTPS_PROXY/HTTP_PROXY/ALL_PROXY)。支持NO_PROXY例外,配置缓存 30 天 |
error.ts | 构建错误响应(OpenAI 兼容格式)、解析上游错误、从错误信息抽取 Antigravity 的重试时间、SSE 错误流式化 |
SSE 流式管道:
请求日志会话结构(翻译中间态可观测):
logs/ └── claude_gemini_claude-sonnet_20260208_143045/ ├── 1_req_client.json ← 客户端原始请求 ├── 2_req_source.json ← 初始转换后 ├── 3_req_openai.json ← OpenAI 中间格式 ├── 4_req_target.json ← 最终目标格式 ├── 5_res_provider.txt ← 提供商 SSE chunk(流式) ├── 5_res_provider.json ← 提供商响应(非流式) ├── 6_res_openai.txt ← OpenAI 中间 chunk ├── 7_res_client.txt ← 面向客户端的 SSE chunk └── 6_error.json ← 错误详情(若有)6. 应用层src/—— Next.js 应用
| 目录 | 用途 |
|---|---|
src/app/ | App Router 页面 + API 路由 |
src/lib/ | 核心库(DB、auth、OAuth、skills、memory 等) |
src/domain/ | 纯领域层(策略、回退、成本、锁定等,无 I/O) |
src/server/ | 仅服务端模块(authz、cors、auth),禁止从客户端组件导入 |
src/shared/ | 类型、常量、校验、契约、工具(跨边界安全) |
src/mitm/ | CLI 集成的中间人代理辅助 |
src/models/ | 本地模型元数据 / 别名 |
src/sse/ | 仍留在src/下的旧版 SSE handler(不在open-sse/) |
src/store/ | 客户端状态存储 |
重要 API 路由组(src/app/api/):auth/、admin/、combos/、compression/、context/、health/、keys/、logs/、mcp/、memory/、models/、oauth/、providers/、rate-limits/、resilience/、sessions/、settings/、skills/、sync/、tunnels/、upstream-proxy/、usage/、v1/(OpenAI 兼容公共 API)、v1beta/(Gemini 风格兼容)、webhooks/等。
/v1/OpenAI 兼容公共 API覆盖完整能力面:chat/completions(主端点)、completions、embeddings、images/{edits,generations}、audio/{speech,transcriptions}、batches、files、moderations、rerank、responses/[...path](Responses API 兜底路由)、search、videos、ws(WebSocket 桥)等。每个路由文件遵循同一模式:
Route → CORS preflight → Zod body 校验 → 可选认证 → API key 策略强制 → handler 委托(open-sse)数据库层src/lib/db/
单例 SQLite(getDbInstance()incore.ts,WAL 日志模式)。规则:绝不在路由或 handler 中写裸 SQL——一律通过这些领域模块。领域模块(每个负责一张或多张表):apiKeys.ts、backup.ts、combos.ts、compression.ts、models.ts、providers.ts、settings.ts、usageHistory.ts、webhooks.ts等 40+ 个。migrations/下存放168 个版本化.sql文件(幂等、事务化),启动时由migrationRunner.ts执行,累计创建 123 张表(含call_logs、routing_decisions、domain_circuit_breakers、semantic_cache、FTS5 内存搜索虚拟表等)。
领域层src/domain/
纯业务逻辑、无 I/O:policyEngine.ts(顶层策略解析)、fallbackPolicy.ts(回退决策树)、costRules.ts(成本计算规则)、lockoutPolicy.ts(模型锁定决策)、comboResolver.ts(组合解析)、modelAvailability.ts(模型可用性检查)、quotaCache.ts(缓存配额决策)等。
7. 主要设计模式总结
- Hub-and-Spoke 翻译:所有格式经 OpenAI 中枢转换。新增一个提供商只需写一对翻译器(到/从 OpenAI),而非 N 对。
- Executor 上的 Strategy 模式:每个提供商有继承
BaseExecutor的特化 executor 类,executors/index.ts的 factory 在运行时选择正确的类(当前 108 个)。 - 自注册插件系统:翻译器模块在 import 时通过
register()自注册。新增翻译器只需创建文件并导入它。 - 指数退避账号回退:提供商返回 429/401/500 时切换下一账号,施加指数冷却(1s → 2s → 4s → 上限 2min)。
- Combo 模型链:一个 "combo" 分组多个
provider/model,首个失败自动切换下一个。 - 带状态流式翻译:响应翻译在 SSE chunk 间维护状态(thinking block 跟踪、tool call 累积、内容块索引),通过
initState()机制实现。 - 用量安全缓冲:向客户端上报的用量额外加 2000 token 缓冲,防止 system prompt 与格式翻译的开销导致客户端触达上下文窗口上限。
8. 支持的格式与提供商
格式(标识符来自open-sse/translator/formats.ts):
| 格式 | 方向 | Identifier |
|---|---|---|
| OpenAI Chat Completions | 源 + 目标 | openai |
| OpenAI Responses API | 源 + 目标 | openai-responses |
| Anthropic Claude | 源 + 目标 | claude |
| Google Gemini | 源 + 目标 | gemini |
| Antigravity | 源 + 目标 | antigravity |
| AWS Kiro | 仅目标 | kiro |
| Cursor | 仅目标 | cursor |
提供商与认证方式(节选):
| 提供商 | 认证方式 | Executor | 主要说明 |
|---|---|---|---|
| Anthropic Claude | API Key 或 OAuth | Default | 使用x-api-keyheader |
| Google Gemini | API Key 或 OAuth | Default | 使用x-goog-api-keyheader |
| Antigravity | OAuth | Antigravity | 多 URL 替换、自定义重试解析 |
| OpenAI | API Key | Default | 标准 Bearer 认证 |
| Codex | OAuth | Codex | 注入系统指令、管理思考 |
| GitHub Copilot | OAuth + Copilot token | Github | 双 token、模拟 VSCode header |
| Kiro (AWS) | AWS SSO OIDC 或 Social | Kiro | 二进制 EventStream 解析 |
| Cursor IDE | Checksum 认证 | Cursor | Protobuf 编码、SHA-256 checksum |
| Qwen / Qoder | OAuth | Default | 标准 / 双 header 认证 |
| OpenRouter | API Key | Default | 标准 Bearer 认证 |
| GLM、Kimi、MiniMax | API Key | Default | Claude 兼容、使用x-api-key |
openai-compatible-* | API Key | Default | 动态:任意 OpenAI 兼容端点 |
anthropic-compatible-* | API Key | Default | 动态:任意 Claude 兼容端点 |
9. 数据流总结(请求管线)
完整管线(对应 docs/architecture/CODEBASE_DOCUMENTATION.md 第 9 节):
客户端请求 → /v1/chat/completions (route.ts) CORS preflight 检查 Zod 校验(shared/validation/schemas.ts 的 chatCompletionsSchema) 认证(extractApiKey + isValidApiKey 或 requireManagementAuth) 策略引擎(src/server/authz/pipeline.ts) Guardrails(PII 掩码、提示注入、vision bridge) → handleChatCore()(open-sse/handlers/chatCore.ts) 缓存检查(语义缓存 + 读取缓存) 限流(rateLimitManager、accountSemaphore) Combo 路由(若模型解析为 combo) comboResolver → 逐 target 循环 → handleSingleModel() translateRequest()(open-sse/translator/request/*) getExecutor(providerId).execute()(open-sse/executors/*) fetch 上游 → 经 accountFallback 重试/退避 translateResponse()(open-sse/translator/response/*) SSE 流或 JSON 响应 若为 Responses API:经 open-sse/transformer/responsesTransformer.ts 的 TransformStream → 合规审计(src/lib/compliance/) → 响应给客户端流式请求:
非流式请求:
Claude CLI Bypass 流程:
运行时弹性状态(三重机制):
| 机制 | 作用域 | 位置 |
|---|---|---|
| Provider 熔断器 | 整个 provider | src/shared/utils/circuitBreaker.ts,持久化于domain_circuit_breakers表 |
| 连接冷却 | 单个账号/密钥 | src/sse/services/auth.ts的markAccountUnavailable();accountFallback.checkFallbackError()消费 |
| 模型锁定 | Provider + 连接 + 模型 | open-sse/services/accountFallback.ts,持久化于domain_lockout_state表 |
详见 RESILIENCE_GUIDE.md。
10. 如何贡献:四条标准路径
新增一个 Provider
- 在
src/shared/constants/providers.ts注册(加载时经 Zod 校验)。 - 若需要自定义逻辑,在
open-sse/executors/新增 executor(继承BaseExecutor)。 - 若提供商不讲 OpenAI 格式,在
open-sse/translator/新增翻译器。 - 若基于 OAuth,在
src/lib/oauth/providers/与src/lib/oauth/services/增加配置。 - 在
open-sse/config/providerRegistry.ts(或open-sse/config/下按格式划分的注册表)注册模型。 - 在
tests/unit/写测试。
新增一个 API 路由
- 创建
src/app/api/your-route/route.ts。 - 遵循模式:CORS → Zod body 校验 → 认证 → handler 委托。
- 若为新的请求形状,在
src/shared/validation/schemas.ts添加 Zod schema。 - 若仅限管理端,将路径加入
src/shared/constants/publicApiRoutes.ts(公共 API 面的 denylist)。 - 在
tests/unit/添加测试。 - 更新
docs/reference/API_REFERENCE.md与docs/openapi.yaml。
新增一个 DB 模块
- 创建
src/lib/db/yourModule.ts,从./core.ts导入getDbInstance()。 - 为你的领域导出 CRUD 函数。
- 若需新表:在
src/lib/db/migrations/添加迁移文件(顺序编号、幂等、事务化)。 - 调用方直接从
@/lib/db/yourModule导入(旧版localDb.tsre-export 层已移除,禁止 barrel-import)。 - 在
tests/unit/添加测试。
新增一个 MCP 工具
- 在
open-sse/mcp-server/tools/添加工具定义(或扩展open-sse/mcp-server/schemas/tools.ts)。 - 在
src/shared/constants/mcpScopes.ts分配相应 scope。 - 在
open-sse/mcp-server/server.ts注册工具。 - 在
open-sse/mcp-server/__tests__/添加测试。 - 更新 MCP-SERVER.md。
当前
open-sse/mcp-server/提供110 个唯一工具、3 种传输(stdio、HTTP Streamable、SSE)与33 个运行时强制 scope(基础列表见src/shared/constants/mcpScopes.ts),审计表mcp_tool_audit记录调用。完整目录见 MCP-SERVER.md。
11. 工程规范与硬性规则
编码风格:2 空格缩进、双引号、100 字符行宽、分号、es5 尾逗号(Prettier + lint-staged 强制)。导入顺序:外部 → 内部(@/、@omniroute/open-sse)→ 相对。命名:文件camelCase或kebab-case,组件PascalCase,常量UPPER_SNAKE。提交:Conventional Commits,允许 scope:db、sse、oauth、dashboard、api、cli、docker、ci、mcp、a2a、memory、skills。分支:feat/、fix/、refactor/、docs/、test/、chore/前缀,禁止直接提交main。
硬性规则(源自 CLAUDE.md):
- 绝不提交密钥或凭据。
- 禁止 barrel-import,直接使用具体
src/lib/db/*模块。 - 绝不用
eval()/new Function()/ 隐含 eval。 - 绝不直接提交
main。 - 绝不在路由中写裸 SQL,一律走
src/lib/db/模块。 - 绝不在 SSE 流中静默吞错。
- 一律用 Zod schema 校验输入。
- 修改生产代码必须带测试。
- 覆盖率必须保持 ≥ 60%(statements、lines、functions、branches)。
Husky 钩子:pre-commit 运行lint-staged+check:docs-sync+check:any-budget:t11;pre-push 运行check:any-budget:t11+check:tracked-artifacts(快速门禁,不含test:unit)。
测试命令(见 package.json):
| 命令 | 运行内容 |
|---|---|
npm run test:unit | 全部tests/unit/*.test.ts(Node 测试运行器,并发 10) |
npm run test:vitest | Vitest 套件(MCP、autoCombo、cache) |
npm run test:e2e | Playwright UI 套件 |
npm run test:protocols:e2e | MCP + A2A 协议 e2e |
npm run test:coverage | 覆盖率门禁(≥60% lines/statements/functions/branches) |
node --import tsx/esm --test tests/unit/<file>.test.ts | 单文件运行 |
12. 延伸阅读
- ARCHITECTURE.md — 高层架构与各子系统设计动机
- API_REFERENCE.md — 公共与管理 API 参考
- FEATURES.md — 功能矩阵与版本亮点
- RESILIENCE_GUIDE.md — 熔断器、冷却、锁定深入解析
- AUTO-COMBO.md — Auto Combo 评分与策略
- MCP-SERVER.md — 完整 MCP 工具目录与传输
- A2A-SERVER.md — A2A 协议技能与发现
- COMPRESSION_GUIDE.md — RTK + Caveman 压缩
- TROUBLESHOOTING.md — 常见运维问题
- CONTRIBUTING.md — 贡献者工作流
- AGENTS.md — 供 Agent 使用的深层架构参考
- CLAUDE.md — Claude Code 仓库规则(诸多约定的权威来源)
本文基于仓库文档与源码撰写,其中源码路径、文件与目录结构均以当前仓库实际内容为准(版本 v3.8.51)。各链接可直接在仓库中继续深入阅读对应实现。
【免费下载链接】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),仅供参考