@jsonstudio/rcc 0.89.1205 → 0.89.1348

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 (332) hide show
  1. package/README.md +17 -0
  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 +74 -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 +91 -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 +36 -0
  40. package/dist/cli/config/init-config.js +180 -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-cli/gemini-cli-protocol-client.js +1 -1
  51. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  52. package/dist/config/risk-control-config.d.ts +94 -0
  53. package/dist/config/risk-control-config.js +196 -0
  54. package/dist/config/risk-control-config.js.map +1 -0
  55. package/dist/constants/index.d.ts +6 -0
  56. package/dist/constants/index.js +13 -0
  57. package/dist/constants/index.js.map +1 -1
  58. package/dist/docs/daemon-admin-ui.html +2113 -190
  59. package/dist/index.js +0 -1
  60. package/dist/index.js.map +1 -1
  61. package/dist/manager/modules/health/index.d.ts +1 -1
  62. package/dist/manager/modules/quota/antigravity-quota-manager.d.ts +70 -0
  63. package/dist/manager/modules/quota/antigravity-quota-manager.js +442 -0
  64. package/dist/manager/modules/quota/antigravity-quota-manager.js.map +1 -0
  65. package/dist/manager/modules/quota/index.d.ts +3 -127
  66. package/dist/manager/modules/quota/index.js +2 -1093
  67. package/dist/manager/modules/quota/index.js.map +1 -1
  68. package/dist/manager/modules/quota/provider-key-normalization.d.ts +3 -0
  69. package/dist/manager/modules/quota/provider-key-normalization.js +155 -0
  70. package/dist/manager/modules/quota/provider-key-normalization.js.map +1 -0
  71. package/dist/manager/modules/quota/provider-quota-daemon.cooldown.d.ts +9 -0
  72. package/dist/manager/modules/quota/provider-quota-daemon.cooldown.js +115 -0
  73. package/dist/manager/modules/quota/provider-quota-daemon.cooldown.js.map +1 -0
  74. package/dist/manager/modules/quota/provider-quota-daemon.d.ts +77 -0
  75. package/dist/manager/modules/quota/provider-quota-daemon.events.d.ts +12 -0
  76. package/dist/manager/modules/quota/provider-quota-daemon.events.js +237 -0
  77. package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -0
  78. package/dist/manager/modules/quota/provider-quota-daemon.js +404 -0
  79. package/dist/manager/modules/quota/provider-quota-daemon.js.map +1 -0
  80. package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.d.ts +11 -0
  81. package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js +189 -0
  82. package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js.map +1 -0
  83. package/dist/manager/modules/quota/provider-quota-daemon.snapshot.d.ts +8 -0
  84. package/dist/manager/modules/quota/provider-quota-daemon.snapshot.js +96 -0
  85. package/dist/manager/modules/quota/provider-quota-daemon.snapshot.js.map +1 -0
  86. package/dist/manager/modules/quota/provider-quota-daemon.view.d.ts +19 -0
  87. package/dist/manager/modules/quota/provider-quota-daemon.view.js +37 -0
  88. package/dist/manager/modules/quota/provider-quota-daemon.view.js.map +1 -0
  89. package/dist/manager/modules/routing/index.d.ts +1 -0
  90. package/dist/manager/modules/routing/index.js +11 -25
  91. package/dist/manager/modules/routing/index.js.map +1 -1
  92. package/dist/manager/quota/provider-quota-center.d.ts +2 -0
  93. package/dist/manager/quota/provider-quota-center.js +80 -82
  94. package/dist/manager/quota/provider-quota-center.js.map +1 -1
  95. package/dist/modules/llmswitch/bridge.d.ts +16 -18
  96. package/dist/modules/llmswitch/bridge.js +293 -94
  97. package/dist/modules/llmswitch/bridge.js.map +1 -1
  98. package/dist/modules/llmswitch/core-loader.d.ts +4 -2
  99. package/dist/modules/llmswitch/core-loader.js +32 -20
  100. package/dist/modules/llmswitch/core-loader.js.map +1 -1
  101. package/dist/modules/pipeline/utils/colored-logger.js +3 -2
  102. package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
  103. package/dist/modules/pipeline/utils/debug-logger.js +1 -1
  104. package/dist/modules/pipeline/utils/debug-logger.js.map +1 -1
  105. package/dist/providers/auth/iflow-cookie-auth.js +0 -2
  106. package/dist/providers/auth/iflow-cookie-auth.js.map +1 -1
  107. package/dist/providers/auth/oauth-lifecycle.js +2 -23
  108. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  109. package/dist/providers/core/config/camoufox-launcher.js +35 -4
  110. package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
  111. package/dist/providers/core/runtime/antigravity-quota-client.js +6 -3
  112. package/dist/providers/core/runtime/antigravity-quota-client.js.map +1 -1
  113. package/dist/providers/core/runtime/base-provider.d.ts +2 -2
  114. package/dist/providers/core/runtime/base-provider.js +74 -69
  115. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  116. package/dist/providers/core/runtime/gemini-cli-http-provider.js +6 -4
  117. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  118. package/dist/providers/core/runtime/http-request-executor.js +2 -2
  119. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  120. package/dist/providers/core/runtime/http-transport-provider.d.ts +14 -0
  121. package/dist/providers/core/runtime/http-transport-provider.js +111 -5
  122. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  123. package/dist/providers/core/runtime/provider-error-classifier.js +10 -0
  124. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
  125. package/dist/providers/core/runtime/provider-factory.js +7 -5
  126. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  127. package/dist/providers/core/runtime/provider-runtime-metadata.d.ts +6 -0
  128. package/dist/providers/core/runtime/provider-runtime-metadata.js.map +1 -1
  129. package/dist/providers/core/runtime/responses-provider.d.ts +1 -7
  130. package/dist/providers/core/runtime/responses-provider.js +12 -93
  131. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  132. package/dist/providers/core/strategies/oauth-auth-code-flow.js +12 -8
  133. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  134. package/dist/providers/core/utils/http-client.js +16 -3
  135. package/dist/providers/core/utils/http-client.js.map +1 -1
  136. package/dist/providers/core/utils/provider-error-logger.d.ts +1 -1
  137. package/dist/providers/core/utils/provider-error-reporter.d.ts +3 -1
  138. package/dist/providers/core/utils/provider-error-reporter.js +3 -0
  139. package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
  140. package/dist/providers/core/utils/snapshot-writer.js +1 -4
  141. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  142. package/dist/providers/mock/mock-provider-runtime.js +57 -27
  143. package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
  144. package/dist/scripts/camoufox/launch-auth.mjs +193 -58
  145. package/dist/server/handlers/handler-utils.js +3 -2
  146. package/dist/server/handlers/handler-utils.js.map +1 -1
  147. package/dist/server/runtime/http-server/daemon-admin/auth-handler.d.ts +2 -0
  148. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +103 -0
  149. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -0
  150. package/dist/server/runtime/http-server/daemon-admin/auth-session.d.ts +5 -0
  151. package/dist/server/runtime/http-server/daemon-admin/auth-session.js +77 -0
  152. package/dist/server/runtime/http-server/daemon-admin/auth-session.js.map +1 -0
  153. package/dist/server/runtime/http-server/daemon-admin/auth-store.d.ts +18 -0
  154. package/dist/server/runtime/http-server/daemon-admin/auth-store.js +89 -0
  155. package/dist/server/runtime/http-server/daemon-admin/auth-store.js.map +1 -0
  156. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +1 -2
  157. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
  158. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +226 -24
  159. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
  160. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +47 -8
  161. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -1
  162. package/dist/server/runtime/http-server/daemon-admin/restart-handler.js +1 -1
  163. package/dist/server/runtime/http-server/daemon-admin/restart-handler.js.map +1 -1
  164. package/dist/server/runtime/http-server/daemon-admin/stats-handler.js +1 -1
  165. package/dist/server/runtime/http-server/daemon-admin/stats-handler.js.map +1 -1
  166. package/dist/server/runtime/http-server/daemon-admin/status-handler.js +68 -4
  167. package/dist/server/runtime/http-server/daemon-admin/status-handler.js.map +1 -1
  168. package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +3 -4
  169. package/dist/server/runtime/http-server/daemon-admin-routes.js +9 -14
  170. package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -1
  171. package/dist/server/runtime/http-server/executor-metadata.js +1 -1
  172. package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
  173. package/dist/server/runtime/http-server/executor-response.js +0 -16
  174. package/dist/server/runtime/http-server/executor-response.js.map +1 -1
  175. package/dist/server/runtime/http-server/hub-shadow-compare.js +110 -34
  176. package/dist/server/runtime/http-server/hub-shadow-compare.js.map +1 -1
  177. package/dist/server/runtime/http-server/index.d.ts +5 -3
  178. package/dist/server/runtime/http-server/index.js +215 -109
  179. package/dist/server/runtime/http-server/index.js.map +1 -1
  180. package/dist/server/runtime/http-server/middleware.js +19 -1
  181. package/dist/server/runtime/http-server/middleware.js.map +1 -1
  182. package/dist/server/runtime/http-server/request-executor.js +10 -19
  183. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  184. package/dist/server/runtime/http-server/routes.js +8 -2
  185. package/dist/server/runtime/http-server/routes.js.map +1 -1
  186. package/dist/server/runtime/http-server/session-dir.d.ts +2 -0
  187. package/dist/server/runtime/http-server/session-dir.js +59 -0
  188. package/dist/server/runtime/http-server/session-dir.js.map +1 -0
  189. package/dist/server/runtime/http-server/types.d.ts +0 -4
  190. package/dist/server/utils/utf8-chunk-buffer.js +6 -3
  191. package/dist/server/utils/utf8-chunk-buffer.js.map +1 -1
  192. package/dist/server/utils/warmup-storm-tracker.js +1 -1
  193. package/dist/server/utils/warmup-storm-tracker.js.map +1 -1
  194. package/dist/server-factory.d.ts +6 -28
  195. package/dist/server-factory.js +8 -93
  196. package/dist/server-factory.js.map +1 -1
  197. package/dist/token-daemon/index.js +2 -2
  198. package/dist/token-daemon/index.js.map +1 -1
  199. package/dist/token-daemon/provider-registry.js +0 -1
  200. package/dist/token-daemon/provider-registry.js.map +1 -1
  201. package/dist/token-daemon/server-utils.js +8 -9
  202. package/dist/token-daemon/server-utils.js.map +1 -1
  203. package/dist/token-daemon/token-utils.js +1 -1
  204. package/dist/token-daemon/token-utils.js.map +1 -1
  205. package/dist/tools/semantic-replay.js +2 -2
  206. package/dist/tools/semantic-replay.js.map +1 -1
  207. package/dist/tools/stats-request-events.d.ts +1 -1
  208. package/dist/tools/stats-usage.js +6 -3
  209. package/dist/tools/stats-usage.js.map +1 -1
  210. package/dist/utils/llms-engine-shadow.d.ts +19 -0
  211. package/dist/utils/llms-engine-shadow.js +209 -0
  212. package/dist/utils/llms-engine-shadow.js.map +1 -0
  213. package/dist/utils/runtime-versions.js +2 -1
  214. package/dist/utils/runtime-versions.js.map +1 -1
  215. package/docs/ARCHITECTURE.md +402 -0
  216. package/docs/CODEX_AND_CLAUDE_CODE.md +69 -0
  217. package/docs/CONFIG_ARCHITECTURE.md +517 -0
  218. package/docs/ERROR_HANDLING_AUDIT.md +0 -0
  219. package/docs/GCLI2API_PARITY_GAPS.md +98 -0
  220. package/docs/INSTALLATION_AND_QUICKSTART.md +74 -0
  221. package/docs/INSTRUCTION_MARKUP.md +89 -0
  222. package/docs/MODULE_ENHANCEMENT_SYSTEM.md +666 -0
  223. package/docs/PORTS.md +36 -0
  224. package/docs/PROVIDERS_BUILTIN.md +111 -0
  225. package/docs/PROVIDER_TYPES.md +55 -0
  226. package/docs/SERVERTOOL_CLOCK_DESIGN.md +233 -0
  227. package/docs/USAGE_HANDLING_ANALYSIS.md +335 -0
  228. package/docs/USER_CONFIG_PARSER_CHANGES.md +175 -0
  229. package/docs/V3_INBOUND_OUTBOUND_DESIGN.md +86 -0
  230. package/docs/VIRTUAL_ROUTER_PRIORITY_AND_HEALTH.md +125 -0
  231. package/docs/anthropic-request-golden-samples.md +50 -0
  232. package/docs/ccr-alignment-enhancetool.md +105 -0
  233. package/docs/chat-glm-500-analysis.md +79 -0
  234. package/docs/chat-request-golden-samples.md +42 -0
  235. package/docs/chat-semantic-expansion-plan.md +82 -0
  236. package/docs/cli-command-inventory.md +76 -0
  237. package/docs/codex-samples-replay.md +50 -0
  238. package/docs/daemon-admin-api-design.md +350 -0
  239. package/docs/daemon-admin-module-structure.md +169 -0
  240. package/docs/daemon-admin-ui.html +3394 -0
  241. package/docs/debug-system-design.md +734 -0
  242. package/docs/debugging/gemini-sse-root-cause.md +52 -0
  243. package/docs/debugging/sse_encoding_failure_analysis.md +53 -0
  244. package/docs/dry-run/README.md +721 -0
  245. package/docs/error-handling-v2.md +92 -0
  246. package/docs/exec-command-guard-policy.example.v1.json +42 -0
  247. package/docs/fixes/gemini-protocol-mapping.md +57 -0
  248. package/docs/fixes/oauth-portal-timing-fix.md +202 -0
  249. package/docs/fixes/web-search-hop3-fix.md +265 -0
  250. package/docs/glm-api-reference.md +390 -0
  251. package/docs/glm-chat-completions.md +1779 -0
  252. package/docs/glm-history-inline-images.md +44 -0
  253. package/docs/golden-ci-library.md +66 -0
  254. package/docs/lmstudio-dry-run-summary.md +203 -0
  255. package/docs/lmstudio-tool-calling.md +214 -0
  256. package/docs/mapping-tables/anthropic-to-openai.json +290 -0
  257. package/docs/mapping-tables/iflow-to-openai.json +215 -0
  258. package/docs/mapping-tables/openai-passthrough.json +190 -0
  259. package/docs/mapping-tables/openai-to-iflow.json +227 -0
  260. package/docs/monitoring/Design.md +61 -0
  261. package/docs/multi-token-auth-guide.md +66 -0
  262. package/docs/oauth-authentication-guide.md +168 -0
  263. package/docs/oauth-iflow-implementation.md +153 -0
  264. package/docs/pipeline-routing-report.md +209 -0
  265. package/docs/plans/manager-daemon/PLAN.md +86 -0
  266. package/docs/plans/provider-config-v2-plan.md +176 -0
  267. package/docs/plans/provider-runtime-manager-plan.md +209 -0
  268. package/docs/plans/transparent-429-failover.md +89 -0
  269. package/docs/plans/unified-hub-framework-v1.md +245 -0
  270. package/docs/provider-config-v2-ui-design.md +181 -0
  271. package/docs/provider-quota-design.md +129 -0
  272. package/docs/providers/gemini-provider.md +62 -0
  273. package/docs/providers/lmstudio-v2-migration-report.md +102 -0
  274. package/docs/providers/provider-composite-design.md +142 -0
  275. package/docs/providers/provider-composite-testing.md +98 -0
  276. package/docs/providers/provider-type-only-migration.md +111 -0
  277. package/docs/rccx-wasm-migration.md +74 -0
  278. package/docs/refactoring/architecture-comparison-diagram.md +140 -0
  279. package/docs/refactoring/compatibility-v2-architecture-design.md +738 -0
  280. package/docs/refactoring/workflow-compatibility-refactoring-design.md +361 -0
  281. package/docs/reports/routing-classification-report.json +24 -0
  282. package/docs/reports/routing-classification-report.md +18 -0
  283. package/docs/reports/thinking-keywords-report.json +19 -0
  284. package/docs/responses/README.md +156 -0
  285. package/docs/responses-generic-provider.md +86 -0
  286. package/docs/responses-passthrough-provider-design.md +202 -0
  287. package/docs/routing-awrr-health-weighted-round-robin.md +179 -0
  288. package/docs/routing-instructions.md +393 -0
  289. package/docs/stop-message-auto.md +225 -0
  290. package/docs/streaming-flow.html +30 -0
  291. package/docs/streaming-flow.md +182 -0
  292. package/docs/token-daemon-preview.html +490 -0
  293. package/docs/token-refresh-daemon-plan.md +269 -0
  294. package/docs/transformation-tables/Gemini-FinishReason/345/256/214/346/225/264/350/275/254/346/215/242/350/241/250.json +233 -0
  295. package/docs/transformation-tables/README.md +225 -0
  296. package/docs/transformation-tables/claude-code-router-anthropic-to-gemini.json +283 -0
  297. package/docs/transformation-tables/claude-code-router-anthropic-to-openai.json +208 -0
  298. package/docs/transformation-tables/claude-code-router-openai-to-anthropic.json +261 -0
  299. package/docs/transformation-tables/claude-code-router-openai-to-gemini.json +208 -0
  300. package/docs/transformation-tables/claude-code-router-openai-to-lmstudio.json +182 -0
  301. package/docs/transformation-tables/claude-code-router-openai-to-ollama.json +250 -0
  302. package/docs/transformation-tables/claude-code-router-openai-to-textgenwebui.json +295 -0
  303. package/docs/transformation-tables/claude-code-router-provider-conversions.json +193 -0
  304. 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
  305. 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
  306. 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
  307. 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
  308. 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
  309. 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
  310. 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
  311. package/docs/v2-architecture/IMPLEMENTATION-ROADMAP.md +367 -0
  312. package/docs/v2-architecture/OPTIMIZED-DESIGN.md +827 -0
  313. package/docs/v2-architecture/PRERUN-CONNECTION-DESIGN.md +716 -0
  314. package/docs/v2-architecture/README.md +551 -0
  315. package/docs/verification/modelscope-verify.md +59 -0
  316. package/docs/web-search-service-design.md +322 -0
  317. package/package.json +12 -7
  318. package/scripts/camoufox/launch-auth.mjs +193 -58
  319. package/scripts/monitor-diff.mjs +126 -0
  320. package/scripts/pack-mode.mjs +19 -1
  321. package/scripts/pack-rcc.mjs +63 -0
  322. package/scripts/unified-hub-shadow-compare.mjs +33 -13
  323. package/scripts/verify-e2e-toolcall.mjs +115 -26
  324. package/dist/modules/llmswitch/pipeline-registry.d.ts +0 -57
  325. package/dist/modules/llmswitch/pipeline-registry.js +0 -229
  326. package/dist/modules/llmswitch/pipeline-registry.js.map +0 -1
  327. package/dist/server/RouteCodexServer.d.ts +0 -13
  328. package/dist/server/RouteCodexServer.js +0 -25
  329. package/dist/server/RouteCodexServer.js.map +0 -1
  330. package/dist/v2/conversion/hub/snapshot-recorder.d.ts +0 -12
  331. package/dist/v2/conversion/hub/snapshot-recorder.js +0 -22
  332. package/dist/v2/conversion/hub/snapshot-recorder.js.map +0 -1
