@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,62 @@
1
+ # Gemini Provider (gemini-chat)
2
+
3
+ 本页介绍 Gemini HTTP Provider 的使用与测试方法(基于 Google Generative Language API)。
4
+
5
+ ## 基本信息
6
+ - 基地址:`https://generativelanguage.googleapis.com/v1beta`
7
+ - 端点:`/models/{model}:generateContent`
8
+ - 认证:API Key(请求头 `x-goog-api-key: <KEY>`,或自动从 `Authorization: Bearer <KEY>` 转换)
9
+ - 协议类型:`gemini`(providerProtocol=`gemini-chat`)
10
+
11
+ ## 配置示例
12
+
13
+ ```json
14
+ {
15
+ "type": "gemini-http-provider",
16
+ "config": {
17
+ "providerType": "gemini",
18
+ "baseUrl": "https://generativelanguage.googleapis.com/v1beta",
19
+ "model": "gemini-2.5-flash-lite",
20
+ "auth": {
21
+ "type": "apikey",
22
+ "headerName": "x-goog-api-key",
23
+ "apiKey": "<YOUR_GEMINI_API_KEY>"
24
+ }
25
+ }
26
+ }
27
+ ```
28
+
29
+ > 注意:若 `auth.headerName` 未设置,本 Provider 会在发送前将 `Authorization: Bearer <KEY>` 自动转换为 `x-goog-api-key: <KEY>`。
30
+
31
+ ## 协议映射(最小)
32
+ - 入站(OpenAI Chat → Gemini contents):Provider 在 `preprocessRequest` 做最小映射:
33
+ - `messages[].role=user|assistant` → `contents[].role=user|model`
34
+ - `messages[].content` → `parts[].text`
35
+ - `system` 合并为 `systemInstruction`
36
+ - 可选生成参数:`max_tokens` → `generationConfig.maxOutputTokens`,`temperature`、`top_p` 对应映射
37
+ - 返回:保持上游 JSON 原样返回(包含 `candidates` / `content`)。Composite 响应侧已允许 `candidates` 通过形状守卫。
38
+
39
+ ## provider update(模型更新)
40
+
41
+ `src/tools/provider-update` 已支持 Gemini 的 `/models` 结果(`{ models: [{ name: 'models/<id>'}, ...] }`)。示例:
42
+
43
+ ```bash
44
+ node dist/tools/provider-update/index.js \
45
+ --config /Users/you/.routecodex/provider/gemini/config.json \
46
+ --write --probe-keys --verbose
47
+ ```
48
+
49
+ 要求:配置文件中 `auth.headerName` 为 `x-goog-api-key` 或者确保 `Authorization: Bearer <KEY>` 可用(工具也支持 headerName/prefix 覆盖)。
50
+
51
+ ## 快速联调(本地脚本)
52
+
53
+ ```bash
54
+ GEMINI_API_KEY=**** npm run build
55
+ GEMINI_API_KEY=**** node scripts/gemini-smoke.mjs
56
+ ```
57
+
58
+ 脚本默认使用 `gemini-2.5-flash-lite` 并发送简短提示;返回结果仅截断打印前 500 字符。
59
+
60
+ ## 测试建议
61
+ - 单元:按 docs/providers/provider-composite-testing.md 中“协议守卫/形状漂移”用例增加 `gemini-chat` 断言;已允许 `candidates` 通过。
62
+ - 集成:在 provider_golden_samples 中增加 `gemini-chat` 的 request/response 样例(可按真实 wire 形状扩展),并在蓝图回归中启用 gemini 路径。
@@ -0,0 +1,102 @@
1
+ **Title**
2
+ - LM Studio → Provider V2 Migration Analysis
3
+
4
+ **Summary**
5
+ - Decision: Reuse `openai-standard` provider with a thin `lmstudio-compatibility` module. This aligns with V2 principles (minimal compatibility, no tool logic in provider) and leverages existing OpenAI‑compatible behavior of LM Studio.
6
+ - Scope: Chat Completions (`/v1/chat/completions`) supported out of the box; Responses (`/v1/responses`) can be enabled using the existing Responses profile + upstream SSE passthrough design, gated by configuration.
7
+
8
+ **Why This Approach**
9
+ - OpenAI compatibility: LM Studio implements OpenAI‑compatible endpoints and shapes (messages, tools, tool_calls, streaming), so OpenAI‑standard fits.
10
+ - Existing service profile: A dedicated `lmstudio` service profile exists and targets localhost defaults and OpenAI‑style endpoints (src/providers/core/config/service-profiles.ts:92).
11
+ - Minimal compatibility needs: Only small request/response shape adjustments are required (e.g., `tool_choice` normalization), which belong in Compatibility, not Provider.
12
+
13
+ **Provider Choice**
14
+ - Use `openai-standard` with `providerType: 'lmstudio'`.
15
+ - Mapping is already defined: `CONFIG_MAPPINGS['lmstudio-provider-simple'] = 'openai-standard'` (src/providers/core/api/provider-config.ts:103-112).
16
+ - LM Studio profile defaults:
17
+ - Base URL: `http://localhost:${DEFAULT_CONFIG.LM_STUDIO_PORT}`
18
+ - Endpoint: `/v1/chat/completions`
19
+ - Headers: `Content-Type: application/json`
20
+ - Location: src/providers/core/config/service-profiles.ts:92-103
21
+
22
+ **Compatibility Responsibilities**
23
+ - Keep compatibility minimal, provider‑agnostic, and confined to the Compatibility layer:
24
+ - Normalize `tool_choice` to LM Studio’s expected strings when an OpenAI object is provided, forcing `'required'` in that case(逻辑现由 `sharedmodule/llmswitch-core` 中的 compat profile 提供)。
25
+ - Preserve OpenAI tool shape (direct mapping of `tools` and `choices[].message.tool_calls`).
26
+ - Maintain `object` values like `chat.completion` and `chat.completion.chunk` in responses.
27
+ - Do not duplicate llmswitch-core tool governance (canonicalization/harvest/repair) in Compatibility per AGENTS.md.
28
+
29
+ **API Surface Alignment**
30
+ - Chat Completions (`/v1/chat/completions`)
31
+ - Requests: `model`, `messages`, `tools`, `tool_choice`, `stream`, `max_tokens`, `temperature`, etc. Direct mapping per transformation tables (docs/transformation-tables/claude-code-router-openai-to-lmstudio.json).
32
+ - Responses: OpenAI‑shaped `choices[0].message.tool_calls` with `finish_reason: 'tool_calls'`. `object: 'chat.completion'` and streaming chunks `chat.completion.chunk` are preserved.
33
+ - Responses API (`/v1/responses`)
34
+ - Supported via existing “Responses provider” design when needed. Upstream SSE passthrough can be enabled and paired with compatibility that does no destructive filtering of event streams. See docs/responses-passthrough-provider-design.md.
35
+
36
+ **Streaming**
37
+ - Chat Completions streaming uses standard OpenAI chunk format; `openai-standard` handles this consistently.
38
+ - For Responses SSE passthrough, use the dedicated `responses` profile with required headers (e.g., `OpenAI-Beta`) and tee/pipe handling. See service profiles and passthrough design docs.
39
+
40
+ **Error Handling**
41
+ - LM Studio error shapes can be treated as OpenAI‑style error objects; transformation table marks them as direct mappings (docs/transformation-tables/claude-code-router-openai-to-lmstudio.json).
42
+ - Follow Fail Fast: no hidden fallbacks in provider; only shape normalization in Compatibility.
43
+
44
+ **Config Blueprint**
45
+ - Provider V2 (OpenAI standard with LM Studio profile):
46
+ ```
47
+ {
48
+ "type": "openai-standard",
49
+ "config": {
50
+ "providerType": "lmstudio",
51
+ "auth": { "type": "apikey", "apiKey": "local-dev" },
52
+ "overrides": {
53
+ "baseUrl": "http://localhost:1234",
54
+ "endpoint": "/v1/chat/completions"
55
+ }
56
+ }
57
+ }
58
+ ```
59
+ - Compatibility (minimal, auto‑inferred for providerType `lmstudio`):
60
+ ```
61
+ {
62
+ "type": "lmstudio-compatibility",
63
+ "config": {
64
+ "toolsEnabled": true
65
+ }
66
+ }
67
+ ```
68
+
69
+ **Key Implementation Notes**
70
+ - Provider
71
+ - Reuse `openai-standard` end‑to‑end; select `ServiceProfile('lmstudio')` for defaults. No tool logic here.
72
+ - For Responses passthrough, use the dedicated `responses` profile if routing `/v1/responses` to LM Studio’s OpenAI‑compatible Responses endpoint.
73
+ - Compatibility
74
+ - Ensure LM Studio compat profile is available and registered(type 由 `compatibilityProfile` 指定)。It performs only light normalization/mapping; notably `tool_choice` normalization and direct mapping rules for tools/tool_calls(均驻留在 llmswitch-core compat 中)。
75
+ - Keep response `object` and tool call shapes intact (see same file, response rules section around id `tool-calls-response`).
76
+ - llmswitch-core
77
+ - Tool canonicalization, harvesting from text, and argument repair remain centralized per AGENTS.md; do not reimplement in Compatibility/Provider.
78
+
79
+ **Validation Plan**
80
+ - Local dry‑runs and shape checks
81
+ - Use `npm run test:lmstudio-dryrun` to validate tool call flows and response shapes.
82
+ - Review prior LM Studio dry‑run docs for expected shapes (docs/lmstudio-dry-run-summary.md, docs/lmstudio-tool-calling.md).
83
+ - Snapshots & SSE
84
+ - Enable upstream SSE passthrough when validating `/v1/responses`; verify event integrity and headers.
85
+ - Compatibility integrity
86
+ - Confirm that `tool_choice` object inputs become `'required'` and result in `finish_reason: 'tool_calls'` when tools are selected.
87
+
88
+ **Open Items / Risks**
89
+ - Responses header/versioning: Confirm current `OpenAI-Beta` header value when targeting `/v1/responses` upstream.
90
+ - Auth expectations: LM Studio local deployments often accept requests without Authorization; retaining an API key header is typically harmless, but confirm server configuration.
91
+ - Compatibility registration: Ensure `lmstudio-compatibility` type is registered with `CompatibilityModuleFactory` if created via type string.
92
+
93
+ **References**
94
+ - `src/providers/core/api/provider-config.ts:103` — maps `lmstudio-provider-simple` to `openai-standard`.
95
+ - `src/providers/core/config/service-profiles.ts:92` — LM Studio service profile defaults.
96
+ - 历史实现:`src/providers/compat/lmstudio-compatibility.ts:76` — `tool_choice` normalization logic(已迁移至 sharedmodule/llmswitch-core compat profiles)。
97
+ - `docs/lmstudio-tool-calling.md:1` — LM Studio tool calling shape and examples.
98
+ - `docs/transformation-tables/claude-code-router-openai-to-lmstudio.json:1` — direct mappings for OpenAI↔LM Studio.
99
+ - `docs/responses-passthrough-provider-design.md:3` — Responses SSE passthrough design.
100
+
101
+ **Conclusion**
102
+ - Answer to Q1: Yes — reuse `openai-standard` with `lmstudio-compatibility`. This yields minimal, standards‑aligned integration under Provider V2, keeps tool governance centralized in llmswitch‑core, and supports both Chat Completions and Responses with straightforward configuration.
@@ -0,0 +1,142 @@
1
+ # ProviderComposite 设计(兼容层内聚到 Provider)
2
+
3
+ 本设计将“Compatibility 兼容层”内聚为 Provider 节点的协议敏感子插件(compat-subnode),在出站/返回两侧做强类型守卫,统一使用 BasePipeline 注入的 runtime metadata(虚拟路由结果)作为唯一真理来源。
4
+
5
+ ## 目标与原则
6
+
7
+ - 仅按协议类型划分 Provider:`openai-chat`、`openai-responses`、`anthropic-messages`(预留 `gemini-chat`)。
8
+ - 兼容层内聚:ProviderComposite 在 Provider 内部调用 compat 子插件;Host 流水线不再显式编排 compatibility 节点。
9
+ - 协议守卫(Fail Fast):入/出两侧验证 `providerType → providerProtocol` 的映射;任何形状漂移立即报错。
10
+ - 工具治理边界:工具解析/修复/收割仅在 llmswitch-core 的 process 链路,compat 子插件严格“最小字段修剪/映射/黑名单”。
11
+ - SSE 边界:Provider 对上游可用 SSE,但对 Host 一律返回 JSON;客户端方向的 SSE 仅在 llmswitch-core 的 sse 节点族出现。
12
+
13
+ ## 背景:runtime metadata 统一输入
14
+
15
+ - BasePipeline 在构建 request/response context 时,将虚拟路由回写的 `providerType`/`providerProtocol`/`providerKey`/`routeName`/`target` 等以不可枚举属性写入请求体。
16
+ - 模块:`src/providers/core/runtime/provider-runtime-metadata.ts`
17
+ - 读取:`extractProviderRuntimeMetadata()`(BaseProvider 已缓存最近一次 metadata,并在日志/错误中心附带字段)。
18
+
19
+ ## 新拓扑(出站与返回)
20
+
21
+ ```
22
+ output/* → Provider.preprocessRequest(compat.request) → HTTP Provider → Provider.postprocessResponse(compat.response) → response/*
23
+ ```
24
+
25
+ 说明:
26
+ - Host 侧流水线不变;compat 被 Provider 内部的 ProviderComposite 执行。
27
+ - Responses 上游使用 SSE;Provider 解析为 JSON 再返回 Host。
28
+
29
+ ## 类与文件
30
+
31
+ - 新增(Provider 内):
32
+ - `src/providers/core/composite/provider-composite.ts`
33
+ - `src/providers/core/composite/compat/openai-compat-aggregator.ts`
34
+ - `src/providers/core/composite/compat/{responses,anthropic,gemin i}.ts`
35
+
36
+ - 复用(保持原路径):
37
+ - 历史上曾存在 `src/providers/compat/*` 模块作为旧实现,现已下线;兼容行为统一迁移至 `sharedmodule/llmswitch-core/src/conversion/compat/*`(通过 `compatibilityProfile` 驱动 GLM / LM Studio / iFlow 等)。
38
+
39
+ ## 协议守卫与自动加载
40
+
41
+ - 运行时映射(唯一来源:BasePipeline 注入):
42
+ - `openai → openai-chat`
43
+ - `responses → openai-responses`
44
+ - `anthropic → anthropic-messages`
45
+ - `gemini → gemini-chat`
46
+ - 验证点:
47
+ - 入站:`in.protocol` 与 `runtime.providerProtocol` 以及 `map(runtime.providerType)` 必须一致,否 则 `ERR_PROTOCOL_MISMATCH`。
48
+ - compat.request/response 不得改变协议形状,否则 `ERR_COMPAT_PROTOCOL_DRIFT`。
49
+
50
+ ## OpenAI 协议族家族聚合器
51
+
52
+ - 基于 `providerId/providerKey` 选择最小家族差异:
53
+ - `glm` → 复用 `GLMCompatibility`(最小清理、1210/1214、末条 tool 回显清噪)。
54
+ - `lmstudio` → 复用 `LMStudioCompatibility`(最小字段映射)。
55
+ - `iflow` → 复用 `iFlowCompatibility`(OpenAI 形状,OAuth 于 Provider 层处理)。
56
+ - `qwen` → 默认走最小路径(保持 OpenAI 形状),不启用旧 `qwen-compat` 的“input/parameters”改形状逻辑。
57
+ - 其他 → passthrough/minimal。
58
+
59
+ ## 与 BaseProvider 的集成
60
+
61
+ - Chat 协议 Provider(`ChatHttpProvider`,原 `OpenAIStandard`)在以下两处调用:
62
+ - `preprocessRequest` 末尾:`compat.request`
63
+ - `postprocessResponse` 封装前:`compat.response`
64
+ - Responses/Anthropic Provider 可按需接入(初期保持 passthrough)。
65
+
66
+ ## 错误模型与快照
67
+
68
+ - 错误:
69
+ - `ERR_PROTOCOL_MISMATCH`:协议守卫失败(含 `requestId/providerKey/providerType/providerProtocol/routeName`)。
70
+ - `ERR_COMPAT_PROTOCOL_DRIFT`:compat 改变协议形状。
71
+ - `ERR_UNSUPPORTED_PROVIDER_TYPE`:未注册协议族。
72
+ - `ERR_PROVIDER_HTTP`:HTTP 层错误(保留)。
73
+ - 上报路径:Compat/Provider 每次捕获异常时必须调用 `emitProviderError()`(封装在 `provider-error-reporter.ts`),将错误统一转换为 `ProviderErrorEvent` 并提交给 sharedmodule/llmswitch-core 的 `providerErrorCenter`,同时调用 `errorHandlingCenter.handleError()`。虚拟路由器依赖这些事件执行熔断,禁止吞掉任何异常或在本地兜底。
74
+ - 快照:
75
+ - `compat-pre/compat-post`(request/response)、`provider-request/provider-response/provider-error`;均脱敏,best-effort。
76
+
77
+ ## Provider 类型对齐(type-only)
78
+
79
+ - Provider 仅按协议类型划分:`openai`、`responses`、`anthropic`、`gemini`。
80
+ - Factory 按类型创建:
81
+ - `openai` → Chat 协议 Provider(当前类:ChatHttpProvider);
82
+ - `responses` → ResponsesHttpProvider(上游 SSE→JSON 解析);
83
+ - `anthropic` → AnthropicHttpProvider;
84
+ - `gemini` → 预留。
85
+ - 旧配置兼容(规范化):
86
+ - 若发现 `providerType` ∈ {`glm`,`qwen`,`iflow`,`lmstudio`},运行时规范化为 `openai` 并记录告警;品牌保留在 `providerId`,OAuth 方案通过 `auth.type = "<provider>-oauth"` 显式声明。
87
+ - 不在 `llmswitch-core` 内判断品牌,品牌差异仅由 compat 聚合器处理(最小清理)。
88
+
89
+ ## 迁移与兼容
90
+
91
+ - 配置:将旧 `providerType: 'qwen'|'glm'|'iflow'|'lmstudio'` 规范化为 `providerType: 'openai'`,并通过 `providerId` + `auth.type = '<provider>-oauth'` 表达家族;保留警告日志。
92
+ - Qwen:默认走 OpenAI 兼容端点 `/v1/chat/completions`;如需 native wire,需新增协议 id 与 codec,不能在 `openai-chat` 协议下改形状。
93
+
94
+ ### 配置示例(OAuth 品牌)
95
+
96
+ ```json
97
+ {
98
+ "type": "openai-standard",
99
+ "config": {
100
+ "providerType": "openai",
101
+ "baseUrl": "https://portal.qwen.ai/v1",
102
+ "auth": { "type": "qwen-oauth" },
103
+ "models": ["qwen3-coder-plus"]
104
+ }
105
+ }
106
+ ```
107
+
108
+ ### 运行期元数据(runtime metadata)
109
+
110
+ ProviderComposite 与 Hook/HTTP 层依赖 `BasePipeline` 回写的元数据:
111
+
112
+ ```ts
113
+ {
114
+ requestId, pipelineId, routeName,
115
+ providerId, providerKey,
116
+ providerType, providerProtocol,
117
+ target: { model, providerType, providerKey, ... }
118
+ }
119
+ ```
120
+
121
+ 上述字段作为请求体的不可枚举属性注入(attachProviderRuntimeMetadata),Provider/Composite 通过 extractProviderRuntimeMetadata 读取。
122
+
123
+ ## 测试计划
124
+
125
+ - 协议守卫:错配触发 `ERR_PROTOCOL_MISMATCH`;家族聚合器若改形状触发 `ERR_COMPAT_PROTOCOL_DRIFT`。
126
+ - GLM 回归:tools 严格字段清理、1210/1214、非流式响应黑名单。
127
+ - LM Studio / iFlow:OpenAI 形状不变;OAuth 流程(iFlow)在 Provider 层。
128
+ - Qwen:保持 OpenAI 形状直连。
129
+ - Responses:上游 SSE → JSON,对内一律 JSON。
130
+
131
+ ### 建议的测试入口
132
+
133
+ - 构建:`npm run build`
134
+ - 蓝图回归:`npm test -- tests/pipeline/blueprint-regression.test.ts --runInBand`
135
+ - 协议守卫单测:新增 `tests/provider/provider-composite-guards.test.ts`(建议,见测试文档)
136
+
137
+ ## 执行步骤(本次提交范围)
138
+
139
+ 1) 添加 ProviderComposite 与 openai 聚合器骨架文件;
140
+ 2) 在 Chat 协议 Provider(`chat-http-provider.ts`)植入 compat.request/compat.response 调用;
141
+ 3) Factory 由 `protocol-first` 选择 Provider(保持与旧配置兼容的规范化通道);
142
+ 4) 回归:`npm test -- tests/pipeline/blueprint-regression.test.ts --runInBand`。
@@ -0,0 +1,98 @@
1
+ # ProviderComposite 测试方法
2
+
3
+ 本文档给出 ProviderComposite(兼容层内聚)变更后的测试建议,用于统一回归与新增用例编写方式。
4
+
5
+ ## 1. 构建与基础回归
6
+
7
+ - 构建:`npm run build`
8
+ - 蓝图回归:`npm test -- tests/pipeline/blueprint-regression.test.ts --runInBand`
9
+ - 说明:该用例基于用户的 codex-samples 快照与用户配置动态生成蓝图,校验不同 providerProtocol 的节点签名。
10
+ - 若环境未配置样本/用户配置会自动跳过。
11
+
12
+ ## 2. 协议守卫与形状断言(新增建议)
13
+
14
+ 新增 `tests/provider/provider-composite-guards.test.ts`(建议:在后续 PR 中加入),覆盖:
15
+
16
+ - `ERR_PROTOCOL_MISMATCH`:
17
+ - 构造请求体并注入 runtime metadata(providerType 与 providerProtocol 显式不匹配),
18
+ - 调用 `ProviderComposite.applyRequest` → 断言抛错;
19
+ - 同理 `applyResponse`。
20
+
21
+ - `ERR_COMPAT_PROTOCOL_DRIFT`:
22
+ - 模拟 compat 插件输出非预期形状(如 openai-chat 协议下没有 `messages` 或 `choices`),
23
+ - 断言 `applyRequest/Response` 抛错。
24
+
25
+ 伪代码示例:
26
+
27
+ ```ts
28
+ import { ProviderComposite } from '../../src/providers/core/composite/provider-composite.js';
29
+ import { attachProviderRuntimeMetadata } from '../../src/providers/core/runtime/provider-runtime-metadata.js';
30
+
31
+ test('protocol mismatch fails fast', async () => {
32
+ const body: any = { model: 'gpt-4o', messages: [] };
33
+ attachProviderRuntimeMetadata(body, {
34
+ requestId: 'req_x', providerType: 'anthropic', providerProtocol: 'openai-chat'
35
+ });
36
+ await expect(
37
+ ProviderComposite.applyRequest(body, { providerType: 'anthropic', dependencies: anyDeps })
38
+ ).rejects.toThrow(/ERR_PROTOCOL_MISMATCH/);
39
+ });
40
+ ```
41
+
42
+ ## 3. 家族聚合回归(openai 协议族)
43
+
44
+ 针对 `glm/lmstudio/iflow`:
45
+
46
+ - 入站:构造 openai-chat 形状请求 + 注入 runtime metadata(providerType='openai', providerId='glm' 等),
47
+ - 断言:最小清理生效(如 GLM 删除 tools[].function.strict/无 tools 时删除 tool_choice)。
48
+ - 返回:构造上游 JSON 响应,调用 `applyResponse`,
49
+ - 断言:非流式响应黑名单仅在非 `/v1/responses` 入口时生效(依据 metadata.entryEndpoint)。
50
+
51
+ 针对 `qwen`:
52
+
53
+ - 断言聚合器保持 OpenAI 形状,不走“input/parameters”改形状路径。
54
+
55
+ ## 4. SSE 路径验证(Responses)
56
+
57
+ - 使用 ResponsesHttpProvider 发送请求(或模拟 sendRequestInternal 的 SSE 分支),
58
+ - 断言:
59
+ - Provider 对 Host 返回 JSON(内部会将上游 SSE 解析为 JSON),
60
+ - 不透传 `__sse_stream`,Client 方向 SSE 由 llmswitch-core 管理。
61
+
62
+ ## 5. 验证脚本适配说明
63
+
64
+ `npm run build:verify` 当前蓝图依赖独立 virtualRouter 节点;本次变更将虚拟路由器并入 llmswitch-core,
65
+ 因此需要更新验证脚本或切换到新的蓝图:
66
+
67
+ - 方案 A:更新脚本以读取 BasePipeline 注入的 `providerProtocol` 元信息;
68
+ - 方案 B:提供新的验证蓝图(不依赖独立 virtualRouter 节点),通过 `orchestrator.resolve(entry, { providerProtocol, processMode })` 选择。
69
+
70
+ 待测试蓝图更新后,本用例将纳入 CI。
71
+
72
+ ## 6. 全局 Dry-Run(路径 & 快照)
73
+
74
+ 为方便批量验证兼容层/虚拟路由/ProviderComposite 的执行路径,新增脚本
75
+ `scripts/pipeline-dry-run.mjs`:
76
+
77
+ ```
78
+ npm run build
79
+ node scripts/pipeline-dry-run.mjs \
80
+ --config ~/.routecodex/config.json \
81
+ --samples ~/.routecodex/codex-samples \
82
+ --out demo-results/pipeline-dryrun
83
+ ```
84
+
85
+ - 脚本会使用 `PipelineAssembler` + `VirtualRouterModule` 组装流水线,
86
+ 并从 `codex-samples/openai-chat|openai-responses|anthropic-messages` 中读取
87
+ `*_http-request.json` 逐条重放(默认每类全部,可用 `--limit` 限制)。
88
+ - Provider 阶段仍通过现有 ProviderComposite/HTTP provider 走完整链路,但因为使用
89
+ 本地请求不会访问真实上游;所有快照写入 `--out/snapshots`(可通过
90
+ `ROUTECODEX_SNAPSHOT_BASE` 自定义)。
91
+ - 每个请求都会生成 `summary.json` 结构,包含 `routeName`、`pipelineId`、
92
+ provider target、执行耗时以及 `pathSignature`(按节点顺序汇总)。
93
+ - 快照沿用 `llmswitch-core` 的 `pipeline.aggregate`、`compat.pre/post`、
94
+ `provider.request/response`,可直接在现有界面或分析脚本中解析。
95
+
96
+ 通过该 dry-run 输出的路径数据,可以快速核对“虚拟路由 → chat-process →
97
+ provider-composite → provider-http → response-process”的实际执行链,
98
+ 避免在没有真实上游的环境中手动重复验证。
@@ -0,0 +1,111 @@
1
+ # Provider 按协议类型划分(Type-only)迁移指南
2
+
3
+ 本文档描述从“按品牌/家族(glm/qwen/iflow/lmstudio)”到“按协议类型(openai/responses/anthropic/gemini)”的迁移要求与示例。
4
+
5
+ ## 目标
6
+
7
+ - Provider 仅以协议类型作为 `providerType`:
8
+ - `openai`(OpenAI Chat wire)
9
+ - `responses`(OpenAI Responses wire)
10
+ - `anthropic`(Anthropic Messages wire)
11
+ - `gemini`(预留)
12
+ - 品牌/家族名仅通过 `providerId` 标识;OAuth 方案使用 `auth.type = "<provider>-oauth"` 显式声明。
13
+ - `providerProtocol` 由 BasePipeline 路由阶段注入,Provider/Composite 只做守卫,不自行推断。
14
+
15
+ ## 迁移规则
16
+
17
+ 1. 配置层
18
+ - 将原 `providerType: 'glm'|'qwen'|'iflow'|'lmstudio'` 替换为 `providerType: 'openai'`。
19
+ - 将家族名写入:
20
+ - `providerId`(路由家族);
21
+ - `auth.type = "<provider>-oauth"`(OAuth 场景)。
22
+ - Responses/Anthropic 按照协议类型分别设置 `providerType: 'responses' | 'anthropic'`。
23
+
24
+ 2. 代码层
25
+ - Factory 改为 protocol-first 选择 Provider;对旧配置自动规范化并打印告警。
26
+ - 兼容逻辑内聚到 ProviderComposite,品牌差异由 openai-compat-aggregator 内部处理(最小清理)。
27
+
28
+ ## 配置示例
29
+
30
+ ### Qwen(OAuth)
31
+
32
+ ```json
33
+ {
34
+ "type": "openai-standard",
35
+ "config": {
36
+ "providerType": "openai",
37
+ "baseUrl": "https://portal.qwen.ai/v1",
38
+ "auth": { "type": "qwen-oauth" },
39
+ "models": ["qwen3-coder-plus"]
40
+ }
41
+ }
42
+ ```
43
+
44
+ ### GLM(API Key)
45
+
46
+ ```json
47
+ {
48
+ "type": "openai-standard",
49
+ "config": {
50
+ "providerType": "openai",
51
+ "baseUrl": "https://open.bigmodel.cn/api/coding/paas/v4",
52
+ "auth": { "type": "apikey", "apiKeyEnv": "GLM_API_KEY" },
53
+ "models": ["glm-4"]
54
+ }
55
+ }
56
+ ```
57
+
58
+ ### iFlow(OAuth)
59
+
60
+ ```json
61
+ {
62
+ "type": "openai-standard",
63
+ "config": {
64
+ "providerType": "openai",
65
+ "baseUrl": "https://api.iflow.com/v1",
66
+ "auth": { "type": "iflow-oauth" },
67
+ "models": ["iflow-gpt4-1106"]
68
+ }
69
+ }
70
+ ```
71
+
72
+ ### Responses(真实 /v1/responses wire)
73
+
74
+ ```json
75
+ {
76
+ "type": "responses-http-provider",
77
+ "config": {
78
+ "providerType": "responses",
79
+ "baseUrl": "https://api.openai.com/v1",
80
+ "auth": { "type": "apikey", "apiKeyEnv": "OPENAI_API_KEY" }
81
+ }
82
+ }
83
+ ```
84
+
85
+ ### Anthropic Messages
86
+
87
+ ```json
88
+ {
89
+ "type": "anthropic-http-provider",
90
+ "config": {
91
+ "providerType": "anthropic",
92
+ "baseUrl": "https://api.anthropic.com/v1",
93
+ "auth": { "type": "apikey", "apiKeyEnv": "ANTHROPIC_API_KEY" }
94
+ }
95
+ }
96
+ ```
97
+
98
+ ## 运行期元数据(供调试校验)
99
+
100
+ `attachProviderRuntimeMetadata(payload, meta)` 注入字段:
101
+
102
+ ```ts
103
+ {
104
+ requestId, pipelineId, routeName,
105
+ providerId, providerKey,
106
+ providerType, providerProtocol,
107
+ target: { model, providerType, providerKey }
108
+ }
109
+ ```
110
+
111
+ ProviderComposite 在出/入站两侧校验 `providerType → providerProtocol`,并对协议形状做最小断言,快速暴露错配。
@@ -0,0 +1,74 @@
1
+ # rccx wasm 接入说明(Host 视角)
2
+
3
+ ## 三条 CLI 路线的角色划分
4
+
5
+ - `routecodex`(dev CLI)
6
+ - 面向本地开发与调试,始终使用仓库下的 `sharedmodule/llmswitch-core` 源码。
7
+ - 通过 `npm run llmswitch:link` / `npm run config:use-local` 把本地 llmswitch-core 链接到 `node_modules/@jsonstudio/llms`。
8
+ - `rcc`(release CLI)
9
+ - 发布到 npm 的正式包:`@jsonstudio/rcc`。
10
+ - 由 `npm run publish:rcc` 生成 tarball 并 `npm publish`,构建时依赖 npm 上的 `@jsonstudio/llms`(TS 实现)。
11
+ - `rccx`(wasm CLI,实验/内部使用)
12
+ - 使用 `@jsonstudio/llms-wasm`(wasm 引擎)作为 llms 核心实现。
13
+ - 通过 npm alias 保持 Host import 形状不变:源码仍然 `import ... from '@jsonstudio/llms'`,但在 rccx 包内该依赖会被重写为 `@jsonstudio/llms-wasm`。
14
+
15
+ > 约束:按照 `AGENTS.md`,正式发布渠道仍然只使用 `@jsonstudio/rcc`;`routecodex` 和 `rccx` 保持在本地/内部使用范围内。
16
+
17
+ ## 依赖与打包策略
18
+
19
+ - 根 `package.json` 继续声明:
20
+ - `@jsonstudio/llms`: `^0.6.x`(供 routecodex / rcc 构建使用)。
21
+ - `scripts/pack-mode.mjs` 在打包 rccx 时(`--name @jsonstudio/rccx --bin rccx`)会:
22
+ - 将 `package.json.name` 设置为 `@jsonstudio/rccx`,`bin` 设置为 `{ "rccx": "dist/cli.js" }`。
23
+ - 清空 `bundledDependencies` / `bundleDependencies`,改为普通 `dependencies`。
24
+ - 在 `dependencies` 中应用 alias:
25
+ - 移除原有的 `@jsonstudio/llms` 直连依赖;
26
+ - 增加:
27
+ - `"@jsonstudio/llms": "npm:@jsonstudio/llms-wasm@^0.1.0"`
28
+ - `"@jsonstudio/llms-wasm": "^0.1.0"`
29
+ - 这样,安装 `@jsonstudio/rccx` 时,`require('@jsonstudio/llms')` 实际会加载 wasm 版本实现。
30
+
31
+ > 注意:`pack-mode.mjs` 只在打包阶段临时修改 `package.json`,打包完成后会恢复原始文件。
32
+
33
+ ## 构建 rccx(本地)
34
+
35
+ 1. 确保本机已经有可用的 `@jsonstudio/llms-wasm`:
36
+ - 要么从 `sharedmodule/llms-wasm` 构建并发布到私有 npm;
37
+ - 要么通过本地 tarball 安装到全局/工程级 npm registry(版本号需满足 `^0.1.0`)。
38
+ 2. 在 routecodex 仓库根目录执行:
39
+ ```bash
40
+ npm run build:rccx
41
+ ```
42
+ - 这会先执行 `npm run build:min`(使用当前 BUILD_MODE 构建 dist);
43
+ - 然后调用:
44
+ ```bash
45
+ node scripts/pack-mode.mjs --name @jsonstudio/rccx --bin rccx
46
+ ```
47
+ - 完成后仓库根目录会出现一个 `jsonstudio-rccx-<version>.tgz`。
48
+ 3. 在目标环境中安装 rccx:
49
+ ```bash
50
+ npm install -g ./jsonstudio-rccx-<version>.tgz
51
+ ```
52
+
53
+ ## 运行与行为确认
54
+
55
+ - `rccx` CLI 行为与 `routecodex` / `rcc` 相同:
56
+ - `rccx start` 启动同一套 HTTP server,端口仍由 RouteCodex 配置决定(默认 5555)。
57
+ - `rccx code` / `rccx config` 等子命令全部复用现有 CLI 逻辑。
58
+ - 不同点只在于 llms 实现:
59
+ - `rcc` 使用 npm 上的 `@jsonstudio/llms`(TS 实现);
60
+ - `rccx` 使用 npm 上的 `@jsonstudio/llms-wasm`(wasm 引擎,通过 alias 暴露为 `@jsonstudio/llms`)。
61
+
62
+ ## 黑盒对比建议(可选)
63
+
64
+ 为确保 wasm 版本行为与 TS 版本一致,建议在同一份 RouteCodex 配置下做一轮回放对比:
65
+
66
+ - 启动两个实例:
67
+ - `routecodex`(或 `rcc`)使用 TS 版 llms;
68
+ - `rccx` 使用 wasm 版 llms。
69
+ - 对同一组请求(尤其是 sticky / health / 429 / series cooldown / Gemini compat 等场景):
70
+ - 比较日志中的 `virtual-router-hit` / `providerKey` / sticky 选择与健康状态;
71
+ - 确认两侧路由决策与工具调用行为一致。
72
+
73
+ 后续每次升级 `@jsonstudio/llms` / `@jsonstudio/llms-wasm` 时,可以复用这一套回放作为回归校验。
74
+