@jsonstudio/llms 0.4.3 → 0.4.4

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 (416) 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 +4 -2
  6. package/dist/conversion/hub/pipeline/hub-pipeline.js +4 -5
  7. package/dist/conversion/hub/process/chat-process.js +258 -41
  8. package/dist/conversion/hub/response/provider-response.js +8 -2
  9. package/dist/conversion/hub/tool-governance/engine.d.ts +16 -0
  10. package/dist/conversion/hub/tool-governance/engine.js +266 -0
  11. package/dist/conversion/hub/tool-governance/index.d.ts +3 -0
  12. package/dist/conversion/hub/tool-governance/index.js +2 -0
  13. package/dist/conversion/hub/tool-governance/rules.d.ts +2 -0
  14. package/dist/conversion/hub/tool-governance/rules.js +76 -0
  15. package/dist/conversion/hub/tool-governance/types.d.ts +38 -0
  16. package/dist/conversion/index.d.ts +1 -0
  17. package/dist/conversion/index.js +1 -0
  18. package/dist/conversion/responses/responses-openai-bridge.js +5 -3
  19. package/dist/sse/sse-to-json/builders/response-builder.js +2 -1
  20. package/dist/sse/sse-to-json/chat-sse-to-json-converter.js +37 -23
  21. package/dist/sse/sse-to-json/parsers/sse-parser.js +20 -12
  22. package/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +1 -0
  23. package/dist/sse/sse-to-json/responses-sse-to-json-converter.js +10 -8
  24. package/dist/sse/types/chat-types.d.ts +9 -6
  25. package/dist/sse/types/conversion-context.d.ts +14 -11
  26. package/dist/sse/types/core-interfaces.d.ts +6 -2
  27. package/dist/sse/types/index.d.ts +1 -1
  28. package/dist/sse/types/responses-types.d.ts +20 -20
  29. package/dist/sse/types/sse-events.d.ts +4 -3
  30. package/dist/sse/types/stream-state.d.ts +34 -39
  31. package/dist/sse/types/utility-types.d.ts +47 -43
  32. package/dist/sse/types/utility-types.js +10 -13
  33. package/dist/tools/tool-registry.js +156 -98
  34. package/package.json +7 -7
  35. package/dist/api/index.d.ts +0 -10
  36. package/dist/api/index.js +0 -11
  37. package/dist/api/llmswitch-config.d.ts +0 -15
  38. package/dist/api/llmswitch-config.js +0 -415
  39. package/dist/api/llmswitch-types.d.ts +0 -412
  40. package/dist/api/llmswitch-types.js +0 -60
  41. package/dist/bridge/routecodex-adapter.d.ts +0 -74
  42. package/dist/config/index.d.ts +0 -3
  43. package/dist/config/index.js +0 -5
  44. package/dist/config-unified/enhanced-path-resolver.d.ts +0 -5
  45. package/dist/config-unified/unified-config.d.ts +0 -26
  46. package/dist/conversion/codec-registry.d.ts +0 -10
  47. package/dist/conversion/codecs/anthropic-openai-codec.d.ts +0 -23
  48. package/dist/conversion/codecs/gemini-openai-codec.d.ts +0 -16
  49. package/dist/conversion/codecs/openai-openai-codec.d.ts +0 -12
  50. package/dist/conversion/codecs/responses-openai-codec.d.ts +0 -12
  51. package/dist/conversion/config/config-manager.d.ts +0 -212
  52. package/dist/conversion/conversion-v3/adapters/index.d.ts +0 -2
  53. package/dist/conversion/conversion-v3/adapters/index.js +0 -1
  54. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.d.ts +0 -38
  55. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.js +0 -55
  56. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.d.ts +0 -22
  57. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.js +0 -84
  58. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.d.ts +0 -4
  59. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.js +0 -285
  60. package/dist/conversion/conversion-v3/compatibility/index.d.ts +0 -3
  61. package/dist/conversion/conversion-v3/compatibility/index.js +0 -2
  62. package/dist/conversion/conversion-v3/config/default-configs.d.ts +0 -48
  63. package/dist/conversion/conversion-v3/config/default-configs.js +0 -1007
  64. package/dist/conversion/conversion-v3/config/index.d.ts +0 -5
  65. package/dist/conversion/conversion-v3/config/index.js +0 -5
  66. package/dist/conversion/conversion-v3/config/pipeline-config-manager.d.ts +0 -49
  67. package/dist/conversion/conversion-v3/config/pipeline-config-manager.js +0 -65
  68. package/dist/conversion/conversion-v3/index.d.ts +0 -11
  69. package/dist/conversion/conversion-v3/index.js +0 -17
  70. package/dist/conversion/conversion-v3/nodes/index.d.ts +0 -56
  71. package/dist/conversion/conversion-v3/nodes/index.js +0 -149
  72. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.d.ts +0 -25
  73. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.js +0 -56
  74. package/dist/conversion/conversion-v3/nodes/input/base-input-node.d.ts +0 -75
  75. package/dist/conversion/conversion-v3/nodes/input/base-input-node.js +0 -237
  76. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.d.ts +0 -25
  77. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.js +0 -56
  78. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.d.ts +0 -4
  79. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.js +0 -197
  80. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.d.ts +0 -16
  81. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.js +0 -125
  82. package/dist/conversion/conversion-v3/nodes/input/index.d.ts +0 -8
  83. package/dist/conversion/conversion-v3/nodes/input/index.js +0 -8
  84. package/dist/conversion/conversion-v3/nodes/input/input-decision.d.ts +0 -46
  85. package/dist/conversion/conversion-v3/nodes/input/input-decision.js +0 -125
  86. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.d.ts +0 -20
  87. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.js +0 -51
  88. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.d.ts +0 -71
  89. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.js +0 -320
  90. package/dist/conversion/conversion-v3/nodes/output/base-output-node.d.ts +0 -116
  91. package/dist/conversion/conversion-v3/nodes/output/base-output-node.js +0 -512
  92. package/dist/conversion/conversion-v3/nodes/output/index.d.ts +0 -7
  93. package/dist/conversion/conversion-v3/nodes/output/index.js +0 -7
  94. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.d.ts +0 -71
  95. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.js +0 -293
  96. package/dist/conversion/conversion-v3/nodes/output/output-decision.d.ts +0 -68
  97. package/dist/conversion/conversion-v3/nodes/output/output-decision.js +0 -161
  98. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.d.ts +0 -64
  99. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.js +0 -323
  100. package/dist/conversion/conversion-v3/nodes/process/base-process-node.d.ts +0 -72
  101. package/dist/conversion/conversion-v3/nodes/process/base-process-node.js +0 -246
  102. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.d.ts +0 -135
  103. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.js +0 -854
  104. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.d.ts +0 -29
  105. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.js +0 -181
  106. package/dist/conversion/conversion-v3/nodes/process/index.d.ts +0 -10
  107. package/dist/conversion/conversion-v3/nodes/process/index.js +0 -10
  108. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.d.ts +0 -59
  109. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.js +0 -243
  110. package/dist/conversion/conversion-v3/nodes/process/response-process-node.d.ts +0 -17
  111. package/dist/conversion/conversion-v3/nodes/process/response-process-node.js +0 -213
  112. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.d.ts +0 -30
  113. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.js +0 -360
  114. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.d.ts +0 -40
  115. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.js +0 -430
  116. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.d.ts +0 -12
  117. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.js +0 -129
  118. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.d.ts +0 -15
  119. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.js +0 -57
  120. package/dist/conversion/conversion-v3/nodes/response/index.d.ts +0 -4
  121. package/dist/conversion/conversion-v3/nodes/response/index.js +0 -4
  122. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.d.ts +0 -15
  123. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.js +0 -87
  124. package/dist/conversion/conversion-v3/nodes/response/response-utils.d.ts +0 -1
  125. package/dist/conversion/conversion-v3/nodes/response/response-utils.js +0 -1
  126. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.d.ts +0 -12
  127. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.js +0 -67
  128. package/dist/conversion/conversion-v3/nodes/sse/index.d.ts +0 -3
  129. package/dist/conversion/conversion-v3/nodes/sse/index.js +0 -3
  130. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.d.ts +0 -27
  131. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.js +0 -165
  132. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.d.ts +0 -19
  133. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.js +0 -267
  134. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.d.ts +0 -18
  135. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.js +0 -48
  136. package/dist/conversion/conversion-v3/pipelines/index.d.ts +0 -6
  137. package/dist/conversion/conversion-v3/pipelines/index.js +0 -6
  138. package/dist/conversion/conversion-v3/pipelines/super-pipeline.d.ts +0 -112
  139. package/dist/conversion/conversion-v3/pipelines/super-pipeline.js +0 -566
  140. package/dist/conversion/conversion-v3/response/provider-response-converter.d.ts +0 -28
  141. package/dist/conversion/conversion-v3/response/provider-response-converter.js +0 -249
  142. package/dist/conversion/conversion-v3/sse/index.d.ts +0 -140
  143. package/dist/conversion/conversion-v3/sse/index.js +0 -115
  144. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +0 -11
  145. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.js +0 -79
  146. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.d.ts +0 -79
  147. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.js +0 -296
  148. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.d.ts +0 -55
  149. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.js +0 -233
  150. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.d.ts +0 -99
  151. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.js +0 -599
  152. package/dist/conversion/conversion-v3/sse/json-to-sse/index.d.ts +0 -6
  153. package/dist/conversion/conversion-v3/sse/json-to-sse/index.js +0 -7
  154. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.d.ts +0 -79
  155. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.js +0 -322
  156. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.d.ts +0 -37
  157. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.js +0 -218
  158. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.d.ts +0 -40
  159. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.js +0 -263
  160. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.d.ts +0 -32
  161. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.js +0 -106
  162. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.d.ts +0 -4
  163. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.js +0 -40
  164. package/dist/conversion/conversion-v3/sse/shared/constants.d.ts +0 -272
  165. package/dist/conversion/conversion-v3/sse/shared/constants.js +0 -321
  166. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.d.ts +0 -158
  167. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.js +0 -210
  168. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.d.ts +0 -82
  169. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.js +0 -275
  170. package/dist/conversion/conversion-v3/sse/shared/serializers/index.d.ts +0 -39
  171. package/dist/conversion/conversion-v3/sse/shared/serializers/index.js +0 -54
  172. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.d.ts +0 -123
  173. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.js +0 -356
  174. package/dist/conversion/conversion-v3/sse/shared/serializers/types.d.ts +0 -51
  175. package/dist/conversion/conversion-v3/sse/shared/serializers/types.js +0 -4
  176. package/dist/conversion/conversion-v3/sse/shared/utils.d.ts +0 -254
  177. package/dist/conversion/conversion-v3/sse/shared/utils.js +0 -543
  178. package/dist/conversion/conversion-v3/sse/shared/writer.d.ts +0 -111
  179. package/dist/conversion/conversion-v3/sse/shared/writer.js +0 -268
  180. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +0 -13
  181. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.js +0 -139
  182. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.d.ts +0 -165
  183. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.js +0 -776
  184. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.d.ts +0 -106
  185. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.js +0 -540
  186. package/dist/conversion/conversion-v3/sse/sse-to-json/index.d.ts +0 -6
  187. package/dist/conversion/conversion-v3/sse/sse-to-json/index.js +0 -7
  188. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.d.ts +0 -73
  189. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.js +0 -332
  190. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.d.ts +0 -59
  191. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.js +0 -270
  192. package/dist/conversion/conversion-v3/sse/types/anthropic-types.d.ts +0 -87
  193. package/dist/conversion/conversion-v3/sse/types/anthropic-types.js +0 -5
  194. package/dist/conversion/conversion-v3/sse/types/chat-types.d.ts +0 -308
  195. package/dist/conversion/conversion-v3/sse/types/chat-types.js +0 -32
  196. package/dist/conversion/conversion-v3/sse/types/conversion-context.d.ts +0 -211
  197. package/dist/conversion/conversion-v3/sse/types/conversion-context.js +0 -20
  198. package/dist/conversion/conversion-v3/sse/types/core-interfaces.d.ts +0 -90
  199. package/dist/conversion/conversion-v3/sse/types/core-interfaces.js +0 -5
  200. package/dist/conversion/conversion-v3/sse/types/index.d.ts +0 -14
  201. package/dist/conversion/conversion-v3/sse/types/index.js +0 -7
  202. package/dist/conversion/conversion-v3/sse/types/responses-types.d.ts +0 -328
  203. package/dist/conversion/conversion-v3/sse/types/responses-types.js +0 -38
  204. package/dist/conversion/conversion-v3/sse/types/sse-events.d.ts +0 -180
  205. package/dist/conversion/conversion-v3/sse/types/sse-events.js +0 -150
  206. package/dist/conversion/conversion-v3/sse/types/stream-state.d.ts +0 -204
  207. package/dist/conversion/conversion-v3/sse/types/stream-state.js +0 -44
  208. package/dist/conversion/conversion-v3/sse/types/utility-types.d.ts +0 -230
  209. package/dist/conversion/conversion-v3/sse/types/utility-types.js +0 -49
  210. package/dist/conversion/conversion-v3/standards/context-adapter.d.ts +0 -146
  211. package/dist/conversion/conversion-v3/standards/context-adapter.js +0 -438
  212. package/dist/conversion/conversion-v3/standards/errors.d.ts +0 -38
  213. package/dist/conversion/conversion-v3/standards/errors.js +0 -27
  214. package/dist/conversion/conversion-v3/standards/index.d.ts +0 -15
  215. package/dist/conversion/conversion-v3/standards/index.js +0 -11
  216. package/dist/conversion/conversion-v3/standards/node-capabilities.d.ts +0 -123
  217. package/dist/conversion/conversion-v3/standards/node-capabilities.js +0 -330
  218. package/dist/conversion/conversion-v3/standards/pipeline-context.d.ts +0 -237
  219. package/dist/conversion/conversion-v3/standards/pipeline-context.js +0 -84
  220. package/dist/conversion/conversion-v3/standards/pipeline-node.d.ts +0 -196
  221. package/dist/conversion/conversion-v3/standards/pipeline-node.js +0 -316
  222. package/dist/conversion/conversion-v3/standards/snapshot-handles.d.ts +0 -24
  223. package/dist/conversion/conversion-v3/standards/snapshot-handles.js +0 -49
  224. package/dist/conversion/conversion-v3/types/config-types.d.ts +0 -242
  225. package/dist/conversion/conversion-v3/types/config-types.js +0 -13
  226. package/dist/conversion/conversion-v3/types/index.d.ts +0 -8
  227. package/dist/conversion/conversion-v3/types/index.js +0 -11
  228. package/dist/conversion/conversion-v3/types/node-types.d.ts +0 -211
  229. package/dist/conversion/conversion-v3/types/node-types.js +0 -20
  230. package/dist/conversion/conversion-v3/types/pipeline-types.d.ts +0 -246
  231. package/dist/conversion/conversion-v3/types/pipeline-types.js +0 -26
  232. package/dist/conversion/conversion-v3/types/request-types.d.ts +0 -293
  233. package/dist/conversion/conversion-v3/types/request-types.js +0 -26
  234. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.d.ts +0 -10
  235. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.js +0 -103
  236. package/dist/conversion/conversion-v3/validations/index.d.ts +0 -8
  237. package/dist/conversion/conversion-v3/validations/index.js +0 -7
  238. package/dist/conversion/conversion-v3/validations/node-graph-validator.d.ts +0 -116
  239. package/dist/conversion/conversion-v3/validations/node-graph-validator.js +0 -505
  240. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.d.ts +0 -139
  241. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.js +0 -338
  242. package/dist/conversion/hub/config/types.d.ts +0 -26
  243. package/dist/conversion/hub/core/detour-registry.d.ts +0 -9
  244. package/dist/conversion/hub/core/hub-context.d.ts +0 -21
  245. package/dist/conversion/hub/core/index.d.ts +0 -3
  246. package/dist/conversion/hub/core/stage-driver.d.ts +0 -30
  247. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.d.ts +0 -16
  248. package/dist/conversion/hub/format-adapters/chat-format-adapter.d.ts +0 -17
  249. package/dist/conversion/hub/format-adapters/gemini-format-adapter.d.ts +0 -16
  250. package/dist/conversion/hub/format-adapters/index.d.ts +0 -21
  251. package/dist/conversion/hub/format-adapters/responses-format-adapter.d.ts +0 -17
  252. package/dist/conversion/hub/hub-feature.d.ts +0 -1
  253. package/dist/conversion/hub/node-support.d.ts +0 -19
  254. package/dist/conversion/hub/pipeline/hub-pipeline.d.ts +0 -68
  255. package/dist/conversion/hub/pipelines/inbound.d.ts +0 -22
  256. package/dist/conversion/hub/pipelines/outbound.d.ts +0 -22
  257. package/dist/conversion/hub/process/chat-process.d.ts +0 -13
  258. package/dist/conversion/hub/registry.d.ts +0 -28
  259. package/dist/conversion/hub/response/chat-response-utils.d.ts +0 -6
  260. package/dist/conversion/hub/response/provider-response.d.ts +0 -20
  261. package/dist/conversion/hub/response/response-mappers.d.ts +0 -19
  262. package/dist/conversion/hub/response/response-runtime.d.ts +0 -3
  263. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.d.ts +0 -7
  264. package/dist/conversion/hub/semantic-mappers/chat-mapper.d.ts +0 -7
  265. package/dist/conversion/hub/semantic-mappers/gemini-mapper.d.ts +0 -7
  266. package/dist/conversion/hub/semantic-mappers/index.d.ts +0 -4
  267. package/dist/conversion/hub/semantic-mappers/responses-mapper.d.ts +0 -21
  268. package/dist/conversion/hub/snapshot-recorder.d.ts +0 -12
  269. package/dist/conversion/hub/standardized-bridge.d.ts +0 -12
  270. package/dist/conversion/hub/types/chat-envelope.d.ts +0 -67
  271. package/dist/conversion/hub/types/chat-schema.d.ts +0 -112
  272. package/dist/conversion/hub/types/errors.d.ts +0 -5
  273. package/dist/conversion/hub/types/format-envelope.d.ts +0 -7
  274. package/dist/conversion/hub/types/index.d.ts +0 -6
  275. package/dist/conversion/hub/types/json.d.ts +0 -9
  276. package/dist/conversion/hub/types/node.d.ts +0 -31
  277. package/dist/conversion/hub/types/standardized.d.ts +0 -94
  278. package/dist/conversion/responses/responses-openai-bridge.d.ts +0 -95
  279. package/dist/conversion/schema-validator.d.ts +0 -7
  280. package/dist/conversion/shared/args-mapping.d.ts +0 -18
  281. package/dist/conversion/shared/chat-request-filters.d.ts +0 -9
  282. package/dist/conversion/shared/jsonish.d.ts +0 -3
  283. package/dist/conversion/shared/mcp-injection.d.ts +0 -2
  284. package/dist/conversion/shared/media.d.ts +0 -1
  285. package/dist/conversion/shared/openai-finalizer.d.ts +0 -9
  286. package/dist/conversion/shared/openai-message-normalize.d.ts +0 -1
  287. package/dist/conversion/shared/payload-budget.d.ts +0 -13
  288. package/dist/conversion/shared/reasoning-mapping.d.ts +0 -5
  289. package/dist/conversion/shared/responses-conversation-store.d.ts +0 -41
  290. package/dist/conversion/shared/responses-id-utils.d.ts +0 -7
  291. package/dist/conversion/shared/responses-instructions.d.ts +0 -1
  292. package/dist/conversion/shared/responses-metadata.d.ts +0 -1
  293. package/dist/conversion/shared/responses-request-adapter.d.ts +0 -66
  294. package/dist/conversion/shared/snapshot-hooks.d.ts +0 -12
  295. package/dist/conversion/shared/streaming-text-extractor.d.ts +0 -26
  296. package/dist/conversion/shared/text-markup-normalizer.d.ts +0 -9
  297. package/dist/conversion/shared/tool-canonicalizer.d.ts +0 -2
  298. package/dist/conversion/shared/tool-filter-pipeline.d.ts +0 -17
  299. package/dist/conversion/shared/tool-governor.d.ts +0 -27
  300. package/dist/conversion/shared/tool-harvester.d.ts +0 -31
  301. package/dist/conversion/shared/tool-mapping.d.ts +0 -10
  302. package/dist/conversion/shared/tooling.d.ts +0 -26
  303. package/dist/conversion/types.d.ts +0 -33
  304. package/dist/core/index.d.ts +0 -6
  305. package/dist/core/index.js +0 -9
  306. package/dist/core/llmswitch-engine-v2.d.ts +0 -132
  307. package/dist/core/llmswitch-engine-v2.js +0 -649
  308. package/dist/core/llmswitch-factory-v2.d.ts +0 -123
  309. package/dist/core/llmswitch-factory-v2.js +0 -521
  310. package/dist/endpoints/base-endpoint-handler.d.ts +0 -128
  311. package/dist/endpoints/base-endpoint-handler.js +0 -545
  312. package/dist/endpoints/chat-endpoint-handler.d.ts +0 -115
  313. package/dist/endpoints/chat-endpoint-handler.js +0 -218
  314. package/dist/endpoints/endpoint-router.d.ts +0 -127
  315. package/dist/endpoints/endpoint-router.js +0 -438
  316. package/dist/endpoints/index.d.ts +0 -13
  317. package/dist/endpoints/index.js +0 -11
  318. package/dist/endpoints/messages-endpoint-handler.d.ts +0 -171
  319. package/dist/endpoints/messages-endpoint-handler.js +0 -238
  320. package/dist/endpoints/responses-endpoint-handler.d.ts +0 -147
  321. package/dist/endpoints/responses-endpoint-handler.js +0 -233
  322. package/dist/filters/builtin/add-fields-filter.d.ts +0 -8
  323. package/dist/filters/builtin/blacklist-filter.d.ts +0 -8
  324. package/dist/filters/builtin/whitelist-filter.d.ts +0 -8
  325. package/dist/filters/engine.d.ts +0 -16
  326. package/dist/filters/index.d.ts +0 -19
  327. package/dist/filters/special/request-streaming-to-nonstreaming.d.ts +0 -12
  328. package/dist/filters/special/request-tool-choice-policy.d.ts +0 -11
  329. package/dist/filters/special/request-tool-list-filter.d.ts +0 -11
  330. package/dist/filters/special/request-toolcalls-stringify.d.ts +0 -10
  331. package/dist/filters/special/request-tools-normalize.d.ts +0 -12
  332. package/dist/filters/special/response-finish-invariants.d.ts +0 -11
  333. package/dist/filters/special/response-openai-to-responses-bridge.d.ts +0 -13
  334. package/dist/filters/special/response-tool-arguments-blacklist.d.ts +0 -12
  335. package/dist/filters/special/response-tool-arguments-schema-converge.d.ts +0 -13
  336. package/dist/filters/special/response-tool-arguments-stringify.d.ts +0 -9
  337. package/dist/filters/special/response-tool-arguments-toon-decode.d.ts +0 -10
  338. package/dist/filters/special/response-tool-arguments-whitelist.d.ts +0 -11
  339. package/dist/filters/special/response-tool-text-canonicalize.d.ts +0 -10
  340. package/dist/filters/special/tool-filter-hooks.d.ts +0 -19
  341. package/dist/filters/special/tool-post-constraints.d.ts +0 -31
  342. package/dist/filters/types.d.ts +0 -68
  343. package/dist/filters/utils/fieldmap-loader.d.ts +0 -2
  344. package/dist/filters/utils/snapshot-writer.d.ts +0 -10
  345. package/dist/guidance/index.d.ts +0 -3
  346. package/dist/hooks/hooks-integration.d.ts +0 -161
  347. package/dist/hooks/hooks-integration.js +0 -519
  348. package/dist/hooks/index.d.ts +0 -10
  349. package/dist/hooks/index.js +0 -13
  350. package/dist/html-to-markdown.d.ts +0 -5
  351. package/dist/html-to-markdown.js +0 -66
  352. package/dist/http/sse-response.d.ts +0 -22
  353. package/dist/router/virtual-router/bootstrap.d.ts +0 -6
  354. package/dist/router/virtual-router/classifier.d.ts +0 -10
  355. package/dist/router/virtual-router/engine.d.ts +0 -35
  356. package/dist/router/virtual-router/error-center.d.ts +0 -10
  357. package/dist/router/virtual-router/features.d.ts +0 -3
  358. package/dist/router/virtual-router/health-manager.d.ts +0 -18
  359. package/dist/router/virtual-router/load-balancer.d.ts +0 -18
  360. package/dist/router/virtual-router/provider-registry.d.ts +0 -11
  361. package/dist/router/virtual-router/types.d.ts +0 -206
  362. package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +0 -11
  363. package/dist/sse/json-to-sse/chat-json-to-sse-converter.d.ts +0 -79
  364. package/dist/sse/json-to-sse/event-generators/chat.d.ts +0 -55
  365. package/dist/sse/json-to-sse/event-generators/responses.d.ts +0 -99
  366. package/dist/sse/json-to-sse/index.d.ts +0 -6
  367. package/dist/sse/json-to-sse/responses-json-to-sse-converter.d.ts +0 -79
  368. package/dist/sse/json-to-sse/sequencers/chat-sequencer.d.ts +0 -37
  369. package/dist/sse/json-to-sse/sequencers/responses-sequencer.d.ts +0 -40
  370. package/dist/sse/registry/sse-codec-registry.d.ts +0 -32
  371. package/dist/sse/shared/chat-serializer.d.ts +0 -4
  372. package/dist/sse/shared/constants.d.ts +0 -272
  373. package/dist/sse/shared/serializers/base-serializer.d.ts +0 -158
  374. package/dist/sse/shared/serializers/chat-event-serializer.d.ts +0 -82
  375. package/dist/sse/shared/serializers/index.d.ts +0 -39
  376. package/dist/sse/shared/serializers/responses-event-serializer.d.ts +0 -123
  377. package/dist/sse/shared/serializers/types.d.ts +0 -51
  378. package/dist/sse/shared/utils.d.ts +0 -254
  379. package/dist/sse/shared/writer.d.ts +0 -111
  380. package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +0 -13
  381. package/dist/sse/sse-to-json/builders/response-builder.d.ts +0 -165
  382. package/dist/sse/sse-to-json/chat-sse-to-json-converter.d.ts +0 -106
  383. package/dist/sse/sse-to-json/index.d.ts +0 -6
  384. package/dist/sse/sse-to-json/parsers/sse-parser.d.ts +0 -73
  385. package/dist/sse/types/anthropic-types.d.ts +0 -87
  386. package/dist/tools/proxy/anthropic-tool-proxy.d.ts +0 -19
  387. package/dist/tools/proxy/anthropic-tool-proxy.js +0 -57
  388. package/dist/tools/proxy/executors/web-fetch.d.ts +0 -6
  389. package/dist/tools/proxy/executors/web-fetch.js +0 -39
  390. package/dist/tools/proxy/registry.d.ts +0 -8
  391. package/dist/tools/proxy/registry.js +0 -14
  392. package/dist/tools/proxy/types.d.ts +0 -29
  393. package/dist/tools/tool-registry.d.ts +0 -8
  394. package/dist/tools/web-fetch-html.d.ts +0 -15
  395. package/dist/tools/web-fetch-html.js +0 -83
  396. package/dist/utils/conversion-adapter.d.ts +0 -65
  397. package/dist/utils/conversion-adapter.js +0 -183
  398. package/dist/utils/error-factory.d.ts +0 -88
  399. package/dist/utils/error-factory.js +0 -138
  400. package/dist/utils/error-utils.d.ts +0 -334
  401. package/dist/utils/error-utils.js +0 -782
  402. package/dist/utils/index.d.ts +0 -8
  403. package/dist/utils/index.js +0 -13
  404. package/dist/utils/performance-utils.d.ts +0 -205
  405. package/dist/utils/performance-utils.js +0 -440
  406. package/dist/utils/profile-mapper.d.ts +0 -32
  407. package/dist/utils/profile-mapper.js +0 -269
  408. package/dist/utils/request-processor.d.ts +0 -52
  409. package/dist/utils/request-processor.js +0 -210
  410. package/dist/utils/request-utils.d.ts +0 -117
  411. package/dist/utils/request-utils.js +0 -333
  412. package/dist/utils/response-utils.d.ts +0 -127
  413. package/dist/utils/response-utils.js +0 -516
  414. package/dist/utils/token-counter.d.ts +0 -89
  415. package/dist/utils/token-counter.js +0 -541
  416. /package/dist/{tools/proxy → conversion/hub/tool-governance}/types.js +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
- }