@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
@@ -4,6 +4,9 @@
4
4
  */
5
5
  import { DEFAULT_CHAT_CONVERSION_CONFIG, CHAT_CONVERSION_ERROR_CODES } from '../types/index.js';
6
6
  import { TimeUtils, ErrorUtils } from '../shared/utils.js';
7
+ import { normalizeMessageReasoningTools } from '../../conversion/shared/reasoning-tool-normalizer.js';
8
+ import { normalizeChatMessageContent } from '../../conversion/shared/chat-output-normalizer.js';
9
+ import { dispatchReasoning } from '../shared/reasoning-dispatcher.js';
7
10
  /**
8
11
  * Chat SSE到JSON转换器
9
12
  */
@@ -201,7 +204,8 @@ export class ChatSseToJsonConverter {
201
204
  */
202
205
  async processChatChunk(event, context) {
203
206
  try {
204
- const chunk = JSON.parse(event.data);
207
+ const payload = typeof event.data === 'string' ? event.data : JSON.stringify(event.data ?? {});
208
+ const chunk = JSON.parse(payload);
205
209
  // 验证chunk格式
206
210
  if (context.options.validateChunks) {
207
211
  this.validateChatChunk(chunk);
@@ -237,8 +241,11 @@ export class ChatSseToJsonConverter {
237
241
  context.choiceIndexMap.set(choiceIndex, choiceBuilder);
238
242
  context.currentResponse.choices?.push({
239
243
  index: choiceIndex,
240
- message: {},
241
- finish_reason: null,
244
+ message: {
245
+ role: 'assistant',
246
+ content: ''
247
+ },
248
+ finish_reason: 'stop',
242
249
  logprobs: choice.logprobs
243
250
  });
244
251
  }
@@ -261,11 +268,12 @@ export class ChatSseToJsonConverter {
261
268
  return {
262
269
  index,
263
270
  delta: {},
264
- finishReason: null,
265
- logprobs: null,
271
+ finishReason: undefined,
272
+ logprobs: undefined,
266
273
  messageBuilder: {
267
274
  role: undefined,
268
275
  content: '',
276
+ reasoningContent: '',
269
277
  name: undefined,
270
278
  functionCall: undefined,
271
279
  toolCalls: [],
@@ -277,10 +285,23 @@ export class ChatSseToJsonConverter {
277
285
  toolCallBuilders: new Map()
278
286
  };
279
287
  }
288
+ /**
289
+ * 将reasoning文本附加到消息内容
290
+ */
291
+ appendReasoningToMessageContent(message, reasoningText) {
292
+ const trimmed = typeof reasoningText === 'string' ? reasoningText.trim() : '';
293
+ if (!trimmed) {
294
+ return;
295
+ }
296
+ const current = typeof message.content === 'string' ? message.content : '';
297
+ const needsSeparator = current.length > 0;
298
+ const separator = !needsSeparator ? '' : current.endsWith('\n') ? '\n' : '\n\n';
299
+ message.content = `${current}${separator}${trimmed}`;
300
+ }
280
301
  /**
281
302
  * 处理delta
282
303
  */
283
- async processDelta(delta, choiceBuilder, context) {
304
+ async processDelta(delta, choiceBuilder, _context) {
284
305
  const messageBuilder = choiceBuilder.messageBuilder;
285
306
  // 处理role
286
307
  if (delta.role) {
@@ -288,8 +309,9 @@ export class ChatSseToJsonConverter {
288
309
  }
289
310
  // 处理reasoning
290
311
  if (delta.reasoning) {
291
- messageBuilder.content += delta.reasoning;
292
- choiceBuilder.accumulatedContent += delta.reasoning;
312
+ const chunk = delta.reasoning;
313
+ messageBuilder.reasoningContent = (messageBuilder.reasoningContent || '') + chunk;
314
+ choiceBuilder.accumulatedContent += chunk;
293
315
  }
294
316
  // 处理content
295
317
  if (delta.content) {
@@ -314,7 +336,7 @@ export class ChatSseToJsonConverter {
314
336
  // 处理tool_calls
315
337
  if (delta.tool_calls && Array.isArray(delta.tool_calls)) {
316
338
  for (const toolCallDelta of delta.tool_calls) {
317
- await this.processToolCallDelta(toolCallDelta, choiceBuilder, context);
339
+ await this.processToolCallDelta(toolCallDelta, choiceBuilder);
318
340
  }
319
341
  }
320
342
  // 合并delta到choiceBuilder
@@ -323,7 +345,7 @@ export class ChatSseToJsonConverter {
323
345
  /**
324
346
  * 处理tool_call delta
325
347
  */
326
- async processToolCallDelta(toolCallDelta, choiceBuilder, context) {
348
+ async processToolCallDelta(toolCallDelta, choiceBuilder) {
327
349
  const toolCallIndex = toolCallDelta.index;
328
350
  // 获取或创建tool_call构建器
329
351
  let toolCallBuilder = choiceBuilder.toolCallBuilders.get(toolCallIndex);
@@ -367,37 +389,99 @@ export class ChatSseToJsonConverter {
367
389
  */
368
390
  updateResponseChoice(choiceIndex, choiceBuilder, context) {
369
391
  const responseChoice = context.currentResponse.choices?.[choiceIndex];
370
- if (!responseChoice)
392
+ if (!responseChoice) {
371
393
  return;
394
+ }
372
395
  const messageBuilder = choiceBuilder.messageBuilder;
373
396
  // 构建message
374
397
  const message = {
375
398
  role: messageBuilder.role || 'assistant'
376
399
  };
377
- if (messageBuilder.content) {
400
+ const normalizedContent = normalizeChatMessageContent(messageBuilder.content);
401
+ if (normalizedContent.contentText !== undefined) {
402
+ message.content = normalizedContent.contentText;
403
+ }
404
+ else if (messageBuilder.content) {
378
405
  message.content = messageBuilder.content;
379
406
  }
407
+ const reasoningCandidate = messageBuilder.reasoningContent && messageBuilder.reasoningContent.length
408
+ ? messageBuilder.reasoningContent
409
+ : normalizedContent.reasoningText;
410
+ if (reasoningCandidate) {
411
+ message.reasoning_content = reasoningCandidate;
412
+ }
380
413
  if (messageBuilder.functionCall) {
381
414
  message.function_call = messageBuilder.functionCall;
382
415
  }
383
416
  // 构建tool_calls
384
417
  const toolCalls = [];
385
- for (const [_, toolCallBuilder] of choiceBuilder.toolCallBuilders) {
386
- if (toolCallBuilder.id) {
418
+ for (const toolCallBuilder of choiceBuilder.toolCallBuilders.values()) {
419
+ if (toolCallBuilder.id && toolCallBuilder.function) {
387
420
  toolCalls.push({
388
421
  id: toolCallBuilder.id,
389
422
  type: toolCallBuilder.type || 'function',
390
- function: toolCallBuilder.function
423
+ function: {
424
+ name: toolCallBuilder.function.name ?? '',
425
+ arguments: toolCallBuilder.function.arguments ?? ''
426
+ }
391
427
  });
392
428
  }
393
429
  }
394
430
  if (toolCalls.length > 0) {
395
431
  message.tool_calls = toolCalls;
396
432
  }
433
+ this.normalizeReasoning(choiceBuilder, message, context);
397
434
  responseChoice.message = message;
398
- responseChoice.finish_reason = choiceBuilder.finishReason;
435
+ responseChoice.finish_reason = choiceBuilder.finishReason ?? responseChoice.finish_reason;
399
436
  context.eventStats.totalToolCalls += toolCalls.length;
400
437
  }
438
+ /**
439
+ * 将reasoning内容规范化为独立字段并抽取工具调用
440
+ */
441
+ normalizeReasoning(choiceBuilder, message, context) {
442
+ if (!message.reasoning_content && !message.reasoning) {
443
+ return;
444
+ }
445
+ const target = message;
446
+ normalizeMessageReasoningTools(target, {
447
+ idPrefix: `chat_sse_reasoning_${choiceBuilder.index + 1}`
448
+ });
449
+ const reasoningSource = typeof target.reasoning_content === 'string'
450
+ ? target.reasoning_content
451
+ : typeof target.reasoning === 'string'
452
+ ? target.reasoning
453
+ : undefined;
454
+ const reasoningText = typeof reasoningSource === 'string' ? reasoningSource.trim() : '';
455
+ if (!reasoningText) {
456
+ if ('reasoning_content' in target)
457
+ delete target.reasoning_content;
458
+ if ('reasoning' in target)
459
+ delete target.reasoning;
460
+ return;
461
+ }
462
+ const dispatchResult = dispatchReasoning(reasoningText, {
463
+ mode: context.options.reasoningMode ?? this.config.reasoningMode,
464
+ prefix: context.options.reasoningTextPrefix ?? this.config.reasoningTextPrefix
465
+ });
466
+ if (dispatchResult.appendToContent) {
467
+ this.appendReasoningToMessageContent(message, dispatchResult.appendToContent);
468
+ if ('reasoning_content' in target)
469
+ delete target.reasoning_content;
470
+ if ('reasoning' in target)
471
+ delete target.reasoning;
472
+ return;
473
+ }
474
+ if (dispatchResult.channel) {
475
+ target.reasoning_content = dispatchResult.channel;
476
+ if ('reasoning' in target)
477
+ delete target.reasoning;
478
+ return;
479
+ }
480
+ if ('reasoning_content' in target)
481
+ delete target.reasoning_content;
482
+ if ('reasoning' in target)
483
+ delete target.reasoning;
484
+ }
401
485
  /**
402
486
  * 处理done事件
403
487
  */
@@ -405,9 +489,11 @@ export class ChatSseToJsonConverter {
405
489
  context.isCompleted = true;
406
490
  // 解析done事件数据(如果有的话)
407
491
  try {
408
- const doneData = JSON.parse(event.data);
409
- if (doneData.totalTokens) {
410
- context.eventStats.totalTokens = doneData.totalTokens;
492
+ if (typeof event.data === 'string') {
493
+ const doneData = JSON.parse(event.data);
494
+ if (typeof doneData.totalTokens === 'number') {
495
+ context.eventStats.totalTokens = doneData.totalTokens;
496
+ }
411
497
  }
412
498
  }
413
499
  catch (e) {
@@ -417,12 +503,15 @@ export class ChatSseToJsonConverter {
417
503
  /**
418
504
  * 处理error事件
419
505
  */
420
- async processErrorEvent(event, context) {
506
+ async processErrorEvent(event, _context) {
421
507
  try {
422
- const errorData = JSON.parse(event.data);
423
- const error = new Error(errorData.error || 'Unknown SSE error');
424
- error.code = errorData.code || 'SSE_ERROR';
425
- throw ErrorUtils.createError(error.message, CHAT_CONVERSION_ERROR_CODES.STREAM_ERROR, { errorData, event });
508
+ const rawPayload = typeof event.data === 'string' ? event.data : JSON.stringify(event.data ?? {});
509
+ const errorData = JSON.parse(rawPayload);
510
+ const errorMessage = typeof errorData.error === 'string' ? errorData.error : 'Unknown SSE error';
511
+ const code = typeof errorData.code === 'string' ? errorData.code : 'SSE_ERROR';
512
+ const typedError = new Error(errorMessage);
513
+ typedError.code = code;
514
+ throw ErrorUtils.createError(typedError.message, CHAT_CONVERSION_ERROR_CODES.STREAM_ERROR, { errorData, event });
426
515
  }
427
516
  catch (parseError) {
428
517
  throw ErrorUtils.createError(`SSE error event: ${event.data}`, CHAT_CONVERSION_ERROR_CODES.STREAM_ERROR, { event });
@@ -433,8 +522,9 @@ export class ChatSseToJsonConverter {
433
522
  */
434
523
  buildPartialResponse(context) {
435
524
  const choices = context.currentResponse.choices || [];
436
- if (choices.length === 0)
525
+ if (choices.length === 0) {
437
526
  return null;
527
+ }
438
528
  return {
439
529
  id: context.currentResponse.id || '',
440
530
  object: 'chat.completion',
@@ -475,7 +565,7 @@ export class ChatSseToJsonConverter {
475
565
  /**
476
566
  * 构建使用量信息
477
567
  */
478
- buildUsageInfo(context) {
568
+ buildUsageInfo(_context) {
479
569
  // 这里可以基于token计数来计算usage
480
570
  // 暂时返回null,后续可以实现更精确的token计数
481
571
  return null;
@@ -0,0 +1,13 @@
1
+ import { GeminiResponse, SseToGeminiJsonOptions, DEFAULT_GEMINI_CONVERSION_CONFIG } from '../types/index.js';
2
+ export declare class GeminiSseToJsonConverter {
3
+ private config;
4
+ private contexts;
5
+ constructor(config?: Partial<typeof DEFAULT_GEMINI_CONVERSION_CONFIG>);
6
+ convertSseToJson(sseStream: AsyncIterable<string | Buffer>, options: SseToGeminiJsonOptions): Promise<GeminiResponse>;
7
+ private processChunkEvent;
8
+ private buildResponse;
9
+ private normalizeStream;
10
+ private createContext;
11
+ private wrapError;
12
+ private normalizeReasoningPart;
13
+ }
@@ -0,0 +1,160 @@
1
+ import { DEFAULT_GEMINI_CONVERSION_CONFIG } from '../types/index.js';
2
+ import { ErrorUtils } from '../shared/utils.js';
3
+ import { dispatchReasoning } from '../shared/reasoning-dispatcher.js';
4
+ import { createSseParser } from './parsers/sse-parser.js';
5
+ export class GeminiSseToJsonConverter {
6
+ config = DEFAULT_GEMINI_CONVERSION_CONFIG;
7
+ contexts = new Map();
8
+ constructor(config) {
9
+ if (config) {
10
+ this.config = { ...this.config, ...config };
11
+ }
12
+ }
13
+ async convertSseToJson(sseStream, options) {
14
+ const context = this.createContext(options);
15
+ this.contexts.set(options.requestId, context);
16
+ const parser = createSseParser({
17
+ enableStrictValidation: true,
18
+ enableEventRecovery: true,
19
+ allowedEventTypes: new Set([
20
+ 'gemini.data',
21
+ 'gemini.done'
22
+ ])
23
+ });
24
+ const accumulator = new Map();
25
+ let donePayload = null;
26
+ try {
27
+ for await (const result of parser.parseStreamAsync(this.normalizeStream(sseStream))) {
28
+ if (!result.success || !result.event) {
29
+ if (result.error) {
30
+ throw new Error(result.error);
31
+ }
32
+ continue;
33
+ }
34
+ const event = result.event;
35
+ if (event.protocol !== 'gemini-chat')
36
+ continue;
37
+ if (event.type === 'gemini.data') {
38
+ this.processChunkEvent(event, accumulator, context);
39
+ context.eventStats.chunkEvents += 1;
40
+ }
41
+ else if (event.type === 'gemini.done') {
42
+ donePayload = event.data;
43
+ context.eventStats.doneEvents += 1;
44
+ }
45
+ context.eventStats.totalEvents += 1;
46
+ }
47
+ if (!donePayload) {
48
+ throw new Error('Gemini SSE stream missing done event');
49
+ }
50
+ const response = this.buildResponse(accumulator, donePayload);
51
+ context.isCompleted = true;
52
+ context.eventStats.endTime = Date.now();
53
+ return response;
54
+ }
55
+ catch (error) {
56
+ context.eventStats.errors += 1;
57
+ throw this.wrapError('GEMINI_SSE_TO_JSON_FAILED', error, options.requestId);
58
+ }
59
+ finally {
60
+ this.contexts.delete(options.requestId);
61
+ }
62
+ }
63
+ processChunkEvent(event, accumulator, context) {
64
+ const payload = event.data;
65
+ const candidateIndex = typeof payload?.candidateIndex === 'number' ? payload.candidateIndex : 0;
66
+ const part = payload?.part;
67
+ if (!part)
68
+ return;
69
+ const role = typeof payload?.role === 'string' ? payload.role : 'model';
70
+ if (!accumulator.has(candidateIndex)) {
71
+ accumulator.set(candidateIndex, { role, parts: [] });
72
+ }
73
+ const normalizedParts = this.normalizeReasoningPart(part, context);
74
+ for (const normalizedPart of normalizedParts) {
75
+ accumulator.get(candidateIndex).parts.push(normalizedPart);
76
+ }
77
+ }
78
+ buildResponse(accumulator, donePayload) {
79
+ const candidates = [];
80
+ const candidateMeta = {};
81
+ if (Array.isArray(donePayload?.candidates)) {
82
+ for (const entry of donePayload.candidates) {
83
+ if (!entry || typeof entry.index !== 'number')
84
+ continue;
85
+ candidateMeta[entry.index] = {
86
+ finishReason: entry.finishReason,
87
+ safetyRatings: entry.safetyRatings
88
+ };
89
+ }
90
+ }
91
+ const indices = Array.from(accumulator.keys()).sort((a, b) => a - b);
92
+ for (const index of indices) {
93
+ const acc = accumulator.get(index);
94
+ if (!acc)
95
+ continue;
96
+ candidates.push({
97
+ content: {
98
+ role: acc.role,
99
+ parts: acc.parts
100
+ },
101
+ finishReason: candidateMeta[index]?.finishReason,
102
+ safetyRatings: candidateMeta[index]?.safetyRatings
103
+ });
104
+ }
105
+ return {
106
+ candidates,
107
+ promptFeedback: donePayload?.promptFeedback,
108
+ usageMetadata: donePayload?.usageMetadata,
109
+ modelVersion: donePayload?.modelVersion
110
+ };
111
+ }
112
+ async *normalizeStream(stream) {
113
+ for await (const chunk of stream) {
114
+ yield typeof chunk === 'string' ? chunk : chunk.toString();
115
+ }
116
+ }
117
+ createContext(options) {
118
+ return {
119
+ requestId: options.requestId,
120
+ model: options.model,
121
+ options: {
122
+ reasoningMode: options.reasoningMode ?? this.config.reasoningMode,
123
+ reasoningTextPrefix: options.reasoningTextPrefix ?? this.config.reasoningTextPrefix
124
+ },
125
+ startTime: Date.now(),
126
+ eventStats: {
127
+ totalEvents: 0,
128
+ chunkEvents: 0,
129
+ doneEvents: 0,
130
+ errors: 0,
131
+ startTime: Date.now()
132
+ },
133
+ isCompleted: false
134
+ };
135
+ }
136
+ wrapError(code, error, requestId) {
137
+ return ErrorUtils.createError(error.message, code, { requestId });
138
+ }
139
+ normalizeReasoningPart(part, context) {
140
+ if (!part || typeof part !== 'object') {
141
+ return [part];
142
+ }
143
+ const reasoning = typeof part.reasoning === 'string' ? part.reasoning : undefined;
144
+ if (!reasoning) {
145
+ return [part];
146
+ }
147
+ const decision = dispatchReasoning(reasoning, {
148
+ mode: context.options.reasoningMode ?? this.config.reasoningMode,
149
+ prefix: context.options.reasoningTextPrefix ?? this.config.reasoningTextPrefix
150
+ });
151
+ const normalized = [];
152
+ if (decision.appendToContent) {
153
+ normalized.push({ text: decision.appendToContent });
154
+ }
155
+ if (decision.channel) {
156
+ normalized.push({ reasoning: decision.channel });
157
+ }
158
+ return normalized;
159
+ }
160
+ }
@@ -3,4 +3,5 @@
3
3
  */
4
4
  export { ChatSseToJsonConverter, defaultChatSseToJsonConverter } from './chat-sse-to-json-converter.js';
5
5
  export { ResponsesSseToJsonConverterRefactored as ResponsesSseToJsonConverter } from './responses-sse-to-json-converter.js';
6
- export type { SseToChatJsonOptions, SseToChatJsonContext, ChatEventStats, SseToResponsesJsonOptions, SseToResponsesJsonContext, ResponsesEventStats } from '../types/index.js';
6
+ export { GeminiSseToJsonConverter } from './gemini-sse-to-json-converter.js';
7
+ export type { SseToChatJsonOptions, SseToChatJsonContext, ChatEventStats, SseToResponsesJsonOptions, SseToResponsesJsonContext, ResponsesEventStats, SseToGeminiJsonOptions, SseToGeminiJsonContext, GeminiEventStats } from '../types/index.js';
@@ -5,3 +5,5 @@
5
5
  export { ChatSseToJsonConverter, defaultChatSseToJsonConverter } from './chat-sse-to-json-converter.js';
6
6
  // Responses协议转换器(重构版本)
7
7
  export { ResponsesSseToJsonConverterRefactored as ResponsesSseToJsonConverter } from './responses-sse-to-json-converter.js';
8
+ // Gemini协议转换器
9
+ export { GeminiSseToJsonConverter } from './gemini-sse-to-json-converter.js';
@@ -50,7 +50,17 @@ export const DEFAULT_SSE_PARSER_CONFIG = {
50
50
  'reasoning.start',
51
51
  'reasoning.delta',
52
52
  'reasoning.done',
53
- 'required_action'
53
+ 'required_action',
54
+ // Anthropic event types
55
+ 'message_start',
56
+ 'content_block_start',
57
+ 'content_block_delta',
58
+ 'content_block_stop',
59
+ 'message_delta',
60
+ 'message_stop',
61
+ // Gemini event types
62
+ 'gemini.data',
63
+ 'gemini.done'
54
64
  ])
55
65
  };
56
66
  /**
@@ -76,16 +86,18 @@ function parseSseLine(line) {
76
86
  * 将原始SSE行组装为事件
77
87
  */
78
88
  export function assembleSseEvent(lines) {
79
- if (lines.length === 0)
89
+ if (lines.length === 0) {
80
90
  return null;
91
+ }
81
92
  const event = {
82
93
  event: 'message', // 默认事件类型
83
94
  data: ''
84
95
  };
85
96
  for (const line of lines) {
86
97
  const { field, value } = parseSseLine(line);
87
- if (!field)
98
+ if (!field) {
88
99
  continue;
100
+ }
89
101
  switch (field) {
90
102
  case 'id':
91
103
  event.id = value;
@@ -94,7 +106,7 @@ export function assembleSseEvent(lines) {
94
106
  event.event = value;
95
107
  break;
96
108
  case 'data':
97
- event.data = event.data ? event.data + '\n' + value : value;
109
+ event.data = event.data ? `${event.data}\n${value}` : value;
98
110
  break;
99
111
  case 'retry':
100
112
  event.retry = value;
@@ -119,7 +131,8 @@ function safeJsonParse(data) {
119
131
  return JSON.parse(data);
120
132
  }
121
133
  catch (error) {
122
- throw new Error(`Invalid JSON data: ${error.message}`);
134
+ const message = error instanceof Error ? error.message : String(error);
135
+ throw new Error(`Invalid JSON data: ${message}`);
123
136
  }
124
137
  }
125
138
  /**
@@ -134,19 +147,23 @@ function validateEventType(eventType, config) {
134
147
  /**
135
148
  * 创建基础事件对象
136
149
  */
137
- function createBaseEvent(rawEvent, config, rawData) {
150
+ function createBaseEvent(rawEvent, config, _rawData) {
138
151
  const baseEvent = {
139
152
  type: rawEvent.event,
140
- timestamp: rawEvent.timestamp || Date.now(),
153
+ timestamp: rawEvent.timestamp ?? Date.now(),
141
154
  data: null,
142
155
  sequenceNumber: typeof rawEvent.id === 'string' ? Number(rawEvent.id) : 0
143
156
  };
144
157
  // 解析数据字段
145
158
  try {
146
159
  if (rawEvent.data) {
147
- baseEvent.data = safeJsonParse(rawEvent.data);
148
- if (baseEvent.data && typeof baseEvent.data.sequence_number === 'number') {
149
- baseEvent.sequenceNumber = baseEvent.data.sequence_number;
160
+ const parsedData = safeJsonParse(rawEvent.data);
161
+ baseEvent.data = parsedData;
162
+ if (parsedData &&
163
+ typeof parsedData === 'object' &&
164
+ 'sequence_number' in parsedData &&
165
+ typeof parsedData.sequence_number === 'number') {
166
+ baseEvent.sequenceNumber = parsedData.sequence_number;
150
167
  }
151
168
  }
152
169
  }
@@ -156,7 +173,7 @@ function createBaseEvent(rawEvent, config, rawData) {
156
173
  baseEvent.type = 'error';
157
174
  }
158
175
  else {
159
- throw error;
176
+ throw error instanceof Error ? error : new Error(String(error));
160
177
  }
161
178
  }
162
179
  return baseEvent;
@@ -188,15 +205,51 @@ function createResponsesEvent(baseEvent) {
188
205
  direction: 'sse_to_json'
189
206
  };
190
207
  }
208
+ function createAnthropicEvent(baseEvent) {
209
+ return {
210
+ type: baseEvent.type,
211
+ timestamp: baseEvent.timestamp,
212
+ data: baseEvent.data,
213
+ sequenceNumber: baseEvent.sequenceNumber,
214
+ protocol: 'anthropic-messages',
215
+ direction: 'sse_to_json'
216
+ };
217
+ }
218
+ function createGeminiEvent(baseEvent) {
219
+ return {
220
+ type: baseEvent.type,
221
+ event: baseEvent.type,
222
+ timestamp: baseEvent.timestamp,
223
+ data: baseEvent.data,
224
+ sequenceNumber: baseEvent.sequenceNumber,
225
+ protocol: 'gemini-chat',
226
+ direction: 'sse_to_json'
227
+ };
228
+ }
191
229
  /**
192
230
  * 检测事件协议类型
193
231
  */
194
232
  function detectEventType(eventType) {
195
233
  // Chat协议事件类型
196
234
  const chatEventTypes = new Set(['chunk', 'done', 'error', 'heartbeat']);
235
+ const anthropicEventTypes = new Set([
236
+ 'message_start',
237
+ 'content_block_start',
238
+ 'content_block_delta',
239
+ 'content_block_stop',
240
+ 'message_delta',
241
+ 'message_stop'
242
+ ]);
243
+ const geminiEventTypes = new Set(['gemini.data', 'gemini.done']);
197
244
  if (chatEventTypes.has(eventType)) {
198
245
  return 'chat';
199
246
  }
247
+ if (anthropicEventTypes.has(eventType)) {
248
+ return 'anthropic';
249
+ }
250
+ if (geminiEventTypes.has(eventType)) {
251
+ return 'gemini';
252
+ }
200
253
  // Responses协议事件类型(以点分隔或特定关键词)
201
254
  if (eventType.includes('.') ||
202
255
  eventType.startsWith('response') ||
@@ -243,13 +296,19 @@ export function parseSseEvent(sseText, config = DEFAULT_SSE_PARSER_CONFIG) {
243
296
  if (protocol === 'chat') {
244
297
  result.event = createChatEvent(baseEvent);
245
298
  }
299
+ else if (protocol === 'anthropic') {
300
+ result.event = createAnthropicEvent(baseEvent);
301
+ }
302
+ else if (protocol === 'gemini') {
303
+ result.event = createGeminiEvent(baseEvent);
304
+ }
246
305
  else {
247
306
  result.event = createResponsesEvent(baseEvent);
248
307
  }
249
308
  result.success = true;
250
309
  }
251
310
  catch (error) {
252
- result.error = error.message;
311
+ result.error = error instanceof Error ? error.message : String(error);
253
312
  }
254
313
  return result;
255
314
  }
@@ -276,8 +335,9 @@ export async function* parseSseStreamAsync(asyncSseData, config = DEFAULT_SSE_PA
276
335
  // 查找完整的事件边界
277
336
  while (true) {
278
337
  const eventEnd = buffer.indexOf('\n\n');
279
- if (eventEnd === -1)
338
+ if (eventEnd === -1) {
280
339
  break;
340
+ }
281
341
  const eventData = buffer.substring(0, eventEnd);
282
342
  buffer = buffer.substring(eventEnd + 2);
283
343
  const result = parseSseEvent(eventData, config);
@@ -27,6 +27,7 @@ export declare class ResponsesSseToJsonConverterRefactored {
27
27
  * 将事件对象序列化为SSE格式(简单实现)
28
28
  */
29
29
  private serializeEventToSSE;
30
+ private chunkStrings;
30
31
  /**
31
32
  * 验证序列号
32
33
  */
@@ -48,14 +48,10 @@ export class ResponsesSseToJsonConverterRefactored {
48
48
  const readableStream = this.createReadableStream(sseStream);
49
49
  // 5. 流式处理SSE数据(按增量缓冲解析,避免跨 chunk 的事件被截断)
50
50
  // 注意:不要对每个 chunk 独立 parse;必须使用一个持续的 async 解析器维持缓冲区。
51
- async function* chunkStrings(stream) {
52
- for await (const chunk of stream) {
53
- yield typeof chunk === 'string' ? chunk : chunk.toString();
54
- }
55
- }
56
- for await (const parseResult of parser.parseStreamAsync(chunkStrings(readableStream))) {
57
- if (context.isCompleted)
51
+ for await (const parseResult of parser.parseStreamAsync(this.chunkStrings(readableStream))) {
52
+ if (context.isCompleted) {
58
53
  break;
54
+ }
59
55
  if (parseResult.success && parseResult.event) {
60
56
  const event = parseResult.event;
61
57
  // 验证序列号
@@ -150,8 +146,14 @@ export class ResponsesSseToJsonConverterRefactored {
150
146
  * 将事件对象序列化为SSE格式(简单实现)
151
147
  */
152
148
  serializeEventToSSE(event) {
149
+ const type = typeof event.type === 'string' ? event.type : 'data';
153
150
  const data = event.data ? JSON.stringify(event.data) : '';
154
- return `event: ${event.type}\ndata: ${data}\n\n`;
151
+ return `event: ${type}\ndata: ${data}\n\n`;
152
+ }
153
+ async *chunkStrings(stream) {
154
+ for await (const chunk of stream) {
155
+ yield typeof chunk === 'string' ? chunk : chunk.toString();
156
+ }
155
157
  }
156
158
  /**
157
159
  * 验证序列号