@jsonstudio/llms 0.4.2

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 (538) hide show
  1. package/README.md +265 -0
  2. package/dist/api/index.d.ts +10 -0
  3. package/dist/api/index.js +11 -0
  4. package/dist/api/llmswitch-config.d.ts +15 -0
  5. package/dist/api/llmswitch-config.js +415 -0
  6. package/dist/api/llmswitch-types.d.ts +412 -0
  7. package/dist/api/llmswitch-types.js +60 -0
  8. package/dist/bridge/routecodex-adapter.d.ts +74 -0
  9. package/dist/bridge/routecodex-adapter.js +226 -0
  10. package/dist/config/index.d.ts +3 -0
  11. package/dist/config/index.js +5 -0
  12. package/dist/config-unified/enhanced-path-resolver.d.ts +5 -0
  13. package/dist/config-unified/enhanced-path-resolver.js +38 -0
  14. package/dist/config-unified/unified-config.d.ts +26 -0
  15. package/dist/config-unified/unified-config.js +187 -0
  16. package/dist/conversion/codec-registry.d.ts +10 -0
  17. package/dist/conversion/codec-registry.js +25 -0
  18. package/dist/conversion/codecs/anthropic-openai-codec.d.ts +23 -0
  19. package/dist/conversion/codecs/anthropic-openai-codec.js +546 -0
  20. package/dist/conversion/codecs/gemini-openai-codec.d.ts +16 -0
  21. package/dist/conversion/codecs/gemini-openai-codec.js +437 -0
  22. package/dist/conversion/codecs/openai-openai-codec.d.ts +12 -0
  23. package/dist/conversion/codecs/openai-openai-codec.js +125 -0
  24. package/dist/conversion/codecs/responses-openai-codec.d.ts +12 -0
  25. package/dist/conversion/codecs/responses-openai-codec.js +154 -0
  26. package/dist/conversion/config/config-manager.d.ts +212 -0
  27. package/dist/conversion/config/config-manager.js +310 -0
  28. package/dist/conversion/conversion-v3/adapters/index.d.ts +2 -0
  29. package/dist/conversion/conversion-v3/adapters/index.js +1 -0
  30. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.d.ts +38 -0
  31. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.js +55 -0
  32. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.d.ts +22 -0
  33. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.js +84 -0
  34. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.d.ts +4 -0
  35. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.js +285 -0
  36. package/dist/conversion/conversion-v3/compatibility/index.d.ts +3 -0
  37. package/dist/conversion/conversion-v3/compatibility/index.js +2 -0
  38. package/dist/conversion/conversion-v3/config/default-configs.d.ts +48 -0
  39. package/dist/conversion/conversion-v3/config/default-configs.js +1083 -0
  40. package/dist/conversion/conversion-v3/config/index.d.ts +5 -0
  41. package/dist/conversion/conversion-v3/config/index.js +5 -0
  42. package/dist/conversion/conversion-v3/config/pipeline-config-manager.d.ts +49 -0
  43. package/dist/conversion/conversion-v3/config/pipeline-config-manager.js +65 -0
  44. package/dist/conversion/conversion-v3/index.d.ts +11 -0
  45. package/dist/conversion/conversion-v3/index.js +17 -0
  46. package/dist/conversion/conversion-v3/nodes/index.d.ts +56 -0
  47. package/dist/conversion/conversion-v3/nodes/index.js +149 -0
  48. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.d.ts +25 -0
  49. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.js +56 -0
  50. package/dist/conversion/conversion-v3/nodes/input/base-input-node.d.ts +75 -0
  51. package/dist/conversion/conversion-v3/nodes/input/base-input-node.js +237 -0
  52. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.d.ts +25 -0
  53. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.js +56 -0
  54. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.d.ts +4 -0
  55. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.js +197 -0
  56. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.d.ts +16 -0
  57. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.js +125 -0
  58. package/dist/conversion/conversion-v3/nodes/input/index.d.ts +8 -0
  59. package/dist/conversion/conversion-v3/nodes/input/index.js +8 -0
  60. package/dist/conversion/conversion-v3/nodes/input/input-decision.d.ts +46 -0
  61. package/dist/conversion/conversion-v3/nodes/input/input-decision.js +125 -0
  62. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.d.ts +20 -0
  63. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.js +51 -0
  64. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.d.ts +71 -0
  65. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.js +320 -0
  66. package/dist/conversion/conversion-v3/nodes/output/base-output-node.d.ts +116 -0
  67. package/dist/conversion/conversion-v3/nodes/output/base-output-node.js +512 -0
  68. package/dist/conversion/conversion-v3/nodes/output/index.d.ts +7 -0
  69. package/dist/conversion/conversion-v3/nodes/output/index.js +7 -0
  70. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.d.ts +71 -0
  71. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.js +293 -0
  72. package/dist/conversion/conversion-v3/nodes/output/output-decision.d.ts +68 -0
  73. package/dist/conversion/conversion-v3/nodes/output/output-decision.js +161 -0
  74. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.d.ts +64 -0
  75. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.js +323 -0
  76. package/dist/conversion/conversion-v3/nodes/process/base-process-node.d.ts +72 -0
  77. package/dist/conversion/conversion-v3/nodes/process/base-process-node.js +246 -0
  78. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.d.ts +135 -0
  79. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.js +854 -0
  80. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.d.ts +29 -0
  81. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.js +181 -0
  82. package/dist/conversion/conversion-v3/nodes/process/index.d.ts +10 -0
  83. package/dist/conversion/conversion-v3/nodes/process/index.js +10 -0
  84. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.d.ts +59 -0
  85. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.js +243 -0
  86. package/dist/conversion/conversion-v3/nodes/process/response-process-node.d.ts +17 -0
  87. package/dist/conversion/conversion-v3/nodes/process/response-process-node.js +213 -0
  88. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.d.ts +26 -0
  89. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.js +299 -0
  90. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.d.ts +40 -0
  91. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.js +430 -0
  92. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.d.ts +12 -0
  93. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.js +129 -0
  94. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.d.ts +15 -0
  95. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.js +57 -0
  96. package/dist/conversion/conversion-v3/nodes/response/index.d.ts +4 -0
  97. package/dist/conversion/conversion-v3/nodes/response/index.js +4 -0
  98. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.d.ts +15 -0
  99. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.js +87 -0
  100. package/dist/conversion/conversion-v3/nodes/response/response-utils.d.ts +1 -0
  101. package/dist/conversion/conversion-v3/nodes/response/response-utils.js +1 -0
  102. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.d.ts +12 -0
  103. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.js +67 -0
  104. package/dist/conversion/conversion-v3/nodes/sse/index.d.ts +3 -0
  105. package/dist/conversion/conversion-v3/nodes/sse/index.js +3 -0
  106. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.d.ts +27 -0
  107. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.js +165 -0
  108. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.d.ts +19 -0
  109. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.js +267 -0
  110. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.d.ts +18 -0
  111. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.js +48 -0
  112. package/dist/conversion/conversion-v3/pipelines/index.d.ts +6 -0
  113. package/dist/conversion/conversion-v3/pipelines/index.js +6 -0
  114. package/dist/conversion/conversion-v3/pipelines/super-pipeline.d.ts +112 -0
  115. package/dist/conversion/conversion-v3/pipelines/super-pipeline.js +566 -0
  116. package/dist/conversion/conversion-v3/response/provider-response-converter.d.ts +28 -0
  117. package/dist/conversion/conversion-v3/response/provider-response-converter.js +249 -0
  118. package/dist/conversion/conversion-v3/sse/index.d.ts +140 -0
  119. package/dist/conversion/conversion-v3/sse/index.js +115 -0
  120. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +11 -0
  121. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.js +79 -0
  122. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.d.ts +79 -0
  123. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.js +296 -0
  124. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.d.ts +55 -0
  125. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.js +233 -0
  126. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.d.ts +99 -0
  127. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.js +599 -0
  128. package/dist/conversion/conversion-v3/sse/json-to-sse/index.d.ts +6 -0
  129. package/dist/conversion/conversion-v3/sse/json-to-sse/index.js +7 -0
  130. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.d.ts +79 -0
  131. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.js +322 -0
  132. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.d.ts +37 -0
  133. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.js +218 -0
  134. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.d.ts +40 -0
  135. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.js +263 -0
  136. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.d.ts +32 -0
  137. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.js +106 -0
  138. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.d.ts +4 -0
  139. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.js +40 -0
  140. package/dist/conversion/conversion-v3/sse/shared/constants.d.ts +272 -0
  141. package/dist/conversion/conversion-v3/sse/shared/constants.js +321 -0
  142. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.d.ts +158 -0
  143. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.js +210 -0
  144. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.d.ts +82 -0
  145. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.js +275 -0
  146. package/dist/conversion/conversion-v3/sse/shared/serializers/index.d.ts +39 -0
  147. package/dist/conversion/conversion-v3/sse/shared/serializers/index.js +54 -0
  148. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.d.ts +123 -0
  149. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.js +356 -0
  150. package/dist/conversion/conversion-v3/sse/shared/serializers/types.d.ts +51 -0
  151. package/dist/conversion/conversion-v3/sse/shared/serializers/types.js +4 -0
  152. package/dist/conversion/conversion-v3/sse/shared/utils.d.ts +254 -0
  153. package/dist/conversion/conversion-v3/sse/shared/utils.js +543 -0
  154. package/dist/conversion/conversion-v3/sse/shared/writer.d.ts +111 -0
  155. package/dist/conversion/conversion-v3/sse/shared/writer.js +268 -0
  156. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +13 -0
  157. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.js +139 -0
  158. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.d.ts +165 -0
  159. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.js +776 -0
  160. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.d.ts +106 -0
  161. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.js +540 -0
  162. package/dist/conversion/conversion-v3/sse/sse-to-json/index.d.ts +6 -0
  163. package/dist/conversion/conversion-v3/sse/sse-to-json/index.js +7 -0
  164. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.d.ts +73 -0
  165. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.js +332 -0
  166. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.d.ts +59 -0
  167. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.js +270 -0
  168. package/dist/conversion/conversion-v3/sse/types/anthropic-types.d.ts +87 -0
  169. package/dist/conversion/conversion-v3/sse/types/anthropic-types.js +5 -0
  170. package/dist/conversion/conversion-v3/sse/types/chat-types.d.ts +308 -0
  171. package/dist/conversion/conversion-v3/sse/types/chat-types.js +32 -0
  172. package/dist/conversion/conversion-v3/sse/types/conversion-context.d.ts +211 -0
  173. package/dist/conversion/conversion-v3/sse/types/conversion-context.js +20 -0
  174. package/dist/conversion/conversion-v3/sse/types/core-interfaces.d.ts +90 -0
  175. package/dist/conversion/conversion-v3/sse/types/core-interfaces.js +5 -0
  176. package/dist/conversion/conversion-v3/sse/types/index.d.ts +14 -0
  177. package/dist/conversion/conversion-v3/sse/types/index.js +7 -0
  178. package/dist/conversion/conversion-v3/sse/types/responses-types.d.ts +328 -0
  179. package/dist/conversion/conversion-v3/sse/types/responses-types.js +38 -0
  180. package/dist/conversion/conversion-v3/sse/types/sse-events.d.ts +180 -0
  181. package/dist/conversion/conversion-v3/sse/types/sse-events.js +150 -0
  182. package/dist/conversion/conversion-v3/sse/types/stream-state.d.ts +204 -0
  183. package/dist/conversion/conversion-v3/sse/types/stream-state.js +44 -0
  184. package/dist/conversion/conversion-v3/sse/types/utility-types.d.ts +230 -0
  185. package/dist/conversion/conversion-v3/sse/types/utility-types.js +49 -0
  186. package/dist/conversion/conversion-v3/standards/context-adapter.d.ts +146 -0
  187. package/dist/conversion/conversion-v3/standards/context-adapter.js +438 -0
  188. package/dist/conversion/conversion-v3/standards/errors.d.ts +38 -0
  189. package/dist/conversion/conversion-v3/standards/errors.js +27 -0
  190. package/dist/conversion/conversion-v3/standards/index.d.ts +15 -0
  191. package/dist/conversion/conversion-v3/standards/index.js +11 -0
  192. package/dist/conversion/conversion-v3/standards/node-capabilities.d.ts +123 -0
  193. package/dist/conversion/conversion-v3/standards/node-capabilities.js +330 -0
  194. package/dist/conversion/conversion-v3/standards/pipeline-context.d.ts +237 -0
  195. package/dist/conversion/conversion-v3/standards/pipeline-context.js +84 -0
  196. package/dist/conversion/conversion-v3/standards/pipeline-node.d.ts +196 -0
  197. package/dist/conversion/conversion-v3/standards/pipeline-node.js +316 -0
  198. package/dist/conversion/conversion-v3/standards/snapshot-handles.d.ts +24 -0
  199. package/dist/conversion/conversion-v3/standards/snapshot-handles.js +49 -0
  200. package/dist/conversion/conversion-v3/types/config-types.d.ts +242 -0
  201. package/dist/conversion/conversion-v3/types/config-types.js +13 -0
  202. package/dist/conversion/conversion-v3/types/index.d.ts +8 -0
  203. package/dist/conversion/conversion-v3/types/index.js +11 -0
  204. package/dist/conversion/conversion-v3/types/node-types.d.ts +211 -0
  205. package/dist/conversion/conversion-v3/types/node-types.js +20 -0
  206. package/dist/conversion/conversion-v3/types/pipeline-types.d.ts +246 -0
  207. package/dist/conversion/conversion-v3/types/pipeline-types.js +26 -0
  208. package/dist/conversion/conversion-v3/types/request-types.d.ts +293 -0
  209. package/dist/conversion/conversion-v3/types/request-types.js +26 -0
  210. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.d.ts +10 -0
  211. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.js +103 -0
  212. package/dist/conversion/conversion-v3/validations/index.d.ts +8 -0
  213. package/dist/conversion/conversion-v3/validations/index.js +7 -0
  214. package/dist/conversion/conversion-v3/validations/node-graph-validator.d.ts +116 -0
  215. package/dist/conversion/conversion-v3/validations/node-graph-validator.js +505 -0
  216. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.d.ts +139 -0
  217. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.js +338 -0
  218. package/dist/conversion/hub/config/types.d.ts +26 -0
  219. package/dist/conversion/hub/config/types.js +1 -0
  220. package/dist/conversion/hub/core/detour-registry.d.ts +9 -0
  221. package/dist/conversion/hub/core/detour-registry.js +23 -0
  222. package/dist/conversion/hub/core/hub-context.d.ts +21 -0
  223. package/dist/conversion/hub/core/hub-context.js +1 -0
  224. package/dist/conversion/hub/core/index.d.ts +3 -0
  225. package/dist/conversion/hub/core/index.js +3 -0
  226. package/dist/conversion/hub/core/stage-driver.d.ts +30 -0
  227. package/dist/conversion/hub/core/stage-driver.js +31 -0
  228. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.d.ts +16 -0
  229. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.js +23 -0
  230. package/dist/conversion/hub/format-adapters/chat-format-adapter.d.ts +17 -0
  231. package/dist/conversion/hub/format-adapters/chat-format-adapter.js +23 -0
  232. package/dist/conversion/hub/format-adapters/gemini-format-adapter.d.ts +16 -0
  233. package/dist/conversion/hub/format-adapters/gemini-format-adapter.js +23 -0
  234. package/dist/conversion/hub/format-adapters/index.d.ts +21 -0
  235. package/dist/conversion/hub/format-adapters/index.js +4 -0
  236. package/dist/conversion/hub/format-adapters/responses-format-adapter.d.ts +17 -0
  237. package/dist/conversion/hub/format-adapters/responses-format-adapter.js +23 -0
  238. package/dist/conversion/hub/hub-feature.d.ts +1 -0
  239. package/dist/conversion/hub/hub-feature.js +25 -0
  240. package/dist/conversion/hub/node-support.d.ts +19 -0
  241. package/dist/conversion/hub/node-support.js +115 -0
  242. package/dist/conversion/hub/pipeline/hub-pipeline.d.ts +68 -0
  243. package/dist/conversion/hub/pipeline/hub-pipeline.js +421 -0
  244. package/dist/conversion/hub/pipelines/inbound.d.ts +22 -0
  245. package/dist/conversion/hub/pipelines/inbound.js +64 -0
  246. package/dist/conversion/hub/pipelines/outbound.d.ts +22 -0
  247. package/dist/conversion/hub/pipelines/outbound.js +57 -0
  248. package/dist/conversion/hub/process/chat-process.d.ts +13 -0
  249. package/dist/conversion/hub/process/chat-process.js +50 -0
  250. package/dist/conversion/hub/registry.d.ts +28 -0
  251. package/dist/conversion/hub/registry.js +98 -0
  252. package/dist/conversion/hub/response/chat-response-utils.d.ts +6 -0
  253. package/dist/conversion/hub/response/chat-response-utils.js +89 -0
  254. package/dist/conversion/hub/response/provider-response.d.ts +20 -0
  255. package/dist/conversion/hub/response/provider-response.js +196 -0
  256. package/dist/conversion/hub/response/response-mappers.d.ts +19 -0
  257. package/dist/conversion/hub/response/response-mappers.js +23 -0
  258. package/dist/conversion/hub/response/response-runtime.d.ts +3 -0
  259. package/dist/conversion/hub/response/response-runtime.js +206 -0
  260. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.d.ts +7 -0
  261. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.js +308 -0
  262. package/dist/conversion/hub/semantic-mappers/chat-mapper.d.ts +7 -0
  263. package/dist/conversion/hub/semantic-mappers/chat-mapper.js +304 -0
  264. package/dist/conversion/hub/semantic-mappers/gemini-mapper.d.ts +7 -0
  265. package/dist/conversion/hub/semantic-mappers/gemini-mapper.js +477 -0
  266. package/dist/conversion/hub/semantic-mappers/index.d.ts +4 -0
  267. package/dist/conversion/hub/semantic-mappers/index.js +4 -0
  268. package/dist/conversion/hub/semantic-mappers/responses-mapper.d.ts +21 -0
  269. package/dist/conversion/hub/semantic-mappers/responses-mapper.js +379 -0
  270. package/dist/conversion/hub/snapshot-recorder.d.ts +12 -0
  271. package/dist/conversion/hub/snapshot-recorder.js +69 -0
  272. package/dist/conversion/hub/standardized-bridge.d.ts +12 -0
  273. package/dist/conversion/hub/standardized-bridge.js +248 -0
  274. package/dist/conversion/hub/types/chat-envelope.d.ts +67 -0
  275. package/dist/conversion/hub/types/chat-envelope.js +1 -0
  276. package/dist/conversion/hub/types/chat-schema.d.ts +112 -0
  277. package/dist/conversion/hub/types/chat-schema.js +1 -0
  278. package/dist/conversion/hub/types/errors.d.ts +5 -0
  279. package/dist/conversion/hub/types/errors.js +13 -0
  280. package/dist/conversion/hub/types/format-envelope.d.ts +7 -0
  281. package/dist/conversion/hub/types/format-envelope.js +1 -0
  282. package/dist/conversion/hub/types/index.d.ts +6 -0
  283. package/dist/conversion/hub/types/index.js +6 -0
  284. package/dist/conversion/hub/types/json.d.ts +9 -0
  285. package/dist/conversion/hub/types/json.js +9 -0
  286. package/dist/conversion/hub/types/node.d.ts +31 -0
  287. package/dist/conversion/hub/types/node.js +1 -0
  288. package/dist/conversion/hub/types/standardized.d.ts +94 -0
  289. package/dist/conversion/hub/types/standardized.js +1 -0
  290. package/dist/conversion/index.d.ts +28 -0
  291. package/dist/conversion/index.js +28 -0
  292. package/dist/conversion/responses/responses-openai-bridge.d.ts +95 -0
  293. package/dist/conversion/responses/responses-openai-bridge.js +1330 -0
  294. package/dist/conversion/schema-validator.d.ts +7 -0
  295. package/dist/conversion/schema-validator.js +67 -0
  296. package/dist/conversion/shared/args-mapping.d.ts +18 -0
  297. package/dist/conversion/shared/args-mapping.js +213 -0
  298. package/dist/conversion/shared/chat-request-filters.d.ts +9 -0
  299. package/dist/conversion/shared/chat-request-filters.js +74 -0
  300. package/dist/conversion/shared/jsonish.d.ts +3 -0
  301. package/dist/conversion/shared/jsonish.js +177 -0
  302. package/dist/conversion/shared/mcp-injection.d.ts +2 -0
  303. package/dist/conversion/shared/mcp-injection.js +89 -0
  304. package/dist/conversion/shared/media.d.ts +1 -0
  305. package/dist/conversion/shared/media.js +9 -0
  306. package/dist/conversion/shared/openai-finalizer.d.ts +9 -0
  307. package/dist/conversion/shared/openai-finalizer.js +104 -0
  308. package/dist/conversion/shared/openai-message-normalize.d.ts +1 -0
  309. package/dist/conversion/shared/openai-message-normalize.js +442 -0
  310. package/dist/conversion/shared/payload-budget.d.ts +13 -0
  311. package/dist/conversion/shared/payload-budget.js +248 -0
  312. package/dist/conversion/shared/reasoning-mapping.d.ts +5 -0
  313. package/dist/conversion/shared/reasoning-mapping.js +8 -0
  314. package/dist/conversion/shared/responses-conversation-store.d.ts +41 -0
  315. package/dist/conversion/shared/responses-conversation-store.js +285 -0
  316. package/dist/conversion/shared/responses-id-utils.d.ts +7 -0
  317. package/dist/conversion/shared/responses-id-utils.js +29 -0
  318. package/dist/conversion/shared/responses-instructions.d.ts +1 -0
  319. package/dist/conversion/shared/responses-instructions.js +113 -0
  320. package/dist/conversion/shared/responses-metadata.d.ts +1 -0
  321. package/dist/conversion/shared/responses-metadata.js +1 -0
  322. package/dist/conversion/shared/responses-request-adapter.d.ts +66 -0
  323. package/dist/conversion/shared/responses-request-adapter.js +461 -0
  324. package/dist/conversion/shared/snapshot-hooks.d.ts +12 -0
  325. package/dist/conversion/shared/snapshot-hooks.js +7 -0
  326. package/dist/conversion/shared/streaming-text-extractor.d.ts +26 -0
  327. package/dist/conversion/shared/streaming-text-extractor.js +145 -0
  328. package/dist/conversion/shared/text-markup-normalizer.d.ts +9 -0
  329. package/dist/conversion/shared/text-markup-normalizer.js +319 -0
  330. package/dist/conversion/shared/tool-canonicalizer.d.ts +2 -0
  331. package/dist/conversion/shared/tool-canonicalizer.js +50 -0
  332. package/dist/conversion/shared/tool-filter-pipeline.d.ts +17 -0
  333. package/dist/conversion/shared/tool-filter-pipeline.js +79 -0
  334. package/dist/conversion/shared/tool-governor.d.ts +27 -0
  335. package/dist/conversion/shared/tool-governor.js +269 -0
  336. package/dist/conversion/shared/tool-harvester.d.ts +31 -0
  337. package/dist/conversion/shared/tool-harvester.js +321 -0
  338. package/dist/conversion/shared/tool-mapping.d.ts +10 -0
  339. package/dist/conversion/shared/tool-mapping.js +10 -0
  340. package/dist/conversion/shared/tooling.d.ts +26 -0
  341. package/dist/conversion/shared/tooling.js +143 -0
  342. package/dist/conversion/types.d.ts +33 -0
  343. package/dist/conversion/types.js +1 -0
  344. package/dist/core/index.d.ts +6 -0
  345. package/dist/core/index.js +9 -0
  346. package/dist/core/llmswitch-engine-v2.d.ts +132 -0
  347. package/dist/core/llmswitch-engine-v2.js +649 -0
  348. package/dist/core/llmswitch-factory-v2.d.ts +123 -0
  349. package/dist/core/llmswitch-factory-v2.js +521 -0
  350. package/dist/endpoints/base-endpoint-handler.d.ts +128 -0
  351. package/dist/endpoints/base-endpoint-handler.js +545 -0
  352. package/dist/endpoints/chat-endpoint-handler.d.ts +115 -0
  353. package/dist/endpoints/chat-endpoint-handler.js +218 -0
  354. package/dist/endpoints/endpoint-router.d.ts +127 -0
  355. package/dist/endpoints/endpoint-router.js +438 -0
  356. package/dist/endpoints/index.d.ts +13 -0
  357. package/dist/endpoints/index.js +11 -0
  358. package/dist/endpoints/messages-endpoint-handler.d.ts +171 -0
  359. package/dist/endpoints/messages-endpoint-handler.js +238 -0
  360. package/dist/endpoints/responses-endpoint-handler.d.ts +147 -0
  361. package/dist/endpoints/responses-endpoint-handler.js +233 -0
  362. package/dist/filters/builtin/add-fields-filter.d.ts +8 -0
  363. package/dist/filters/builtin/add-fields-filter.js +16 -0
  364. package/dist/filters/builtin/blacklist-filter.d.ts +8 -0
  365. package/dist/filters/builtin/blacklist-filter.js +19 -0
  366. package/dist/filters/builtin/whitelist-filter.d.ts +8 -0
  367. package/dist/filters/builtin/whitelist-filter.js +19 -0
  368. package/dist/filters/engine.d.ts +16 -0
  369. package/dist/filters/engine.js +167 -0
  370. package/dist/filters/index.d.ts +19 -0
  371. package/dist/filters/index.js +24 -0
  372. package/dist/filters/special/request-streaming-to-nonstreaming.d.ts +12 -0
  373. package/dist/filters/special/request-streaming-to-nonstreaming.js +27 -0
  374. package/dist/filters/special/request-tool-choice-policy.d.ts +11 -0
  375. package/dist/filters/special/request-tool-choice-policy.js +27 -0
  376. package/dist/filters/special/request-tool-list-filter.d.ts +11 -0
  377. package/dist/filters/special/request-tool-list-filter.js +167 -0
  378. package/dist/filters/special/request-toolcalls-stringify.d.ts +10 -0
  379. package/dist/filters/special/request-toolcalls-stringify.js +44 -0
  380. package/dist/filters/special/request-tools-normalize.d.ts +12 -0
  381. package/dist/filters/special/request-tools-normalize.js +140 -0
  382. package/dist/filters/special/response-finish-invariants.d.ts +11 -0
  383. package/dist/filters/special/response-finish-invariants.js +30 -0
  384. package/dist/filters/special/response-openai-to-responses-bridge.d.ts +13 -0
  385. package/dist/filters/special/response-openai-to-responses-bridge.js +24 -0
  386. package/dist/filters/special/response-tool-arguments-blacklist.d.ts +12 -0
  387. package/dist/filters/special/response-tool-arguments-blacklist.js +63 -0
  388. package/dist/filters/special/response-tool-arguments-schema-converge.d.ts +13 -0
  389. package/dist/filters/special/response-tool-arguments-schema-converge.js +63 -0
  390. package/dist/filters/special/response-tool-arguments-stringify.d.ts +9 -0
  391. package/dist/filters/special/response-tool-arguments-stringify.js +134 -0
  392. package/dist/filters/special/response-tool-arguments-toon-decode.d.ts +10 -0
  393. package/dist/filters/special/response-tool-arguments-toon-decode.js +94 -0
  394. package/dist/filters/special/response-tool-arguments-whitelist.d.ts +11 -0
  395. package/dist/filters/special/response-tool-arguments-whitelist.js +56 -0
  396. package/dist/filters/special/response-tool-text-canonicalize.d.ts +10 -0
  397. package/dist/filters/special/response-tool-text-canonicalize.js +20 -0
  398. package/dist/filters/special/tool-filter-hooks.d.ts +19 -0
  399. package/dist/filters/special/tool-filter-hooks.js +341 -0
  400. package/dist/filters/special/tool-post-constraints.d.ts +31 -0
  401. package/dist/filters/special/tool-post-constraints.js +120 -0
  402. package/dist/filters/types.d.ts +68 -0
  403. package/dist/filters/types.js +3 -0
  404. package/dist/filters/utils/fieldmap-loader.d.ts +2 -0
  405. package/dist/filters/utils/fieldmap-loader.js +16 -0
  406. package/dist/filters/utils/snapshot-writer.d.ts +10 -0
  407. package/dist/filters/utils/snapshot-writer.js +47 -0
  408. package/dist/guidance/index.d.ts +3 -0
  409. package/dist/guidance/index.js +228 -0
  410. package/dist/hooks/hooks-integration.d.ts +161 -0
  411. package/dist/hooks/hooks-integration.js +519 -0
  412. package/dist/hooks/index.d.ts +10 -0
  413. package/dist/hooks/index.js +13 -0
  414. package/dist/html-to-markdown.d.ts +5 -0
  415. package/dist/html-to-markdown.js +66 -0
  416. package/dist/http/sse-response.d.ts +22 -0
  417. package/dist/http/sse-response.js +103 -0
  418. package/dist/index.d.ts +10 -0
  419. package/dist/index.js +10 -0
  420. package/dist/router/virtual-router/bootstrap.d.ts +6 -0
  421. package/dist/router/virtual-router/bootstrap.js +620 -0
  422. package/dist/router/virtual-router/classifier.d.ts +10 -0
  423. package/dist/router/virtual-router/classifier.js +99 -0
  424. package/dist/router/virtual-router/engine.d.ts +35 -0
  425. package/dist/router/virtual-router/engine.js +260 -0
  426. package/dist/router/virtual-router/error-center.d.ts +10 -0
  427. package/dist/router/virtual-router/error-center.js +39 -0
  428. package/dist/router/virtual-router/features.d.ts +3 -0
  429. package/dist/router/virtual-router/features.js +162 -0
  430. package/dist/router/virtual-router/health-manager.d.ts +18 -0
  431. package/dist/router/virtual-router/health-manager.js +98 -0
  432. package/dist/router/virtual-router/load-balancer.d.ts +18 -0
  433. package/dist/router/virtual-router/load-balancer.js +67 -0
  434. package/dist/router/virtual-router/provider-registry.d.ts +11 -0
  435. package/dist/router/virtual-router/provider-registry.js +74 -0
  436. package/dist/router/virtual-router/types.d.ts +206 -0
  437. package/dist/router/virtual-router/types.js +31 -0
  438. package/dist/sse/index.d.ts +140 -0
  439. package/dist/sse/index.js +115 -0
  440. package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +11 -0
  441. package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.js +79 -0
  442. package/dist/sse/json-to-sse/chat-json-to-sse-converter.d.ts +79 -0
  443. package/dist/sse/json-to-sse/chat-json-to-sse-converter.js +296 -0
  444. package/dist/sse/json-to-sse/event-generators/chat.d.ts +55 -0
  445. package/dist/sse/json-to-sse/event-generators/chat.js +233 -0
  446. package/dist/sse/json-to-sse/event-generators/responses.d.ts +99 -0
  447. package/dist/sse/json-to-sse/event-generators/responses.js +599 -0
  448. package/dist/sse/json-to-sse/index.d.ts +6 -0
  449. package/dist/sse/json-to-sse/index.js +7 -0
  450. package/dist/sse/json-to-sse/responses-json-to-sse-converter.d.ts +79 -0
  451. package/dist/sse/json-to-sse/responses-json-to-sse-converter.js +322 -0
  452. package/dist/sse/json-to-sse/sequencers/chat-sequencer.d.ts +37 -0
  453. package/dist/sse/json-to-sse/sequencers/chat-sequencer.js +218 -0
  454. package/dist/sse/json-to-sse/sequencers/responses-sequencer.d.ts +40 -0
  455. package/dist/sse/json-to-sse/sequencers/responses-sequencer.js +263 -0
  456. package/dist/sse/registry/sse-codec-registry.d.ts +32 -0
  457. package/dist/sse/registry/sse-codec-registry.js +106 -0
  458. package/dist/sse/shared/chat-serializer.d.ts +4 -0
  459. package/dist/sse/shared/chat-serializer.js +40 -0
  460. package/dist/sse/shared/constants.d.ts +272 -0
  461. package/dist/sse/shared/constants.js +321 -0
  462. package/dist/sse/shared/serializers/base-serializer.d.ts +158 -0
  463. package/dist/sse/shared/serializers/base-serializer.js +210 -0
  464. package/dist/sse/shared/serializers/chat-event-serializer.d.ts +82 -0
  465. package/dist/sse/shared/serializers/chat-event-serializer.js +275 -0
  466. package/dist/sse/shared/serializers/index.d.ts +39 -0
  467. package/dist/sse/shared/serializers/index.js +54 -0
  468. package/dist/sse/shared/serializers/responses-event-serializer.d.ts +123 -0
  469. package/dist/sse/shared/serializers/responses-event-serializer.js +356 -0
  470. package/dist/sse/shared/serializers/types.d.ts +51 -0
  471. package/dist/sse/shared/serializers/types.js +4 -0
  472. package/dist/sse/shared/utils.d.ts +254 -0
  473. package/dist/sse/shared/utils.js +543 -0
  474. package/dist/sse/shared/writer.d.ts +111 -0
  475. package/dist/sse/shared/writer.js +268 -0
  476. package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +13 -0
  477. package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.js +139 -0
  478. package/dist/sse/sse-to-json/builders/response-builder.d.ts +165 -0
  479. package/dist/sse/sse-to-json/builders/response-builder.js +776 -0
  480. package/dist/sse/sse-to-json/chat-sse-to-json-converter.d.ts +106 -0
  481. package/dist/sse/sse-to-json/chat-sse-to-json-converter.js +540 -0
  482. package/dist/sse/sse-to-json/index.d.ts +6 -0
  483. package/dist/sse/sse-to-json/index.js +7 -0
  484. package/dist/sse/sse-to-json/parsers/sse-parser.d.ts +73 -0
  485. package/dist/sse/sse-to-json/parsers/sse-parser.js +340 -0
  486. package/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +59 -0
  487. package/dist/sse/sse-to-json/responses-sse-to-json-converter.js +270 -0
  488. package/dist/sse/types/anthropic-types.d.ts +87 -0
  489. package/dist/sse/types/anthropic-types.js +5 -0
  490. package/dist/sse/types/chat-types.d.ts +308 -0
  491. package/dist/sse/types/chat-types.js +32 -0
  492. package/dist/sse/types/conversion-context.d.ts +211 -0
  493. package/dist/sse/types/conversion-context.js +20 -0
  494. package/dist/sse/types/core-interfaces.d.ts +90 -0
  495. package/dist/sse/types/core-interfaces.js +5 -0
  496. package/dist/sse/types/index.d.ts +14 -0
  497. package/dist/sse/types/index.js +7 -0
  498. package/dist/sse/types/responses-types.d.ts +328 -0
  499. package/dist/sse/types/responses-types.js +38 -0
  500. package/dist/sse/types/sse-events.d.ts +180 -0
  501. package/dist/sse/types/sse-events.js +150 -0
  502. package/dist/sse/types/stream-state.d.ts +204 -0
  503. package/dist/sse/types/stream-state.js +44 -0
  504. package/dist/sse/types/utility-types.d.ts +230 -0
  505. package/dist/sse/types/utility-types.js +49 -0
  506. package/dist/tools/proxy/anthropic-tool-proxy.d.ts +19 -0
  507. package/dist/tools/proxy/anthropic-tool-proxy.js +57 -0
  508. package/dist/tools/proxy/executors/web-fetch.d.ts +6 -0
  509. package/dist/tools/proxy/executors/web-fetch.js +39 -0
  510. package/dist/tools/proxy/registry.d.ts +8 -0
  511. package/dist/tools/proxy/registry.js +14 -0
  512. package/dist/tools/proxy/types.d.ts +29 -0
  513. package/dist/tools/proxy/types.js +1 -0
  514. package/dist/tools/tool-registry.d.ts +8 -0
  515. package/dist/tools/tool-registry.js +154 -0
  516. package/dist/tools/web-fetch-html.d.ts +15 -0
  517. package/dist/tools/web-fetch-html.js +83 -0
  518. package/dist/utils/conversion-adapter.d.ts +65 -0
  519. package/dist/utils/conversion-adapter.js +183 -0
  520. package/dist/utils/error-factory.d.ts +88 -0
  521. package/dist/utils/error-factory.js +138 -0
  522. package/dist/utils/error-utils.d.ts +334 -0
  523. package/dist/utils/error-utils.js +782 -0
  524. package/dist/utils/index.d.ts +8 -0
  525. package/dist/utils/index.js +13 -0
  526. package/dist/utils/performance-utils.d.ts +205 -0
  527. package/dist/utils/performance-utils.js +440 -0
  528. package/dist/utils/profile-mapper.d.ts +32 -0
  529. package/dist/utils/profile-mapper.js +269 -0
  530. package/dist/utils/request-processor.d.ts +52 -0
  531. package/dist/utils/request-processor.js +210 -0
  532. package/dist/utils/request-utils.d.ts +117 -0
  533. package/dist/utils/request-utils.js +333 -0
  534. package/dist/utils/response-utils.d.ts +127 -0
  535. package/dist/utils/response-utils.js +516 -0
  536. package/dist/utils/token-counter.d.ts +89 -0
  537. package/dist/utils/token-counter.js +541 -0
  538. package/package.json +65 -0
