@jsonstudio/rcc 0.89.1348 → 0.89.1457

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +51 -1427
  2. package/dist/build-info.js +2 -2
  3. package/dist/cli/commands/config.js +3 -0
  4. package/dist/cli/commands/config.js.map +1 -1
  5. package/dist/cli/commands/init.js +3 -0
  6. package/dist/cli/commands/init.js.map +1 -1
  7. package/dist/cli/config/bundled-docs.js +2 -2
  8. package/dist/cli/config/bundled-docs.js.map +1 -1
  9. package/dist/cli/config/init-config.d.ts +2 -1
  10. package/dist/cli/config/init-config.js +33 -1
  11. package/dist/cli/config/init-config.js.map +1 -1
  12. package/dist/client/gemini/gemini-protocol-client.js +2 -1
  13. package/dist/client/gemini/gemini-protocol-client.js.map +1 -1
  14. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +39 -15
  15. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  16. package/dist/client/openai/chat-protocol-client.js +2 -1
  17. package/dist/client/openai/chat-protocol-client.js.map +1 -1
  18. package/dist/client/responses/responses-protocol-client.js +2 -1
  19. package/dist/client/responses/responses-protocol-client.js.map +1 -1
  20. package/dist/error-handling/quiet-error-handling-center.js +46 -8
  21. package/dist/error-handling/quiet-error-handling-center.js.map +1 -1
  22. package/dist/manager/modules/quota/provider-quota-daemon.events.js +4 -2
  23. package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -1
  24. package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js +9 -6
  25. package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js.map +1 -1
  26. package/dist/providers/auth/antigravity-userinfo-helper.d.ts +2 -1
  27. package/dist/providers/auth/antigravity-userinfo-helper.js +25 -4
  28. package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
  29. package/dist/providers/auth/tokenfile-auth.d.ts +2 -0
  30. package/dist/providers/auth/tokenfile-auth.js +33 -1
  31. package/dist/providers/auth/tokenfile-auth.js.map +1 -1
  32. package/dist/providers/core/config/camoufox-launcher.d.ts +5 -0
  33. package/dist/providers/core/config/camoufox-launcher.js +5 -0
  34. package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
  35. package/dist/providers/core/config/service-profiles.js +7 -18
  36. package/dist/providers/core/config/service-profiles.js.map +1 -1
  37. package/dist/providers/core/runtime/base-provider.d.ts +0 -5
  38. package/dist/providers/core/runtime/base-provider.js +26 -112
  39. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  40. package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +7 -0
  41. package/dist/providers/core/runtime/gemini-cli-http-provider.js +362 -93
  42. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  43. package/dist/providers/core/runtime/http-request-executor.d.ts +3 -0
  44. package/dist/providers/core/runtime/http-request-executor.js +110 -38
  45. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  46. package/dist/providers/core/runtime/http-transport-provider.d.ts +3 -0
  47. package/dist/providers/core/runtime/http-transport-provider.js +80 -37
  48. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  49. package/dist/providers/core/runtime/rate-limit-manager.d.ts +1 -12
  50. package/dist/providers/core/runtime/rate-limit-manager.js +4 -77
  51. package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -1
  52. package/dist/providers/core/utils/http-client.js +20 -43
  53. package/dist/providers/core/utils/http-client.js.map +1 -1
  54. package/dist/server/handlers/handler-utils.js +5 -1
  55. package/dist/server/handlers/handler-utils.js.map +1 -1
  56. package/dist/server/handlers/responses-handler.js +1 -1
  57. package/dist/server/handlers/responses-handler.js.map +1 -1
  58. package/dist/server/runtime/http-server/index.js +68 -29
  59. package/dist/server/runtime/http-server/index.js.map +1 -1
  60. package/dist/server/runtime/http-server/request-executor.js +50 -6
  61. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  62. package/dist/server/runtime/http-server/routes.js +4 -1
  63. package/dist/server/runtime/http-server/routes.js.map +1 -1
  64. package/dist/utils/strip-internal-keys.d.ts +12 -0
  65. package/dist/utils/strip-internal-keys.js +28 -0
  66. package/dist/utils/strip-internal-keys.js.map +1 -0
  67. package/docs/CHAT_PROCESS_PROTOCOL_AND_PIPELINE.md +221 -0
  68. package/docs/antigravity-gemini-format-cleanup.md +102 -0
  69. package/docs/antigravity-routing-contract.md +31 -0
  70. package/docs/chat-semantic-expansion-plan.md +8 -6
  71. package/docs/glm-chat-completions.md +1 -1
  72. package/docs/servertool-framework.md +65 -0
  73. package/docs/v2-architecture/README.md +6 -8
  74. package/docs/verified-configs/README.md +60 -0
  75. package/docs/verified-configs/v0.45.0/README.md +244 -0
  76. package/docs/verified-configs/v0.45.0/lmstudio-5521-gpt-oss-20b-mlx.json +135 -0
  77. package/docs/verified-configs/v0.45.0/merged-config.5521.json +1205 -0
  78. package/docs/verified-configs/v0.45.0/merged-config.qwen-5522.json +1559 -0
  79. package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus-final.json +221 -0
  80. package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus-fixed.json +242 -0
  81. package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus.json +242 -0
  82. package/package.json +17 -11
  83. package/scripts/build-core.mjs +3 -1
  84. package/scripts/ci/repo-sanity.mjs +138 -0
  85. package/scripts/mock-provider/run-regressions.mjs +157 -1
  86. package/scripts/run-bg.sh +0 -14
  87. package/scripts/tests/ci-jest.mjs +119 -0
  88. package/scripts/tools-dev/responses-debug-client/README.md +23 -0
  89. package/scripts/tools-dev/responses-debug-client/payloads/poem.json +13 -0
  90. package/scripts/tools-dev/responses-debug-client/payloads/sample-no-tools.json +98 -0
  91. package/scripts/tools-dev/responses-debug-client/payloads/text.json +13 -0
  92. package/scripts/tools-dev/responses-debug-client/payloads/tool.json +27 -0
  93. package/scripts/tools-dev/responses-debug-client/run.mjs +65 -0
  94. package/scripts/tools-dev/responses-debug-client/src/index.ts +281 -0
  95. package/scripts/tools-dev/run-llmswitch-chat.mjs +53 -0
  96. package/scripts/tools-dev/server-tools-dev/run-web-fetch.mjs +65 -0
  97. package/scripts/vendor-core.mjs +13 -3
  98. package/scripts/test-fc-responses.mjs +0 -66
  99. package/scripts/test-guidance.mjs +0 -100
  100. package/scripts/test-iflow-web-search.mjs +0 -141
  101. package/scripts/test-iflow.mjs +0 -379
  102. package/scripts/test-tool-exec.mjs +0 -26
