@jsonstudio/llms 0.4.3 → 0.4.5

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 (542) hide show
  1. package/README.md +3 -1
  2. package/dist/bridge/routecodex-adapter.js +6 -3
  3. package/dist/config-unified/enhanced-path-resolver.js +14 -6
  4. package/dist/config-unified/unified-config.js +103 -59
  5. package/dist/conversion/codec-registry.js +15 -3
  6. package/dist/conversion/codecs/anthropic-openai-codec.d.ts +3 -13
  7. package/dist/conversion/codecs/anthropic-openai-codec.js +18 -473
  8. package/dist/conversion/codecs/gemini-openai-codec.js +91 -48
  9. package/dist/conversion/codecs/responses-openai-codec.js +9 -2
  10. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.js +3 -0
  11. package/dist/conversion/hub/format-adapters/chat-format-adapter.js +3 -0
  12. package/dist/conversion/hub/format-adapters/gemini-format-adapter.js +3 -0
  13. package/dist/conversion/hub/format-adapters/responses-format-adapter.d.ts +2 -0
  14. package/dist/conversion/hub/format-adapters/responses-format-adapter.js +9 -0
  15. package/dist/conversion/hub/node-support.js +3 -1
  16. package/dist/conversion/hub/pipeline/hub-pipeline.js +41 -37
  17. package/dist/conversion/hub/process/chat-process.js +258 -41
  18. package/dist/conversion/hub/response/provider-response.js +9 -3
  19. package/dist/conversion/hub/response/response-mappers.js +1 -1
  20. package/dist/conversion/hub/response/response-runtime.js +109 -10
  21. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.js +70 -156
  22. package/dist/conversion/hub/semantic-mappers/chat-mapper.js +63 -52
  23. package/dist/conversion/hub/semantic-mappers/gemini-mapper.js +76 -143
  24. package/dist/conversion/hub/semantic-mappers/responses-mapper.js +40 -160
  25. package/dist/conversion/hub/standardized-bridge.js +3 -0
  26. package/dist/conversion/hub/tool-governance/engine.d.ts +16 -0
  27. package/dist/conversion/hub/tool-governance/engine.js +266 -0
  28. package/dist/conversion/hub/tool-governance/index.d.ts +3 -0
  29. package/dist/conversion/hub/tool-governance/index.js +2 -0
  30. package/dist/conversion/hub/tool-governance/rules.d.ts +2 -0
  31. package/dist/conversion/hub/tool-governance/rules.js +76 -0
  32. package/dist/conversion/hub/tool-governance/types.d.ts +38 -0
  33. package/dist/conversion/index.d.ts +6 -0
  34. package/dist/conversion/index.js +6 -0
  35. package/dist/conversion/pipeline/codecs/v2/anthropic-openai-pipeline.d.ts +12 -0
  36. package/dist/conversion/pipeline/codecs/v2/anthropic-openai-pipeline.js +100 -0
  37. package/dist/conversion/pipeline/codecs/v2/openai-openai-pipeline.d.ts +15 -0
  38. package/dist/conversion/pipeline/codecs/v2/openai-openai-pipeline.js +174 -0
  39. package/dist/conversion/pipeline/codecs/v2/responses-openai-pipeline.d.ts +14 -0
  40. package/dist/conversion/pipeline/codecs/v2/responses-openai-pipeline.js +166 -0
  41. package/dist/conversion/pipeline/codecs/v2/shared/openai-chat-helpers.d.ts +13 -0
  42. package/dist/conversion/pipeline/codecs/v2/shared/openai-chat-helpers.js +66 -0
  43. package/dist/conversion/pipeline/hooks/adapter-context.d.ts +7 -0
  44. package/dist/conversion/pipeline/hooks/adapter-context.js +18 -0
  45. package/dist/conversion/pipeline/hooks/protocol-hooks.d.ts +67 -0
  46. package/dist/conversion/pipeline/hooks/protocol-hooks.js +1 -0
  47. package/dist/conversion/pipeline/index.d.ts +35 -0
  48. package/dist/conversion/pipeline/index.js +103 -0
  49. package/dist/conversion/pipeline/meta/meta-bag.d.ts +20 -0
  50. package/dist/conversion/pipeline/meta/meta-bag.js +81 -0
  51. package/dist/conversion/pipeline/schema/canonical-chat.d.ts +18 -0
  52. package/dist/conversion/pipeline/schema/canonical-chat.js +1 -0
  53. package/dist/conversion/pipeline/schema/index.d.ts +1 -0
  54. package/dist/conversion/pipeline/schema/index.js +1 -0
  55. package/dist/conversion/responses/responses-openai-bridge.d.ts +11 -58
  56. package/dist/conversion/responses/responses-openai-bridge.js +157 -1144
  57. package/dist/conversion/shared/anthropic-message-utils.d.ts +12 -0
  58. package/dist/conversion/shared/anthropic-message-utils.js +587 -0
  59. package/dist/conversion/shared/bridge-actions.d.ts +39 -0
  60. package/dist/conversion/shared/bridge-actions.js +709 -0
  61. package/dist/conversion/shared/{responses-conversation-store.d.ts → bridge-conversation-store.d.ts} +7 -7
  62. package/dist/conversion/shared/bridge-conversation-store.js +279 -0
  63. package/dist/conversion/shared/bridge-id-utils.js +42 -0
  64. package/dist/conversion/shared/bridge-instructions.d.ts +1 -0
  65. package/dist/conversion/shared/bridge-instructions.js +113 -0
  66. package/dist/conversion/shared/bridge-message-types.d.ts +39 -0
  67. package/dist/conversion/shared/bridge-message-types.js +1 -0
  68. package/dist/conversion/shared/bridge-message-utils.d.ts +22 -0
  69. package/dist/conversion/shared/bridge-message-utils.js +473 -0
  70. package/dist/conversion/shared/bridge-metadata.d.ts +1 -0
  71. package/dist/conversion/shared/bridge-metadata.js +1 -0
  72. package/dist/conversion/shared/bridge-policies.d.ts +18 -0
  73. package/dist/conversion/shared/bridge-policies.js +276 -0
  74. package/dist/conversion/shared/bridge-request-adapter.d.ts +28 -0
  75. package/dist/conversion/shared/bridge-request-adapter.js +430 -0
  76. package/dist/conversion/shared/chat-output-normalizer.d.ts +4 -0
  77. package/dist/conversion/shared/chat-output-normalizer.js +56 -0
  78. package/dist/conversion/shared/chat-request-filters.js +24 -1
  79. package/dist/conversion/shared/gemini-tool-utils.d.ts +5 -0
  80. package/dist/conversion/shared/gemini-tool-utils.js +130 -0
  81. package/dist/conversion/shared/metadata-passthrough.d.ts +11 -0
  82. package/dist/conversion/shared/metadata-passthrough.js +57 -0
  83. package/dist/conversion/shared/output-content-normalizer.d.ts +12 -0
  84. package/dist/conversion/shared/output-content-normalizer.js +119 -0
  85. package/dist/conversion/shared/reasoning-normalizer.d.ts +21 -0
  86. package/dist/conversion/shared/reasoning-normalizer.js +368 -0
  87. package/dist/conversion/shared/reasoning-tool-normalizer.d.ts +12 -0
  88. package/dist/conversion/shared/reasoning-tool-normalizer.js +132 -0
  89. package/dist/conversion/shared/reasoning-tool-parser.d.ts +10 -0
  90. package/dist/conversion/shared/reasoning-tool-parser.js +95 -0
  91. package/dist/conversion/shared/reasoning-utils.d.ts +2 -0
  92. package/dist/conversion/shared/reasoning-utils.js +42 -0
  93. package/dist/conversion/shared/responses-conversation-store.js +5 -11
  94. package/dist/conversion/shared/responses-message-utils.d.ts +15 -0
  95. package/dist/conversion/shared/responses-message-utils.js +206 -0
  96. package/dist/conversion/shared/responses-output-builder.d.ts +15 -0
  97. package/dist/conversion/shared/responses-output-builder.js +179 -0
  98. package/dist/conversion/shared/responses-output-utils.d.ts +7 -0
  99. package/dist/conversion/shared/responses-output-utils.js +108 -0
  100. package/dist/conversion/shared/responses-request-adapter.d.ts +3 -41
  101. package/dist/conversion/shared/responses-request-adapter.js +9 -40
  102. package/dist/conversion/shared/responses-response-utils.d.ts +3 -0
  103. package/dist/conversion/shared/responses-response-utils.js +209 -0
  104. package/dist/conversion/shared/responses-tool-utils.d.ts +12 -0
  105. package/dist/conversion/shared/responses-tool-utils.js +90 -0
  106. package/dist/conversion/shared/responses-types.d.ts +33 -0
  107. package/dist/conversion/shared/responses-types.js +1 -0
  108. package/dist/conversion/shared/tool-call-utils.d.ts +11 -0
  109. package/dist/conversion/shared/tool-call-utils.js +56 -0
  110. package/dist/conversion/shared/tool-mapping.d.ts +9 -0
  111. package/dist/conversion/shared/tool-mapping.js +124 -0
  112. package/dist/conversion/shared/tool-normalizers.d.ts +4 -0
  113. package/dist/conversion/shared/tool-normalizers.js +84 -0
  114. package/dist/router/virtual-router/bootstrap.js +18 -3
  115. package/dist/router/virtual-router/provider-registry.js +4 -2
  116. package/dist/router/virtual-router/types.d.ts +6 -0
  117. package/dist/sse/index.d.ts +38 -2
  118. package/dist/sse/index.js +27 -0
  119. package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +12 -9
  120. package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.js +106 -73
  121. package/dist/sse/json-to-sse/chat-json-to-sse-converter.js +6 -2
  122. package/dist/sse/json-to-sse/gemini-json-to-sse-converter.d.ts +14 -0
  123. package/dist/sse/json-to-sse/gemini-json-to-sse-converter.js +99 -0
  124. package/dist/sse/json-to-sse/index.d.ts +2 -1
  125. package/dist/sse/json-to-sse/index.js +2 -0
  126. package/dist/sse/json-to-sse/sequencers/anthropic-sequencer.d.ts +13 -0
  127. package/dist/sse/json-to-sse/sequencers/anthropic-sequencer.js +150 -0
  128. package/dist/sse/json-to-sse/sequencers/chat-sequencer.d.ts +3 -1
  129. package/dist/sse/json-to-sse/sequencers/chat-sequencer.js +49 -3
  130. package/dist/sse/json-to-sse/sequencers/gemini-sequencer.d.ts +10 -0
  131. package/dist/sse/json-to-sse/sequencers/gemini-sequencer.js +95 -0
  132. package/dist/sse/json-to-sse/sequencers/responses-sequencer.js +31 -5
  133. package/dist/sse/registry/sse-codec-registry.d.ts +1 -1
  134. package/dist/sse/registry/sse-codec-registry.js +30 -1
  135. package/dist/sse/shared/reasoning-dispatcher.d.ts +10 -0
  136. package/dist/sse/shared/reasoning-dispatcher.js +25 -0
  137. package/dist/sse/shared/responses-output-normalizer.d.ts +12 -0
  138. package/dist/sse/shared/responses-output-normalizer.js +45 -0
  139. package/dist/sse/shared/serializers/anthropic-event-serializer.d.ts +2 -0
  140. package/dist/sse/shared/serializers/anthropic-event-serializer.js +9 -0
  141. package/dist/sse/shared/serializers/gemini-event-serializer.d.ts +2 -0
  142. package/dist/sse/shared/serializers/gemini-event-serializer.js +5 -0
  143. package/dist/sse/shared/serializers/index.d.ts +2 -0
  144. package/dist/sse/shared/serializers/index.js +2 -0
  145. package/dist/sse/shared/writer.d.ts +17 -1
  146. package/dist/sse/shared/writer.js +37 -1
  147. package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +9 -11
  148. package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.js +92 -127
  149. package/dist/sse/sse-to-json/builders/anthropic-response-builder.d.ts +16 -0
  150. package/dist/sse/sse-to-json/builders/anthropic-response-builder.js +151 -0
  151. package/dist/sse/sse-to-json/builders/response-builder.d.ts +1 -1
  152. package/dist/sse/sse-to-json/builders/response-builder.js +29 -7
  153. package/dist/sse/sse-to-json/chat-sse-to-json-converter.d.ts +8 -0
  154. package/dist/sse/sse-to-json/chat-sse-to-json-converter.js +116 -26
  155. package/dist/sse/sse-to-json/gemini-sse-to-json-converter.d.ts +13 -0
  156. package/dist/sse/sse-to-json/gemini-sse-to-json-converter.js +160 -0
  157. package/dist/sse/sse-to-json/index.d.ts +2 -1
  158. package/dist/sse/sse-to-json/index.js +2 -0
  159. package/dist/sse/sse-to-json/parsers/sse-parser.js +73 -13
  160. package/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +1 -0
  161. package/dist/sse/sse-to-json/responses-sse-to-json-converter.js +10 -8
  162. package/dist/sse/types/anthropic-types.d.ts +119 -36
  163. package/dist/sse/types/anthropic-types.js +8 -5
  164. package/dist/sse/types/chat-types.d.ts +19 -6
  165. package/dist/sse/types/chat-types.js +2 -1
  166. package/dist/sse/types/conversion-context.d.ts +14 -11
  167. package/dist/sse/types/core-interfaces.d.ts +7 -3
  168. package/dist/sse/types/gemini-types.d.ts +116 -0
  169. package/dist/sse/types/gemini-types.js +5 -0
  170. package/dist/sse/types/index.d.ts +5 -2
  171. package/dist/sse/types/index.js +2 -0
  172. package/dist/sse/types/responses-types.d.ts +20 -20
  173. package/dist/sse/types/sse-events.d.ts +4 -3
  174. package/dist/sse/types/stream-state.d.ts +34 -39
  175. package/dist/sse/types/utility-types.d.ts +47 -43
  176. package/dist/sse/types/utility-types.js +10 -13
  177. package/dist/tools/tool-registry.js +156 -98
  178. package/package.json +7 -7
  179. package/dist/api/index.d.ts +0 -10
  180. package/dist/api/index.js +0 -11
  181. package/dist/api/llmswitch-config.d.ts +0 -15
  182. package/dist/api/llmswitch-config.js +0 -415
  183. package/dist/api/llmswitch-types.d.ts +0 -412
  184. package/dist/api/llmswitch-types.js +0 -60
  185. package/dist/bridge/routecodex-adapter.d.ts +0 -74
  186. package/dist/config/index.d.ts +0 -3
  187. package/dist/config/index.js +0 -5
  188. package/dist/config-unified/enhanced-path-resolver.d.ts +0 -5
  189. package/dist/config-unified/unified-config.d.ts +0 -26
  190. package/dist/conversion/codec-registry.d.ts +0 -10
  191. package/dist/conversion/codecs/gemini-openai-codec.d.ts +0 -16
  192. package/dist/conversion/codecs/openai-openai-codec.d.ts +0 -12
  193. package/dist/conversion/codecs/responses-openai-codec.d.ts +0 -12
  194. package/dist/conversion/config/config-manager.d.ts +0 -212
  195. package/dist/conversion/conversion-v3/adapters/index.d.ts +0 -2
  196. package/dist/conversion/conversion-v3/adapters/index.js +0 -1
  197. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.d.ts +0 -38
  198. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.js +0 -55
  199. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.d.ts +0 -22
  200. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.js +0 -84
  201. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.d.ts +0 -4
  202. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.js +0 -285
  203. package/dist/conversion/conversion-v3/compatibility/index.d.ts +0 -3
  204. package/dist/conversion/conversion-v3/compatibility/index.js +0 -2
  205. package/dist/conversion/conversion-v3/config/default-configs.d.ts +0 -48
  206. package/dist/conversion/conversion-v3/config/default-configs.js +0 -1007
  207. package/dist/conversion/conversion-v3/config/index.d.ts +0 -5
  208. package/dist/conversion/conversion-v3/config/index.js +0 -5
  209. package/dist/conversion/conversion-v3/config/pipeline-config-manager.d.ts +0 -49
  210. package/dist/conversion/conversion-v3/config/pipeline-config-manager.js +0 -65
  211. package/dist/conversion/conversion-v3/index.d.ts +0 -11
  212. package/dist/conversion/conversion-v3/index.js +0 -17
  213. package/dist/conversion/conversion-v3/nodes/index.d.ts +0 -56
  214. package/dist/conversion/conversion-v3/nodes/index.js +0 -149
  215. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.d.ts +0 -25
  216. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.js +0 -56
  217. package/dist/conversion/conversion-v3/nodes/input/base-input-node.d.ts +0 -75
  218. package/dist/conversion/conversion-v3/nodes/input/base-input-node.js +0 -237
  219. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.d.ts +0 -25
  220. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.js +0 -56
  221. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.d.ts +0 -4
  222. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.js +0 -197
  223. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.d.ts +0 -16
  224. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.js +0 -125
  225. package/dist/conversion/conversion-v3/nodes/input/index.d.ts +0 -8
  226. package/dist/conversion/conversion-v3/nodes/input/index.js +0 -8
  227. package/dist/conversion/conversion-v3/nodes/input/input-decision.d.ts +0 -46
  228. package/dist/conversion/conversion-v3/nodes/input/input-decision.js +0 -125
  229. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.d.ts +0 -20
  230. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.js +0 -51
  231. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.d.ts +0 -71
  232. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.js +0 -320
  233. package/dist/conversion/conversion-v3/nodes/output/base-output-node.d.ts +0 -116
  234. package/dist/conversion/conversion-v3/nodes/output/base-output-node.js +0 -512
  235. package/dist/conversion/conversion-v3/nodes/output/index.d.ts +0 -7
  236. package/dist/conversion/conversion-v3/nodes/output/index.js +0 -7
  237. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.d.ts +0 -71
  238. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.js +0 -293
  239. package/dist/conversion/conversion-v3/nodes/output/output-decision.d.ts +0 -68
  240. package/dist/conversion/conversion-v3/nodes/output/output-decision.js +0 -161
  241. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.d.ts +0 -64
  242. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.js +0 -323
  243. package/dist/conversion/conversion-v3/nodes/process/base-process-node.d.ts +0 -72
  244. package/dist/conversion/conversion-v3/nodes/process/base-process-node.js +0 -246
  245. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.d.ts +0 -135
  246. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.js +0 -854
  247. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.d.ts +0 -29
  248. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.js +0 -181
  249. package/dist/conversion/conversion-v3/nodes/process/index.d.ts +0 -10
  250. package/dist/conversion/conversion-v3/nodes/process/index.js +0 -10
  251. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.d.ts +0 -59
  252. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.js +0 -243
  253. package/dist/conversion/conversion-v3/nodes/process/response-process-node.d.ts +0 -17
  254. package/dist/conversion/conversion-v3/nodes/process/response-process-node.js +0 -213
  255. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.d.ts +0 -30
  256. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.js +0 -360
  257. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.d.ts +0 -40
  258. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.js +0 -430
  259. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.d.ts +0 -12
  260. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.js +0 -129
  261. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.d.ts +0 -15
  262. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.js +0 -57
  263. package/dist/conversion/conversion-v3/nodes/response/index.d.ts +0 -4
  264. package/dist/conversion/conversion-v3/nodes/response/index.js +0 -4
  265. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.d.ts +0 -15
  266. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.js +0 -87
  267. package/dist/conversion/conversion-v3/nodes/response/response-utils.d.ts +0 -1
  268. package/dist/conversion/conversion-v3/nodes/response/response-utils.js +0 -1
  269. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.d.ts +0 -12
  270. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.js +0 -67
  271. package/dist/conversion/conversion-v3/nodes/sse/index.d.ts +0 -3
  272. package/dist/conversion/conversion-v3/nodes/sse/index.js +0 -3
  273. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.d.ts +0 -27
  274. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.js +0 -165
  275. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.d.ts +0 -19
  276. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.js +0 -267
  277. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.d.ts +0 -18
  278. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.js +0 -48
  279. package/dist/conversion/conversion-v3/pipelines/index.d.ts +0 -6
  280. package/dist/conversion/conversion-v3/pipelines/index.js +0 -6
  281. package/dist/conversion/conversion-v3/pipelines/super-pipeline.d.ts +0 -112
  282. package/dist/conversion/conversion-v3/pipelines/super-pipeline.js +0 -566
  283. package/dist/conversion/conversion-v3/response/provider-response-converter.d.ts +0 -28
  284. package/dist/conversion/conversion-v3/response/provider-response-converter.js +0 -249
  285. package/dist/conversion/conversion-v3/sse/index.d.ts +0 -140
  286. package/dist/conversion/conversion-v3/sse/index.js +0 -115
  287. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +0 -11
  288. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.js +0 -79
  289. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.d.ts +0 -79
  290. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.js +0 -296
  291. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.d.ts +0 -55
  292. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.js +0 -233
  293. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.d.ts +0 -99
  294. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.js +0 -599
  295. package/dist/conversion/conversion-v3/sse/json-to-sse/index.d.ts +0 -6
  296. package/dist/conversion/conversion-v3/sse/json-to-sse/index.js +0 -7
  297. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.d.ts +0 -79
  298. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.js +0 -322
  299. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.d.ts +0 -37
  300. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.js +0 -218
  301. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.d.ts +0 -40
  302. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.js +0 -263
  303. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.d.ts +0 -32
  304. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.js +0 -106
  305. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.d.ts +0 -4
  306. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.js +0 -40
  307. package/dist/conversion/conversion-v3/sse/shared/constants.d.ts +0 -272
  308. package/dist/conversion/conversion-v3/sse/shared/constants.js +0 -321
  309. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.d.ts +0 -158
  310. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.js +0 -210
  311. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.d.ts +0 -82
  312. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.js +0 -275
  313. package/dist/conversion/conversion-v3/sse/shared/serializers/index.d.ts +0 -39
  314. package/dist/conversion/conversion-v3/sse/shared/serializers/index.js +0 -54
  315. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.d.ts +0 -123
  316. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.js +0 -356
  317. package/dist/conversion/conversion-v3/sse/shared/serializers/types.d.ts +0 -51
  318. package/dist/conversion/conversion-v3/sse/shared/serializers/types.js +0 -4
  319. package/dist/conversion/conversion-v3/sse/shared/utils.d.ts +0 -254
  320. package/dist/conversion/conversion-v3/sse/shared/utils.js +0 -543
  321. package/dist/conversion/conversion-v3/sse/shared/writer.d.ts +0 -111
  322. package/dist/conversion/conversion-v3/sse/shared/writer.js +0 -268
  323. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +0 -13
  324. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.js +0 -139
  325. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.d.ts +0 -165
  326. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.js +0 -776
  327. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.d.ts +0 -106
  328. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.js +0 -540
  329. package/dist/conversion/conversion-v3/sse/sse-to-json/index.d.ts +0 -6
  330. package/dist/conversion/conversion-v3/sse/sse-to-json/index.js +0 -7
  331. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.d.ts +0 -73
  332. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.js +0 -332
  333. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.d.ts +0 -59
  334. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.js +0 -270
  335. package/dist/conversion/conversion-v3/sse/types/anthropic-types.d.ts +0 -87
  336. package/dist/conversion/conversion-v3/sse/types/anthropic-types.js +0 -5
  337. package/dist/conversion/conversion-v3/sse/types/chat-types.d.ts +0 -308
  338. package/dist/conversion/conversion-v3/sse/types/chat-types.js +0 -32
  339. package/dist/conversion/conversion-v3/sse/types/conversion-context.d.ts +0 -211
  340. package/dist/conversion/conversion-v3/sse/types/conversion-context.js +0 -20
  341. package/dist/conversion/conversion-v3/sse/types/core-interfaces.d.ts +0 -90
  342. package/dist/conversion/conversion-v3/sse/types/core-interfaces.js +0 -5
  343. package/dist/conversion/conversion-v3/sse/types/index.d.ts +0 -14
  344. package/dist/conversion/conversion-v3/sse/types/index.js +0 -7
  345. package/dist/conversion/conversion-v3/sse/types/responses-types.d.ts +0 -328
  346. package/dist/conversion/conversion-v3/sse/types/responses-types.js +0 -38
  347. package/dist/conversion/conversion-v3/sse/types/sse-events.d.ts +0 -180
  348. package/dist/conversion/conversion-v3/sse/types/sse-events.js +0 -150
  349. package/dist/conversion/conversion-v3/sse/types/stream-state.d.ts +0 -204
  350. package/dist/conversion/conversion-v3/sse/types/stream-state.js +0 -44
  351. package/dist/conversion/conversion-v3/sse/types/utility-types.d.ts +0 -230
  352. package/dist/conversion/conversion-v3/sse/types/utility-types.js +0 -49
  353. package/dist/conversion/conversion-v3/standards/context-adapter.d.ts +0 -146
  354. package/dist/conversion/conversion-v3/standards/context-adapter.js +0 -438
  355. package/dist/conversion/conversion-v3/standards/errors.d.ts +0 -38
  356. package/dist/conversion/conversion-v3/standards/errors.js +0 -27
  357. package/dist/conversion/conversion-v3/standards/index.d.ts +0 -15
  358. package/dist/conversion/conversion-v3/standards/index.js +0 -11
  359. package/dist/conversion/conversion-v3/standards/node-capabilities.d.ts +0 -123
  360. package/dist/conversion/conversion-v3/standards/node-capabilities.js +0 -330
  361. package/dist/conversion/conversion-v3/standards/pipeline-context.d.ts +0 -237
  362. package/dist/conversion/conversion-v3/standards/pipeline-context.js +0 -84
  363. package/dist/conversion/conversion-v3/standards/pipeline-node.d.ts +0 -196
  364. package/dist/conversion/conversion-v3/standards/pipeline-node.js +0 -316
  365. package/dist/conversion/conversion-v3/standards/snapshot-handles.d.ts +0 -24
  366. package/dist/conversion/conversion-v3/standards/snapshot-handles.js +0 -49
  367. package/dist/conversion/conversion-v3/types/config-types.d.ts +0 -242
  368. package/dist/conversion/conversion-v3/types/config-types.js +0 -13
  369. package/dist/conversion/conversion-v3/types/index.d.ts +0 -8
  370. package/dist/conversion/conversion-v3/types/index.js +0 -11
  371. package/dist/conversion/conversion-v3/types/node-types.d.ts +0 -211
  372. package/dist/conversion/conversion-v3/types/node-types.js +0 -20
  373. package/dist/conversion/conversion-v3/types/pipeline-types.d.ts +0 -246
  374. package/dist/conversion/conversion-v3/types/pipeline-types.js +0 -26
  375. package/dist/conversion/conversion-v3/types/request-types.d.ts +0 -293
  376. package/dist/conversion/conversion-v3/types/request-types.js +0 -26
  377. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.d.ts +0 -10
  378. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.js +0 -103
  379. package/dist/conversion/conversion-v3/validations/index.d.ts +0 -8
  380. package/dist/conversion/conversion-v3/validations/index.js +0 -7
  381. package/dist/conversion/conversion-v3/validations/node-graph-validator.d.ts +0 -116
  382. package/dist/conversion/conversion-v3/validations/node-graph-validator.js +0 -505
  383. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.d.ts +0 -139
  384. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.js +0 -338
  385. package/dist/conversion/hub/config/types.d.ts +0 -26
  386. package/dist/conversion/hub/core/detour-registry.d.ts +0 -9
  387. package/dist/conversion/hub/core/hub-context.d.ts +0 -21
  388. package/dist/conversion/hub/core/index.d.ts +0 -3
  389. package/dist/conversion/hub/core/stage-driver.d.ts +0 -30
  390. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.d.ts +0 -16
  391. package/dist/conversion/hub/format-adapters/chat-format-adapter.d.ts +0 -17
  392. package/dist/conversion/hub/format-adapters/gemini-format-adapter.d.ts +0 -16
  393. package/dist/conversion/hub/format-adapters/index.d.ts +0 -21
  394. package/dist/conversion/hub/hub-feature.d.ts +0 -1
  395. package/dist/conversion/hub/node-support.d.ts +0 -19
  396. package/dist/conversion/hub/pipeline/hub-pipeline.d.ts +0 -68
  397. package/dist/conversion/hub/pipelines/inbound.d.ts +0 -22
  398. package/dist/conversion/hub/pipelines/outbound.d.ts +0 -22
  399. package/dist/conversion/hub/process/chat-process.d.ts +0 -13
  400. package/dist/conversion/hub/registry.d.ts +0 -28
  401. package/dist/conversion/hub/response/chat-response-utils.d.ts +0 -6
  402. package/dist/conversion/hub/response/provider-response.d.ts +0 -20
  403. package/dist/conversion/hub/response/response-mappers.d.ts +0 -19
  404. package/dist/conversion/hub/response/response-runtime.d.ts +0 -3
  405. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.d.ts +0 -7
  406. package/dist/conversion/hub/semantic-mappers/chat-mapper.d.ts +0 -7
  407. package/dist/conversion/hub/semantic-mappers/gemini-mapper.d.ts +0 -7
  408. package/dist/conversion/hub/semantic-mappers/index.d.ts +0 -4
  409. package/dist/conversion/hub/semantic-mappers/responses-mapper.d.ts +0 -21
  410. package/dist/conversion/hub/snapshot-recorder.d.ts +0 -12
  411. package/dist/conversion/hub/standardized-bridge.d.ts +0 -12
  412. package/dist/conversion/hub/types/chat-envelope.d.ts +0 -67
  413. package/dist/conversion/hub/types/chat-schema.d.ts +0 -112
  414. package/dist/conversion/hub/types/errors.d.ts +0 -5
  415. package/dist/conversion/hub/types/format-envelope.d.ts +0 -7
  416. package/dist/conversion/hub/types/index.d.ts +0 -6
  417. package/dist/conversion/hub/types/json.d.ts +0 -9
  418. package/dist/conversion/hub/types/node.d.ts +0 -31
  419. package/dist/conversion/hub/types/standardized.d.ts +0 -94
  420. package/dist/conversion/schema-validator.d.ts +0 -7
  421. package/dist/conversion/shared/args-mapping.d.ts +0 -18
  422. package/dist/conversion/shared/chat-request-filters.d.ts +0 -9
  423. package/dist/conversion/shared/jsonish.d.ts +0 -3
  424. package/dist/conversion/shared/mcp-injection.d.ts +0 -2
  425. package/dist/conversion/shared/media.d.ts +0 -1
  426. package/dist/conversion/shared/openai-finalizer.d.ts +0 -9
  427. package/dist/conversion/shared/openai-message-normalize.d.ts +0 -1
  428. package/dist/conversion/shared/payload-budget.d.ts +0 -13
  429. package/dist/conversion/shared/reasoning-mapping.d.ts +0 -5
  430. package/dist/conversion/shared/responses-instructions.d.ts +0 -1
  431. package/dist/conversion/shared/responses-metadata.d.ts +0 -1
  432. package/dist/conversion/shared/snapshot-hooks.d.ts +0 -12
  433. package/dist/conversion/shared/streaming-text-extractor.d.ts +0 -26
  434. package/dist/conversion/shared/text-markup-normalizer.d.ts +0 -9
  435. package/dist/conversion/shared/tool-canonicalizer.d.ts +0 -2
  436. package/dist/conversion/shared/tool-filter-pipeline.d.ts +0 -17
  437. package/dist/conversion/shared/tool-governor.d.ts +0 -27
  438. package/dist/conversion/shared/tool-harvester.d.ts +0 -31
  439. package/dist/conversion/shared/tooling.d.ts +0 -26
  440. package/dist/conversion/types.d.ts +0 -33
  441. package/dist/core/index.d.ts +0 -6
  442. package/dist/core/index.js +0 -9
  443. package/dist/core/llmswitch-engine-v2.d.ts +0 -132
  444. package/dist/core/llmswitch-engine-v2.js +0 -649
  445. package/dist/core/llmswitch-factory-v2.d.ts +0 -123
  446. package/dist/core/llmswitch-factory-v2.js +0 -521
  447. package/dist/endpoints/base-endpoint-handler.d.ts +0 -128
  448. package/dist/endpoints/base-endpoint-handler.js +0 -545
  449. package/dist/endpoints/chat-endpoint-handler.d.ts +0 -115
  450. package/dist/endpoints/chat-endpoint-handler.js +0 -218
  451. package/dist/endpoints/endpoint-router.d.ts +0 -127
  452. package/dist/endpoints/endpoint-router.js +0 -438
  453. package/dist/endpoints/index.d.ts +0 -13
  454. package/dist/endpoints/index.js +0 -11
  455. package/dist/endpoints/messages-endpoint-handler.d.ts +0 -171
  456. package/dist/endpoints/messages-endpoint-handler.js +0 -238
  457. package/dist/endpoints/responses-endpoint-handler.d.ts +0 -147
  458. package/dist/endpoints/responses-endpoint-handler.js +0 -233
  459. package/dist/filters/builtin/add-fields-filter.d.ts +0 -8
  460. package/dist/filters/builtin/blacklist-filter.d.ts +0 -8
  461. package/dist/filters/builtin/whitelist-filter.d.ts +0 -8
  462. package/dist/filters/engine.d.ts +0 -16
  463. package/dist/filters/index.d.ts +0 -19
  464. package/dist/filters/special/request-streaming-to-nonstreaming.d.ts +0 -12
  465. package/dist/filters/special/request-tool-choice-policy.d.ts +0 -11
  466. package/dist/filters/special/request-tool-list-filter.d.ts +0 -11
  467. package/dist/filters/special/request-toolcalls-stringify.d.ts +0 -10
  468. package/dist/filters/special/request-tools-normalize.d.ts +0 -12
  469. package/dist/filters/special/response-finish-invariants.d.ts +0 -11
  470. package/dist/filters/special/response-openai-to-responses-bridge.d.ts +0 -13
  471. package/dist/filters/special/response-tool-arguments-blacklist.d.ts +0 -12
  472. package/dist/filters/special/response-tool-arguments-schema-converge.d.ts +0 -13
  473. package/dist/filters/special/response-tool-arguments-stringify.d.ts +0 -9
  474. package/dist/filters/special/response-tool-arguments-toon-decode.d.ts +0 -10
  475. package/dist/filters/special/response-tool-arguments-whitelist.d.ts +0 -11
  476. package/dist/filters/special/response-tool-text-canonicalize.d.ts +0 -10
  477. package/dist/filters/special/tool-filter-hooks.d.ts +0 -19
  478. package/dist/filters/special/tool-post-constraints.d.ts +0 -31
  479. package/dist/filters/types.d.ts +0 -68
  480. package/dist/filters/utils/fieldmap-loader.d.ts +0 -2
  481. package/dist/filters/utils/snapshot-writer.d.ts +0 -10
  482. package/dist/guidance/index.d.ts +0 -3
  483. package/dist/hooks/hooks-integration.d.ts +0 -161
  484. package/dist/hooks/hooks-integration.js +0 -519
  485. package/dist/hooks/index.d.ts +0 -10
  486. package/dist/hooks/index.js +0 -13
  487. package/dist/html-to-markdown.d.ts +0 -5
  488. package/dist/html-to-markdown.js +0 -66
  489. package/dist/http/sse-response.d.ts +0 -22
  490. package/dist/router/virtual-router/bootstrap.d.ts +0 -6
  491. package/dist/router/virtual-router/classifier.d.ts +0 -10
  492. package/dist/router/virtual-router/engine.d.ts +0 -35
  493. package/dist/router/virtual-router/error-center.d.ts +0 -10
  494. package/dist/router/virtual-router/features.d.ts +0 -3
  495. package/dist/router/virtual-router/health-manager.d.ts +0 -18
  496. package/dist/router/virtual-router/load-balancer.d.ts +0 -18
  497. package/dist/router/virtual-router/provider-registry.d.ts +0 -11
  498. package/dist/sse/json-to-sse/chat-json-to-sse-converter.d.ts +0 -79
  499. package/dist/sse/json-to-sse/event-generators/chat.d.ts +0 -55
  500. package/dist/sse/json-to-sse/event-generators/responses.d.ts +0 -99
  501. package/dist/sse/json-to-sse/responses-json-to-sse-converter.d.ts +0 -79
  502. package/dist/sse/json-to-sse/sequencers/responses-sequencer.d.ts +0 -40
  503. package/dist/sse/shared/chat-serializer.d.ts +0 -4
  504. package/dist/sse/shared/constants.d.ts +0 -272
  505. package/dist/sse/shared/serializers/base-serializer.d.ts +0 -158
  506. package/dist/sse/shared/serializers/chat-event-serializer.d.ts +0 -82
  507. package/dist/sse/shared/serializers/responses-event-serializer.d.ts +0 -123
  508. package/dist/sse/shared/serializers/types.d.ts +0 -51
  509. package/dist/sse/shared/utils.d.ts +0 -254
  510. package/dist/sse/sse-to-json/parsers/sse-parser.d.ts +0 -73
  511. package/dist/tools/proxy/anthropic-tool-proxy.d.ts +0 -19
  512. package/dist/tools/proxy/anthropic-tool-proxy.js +0 -57
  513. package/dist/tools/proxy/executors/web-fetch.d.ts +0 -6
  514. package/dist/tools/proxy/executors/web-fetch.js +0 -39
  515. package/dist/tools/proxy/registry.d.ts +0 -8
  516. package/dist/tools/proxy/registry.js +0 -14
  517. package/dist/tools/proxy/types.d.ts +0 -29
  518. package/dist/tools/tool-registry.d.ts +0 -8
  519. package/dist/tools/web-fetch-html.d.ts +0 -15
  520. package/dist/tools/web-fetch-html.js +0 -83
  521. package/dist/utils/conversion-adapter.d.ts +0 -65
  522. package/dist/utils/conversion-adapter.js +0 -183
  523. package/dist/utils/error-factory.d.ts +0 -88
  524. package/dist/utils/error-factory.js +0 -138
  525. package/dist/utils/error-utils.d.ts +0 -334
  526. package/dist/utils/error-utils.js +0 -782
  527. package/dist/utils/index.d.ts +0 -8
  528. package/dist/utils/index.js +0 -13
  529. package/dist/utils/performance-utils.d.ts +0 -205
  530. package/dist/utils/performance-utils.js +0 -440
  531. package/dist/utils/profile-mapper.d.ts +0 -32
  532. package/dist/utils/profile-mapper.js +0 -269
  533. package/dist/utils/request-processor.d.ts +0 -52
  534. package/dist/utils/request-processor.js +0 -210
  535. package/dist/utils/request-utils.d.ts +0 -117
  536. package/dist/utils/request-utils.js +0 -333
  537. package/dist/utils/response-utils.d.ts +0 -127
  538. package/dist/utils/response-utils.js +0 -516
  539. package/dist/utils/token-counter.d.ts +0 -89
  540. package/dist/utils/token-counter.js +0 -541
  541. /package/dist/{tools/proxy → conversion/hub/tool-governance}/types.js +0 -0
  542. /package/dist/conversion/shared/{responses-id-utils.d.ts → bridge-id-utils.d.ts} +0 -0