@@ -0,0 +1,361 @@
1
+ # Workflow & Compatibility 模块重构设计方案
2
+
3
+ ## 📋 执行摘要
4
+
5
+ 基于Sysmem架构分析,当前workflow和compatibility模块存在严重的架构违规,包括巨型文件、代码重复、职责不清等问题。本重构方案遵循RouteCodex 9大核心架构原则,将复杂的单体模块拆分为职责明确的小模块。
6
+
7
+ ## 🎯 重构目标
8
+
9
+ ### 核心问题解决
10
+ - **巨型文件拆分**: GLM兼容层从643行拆分为4个专职模块(每个<150行)
11
+ - **代码去重**: 移除与llmswitch-core冲突的工具处理逻辑
12
+ - **简化实现**: Streaming Control从252行简化到50行以内
13
+ - **类型精简**: Field Mapping从10种转换类型减少到3种核心类型
14
+ - **错误处理**: 应用"快速死亡"原则,移除过度try-catch包装
15
+
16
+ ### 架构原则对齐
17
+ - ✅ **原则1**: 确保llmswitch-core作为工具调用唯一入口
18
+ - ✅ **原则2**: 兼容层仅处理provider特定最小功能
19
+ - ✅ **原则4**: 快速死亡,错误立即暴露
20
+ - ✅ **原则7**: 功能分离,模块职责唯一
21
+ - ✅ **原则9**: 模块化,杜绝巨型文件
22
+
23
+ ## 🏗️ 详细设计
24
+
25
+ ### 1. GLM兼容层拆分设计 (643行 → 4个专职模块)
26
+
27
+ #### 当前问题分析
28
+ ```typescript
29
+ // glm-compatibility.ts (643行) - 违规内容
30
+ ❌ thinking配置处理 (lines 45-89)
31
+ ❌ 响应标准化 (lines 123-278)
32
+ ❌ 字段清理 (lines 279-318)
33
+ ❌ 过度错误处理 (lines 319-394)
34
+ ❌ 工具调用处理 (lines 395-489) - 与llmswitch-core冲突
35
+ ```
36
+
37
+ #### 拆分方案
38
+
39
+ ##### 1.1 GLM Thinking配置模块
40
+ **历史文件**: `src/providers/compat/glm-specialized/thinking-config.ts`
41
+ **职责**: 仅处理GLM特有的thinking模式配置
42
+ **行数**: ~80行
43
+
44
+ ```typescript
45
+ export class GLMThinkingConfig {
46
+ // 仅处理thinking配置注入
47
+ applyThinkingConfig(request: any): any;
48
+
49
+ // 验证thinking参数
50
+ validateThinkingParams(config: any): boolean;
51
+
52
+ // 生成thinking提示词
53
+ buildThinkingPrompt(config: any): string;
54
+ }
55
+ ```
56
+
57
+ ##### 1.2 GLM响应标准化模块
58
+ **历史文件**: `src/providers/compat/glm-specialized/response-normalizer.ts`
59
+ **职责**: 处理GLM特有的响应字段标准化
60
+ **行数**: ~120行
61
+
62
+ ```typescript
63
+ export class GLMResponseNormalizer {
64
+ // 字段映射标准化
65
+ normalizeUsageFields(response: any): any;
66
+
67
+ // 时间戳标准化
68
+ normalizeTimestamps(response: any): any;
69
+
70
+ // 模型信息标准化
71
+ normalizeModelInfo(response: any): any;
72
+ }
73
+ ```
74
+
75
+ ##### 1.3 GLM字段清理模块
76
+ **历史文件**: `src/providers/compat/glm-specialized/field-cleaner.ts`
77
+ **职责**: 清理GLM响应中的冗余和特殊字段
78
+ **行数**: ~60行
79
+
80
+ ```typescript
81
+ export class GLMFieldCleaner {
82
+ // 清理冗余字段
83
+ removeRedundantFields(response: any): any;
84
+
85
+ // 处理特殊字符
86
+ sanitizeSpecialChars(content: string): string;
87
+
88
+ // 字段重命名
89
+ renameFieldNames(response: any, mapping: Record<string, string>): any;
90
+ }
91
+ ```
92
+
93
+ ##### 1.4 GLM兼容性协调器
94
+ **历史文件**: `src/providers/compat/glm-specialized/glm-compatibility-coordinator.ts`
95
+ **职责**: 协调各个GLM专用模块,保持向后兼容
96
+ **行数**: ~90行
97
+
98
+ ```typescript
99
+ export class GLMCompatibilityCoordinator {
100
+ private thinkingConfig: GLMThinkingConfig;
101
+ private responseNormalizer: GLMResponseNormalizer;
102
+ private fieldCleaner: GLMFieldCleaner;
103
+
104
+ // 统一的入口点
105
+ processRequest(request: any): any;
106
+ processResponse(response: any): any;
107
+ }
108
+ ```
109
+
110
+ ### 2. Streaming Control简化设计 (252行 → 50行以内)
111
+
112
+ #### 当前问题
113
+ ```typescript
114
+ // streaming-control.ts (252行) - 过度复杂
115
+ ❌ 复杂的状态管理 (lines 23-89)
116
+ ❌ 多重转换逻辑 (lines 90-167)
117
+ ❌ 过度日志记录 (lines 168-252)
118
+ ```
119
+
120
+ #### 简化方案
121
+ **文件**: `src/modules/pipeline/modules/workflow/streaming-control.ts`
122
+ **行数**: 45行
123
+
124
+ ```typescript
125
+ export class StreamingControl {
126
+ // 简单的流式判断
127
+ isStreamingRequest(request: any): boolean {
128
+ return request.stream === true;
129
+ }
130
+
131
+ // 直接转换,无复杂逻辑
132
+ convertToStreaming(response: any): any {
133
+ if (!this.isStreamingRequest(response)) return response;
134
+ return { ...response, stream: true };
135
+ }
136
+
137
+ // 直接转换,无复杂逻辑
138
+ convertToNonStreaming(response: any): any {
139
+ return { ...response, stream: false };
140
+ }
141
+
142
+ // 清理资源,快速失败
143
+ cleanup(): void {
144
+ // 直接清理,无try-catch包装
145
+ }
146
+ }
147
+ ```
148
+
149
+ ### 3. 工具处理逻辑移除设计
150
+
151
+ #### 当前冲突问题
152
+ ```typescript
153
+ // glm-compatibility.ts 中的违规实现 (lines 395-489)
154
+ ❌ 工具调用格式转换
155
+ ❌ 工具文本收割
156
+ ❌ 重复调用去重
157
+ // 这些都应该在llmswitch-core中统一处理
158
+ ```
159
+
160
+ #### 移除方案
161
+ 1. **删除所有工具处理相关代码** (lines 395-489)
162
+ 2. **保留最小provider特定处理**
163
+ ```typescript
164
+ // ✅ 允许保留:仅处理GLM特有字段
165
+ export class GLMCompatibility {
166
+ processResponse(response: any): any {
167
+ // 仅字段标准化,不处理工具调用
168
+ return this.normalizeGLMFields(response);
169
+ }
170
+ }
171
+ ```
172
+
173
+ ### 4. Field Mapping类型精简设计 (10种 → 3种核心类型)
174
+
175
+ #### 当前过度复杂问题
176
+ ```typescript
177
+ // field-mapping.ts - 10种转换类型
178
+ ❌ 'direct-copy'
179
+ ❌ 'type-conversion'
180
+ ❌ 'array-mapping'
181
+ ❌ 'nested-extraction'
182
+ ❌ 'conditional-mapping'
183
+ ❌ 'format-conversion'
184
+ ❌ 'value-transformation'
185
+ ❌ 'default-filling'
186
+ ❌ 'validation-mapping'
187
+ ❌ 'custom-function'
188
+ ```
189
+
190
+ #### 精简方案
191
+ **历史文件**: `src/providers/compat/field-mapping.ts`(现由 llmswitch-core compat engine 承接)
192
+ **保留3种核心类型**:
193
+
194
+ ```typescript
195
+ // 1. 直接映射 (最常用)
196
+ export interface DirectMapping {
197
+ type: 'direct';
198
+ source: string;
199
+ target: string;
200
+ }
201
+
202
+ // 2. 类型转换 (必要时)
203
+ export interface TypeConversion {
204
+ type: 'convert';
205
+ source: string;
206
+ target: string;
207
+ convert: (value: any) => any;
208
+ }
209
+
210
+ // 3. 默认填充 (兼容性)
211
+ export interface DefaultFill {
212
+ type: 'default';
213
+ target: string;
214
+ defaultValue: any;
215
+ }
216
+
217
+ // 简化的映射引擎
218
+ export class SimplifiedFieldMapper {
219
+ applyMappings(data: any, mappings: FieldMapping[]): any {
220
+ return mappings.reduce((result, mapping) => {
221
+ switch (mapping.type) {
222
+ case 'direct': return this.applyDirect(result, mapping);
223
+ case 'convert': return this.applyConversion(result, mapping);
224
+ case 'default': return this.applyDefault(result, mapping);
225
+ }
226
+ }, data);
227
+ }
228
+ }
229
+ ```
230
+
231
+ ### 5. 快速死亡原则应用设计
232
+
233
+ #### 当前过度防护问题
234
+ ```typescript
235
+ // glm-compatibility.ts (lines 319-394) - 过度try-catch
236
+ try {
237
+ // 业务逻辑
238
+ } catch (error) {
239
+ // 复杂的错误恢复逻辑
240
+ // 静默失败
241
+ // 状态回滚
242
+ }
243
+ ```
244
+
245
+ #### 快速死亡方案
246
+ ```typescript
247
+ export class FailFastGLMCompatibility {
248
+ processRequest(request: any): any {
249
+ // 直接验证,失败即终止
250
+ this.validateRequest(request); // 抛出错误,不捕获
251
+
252
+ // 直接处理,不包装
253
+ return this.transformRequest(request);
254
+ }
255
+
256
+ private validateRequest(request: any): void {
257
+ if (!request.model) {
258
+ throw new Error('GLM request must specify model');
259
+ }
260
+ // 其他验证...
261
+ }
262
+ }
263
+ ```
264
+
265
+ ## 📊 重构效果预测
266
+
267
+ ### 代码量对比
268
+ | 模块 | 重构前 | 重构后 | 减少比例 |
269
+ |------|--------|--------|----------|
270
+ | GLM兼容层 | 643行 | 350行 (4个模块) | -45% |
271
+ | Streaming Control | 252行 | 45行 | -82% |
272
+ | Field Mapping | 180行 | 80行 | -56% |
273
+ | **总计** | **1075行** | **475行** | **-56%** |
274
+
275
+ ### 架构合规性
276
+ - ✅ 消除所有巨型文件 (>500行)
277
+ - ✅ 模块职责单一明确
278
+ - ✅ 无重复功能实现
279
+ - ✅ 错误处理快速直接
280
+ - ✅ 符合9大架构原则
281
+
282
+ ### 维护性提升
283
+ - **可读性**: 小模块易于理解和维护
284
+ - **可测试性**: 独立模块便于单元测试
285
+ - **可扩展性**: 新功能可独立模块实现
286
+ - **调试友好**: 错误定位更精确
287
+
288
+ ## 🚀 实施计划
289
+
290
+ ### 第一阶段:GLM兼容层拆分 (3天)
291
+ 1. 创建4个专职模块文件
292
+ 2. 迁移thinking配置逻辑
293
+ 3. 迁移响应标准化逻辑
294
+ 4. 迁移字段清理逻辑
295
+ 5. 创建协调器模块
296
+ 6. 更新调用方引用
297
+
298
+ ### 第二阶段:Streaming Control简化 (1天)
299
+ 1. 简化streaming-control.ts
300
+ 2. 移除复杂状态管理
301
+ 3. 移除过度日志记录
302
+ 4. 更新相关测试
303
+
304
+ ### 第三阶段:工具处理清理 (1天)
305
+ 1. 移除compatibility层工具处理逻辑
306
+ 2. 确保llmswitch-core统一处理
307
+ 3. 更新配置映射
308
+ 4. 验证工具调用流程
309
+
310
+ ### 第四阶段:Field Mapping精简 (1天)
311
+ 1. 简化转换类型定义
312
+ 2. 重构映射引擎
313
+ 3. 更新现有映射配置
314
+ 4. 测试兼容性
315
+
316
+ ### 第五阶段:快速死亡应用 (1天)
317
+ 1. 移除过度try-catch包装
318
+ 2. 实现快速错误抛出
319
+ 3. 更新错误处理文档
320
+ 4. 验证错误流程
321
+
322
+ ## ⚠️ 风险评估
323
+
324
+ ### 高风险项
325
+ - **向后兼容性**: 模块拆分可能影响现有调用
326
+ - **缓解措施**: 保持协调器模块,API不变
327
+
328
+ ### 中风险项
329
+ - **测试覆盖**: 重构可能影响现有测试
330
+ - **缓解措施**: 同步更新测试,确保覆盖率
331
+
332
+ ### 低风险项
333
+ - **性能影响**: 模块化可能带来微小性能开销
334
+ - **缓解措施**: 基准测试,性能监控
335
+
336
+ ## ✅ 验收标准
337
+
338
+ ### 功能验收
339
+ - [ ] 所有现有功能正常工作
340
+ - [ ] GLM兼容性完全保持
341
+ - [ ] 工具调用流程无变化
342
+ - [ ] 流式处理正常
343
+
344
+ ### 架构验收
345
+ - [ ] 无文件超过500行
346
+ - [ ] 模块职责单一明确
347
+ - [ ] 无重复功能实现
348
+ - [ ] 符合9大架构原则
349
+
350
+ ### 质量验收
351
+ - [ ] 测试覆盖率 > 90%
352
+ - [ ] 无性能回归
353
+ - [ ] 错误处理清晰
354
+ - [ ] 文档更新完整
355
+
356
+ ---
357
+
358
+ **设计完成时间**: 2025-11-01
359
+ **设计负责人**: Claude Code
360
+ **预计实施时间**: 7天
361
+ **预计代码减少**: 56%
@@ -0,0 +1,24 @@
1
+ {
2
+ "scanned": 6967,
3
+ "byCategory": {
4
+ "default": 562,
5
+ "tools": 586,
6
+ "coding": 248,
7
+ "longContext": 2013,
8
+ "thinking": 3534,
9
+ "webSearch": 24,
10
+ "vision": 0
11
+ },
12
+ "neverHit": [
13
+ "vision"
14
+ ],
15
+ "sampleByCategory": {
16
+ "thinking": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1762999988376_zyns5xw9n_provider-request.json",
17
+ "longContext": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763000100195_09q89vvi2_provider-request.json",
18
+ "tools": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002108961_i6ia6jndk_provider-request.json",
19
+ "webSearch": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002108961_k3ysf83dl_provider-request.json",
20
+ "coding": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002110308_iyj8j09zq_provider-request.json",
21
+ "default": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763014458732_3yfsckrin_provider-request.json"
22
+ },
23
+ "errors": []
24
+ }
@@ -0,0 +1,18 @@
1
+ # Routing Classification Report
2
+
3
+ - Scanned: 6967
4
+ - By Category: {"default":562,"tools":586,"coding":248,"longContext":2013,"thinking":3534,"webSearch":24,"vision":0}
5
+ - Never Hit: vision
6
+
7
+ ## Samples
8
+
9
+ - thinking: /Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1762999988376_zyns5xw9n_provider-request.json
10
+ - longContext: /Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763000100195_09q89vvi2_provider-request.json
11
+ - tools: /Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002108961_i6ia6jndk_provider-request.json
12
+ - webSearch: /Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002108961_k3ysf83dl_provider-request.json
13
+ - coding: /Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002110308_iyj8j09zq_provider-request.json
14
+ - default: /Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763014458732_3yfsckrin_provider-request.json
15
+
16
+ ## Errors
17
+
18
+ (none)
@@ -0,0 +1,19 @@
1
+ {
2
+ "thinkingSamples": 3572,
3
+ "keywordHits": {
4
+ "analysis": 1234,
5
+ "思考": 1690,
6
+ "推理": 572,
7
+ "分析": 2348,
8
+ "reasoning": 1304,
9
+ "analyze": 12
10
+ },
11
+ "samplePerKeyword": {
12
+ "analysis": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1762999988376_zyns5xw9n_provider-request.json",
13
+ "思考": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002108523_9wlgh144y_provider-request.json",
14
+ "推理": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002108523_9wlgh144y_provider-request.json",
15
+ "分析": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002108523_9wlgh144y_provider-request.json",
16
+ "reasoning": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763002387567_v2m2i4vc2_provider-request.json",
17
+ "analyze": "/Users/fanzhang/.routecodex/codex-samples/openai-chat/req_1763085298297_n028lwxea_provider-request.json"
18
+ }
19
+ }
@@ -0,0 +1,156 @@
1
+ ## OpenAI Responses 通信样本(FC upstream)
2
+
3
+ 本节记录当前已经验证 **可以和 `https://www.fakercode.top/v1/responses` 正常通信** 的典型请求形状,方便后续实现 Responses provider 和 llmswitch-core 路由时参考。
4
+
5
+ > 最新直通黄金样本:
6
+ > - `~/.routecodex/codex-samples/openai-responses/req_req-v2-1763955655135-2z91vfddh_request_1_validation_pre.json`(llmswitch 输入)
7
+ > - `~/.routecodex/codex-samples/openai-responses/req_1763955655139_mhw2j6ao_http-request.json`(/v1/responses 入口)
8
+ > - `~/.routecodex/codex-samples/openai-responses/req_1763955655143_24f5h9qsj_provider-request.json`(Responses Provider 直通)
9
+ > 同一时间窗的前序样本(`req_1763955649860_832l5215_http-request.json`、`req_1763955649865_drd7xwttl_provider-request.json` 等)记录了相同请求在路由/Provider 侧的视角,可一起对照,`data` 或 `data.originalData` 即为发送给 FC 的最终载荷。
10
+
11
+ ### 1. 已验证成功的请求形状(摘要)
12
+
13
+ 核心字段结构如下(去掉了大段系统提示与对话文本,只保留结构):
14
+
15
+ ```jsonc
16
+ {
17
+ "model": "gpt-5.1",
18
+ "instructions": "(一段较长的系统说明,定义 Codex CLI 能力与工作模式……)",
19
+ "input": [
20
+ {
21
+ "type": "message",
22
+ "role": "user",
23
+ "content": [
24
+ { "type": "input_text", "text": "……用户提问 1……" }
25
+ ]
26
+ },
27
+ {
28
+ "type": "message",
29
+ "role": "user",
30
+ "content": [
31
+ { "type": "input_text", "text": "……用户提问 2……" }
32
+ ]
33
+ }
34
+ // 若干 user message,全部使用 type=message + content[].type=input_text
35
+ ],
36
+ "tools": [
37
+ {
38
+ "type": "function",
39
+ "name": "shell",
40
+ "description": "Runs a shell command and returns its output.",
41
+ "strict": false,
42
+ "parameters": {
43
+ "type": "object",
44
+ "properties": {
45
+ "command": { "type": "array", "items": { "type": "string" } },
46
+ "justification": { "type": "string" },
47
+ "timeout_ms": { "type": "number" },
48
+ "with_escalated_permissions": { "type": "boolean" },
49
+ "workdir": { "type": "string" }
50
+ },
51
+ "required": ["command"],
52
+ "additionalProperties": false
53
+ }
54
+ },
55
+ {
56
+ "type": "function",
57
+ "name": "list_mcp_resources",
58
+ "strict": false,
59
+ "parameters": {
60
+ "type": "object",
61
+ "properties": {
62
+ "cursor": { "type": "string" },
63
+ "server": { "type": "string" }
64
+ },
65
+ "additionalProperties": false
66
+ }
67
+ },
68
+ {
69
+ "type": "function",
70
+ "name": "read_mcp_resource",
71
+ "strict": false,
72
+ "parameters": {
73
+ "type": "object",
74
+ "properties": {
75
+ "server": { "type": "string" },
76
+ "uri": { "type": "string" }
77
+ },
78
+ "required": ["server", "uri"],
79
+ "additionalProperties": false
80
+ }
81
+ }
82
+ // 其余 MCP / update_plan / view_image / mcp__chrome-devtools__* 等函数工具……
83
+ ],
84
+ "metadata": {
85
+ "level": "normal",
86
+ "hookCount": 1,
87
+ "successCount": 1,
88
+ "errorCount": 0
89
+ },
90
+ "stream": true
91
+ }
92
+ ```
93
+
94
+ 关键结论:
95
+
96
+ - **模型**:当前推荐使用 `model: "gpt-5.1"`(历史快照中为 `gpt-5`,但通过 Responses SDK 直接回放同一 payload、仅替换模型为 `gpt-5.1`,FC 端同样可以正常工作)。
97
+ - **instructions 必须存在且较长**:包含系统级 persona 与行为约束;直接省略 instructions 的简化请求在 FC 侧返回 400。
98
+ - **input 必须是 Responses 规范的 `type: "message"` + `content[].type: "input_text"` 结构,而不是简化版 `messages[]`。
99
+ - **tools 可以是完整的 Codex 工具集合**(shell + MCP + view_image + chrome-devtools 等),FC 能接受并返回正常响应。
100
+ - **metadata 可以保留 RouteCodex 自己的统计字段**,对上游兼容无明显影响。
101
+ - **stream=true + SSE**:该请求在 FC 上下游是以 Responses SSE 事件流的形式返回(`response.created` / `response.output_text.delta` / `response.completed` 等事件)。
102
+ - **工具结果配对只依赖 `call_id`**:OpenAI Responses 规范要求 `function_call` 与 `function_call_output` 仅通过同一 `call_id` 关联,并不会额外携带 `tool_call_id`。RouteCodex 在转换为 Chat 形状时会把 `call_id` 临时映射为 Chat 所需的 `tool_call_id`,但在发给上游或回传客户端前必须把结构还原为“只有 `call_id` 的官方形状”,否则像 c4m / Fai 这类严格实现会直接报 `Unknown parameter: input[].tool_call_id`。
103
+ - **强制开启 streaming:在用户 Provider 配置(例如 `~/.routecodex/provider/fc/config.v1.json`)的 Responses 提供者下添加 `"responses": { "process": "passthrough", "streaming": "always" }`,这样 `ResponsesHttpProvider` 会通过 `responses.streaming` 判定为 `always`,即使入口是 Anthropic/Messages 也会对上游(如 Fai/c4m)以 SSE 模式发送请求。**
104
+
105
+ ### 2. 失败的简化请求形状(对比)
106
+
107
+ 在本仓库中使用 `scripts/fc-responses-tool-loop.mjs` 进行了多次实验:
108
+
109
+ - 仅包含 `model + input[ { role, content[input_text] } ] + stream` 的最简 SSE 请求 → **400 `openai_error`**。
110
+ - 在最简请求中补充 `instructions` 与简单 `tools`(单个 echo 工具) → 仍然 **400 `openai_error`**。
111
+
112
+ 结论:
113
+ 目前 FC 的 `/v1/responses` 接口更接近“完整 Codex Responses 负载”的使用方式,对字段组合/shape 较敏感;**简单缩减字段容易 400**。因此:
114
+
115
+ - 调试 / 文档中应优先使用已验证的完整样本形状;
116
+ - 如需精简,请务必通过快照 + 对比方式逐步删减字段,每删一类字段都重新验证 FC 是否仍返回 2xx。
117
+
118
+ ### 3. 通过 Responses SDK 回放快照(SSE 事件形状)
119
+
120
+ 使用 `scripts/fc-responses-from-snapshot.mjs` 可直接读取上述快照的 `originalData`,经 OpenAI Responses SDK 调用 FC `/v1/responses`:
121
+
122
+ ```bash
123
+ FC_API_KEY=... FC_MODEL=gpt-5.1 \
124
+ node scripts/fc-responses-from-snapshot.mjs \
125
+ ~/.routecodex/codex-samples/openai-responses/req_req-v2-1763955655135-2z91vfddh_request_1_validation_pre.json
126
+ ```
127
+
128
+ 在成功场景下,SDK 报告的事件分布如下(节选):
129
+
130
+ ```jsonc
131
+ {
132
+ "response.created": 1,
133
+ "response.in_progress": 1,
134
+ "response.output_item.added": 2,
135
+ "response.reasoning_summary_part.added": 3,
136
+ "response.reasoning_summary_text.delta": 329,
137
+ "response.reasoning_summary_text.done": 3,
138
+ "response.reasoning_summary_part.done": 3,
139
+ "response.output_item.done": 2,
140
+ "response.function_call_arguments.delta": 73,
141
+ "response.function_call_arguments.done": 1,
142
+ "response.completed": 1
143
+ }
144
+ ```
145
+
146
+ 说明:
147
+
148
+ - FC 在 Responses wire 上使用的是 **标准 `response.*` 事件族**,包含 reasoning 与 function_call_arguments 相关事件;
149
+ - monitor / provider 在做直通时,必须完整透传这些事件,而不能只假定存在 `response.output_text.delta`;
150
+ - 该事件分布可作为后续设计 `responses-standard` provider 与 llmswitch-core SSE 直通逻辑时的“金标准”参考。
151
+
152
+ ### 4. 与 RouteCodex / llmswitch-core 的关系
153
+
154
+ - 通过 `routecodex monitor` + `monitor.json.transparent.wireApi = "responses"`,当前 monitor 路径会把 Codex 客户端产生的完整 Responses JSON **原样透传**到 FC `/v1/responses`,并在本地记录快照:
155
+ - `http-request` / `http-request.parsed` / `monitor.upstream-request` / `monitor.upstream-response` / `monitor.http-response`。
156
+ - 这类样本为后续实现 **Responses provider + llmswitch-core responses 直通路由** 提供了可靠的“金标准负载”,后续设计将以此为基线,不再依赖简化/猜测字段。
@@ -0,0 +1,86 @@
1
+ # OpenAI Responses 透传通路(generic-responses)设计说明
2
+
3
+ 目标
4
+ - 在 `/v1/responses` 下提供一条“严格透传”的 Responses 流水线:请求/响应完全遵循 OpenAI Responses 规范,无跨协议转换、无兜底。
5
+ - 在 `./sharedmodule` 的配置模块中新增 provider 家族 `generic_responses`,由配置引擎解析 `config.toml` 并产出 `virtualRouter`/`targetRuntime`(经 `bootstrapVirtualRouterConfig` 生成);本仓仅消费该产物并完成模块接线。
6
+
7
+ 配置(config.toml 输入)
8
+ - provider
9
+ - `[model_providers.generic_responses]`
10
+ - `name = "generic_responses"`
11
+ - `base_url = "https://api.example.com/v1"`
12
+ - `env_key = "GENERIC_RESPONSES_API_KEY"`
13
+ - `wire_api = "responses"`
14
+ - 路由
15
+ - `[routes.responses]`
16
+ - `default = "generic_responses"`
17
+ - 可选 key 映射
18
+ - `[keys.providers.generic_responses]`
19
+ - `key1 = "GENERIC_RESPONSES_API_KEY"`
20
+
21
+ sharedmodule 改动(配置引擎与兼容映射)
22
+ - config-engine(解析/校验)
23
+ - 新增 family: `generic_responses` 的 schema 与解析逻辑。
24
+ - 校验必填:`base_url`、`env_key`、`wire_api=responses`。
25
+ - 归一化输出 provider 记录:`type: "generic-responses"`,`config: { baseUrl, auth: { apiKey: "${GENERIC_RESPONSES_API_KEY}" } }`。
26
+ - 解析 `[routes.responses]`,校验 `default` 指向有效的 `generic_responses` provider。
27
+ - config-compat(生成装配输入)
28
+ - pipelines += `openai.responses.generic`:
29
+ - `llmSwitch: { type: "llmswitch-responses-passthrough" }`
30
+ - `provider: { type: "generic-responses", config: { baseUrl, auth: { apiKey }, compatibilityProfile: "compat:passthrough" } }`
31
+ - routePools["/v1/responses"] = ["openai.responses.generic"].
32
+ - routeMeta["openai.responses.generic"] = `{ providerId: "generic_responses", modelId: "responses", keyId: "key1" }`。
33
+ - compatibilityProfile 由 provider 记录直接传给 Hub Pipeline(llmswitch-core 在 `compat:passthrough` 情况下等价于 no-op)。
34
+ - compatibilityConfig.keyMappings.providers.generic_responses.key1 = `${GENERIC_RESPONSES_API_KEY}`。
35
+ - 严格模式:未配置 `routes.responses` 时不生成上述管线/路由。
36
+ - config-testkit(如有)
37
+ - 新增用例:最小配置、缺失 routes.responses、env_key 注入校验。
38
+
39
+ virtualRouter 期望(关键片段)
40
+ - `virtualRouter.routing["/v1/responses"]` 指向 `openai.responses.generic`。
41
+ - `virtualRouter.pipelines` 包含:
42
+ - id: `openai.responses.generic`
43
+ - modules:
44
+ - `llmSwitch: { type: "llmswitch-responses-passthrough", config: {} }`
45
+ - `provider: { type: "generic-responses", config: { baseUrl, auth: { apiKey }, compatibilityProfile: "compat:passthrough" } }`
46
+ - `targetRuntime["openai.responses.generic"]` = `{ providerId: "generic_responses", modelId: "responses", keyId: "key1", ... }`。
47
+ - `keyMappings.providers.generic_responses.key1 = "${GENERIC_RESPONSES_API_KEY}"`。
48
+
49
+ 本仓接线与运行时模块
50
+ - Provider:
51
+ - `src/providers/core/runtime/responses-provider.ts`:完整 Responses SSE 透传实现,负责 real-time `/responses` 请求、上游 SSE → Host JSON 的转换,以及快照写入。
52
+ - `src/providers/core/runtime/responses-http-provider.ts`:OpenAI Responses HTTP 直连 Provider(继承 `ChatHttpProvider`,统一通过 provider 层发送请求)。
53
+ - LLMSwitch:`llmswitch-responses-passthrough`
54
+ - 逻辑位于 `sharedmodule/llmswitch-core`,Host 仅通过 `src/modules/llmswitch/bridge.ts` 间接调用,保持“llmswitch-core owns routing/tools”的约束。
55
+ - 模块注册
56
+ - 由 llmswitch-core 的 pipeline registry 统一管理,Host 不再手动注册 Provider/LLMSwitch 组合,避免与 `bootstrapVirtualRouterConfig` 产物冲突。
57
+ - 装配器消费
58
+ - 管线装配逻辑也在 llmswitch-core 内,Host 仅接收 virtualRouter + targetRuntime 并实例化 provider/runtime。
59
+ - Handler 路由
60
+ - `src/server/handlers/responses-handler.ts` 按 virtualRouter pipelines 选择 `openai.responses.*` 管线处理 `/v1/responses`,禁用兜底。
61
+ - Streaming
62
+ - Responses SSE 的透传/解析由 `src/providers/core/runtime/responses-provider.ts` 直接处理(Provider 层解析 SSE,再回写 JSON 响应)。
63
+
64
+ 校验与错误策略
65
+ - 请求:缺失必填字段/类型不符 → 400(conversion_error),不 fallback 到 Chat。
66
+ - 响应:原样返回;SSE 事件名/载荷/顺序不改动;解析失败 → 中断并映射 502。
67
+ - 工具链:`required_action.submit_tool_outputs` 原样透传,不文本化。
68
+
69
+ 落盘与回放
70
+ - 目录:`~/.routecodex/codex-samples/responses-replay`。
71
+ - 文件:`raw-request_req_*.json`、`provider-out-generic_*.json`、`sse-events-<RID>.log`。
72
+ - 脚本(新增):
73
+ - `scripts/verify-responses-passthrough.mjs`:对比 raw-request 与 provider-out 正文字段一致(headers/trace 差异允许)。
74
+ - `scripts/replay-responses.mjs`:批量回放样本校验一致性。
75
+
76
+ 执行计划
77
+ 1) sharedmodule/config-engine:
78
+ - 新增 family `generic_responses` 的 schema 与解析;解析 `[routes.responses]`;输出规范 provider 与 routes。
79
+ 2) sharedmodule/config-compat:
80
+ - 生成 `openai.responses.generic` 管线与 routePools/routeMeta/keyMappings;严格模式无 fallback。
81
+ 3) 本仓接线:
82
+ - Provider `generic-responses`、LLMSwitch `llmswitch-responses-passthrough` 实现与注册;Assembler 放行类型;Responses Handler 固定直通;不再注入 host-side compatibility 模块。
83
+ 4) 校验工具:
84
+ - 新增 `scripts/verify-responses-passthrough.mjs`、`scripts/replay-responses.mjs`;准备 10 非流 + 10 流式样本自检。
85
+ 5) 文档与发布:
86
+ - 更新 README/变更日志;bump 版本,构建与全局安装(不自启动)。