@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
@@ -0,0 +1,69 @@
1
+ # Codex / Claude Code 接入 RouteCodex
2
+
3
+ ## 1) Codex(~/.codex/config.toml)
4
+
5
+ Codex 支持在 `~/.codex/config.toml` 里声明多个 `model_providers`。你可以把 RouteCodex 当作“上游 base_url”,让 Codex 的所有请求走本地代理。
6
+
7
+ 一个参考写法(与当前常见的 `tc/tcm` 命名保持一致):
8
+
9
+ ```toml
10
+ [model_providers.tc]
11
+ name = "rc"
12
+ base_url = "http://127.0.0.1:5555/v1"
13
+ wire_api = "chat"
14
+ env_key = "ROUTECODEX_APIKEY"
15
+
16
+ [model_providers.tcm]
17
+ name = "rc"
18
+ base_url = "http://127.0.0.1:5555/v1"
19
+ wire_api = "responses"
20
+ env_key = "ROUTECODEX_APIKEY"
21
+
22
+ [profiles.tc]
23
+ model_provider = "tc"
24
+ model = "gpt-5.2"
25
+
26
+ [profiles.tcm]
27
+ model_provider = "tcm"
28
+ model = "gpt-5.2"
29
+ ```
30
+
31
+ 如果你在 `~/.routecodex/config.json` 中设置了服务端访问密钥(`httpserver.apikey`),则需要在环境变量里提供同样的值:
32
+
33
+ ```bash
34
+ export ROUTECODEX_APIKEY="your-server-apikey"
35
+ ```
36
+
37
+ > RouteCodex 会接受 `Authorization: Bearer ...` 与 `x-api-key: ...` 等多种 header;Codex 侧如何出 header 取决于其实现与 `wire_api` 行为。
38
+
39
+ ## 2) RouteCodex 启动建议
40
+
41
+ ### 标准启动
42
+
43
+ ```bash
44
+ rcc start
45
+ ```
46
+
47
+ ### 针对 Codex / Claude 的系统提示词与 UA(可选)
48
+
49
+ ```bash
50
+ rcc start --codex
51
+ # 或
52
+ rcc start --claude
53
+ ```
54
+
55
+ ## 3) Claude Code(rcc code)
56
+
57
+ RouteCodex CLI 内置了 `rcc code` 来启动 Claude Code,并把 Claude Code 的请求代理到本地 RouteCodex:
58
+
59
+ ```bash
60
+ rcc code --ensure-server
61
+ ```
62
+
63
+ 常用参数:
64
+
65
+ - 指定 Claude Code 可执行文件:`rcc code --claude-path /path/to/claude`
66
+ - 指定模型:`rcc code --model <model>`
67
+ - 指定 profile:`rcc code --profile <profile>`
68
+ - 指定 server apikey:`rcc code --apikey <your-server-apikey>`
69
+
@@ -0,0 +1,517 @@
1
+ # RouteCodex 配置系统架构设计
2
+
3
+ ## 1. 系统架构概述
4
+
5
+ ### 1.1 配置层次结构
6
+ ```
7
+ 用户配置层 (~/.routecodex/config.json)
8
+
9
+ 系统模块默认 (./config/modules.json)
10
+
11
+ 配置解析器 (routecodex-config-loader)
12
+
13
+ 虚拟路由引导 (bootstrapVirtualRouterConfig)
14
+
15
+ VirtualRouterArtifacts (virtualRouter + targetRuntime)
16
+
17
+ 模块初始化 (Hub Pipeline + Provider Runtime)
18
+ ```
19
+
20
+ ### 1.2 核心设计原则
21
+ 1. **用户优先**: 用户配置覆盖系统默认配置
22
+ 2. **模块化**: 每个模块独立配置,支持深度合并
23
+ 3. **协议兼容**: 支持OpenAI和Anthropic协议输入/输出
24
+ 4. **密钥安全**: 支持AuthFile机制,密钥存储在用户目录
25
+ 5. **路由灵活**: 支持多目标负载均衡和协议转换
26
+
27
+ ## 2. 配置文件结构
28
+
29
+ ### 2.1 用户配置文件 (~/.routecodex/config.json)
30
+
31
+ ```json
32
+ {
33
+ "version": "1.0.0",
34
+ "description": "RouteCodex User Configuration",
35
+ "user": {
36
+ "name": "Default User",
37
+ "email": "user@example.com"
38
+ },
39
+
40
+ "virtualrouter": {
41
+ "inputProtocol": "openai", // openai | anthropic
42
+ "outputProtocol": "openai", // openai | anthropic
43
+
44
+ "providers": {
45
+ "openai": {
46
+ "type": "openai",
47
+ "baseURL": "https://api.openai.com/v1",
48
+ "apiKey": [
49
+ "sk-your-openai-key-here",
50
+ "authfile-openai-main",
51
+ "authfile-openai-backup"
52
+ ],
53
+ "models": {
54
+ "gpt-4": {
55
+ "maxContextTokens": 128000, // 可选(tokens),不配置使用默认 200000
56
+ "maxTokens": 32000 // 可选,不配置使用默认值
57
+ }
58
+ }
59
+ }
60
+ },
61
+
62
+ "routing": {
63
+ "default": [
64
+ "openai.gpt-4.sk-your-openai-key-here",
65
+ "openai.gpt-4.authfile-openai-main"
66
+ ],
67
+ "longContext": [
68
+ "anthropic.claude-3-5-sonnet-20241022.sk-ant-your-anthropic-key-here"
69
+ ]
70
+ }
71
+ },
72
+
73
+ "httpserver": {
74
+ "port": 8080,
75
+ "host": "0.0.0.0"
76
+ }
77
+ }
78
+ ```
79
+
80
+ ##### 2.1.x 路由池(主/备)配置
81
+
82
+ `virtualrouter.routing` 现在支持“池子”对象,用于声明优先级与备份策略。旧写法(字符串数组)仍被视为单一主池,无须改动。要显式声明主/备池,可使用下列结构:
83
+
84
+ ```jsonc
85
+ "routing": {
86
+ "default": [
87
+ { "id": "primary", "priority": 200, "targets": ["glm.glm-4.7", "tab.gpt-5.2-codex"] },
88
+ { "id": "backup", "backup": true, "targets": ["iflow.kimi-k2"] }
89
+ ],
90
+ "thinking": [
91
+ { "id": "thinking-main", "priority": 300, "targets": ["iflow.kimi-k2-thinking"] },
92
+ { "id": "thinking-secondary", "priority": 100, "targets": ["tab.gpt-5.2-codex"] },
93
+ { "id": "thinking-backup", "backup": true, "targets": ["glm.glm-4.7"] }
94
+ ]
95
+ }
96
+ ```
97
+
98
+ - `priority`:数字越大优先级越高,未显式配置时按声明顺序自动递减。
99
+ - `backup: true`:标记备用池,仅在所有主池耗尽后才会命中(即便 priority 较高,也会自动排在主池之后)。
100
+ - `targets`:与旧写法一致,为 `providerId.modelId`(可选 `providerId.alias.modelId`)列表。
101
+
102
+ Virtual Router 会在一次请求中依次尝试高优先级池;当前池所有 provider 临时不可用(如 429、健康熔断)时才会降级到下一池,并在下一次请求重新从最高优先级开始检查。
103
+
104
+ #### 2.1.1 Provider `process` 模式
105
+ - `process` 是 provider 节点的顶层字段,控制 RouteCodex 是否需要介入编解码。
106
+ - 取值 `chat`(默认):进入 Chat → Virtual Router → Provider 的标准链路,允许跨协议转换(如 `/v1/messages` → Responses)。
107
+ - 取值 `passthrough`:RouteCodex 仅负责路由/鉴权/日志,**请求与响应会原样透传**。为了避免协议错配,要求入口协议必须与 provider 类型一致(例如 providerType=`responses` 只能在 `/v1/responses` 入口透传),否则启动时直接抛错。
108
+ - Passthrough 模式仍然会写入 `client-request` / `provider-request` / `provider-response` 快照,便于审计,但不会再注入模型、stream、instruction 等治理字段。
109
+
110
+ #### 2.1.2 `contextRouting` 运行策略
111
+
112
+ `virtualrouter.contextRouting` 用于告诉引擎如何在“上下文接近耗尽”时调整路由。字段如下:
113
+
114
+ | 字段 | 含义 | 默认值 |
115
+ |------|------|--------|
116
+ | `warnRatio` | 当 `estimatedTokens / maxContextTokens` 高于该阈值时,会把 provider 归入 `risky`/`overflow` 候选,只有当前优先级池全部落入这些档位后才会尝试下一优先级池 | `0.9` |
117
+ | `hardLimit` | 为 `true` 时禁止使用 `maxContextTokens` 以内无法满足的 provider(即拒绝 overflow 候选)| `false` |
118
+
119
+ > `maxContextTokens` 由 provider 模型配置决定,未显式配置时默认为 **200000 tokens**(tiktoken 估算值)。旧字段 `maxContext` 仍支持,但建议迁移到 `maxContextTokens`。
120
+
121
+ ### 2.2 系统模块默认 (./config/modules.json)
122
+
123
+ ```json
124
+ {
125
+ "modules": {
126
+ "virtualrouter": {
127
+ "enabled": true,
128
+ "config": {
129
+ "moduleType": "virtual-router",
130
+ "timeout": 30000,
131
+ "inputProtocol": "openai",
132
+ "outputProtocol": "openai",
133
+ "userConfigDefaults": {
134
+ "maxContextTokens": 128000,
135
+ "maxTokens": 32000
136
+ }
137
+ }
138
+ },
139
+ "httpserver": {
140
+ "enabled": true,
141
+ "config": {
142
+ "moduleType": "http-server",
143
+ "port": 5506,
144
+ "host": "localhost"
145
+ }
146
+ }
147
+ }
148
+ }
149
+ ```
150
+
151
+ ### 2.3 虚拟路由产物 (VirtualRouterArtifacts)
152
+
153
+ `bootstrapVirtualRouterConfig` 输出对象包含两部分:
154
+
155
+ ```ts
156
+ type VirtualRouterArtifacts = {
157
+ config: {
158
+ routing: Record<string, Array<{ id: string; targets: string[]; priority: number; backup?: boolean }>>;
159
+ providers: Record<string, any>;
160
+ classifiers?: Record<string, any>;
161
+ };
162
+ targetRuntime: Record<string, ProviderRuntimeProfile>;
163
+ };
164
+ ```
165
+
166
+ - `config`: 由 Hub Pipeline 消费,包含虚拟路由、分类器、provider 描述等。
167
+ - `targetRuntime`: host 初始化 Provider 实例所需的资料(baseUrl、headers、auth、compatProfile、runtimeKey)。
168
+
169
+ 该对象在内存中直接传递,**不再写入旧版“合并配置”蓝图文件**。任何磁盘快照仅用于调试,不参与运行时决策。
170
+
171
+ ## 3. 配置解析和合并机制
172
+
173
+ ### 3.1 用户配置解析
174
+
175
+ #### 3.1.1 路由字符串解析
176
+ ```typescript
177
+ // 路由字符串格式: "provider.model.key"
178
+ const routeString = "openai.gpt-4.sk-your-openai-key-here";
179
+
180
+ // 解析结果
181
+ interface RouteTarget {
182
+ providerId: string;
183
+ modelId: string;
184
+ keyId: string;
185
+ actualKey: string;
186
+ inputProtocol: "openai" | "anthropic";
187
+ outputProtocol: "openai" | "anthropic";
188
+ }
189
+ ```
190
+
191
+ #### 3.1.2 AuthFile解析
192
+ ```typescript
193
+ // AuthFile格式: "authfile-{filename}"
194
+ // 密钥文件位置: ~/.routecodex/auth/{filename}
195
+ interface AuthFileResolver {
196
+ resolveAuthKey(keyId: string): string;
197
+ }
198
+ ```
199
+
200
+ #### 3.1.3 模型配置补充
201
+ ```typescript
202
+ // 用户配置 + 系统默认值 = 完整配置
203
+ interface ModelConfig {
204
+ maxContextTokens: number; // 用户配置或系统默认 (200000 tokens)
205
+ maxTokens: number; // 用户配置或系统默认(32000)
206
+ }
207
+ ```
208
+
209
+ ### 3.2 配置合并策略
210
+
211
+ #### 3.2.1 深度合并
212
+ ```typescript
213
+ interface ConfigMerger {
214
+ merge(
215
+ systemConfig: ModulesConfig,
216
+ userConfig: UserConfig
217
+ ): MergedConfig;
218
+ }
219
+ ```
220
+
221
+ #### 3.2.2 优先级规则
222
+ 1. 用户配置 > 系统默认配置
223
+ 2. 具体配置 > 通用配置
224
+ 3. 运行时配置 > 文件配置
225
+
226
+ ### 3.3 虚拟路由配置生成
227
+
228
+ #### 3.3.1 路由目标池表
229
+ ```typescript
230
+ interface RouteTargetPool {
231
+ [routeName: string]: RouteTarget[];
232
+ }
233
+
234
+ // 用途: 路由器快速查找目标
235
+ {
236
+ "default": [
237
+ {
238
+ "providerId": "openai",
239
+ "modelId": "gpt-4",
240
+ "keyId": "sk-your-openai-key-here",
241
+ "actualKey": "sk-your-openai-key-here",
242
+ "inputProtocol": "openai",
243
+ "outputProtocol": "openai"
244
+ }
245
+ ]
246
+ }
247
+ ```
248
+
249
+ #### 3.3.2 流水线配置表
250
+ ```typescript
251
+ interface PipelineConfigs {
252
+ [providerModelKey: string]: PipelineConfig;
253
+ }
254
+
255
+ // 用途: 流水线执行详细配置
256
+ {
257
+ "openai.gpt-4.sk-your-openai-key-here": {
258
+ "provider": {
259
+ "type": "openai",
260
+ "baseURL": "https://api.openai.com/v1"
261
+ },
262
+ "model": {
263
+ "maxContextTokens": 128000,
264
+ "maxTokens": 32000
265
+ },
266
+ "keyConfig": {
267
+ "keyId": "sk-your-openai-key-here",
268
+ "actualKey": "sk-your-openai-key-here"
269
+ },
270
+ "protocols": {
271
+ "input": "openai",
272
+ "output": "openai"
273
+ }
274
+ }
275
+ }
276
+ ```
277
+
278
+ ## 4. 模块适配
279
+
280
+ ### 4.1 虚拟路由模块
281
+
282
+ #### 4.1.1 配置接口
283
+ ```typescript
284
+ interface VirtualRouterConfig {
285
+ routeTargets: RouteTargetPool;
286
+ pipelineConfigs: PipelineConfigs;
287
+ inputProtocol: "openai" | "anthropic";
288
+ outputProtocol: "openai" | "anthropic";
289
+ timeout: number;
290
+ }
291
+ ```
292
+
293
+ #### 4.1.2 初始化流程
294
+ ```typescript
295
+ class VirtualRouterModule {
296
+ async initialize(config: VirtualRouterConfig): Promise<void> {
297
+ // 1. 加载路由目标池
298
+ this.routeTargetPool = config.routeTargets;
299
+
300
+ // 2. 初始化流水线配置
301
+ this.pipelineConfigs = config.pipelineConfigs;
302
+
303
+ // 3. 设置协议转换
304
+ this.protocolManager.setProtocols(
305
+ config.inputProtocol,
306
+ config.outputProtocol
307
+ );
308
+ }
309
+ }
310
+ ```
311
+
312
+ ### 4.2 配置管理模块
313
+
314
+ #### 4.2.1 配置文件管理
315
+ ```typescript
316
+ class ConfigManagerModule {
317
+ async loadVirtualRouterArtifacts(): Promise<VirtualRouterArtifacts> {
318
+ const { userConfig } = await loadRouteCodexConfig();
319
+ return bootstrapVirtualRouterConfig(userConfig.virtualrouter ?? userConfig);
320
+ }
321
+ }
322
+ ```
323
+
324
+ ## 5. 密钥管理
325
+
326
+ ### 5.1 AuthFile机制
327
+
328
+ #### 5.1.1 密钥文件位置
329
+ ```
330
+ ~/.routecodex/auth/
331
+ ├── openai-main
332
+ ├── openai-backup
333
+ └── anthropic-main
334
+ ```
335
+
336
+ #### 5.1.2 密钥文件格式
337
+ ```bash
338
+ # ~/.routecodex/auth/openai-main
339
+ sk-your-actual-openai-key-here
340
+
341
+ # ~/.routecodex/auth/anthropic-main
342
+ sk-ant-your-actual-anthropic-key-here
343
+ ```
344
+
345
+ ### 5.2 密钥安全
346
+
347
+ #### 5.2.1 文件权限
348
+ ```bash
349
+ chmod 600 ~/.routecodex/auth/*
350
+ ```
351
+
352
+ #### 5.2.2 密钥缓存
353
+ ```typescript
354
+ interface KeyCache {
355
+ get(keyId: string): string | null;
356
+ set(keyId: string, value: string): void;
357
+ clear(): void;
358
+ }
359
+ ```
360
+
361
+ ## 6. 协议支持
362
+
363
+ ### 6.1 输入协议
364
+
365
+ #### 6.1.1 OpenAI协议
366
+ - 格式: OpenAI Chat Completions API
367
+ - 版本: v1
368
+ - 内容类型: application/json
369
+
370
+ #### 6.1.2 Anthropic协议
371
+ - 格式: Anthropic Messages API
372
+ - 版本: v1
373
+ - 内容类型: application/json
374
+
375
+ ### 6.2 输出协议
376
+
377
+ #### 6.2.1 协议转换
378
+ ```typescript
379
+ interface ProtocolConverter {
380
+ convertOpenAItoAnthropic(request: OpenAIRequest): AnthropicRequest;
381
+ convertAnthropicToOpenAI(request: AnthropicRequest): OpenAIRequest;
382
+ }
383
+ ```
384
+
385
+ ## 7. 负载均衡和容错
386
+
387
+ ### 7.1 路由策略
388
+
389
+ #### 7.1.1 轮询策略
390
+ ```typescript
391
+ interface RoundRobinStrategy {
392
+ getNextTarget(routeName: string): RouteTarget;
393
+ }
394
+ ```
395
+
396
+ #### 7.1.2 负载均衡
397
+ ```typescript
398
+ interface LoadBalancer {
399
+ selectTarget(targets: RouteTarget[]): RouteTarget;
400
+ updateMetrics(targetId: string, success: boolean): void;
401
+ }
402
+ ```
403
+
404
+ ### 7.2 错误处理
405
+
406
+ #### 7.2.1 密钥失效处理
407
+ ```typescript
408
+ interface KeyFailureHandler {
409
+ handleKeyFailure(keyId: string): void;
410
+ isKeyBlacklisted(keyId: string): boolean;
411
+ }
412
+ ```
413
+
414
+ #### 7.2.2 目标切换
415
+ ```typescript
416
+ interface TargetSwitcher {
417
+ switchTarget(currentTarget: RouteTarget): RouteTarget;
418
+ getAvailableTargets(routeName: string): RouteTarget[];
419
+ }
420
+ ```
421
+
422
+ ## 8. 实施计划
423
+
424
+ ### Phase 1: 配置解析器
425
+ 1. **UserConfigParser** - 解析用户配置
426
+ 2. **AuthFileResolver** - 处理AuthFile
427
+ 3. **RouteTargetParser** - 解析路由字符串
428
+
429
+ ### Phase 2: 配置合并器
430
+ 1. **ConfigMerger** - 合并系统配置和用户配置
431
+ 2. **MergedConfigGenerator** - 生成合并后配置文件
432
+ 3. **ConfigFileManager** - 管理配置文件
433
+
434
+ ### Phase 3: 虚拟路由模块
435
+ 1. **VirtualRouterModule** - 重构虚拟路由模块
436
+ 2. **RouteTargetPool** - 路由目标池管理
437
+ 3. **PipelineConfigManager** - 流水线配置管理
438
+
439
+ ### Phase 4: 协议和密钥管理
440
+ 1. **ProtocolManager** - 协议转换管理
441
+ 2. **KeyManager** - 密钥管理和缓存
442
+ 3. **LoadBalancer** - 负载均衡实现
443
+
444
+ ### Phase 5: 测试和优化
445
+ 1. **配置解析测试** - 验证配置正确性
446
+ 2. **路由功能测试** - 验证路由逻辑
447
+ 3. **性能优化** - 优化配置加载和路由性能
448
+
449
+ ## 9. 配置示例
450
+
451
+ ### 9.1 基础配置
452
+ ```json
453
+ {
454
+ "virtualrouter": {
455
+ "providers": {
456
+ "openai": {
457
+ "apiKey": ["sk-your-key"],
458
+ "models": {
459
+ "gpt-4": {}
460
+ }
461
+ }
462
+ },
463
+ "routing": {
464
+ "default": ["openai.gpt-4.sk-your-key"]
465
+ }
466
+ }
467
+ }
468
+ ```
469
+
470
+ ### 9.2 多供应商配置
471
+ ```json
472
+ {
473
+ "virtualrouter": {
474
+ "providers": {
475
+ "openai": {
476
+ "apiKey": ["sk-openai-key"],
477
+ "models": {
478
+ "gpt-4": {}
479
+ }
480
+ },
481
+ "anthropic": {
482
+ "apiKey": ["sk-ant-key"],
483
+ "models": {
484
+ "claude-3-sonnet": {}
485
+ }
486
+ }
487
+ },
488
+ "routing": {
489
+ "default": [
490
+ "openai.gpt-4.sk-openai-key",
491
+ "anthropic.claude-3-sonnet.sk-ant-key"
492
+ ]
493
+ }
494
+ }
495
+ }
496
+ ```
497
+
498
+ ### 9.3 协议转换配置
499
+ ```json
500
+ {
501
+ "virtualrouter": {
502
+ "inputProtocol": "anthropic",
503
+ "outputProtocol": "openai",
504
+ "providers": {
505
+ "anthropic": {
506
+ "apiKey": ["sk-ant-key"],
507
+ "models": {
508
+ "claude-3-sonnet": {}
509
+ }
510
+ }
511
+ },
512
+ "routing": {
513
+ "default": ["anthropic.claude-3-sonnet.sk-ant-key"]
514
+ }
515
+ }
516
+ }
517
+ ```
File without changes
@@ -0,0 +1,98 @@
1
+ # gcli2api 对齐缺口(RouteCodex / llmswitch-core)
2
+
3
+ 日期:2026-01-22
4
+
5
+ 本文用于把 `gcli2api`(Python)里已验证过的“兼容/风控”经验点,和 RouteCodex V2 的单一路径架构做一次对齐盘点:
6
+
7
+ `HTTP server → llmswitch-core Hub Pipeline → Provider V2 → upstream AI`
8
+
9
+ 目标是:不在 Host/Provider 做语义修复、不绕过 Hub Pipeline,缺口优先落到 `llmswitch-core` 的 conversion/compat 层,或通过 `ProviderQuotaView`/健康度机制落到路由层。
10
+
11
+ ---
12
+
13
+ ## 1) gcli2api 最新关键行为(与本仓库相关)
14
+
15
+ ### 1.1 thoughtSignature 的“往返保留”
16
+
17
+ `gcli2api` 在把 Gemini/Antigravity 的 `functionCall` 变成 OpenAI 工具调用时,会把 `thoughtSignature` 编码进 `tool_call_id`(分隔符 `__thought__`),随后在 OpenAI→Gemini 的方向再解码出来:
18
+
19
+ - 目的:有些客户端(尤其是工具链/SDK)会丢弃 OpenAI tool_call 上的“非标准字段”(例如 `thought_signature` 或 `extra_content`),导致二次回传时无法恢复签名,从而触发上游校验失败。
20
+ - 策略:有签名则编码到 ID;没有签名则仍能正常工作(回落到 dummy/skip 签名)。
21
+
22
+ ### 1.2 thinking 块签名校验与清理
23
+
24
+ `gcli2api` 对历史消息里的 thinking 块做:
25
+
26
+ - `MIN_SIGNATURE_LENGTH = 10`
27
+ - 无效签名:有内容则降级为 text;空内容则丢弃
28
+ - 额外:移除尾部未签名 thinking
29
+
30
+ (本仓库已在 llmswitch-core 增加对应 validator,但“ID 编码保留”目前未实现。)
31
+
32
+ ### 1.3 Antigravity 429 处理(倾向于“先自救、再失败”)
33
+
34
+ `gcli2api` 在 Antigravity 上游返回 429/禁用码时:
35
+
36
+ - 记录错误与冷却
37
+ - 在允许范围内重试,并在重试前预热下一凭证(不阻塞)
38
+ - 达到最大重试或不可重试才把原始错误回给客户端
39
+
40
+ 此处的核心思想是:**不要把可恢复的短暂上游容量波动过早暴露给客户端**(尤其是 Codex CLI 对 429 处理会“直接中断”)。
41
+
42
+ ---
43
+
44
+ ## 2) 当前 RouteCodex/llmswitch-core 对应现状
45
+
46
+ ### 2.1 已覆盖点
47
+
48
+ - `llmswitch-core/src/conversion/shared/thought-signature-validator.ts`:thinking 块签名校验/清理(与 gcli2api 的逻辑一致)
49
+ - Gemini ↔ OpenAI 转换中已存在 `skip_thought_signature_validator` dummy 签名兜底(用于满足上游结构要求)
50
+
51
+ ### 2.2 仍缺口点(需要补齐/确认)
52
+
53
+ #### A) thoughtSignature 的“tool_call_id 编码保留”缺失
54
+
55
+ 当前 llmswitch-core 在 OpenAI tool_call 上会尝试携带 `thought_signature` / `extra_content.google`,但**如果客户端丢弃这些字段**,下一轮回传后就只能回落到 dummy 签名;在部分上游/模式下可能会触发兼容问题。
56
+
57
+ 建议引入与 gcli2api 相同的 **可配置** 编码策略:
58
+
59
+ - 编码:`<id>__thought__<signature>`
60
+ - 解码:按分隔符 split 一次
61
+ - 仅在“需要跨客户端往返保留签名”的协议/compat profile 下开启(默认关闭,避免污染普通 OpenAI 调用的 tool_call_id 语义)。
62
+
63
+ #### B) Antigravity 429 容量耗尽的分类冷却
64
+
65
+ 日志里出现的 429 形态(`MODEL_CAPACITY_EXHAUSTED / No capacity available`)本质不是“quota 不足”,更像上游的临时容量波动。
66
+
67
+ 需要补的行为(建议在路由/健康度层处理,而不是 provider 语义层):
68
+
69
+ - 从 429 payload 中提取“容量耗尽”原因
70
+ - 对整个 model 系列施加短冷却(例如 60 秒)
71
+ - 冷却优先级 > quota(quota 视图显示有额度但仍报错时,应按错误退避走)
72
+
73
+ #### C) “同一 key 先用到底,再换 key”的 Antigravity 轮询策略
74
+
75
+ 为了避免多 key 轮询导致被 server 侧识别为异常(或更容易触发拒绝),Antigravity 可采用:
76
+
77
+ - 正常阶段:保持单 key 连续命中(直到出现错误/冷却)
78
+ - 出错后:快速切到当前最健康 key
79
+ - 恢复后:再按健康权重 RR 在健康 key 间均衡
80
+
81
+ 该策略必须保证 **alias 之间隔离(不误伤)**,并避免“永远命中同一个健康 key / 有 key 永远命不中”的极端情况(需要测试覆盖)。
82
+
83
+ ---
84
+
85
+ ## 3) 建议落地方式(不违反 V2 约束)
86
+
87
+ 1. **thoughtSignature ID 编码**:实现到 `llmswitch-core` conversion/shared(工具函数)并在 Gemini/Antigravity 相关 codec/mapper 中通过 profile 开关启用。
88
+ 2. **429 分类冷却**:落到 quota/health 视图(`ProviderQuotaView` 或路由健康度模块)里;Provider 只负责 transport 级错误透传与重试。
89
+ 3. **Antigravity key 选择策略**:落到路由池选择/健康权重 RR;不在 provider 层“语义路由”。
90
+
91
+ ---
92
+
93
+ ## 4) 待确认(实现前需要你审批的点)
94
+
95
+ 1. 是否默认对 `gemini-chat`/`antigravity` 开启 tool_call_id 的 thoughtSignature 编码?还是仅在 `ROUTECODEX_PRESERVE_THOUGHT_SIGNATURE=1` 时开启?
96
+ 2. 分隔符是否固定为 `__thought__`(与 gcli2api 对齐),还是做成 profile 可覆盖?
97
+ 3. 429 容量耗尽的“model 系列”归并规则:按 `providerKey::model` 归并,还是按 `providerId::modelFamily`(例如 `claude-sonnet-4-5-*`)归并?
98
+