@@ -3,12 +3,16 @@
3
3
  * 负责严格的事件时序组合:role → content OR tool_calls(name → args.delta*) → finish_reason → done
4
4
  */
5
5
  import { buildRoleDelta, buildReasoningDeltas, buildContentDeltas, buildToolCallStart, buildToolCallArgsDeltas, buildFinishEvent, buildDoneEvent, buildErrorEvent, DEFAULT_CHAT_EVENT_GENERATOR_CONFIG, createDefaultContext } from '../event-generators/chat.js';
6
+ import { normalizeMessageReasoningTools } from '../../../conversion/shared/reasoning-tool-normalizer.js';
7
+ import { normalizeChatMessageContent } from '../../../conversion/shared/chat-output-normalizer.js';
8
+ import { dispatchReasoning } from '../../shared/reasoning-dispatcher.js';
6
9
  // 默认配置
7
10
  export const DEFAULT_CHAT_SEQUENCER_CONFIG = {
8
11
  ...DEFAULT_CHAT_EVENT_GENERATOR_CONFIG,
9
12
  includeSequenceNumbers: true,
10
13
  enableDelay: false,
11
- validateOrder: true
14
+ validateOrder: true,
15
+ reasoningMode: 'channel'
12
16
  };
13
17
  /**
14
18
  * 验证消息顺序的合法性
@@ -40,6 +44,26 @@ function hasMeaningfulContent(content) {
40
44
  return Object.keys(content).length > 0;
41
45
  return false;
42
46
  }
47
+ function appendReasoningToContent(message, reasoningText, prefix) {
48
+ const trimmed = reasoningText.trim();
49
+ if (!trimmed) {
50
+ return;
51
+ }
52
+ const normalizedPrefix = typeof prefix === 'string' && prefix.length ? prefix : '';
53
+ const formatted = normalizedPrefix ? `${normalizedPrefix}${normalizedPrefix.endsWith(' ') || normalizedPrefix.endsWith('\n') ? '' : ' '}${trimmed}` : trimmed;
54
+ const current = message.content;
55
+ if (typeof current === 'string' || current == null) {
56
+ message.content = typeof current === 'string' && current.length
57
+ ? `${current}${current.endsWith('\n') ? '' : '\n\n'}${formatted}`
58
+ : formatted;
59
+ return;
60
+ }
61
+ if (Array.isArray(current)) {
62
+ current.push({ type: 'text', text: formatted });
63
+ return;
64
+ }
65
+ message.content = [current, { type: 'text', text: formatted }];
66
+ }
43
67
  /**
44
68
  * 异步生成器:为事件添加序列号和延迟
45
69
  */