package/README.md CHANGED
@@ -1,1474 +1,98 @@
1
- # RouteCodex – 多提供商 AI 代理
1
+ # RouteCodex
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/%40jsonstudio%2Frcc.svg)](https://www.npmjs.com/package/@jsonstudio/rcc)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
- [![TypeScript](https://img.shields.io/badge/TypeScript-5.9+-blue.svg)](https://www.typescriptlang.org/)
6
5
 
7
- RouteCodex JSON Studio 推出的多提供商 AI 代理,提供统一的 OpenAI / Anthropic / Responses / Gemini 入口,自动完成协议转换、工具治理、速率控制与快照审计。项目包含两个分发形态:
6
+ RouteCodex 是一个 **多 Provider AI 代理网关**:为 Codex、Claude Code,以及任何 OpenAI-compatible 客户端提供统一入口,并在不同上游协议之间完成 **路由 + 协议转换 + 工具调用治理**。
8
7
 
9
- - **Release CLI (`@jsonstudio/rcc`)**:给终端用户的 npm 包,自带 `rcc` 命令。
10
- - **Dev Worktree (`routecodex`)**:本仓库源码,开发者可修改、构建并贡献。
8
+ ## 主要功能
11
9
 
12
- 本文档面向 release 使用者与贡献者,覆盖架构、安装、配置与常见操作。
10
+ - **多入口同时支持(同一服务端口)**
11
+ - OpenAI Chat:`POST /v1/chat/completions`
12
+ - OpenAI Responses:`POST /v1/responses`
13
+ - Anthropic Messages:`POST /v1/messages`
14
+ - **多 Provider / 多协议支持**
15
+ - OpenAI-compatible、Anthropic、Gemini/Gemini CLI、GLM、Qwen、iFlow、LM Studio 等(按配置启用)。
16
+ - 部分 Provider 支持 OAuth / token file(按配置启用)。
17
+ - **可配置路由**
18
+ - 将不同“流量池/路由类别”(如 `default` / `thinking` / `tools` / `search` / `longcontext` 等)映射到不同 Provider 目标列表。
19
+ - **请求级“语法控制”**
20
+ - **指定 Provider/模型**:`model` 可直接写成 `provider.model`(例如 `iflow.glm-4.7`)。
21
+ - **路由指令**:可在用户文本中插入 `<**...**>` 指令(例如 `<**glm.glm-4.7**>`),详见 `docs/routing-instructions.md`。
22
+ - **Passthrough(透传)**
23
+ - 可按 Provider 配置启用透传:只做鉴权/路由/日志,不做语义修补(适合严格 SSE 透传场景)。
13
24
 
14
- ---
25
+ > Release CLI:`@jsonstudio/rcc`(命令 `rcc`)
15
26
 
16
- ## 架构总览
27
+ ## 安装
17
28
 
18
- ### 单一执行路径
29
+ 环境要求:Node.js 20+(推荐 LTS)。
19
30
 
20
- ```
21
- HTTP Server → llmswitch-core Hub Pipeline → Provider V2 Runtime → 上游 AI API
22
- ```
23
-
24
- - **Hub Pipeline(llmswitch-core)**:唯一的工具治理点,完成协议归一、tool call 修复、路由决策、SSE 处理。
25
- - **Provider V2**:纯运输层,只负责认证、重试和兼容性 hook;不解析或修改用户语义。
26
- - **Compatibility**:按 upstream 协议最小字段映射,确保 usage / finish_reason / required_action 一致。
27
- - **Host (RouteCodexHttpServer)**:只做 HTTP/SSE 封装、配置加载与 provider 生命周期管理。
28
-
29
- ### 模块职责矩阵
30
-
31
- | 模块 | 代码位置 | 职责 | 禁止行为 |
32
- | --- | --- | --- | --- |
33
- | HTTP Server | `src/server/runtime/http-server` | Express 路由、SSE 包装、调用 Hub Pipeline | 工具决策、路由逻辑、配置拼装 |
34
- | Hub Pipeline | `sharedmodule/llmswitch-core` | 请求标准化、tool_calls 统一处理、虚拟路由 | 进行 HTTP 请求、处理认证 |
35
- | Provider V2 | `src/providers` | 请求签名、HTTP 发送、快照输出 | 解析/修复工具调用、修改配置 |
36
- | Compatibility | `sharedmodule/llmswitch-core/src/conversion/compat/*` | 上下游字段映射、最小清理 | 工具解码、兜底 try/catch |
37
-
38
- 更多细节请参考 `docs/ARCHITECTURE.md` 与 `docs/CONFIG_ARCHITECTURE.md`。
39
-
40
- ---
41
-
42
- ## 安装与升级
43
-
44
- ### 环境要求
45
- - Node.js 20.x(20.11 及以上,<26)
46
- - npm 9.x 或 10.x
47
- - macOS / Linux:bash 或 zsh
48
- - Windows:PowerShell 5.1+ 或 Windows Terminal
49
-
50
- ### Release CLI(推荐)
51
-
52
- > CLI 名称:`rcc`,包名:`@jsonstudio/rcc`
53
-
54
- **macOS / Linux**
55
31
  ```bash
56
32
  npm install -g @jsonstudio/rcc
57
33
  rcc --version
58
34
  ```
59
35
 
60
- **Windows(PowerShell)**
61
- ```powershell
62
- npm install -g @jsonstudio/rcc
63
- rcc --version
64
- ```
65
-
66
- 安装成功后,`rcc --version` 会显示形如 `0.89.xxx (release)` 的版本信息;可通过 `npm update -g @jsonstudio/rcc` 升级,`npm uninstall -g @jsonstudio/rcc` 卸载。
36
+ ## 使用
67
37
 
68
- ### 快速上手(推荐)
38
+ ### 1) 初始化配置并启动
69
39
 
70
40
  ```bash
71
41
  rcc init
72
42
  rcc start
73
43
  ```
74
44
 
75
- 更多细节见:
76
- - `docs/INSTALLATION_AND_QUICKSTART.md`
77
- - `docs/PROVIDERS_BUILTIN.md`
78
- - `docs/INSTRUCTION_MARKUP.md`
79
- - `docs/PORTS.md`
80
- - `docs/PROVIDER_TYPES.md`
81
- - `docs/CODEX_AND_CLAUDE_CODE.md`
82
-
83
- ### Dev CLI(本仓库)
84
- 开发者使用以下命令安装 dev CLI(必须先构建 sharedmodule):
85
-
86
- ```bash
87
- npm --prefix sharedmodule/llmswitch-core run build
88
- npm run build:dev
89
- npm run install:global
90
- ```
91
-
92
- > ⚠️ 禁止:`routecodex` 只用于本地调试,严禁发布到 npm。发布 `@jsonstudio/rcc` 必须使用 `npm run install:release`。
93
-
94
- ---
95
-
96
- ## 默认目录结构
97
-
98
- | 系统 | 主配置 | Provider 配置 | 日志 / 快照 |
99
- | --- | --- | --- | --- |
100
- | macOS / Linux | `~/.routecodex/config.json`(或 `ROUTECODEX_CONFIG_PATH` 指定路径) | `~/.routecodex/provider/<name>/config.v1.json` | `~/.routecodex/logs`、`~/.routecodex/codex-samples/*` |
101
- | Windows | `%USERPROFILE%\.routecodex\config.json` | `%USERPROFILE%\.routecodex\provider\<name>\config.v1.json` | `%USERPROFILE%\.routecodex\logs` 等 |
102
-
103
- RouteCodex 会按以下优先级查找配置:
104
-
105
- 1. CLI 参数 `--config <path>`
106
- 2. 环境变量 `ROUTECODEX_CONFIG_PATH`
107
- 3. 默认路径(见上表)
108
-
109
- ---
110
-
111
- ## 无密钥配置样本
112
-
113
- 仓库附带了一份不含真实密钥的示例:`samples/configs/openai-chat-sample.json`。复制到本地后,只需提供环境变量即可启动。
114
- 也可以直接参考:`configsamples/config.reference.json`,或使用 `rcc init` 自动生成。
115
-
116
- ```json
117
- {
118
- "httpserver": { "host": "127.0.0.1", "port": 5555 },
119
- "virtualrouter": {
120
- "providers": {
121
- "demo.glm": {
122
- "providerType": "openai",
123
- "protocol": "openai-chat",
124
- "baseUrl": "https://api.example.com/v1",
125
- "auth": { "type": "apikey", "env": "GLM_API_KEY" },
126
- "models": {
127
- "glm-4.6": {
128
- "supportsStreaming": true,
129
- "profiles": ["glm-default"]
130
- }
131
- }
132
- }
133
- },
134
- "routing": {
135
- "default": ["demo.glm.glm-4.6"]
136
- }
137
- }
138
- }
139
- ```
140
-
141
- 使用步骤:
142
-
143
- 1. **复制样本**
144
- ```bash
145
- mkdir -p ~/.routecodex
146
- cp samples/configs/openai-chat-sample.json ~/.routecodex/config.json
147
- ```
148
- 2. **提供密钥(示例为环境变量)**
149
- - macOS / Linux:`export GLM_API_KEY="sk-your-key"`
150
- - Windows:`setx GLM_API_KEY "sk-your-key"`
151
- 3. **启动**
152
- ```bash
153
- rcc start --config ~/.routecodex/config.json
154
- ```
155
- 4. **验证**
156
- - 健康检查:`curl http://127.0.0.1:5555/health`
157
- - Chat API:`curl http://127.0.0.1:5555/v1/chat/completions ...`
158
-
159
- > 样本仅用于演示。请把 `baseUrl` / `routing` 更新为真实 provider,再通过环境变量、`authfile-*` 或 Secret 管理工具提供密钥。
160
-
161
- ### 自定义路由关键字
162
-
163
- 虚拟路由器内置了一组默认关键字(如 `思考/think` → `thinking` 路由,`vision/image` → `vision` 路由)。若希望在不覆盖默认词表的前提下追加命中词,可以在用户配置中加入 `virtualrouter.classifier.keywordInjections`:
164
-
165
- ```json
166
- {
167
- "virtualrouter": {
168
- "classifier": {
169
- "keywordInjections": {
170
- "thinking": ["慢慢分析", "stepwise"],
171
- "vision": ["截图如下"],
172
- "background": ["context dump please"]
173
- }
174
- }
175
- }
176
- }
177
- ```
178
-
179
- - 字段名对应路由类别(`thinking` / `background` / `vision` / `coding`),只需写新增词条即可,默认常量会自动保留。
180
- - 若同一词出现在多个路由,将沿用 `ROUTE_PRIORITY`(`longcontext → thinking → vision → ...`)顺序做匹配。
181
- - 更新配置文件后重启服务即可生效。
182
-
183
- ---
184
-
185
- ## 快速使用
186
-
187
- 1. **准备配置**:如上所述放置 `config.json` 或使用 `--config` 指定文件。
188
- 2. **启动 release server**
189
- ```bash
190
- rcc start --config ~/.routecodex/config.json
191
- ```
192
- CLI 会输出健康检查地址、配置文件路径和当前版本。
193
- 3. **调用 API**
194
- - OpenAI Chat:`POST /v1/chat/completions`
195
- - OpenAI Responses:`POST /v1/responses`
196
- - Anthropic:`POST /v1/messages`
197
- 4. **开发者模式**
198
- - `rcc code ...`:启动 Claude Code 并把所有请求代理到本地 RouteCodex。
199
- - `rcc start --exclusive`:独占端口,自动终止旧实例。
45
+ 默认配置路径:
46
+ - macOS / Linux:`~/.routecodex/config.json`
47
+ - Windows:`%USERPROFILE%\\.routecodex\\config.json`
200
48
 
201
- ---
49
+ `rcc init` 会在 `~/.routecodex/` 生成默认 `config.json`,并把常用文档复制到 `~/.routecodex/docs`。
202
50
 
203
- ## 配置与密钥管理
204
-
205
- - **AuthFile 引用**:在配置中使用 `authfile-<name>`,RouteCodex 会读取 `~/.routecodex/auth/<name>`。适用于多账号切换。
206
- - **环境变量**:将 `auth.type` 设为 `apikey` 且 `env` 字段指定变量名,server 会在启动时解析。
207
- - **provider profiles**:`src/providers/profile/` 定义了各 provider 允许的协议、Auth 方式及兼容 profile,可在配置中通过 `profiles` 字段引用。
208
-
209
- 更多细节见 `docs/CONFIG_ARCHITECTURE.md`。
210
-
211
- ---
212
-
213
- ## 开发者工作流
214
-
215
- 1. **克隆仓库并安装依赖**
216
- ```bash
217
- git clone https://github.com/jsonstudio/routecodex.git
218
- cd routecodex
219
- npm install
220
- ```
221
- 2. **构建 sharedmodule(必要)**
222
- ```bash
223
- npm --prefix sharedmodule/llmswitch-core run build
224
- ```
225
- 3. **编译与验证**
226
- ```bash
227
- npm run build:dev # 生成 dist 并执行工具链验证
228
- npm run install:global # 安装本地版 routecodex CLI
229
- ```
230
- 4. **与 release 区分**
231
- - Release:使用 npm 安装 `@jsonstudio/rcc`
232
- - Dev:仓库内 `routecodex` CLI,支持 `npm run start:bg` 等脚本
233
-
234
- ---
235
-
236
- ## 故障排查
237
-
238
- | 症状 | 检查点 |
239
- | --- | --- |
240
- | `config:core:run` 提示缺失 | Release CLI 默认跳过动态 pipeline 生成;自定义流程可设置 `config:core:run` 脚本。 |
241
- | SSE 变为 JSON | 检查入口 `stream` 字段与客户端 `Accept` 头;RouteCodex 会根据 inbound 请求保持一致。 |
242
- | usage 始终 100% | 确保配置启用了对应 provider 的 `supportsStreaming`,并检查 `~/.routecodex/codex-samples/*` 快照确认 usage 字段已写入。 |
243
- | Release install 验证失败 | 查看 `/tmp/routecodex-release-verify-*.log`;脚本位于 `scripts/install-verify.mjs`,可单独执行 `node scripts/install-verify.mjs --launcher cli --cli-binary rcc ...`。 |
244
-
245
- ---
246
-
247
- ---
248
-
249
- ## 参考文档
250
-
251
- - `docs/ARCHITECTURE.md` – 全量架构细节与数据流
252
- - `docs/CONFIG_ARCHITECTURE.md` – 配置解析、authfile、虚拟路由
253
- - `docs/pipeline-routing-report.md` – Hub Pipeline 节点详解
254
- - `docs/codex-samples-replay.md` – 快照与回放说明
255
-
256
- 如需提交问题或贡献代码,请查看 `CONTRIBUTING.md`(若不存在可参考 Issues 模板)并遵守 `AGENTS.md` 中的 V2 工作约定。
257
- - **Provider层**: 统一HTTP通信、认证管理、连接池优化、双向请求响应处理
258
- - **External AI Service层**: 多提供商AI模型支持、性能监控、双向数据流
259
-
260
- ### 🔧 智能路由系统
261
- 支持7种动态路由类别,自动选择最优处理流水线:
262
- - `default`: 标准请求路由
263
- - `longcontext`: 长文本处理请求(tiktoken 统计超过 180k token 时切向 ≥256k provider,例如 fai/c4m)
264
- - `thinking`: 复杂推理请求
265
- - `background`: 后台处理请求
266
- - `websearch`: 网络搜索请求
267
- - `vision`: 图像处理请求
268
- - `coding`: 代码生成请求
269
-
270
- **强制路由/模型标签(请求文本内插入 `<**...**>`)**
271
- - `<**thinking|coding|tools|vision|websearch|longcontext|background**>`:强制命中对应路由,忽略其它关键词。
272
- - `<**provider.model**>`:强制命中某个 provider 模型(如 `<**c4m.gpt-5.1-codex**>`,当 provider 存在并健康时直接命中)。
273
- - 标签在路由阶段被剥离,真实请求不会把控制标签透传给上游。
274
-
275
- ### 🛠️ Provider V2架构
276
- 完全重构的Provider系统,提供:
277
- - 统一的OpenAI标准接口(支持5大提供商)
278
- - 配置驱动的服务适配(API Key + OAuth)
279
- - 认证管理模块化
280
- - 请求/响应快照系统
281
- - Fail Fast错误处理机制
282
-
283
- ### 🎯 Dry-Run调试系统
284
- 完整的调试和测试框架:
285
- - 节点级dry-run执行
286
- - 智能输入模拟
287
- - 双向管道处理
288
- - 完整快照链路追踪
289
- - 结构化错误分析
290
-
291
- ### 📊 实时监控界面
292
- 基于Web的综合调试界面:
293
- - 实时系统监控
294
- - 性能可视化
295
- - 模块管理
296
- - 事件探索
297
-
298
- ## 📦 支持的提供商
299
-
300
- | 提供商 | 支持状态 | 认证方式 | 特色功能 | V2架构状态 |
301
- |--------|----------|----------|----------|-------------|
302
- | **OpenAI** | ✅ 完全支持 | API Key | GPT系列模型,DALL-E图像生成 | ✅ Provider V2 |
303
- | **Anthropic** | ✅ 完全支持 | API Key | Claude系列模型,长上下文支持 | ✅ Provider V2 |
304
- | **Qwen** | ✅ 完全支持 | OAuth | 阿里云通义千问系列,客户端元数据 | ✅ Provider V2 |
305
- | **GLM** | ✅ 完全支持 | API Key | 智谱AI GLM系列,思考内容处理 | ✅ Compatibility V2 + Provider V2 |
306
- | **LM Studio** | ✅ 完全支持 | API Key | 本地模型部署,工具调用支持 | ✅ Provider V2 |
307
- | **iFlow** | ✅ 完全支持 | OAuth | 多模态AI服务,PKCE支持 | ✅ Provider V2 |
308
-
309
- ## 🚀 快速开始
310
-
311
- ### 系统要求
312
-
313
- - **Node.js**: 20.0.0 或更高版本(推荐 < 26)
314
- - **npm**: 8.0.0 或更高版本
315
- - **操作系统**: Windows 10+, macOS 10.15+, Ubuntu 20.04+
316
- - **内存**: 建议 4GB 以上
317
- - **磁盘空间**: 500MB 可用空间
318
-
319
- ### 安装
320
-
321
- #### 自动安装(推荐,dev 包 `routecodex`)
51
+ 如果配置文件已存在,需要重新生成模板:
322
52
 
323
53
  ```bash
324
- # 一键构建并全局安装(自动处理权限问题)
325
- npm run install:global
54
+ rcc init --force
326
55
  ```
327
56
 
328
- 安装脚本会自动:
329
- - ✅ 检查Node.js版本(需要>=20)
330
- - ✅ 清理旧的安装残留
331
- - ✅ 构建项目(编译为 dev 模式,默认端口 5555)
332
- - ✅ 处理权限配置
333
- - ✅ 全局安装到正确位置
334
- - ✅ 验证安装结果
57
+ 它会先备份旧配置为 `config.json.bak`(或 `config.json.bak.N`),再生成新模板。
335
58
 
336
- > 说明:`routecodex` 作为 dev 包,适用于本地开发与调试,默认在端口 **5555** 启动(也可通过 `ROUTECODEX_PORT` / `RCC_PORT` 显式指定)。
59
+ ### 2) 调用 API(示例)
337
60
 
338
- #### 手动安装(等价于 dev 包)
61
+ 健康检查:
339
62
 
340
63
  ```bash
341
- # 克隆仓库
342
- git clone https://github.com/your-repo/routecodex.git
343
- cd routecodex
344
-
345
- # 安装依赖
346
- npm install
347
-
348
- # 构建项目
349
- npm run build
350
-
351
- # 全局安装(dev 包 routecodex)
352
- npm install -g .
64
+ curl http://127.0.0.1:5555/health
353
65
  ```
354
66
 
355
- #### Release 安装(发布包 `rcc`,可选)
67
+ OpenAI Chat:
356
68
 
357
69
  ```bash
358
- # 基于当前源码构建并全局安装 rcc(release 包)
359
- npm run install:release
70
+ curl http://127.0.0.1:5555/v1/chat/completions \
71
+ -H 'Content-Type: application/json' \
72
+ -d '{"model":"iflow.glm-4.7","messages":[{"role":"user","content":"hi"}],"stream":false}'
360
73
  ```
361
74
 
362
- - `rcc` 作为 release 包,仅从用户配置中读取端口(`httpserver.port` / `server.port` / 顶层 `port`),**不会复用 dev 默认 5555**。
363
- - 适合在实际使用环境中按配置文件严格控制监听端口。
364
-
365
- #### 清理旧安装
366
-
367
- 如果遇到安装问题,可以先清理旧安装:
75
+ OpenAI Responses:
368
76
 
369
77
  ```bash
370
- # 清理全局安装残留
371
- ./scripts/cleanup-global.sh
372
-
373
- # 然后重新安装
374
- npm run install:global
78
+ curl http://127.0.0.1:5555/v1/responses \
79
+ -H 'Content-Type: application/json' \
80
+ -d '{"model":"tab.gpt-5.2","input":[{"role":"user","content":"hi"}],"stream":false}'
375
81
  ```
376
82
 
377
- #### 权限问题解决
378
-
379
- 如果遇到权限问题,请参考 [INSTALL.md](./INSTALL.md) 中的详细说明。
380
-
381
- > 说明:统一使用 `scripts/install-global.sh`,支持自动权限处理和旧安装清理。安装脚本会在安装完成后自动使用 `~/.routecodex/provider/glm/config.v1.json` 启动一次服务器,并向模型发送“列出本地文件目录”的工具请求来验证端到端链路,请保证该配置文件存在且有效。
382
-
383
- ### 会话级路由 / sticky 指令语法总览
384
-
385
- RouteCodex 支持在用户消息中通过 `<**...**>` 标签设置**当前会话的路由 / 粘性 / 禁用 / 自动续写**行为。这些标签只在路由层解析,不会透传给上游模型。
386
-
387
- - **单次强制模型 / provider**
388
- - `<**provider.model**>`:仅对当前请求强制使用某个模型
389
- - 例:`<**glm.glm-4.7**>`、`<**antigravity.claude-sonnet-4-5**>`
390
- - `<**provider**>`:将当前会话的 provider 白名单重置为该 provider
391
- - 例:`<**antigravity**>`(只允许 antigravity 的所有模型/key 命中)
392
-
393
- - **粘性(sticky)指定,跨轮生效**
394
- - `<**!provider.model**>`:对当前会话粘在某个模型上,并在该模型的多 key 之间轮询
395
- - 例:`<**!antigravity.claude-sonnet-4-5**>`
396
- - `<**!provider.keyAlias.model**>` / `<**!provider.N**>`:粘在某一个具体 key 上,不再轮询其它 alias
397
- - 例:`<**!antigravity.geminikey.gemini-3-pro-high**>`、`<**!openai.2**>`
398
-
399
- - **白名单 / 禁用 / 解除禁用**
400
- - 白名单(只允许这些 provider)
401
- - `<**!glm**>`、`<**!glm,openai**>`
402
- - 禁用(只对当前会话生效,支持 provider / keyAlias / 序号)
403
- - `<**#glm**>`(禁用 glm 全部 key)
404
- - `<**#openai.1**>`、`<**#anthropic.primary**>`
405
- - 启用(解除禁用)
406
- - `<**@glm**>`、`<**@openai.1**>`
407
-
408
- - **清理所有路由状态**
409
- - `<**clear**>`:清除 sticky / 白名单 / 禁用 状态,恢复默认路由
410
-
411
- - **自动续写 stopMessage(基于 sticky 状态)**
412
- - 启用 / 更新:
413
- - `<**stopMessage:"继续"**>` → 默认最多自动续写 1 次
414
- - `<**stopMessage:"继续",3**>` → 最多自动续写 3 次
415
- - `<**stopMessage:<file://stopMessage/message1.md>**>` → 读取 `~/.routecodex/stopMessage/message1.md` 作为 stopMessage 文案(设置时读取并缓存到内存)
416
- - 清理:
417
- - `<**stopMessage:clear**>`
418
- - 触发条件(由内置 `stop_message_auto` servertool 在服务端判断):
419
- - 当前响应 `finish_reason = "stop"`;
420
- - 当前轮没有工具调用(`tool_calls` 为空);
421
- - `stopMessageUsed < stopMessageMaxRepeats` 且客户端仍连接。
422
- - 会话要求:sticky 状态依赖 `sessionId` / `conversationId`。`/v1/messages` 请求请确保 `metadata.user_id` 内包含 `session_<uuid>` 字样,系统会在缺少 header/metadata.sessionId 时从 `metadata.__raw_request_body.metadata.user_id` 自动提取用作会话键。
423
- - 行为:在保存的原始请求消息末尾追加一条 `{ role: "user", content: "<配置的文本>" }`,通过内部 `reenterPipeline` 自动发下一轮对话,对客户端透明。
424
-
425
- > 完整说明、状态持久化规则及 daemon 管理示例,参见 `docs/routing-instructions.md`。
426
-
427
- ### 基础配置
428
-
429
- 1. **创建配置文件**
430
- ```bash
431
- # 复制示例配置
432
- cp config/examples/basic-config.json ~/.routecodex/config.json
433
- ```
434
-
435
- 2. **V2架构配置示例**
436
- ```json
437
- {
438
- "version": "1.0",
439
- "providers": {
440
- "glm-provider": {
441
- "type": "chat-http-provider",
442
- "config": {
443
- "providerType": "openai",
444
- "providerId": "glm",
445
- "baseUrl": "https://open.bigmodel.cn/api/coding/paas/v4",
446
- "auth": {
447
- "type": "apikey",
448
- "apiKey": "${GLM_API_KEY}"
449
- },
450
- "models": {
451
- "glm-4": {
452
- "maxTokens": 8192,
453
- "temperature": 0.7
454
- }
455
- }
456
- }
457
- },
458
- "qwen-provider": {
459
- "type": "chat-http-provider",
460
- "config": {
461
- "providerType": "openai",
462
- "auth": {
463
- "type": "qwen-oauth",
464
- "clientId": "${QWEN_CLIENT_ID}",
465
- "clientSecret": "${QWEN_CLIENT_SECRET}",
466
- "tokenFile": "${HOME}/.routecodex/auth/qwen-oauth.json"
467
- }
468
- }
469
- }
470
- },
471
- "pipelines": [
472
- {
473
- "id": "glm-pipeline",
474
- "providerId": "glm-provider",
475
- "models": ["glm-4"],
476
- "modules": {
477
- "llmSwitch": { "type": "llmswitch-v2" },
478
- "compatibility": { "type": "compat:passthrough" },
479
- "provider": { "type": "chat-http-provider" }
480
- }
481
- }
482
- ],
483
- "dynamicRouting": {
484
- "enabled": true,
485
- "defaultTarget": {
486
- "providerId": "glm-provider",
487
- "modelId": "glm-4"
488
- }
489
- }
490
- }
491
- ```
492
-
493
- 3. **设置环境变量**
494
- ```bash
495
- # GLM API密钥(智谱AI)
496
- export GLM_API_KEY="your-glm-api-key"
497
-
498
- # Qwen OAuth配置(阿里云)
499
- export QWEN_CLIENT_ID="your-qwen-client-id"
500
- export QWEN_CLIENT_SECRET="your-qwen-client-secret"
501
-
502
- # 其他提供商密钥
503
- export OPENAI_API_KEY="your-openai-api-key"
504
- export ANTHROPIC_API_KEY="your-anthropic-api-key"
505
- ```
506
-
507
- ### 启动服务
508
-
509
- ```bash
510
- # 启动RouteCodex服务器
511
- routecodex start --config ~/.routecodex/config.json --port 5506
512
-
513
- # 后台运行
514
- routecodex start --config ~/.routecodex/config.json --port 5506 --daemon
515
-
516
- # 前台运行(限时)
517
- routecodex start --config ~/.routecodex/config.json --port 5506 --timeout 300
518
- ```
519
-
520
- ### 验证安装
521
-
522
- ```bash
523
- # 检查版本
524
- routecodex --version
525
-
526
- # 检查配置
527
- routecodex config validate
528
-
529
- # 测试API连接
530
- curl -X POST http://localhost:5506/v1/chat/completions \
531
- -H "Content-Type: application/json" \
532
- -H "Authorization: Bearer test-key" \
533
- -d '{
534
- "model": "gpt-3.5-turbo",
535
- "messages": [{"role": "user", "content": "Hello, world!"}]
536
- }'
537
- ```
538
-
539
- ## 📖 使用指南
540
-
541
- ### 基础API调用
542
-
543
- RouteCodex提供与OpenAI完全兼容的API接口:
544
-
545
- #### Chat Completions
546
-
547
- ```bash
548
- curl -X POST http://localhost:5506/v1/chat/completions \
549
- -H "Content-Type: application/json" \
550
- -H "Authorization: Bearer your-api-key" \
551
- -d '{
552
- "model": "gpt-4",
553
- "messages": [
554
- {"role": "system", "content": "You are a helpful assistant."},
555
- {"role": "user", "content": "Explain quantum computing in simple terms."}
556
- ],
557
- "max_tokens": 1000,
558
- "temperature": 0.7
559
- }'
560
- ```
561
-
562
- #### 工具调用
563
-
564
- ```bash
565
- curl -X POST http://localhost:5506/v1/chat/completions \
566
- -H "Content-Type: application/json" \
567
- -H "Authorization: Bearer your-api-key" \
568
- -d '{
569
- "model": "gpt-4",
570
- "messages": [
571
- {"role": "user", "content": "What is the weather in Tokyo?"}
572
- ],
573
- "tools": [
574
- {
575
- "type": "function",
576
- "function": {
577
- "name": "get_weather",
578
- "description": "Get current weather information",
579
- "parameters": {
580
- "type": "object",
581
- "properties": {
582
- "location": {"type": "string", "description": "City name"}
583
- },
584
- "required": ["location"]
585
- }
586
- }
587
- }
588
- ]
589
- }'
590
- ```
591
-
592
- #### 流式响应
593
-
594
- ```bash
595
- curl -X POST http://localhost:5506/v1/chat/completions \
596
- -H "Content-Type: application/json" \
597
- -H "Authorization: Bearer your-api-key" \
598
- -d '{
599
- "model": "gpt-4",
600
- "messages": [{"role": "user", "content": "Write a short story"}],
601
- "stream": true
602
- }'
603
- ```
604
-
605
- ### 高级功能
606
-
607
- #### 动态路由配置
608
-
609
- ```json
610
- {
611
- "dynamicRouting": {
612
- "enabled": true,
613
- "categories": {
614
- "longcontext": {
615
- "targets": [
616
- {
617
- "providerId": "fai-provider",
618
- "modelId": "gpt-5.1-codex"
619
- },
620
- {
621
- "providerId": "c4m-provider",
622
- "modelId": "gpt-5.1-codex"
623
- }
624
- ],
625
- "triggers": [
626
- {"type": "token_count", "threshold": 180000},
627
- {"type": "content_type", "value": "document"}
628
- ]
629
- },
630
- "coding": {
631
- "targets": [
632
- {
633
- "providerId": "qwen-provider",
634
- "modelId": "qwen3-coder-plus"
635
- }
636
- ],
637
- "triggers": [
638
- {"type": "keyword", "values": ["code", "function", "bug"]},
639
- {"type": "language_detection", "languages": ["python", "javascript", "typescript"]}
640
- ]
641
- }
642
- }
643
- }
644
- }
645
- ```
646
-
647
- #### Dry-Run调试
83
+ Anthropic Messages:
648
84
 
649
85
  ```bash
650
- # 启用dry-run模式
651
- routecodex start --config ~/.routecodex/config.json --dry-run
652
-
653
- # 运行dry-run测试
654
- routecodex dry-run --config ~/.routecodex/config.json --test-file examples/test-request.json
655
-
656
- # 生成dry-run报告
657
- routecodex dry-run --config ~/.routecodex/config.json --output-report debug-report.json
86
+ curl http://127.0.0.1:5555/v1/messages \
87
+ -H 'Content-Type: application/json' \
88
+ -d '{"model":"anthropic.claude-sonnet-4-5","messages":[{"role":"user","content":"hi"}],"stream":false}'
658
89
  ```
659
90
 
660
- #### 性能监控
661
-
662
- ```bash
663
- # 启用监控
664
- routecodex start --config ~/.routecodex/config.json --monitoring
665
-
666
- # 查看性能指标
667
- curl http://localhost:5506/api/debug/metrics
668
-
669
- # 导出监控数据
670
- curl http://localhost:5506/api/debug/export/json > monitoring-data.json
671
- ```
672
-
673
- ## 🏗️ 架构设计
674
-
675
- ### 整体架构图
676
-
677
- ```
678
- ┌─────────────────────────────────────────────────────────────────┐
679
- │ RouteCodex V2 双向流水线架构 │
680
- ├─────────────────────────────────────────────────────────────────┤
681
- │ │
682
- │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
683
- │ │ HTTP Server │ │ WebSocket │ │ Debug API │ │
684
- │ │ (双向通信) │ │ Interface │ │ (双向监控) │ │
685
- │ │ • REST API │ │ • Real-time │ │ • Metrics │ │
686
- │ │ • Streaming │ │ updates │ │ • Event log │ │
687
- │ │ • Authentication│ │ • Monitoring │ │ • Health check │ │
688
- │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
689
- │ ▲▼ ▲▼ ▲▼ │
690
- │ │
691
- │ ┌─────────────────────────────────────────────────────────────┐ │
692
- │ │ 双向4-Layer Pipeline Architecture │ │
693
- │ │ ▲▼ 双向数据流 │ │
694
- │ │ ┌─────────────┬──────────────┬──────────────────────────┐ │ │
695
- │ │ │LLM Switch │ Compatibility │ Provider │ │ │
696
- │ │ │ Workflow │ Layer │ Layer │ │ │
697
- │ │ │ ▲▼ │ ▲▼ │ ▲▼ │ │ │
698
- │ │ │ • 双向路由 │ • 双向格式 │ • 双向HTTP通信 │ │ │
699
- │ │ │ • 双向协议 │ 转换 │ • 双向认证 │ │ │
700
- │ │ │ • 双向分类 │ • 双向字段 │ • 双向错误处理 │ │ │
701
- │ │ │ • 工具统一 │ 映射 │ • 双向健康监控 │ │ │
702
- │ │ │ 处理 │ │ │ │ │
703
- │ │ └─────────────┴──────────────┴──────────────────────────┘ │ │
704
- │ └─────────────────────────────────────────────────────────────┘ │
705
- │ ▲▼ 双向工具处理循环 │
706
- │ │
707
- │ ┌─────────────────────────────────────────────────────────────┐ │
708
- │ │ llmswitch-core 双向工具处理核心 │ │
709
- │ │ ▲▼ │ │
710
- │ │ ┌─────────────┬──────────────┬──────────────────────────┐ │ │
711
- │ │ │ 工具规范化器 │ 文本收割器 │ 系统工具指引 │ │ │
712
- │ │ │ ▲▼ │ ▲▼ │ ▲▼ │ │ │
713
- │ │ │ • 双向规范 │ • 双向收割 │ • 双向schema增强 │ │ │
714
- │ │ │ • 双向生成 │ • 双向提取 │ • 双向指引注入 │ │ │
715
- │ │ │ • 双向去重 │ • 双向清理 │ • 双向行为标准化 │ │ │
716
- │ │ └─────────────┴──────────────┴──────────────────────────┘ │ │
717
- │ └─────────────────────────────────────────────────────────────┘ │
718
- │ │
719
- │ ┌─────────────────────────────────────────────────────────────┐ │
720
- │ │ Configuration & Management │ │
721
- │ │ ▲▼ │ │
722
- │ │ ┌─────────────┬──────────────┬──────────────────────────┐ │ │
723
- │ │ │ Config │ Monitoring │ Dry-Run System │ │ │
724
- │ │ │ Engine │ │ │ │ │
725
- │ │ │ • 双向JSON │ • 双向性能 │ • 双向节点级执行 │ │ │
726
- │ │ │ • 双向验证 │ • 双向指标 │ • 双向输入模拟 │ │ │
727
- │ │ │ • 双向热重载 │ • 双向健康 │ • 双向错误边界 │ │ │
728
- │ │ └─────────────┴──────────────┴──────────────────────────┘ │ │
729
- │ └─────────────────────────────────────────────────────────────┘ │
730
- └─────────────────────────────────────────────────────────────────┘
731
-
732
- ▲▼ 双向数据流:请求流(↓)和响应流(↑)在每一层双向传递
733
- 工具循环:工具选择 → llmswitch处理 → Provider修剪 → AI执行 → 结果收集 → 下一轮请求
734
- ```
735
-
736
- ### 核心组件
737
-
738
- #### 1. LLM Switch Workflow层
739
- - **双向动态路由分类**: 基于请求内容自动选择处理流水线
740
- - **双向协议转换**: OpenAI ↔ Anthropic ↔ Gemini协议双向转换
741
- - **llmswitch-core工具处理**: 统一工具调用处理、文本收割、系统指引
742
- - **双向请求预处理**: 模型映射、参数标准化、工具调用处理
743
-
744
- #### 2. Compatibility层
745
- - **双向格式转换**: 字段映射、数据结构适配、双向修剪转换
746
- - **双向提供商适配**: 处理不同提供商的特殊要求
747
- - **双向响应标准化**: 统一输出格式,错误处理,字段映射
748
-
749
- #### 3. Provider层 (V2)
750
- - **双向统一接口**: 标准化的Provider实现,支持双向请求响应
751
- - **双向认证管理**: API Key、OAuth、会话管理
752
- - **双向连接管理**: 连接池、重试机制、健康检查、双向HTTP通信
753
- - **协议化实现**: `chat-http-provider.ts`、`responses-http-provider.ts`、`anthropic-http-provider.ts`、`gemini-http-provider.ts` 分别对应四大协议,通过 ProviderComposite 执行最小兼容,再交由 Provider Runtime Profile 注入 baseURL/headers/auth。
754
-
755
- #### 4. External AI Service层
756
- - **双向多提供商支持**: 统一的AI服务接口,双向数据流
757
- - **双向模型管理**: 动态模型加载、能力检测
758
- - **双向性能优化**: 批量处理、缓存机制、双向监控
759
-
760
- ### 配置系统
761
-
762
- #### 配置文件结构
763
- ```json
764
- {
765
- "version": "1.0",
766
- "server": {
767
- "host": "0.0.0.0",
768
- "port": 5506,
769
- "cors": {
770
- "enabled": true,
771
- "origins": ["*"]
772
- }
773
- },
774
- "providers": {
775
- "provider-id": {
776
- "type": "chat-http-provider|responses-http-provider|anthropic-http-provider|gemini-http-provider",
777
- "enabled": true,
778
- "config": {
779
- "providerType": "openai|responses|anthropic|gemini",
780
- "providerId": "glm|qwen|c4m",
781
- "baseUrl": "https://api.provider.com/v1",
782
- "auth": {
783
- "type": "apikey|oauth",
784
- "apiKey": "${API_KEY}" | "oauth-config"
785
- },
786
- "models": {
787
- "model-id": {
788
- "maxTokens": 8192,
789
- "temperature": 0.7,
790
- "supportsTools": true,
791
- "supportsStreaming": true
792
- }
793
- },
794
- "overrides": {
795
- "defaultModel": "gpt-4",
796
- "headers": {
797
- "User-Agent": "RouteCodex/2.0"
798
- }
799
- }
800
- }
801
- }
802
- },
803
- "pipelines": [
804
- {
805
- "id": "pipeline-id",
806
- "providerId": "provider-id",
807
- "models": ["model-1", "model-2"],
808
- "modules": {
809
- "llmSwitch": {
810
- "type": "openai-passthrough|anthropic-converter",
811
- "config": {}
812
- },
813
- "compatibility": {
814
- "type": "openai-normalizer|field-mapping",
815
- "config": {}
816
- },
817
- "provider": {
818
- "type": "openai-http|anthropic-http",
819
- "config": {}
820
- }
821
- },
822
- "hooks": {
823
- "preProcess": [],
824
- "postProcess": []
825
- }
826
- }
827
- ],
828
- "dynamicRouting": {
829
- "enabled": true,
830
- "defaultTarget": {
831
- "providerId": "default-provider",
832
- "modelId": "default-model"
833
- },
834
- "categories": {
835
- "category-id": {
836
- "targets": [
837
- {
838
- "providerId": "provider-id",
839
- "modelId": "model-id",
840
- "weight": 1.0
841
- }
842
- ],
843
- "triggers": [
844
- {
845
- "type": "token_count|content_type|keyword|language_detection",
846
- "condition": ">=|<=|==|contains|matches",
847
- "value": "threshold|pattern|list"
848
- }
849
- ]
850
- }
851
- }
852
- },
853
- "monitoring": {
854
- "enabled": true,
855
- "metrics": {
856
- "performance": true,
857
- "errors": true,
858
- "usage": true
859
- },
860
- "logging": {
861
- "level": "info",
862
- "format": "json"
863
- }
864
- },
865
- "dryRun": {
866
- "enabled": false,
867
- "global": {
868
- "defaultMode": "output-validation",
869
- "verbosity": "normal",
870
- "autoCleanup": true
871
- },
872
- "memory": {
873
- "maxMemoryUsage": 536870912,
874
- "cleanupInterval": 60000,
875
- "enableMonitoring": true
876
- }
877
- }
878
- }
879
- ```
880
-
881
- ## 🔧 开发指南
882
-
883
- ### 项目结构
884
-
885
- ```
886
- routecodex/
887
- ├── src/ # 源代码目录
888
- │ ├── cli.ts # CLI入口点
889
- │ ├── index.ts # 主模块入口
890
- │ ├── commands/ # CLI命令实现
891
- │ │ ├── start.ts # 启动命令
892
- │ │ ├── config.ts # 配置命令
893
- │ │ ├── dry-run.ts # Dry-run命令
894
- │ │ └── debug.ts # 调试命令
895
- │ ├── server/ # HTTP服务器
896
- │ │ ├── http-server.ts # 主HTTP服务器
897
- │ │ ├── websocket-server.ts # WebSocket服务器
898
- │ │ └── handlers/ # API处理器
899
- │ ├── modules/ # 核心模块
900
- │ │ ├── pipeline/ # 4层管道架构
901
- │ │ │ ├── modules/ # 管道模块
902
- │ │ │ │ ├── provider/ # Provider V2模块
903
- │ │ │ │ └── ...
904
- │ │ │ └── ...
905
- │ │ ├── config-manager/ # 配置管理
906
- │ │ ├── monitoring/ # 监控系统
907
- │ │ └── debug/ # 调试系统
908
- │ └── types/ # TypeScript类型定义
909
- ├── sharedmodule/ # 共享模块
910
- │ ├── llmswitch-core/ # LLM转换核心
911
- │ ├── config-engine/ # 配置引擎
912
- │ └── config-testkit/ # 配置测试工具
913
- ├── config/ # 配置文件
914
- │ ├── examples/ # 配置示例
915
- │ └── schemas/ # JSON Schema定义
916
- ├── scripts/ # 构建和安装脚本
917
- ├── web-interface/ # Web调试界面
918
- ├── docs/ # 文档
919
- ├── tests/ # 测试文件
920
- └── vendor/ # 第三方依赖
921
- ```
922
-
923
- #### HTTP服务器职责(精简版)
924
-
925
- - 服务器只负责 **HTTP ↔ Hub Pipeline** 转发:`/v1/chat`、`/v1/messages`、`/v1/responses` handler 将请求封装为 `HubPipelineRequest`,调用 `hubPipeline.execute()`,然后把返回的 provider payload/runtimeKey 交给对应 Provider。
926
- - ProviderPool、兼容层、Virtual Router、工具治理都由 llmswitch-core 完成。Host 只在启动时执行 `bootstrapVirtualRouterConfig`、构造 Hub Pipeline,并根据 `targetRuntime` 初始化 Provider 实例。
927
- - Provider runtime map 是唯一的数据来源:`bootstrapVirtualRouterConfig` 会输出 `targetRuntime[providerKey]`,Server 把该 profile 注入 `ChatHttpProvider`/`ResponsesHttpProvider`/`AnthropicHttpProvider`,同时通过 `attachProviderRuntimeMetadata` 把 `providerKey/runtimeKey/routeName` 写入请求体,确保错误上报与熔断都能定位到具体 key-alias。
928
- - SSE/JSON 序列化、错误处理、日志快照均由 llmswitch-core 的节点链完成,HTTP handler 不再负责心跳/重试等逻辑,真正实现“瘦”外壳,便于未来接入自定义编排。
929
-
930
- ### 🏗️ 兼容层架构重构
931
-
932
- #### 概述
933
-
934
- RouteCodex V2架构已完成兼容层的函数化重构,实现了两层架构设计,大幅提升了代码可维护性和模块化程度。
935
-
936
- #### 两层架构设计
937
-
938
- **第一层:接口兼容层**
939
- - 保持现有接口完全不变
940
- - 确保与PipelineManager的集成无任何破坏性改动
941
- - 提供向后兼容性和稳定性
942
-
943
- **第二层:函数化实现层**
944
- - 将复杂逻辑拆分为纯函数
945
- - 单一职责原则,每个函数专注特定功能
946
- - 易于测试、维护和扩展
947
-
948
- #### 重构成果
949
-
950
- **代码减少统计**
951
- - GLM兼容模块:234行 → 141行(减少40%)
952
- - iFlow兼容模块:201行 → 115行(减少43%)
953
- - 总计减少冗余代码:约740行
954
-
955
- **架构优化**
956
- - 移除重复wrapper实现
957
- - 统一适配器模式(`CompatibilityToPipelineAdapter`)
958
- - 正确的上下文传递和元数据管理
959
- - 完整的模块注册机制
960
-
961
- #### 核心文件结构
962
-
963
- ```
964
- sharedmodule/llmswitch-core/src/conversion/compat/
965
- ├── compat/profile-store # built-in profile registry
966
- ├── profiles/chat-*.json # chat models(glm / qwen / iflow / lmstudio ...)
967
- ├── profiles/responses-*.json # responses family(c4m、fai……)
968
- └── compat-engine.ts # request/response 映射引擎
969
-
970
- ⚠️ 0.89.258 起,兼容逻辑 **全部** 驻留在 llmswitch-core,由 virtual router 在命中 provider 后将 `compatibilityProfile` 注入 Hub Pipeline。Host 仓库已删除 `src/providers/compat/*`,仅保留 provider/runtime/handler;新增的兼容需求请直接在 sharedmodule 中新增 profile 并引用。
971
- ```
972
-
973
- #### 函数化实现模式
974
-
975
- 每个Provider模块采用统一的函数化模式:
976
-
977
- ```typescript
978
- // 函数化处理器(functions/provider-processor.ts)
979
- export const processProviderIncoming = async (request, config, context) => {
980
- // 请求处理逻辑
981
- };
982
-
983
- export const processProviderOutgoing = async (response, config, context) => {
984
- // 响应处理逻辑
985
- };
986
-
987
- export const sanitizeProviderToolsSchema = async (tools, config, context) => {
988
- // 工具schema清理
989
- };
990
-
991
- // 兼容模块主类(provider/provider-compatibility.ts)
992
- export class ProviderCompatibility implements CompatibilityModule {
993
- async processIncoming(request: UnknownObject, context: CompatibilityContext): Promise<UnknownObject> {
994
- return await processProviderIncoming(request, this.processConfig, context);
995
- }
996
- }
997
- ```
998
-
999
- #### 关键技术修复
1000
-
1001
- 1. **模块注册修复**:在PipelineManager中正确注册GLM和iFlow模块
1002
- 2. **上下文传递修复**:从SharedPipelineRequest.route.requestId提取真实ID
1003
- 3. **端点识别修复**:在CompatibilityContext顶层设置entryEndpoint
1004
- 4. **接口扩展**:为CompatibilityContext添加entryEndpoint字段
1005
-
1006
- #### 使用示例
1007
-
1008
- **创建新的Provider兼容模块**
1009
-
1010
- ```typescript
1011
- // 1. 创建functions/processor.ts
1012
- export const processNewProviderIncoming = async (request, config, context) => {
1013
- // 实现新Provider的请求转换逻辑
1014
- };
1015
-
1016
- // 2. 创建兼容模块主类
1017
- export class NewProviderCompatibility implements CompatibilityModule {
1018
- // 实现CompatibilityModule接口
1019
- async processIncoming(request: UnknownObject, context: CompatibilityContext): Promise<UnknownObject> {
1020
- return await processNewProviderIncoming(request, this.processConfig, context);
1021
- }
1022
- }
1023
-
1024
- // 3. 在PipelineManager中注册
1025
- this.registry.registerModule("new-provider", this.createNewProviderCompatibilityModule);
1026
- ```
1027
-
1028
- ### 构建和开发
1029
-
1030
- ```bash
1031
- # 安装依赖
1032
- npm install
1033
-
1034
- # 开发模式(热重载)
1035
- npm run dev
1036
-
1037
- # 构建项目
1038
- npm run build
1039
-
1040
- # 运行测试
1041
- npm test
1042
-
1043
- # 代码检查
1044
- npm run lint
1045
-
1046
- # 自动修复lint问题
1047
- npm run lint:fix
1048
-
1049
- # 类型检查
1050
- npm run type-check
1051
-
1052
- # 清理构建文件
1053
- npm run clean
1054
- ```
1055
-
1056
- ### 测试
1057
-
1058
- ```bash
1059
- # 运行所有测试
1060
- npm test
1061
-
1062
- # 运行特定测试
1063
- npm test -- --grep "provider"
1064
-
1065
- # 运行集成测试
1066
- npm run test:integration
1067
-
1068
- # 运行E2E测试
1069
- npm run test:e2e
1070
-
1071
- # 生成测试覆盖率报告
1072
- npm run test:coverage
1073
-
1074
- # 运行性能测试
1075
- npm run test:performance
1076
-
1077
- # 黄金样本 + Mock 回归(覆盖 chat/responses/anthropic)
1078
- npm run test:golden
1079
-
1080
- # 将 ~/.routecodex/golden_samples/new/** 同步到仓库内的 samples/ci-goldens/**
1081
- npm run sync:ci-goldens
1082
- ```
1083
-
1084
- #### Provider 专项测试
1085
-
1086
- | 测试文件 | 作用 |
1087
- | --- | --- |
1088
- | `tests/provider/provider-outbound-provider.test.ts` | 使用黄金样本(openai-chat/responses)验证 `ChatHttpProvider`/`ResponsesHttpProvider` 的请求整形、兼容层开关以及 HTTP 头部/模型注入。 |
1089
- | `tests/provider/provider-outbound-param.test.ts` | 从 `~/.routecodex/codex-samples` 按需加载聊天快照,分别对 openai/responses/anthropic 协议执行出站整形,确保三条链路共用相同 payload。 |
1090
- | `tests/provider/provider-composite-guards.test.ts` | 覆盖 ProviderComposite 的协议守卫(protocol ↔ providerType),模拟 ErrorCenter 回调,确保 mismatch 会 fail fast。 |
1091
- | `tests/provider/provider-factory.test.ts` | 校验 ProviderFactory 的 Fail-Fast 行为,未知 `providerType/moduleType` 会直接抛错,防止静默回退。 |
1092
-
1093
- > 建议在跑专项测试前设置 `RCC_TEST_FAKE_OPENAI_COMPAT=1` 等 mock 环境变量,以避免真实兼容模块加载 import.meta。
1094
-
1095
- #### 黄金样本库与 Mock 测试
1096
-
1097
- `samples/ci-goldens/<entry>/<provider>/` 随仓库提供一套最小聊天请求,确保在完全离线的 CI
1098
- 环境也能复现工具字段、system 块与 streaming 行为。`npm run test:golden` 会:
1099
-
1100
- 1. 执行 `scripts/tools/capture-provider-goldens.mjs --custom-only --update-golden`,把
1101
- `~/.routecodex/golden_samples/new/**` 或 `samples/ci-goldens/**` 中的最新请求复制到
1102
- `~/.routecodex/golden_samples/provider_golden_samples/`;
1103
- 2. 执行 `scripts/mock-provider/run-regressions.mjs`,通过 mock provider 跑完整的
1104
- chat/responses/anthropic 回归。
1105
-
1106
- 若本地存在 `~/.routecodex/codex-samples`,脚本会提示额外运行
1107
- `node scripts/mock-provider/capture-from-configs.mjs` 把真实 provider 录制转成 mock
1108
- 样本。若需要把最新的 `~/.routecodex/golden_samples/new/**` 同步进仓库,执行
1109
- `npm run sync:ci-goldens`;更多细节参见 `docs/golden-ci-library.md`。
1110
-
1111
- ### 代码规范
1112
-
1113
- - **TypeScript**: 严格模式,完整类型定义
1114
- - **ESLint**: 代码风格检查和错误预防
1115
- - **Prettier**: 代码格式化
1116
- - **Husky**: Git hooks,确保代码质量
1117
- - **Conventional Commits**: 标准化提交信息
1118
-
1119
- ## 📊 监控和调试
1120
-
1121
- ### Web调试界面
1122
-
1123
- RouteCodex提供功能强大的Web调试界面:
1124
-
1125
- ```bash
1126
- # 启动Web界面
1127
- cd web-interface
1128
- npm install
1129
- npm run dev
1130
-
1131
- # 访问界面
1132
- open http://localhost:3000
1133
- ```
1134
-
1135
- **功能特性**:
1136
- - 📊 实时性能仪表板
1137
- - 🔧 模块管理和配置
1138
- - 📈 交互式图表
1139
- - 🔍 事件探索器
1140
- - 🎨 响应式设计,支持深色模式
1141
-
1142
- ### CLI调试工具
1143
-
1144
- ```bash
1145
- # 查看系统状态
1146
- routecodex status
1147
-
1148
- # 验证配置
1149
- routecodex config validate
1150
-
1151
- # 测试提供商连接
1152
- routecodex test-provider --provider openai-provider
1153
-
1154
- # 查看实时日志
1155
- routecodex logs --follow
1156
-
1157
- # 导出调试数据
1158
- routecodex debug export --format json
1159
-
1160
- # 性能分析
1161
- routecodex debug profile --duration 60
1162
- ```
1163
-
1164
- ### API调试端点
1165
-
1166
- ```bash
1167
- # 系统健康检查
1168
- GET /api/debug/health
1169
-
1170
- # 模块状态列表
1171
- GET /api/debug/modules
1172
-
1173
- # 模块详细信息
1174
- GET /api/debug/modules/:id
1175
-
1176
- # 事件列表(支持过滤)
1177
- GET /api/debug/events?type=error&limit=100
1178
-
1179
- # 性能指标
1180
- GET /api/debug/metrics
1181
-
1182
- # 导出调试数据
1183
- GET /api/debug/export/:format
1184
- ```
1185
-
1186
- ## 🔌 集成示例
1187
-
1188
- ### Node.js集成
1189
-
1190
- ```javascript
1191
- import { RouteCodexClient } from 'routecodex-client';
1192
-
1193
- const client = new RouteCodexClient({
1194
- baseURL: 'http://localhost:5506',
1195
- apiKey: 'your-api-key'
1196
- });
1197
-
1198
- // 简单对话
1199
- const response = await client.chat.completions.create({
1200
- model: 'gpt-4',
1201
- messages: [
1202
- { role: 'user', content: 'Hello, RouteCodex!' }
1203
- ]
1204
- });
1205
-
1206
- console.log(response.choices[0].message.content);
1207
- ```
1208
-
1209
- ### Python集成
1210
-
1211
- ```python
1212
- import openai
1213
-
1214
- # 配置RouteCodex端点
1215
- openai.api_base = "http://localhost:5506/v1"
1216
- openai.api_key = "your-api-key"
1217
-
1218
- # 使用标准OpenAI客户端
1219
- response = openai.ChatCompletion.create(
1220
- model="gpt-4",
1221
- messages=[
1222
- {"role": "user", "content": "Hello from Python!"}
1223
- ]
1224
- )
1225
-
1226
- print(response.choices[0].message.content)
1227
- ```
1228
-
1229
- ### cURL集成
1230
-
1231
- ```bash
1232
- # 设置环境变量
1233
- export ROUTECODEX_URL="http://localhost:5506"
1234
- export ROUTECODEX_API_KEY="your-api-key"
1235
-
1236
- # 创建别名方便使用
1237
- alias rcurl='curl -H "Authorization: Bearer $ROUTECODEX_API_KEY" -H "Content-Type: application/json" $ROUTECODEX_URL/v1'
1238
-
1239
- # 使用别名调用API
1240
- rcurl/chat/completions -d '{
1241
- "model": "gpt-4",
1242
- "messages": [{"role": "user", "content": "Hello from cURL!"}]
1243
- }'
1244
- ```
1245
-
1246
- ## 🚨 故障排除
1247
-
1248
- ### 常见问题
1249
-
1250
- #### 1. 安装问题
1251
-
1252
- **问题**: `npm install -g routecodex` 权限错误
1253
- ```bash
1254
- # 解决方案1:使用nvm管理Node.js
1255
- curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
1256
- nvm install node
1257
- npm install -g routecodex
1258
-
1259
- # 解决方案2:直接使用npm install -g
1260
- npm install -g routecodex
1261
- ```
1262
-
1263
- #### 2. 启动失败
1264
-
1265
- **问题**: 端口被占用
1266
- ```bash
1267
- # 查看端口占用
1268
- lsof -i :5506
1269
-
1270
- # 杀死占用进程
1271
- kill -9 <PID>
1272
-
1273
- # 或者使用其他端口
1274
- routecodex start --port 5507
1275
- ```
1276
-
1277
- #### 3. 认证问题
1278
-
1279
- **问题**: API密钥无效
1280
- ```bash
1281
- # 检查环境变量
1282
- echo $OPENAI_API_KEY
1283
-
1284
- # 测试API连接
1285
- routecodex test-provider --provider openai-provider
1286
-
1287
- # 验证配置
1288
- routecodex config validate
1289
- ```
1290
-
1291
- #### 4. 性能问题
1292
-
1293
- **问题**: 响应速度慢
1294
- ```bash
1295
- # 启用性能监控
1296
- routecodex start --monitoring
1297
-
1298
- # 查看性能指标
1299
- curl http://localhost:5506/api/debug/metrics
1300
-
1301
- # 优化建议:
1302
- # 1. 增加连接池大小
1303
- # 2. 启用请求缓存
1304
- # 3. 调整超时设置
1305
- # 4. 使用更快的模型
1306
- ```
1307
-
1308
- ### 调试模式
1309
-
1310
- ```bash
1311
- # 启用详细日志
1312
- DEBUG=routecodex:* routecodex start
1313
-
1314
- # 启用调试API
1315
- routecodex start --debug-api
1316
-
1317
- # 查看内部状态
1318
- curl http://localhost:5506/api/debug/internal
1319
- ```
1320
-
1321
- ### 日志分析
1322
-
1323
- ```bash
1324
- # 查看错误日志
1325
- routecodex logs --level error
1326
-
1327
- # 实时跟踪日志
1328
- routecodex logs --follow
1329
-
1330
- # 导出日志
1331
- routecodex logs --export logs.json
1332
-
1333
- # 分析日志模式
1334
- routecodex logs --analyze --pattern "timeout"
1335
- ```
1336
-
1337
- ## 📈 性能优化
1338
-
1339
- ### 配置优化
1340
-
1341
- ```json
1342
- {
1343
- "server": {
1344
- "compression": true,
1345
- "maxRequestSize": "10mb",
1346
- "timeout": 30000
1347
- },
1348
- "providers": {
1349
- "provider-id": {
1350
- "connectionPool": {
1351
- "maxConnections": 10,
1352
- "minConnections": 2,
1353
- "acquireTimeout": 5000
1354
- },
1355
- "cache": {
1356
- "enabled": true,
1357
- "ttl": 300,
1358
- "maxSize": 1000
1359
- }
1360
- }
1361
- }
1362
- }
1363
- ```
1364
-
1365
- ### 监控指标
1366
-
1367
- - **响应时间**: P50, P95, P99延迟
1368
- - **吞吐量**: 每秒请求数
1369
- - **错误率**: 4xx/5xx错误比例
1370
- - **内存使用**: 堆内存和系统内存
1371
- - **CPU使用**: 处理器使用率
1372
-
1373
- ### 扩展性
1374
-
1375
- - **水平扩展**: 支持多实例部署
1376
- - **负载均衡**: 内置负载均衡策略
1377
- - **缓存策略**: 多级缓存机制
1378
- - **连接复用**: HTTP连接池管理
1379
-
1380
- ## 🤝 贡献指南
1381
-
1382
- ### 开发流程
1383
-
1384
- 1. **Fork仓库**并创建功能分支
1385
- ```bash
1386
- git checkout -b feature/amazing-feature
1387
- ```
1388
-
1389
- 2. **编写代码**并遵循项目规范
1390
- - TypeScript严格模式
1391
- - 完整的单元测试
1392
- - 详细的文档注释
1393
-
1394
- 3. **运行测试**确保代码质量
1395
- ```bash
1396
- npm test
1397
- npm run lint
1398
- npm run type-check
1399
- ```
1400
-
1401
- 4. **提交代码**使用规范化信息
1402
- ```bash
1403
- git commit -m "feat: add amazing feature"
1404
- ```
1405
-
1406
- 5. **推送分支**并创建Pull Request
1407
- ```bash
1408
- git push origin feature/amazing-feature
1409
- ```
1410
-
1411
- ### 代码贡献规范
1412
-
1413
- - **提交信息**: 遵循[Conventional Commits](https://www.conventionalcommits.org/)
1414
- - **代码风格**: 使用ESLint和Prettier保持一致
1415
- - **测试覆盖率**: 新功能必须包含测试,覆盖率>90%
1416
- - **文档更新**: 重大变更需要更新相关文档
1417
-
1418
- ### 问题报告
1419
-
1420
- 使用GitHub Issues报告问题时,请包含:
1421
-
1422
- - **详细描述**: 问题的具体表现
1423
- - **复现步骤**: 如何触发问题
1424
- - **环境信息**: OS、Node.js版本、RouteCodex版本
1425
- - **相关日志**: 错误日志和调试信息
1426
- - **期望行为**: 您期望发生什么
1427
-
1428
- ## 📄 许可证
1429
-
1430
- 本项目采用MIT许可证 - 详见[LICENSE](LICENSE)文件。
1431
-
1432
- ## 🙏 致谢
1433
-
1434
- 感谢以下开源项目的支持:
1435
-
1436
- - **OpenAI**: GPT模型和API标准
1437
- - **Anthropic**: Claude模型和安全研究
1438
- - **TypeScript**: 类型安全的JavaScript
1439
- - **Fastify**: 高性能Node.js web框架
1440
- - **Zod**: 运行时类型验证
1441
- - **Winston**: 日志管理库
1442
-
1443
- ## 📞 支持
1444
-
1445
- - **文档**: [完整文档](https://docs.routecodex.com)
1446
- - **API参考**: [API文档](https://api.routecodex.com)
1447
- - **社区**: [GitHub Discussions](https://github.com/your-repo/routecodex/discussions)
1448
- - **问题反馈**: [GitHub Issues](https://github.com/your-repo/routecodex/issues)
1449
- - **邮箱**: support@routecodex.com
1450
-
1451
- ## 🗺️ 路线图
1452
-
1453
- ### v1.0 (当前版本)
1454
- - ✅ 4层管道架构
1455
- - ✅ Provider V2系统
1456
- - ✅ 动态路由分类
1457
- - ✅ Dry-Run调试系统
1458
- - ✅ Web调试界面
1459
-
1460
- ### v1.1 (计划中)
1461
- - 🔄 更多AI提供商支持
1462
- - 🔄 插件系统
1463
- - 🔄 高级缓存策略
1464
- - 🔄 分布式部署支持
1465
-
1466
- ### v1.2 (未来版本)
1467
- - 📋 机器学习模型
1468
- - 📋 自动化测试
1469
- - 📋 性能优化
1470
- - 📋 安全增强
1471
-
1472
- ---
91
+ ## 文档
1473
92
 
1474
- **RouteCodex** - 让AI服务集成变得简单而强大 🚀
93
+ - 安装与快速上手:`docs/INSTALLATION_AND_QUICKSTART.md`
94
+ - 内置 Provider:`docs/PROVIDERS_BUILTIN.md`
95
+ - Provider 类型与协议:`docs/PROVIDER_TYPES.md`
96
+ - 路由指令/语法:`docs/routing-instructions.md`
97
+ - 端口与入口:`docs/PORTS.md`
98
+ - Codex / Claude Code 集成:`docs/CODEX_AND_CLAUDE_CODE.md`