@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
@@ -1,854 +0,0 @@
1
- /**
2
- * Chat 处理节点
3
- *
4
- * 负责核心的 Chat 处理逻辑,包括工具调用处理、上下文管理等
5
- */
6
- import { BaseProcessNode } from './base-process-node.js';
7
- import { NodeType, ConversionError } from '../../types/index.js';
8
- import { runChatRequestToolFilters } from '../../../shared/tool-filter-pipeline.js';
9
- /**
10
- * Chat 处理节点实现
11
- *
12
- * 执行 Chat 请求的核心处理逻辑
13
- */
14
- export class ChatProcessNode extends BaseProcessNode {
15
- constructor(config) {
16
- super('chat-process', NodeType.PROCESS, 'Chat Process Node', config);
17
- }
18
- /**
19
- * 处理请求核心逻辑
20
- */
21
- async processRequest(standardizedRequest, context) {
22
- const processingStartTime = Date.now();
23
- const governedRequest = await this.applyRequestToolGovernance(standardizedRequest, context);
24
- const normalizedRequest = this.normalizeToolPayload(governedRequest);
25
- // 1. 并行执行各项处理
26
- const [processedMessages, toolCallResult, contextResult, streamingResult, parameterProcessing] = await Promise.all([
27
- this.processMessages(normalizedRequest.messages, context),
28
- this.processToolCalls(normalizedRequest.messages, normalizedRequest.tools, context),
29
- this.processContext(normalizedRequest.metadata, context),
30
- this.processStreaming(normalizedRequest.parameters, context),
31
- this.processParameters(normalizedRequest.parameters, context)
32
- ]);
33
- // 2. 应用业务规则和优化(仅消息优化,保持工具列表不变)
34
- const optimizedMessages = await this.optimizeMessages(processedMessages, toolCallResult, contextResult);
35
- // 移除破坏性的工具优化,保持原有工具列表以支持服务器工具注入
36
- const optimizedTools = normalizedRequest.tools;
37
- // 3. 构建处理后的请求
38
- const processedRequest = {
39
- ...normalizedRequest,
40
- messages: optimizedMessages,
41
- tools: optimizedTools,
42
- parameters: {
43
- ...normalizedRequest.parameters,
44
- ...parameterProcessing
45
- },
46
- processed: {
47
- timestamp: processingStartTime,
48
- appliedRules: [
49
- 'tool-call-processing',
50
- 'context-management',
51
- 'streaming-handling',
52
- 'parameter-normalization'
53
- ],
54
- status: this.determineProcessingStatus(toolCallResult, contextResult)
55
- },
56
- processingMetadata: {
57
- toolCalls: toolCallResult.requiresToolExecution ? [
58
- {
59
- tool_call_id: 'unknown',
60
- status: 'pending',
61
- result: undefined,
62
- error: undefined,
63
- executionTime: undefined
64
- }
65
- ] : undefined,
66
- streaming: streamingResult,
67
- context: contextResult
68
- }
69
- };
70
- return processedRequest;
71
- }
72
- /**
73
- * 后置处理请求
74
- */
75
- async postprocessRequest(processedRequest, context) {
76
- // 1. 最终验证
77
- this.validateProcessedRequest(processedRequest);
78
- // 2. 应用优化策略
79
- const optimizedRequest = await this.applyOptimizations(processedRequest, context);
80
- // 3. 更新处理状态
81
- optimizedRequest.processed.timestamp = Date.now();
82
- return optimizedRequest;
83
- }
84
- /**
85
- * 工具治理:在 Process 节点内部统一处理
86
- */
87
- async applyRequestToolGovernance(request, context) {
88
- try {
89
- const entryEndpointRaw = context.request.context?.['entryEndpoint'];
90
- const entryEndpoint = typeof entryEndpointRaw === 'string'
91
- ? entryEndpointRaw
92
- : context.request.endpoint || '/v1/chat/completions';
93
- const rawMetadata = context.request.context?.['metadata'];
94
- const metadata = rawMetadata && typeof rawMetadata === 'object'
95
- ? { ...rawMetadata }
96
- : {};
97
- const providerProtocol = typeof metadata.providerProtocol === 'string'
98
- ? metadata.providerProtocol
99
- : typeof metadata.provider === 'string'
100
- ? metadata.provider
101
- : 'openai-chat';
102
- const metadataToolHints = metadata['toolFilterHints'];
103
- const metadataStreamFlag = metadata['stream'];
104
- const metadataStream = typeof metadataStreamFlag === 'boolean'
105
- ? metadataStreamFlag
106
- : request.parameters?.stream === true;
107
- const profile = { outgoingProtocol: providerProtocol };
108
- const toolContext = {
109
- requestId: context.request.id,
110
- entryEndpoint,
111
- metadata: {
112
- ...metadata,
113
- toolFilterHints: metadataToolHints,
114
- stream: metadataStream
115
- }
116
- };
117
- const shaped = {
118
- model: request.model,
119
- messages: this.deepClone(request.messages),
120
- tools: request.tools ? this.deepClone(request.tools) : undefined,
121
- tool_choice: request.parameters?.tool_choice,
122
- stream: request.parameters?.stream === true,
123
- parameters: { ...request.parameters }
124
- };
125
- // 运行完整的工具治理流程,获取所有治理结果
126
- const governed = await runChatRequestToolFilters(shaped, {
127
- entryEndpoint,
128
- requestId: context.request.id,
129
- model: request.model,
130
- profile: profile.outgoingProtocol,
131
- stream: toolContext.metadata?.stream === true,
132
- toolFilterHints: metadataToolHints
133
- });
134
- // 完整复制治理结果,不丢弃任何信息
135
- const finalRequest = {
136
- ...request,
137
- // 保留所有governed结果
138
- ...governed,
139
- // 确保元数据正确设置,优先使用governed结果
140
- metadata: {
141
- ...request.metadata,
142
- toolChoice: governed?.tool_choice,
143
- originalStream: request.parameters?.stream === true,
144
- stream: governed?.stream !== undefined ? governed.stream : request.parameters?.stream,
145
- governedTools: governed?.tools !== undefined,
146
- governanceTimestamp: Date.now()
147
- }
148
- };
149
- // 确保tools正确设置
150
- if (governed?.tools !== undefined) {
151
- finalRequest.tools = this.castGovernedTools(governed.tools);
152
- }
153
- // 关键修复:确保governed的顶级参数(如stream)正确传播到parameters
154
- // 这确保下游节点使用治理后的参数值,而不是原始值
155
- if (governed?.stream !== undefined) {
156
- finalRequest.parameters = {
157
- ...finalRequest.parameters,
158
- stream: governed.stream
159
- };
160
- }
161
- // 确保tool_choice正确设置
162
- if (governed?.tool_choice !== undefined) {
163
- finalRequest.parameters = {
164
- ...finalRequest.parameters,
165
- tool_choice: governed.tool_choice
166
- };
167
- }
168
- return finalRequest;
169
- }
170
- catch {
171
- return request;
172
- }
173
- }
174
- /**
175
- * 深拷贝工具/消息,避免 FilterEngine 副作用
176
- */
177
- deepClone(value) {
178
- if (value === undefined)
179
- return value;
180
- return JSON.parse(JSON.stringify(value));
181
- }
182
- /**
183
- * 过滤器输出 → 标准化工具定义
184
- */
185
- castGovernedTools(tools) {
186
- if (!Array.isArray(tools))
187
- return [];
188
- const normalized = [];
189
- for (const tool of tools) {
190
- // 1) 优先按标准 function 形状解析
191
- const converted = this.castSingleTool(tool);
192
- if (converted) {
193
- normalized.push(converted);
194
- continue;
195
- }
196
- // 2) 兼容 custom 形状映射(例如 apply_patch 自定义工具)
197
- const custom = this.castCustomTool(tool);
198
- if (custom) {
199
- normalized.push(custom);
200
- continue;
201
- }
202
- }
203
- return normalized;
204
- }
205
- castSingleTool(tool) {
206
- if (!tool || typeof tool !== 'object')
207
- return null;
208
- const toolObj = tool;
209
- const fn = toolObj.function;
210
- if (!fn || typeof fn !== 'object')
211
- return null;
212
- const fnObj = fn;
213
- const name = typeof fnObj.name === 'string' ? fnObj.name : undefined;
214
- if (!name)
215
- return null;
216
- const parameters = this.castToolParameters(fnObj.parameters);
217
- const description = typeof fnObj.description === 'string' ? fnObj.description : undefined;
218
- const strictFlag = fnObj.strict === true || toolObj.strict === true;
219
- return {
220
- type: 'function',
221
- function: {
222
- name,
223
- description,
224
- parameters,
225
- strict: strictFlag ? true : undefined
226
- }
227
- };
228
- }
229
- castToolParameters(params) {
230
- if (params && typeof params === 'object' && !Array.isArray(params)) {
231
- const paramsObj = params;
232
- const properties = paramsObj.properties && typeof paramsObj.properties === 'object'
233
- ? paramsObj.properties
234
- : {};
235
- const required = Array.isArray(paramsObj.required)
236
- ? paramsObj.required
237
- : undefined;
238
- const additionalProperties = typeof paramsObj.additionalProperties === 'boolean'
239
- ? paramsObj.additionalProperties
240
- : undefined;
241
- return {
242
- type: 'object',
243
- properties,
244
- required,
245
- additionalProperties
246
- };
247
- }
248
- return {
249
- type: 'object',
250
- properties: {},
251
- additionalProperties: true
252
- };
253
- }
254
- /**
255
- * 将常见的自定义工具映射为标准 function 工具。
256
- * 目前仅内置 apply_patch 的规范化:
257
- * - 输入 custom 形状(例如 { type:'custom', name:'apply_patch', ... })
258
- * - 输出 { type:'function', function:{ name:'apply_patch', parameters:{ patch:string } } }
259
- */
260
- castCustomTool(tool) {
261
- try {
262
- if (!tool || typeof tool !== 'object')
263
- return null;
264
- const t = tool;
265
- const type = typeof t.type === 'string' ? t.type.toLowerCase() : '';
266
- const name = typeof t.name === 'string' ? String(t.name) : '';
267
- if (type !== 'custom' || !name)
268
- return null;
269
- // 仅为 apply_patch 提供内置映射,其它 custom 工具保持由治理/白名单控制
270
- if (name.trim() === 'apply_patch') {
271
- const description = typeof t.description === 'string' ? t.description : undefined;
272
- // 规范化为要求一个字符串字段 patch 的函数工具
273
- const parameters = {
274
- type: 'object',
275
- properties: {
276
- patch: { type: 'string', description: 'Unified diff patch content (FREEFORM, not JSON)' }
277
- },
278
- required: ['patch'],
279
- additionalProperties: false
280
- };
281
- return {
282
- type: 'function',
283
- function: {
284
- name: 'apply_patch',
285
- description: description,
286
- parameters,
287
- strict: true
288
- }
289
- };
290
- }
291
- return null;
292
- }
293
- catch {
294
- return null;
295
- }
296
- }
297
- /**
298
- * 处理消息
299
- */
300
- async processMessages(messages, context) {
301
- const processedMessages = [];
302
- for (const message of messages) {
303
- try {
304
- const processedMessage = await this.processSingleMessage(message, context);
305
- processedMessages.push(processedMessage);
306
- }
307
- catch (error) {
308
- throw new ConversionError(`Failed to process message with role ${message.role}: ${error instanceof Error ? error.message : 'Unknown error'}`, this.id, 'message_processing', error instanceof Error ? error : undefined);
309
- }
310
- }
311
- return this.enforceToolResponseOrdering(processedMessages);
312
- }
313
- enforceToolResponseOrdering(messages) {
314
- if (!messages.length) {
315
- return messages;
316
- }
317
- const ordered = [];
318
- const assistantMap = new Map();
319
- const append = (message) => {
320
- ordered.push(message);
321
- };
322
- for (const message of messages) {
323
- if (message.role === 'assistant' && Array.isArray(message.tool_calls) && message.tool_calls.length > 0) {
324
- append(message);
325
- for (const toolCall of message.tool_calls) {
326
- if (toolCall?.id) {
327
- assistantMap.set(toolCall.id, { message, inserted: 0 });
328
- }
329
- }
330
- continue;
331
- }
332
- if (message.role === 'tool' && typeof message.tool_call_id === 'string' && message.tool_call_id.trim()) {
333
- const meta = assistantMap.get(message.tool_call_id.trim());
334
- if (meta) {
335
- const baseIndex = ordered.indexOf(meta.message);
336
- if (baseIndex >= 0) {
337
- const insertPos = baseIndex + 1 + meta.inserted;
338
- ordered.splice(insertPos, 0, message);
339
- meta.inserted += 1;
340
- continue;
341
- }
342
- }
343
- }
344
- append(message);
345
- }
346
- return ordered;
347
- }
348
- /**
349
- * 处理单个消息
350
- */
351
- async processSingleMessage(message, context) {
352
- const processedMessage = {
353
- role: message.role,
354
- content: message.content
355
- };
356
- // 处理内容
357
- if (message.content !== null && message.content !== undefined) {
358
- processedMessage.content = this.processMessageContent(message.content, context);
359
- }
360
- // 处理工具调用
361
- if (message.tool_calls && message.tool_calls.length > 0) {
362
- if (!this.validateToolCalls(message.tool_calls)) {
363
- throw new ConversionError(`Invalid tool_calls format in message with role ${message.role}`, this.id, 'validation');
364
- }
365
- processedMessage.tool_calls = message.tool_calls.map(tc => {
366
- const normalized = this.normalizeToolCallArguments(tc.function.name, tc.function.arguments);
367
- return {
368
- ...tc,
369
- function: {
370
- name: normalized.name,
371
- arguments: normalized.arguments
372
- }
373
- };
374
- });
375
- }
376
- // 处理工具调用ID(仅 tool 角色)
377
- if (message.tool_call_id) {
378
- if (typeof message.tool_call_id !== 'string' || !message.tool_call_id.trim()) {
379
- throw new ConversionError('tool_call_id must be a non-empty string', this.id, 'validation');
380
- }
381
- processedMessage.tool_call_id = message.tool_call_id.trim();
382
- }
383
- // 保留其他元数据
384
- if (message.name) {
385
- processedMessage.name = message.name;
386
- }
387
- if (message.metadata) {
388
- processedMessage.metadata = { ...message.metadata };
389
- }
390
- return processedMessage;
391
- }
392
- /**
393
- * 处理消息内容
394
- */
395
- processMessageContent(content, context) {
396
- if (typeof content !== 'string') {
397
- try {
398
- content = String(content);
399
- }
400
- catch {
401
- throw new ConversionError('Message content must be convertible to string', this.id, 'content_processing');
402
- }
403
- }
404
- // 内容清理和标准化
405
- return content
406
- .trim()
407
- .replace(/\r\n/g, '\n') // 标准化换行符
408
- .replace(/\n{3,}/g, '\n\n'); // 减少多余空行
409
- }
410
- /**
411
- * 处理工具调用
412
- */
413
- async processToolCalls(messages, tools, context) {
414
- const toolCallMessages = messages.filter(m => m.role === 'assistant' && m.tool_calls);
415
- const toolResultMessages = messages.filter(m => m.role === 'tool');
416
- const processedToolCalls = [];
417
- const toolResults = [];
418
- const missingResults = [];
419
- // 处理工具调用
420
- for (const message of toolCallMessages) {
421
- if (message.tool_calls) {
422
- for (const toolCall of message.tool_calls) {
423
- // 验证工具调用是否在可用工具列表中
424
- if (tools && !this.isToolAvailable(toolCall.function.name, tools)) {
425
- throw new ConversionError(`Tool '${toolCall.function.name}' is not available in the tools list`, this.id, 'tool_validation');
426
- }
427
- const normalized = this.normalizeToolCallArguments(toolCall.function.name, toolCall.function.arguments);
428
- processedToolCalls.push({
429
- id: toolCall.id,
430
- type: toolCall.type,
431
- function: {
432
- name: normalized.name,
433
- arguments: normalized.arguments
434
- }
435
- });
436
- // 检查是否有对应的工具结果
437
- const hasResult = toolResultMessages.some(tr => tr.tool_call_id === toolCall.id);
438
- if (!hasResult) {
439
- missingResults.push(toolCall.id);
440
- }
441
- }
442
- }
443
- }
444
- // 处理工具结果
445
- for (const message of toolResultMessages) {
446
- if (!this.validateToolResults([message])) {
447
- throw new ConversionError(`Invalid tool result format for tool_call_id: ${message.tool_call_id}`, this.id, 'tool_validation');
448
- }
449
- toolResults.push(message);
450
- }
451
- return {
452
- processedToolCalls: processedToolCalls.length > 0 ? processedToolCalls : undefined,
453
- toolResults,
454
- requiresToolExecution: processedToolCalls.length > 0 && missingResults.length > 0,
455
- missingResults
456
- };
457
- }
458
- /**
459
- * 处理上下文
460
- */
461
- async processContext(metadata, context) {
462
- const contextResult = {
463
- systemPrompt: undefined,
464
- conversationHistory: [],
465
- relevantContext: {},
466
- contextSize: 0
467
- };
468
- // 提取系统提示词
469
- if (metadata.capturedContext?.systemPrompt) {
470
- const systemPrompt = metadata.capturedContext.systemPrompt;
471
- if (typeof systemPrompt === 'string') {
472
- contextResult.systemPrompt = systemPrompt.trim();
473
- }
474
- }
475
- // 提取对话历史
476
- if (metadata.capturedContext?.conversationHistory) {
477
- const history = metadata.capturedContext.conversationHistory;
478
- if (Array.isArray(history)) {
479
- contextResult.conversationHistory = history
480
- .filter(h => typeof h === 'string')
481
- .map(h => h.trim());
482
- }
483
- }
484
- // 提取相关上下文
485
- if (metadata.capturedContext?.relevantContext) {
486
- const relevantContext = metadata.capturedContext.relevantContext;
487
- if (relevantContext && typeof relevantContext === 'object') {
488
- contextResult.relevantContext = relevantContext;
489
- }
490
- }
491
- // 计算上下文大小
492
- contextResult.contextSize =
493
- (contextResult.systemPrompt?.length || 0) +
494
- contextResult.conversationHistory.reduce((sum, h) => sum + h.length, 0) +
495
- JSON.stringify(contextResult.relevantContext).length;
496
- return contextResult;
497
- }
498
- /**
499
- * 处理流式
500
- */
501
- async processStreaming(parameters, context) {
502
- const stream = parameters?.stream;
503
- const streamingResult = {
504
- enabled: stream === true,
505
- chunkSize: 1000, // 默认块大小
506
- streamingFormat: 'sse' // 默认使用 SSE
507
- };
508
- if (streamingResult.enabled) {
509
- // 根据上下文确定流式格式
510
- if (context.request.options?.streamingFormat) {
511
- const format = context.request.options.streamingFormat;
512
- if (['sse', 'websocket', 'polling'].includes(format)) {
513
- streamingResult.streamingFormat = format;
514
- }
515
- }
516
- // 处理最大token数
517
- if (parameters?.max_tokens) {
518
- const maxTokens = parameters.max_tokens;
519
- if (typeof maxTokens === 'number' && maxTokens > 0) {
520
- streamingResult.maxTokens = maxTokens;
521
- }
522
- }
523
- }
524
- return streamingResult;
525
- }
526
- /**
527
- * 处理参数
528
- */
529
- async processParameters(parameters, context) {
530
- const processedParams = { ...parameters };
531
- // 参数标准化和验证
532
- const STANDARD_PARAMS = ['temperature', 'top_p', 'frequency_penalty', 'presence_penalty'];
533
- for (const param of STANDARD_PARAMS) {
534
- if (param in processedParams) {
535
- const value = processedParams[param];
536
- if (typeof value === 'number') {
537
- // 确保数值在合理范围内
538
- processedParams[param] = this.clampParameterValue(param, value);
539
- }
540
- else {
541
- throw new ConversionError(`Parameter '${param}' must be a number, got ${typeof value}`, this.id, 'parameter_validation');
542
- }
543
- }
544
- }
545
- return processedParams;
546
- }
547
- /**
548
- * 优化消息
549
- */
550
- async optimizeMessages(messages, toolCallResult, contextResult) {
551
- let optimizedMessages = [...messages];
552
- // 1. 如果有系统提示词且没有系统消息,添加系统消息
553
- if (contextResult.systemPrompt && !optimizedMessages.some(m => m.role === 'system')) {
554
- optimizedMessages.unshift({
555
- role: 'system',
556
- content: contextResult.systemPrompt
557
- });
558
- }
559
- // 2. 保持消息原始顺序,维护对话语义
560
- // 移除破坏性的角色重排序,保持用户/工具交错对话的时间顺序
561
- // 3. 移除重复的工具结果
562
- if (toolCallResult.toolResults.length > 0) {
563
- optimizedMessages = this.deduplicateToolResults(optimizedMessages);
564
- }
565
- return optimizedMessages;
566
- }
567
- // optimizeTools方法已移除 - 原实现会破坏服务器工具注入
568
- // 保留原有工具列表不变,确保MCP hook和RequestToolListFilter能够正常工作
569
- /**
570
- * 验证处理后的请求
571
- */
572
- validateProcessedRequest(request) {
573
- if (!request.messages || !Array.isArray(request.messages)) {
574
- throw new ConversionError('Processed request must have messages array', this.id, 'validation');
575
- }
576
- if (request.messages.length === 0) {
577
- throw new ConversionError('Processed request messages array cannot be empty', this.id, 'validation');
578
- }
579
- if (!request.model) {
580
- throw new ConversionError('Processed request must have model', this.id, 'validation');
581
- }
582
- }
583
- /**
584
- * 应用优化策略
585
- */
586
- async applyOptimizations(request, context) {
587
- // 应用缓存策略
588
- const cachedRequest = this.applyCaching(request, context);
589
- // 应用压缩策略
590
- const compressedRequest = this.applyCompression(cachedRequest, context);
591
- return compressedRequest;
592
- }
593
- /**
594
- * 应用缓存策略
595
- */
596
- applyCaching(request, context) {
597
- // 简单的缓存逻辑,实际实现可能更复杂
598
- return request;
599
- }
600
- /**
601
- * 应用压缩策略
602
- */
603
- applyCompression(request, context) {
604
- // 简单的压缩逻辑,实际实现可能更复杂
605
- return request;
606
- }
607
- /**
608
- * 确定处理状态
609
- */
610
- determineProcessingStatus(toolCallResult, contextResult) {
611
- if (toolCallResult.requiresToolExecution && toolCallResult.missingResults.length > 0) {
612
- return 'partial';
613
- }
614
- if (contextResult.contextSize > 100000) { // 上下文过大警告
615
- return 'partial';
616
- }
617
- return 'success';
618
- }
619
- /**
620
- * 工具方法:限制参数值
621
- */
622
- clampParameterValue(param, value) {
623
- const limits = {
624
- temperature: [0, 2],
625
- top_p: [0, 1],
626
- frequency_penalty: [-2, 2],
627
- presence_penalty: [-2, 2]
628
- };
629
- const [min, max] = limits[param] || [0, 100];
630
- return Math.max(min, Math.min(max, value));
631
- }
632
- // ensureMessageOrder方法已移除 - 原实现会破坏对话的时间顺序语义
633
- // 保持消息原始顺序,维护用户/工具交错对话的语义完整性
634
- /**
635
- * 工具方法:去重工具结果
636
- */
637
- deduplicateToolResults(messages) {
638
- const seenToolCallIds = new Set();
639
- return messages.filter(message => {
640
- if (message.role === 'tool' && message.tool_call_id) {
641
- if (seenToolCallIds.has(message.tool_call_id)) {
642
- return false; // 重复的工具结果
643
- }
644
- seenToolCallIds.add(message.tool_call_id);
645
- }
646
- return true;
647
- });
648
- }
649
- /**
650
- * 工具方法:检查工具是否可用
651
- */
652
- isToolAvailable(toolName, tools) {
653
- return tools.some(tool => tool.function.name === toolName);
654
- }
655
- /**
656
- * 统一规范化工具调用参数(含 TOON 解码)
657
- *
658
- * - 默认启用 TOON(RCC_TOON_ENABLE/ROUTECODEX_TOON_ENABLE = 0|false|off 时关闭)
659
- * - 当 arguments 形如 {"toon":"key: value\\n..."} 且可解析时:
660
- * - 提取 command / workdir 字段
661
- * - 将 arguments 归一为 {"command": "...", "workdir"?: "..."} 的 JSON 字符串
662
- * - 工具名 shell_toon 归一为 shell
663
- * - 解码失败时保持原始 name/arguments 不变(Fail Fast 不隐式修复)
664
- */
665
- normalizeToolCallArguments(toolName, rawArguments) {
666
- let name = toolName;
667
- let args = rawArguments;
668
- if (!this.isToonEnabled()) {
669
- return { name, arguments: args };
670
- }
671
- if (typeof rawArguments !== 'string') {
672
- return { name, arguments: args };
673
- }
674
- const trimmed = rawArguments.trim();
675
- if (!trimmed) {
676
- return { name, arguments: args };
677
- }
678
- try {
679
- const parsed = JSON.parse(trimmed);
680
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
681
- return { name, arguments: args };
682
- }
683
- const toon = parsed.toon;
684
- if (typeof toon !== 'string' || !toon.trim()) {
685
- return { name, arguments: args };
686
- }
687
- const kv = this.decodeToonPairs(toon);
688
- if (!kv) {
689
- return { name, arguments: args };
690
- }
691
- const command = kv['command'];
692
- const workdir = kv['workdir'];
693
- if (typeof command === 'string' && command.trim()) {
694
- const merged = { command };
695
- if (typeof workdir === 'string' && workdir.trim()) {
696
- merged.workdir = workdir;
697
- }
698
- try {
699
- args = JSON.stringify(merged);
700
- }
701
- catch {
702
- // JSON.stringify 失败时保持原始 arguments
703
- return { name, arguments: rawArguments };
704
- }
705
- if (name === 'shell_toon') {
706
- name = 'shell';
707
- }
708
- }
709
- }
710
- catch {
711
- // 解析失败时保持原始 name/arguments
712
- return { name, arguments: args };
713
- }
714
- return { name, arguments: args };
715
- }
716
- /**
717
- * TOON 是否启用(默认启用,可通过环境变量关闭)
718
- */
719
- isToonEnabled() {
720
- try {
721
- const env = String(process?.env?.RCC_TOON_ENABLE ??
722
- process?.env?.ROUTECODEX_TOON_ENABLE ??
723
- '').toLowerCase();
724
- if (!env)
725
- return true;
726
- return !(env === '0' || env === 'false' || env === 'off');
727
- }
728
- catch {
729
- return true;
730
- }
731
- }
732
- /**
733
- * 解析 TOON key: value 文本为键值对
734
- */
735
- decodeToonPairs(toon) {
736
- try {
737
- const out = {};
738
- const lines = String(toon).split(/\r?\n/);
739
- for (const raw of lines) {
740
- const line = raw.trim();
741
- if (!line)
742
- continue;
743
- const m = line.match(/^([A-Za-z0-9_\-]+)\s*:\s*(.*)$/);
744
- if (!m)
745
- return null;
746
- const key = m[1];
747
- const val = m[2];
748
- out[key] = val;
749
- }
750
- return out;
751
- }
752
- catch {
753
- return null;
754
- }
755
- }
756
- /**
757
- * 工具治理入口:清理空 description、补齐 parameters
758
- */
759
- normalizeToolPayload(request) {
760
- const normalizedMessages = request.messages.map(message => {
761
- const cloned = { ...message };
762
- if (Array.isArray(message.tool_calls)) {
763
- cloned.tool_calls = message.tool_calls
764
- .map(tc => this.normalizeToolCall(tc))
765
- .filter((tc) => Boolean(tc));
766
- }
767
- return cloned;
768
- });
769
- const normalizedTools = request.tools
770
- ? request.tools
771
- .map(tool => this.normalizeToolDefinition(tool))
772
- .filter((tool) => Boolean(tool))
773
- : undefined;
774
- return {
775
- ...request,
776
- messages: normalizedMessages,
777
- tools: normalizedTools
778
- };
779
- }
780
- normalizeToolDefinition(tool) {
781
- if (!tool || typeof tool !== 'object')
782
- return null;
783
- const fn = tool.function || {};
784
- const name = typeof fn.name === 'string' ? fn.name : '';
785
- if (!name.trim())
786
- return null;
787
- const description = typeof fn.description === 'string' && fn.description.trim().length > 0
788
- ? fn.description.trim()
789
- : undefined;
790
- const parameters = this.ensureObjectSchema(fn.parameters);
791
- const strict = fn.strict === true ? true : undefined;
792
- return {
793
- type: 'function',
794
- function: {
795
- name: name.trim(),
796
- description,
797
- parameters,
798
- strict
799
- }
800
- };
801
- }
802
- ensureObjectSchema(params) {
803
- if (!params || typeof params !== 'object') {
804
- return {
805
- type: 'object',
806
- properties: {},
807
- additionalProperties: true
808
- };
809
- }
810
- const properties = params.properties && typeof params.properties === 'object'
811
- ? params.properties
812
- : {};
813
- const required = Array.isArray(params.required)
814
- ? params.required.filter((item) => typeof item === 'string' && item.trim().length > 0)
815
- : undefined;
816
- const additionalProperties = typeof params.additionalProperties === 'boolean'
817
- ? params.additionalProperties
818
- : true;
819
- const schema = {
820
- type: 'object',
821
- properties,
822
- additionalProperties
823
- };
824
- if (required && required.length > 0) {
825
- schema.required = required;
826
- }
827
- return schema;
828
- }
829
- normalizeToolCall(toolCall) {
830
- if (!toolCall || typeof toolCall !== 'object')
831
- return null;
832
- const fn = toolCall.function || {};
833
- const name = typeof fn.name === 'string' ? fn.name : '';
834
- if (!name.trim())
835
- return null;
836
- return {
837
- id: toolCall.id,
838
- type: 'function',
839
- function: {
840
- name: name.trim(),
841
- arguments: typeof fn.arguments === 'string'
842
- ? fn.arguments
843
- : (() => {
844
- try {
845
- return JSON.stringify(fn.arguments ?? {});
846
- }
847
- catch {
848
- return '{}';
849
- }
850
- })()
851
- }
852
- };
853
- }
854
- }