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