ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

OmniRoute 贡献者指南:本地环境搭建、测试体系与新增 Provider 的六步流程

OmniRoute 贡献者指南:本地环境搭建、测试体系与新增 Provider 的六步流程 OmniRoute 贡献者指南本地环境搭建、测试体系与新增 Provider 的六步流程【免费下载链接】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本文基于 OmniRoute 仓库的贡献文档docs/i18n/de/CONTRIBUTING.md其内容与根目录 CONTRIBUTING.md 同源的开发者贡献规范完整梳理参与该项目开发的整套工作流从 Node.js 环境准备、环境变量配置与本地启动到 Git 分支策略、多层测试体系与 60% 覆盖率门禁再到新增一个 AI Provider 所必须经过的六个落地步骤常量注册 → Executor → Translator → OAuth → 模型注册 → 测试。读完本文你可以在本地把 OmniRoute 跑起来Dashboard 与/v1API理解其测试与覆盖率约束并独立完成一次符合规范的新 Provider 贡献。一、环境准备与本地运行1.1 前置依赖贡献文档给出的环境要求如下Node.js文档标注 18 24推荐 22 LTS注意当前仓库 package.json 的engines字段已收紧为22.22.2 23 || 24.0.0 27以仓库实际声明为准npm10Git。1.2 克隆与安装git clone https://github.com/diegosouzapw/OmniRoute.git cd OmniRoute npm install1.3 环境变量仓库提供 .env.example 模板开发环境从模板复制后需生成两个核心密钥# Create your .env from the template cp .env.example .env # Generate required secrets echo JWT_SECRET$(openssl rand -base64 48) .env echo API_KEY_SECRET$(openssl rand -hex 32) .env开发阶段的关键变量如下变量开发默认值说明PORT20128服务端口NEXT_PUBLIC_BASE_URLhttp://localhost:20128前端基础 URLJWT_SECRET需按上文生成JWT 签名密钥INITIAL_PASSWORDCHANGEME首次登录密码APP_LOG_LEVELinfo日志详细级别1.4 Dashboard 设置Dashboard 提供了一组 UI 开关可覆盖同名环境变量对应的功能默认值设置位置开关说明Settings → AdvancedDebug Mode开启调试请求日志UI 侧Settings → GeneralSidebar Visibility显示/隐藏侧边栏分区从文档说明看这类设置持久化在数据库SQLite中重启后依然生效并且一旦显式设置就会覆盖环境变量默认值。1.5 本地运行以下命令均与 package.json 中scripts定义一一对应可直接复制使用# Development mode (hot reload) npm run dev # Production build npm run build npm run start # Common port configuration PORT20128 NEXT_PUBLIC_BASE_URLhttp://localhost:20128 npm run dev启动后的默认访问地址Dashboardhttp://localhost:20128/dashboardAPIhttp://localhost:20128/v1二、Git 工作流文档硬性约束永远不要直接向main提交一切变更必须走功能分支。git checkout -b feat/your-feature-name # ... make changes ... git commit -m feat: describe your change git push -u origin feat/your-feature-name # Open a Pull Request on GitHub2.1 分支命名前缀前缀用途feat/新功能fix/缺陷修复refactor/代码重构docs/文档变更test/测试补充/修复chore/工具链、CI、依赖2.2 Commit 消息规范遵循 Conventional Commits 风格feat: add circuit breaker for provider calls fix: resolve JWT secret validation edge case docs: update SECURITY.md with PII protection test: add observability unit tests refactor(db): consolidate rate limit tables文档列出的常用 scopedb、sse、oauth、dashboard、api、cli、docker、ci、mcp、a2a、memory、skills。三、测试体系命令、覆盖率门禁与 PR 要求3.1 常用测试命令贡献文档给出的测试入口如下已对照 package.json 脚本逐一核实# All tests (unit vitest ecosystem e2e) npm run test:all # Single test file (Node.js native test runner — most tests use this) node --import tsx/esm --test tests/unit/your-file.test.ts # Vitest (MCP server, autoCombo, cache) npm run test:vitest # E2E tests (requires Playwright) npm run test:e2e # Protocol clients E2E (MCP transports, A2A) npm run test:protocols:e2e # Ecosystem compatibility tests npm run test:ecosystem # Coverage (60% min statements/lines/functions/branches) npm run test:coverage npm run coverage:report # Lint format check npm run lint npm run check其中npm run test即npm test实际通过 Node.js 原生测试运行器执行tests/unit/下全部*.test.ts与*.test.mjs并注入tsx/esm、SSE polyfill 与数据目录隔离等加载器npm run test:all则是 unit vitest ecosystem e2e 的全链路组合。3.2 覆盖率规则文档对覆盖率给出了明确约束npm run test:coverage度量主单元测试套件的源码覆盖率排除tests/**包含open-sse/**PR 必须让覆盖率门禁保持在statements / lines / functions / branches 四项 60% 以上。这一点可以在package.json中对应脚本的参数里直接验证--check-coverage --statements 60 --lines 60 --functions 60 --branches 60若 PR 改动了src/、open-sse/、electron/或bin/下的生产代码必须在同一 PR 中新增或更新自动化测试npm run coverage:report打印最近一次覆盖率运行的逐文件明细npm run test:coverage:legacy保留旧口径指标用于历史对比分阶段覆盖率改进路线图见 docs/ops/COVERAGE_PLAN.md。3.3 PR 前置要求提交 PR 前需要运行npm run test:unit与npm run test:coverage确认覆盖率门禁四项指标均在 60% 以上生产代码有变更时在 PR 描述中列明改动或新增的测试文件若 CI 配置了项目 secrets检查 PR 上的 SonarQube 结果。文档同时列举了单元测试覆盖的核心面Provider 转换器与格式转换、限流/熔断/韧性、语义缓存/幂等/进度跟踪、数据库操作与 schema、OAuth 与认证、Zod v4 API 校验、MCP 工具与 scope 强制、Memory 与 Skills 系统。需要说明的是文档写作时标注122 个单元测试文件而当前仓库tests/unit/目录已扩展到数千个.test.ts文件测试规模随版本持续扩张以上命令在任意时点均适用。四、代码风格约定ESLint提交前运行npm run lintPrettier通过lint-staged在提交时自动格式化2 空格缩进、分号、双引号、100 字符行宽、es5 尾逗号TypeScriptsrc/全部使用.ts/.tsxopen-sse/使用.ts/.js公共函数与接口需用 TSDocparam、returns、throws注释禁止eval()ESLint 强制no-eval、no-implied-eval、no-new-func三条规则Zod 校验所有 API 输入校验必须使用 Zod v4 schema命名文件用 camelCase/kebab-case组件 PascalCase常量 UPPER_SNAKE。五、项目结构速览贡献文档给出的目录地图以当前仓库实际布局为准src/ # TypeScript (.ts / .tsx) ├── app/ # Next.js App Router │ ├── (dashboard)/ # Dashboard 页面 │ ├── api/ # API 路由 │ └── login/ # 认证页面 (.tsx) ├── domain/ # 策略引擎 (policyEngine, comboResolver, costRules 等) ├── lib/ # 核心业务逻辑 (.ts) │ ├── a2a/ # Agent-to-Agent 协议服务 │ ├── acp/ # Agent Communication Protocol 注册表 │ ├── compliance/ # 合规策略引擎 │ ├── db/ # SQLite 数据层领域模块 迁移 │ ├── memory/ # 持久化会话记忆 │ ├── oauth/ # OAuth 提供商、服务与工具 │ ├── skills/ # 可扩展技能框架 │ ├── usage/ # 用量统计与成本计算 │ └── localDb.ts # 仅做再导出 —— 严禁在此添加逻辑 ├── middleware/ # 请求中间件 (promptInjectionGuard) ├── mitm/ # MITM 代理 (证书、DNS、目标路由) ├── shared/ │ ├── components/ # React 组件 (.tsx) │ ├── constants/ # Provider 定义、MCP scopes、路由策略 │ ├── utils/ # 熔断器、sanitizer、认证辅助 │ └── validation/ # Zod v4 schemas └── sse/ # SSE 代理管线 open-sse/ # omniroute/open-sse workspace ├── executors/ # 各 Provider 的执行器实现模块 ├── handlers/ # 请求处理器 (chat, responses, embeddings, images 等) ├── mcp-server/ # MCP server ├── services/ # 顶层服务 (combo, autoCombo, rateLimitManager 等) ├── translator/ # 格式转换 (OpenAI ↔ Claude ↔ Gemini ↔ Responses ↔ Ollama) ├── transformer/ # Responses API 变换器 └── utils/ # 工具模块 (stream, TLS, proxy, logging) electron/ # Electron 桌面应用 (跨平台) tests/ ├── unit/ # Node.js 原生测试运行器 ├── integration/ # 集成测试 ├── e2e/ # Playwright 测试 ├── security/ # 安全测试 ├── translator/ # 转换器专项测试 └── load/ # 负载测试 docs/ # 架构、API 参考、排障、MCP/A2A 等文档当前仓库中open-sse/executors/下已有 190 个执行器模块文件含按 Provider 划分的子目录tests/unit/的测试文件数量为数千级别——两者都远超文档写作时的数字贡献时以目录实际内容为准即可。六、新增一个 Provider六步流程这是贡献文档中最具实操价值的一节每一步都指向了真实的仓库位置下面逐一展开并附上源码级佐证。Step 1注册 Provider 常量在 src/shared/constants/providers.ts 中注册。该文件按认证方式把 Provider 分组导入NOAUTH_PROVIDERS、OAUTH_PROVIDERS、APIKEY_PROVIDERS、WEB_COOKIE_PROVIDERS、UPSTREAM_PROXY_PROVIDERS、CLOUD_AGENT_PROVIDERS等分别来自src/shared/constants/providers/下的分组模块。Zod-validated at module load 并非空话文件末尾会依次对每个分组调用validateProviders(...)约第 322–325 行该校验函数定义在 src/shared/validation/providerSchema.ts其中ProviderSchema基于z.object强制约束id、name、icon、color必须匹配#RRGGBB十六进制正则等字段。也就是说Provider 定义一旦写错模块加载阶段就会直接抛错属于快速失败的防御设计。Step 2添加 Executor需要自定义逻辑时在open-sse/executors/your-provider.ts中创建执行器继承基础执行器。目录中存在 open-sse/executors/base.ts 作为基类还有default/等通用实现从源码结构看大多数 Provider 只需要声明式配置走default路径仅当请求签名、Cookie 管理、设备码流程等逻辑特殊时才需要独立 Executor。Step 3添加 Translator非 OpenAI 格式时在open-sse/translator/下创建请求/响应转换器。该目录包含bootstrap.ts、open-sse/translator/registry.ts转换器注册表以及request/、response/两个子目录分别承载入站请求与出站响应的格式转换OmniRoute 支持在 OpenAI、Claude、Gemini、Responses、Ollama 等协议格式之间互转。Step 4添加 OAuth 配置OAuth 类 Provider在 src/lib/oauth/constants/oauth.ts 中登记凭据并在src/lib/oauth/services/下实现对应服务。当前仓库的src/lib/oauth/providers/下已有 claude、codex、cursor、kimi、kiro、gitlab 等十余个 OAuth 提供商实现可作为模板参考。Step 5注册模型在 open-sse/config/providerRegistry.ts 中添加模型定义。该文件是模型目录的注册入口open-sse/config/目录还包含freeTierCatalog.ts、embeddingRegistry.ts等配套注册表。Step 6添加测试在tests/unit/下编写单元测试至少覆盖三类场景Provider 注册常量与 schema 校验通过请求/响应转换翻译器输入输出正确错误处理上游失败时的降级与错误体。由于 PR 受 60% 覆盖率门禁约束这一步不是可选项而是合并前置条件。七、PR 检查清单与发布流程7.1 PR Checklist贡献文档给出的合并前清单测试通过npm testLint 通过npm run lint构建成功npm run build新增的公共函数与接口补齐 TypeScript 类型无硬编码密钥或兜底值所有输入均经 Zod schema 校验面向用户的变更更新 CHANGELOG相关文档同步更新7.2 发布机制发布由/generate-release工作流托管创建新的 GitHub Release 后包会经由 GitHub Actions 自动发布到 npm。对贡献者而言只需保证 PR 进入发布分支并带上正确的变更记录。八、延伸阅读贡献文档在 Getting Help 一节指向了以下仓库内文档遇到具体问题时可按图索骥架构docs/architecture/ARCHITECTURE.md —— 系统整体架构API 参考docs/reference/API_REFERENCE.md —— 全部端点说明覆盖率路线图docs/ops/COVERAGE_PLAN.md —— 分阶段覆盖率改进计划错误处理范例open-sse/utils/stream.ts 与 open-sse/utils/streamHandler.ts —— SSE 流式错误处理的应用示例。整体来看OmniRoute 的贡献体系以快失败为基调Provider 常量在模块加载期经 Zod 校验、覆盖率门禁卡在 PR 合并前、lint 与类型检查内置于check脚本。对于想深入理解其 Provider 抽象Executor/Translator/Registry 三层或测试门禁实现细节的贡献者上述各节的文件路径就是最短的入口。【免费下载链接】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),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表