@@ -0,0 +1,323 @@
1
+ /**
2
+ * OpenAI Responses 输出节点
3
+ *
4
+ * 负责将处理后的数据转换为 OpenAI Responses 格式
5
+ */
6
+ import { BaseOutputNode } from './base-output-node.js';
7
+ import { NodeType, ConversionError } from '../../types/index.js';
8
+ import { buildResponsesRequestFromChat, buildResponsesPayloadFromChat } from '../../../responses/responses-openai-bridge.js';
9
+ import { recordResponsesResponse } from '../../../shared/responses-conversation-store.js';
10
+ import { runHubOutboundConversion, shouldUseHub } from '../../../hub/node-support.js';
11
+ /**
12
+ * OpenAI Responses 输出节点实现
13
+ *
14
+ * 负责将处理后的数据转换为 OpenAI Responses 格式
15
+ */
16
+ export class ResponsesOutputNode extends BaseOutputNode {
17
+ constructor(config) {
18
+ super('responses-output', NodeType.OUTPUT, 'OpenAI Responses Output Node', config);
19
+ }
20
+ /**
21
+ * 转换为 Responses 输出格式
22
+ */
23
+ async convertToOutputFormat(processedRequest, context) {
24
+ const direction = this.getPipelineDirection(context);
25
+ if (direction !== 'response') {
26
+ if (shouldUseHub('openai-responses')) {
27
+ return runHubOutboundConversion({
28
+ protocol: 'openai-responses',
29
+ request: processedRequest,
30
+ nodeContext: context
31
+ });
32
+ }
33
+ const chatPayload = this.buildChatRequestPayload(processedRequest);
34
+ const responsesReq = buildResponsesRequestFromChat(chatPayload);
35
+ return responsesReq.request;
36
+ }
37
+ // 流式与非流式都生成完整的 Responses JSON,由下游 SSE 节点负责拆分。
38
+ return this.convertToResponsesFormat(processedRequest, context);
39
+ }
40
+ /**
41
+ * 生成 Responses 输出元数据
42
+ */
43
+ async generateOutputMetadata(processedRequest, context) {
44
+ const direction = this.getPipelineDirection(context);
45
+ if (direction !== 'response') {
46
+ return {
47
+ outputFormat: 'openai-responses',
48
+ direction: 'request',
49
+ model: this.resolveRequestModel(processedRequest),
50
+ messageCount: processedRequest.messages.length,
51
+ toolCount: processedRequest.tools?.length || 0
52
+ };
53
+ }
54
+ const metadata = {
55
+ outputFormat: 'openai-responses',
56
+ model: processedRequest.model,
57
+ streaming: processedRequest.processingMetadata?.streaming?.enabled === true,
58
+ messageCount: processedRequest.messages.length,
59
+ toolCount: processedRequest.tools?.length || 0,
60
+ processingTime: Date.now() - processedRequest.processed.timestamp
61
+ };
62
+ // 添加流式特定元数据
63
+ if (processedRequest.processingMetadata?.streaming?.enabled) {
64
+ metadata.streamingInfo = {
65
+ format: 'sse',
66
+ chunkSize: processedRequest.processingMetadata.streaming.chunkCount || 0,
67
+ maxTokens: processedRequest.parameters.max_tokens
68
+ };
69
+ }
70
+ // 添加工具调用元数据
71
+ const toolCallInfo = this.extractToolCallInfo(processedRequest.messages);
72
+ if (toolCallInfo.hasToolCalls) {
73
+ metadata.toolCallInfo = toolCallInfo;
74
+ }
75
+ // 添加 Responses 特定元数据
76
+ metadata.responsesInfo = {
77
+ apiVersion: '2024-10-01',
78
+ supportsStreaming: true,
79
+ supportedModalities: ['text', 'image', 'audio'],
80
+ maxTokens: processedRequest.parameters.max_tokens,
81
+ temperature: processedRequest.parameters.temperature,
82
+ modal: processedRequest.parameters.modal
83
+ };
84
+ return metadata;
85
+ }
86
+ /**
87
+ * 转换为 Responses 格式
88
+ */
89
+ async convertToResponsesFormat(processedRequest, context) {
90
+ const rawResponses = context.data?.rawResponsesPayload;
91
+ let bridged;
92
+ if (rawResponses && typeof rawResponses === 'object' && rawResponses.object === 'response') {
93
+ bridged = rawResponses;
94
+ }
95
+ else {
96
+ const chatCompletion = this.buildChatCompletionFromProcessed(processedRequest);
97
+ const responsesContext = {
98
+ metadata: processedRequest.metadata?.capturedContext
99
+ };
100
+ bridged = buildResponsesPayloadFromChat(chatCompletion, responsesContext);
101
+ }
102
+ if (!bridged || typeof bridged !== 'object') {
103
+ throw new ConversionError('Failed to map Chat payload to Responses format', this.id, 'response_conversion');
104
+ }
105
+ try {
106
+ recordResponsesResponse({
107
+ requestId: context.request.id,
108
+ response: bridged
109
+ });
110
+ }
111
+ catch {
112
+ /* recording failures should not block response */
113
+ }
114
+ return bridged;
115
+ }
116
+ /**
117
+ * 转换消息内容为 Responses 格式
118
+ */
119
+ convertMessageContentToResponses(message) {
120
+ const content = [];
121
+ // 处理文本内容
122
+ if (message.content) {
123
+ content.push({
124
+ type: 'output_text',
125
+ text: message.content
126
+ });
127
+ }
128
+ // 处理工具调用(转换为文本描述)
129
+ if (message.tool_calls && message.tool_calls.length > 0) {
130
+ for (const toolCall of message.tool_calls) {
131
+ try {
132
+ const toolDescription = this.createToolCallDescription(toolCall);
133
+ content.push({
134
+ type: 'output_text',
135
+ text: toolDescription
136
+ });
137
+ }
138
+ catch (error) {
139
+ throw new ConversionError(`Failed to convert tool call for ${toolCall.function.name}: ${error instanceof Error ? error.message : 'Unknown error'}`, this.id, 'tool_conversion', error instanceof Error ? error : undefined);
140
+ }
141
+ }
142
+ }
143
+ // 如果没有内容,创建空的文本内容
144
+ if (content.length === 0) {
145
+ content.push({
146
+ type: 'output_text',
147
+ text: ''
148
+ });
149
+ }
150
+ return content;
151
+ }
152
+ /**
153
+ * 创建工具调用描述
154
+ */
155
+ createToolCallDescription(toolCall) {
156
+ let description = `Tool called: ${toolCall.function.name}`;
157
+ if (toolCall.function.arguments) {
158
+ try {
159
+ const args = JSON.parse(toolCall.function.arguments);
160
+ description += ` with arguments: ${JSON.stringify(args, null, 2)}`;
161
+ }
162
+ catch {
163
+ description += ` with arguments: ${toolCall.function.arguments}`;
164
+ }
165
+ }
166
+ return description;
167
+ }
168
+ /**
169
+ * 确定 Responses 结束原因
170
+ */
171
+ determineResponsesFinishReason(message) {
172
+ // 如果有工具调用,设置为 function_call
173
+ if (message.tool_calls && message.tool_calls.length > 0) {
174
+ return 'function_call';
175
+ }
176
+ // 如果内容为空,可能是停止信号
177
+ if (!message.content) {
178
+ return 'stop';
179
+ }
180
+ // 检查是否达到长度限制
181
+ if (message.content.length > 1500) { // Responses 可能有不同的长度限制
182
+ return 'length';
183
+ }
184
+ return 'stop';
185
+ }
186
+ /**
187
+ * 生成 Responses 使用情况
188
+ */
189
+ generateResponsesUsage(processedRequest) {
190
+ // 简单的 token 计算逻辑(Responses 可能有不同的计数方式)
191
+ const promptTokens = this.calculateResponsesTokens(processedRequest.messages.slice(0, -1));
192
+ const completionTokens = this.calculateResponsesTokens(processedRequest.messages.slice(-1));
193
+ const usage = {
194
+ prompt_tokens: Math.max(1, promptTokens),
195
+ completion_tokens: Math.max(1, completionTokens),
196
+ total_tokens: promptTokens + completionTokens
197
+ };
198
+ // 添加详细信息(如果支持)
199
+ if (processedRequest.parameters.modal === 'audio') {
200
+ usage.prompt_tokens_details = {
201
+ audio_tokens: Math.floor(promptTokens * 0.3) // 简单估算
202
+ };
203
+ }
204
+ return usage;
205
+ }
206
+ buildChatCompletionFromProcessed(processedRequest) {
207
+ const assistantMessages = processedRequest.messages.filter(m => m.role === 'assistant');
208
+ if (!assistantMessages.length) {
209
+ throw new ConversionError('No assistant messages found for Responses response', this.id, 'message_validation');
210
+ }
211
+ const lastAssistantMessage = assistantMessages[assistantMessages.length - 1];
212
+ const finishReason = this.determineResponsesFinishReason(lastAssistantMessage);
213
+ const chatMessage = {
214
+ role: 'assistant',
215
+ content: lastAssistantMessage.content ?? ''
216
+ };
217
+ if (lastAssistantMessage.tool_calls && lastAssistantMessage.tool_calls.length > 0) {
218
+ chatMessage.tool_calls = lastAssistantMessage.tool_calls.map(tc => ({
219
+ id: tc.id,
220
+ type: tc.type || 'function',
221
+ function: {
222
+ name: tc.function.name,
223
+ arguments: tc.function.arguments
224
+ }
225
+ }));
226
+ }
227
+ const finishReasonForChat = finishReason === 'function_call'
228
+ ? 'tool_calls'
229
+ : finishReason;
230
+ return {
231
+ id: this.generateResponsesId().replace('resp', 'chatcmpl'),
232
+ object: 'chat.completion',
233
+ created: Math.floor(Date.now() / 1000),
234
+ model: processedRequest.model,
235
+ choices: [
236
+ {
237
+ index: 0,
238
+ finish_reason: finishReasonForChat,
239
+ message: chatMessage
240
+ }
241
+ ],
242
+ usage: this.generateResponsesUsage(processedRequest)
243
+ };
244
+ }
245
+ /**
246
+ * 生成 Responses 系统指纹
247
+ */
248
+ generateResponsesSystemFingerprint() {
249
+ // 简单的系统指纹生成(Responses 格式)
250
+ const timestamp = Date.now().toString(36);
251
+ const random = Math.random().toString(36).substr(2, 6);
252
+ return `resp_fp_${timestamp}_${random}`;
253
+ }
254
+ /**
255
+ * 生成 Responses ID
256
+ */
257
+ generateResponsesId() {
258
+ const timestamp = Math.floor(Date.now() / 1000);
259
+ const random = Math.random().toString(36).substr(2, 8);
260
+ return `resp_${timestamp}_${random}`;
261
+ }
262
+ /**
263
+ * 验证 Responses 响应
264
+ */
265
+ validateResponsesResponse(response) {
266
+ if (!response.id) {
267
+ throw new ConversionError('OpenAI Responses response must have id', this.id);
268
+ }
269
+ if (response.object !== 'response') {
270
+ throw new ConversionError('OpenAI Responses object must be response', this.id);
271
+ }
272
+ if (!response.model) {
273
+ throw new ConversionError('OpenAI Responses response must have model', this.id);
274
+ }
275
+ if (!Array.isArray(response.choices) || response.choices.length === 0) {
276
+ throw new ConversionError('OpenAI Responses response must have choices array', this.id);
277
+ }
278
+ const choice = response.choices[0];
279
+ if (!choice.message) {
280
+ throw new ConversionError('OpenAI Responses choice must have message', this.id);
281
+ }
282
+ if (choice.message.role !== 'assistant') {
283
+ throw new ConversionError('OpenAI Responses message role must be assistant', this.id);
284
+ }
285
+ if (!Array.isArray(choice.message.content)) {
286
+ throw new ConversionError('OpenAI Responses message content must be array', this.id);
287
+ }
288
+ }
289
+ /**
290
+ * 计算 Responses token 数量
291
+ */
292
+ calculateResponsesTokens(messages) {
293
+ // 简单的 token 估算(Responses 可能有不同的计数方式)
294
+ const totalChars = messages.reduce((sum, msg) => {
295
+ const contentLength = (msg.content || '').length;
296
+ const toolCallLength = (msg.tool_calls || []).reduce((tcSum, tc) => {
297
+ return tcSum + tc.function.name.length + tc.function.arguments.length;
298
+ }, 0);
299
+ return sum + contentLength + toolCallLength;
300
+ }, 0);
301
+ // Responses 可能使用不同的 token 计算方式
302
+ return Math.ceil(totalChars / 3.8); // 简单的调整
303
+ }
304
+ /**
305
+ * 提取工具调用信息
306
+ */
307
+ extractToolCallInfo(messages) {
308
+ const assistantMessages = messages.filter(m => m.role === 'assistant' && m.tool_calls);
309
+ if (assistantMessages.length === 0) {
310
+ return { hasToolCalls: false };
311
+ }
312
+ const allToolCalls = assistantMessages.flatMap(m => m.tool_calls || []);
313
+ return {
314
+ hasToolCalls: true,
315
+ toolCallCount: allToolCalls.length,
316
+ uniqueTools: new Set(allToolCalls.map(tc => tc.function.name)).size,
317
+ toolNames: allToolCalls.map(tc => tc.function.name),
318
+ // Responses 特定信息
319
+ convertedToText: true, // Responses 转换工具调用为文本
320
+ toolDescriptions: allToolCalls.map(tc => this.createToolCallDescription(tc))
321
+ };
322
+ }
323
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * 处理节点基类
3
+ *
4
+ * 提供处理节点的通用功能
5
+ */
6
+ import { PipelineNode, NodeContext, NodeResult, NodeConfig, NodeStatus, ValidationResult, NodeType, ProcessedRequest } from '../../types/index.js';
7
+ import type { StandardizedRequest } from '../../types/index.js';
8
+ /**
9
+ * 处理节点抽象基类
10
+ *
11
+ * 提供核心处理逻辑和流程管理
12
+ */
13
+ export declare abstract class BaseProcessNode implements PipelineNode {
14
+ readonly id: string;
15
+ readonly type: NodeType.PROCESS;
16
+ readonly name: string;
17
+ config: NodeConfig;
18
+ status: NodeStatus;
19
+ constructor(id: string, type: NodeType.PROCESS, name: string, config: NodeConfig);
20
+ /**
21
+ * 主执行方法 - 实现处理节点逻辑
22
+ */
23
+ execute(context: NodeContext): Promise<NodeResult>;
24
+ /**
25
+ * 验证输入数据
26
+ */
27
+ validate(data: Record<string, unknown>): ValidationResult;
28
+ /**
29
+ * 处理 Passthrough 场景
30
+ */
31
+ private handlePassthrough;
32
+ /**
33
+ * 提取标准化请求
34
+ */
35
+ private extractStandardizedRequest;
36
+ /**
37
+ * 抽象方法:处理请求核心逻辑
38
+ */
39
+ protected abstract processRequest(standardizedRequest: StandardizedRequest, context: NodeContext): Promise<ProcessedRequest>;
40
+ /**
41
+ * 抽象方法:后置处理请求
42
+ */
43
+ protected abstract postprocessRequest(processedRequest: ProcessedRequest, context: NodeContext): Promise<ProcessedRequest>;
44
+ /**
45
+ * 创建处理摘要
46
+ */
47
+ private createProcessingSummary;
48
+ /**
49
+ * 获取失败阶段
50
+ */
51
+ private getFailureStage;
52
+ /**
53
+ * 创建错误上下文
54
+ */
55
+ private createErrorContext;
56
+ /**
57
+ * 工具方法:验证工具调用
58
+ */
59
+ protected validateToolCalls(toolCalls: unknown[]): boolean;
60
+ /**
61
+ * 工具方法:验证工具结果
62
+ */
63
+ protected validateToolResults(toolResults: unknown[]): boolean;
64
+ /**
65
+ * 工具方法:提取工具调用信息
66
+ */
67
+ protected extractToolCallsInfo(messages: any[]): Record<string, unknown>;
68
+ /**
69
+ * 工具方法:提取流式信息
70
+ */
71
+ protected extractStreamingInfo(request: StandardizedRequest): Record<string, unknown>;
72
+ }
@@ -0,0 +1,246 @@
1
+ /**
2
+ * 处理节点基类
3
+ *
4
+ * 提供处理节点的通用功能
5
+ */
6
+ import { NodeStatus, ConversionError } from '../../types/index.js';
7
+ /**
8
+ * 处理节点抽象基类
9
+ *
10
+ * 提供核心处理逻辑和流程管理
11
+ */
12
+ export class BaseProcessNode {
13
+ id;
14
+ type;
15
+ name;
16
+ config;
17
+ status = NodeStatus.IDLE;
18
+ constructor(id, type, name, config) {
19
+ this.id = id;
20
+ this.type = type;
21
+ this.name = name;
22
+ this.config = config;
23
+ }
24
+ /**
25
+ * 主执行方法 - 实现处理节点逻辑
26
+ */
27
+ async execute(context) {
28
+ const startTime = Date.now();
29
+ try {
30
+ this.status = NodeStatus.RUNNING;
31
+ // 1. 验证输入数据
32
+ const validation = this.validate(context.data);
33
+ if (!validation.valid) {
34
+ throw new ConversionError(`Process node validation failed: ${validation.errors.map(e => e.message).join(', ')}`, this.id, 'validation', new Error(validation.errors[0]?.message));
35
+ }
36
+ // 2. Passthrough 检查
37
+ if (context.pipeline.isPassthrough) {
38
+ return this.handlePassthrough(context, startTime);
39
+ }
40
+ // 3. 提取标准化请求
41
+ const standardizedRequest = this.extractStandardizedRequest(context.data);
42
+ // 4. 执行核心处理逻辑
43
+ const processedRequest = await this.processRequest(standardizedRequest, context);
44
+ // 5. 后置处理和验证
45
+ const finalResult = await this.postprocessRequest(processedRequest, context);
46
+ this.status = NodeStatus.COMPLETED;
47
+ return {
48
+ success: true,
49
+ data: {
50
+ processedRequest: finalResult,
51
+ processingSummary: this.createProcessingSummary(standardizedRequest, finalResult)
52
+ },
53
+ metadata: {
54
+ node: this.id,
55
+ executionTime: Date.now() - startTime,
56
+ startTime,
57
+ endTime: Date.now(),
58
+ dataProcessed: {
59
+ messages: finalResult.messages.length,
60
+ tools: finalResult.tools?.length || 0
61
+ }
62
+ }
63
+ };
64
+ }
65
+ catch (error) {
66
+ this.status = NodeStatus.FAILED;
67
+ return {
68
+ success: false,
69
+ error: {
70
+ code: 'PROCESS_NODE_ERROR',
71
+ message: error instanceof Error ? error.message : 'Unknown error during processing',
72
+ details: {
73
+ node: this.id,
74
+ stage: this.getFailureStage(error),
75
+ context: this.createErrorContext(context)
76
+ },
77
+ cause: error instanceof Error ? error : undefined
78
+ },
79
+ metadata: {
80
+ node: this.id,
81
+ executionTime: Date.now() - startTime,
82
+ startTime,
83
+ endTime: Date.now()
84
+ }
85
+ };
86
+ }
87
+ }
88
+ /**
89
+ * 验证输入数据
90
+ */
91
+ validate(data) {
92
+ const errors = [];
93
+ // 验证是否包含标准化请求
94
+ if (!data.standardizedRequest) {
95
+ errors.push({
96
+ field: 'standardizedRequest',
97
+ message: 'Standardized request is required for processing',
98
+ code: 'MISSING_STANDARDIZED_REQUEST',
99
+ value: undefined
100
+ });
101
+ }
102
+ return {
103
+ valid: errors.length === 0,
104
+ errors,
105
+ warnings: []
106
+ };
107
+ }
108
+ /**
109
+ * 处理 Passthrough 场景
110
+ */
111
+ handlePassthrough(context, startTime) {
112
+ const originalData = (context.data && typeof context.data === 'object')
113
+ ? { ...context.data }
114
+ : {};
115
+ const passthroughResult = {
116
+ ...originalData,
117
+ passthrough: true
118
+ };
119
+ if (!passthroughResult.processedRequest && passthroughResult.standardizedRequest) {
120
+ passthroughResult.processedRequest = passthroughResult.standardizedRequest;
121
+ }
122
+ return {
123
+ success: true,
124
+ data: passthroughResult,
125
+ metadata: {
126
+ node: this.id,
127
+ executionTime: Date.now() - startTime,
128
+ startTime,
129
+ endTime: Date.now(),
130
+ dataProcessed: {
131
+ messages: 0,
132
+ tools: 0
133
+ }
134
+ }
135
+ };
136
+ }
137
+ /**
138
+ * 提取标准化请求
139
+ */
140
+ extractStandardizedRequest(data) {
141
+ if (!data.standardizedRequest || typeof data.standardizedRequest !== 'object') {
142
+ throw new ConversionError('Valid standardized request is required', this.id);
143
+ }
144
+ const standardizedRequest = data.standardizedRequest;
145
+ // 验证标准化请求的基本结构
146
+ if (!standardizedRequest.model) {
147
+ throw new ConversionError('Standardized request must have a model', this.id);
148
+ }
149
+ if (!Array.isArray(standardizedRequest.messages)) {
150
+ throw new ConversionError('Standardized request must have messages array', this.id);
151
+ }
152
+ return standardizedRequest;
153
+ }
154
+ /**
155
+ * 创建处理摘要
156
+ */
157
+ createProcessingSummary(standardizedRequest, processedRequest) {
158
+ return {
159
+ inputMessages: standardizedRequest.messages.length,
160
+ outputMessages: processedRequest.messages.length,
161
+ inputTools: standardizedRequest.tools?.length || 0,
162
+ outputTools: processedRequest.tools?.length || 0,
163
+ appliedRules: processedRequest.processed.appliedRules,
164
+ status: processedRequest.processed.status,
165
+ processingTime: processedRequest.processed.timestamp
166
+ };
167
+ }
168
+ /**
169
+ * 获取失败阶段
170
+ */
171
+ getFailureStage(error) {
172
+ if (error instanceof ConversionError) {
173
+ if (error.message.includes('validation'))
174
+ return 'validation';
175
+ if (error.message.includes('processing'))
176
+ return 'processing';
177
+ if (error.message.includes('standardized'))
178
+ return 'input_extraction';
179
+ }
180
+ return 'unknown';
181
+ }
182
+ /**
183
+ * 创建错误上下文
184
+ */
185
+ createErrorContext(context) {
186
+ return {
187
+ nodeId: this.id,
188
+ pipelineStep: context.pipeline.currentNode,
189
+ previousNodes: context.pipeline.previousResults.map(r => r.metadata.node),
190
+ isPassthrough: context.pipeline.isPassthrough,
191
+ pipelineStartTime: context.pipeline.startTime
192
+ };
193
+ }
194
+ /**
195
+ * 工具方法:验证工具调用
196
+ */
197
+ validateToolCalls(toolCalls) {
198
+ if (!Array.isArray(toolCalls))
199
+ return false;
200
+ return toolCalls.every(tc => {
201
+ if (!tc || typeof tc !== 'object')
202
+ return false;
203
+ const tcObj = tc;
204
+ return (typeof tcObj.id === 'string'
205
+ && tcObj.type === 'function'
206
+ && !!tcObj.function
207
+ && typeof tcObj.function === 'object');
208
+ });
209
+ }
210
+ /**
211
+ * 工具方法:验证工具结果
212
+ */
213
+ validateToolResults(toolResults) {
214
+ if (!Array.isArray(toolResults))
215
+ return false;
216
+ return toolResults.every(tr => {
217
+ if (!tr || typeof tr !== 'object')
218
+ return false;
219
+ const trObj = tr;
220
+ return (typeof trObj.tool_call_id === 'string'
221
+ && trObj.content !== undefined);
222
+ });
223
+ }
224
+ /**
225
+ * 工具方法:提取工具调用信息
226
+ */
227
+ extractToolCallsInfo(messages) {
228
+ const toolCallMessages = messages.filter(m => m.role === 'assistant' && m.tool_calls);
229
+ const toolResultMessages = messages.filter(m => m.role === 'tool');
230
+ return {
231
+ toolCallCount: toolCallMessages.reduce((sum, m) => sum + (m.tool_calls?.length || 0), 0),
232
+ toolResultCount: toolResultMessages.length,
233
+ hasToolCalls: toolCallMessages.length > 0,
234
+ hasToolResults: toolResultMessages.length > 0
235
+ };
236
+ }
237
+ /**
238
+ * 工具方法:提取流式信息
239
+ */
240
+ extractStreamingInfo(request) {
241
+ return {
242
+ enabled: request.metadata.stream === true,
243
+ originalStreaming: request.parameters.stream
244
+ };
245
+ }
246
+ }