@@ -62,9 +86,31 @@ async function* sequenceMessageContent(message, context, config) {
62
86
  for (const roleEvent of buildRoleDelta(message.role, context, config)) {
63
87
  yield roleEvent;
64
88
  }
89
+ const contentNormalization = normalizeChatMessageContent(message.content);
90
+ if (contentNormalization.contentText !== undefined) {
91
+ message.content = contentNormalization.contentText;
92
+ }
93
+ const normalization = normalizeMessageReasoningTools(message, {
94
+ idPrefix: `chat_seq_reasoning_${context.choiceIndex + 1}`
95
+ });
96
+ const reasoningText = normalization.cleanedReasoning
97
+ ?? contentNormalization.reasoningText
98
+ ?? (typeof message?.reasoning_content === 'string'
99
+ ? message.reasoning_content
100
+ : typeof message?.reasoning === 'string'
101
+ ? message.reasoning
102
+ : undefined);
103
+ const reasoningDispatch = dispatchReasoning(reasoningText, {
104
+ mode: config.reasoningMode,
105
+ prefix: config.reasoningTextPrefix
106
+ });
107
+ if (reasoningDispatch.appendToContent) {
108
+ appendReasoningToContent(message, reasoningDispatch.appendToContent);
109
+ }
110
+ const reasoningForChannel = reasoningDispatch.channel;
65
111
  // 2. 处理reasoning(如果有)
66
- if (message.reasoning) {
67
- yield* withSequencing(buildReasoningDeltas(message.reasoning, context, config), config);
112
+ if (reasoningForChannel) {
113
+ yield* withSequencing(buildReasoningDeltas(reasoningForChannel, context, config), config);
68
114
  }
69
115
  // 3. 处理content和tool_calls
70
116
  if (hasMeaningfulContent(message.content)) {
@@ -0,0 +1,10 @@
1
+ import { GeminiResponse, GeminiSseEvent } from '../../types/index.js';
2
+ import type { ChatReasoningMode } from '../../types/chat-types.js';
3
+ export interface GeminiSequencerConfig {
4
+ chunkDelayMs: number;
5
+ reasoningMode?: ChatReasoningMode;
6
+ reasoningTextPrefix?: string;
7
+ }
8
+ export declare function createGeminiSequencer(config?: Partial<GeminiSequencerConfig>): {
9
+ sequenceResponse(response: GeminiResponse): AsyncGenerator<GeminiSseEvent>;
10
+ };
@@ -0,0 +1,95 @@
1
+ import { dispatchReasoning } from '../../shared/reasoning-dispatcher.js';
2
+ const DEFAULT_CONFIG = {
3
+ chunkDelayMs: 0,
4
+ reasoningMode: 'channel',
5
+ reasoningTextPrefix: undefined
6
+ };
7
+ function createEvent(type, data) {
8
+ return {
9
+ type,
10
+ event: type,
11
+ protocol: 'gemini-chat',
12
+ direction: 'json_to_sse',
13
+ timestamp: Date.now(),
14
+ data,
15
+ sequenceNumber: 0
16
+ };
17
+ }
18
+ async function maybeDelay(config) {
19
+ if (!config.chunkDelayMs)
20
+ return;
21
+ await new Promise((resolve) => setTimeout(resolve, config.chunkDelayMs));
22
+ }
23
+ function getCandidateRole(candidate, fallback = 'model') {
24
+ const role = candidate?.content?.role;
25
+ if (typeof role === 'string' && role.trim().length) {
26
+ return role;
27
+ }
28
+ return fallback;
29
+ }
30
+ function getCandidateParts(candidate) {
31
+ const parts = candidate?.content?.parts;
32
+ if (Array.isArray(parts)) {
33
+ return parts.filter((part) => Boolean(part));
34
+ }
35
+ return [];
36
+ }
37
+ export function createGeminiSequencer(config) {
38
+ const finalConfig = { ...DEFAULT_CONFIG, ...config };
39
+ return {
40
+ async *sequenceResponse(response) {
41
+ const candidates = Array.isArray(response.candidates) ? response.candidates : [];
42
+ for (let candidateIndex = 0; candidateIndex < candidates.length; candidateIndex += 1) {
43
+ const candidate = candidates[candidateIndex] || {};
44
+ const role = getCandidateRole(candidate);
45
+ const parts = getCandidateParts(candidate);
46
+ for (let partIndex = 0; partIndex < parts.length; partIndex += 1) {
47
+ const normalizedParts = normalizeReasoningPart(parts[partIndex], finalConfig);
48
+ for (const normalizedPart of normalizedParts) {
49
+ yield createEvent('gemini.data', {
50
+ kind: 'part',
51
+ candidateIndex,
52
+ partIndex,
53
+ role,
54
+ part: normalizedPart
55
+ });
56
+ await maybeDelay(finalConfig);
57
+ }
58
+ }
59
+ }
60
+ const doneData = {
61
+ kind: 'done',
62
+ usageMetadata: response.usageMetadata,
63
+ promptFeedback: response.promptFeedback,
64
+ modelVersion: response.modelVersion,
65
+ candidates: candidates.map((candidate, index) => ({
66
+ index,
67
+ finishReason: candidate?.finishReason,
68
+ safetyRatings: candidate?.safetyRatings
69
+ }))
70
+ };
71
+ yield createEvent('gemini.done', doneData);
72
+ }
73
+ };
74
+ }
75
+ function normalizeReasoningPart(part, config) {
76
+ if (!part || typeof part !== 'object') {
77
+ return [part];
78
+ }
79
+ const reasoning = typeof part.reasoning === 'string' ? part.reasoning : undefined;
80
+ if (!reasoning) {
81
+ return [part];
82
+ }
83
+ const decision = dispatchReasoning(reasoning, {
84
+ mode: config.reasoningMode,
85
+ prefix: config.reasoningTextPrefix
86
+ });
87
+ const normalized = [];
88
+ if (decision.appendToContent) {
89
+ normalized.push({ text: decision.appendToContent });
90
+ }
91
+ if (decision.channel) {
92
+ normalized.push({ reasoning: decision.channel });
93
+ }
94
+ return normalized;
95
+ }
@@ -3,6 +3,7 @@
3
3
  * 负责将Responses响应数据转换为有序的SSE事件流
4
4
  */
5
5
  import { buildResponseStartEvents, buildResponseDoneEvent, buildOutputItemStartEvent, buildOutputItemDoneEvent, buildContentPartStartEvent, buildContentPartDeltas, buildContentPartDoneEvent, buildOutputTextDoneEvent, buildFunctionCallArgsDeltas, buildFunctionCallDoneEvent, buildReasoningStartEvent, buildReasoningDeltas, buildReasoningDoneEvent, buildRequiredActionEvent, buildResponseCompletedEvent, buildErrorEvent, DEFAULT_RESPONSES_EVENT_GENERATOR_CONFIG, createDefaultResponsesContext } from '../event-generators/responses.js';
6
+ import { expandResponsesMessageItem } from '../../shared/responses-output-normalizer.js';
6
7
  // 默认配置
7
8
  export const DEFAULT_RESPONSES_SEQUENCER_CONFIG = {
8
9
  ...DEFAULT_RESPONSES_EVENT_GENERATOR_CONFIG,
@@ -13,6 +14,23 @@ export const DEFAULT_RESPONSES_SEQUENCER_CONFIG = {
13
14
  maxContentParts: 100,
14
15
  submittedToolOutputs: undefined
15
16
  };
17
+ function normalizeResponseOutput(output, requestId) {
18
+ if (!Array.isArray(output))
19
+ return [];
20
+ const normalized = [];
21
+ output.forEach((item, index) => {
22
+ if (item && typeof item === 'object' && item.type === 'message') {
23
+ normalized.push(...expandResponsesMessageItem(item, {
24
+ requestId,
25
+ outputIndex: index
26
+ }));
27
+ }
28
+ else {
29
+ normalized.push(item);
30
+ }
31
+ });
32
+ return normalized;
33
+ }
16
34
  /**
17
35
  * 验证响应格式
18
36
  */
@@ -158,14 +176,15 @@ export async function* sequenceResponse(response, context, config = DEFAULT_RESP
158
176
  context.outputIndexCounter = i;
159
177
  yield* sequenceFunctionCallOutputItem(submittedOutputs[i], context, config);
160
178
  }
179
+ const normalizedOutput = normalizeResponseOutput(response.output, context.requestId);
161
180
  const outputOffset = submittedOutputs.length;
162
181
  // 3. 序列化所有输出项
163
- for (let outputIndex = 0; outputIndex < response.output.length; outputIndex++) {
164
- const item = response.output[outputIndex];
182
+ for (let outputIndex = 0; outputIndex < normalizedOutput.length; outputIndex++) {
183
+ const item = normalizedOutput[outputIndex];
165
184
  context.outputIndexCounter = outputOffset + outputIndex;
166
185
  yield* sequenceOutputItem(item, context, config);
167
186
  // 输出项间添加小延迟(如果启用)
168
- if (config.enableDelay && config.chunkDelayMs > 0 && outputIndex < response.output.length - 1) {
187
+ if (config.enableDelay && config.chunkDelayMs > 0 && outputIndex < normalizedOutput.length - 1) {
169
188
  await new Promise(resolve => setTimeout(resolve, config.chunkDelayMs * 2));
170
189
  }
171
190
  }
@@ -203,9 +222,9 @@ export async function* sequenceRequest(request, context, config = DEFAULT_RESPON
203
222
  }, context, config);
204
223
  // 回显输入消息作为输出项
205
224
  if (request.input && Array.isArray(request.input)) {
225
+ let syntheticIndex = 0;
206
226
  for (let inputIndex = 0; inputIndex < request.input.length; inputIndex++) {
207
227
  const inputItem = request.input[inputIndex];
208
- context.outputIndexCounter = inputIndex;
209
228
  // 将输入转换为输出项格式
210
229
  const outputItem = {
211
230
  id: `${context.requestId}-input-${inputIndex}`,
@@ -214,7 +233,14 @@ export async function* sequenceRequest(request, context, config = DEFAULT_RESPON
214
233
  role: inputItem.role,
215
234
  content: inputItem.content
216
235
  };
217
- yield* sequenceMessageItem(outputItem, context, config);
236
+ const expandedItems = expandResponsesMessageItem(outputItem, {
237
+ requestId: context.requestId,
238
+ outputIndex: syntheticIndex
239
+ });
240
+ for (const expanded of expandedItems) {
241
+ context.outputIndexCounter = syntheticIndex++;
242
+ yield* sequenceOutputItem(expanded, context, config);
243
+ }
218
244
  }
219
245
  }
220
246
  const syntheticResponse = {
@@ -1,5 +1,5 @@
1
1
  import type { ResponsesFunctionCallOutputItem } from '../types/index.js';
2
- export type SseProtocol = 'openai-chat' | 'openai-responses' | 'anthropic-messages';
2
+ export type SseProtocol = 'openai-chat' | 'openai-responses' | 'anthropic-messages' | 'gemini-chat';
3
3
  export type SseStreamLike = any;
4
4
  export type SseStreamInput = any;
5
5
  export interface JsonToSseContext {
@@ -1,4 +1,4 @@
1
- import { chatConverters, responsesConverters, anthropicConverters } from '../index.js';
1
+ import { chatConverters, responsesConverters, anthropicConverters, geminiConverters } from '../index.js';
2
2
  export class SseCodecRegistry {
3
3
  codecs = new Map();
4
4
  register(codec) {
@@ -27,11 +27,17 @@ function resolveModelId(payload, fallback) {
27
27
  if (typeof record.model === 'string') {
28
28
  return record.model;
29
29
  }
30
+ if (record.modelVersion && typeof record.modelVersion === 'string') {
31
+ return record.modelVersion;
32
+ }
30
33
  if (record.response && typeof record.response === 'object') {
31
34
  const inner = record.response;
32
35
  if (typeof inner.model === 'string') {
33
36
  return inner.model;
34
37
  }
38
+ if (typeof inner.modelVersion === 'string') {
39
+ return inner.modelVersion;
40
+ }
35
41
  }
36
42
  return 'unknown';
37
43
  }
@@ -101,6 +107,29 @@ function createAnthropicCodec() {
101
107
  }
102
108
  };
103
109
  }
110
+ function createGeminiCodec() {
111
+ return {
112
+ protocol: 'gemini-chat',
113
+ async convertJsonToSse(payload, context) {
114
+ const model = resolveModelId(payload, context.model);
115
+ return geminiConverters.jsonToSse
116
+ .convertResponseToJsonToSse(payload, {
117
+ requestId: context.requestId,
118
+ model
119
+ });
120
+ },
121
+ async convertSseToJson(stream, context) {
122
+ return geminiConverters.sseToJson.convertSseToJson(stream, {
123
+ requestId: context.requestId,
124
+ model: context.model
125
+ });
126
+ },
127
+ async normalize(stream) {
128
+ return stream;
129
+ }
130
+ };
131
+ }
104
132
  defaultSseCodecRegistry.register(createChatCodec());
105
133
  defaultSseCodecRegistry.register(createResponsesCodec());
106
134
  defaultSseCodecRegistry.register(createAnthropicCodec());
135
+ defaultSseCodecRegistry.register(createGeminiCodec());
@@ -0,0 +1,10 @@
1
+ import type { ChatReasoningMode } from '../types/chat-types.js';
2
+ export interface ReasoningDispatchResult {
3
+ channel?: string;
4
+ appendToContent?: string;
5
+ }
6
+ export interface ReasoningDispatchOptions {
7
+ mode?: ChatReasoningMode;
8
+ prefix?: string;
9
+ }
10
+ export declare function dispatchReasoning(input: string | undefined, options?: ReasoningDispatchOptions): ReasoningDispatchResult;
@@ -0,0 +1,25 @@
1
+ function formatText(text, prefix) {
2
+ const trimmed = text.trim();
3
+ if (!trimmed)
4
+ return '';
5
+ if (!prefix)
6
+ return trimmed;
7
+ const needsSpace = !prefix.endsWith(' ') && !prefix.endsWith('\n');
8
+ return `${prefix}${needsSpace ? ' ' : ''}${trimmed}`;
9
+ }
10
+ export function dispatchReasoning(input, options) {
11
+ const trimmed = typeof input === 'string' ? input.trim() : '';
12
+ if (!trimmed.length) {
13
+ return {};
14
+ }
15
+ const mode = options?.mode ?? 'channel';
16
+ if (mode === 'drop') {
17
+ return {};
18
+ }
19
+ if (mode === 'text') {
20
+ return {
21
+ appendToContent: formatText(trimmed, options?.prefix)
22
+ };
23
+ }
24
+ return { channel: trimmed };
25
+ }
@@ -0,0 +1,12 @@
1
+ import type { ResponsesMessageItem, ResponsesOutputItem, ResponsesReasoningItem } from '../types/index.js';
2
+ export interface ResponsesMessageNormalizationOptions {
3
+ requestId?: string;
4
+ outputIndex?: number;
5
+ extraReasoning?: string | string[];
6
+ }
7
+ export interface ResponsesMessageNormalizationResult {
8
+ message: ResponsesMessageItem;
9
+ reasoning?: ResponsesReasoningItem;
10
+ }
11
+ export declare function normalizeResponsesMessageItem(item: ResponsesMessageItem, options: ResponsesMessageNormalizationOptions): ResponsesMessageNormalizationResult;
12
+ export declare function expandResponsesMessageItem(item: ResponsesMessageItem, options: ResponsesMessageNormalizationOptions): ResponsesOutputItem[];
@@ -0,0 +1,45 @@
1
+ import { normalizeMessageContentParts } from '../../conversion/shared/output-content-normalizer.js';
2
+ export function normalizeResponsesMessageItem(item, options) {
3
+ const fallbackRequestId = typeof options.requestId === 'string' && options.requestId.trim().length
4
+ ? options.requestId.trim()
5
+ : 'message';
6
+ const fallbackIndex = typeof options.outputIndex === 'number' ? options.outputIndex : 0;
7
+ const baseId = typeof item.id === 'string' && item.id.trim().length
8
+ ? item.id.trim()
9
+ : `${fallbackRequestId}-message-${fallbackIndex}`;
10
+ const { normalizedParts, reasoningChunks } = normalizeMessageContentParts(item.content);
11
+ const additionalReasoning = options.extraReasoning;
12
+ if (additionalReasoning) {
13
+ const extras = Array.isArray(additionalReasoning) ? additionalReasoning : [additionalReasoning];
14
+ for (const entry of extras) {
15
+ if (typeof entry === 'string') {
16
+ const trimmed = entry.trim();
17
+ if (trimmed.length) {
18
+ reasoningChunks.push(trimmed);
19
+ }
20
+ }
21
+ }
22
+ }
23
+ const normalizedContent = normalizedParts.length
24
+ ? normalizedParts
25
+ : [{ type: 'output_text', text: '' }];
26
+ const message = {
27
+ ...item,
28
+ id: baseId,
29
+ content: normalizedContent
30
+ };
31
+ let reasoning;
32
+ if (reasoningChunks.length) {
33
+ reasoning = {
34
+ id: `${baseId}_reasoning`,
35
+ type: 'reasoning',
36
+ summary: [],
37
+ content: reasoningChunks.map((text) => ({ type: 'reasoning_text', text }))
38
+ };
39
+ }
40
+ return { message, reasoning };
41
+ }
42
+ export function expandResponsesMessageItem(item, options) {
43
+ const { message, reasoning } = normalizeResponsesMessageItem(item, options);
44
+ return reasoning ? [message, reasoning] : [message];
45
+ }
@@ -0,0 +1,2 @@
1
+ import { AnthropicSseEvent } from '../../types/index.js';
2
+ export declare function serializeAnthropicEventToSSE(event: AnthropicSseEvent): string;
@@ -0,0 +1,9 @@
1
+ export function serializeAnthropicEventToSSE(event) {
2
+ const payload = event.data ?? {};
3
+ const type = event.event ||
4
+ event.type ||
5
+ (typeof payload?.type === 'string'
6
+ ? payload.type
7
+ : 'message');
8
+ return [`event: ${type}`, `data: ${JSON.stringify(payload)}`].join('\n') + '\n\n';
9
+ }
@@ -0,0 +1,2 @@
1
+ import { GeminiSseEvent } from '../../types/index.js';
2
+ export declare function serializeGeminiEventToSSE(event: GeminiSseEvent): string;
@@ -0,0 +1,5 @@
1
+ export function serializeGeminiEventToSSE(event) {
2
+ const payload = event.data ?? {};
3
+ const eventType = event.event ?? event.type ?? 'gemini.data';
4
+ return [`event: ${eventType}`, `data: ${JSON.stringify(payload)}`].join('\n') + '\n\n';
5
+ }
@@ -9,6 +9,8 @@ export type { SerializationOptions, ChatSerializationOptions, ResponsesSerializa
9
9
  export type { BaseEventSerializer, SerializationError, SerializationResult, BatchSerializer } from './base-serializer.js';
10
10
  export { defaultChatEventSerializer } from './chat-event-serializer.js';
11
11
  export { defaultResponsesEventSerializer } from './responses-event-serializer.js';
12
+ export { serializeAnthropicEventToSSE } from './anthropic-event-serializer.js';
13
+ export { serializeGeminiEventToSSE } from './gemini-event-serializer.js';
12
14
  /**
13
15
  * 创建序列化器工厂
14
16
  */
@@ -9,6 +9,8 @@ import { ResponsesEventSerializer, defaultResponsesEventSerializer } from './res
9
9
  export { defaultChatEventSerializer } from './chat-event-serializer.js';
10
10
  // Responses协议序列化器
11
11
  export { defaultResponsesEventSerializer } from './responses-event-serializer.js';
12
+ export { serializeAnthropicEventToSSE } from './anthropic-event-serializer.js';
13
+ export { serializeGeminiEventToSSE } from './gemini-event-serializer.js';
12
14
  /**
13
15
  * 创建序列化器工厂
14
16
  */
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { PassThrough } from 'stream';
6
6
  import { BaseSseEvent } from '../types/core-interfaces.js';
7
- import { ChatSseEvent, ResponsesSseEvent } from '../types/index.js';
7
+ import { ChatSseEvent, ResponsesSseEvent, AnthropicSseEvent, GeminiSseEvent } from '../types/index.js';
8
8
  export interface StreamWriterConfig {
9
9
  timeoutMs?: number;
10
10
  enableHeartbeat?: boolean;
@@ -76,6 +76,14 @@ export declare class StreamWriter {
76
76
  * 写入Responses事件流
77
77
  */
78
78
  writeResponsesEvents(events: AsyncIterable<ResponsesSseEvent> | ResponsesSseEvent[]): Promise<void>;
79
+ /**
80
+ * 写入Anthropic事件流
81
+ */
82
+ writeAnthropicEvents(events: AsyncIterable<AnthropicSseEvent> | AnthropicSseEvent[]): Promise<void>;
83
+ /**
84
+ * 写入Gemini事件流
85
+ */
86
+ writeGeminiEvents(events: AsyncIterable<GeminiSseEvent> | GeminiSseEvent[]): Promise<void>;
79
87
  /**
80
88
  * 完成流写入
81
89
  */
@@ -109,3 +117,11 @@ export declare function createChatStreamWriter(stream: PassThrough, config?: Str
109
117
  * 创建Responses流写入器工厂函数
110
118
  */
111
119
  export declare function createResponsesStreamWriter(stream: PassThrough, config?: StreamWriterConfig): StreamWriter;
120
+ /**
121
+ * 创建Anthropic流写入器工厂函数
122
+ */
123
+ export declare function createAnthropicStreamWriter(stream: PassThrough, config?: StreamWriterConfig): StreamWriter;
124
+ /**
125
+ * 创建Gemini流写入器工厂函数
126
+ */
127
+ export declare function createGeminiStreamWriter(stream: PassThrough, config?: StreamWriterConfig): StreamWriter;
@@ -2,7 +2,7 @@
2
2
  * 统一的SSE事件流写入器
3
3
  * 处理backpressure、超时、心跳、错误处理等通用流管理逻辑
4
4
  */
5
- import { defaultResponsesEventSerializer } from './serializers/index.js';
5
+ import { defaultResponsesEventSerializer, serializeAnthropicEventToSSE, serializeGeminiEventToSSE } from './serializers/index.js';
6
6
  import { TimeUtils } from './utils.js';
7
7
  import { serializeChatEventToSSE } from './chat-serializer.js';
8
8
  /**
@@ -92,12 +92,24 @@ export class StreamWriter {
92
92
  else if (event && event.protocol === 'responses') {
93
93
  serialized = this.serializeResponsesEvent(event);
94
94
  }
95
+ else if (event && event.protocol === 'anthropic-messages') {
96
+ serialized = serializeAnthropicEventToSSE(event);
97
+ }
98
+ else if (event && event.protocol === 'gemini-chat') {
99
+ serialized = serializeGeminiEventToSSE(event);
100
+ }
95
101
  else {
96
102
  // 兜底处理:尝试通过事件字段识别
97
103
  const eventField = event.event;
98
104
  if (eventField === 'chat_chunk' || eventField === 'chat.done' || eventField === 'error' || eventField === 'ping') {
99
105
  serialized = serializeChatEventToSSE(event);
100
106
  }
107
+ else if (eventField === 'message_start' || eventField === 'content_block_start') {
108
+ serialized = serializeAnthropicEventToSSE(event);
109
+ }
110
+ else if (eventField === 'gemini.data' || eventField === 'gemini.done') {
111
+ serialized = serializeGeminiEventToSSE(event);
112
+ }
101
113
  else {
102
114
  serialized = this.serializeResponsesEvent(event);
103
115
  }
@@ -195,6 +207,18 @@ export class StreamWriter {
195
207
  async writeResponsesEvents(events) {
196
208
  await this.writeEventStream(events);
197
209
  }
210
+ /**
211
+ * 写入Anthropic事件流
212
+ */
213
+ async writeAnthropicEvents(events) {
214
+ await this.writeEventStream(events);
215
+ }
216
+ /**
217
+ * 写入Gemini事件流
218
+ */
219
+ async writeGeminiEvents(events) {
220
+ await this.writeEventStream(events);
221
+ }
198
222
  /**
199
223
  * 完成流写入
200
224
  */
@@ -266,3 +290,15 @@ export function createChatStreamWriter(stream, config = {}) {
266
290
  export function createResponsesStreamWriter(stream, config = {}) {
267
291
  return new StreamWriter(stream, config);
268
292
  }
293
+ /**
294
+ * 创建Anthropic流写入器工厂函数
295
+ */
296
+ export function createAnthropicStreamWriter(stream, config = {}) {
297
+ return new StreamWriter(stream, config);
298
+ }
299
+ /**
300
+ * 创建Gemini流写入器工厂函数
301
+ */
302
+ export function createGeminiStreamWriter(stream, config = {}) {
303
+ return new StreamWriter(stream, config);
304
+ }
@@ -1,13 +1,11 @@
1
- import type { AnthropicMessageResponse, SseToAnthropicJsonOptions } from '../types/anthropic-types.js';
2
- /**
3
- * Minimal Anthropic SSE → JSON converter (v3)
4
- *
5
- * Aggregates a subset of Anthropic events into a single message object:
6
- * - message_start → capture id/model
7
- * - content_block_start/delta/stop → build text/tool_use blocks
8
- * - message_delta → stop_reason hint
9
- * - message_stop → finalize
10
- */
1
+ import { AnthropicMessageResponse, SseToAnthropicJsonOptions } from '../types/index.js';
11
2
  export declare class AnthropicSseToJsonConverter {
12
- convertSseToJson(sseStream: AsyncIterable<string | Buffer>, _options: SseToAnthropicJsonOptions): Promise<AnthropicMessageResponse>;
3
+ private config;
4
+ private contexts;
5
+ constructor(config?: Partial<typeof this.config>);
6
+ convertSseToJson(sseStream: AsyncIterable<string | Buffer>, options: SseToAnthropicJsonOptions): Promise<AnthropicMessageResponse>;
7
+ private createContext;
8
+ private chunkStrings;
9
+ private updateStats;
10
+ private wrapError;
13
11
  }