@librechat/agents 3.2.32 → 3.2.34

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 (597) hide show
  1. package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
  2. package/dist/cjs/agents/AgentContext.cjs +844 -1046
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/common/constants.cjs +13 -13
  5. package/dist/cjs/common/constants.cjs.map +1 -1
  6. package/dist/cjs/common/enum.cjs +233 -240
  7. package/dist/cjs/common/enum.cjs.map +1 -1
  8. package/dist/cjs/common/index.cjs +2 -0
  9. package/dist/cjs/events.cjs +121 -169
  10. package/dist/cjs/events.cjs.map +1 -1
  11. package/dist/cjs/graphs/Graph.cjs +1389 -1807
  12. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  13. package/dist/cjs/graphs/MultiAgentGraph.cjs +713 -945
  14. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  15. package/dist/cjs/graphs/index.cjs +2 -0
  16. package/dist/cjs/hitl/askUserQuestion.cjs +60 -62
  17. package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
  18. package/dist/cjs/hitl/index.cjs +1 -0
  19. package/dist/cjs/hooks/HookRegistry.cjs +176 -202
  20. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  21. package/dist/cjs/hooks/createToolPolicyHook.cjs +71 -101
  22. package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -1
  23. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +170 -273
  24. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
  25. package/dist/cjs/hooks/executeHooks.cjs +227 -282
  26. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  27. package/dist/cjs/hooks/index.cjs +6 -0
  28. package/dist/cjs/hooks/matchers.cjs +196 -230
  29. package/dist/cjs/hooks/matchers.cjs.map +1 -1
  30. package/dist/cjs/hooks/types.cjs +24 -24
  31. package/dist/cjs/hooks/types.cjs.map +1 -1
  32. package/dist/cjs/instrumentation.cjs +110 -137
  33. package/dist/cjs/instrumentation.cjs.map +1 -1
  34. package/dist/cjs/langchain/google-common.cjs +0 -3
  35. package/dist/cjs/langchain/index.cjs +80 -43
  36. package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
  37. package/dist/cjs/langchain/messages/tool.cjs +0 -3
  38. package/dist/cjs/langchain/messages.cjs +35 -18
  39. package/dist/cjs/langchain/openai.cjs +0 -3
  40. package/dist/cjs/langchain/prompts.cjs +5 -8
  41. package/dist/cjs/langchain/runnables.cjs +11 -10
  42. package/dist/cjs/langchain/tools.cjs +14 -11
  43. package/dist/cjs/langchain/utils/env.cjs +5 -8
  44. package/dist/cjs/langfuse.cjs +60 -79
  45. package/dist/cjs/langfuse.cjs.map +1 -1
  46. package/dist/cjs/langfuseToolOutputTracing.cjs +267 -399
  47. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  48. package/dist/cjs/llm/anthropic/index.cjs +432 -562
  49. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  50. package/dist/cjs/llm/anthropic/types.cjs +23 -47
  51. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  52. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +441 -731
  53. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  54. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +171 -256
  55. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  56. package/dist/cjs/llm/anthropic/utils/output_parsers.cjs +2 -0
  57. package/dist/cjs/llm/anthropic/utils/tools.cjs +12 -26
  58. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  59. package/dist/cjs/llm/bedrock/index.cjs +214 -240
  60. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  61. package/dist/cjs/llm/bedrock/toolCache.cjs +84 -106
  62. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  63. package/dist/cjs/llm/bedrock/utils/index.cjs +2 -0
  64. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +357 -620
  65. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  66. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +141 -149
  67. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
  68. package/dist/cjs/llm/fake.cjs +86 -96
  69. package/dist/cjs/llm/fake.cjs.map +1 -1
  70. package/dist/cjs/llm/google/index.cjs +183 -237
  71. package/dist/cjs/llm/google/index.cjs.map +1 -1
  72. package/dist/cjs/llm/google/utils/common.cjs +404 -674
  73. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  74. package/dist/cjs/llm/google/utils/zod_to_genai_parameters.cjs +2 -0
  75. package/dist/cjs/llm/init.cjs +44 -53
  76. package/dist/cjs/llm/init.cjs.map +1 -1
  77. package/dist/cjs/llm/invoke.cjs +142 -182
  78. package/dist/cjs/llm/invoke.cjs.map +1 -1
  79. package/dist/cjs/llm/openai/index.cjs +1035 -1273
  80. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  81. package/dist/cjs/llm/openai/utils/index.cjs +189 -316
  82. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  83. package/dist/cjs/llm/openrouter/index.cjs +102 -153
  84. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  85. package/dist/cjs/llm/openrouter/toolCache.cjs +35 -44
  86. package/dist/cjs/llm/openrouter/toolCache.cjs.map +1 -1
  87. package/dist/cjs/llm/providers.cjs +29 -37
  88. package/dist/cjs/llm/providers.cjs.map +1 -1
  89. package/dist/cjs/llm/request.cjs +20 -33
  90. package/dist/cjs/llm/request.cjs.map +1 -1
  91. package/dist/cjs/llm/vertexai/index.cjs +446 -453
  92. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  93. package/dist/cjs/main.cjs +547 -528
  94. package/dist/cjs/messages/anthropicToolCache.cjs +68 -119
  95. package/dist/cjs/messages/anthropicToolCache.cjs.map +1 -1
  96. package/dist/cjs/messages/cache.cjs +305 -418
  97. package/dist/cjs/messages/cache.cjs.map +1 -1
  98. package/dist/cjs/messages/content.cjs +36 -49
  99. package/dist/cjs/messages/content.cjs.map +1 -1
  100. package/dist/cjs/messages/contextPruning.cjs +112 -145
  101. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  102. package/dist/cjs/messages/contextPruningSettings.cjs +36 -46
  103. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -1
  104. package/dist/cjs/messages/core.cjs +256 -397
  105. package/dist/cjs/messages/core.cjs.map +1 -1
  106. package/dist/cjs/messages/format.cjs +904 -1387
  107. package/dist/cjs/messages/format.cjs.map +1 -1
  108. package/dist/cjs/messages/ids.cjs +16 -20
  109. package/dist/cjs/messages/ids.cjs.map +1 -1
  110. package/dist/cjs/messages/index.cjs +12 -0
  111. package/dist/cjs/messages/langchain.cjs +18 -18
  112. package/dist/cjs/messages/langchain.cjs.map +1 -1
  113. package/dist/cjs/messages/prune.cjs +1054 -1517
  114. package/dist/cjs/messages/prune.cjs.map +1 -1
  115. package/dist/cjs/messages/recency.cjs +77 -95
  116. package/dist/cjs/messages/recency.cjs.map +1 -1
  117. package/dist/cjs/messages/reducer.cjs +63 -78
  118. package/dist/cjs/messages/reducer.cjs.map +1 -1
  119. package/dist/cjs/messages/tools.cjs +51 -79
  120. package/dist/cjs/messages/tools.cjs.map +1 -1
  121. package/dist/cjs/openai/index.cjs +171 -217
  122. package/dist/cjs/openai/index.cjs.map +1 -1
  123. package/dist/cjs/responses/index.cjs +302 -391
  124. package/dist/cjs/responses/index.cjs.map +1 -1
  125. package/dist/cjs/run.cjs +903 -1113
  126. package/dist/cjs/run.cjs.map +1 -1
  127. package/dist/cjs/session/AgentSession.cjs +805 -986
  128. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  129. package/dist/cjs/session/JsonlSessionStore.cjs +327 -410
  130. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  131. package/dist/cjs/session/handlers.cjs +192 -208
  132. package/dist/cjs/session/handlers.cjs.map +1 -1
  133. package/dist/cjs/session/ids.cjs +9 -10
  134. package/dist/cjs/session/ids.cjs.map +1 -1
  135. package/dist/cjs/session/index.cjs +4 -0
  136. package/dist/cjs/session/messageSerialization.cjs +94 -156
  137. package/dist/cjs/session/messageSerialization.cjs.map +1 -1
  138. package/dist/cjs/splitStream.cjs +147 -206
  139. package/dist/cjs/splitStream.cjs.map +1 -1
  140. package/dist/cjs/stream.cjs +874 -1344
  141. package/dist/cjs/stream.cjs.map +1 -1
  142. package/dist/cjs/summarization/index.cjs +57 -101
  143. package/dist/cjs/summarization/index.cjs.map +1 -1
  144. package/dist/cjs/summarization/node.cjs +643 -796
  145. package/dist/cjs/summarization/node.cjs.map +1 -1
  146. package/dist/cjs/tools/BashExecutor.cjs +110 -136
  147. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  148. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +165 -245
  149. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  150. package/dist/cjs/tools/Calculator.cjs +36 -57
  151. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  152. package/dist/cjs/tools/CodeExecutor.cjs +126 -168
  153. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  154. package/dist/cjs/tools/CodeSessionFileSummary.cjs +36 -46
  155. package/dist/cjs/tools/CodeSessionFileSummary.cjs.map +1 -1
  156. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +459 -649
  157. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  158. package/dist/cjs/tools/ReadFile.cjs +17 -20
  159. package/dist/cjs/tools/ReadFile.cjs.map +1 -1
  160. package/dist/cjs/tools/SkillTool.cjs +26 -27
  161. package/dist/cjs/tools/SkillTool.cjs.map +1 -1
  162. package/dist/cjs/tools/SubagentTool.cjs +59 -61
  163. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  164. package/dist/cjs/tools/ToolNode.cjs +2146 -2686
  165. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  166. package/dist/cjs/tools/ToolSearch.cjs +663 -825
  167. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  168. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +248 -340
  169. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
  170. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +170 -197
  171. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -1
  172. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +425 -520
  173. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  174. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +91 -124
  175. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  176. package/dist/cjs/tools/cloudflare/index.cjs +4 -0
  177. package/dist/cjs/tools/eagerEventExecution.cjs +75 -99
  178. package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -1
  179. package/dist/cjs/tools/handlers.cjs +200 -262
  180. package/dist/cjs/tools/handlers.cjs.map +1 -1
  181. package/dist/cjs/tools/local/CompileCheckTool.cjs +150 -212
  182. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  183. package/dist/cjs/tools/local/FileCheckpointer.cjs +77 -85
  184. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  185. package/dist/cjs/tools/local/LocalCodingTools.cjs +763 -1022
  186. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  187. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +666 -941
  188. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  189. package/dist/cjs/tools/local/LocalExecutionTools.cjs +49 -92
  190. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  191. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +286 -354
  192. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  193. package/dist/cjs/tools/local/attachments.cjs +108 -165
  194. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  195. package/dist/cjs/tools/local/bashAst.cjs +99 -113
  196. package/dist/cjs/tools/local/bashAst.cjs.map +1 -1
  197. package/dist/cjs/tools/local/editStrategies.cjs +126 -169
  198. package/dist/cjs/tools/local/editStrategies.cjs.map +1 -1
  199. package/dist/cjs/tools/local/index.cjs +12 -0
  200. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +136 -218
  201. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  202. package/dist/cjs/tools/local/syntaxCheck.cjs +142 -161
  203. package/dist/cjs/tools/local/syntaxCheck.cjs.map +1 -1
  204. package/dist/cjs/tools/local/textEncoding.cjs +25 -23
  205. package/dist/cjs/tools/local/textEncoding.cjs.map +1 -1
  206. package/dist/cjs/tools/local/workspaceFS.cjs +38 -46
  207. package/dist/cjs/tools/local/workspaceFS.cjs.map +1 -1
  208. package/dist/cjs/tools/ptcTimeout.cjs +27 -47
  209. package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
  210. package/dist/cjs/tools/schema.cjs +24 -23
  211. package/dist/cjs/tools/schema.cjs.map +1 -1
  212. package/dist/cjs/tools/search/anthropic.cjs +24 -33
  213. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  214. package/dist/cjs/tools/search/content.cjs +95 -137
  215. package/dist/cjs/tools/search/content.cjs.map +1 -1
  216. package/dist/cjs/tools/search/firecrawl.cjs +141 -172
  217. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  218. package/dist/cjs/tools/search/format.cjs +128 -196
  219. package/dist/cjs/tools/search/format.cjs.map +1 -1
  220. package/dist/cjs/tools/search/highlights.cjs +165 -232
  221. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  222. package/dist/cjs/tools/search/index.cjs +2 -0
  223. package/dist/cjs/tools/search/rerankers.cjs +151 -174
  224. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  225. package/dist/cjs/tools/search/schema.cjs +40 -39
  226. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  227. package/dist/cjs/tools/search/search.cjs +428 -530
  228. package/dist/cjs/tools/search/search.cjs.map +1 -1
  229. package/dist/cjs/tools/search/serper-scraper.cjs +106 -127
  230. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  231. package/dist/cjs/tools/search/tavily-scraper.cjs +129 -181
  232. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
  233. package/dist/cjs/tools/search/tavily-search.cjs +295 -359
  234. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  235. package/dist/cjs/tools/search/tool.cjs +260 -299
  236. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  237. package/dist/cjs/tools/search/utils.cjs +74 -117
  238. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  239. package/dist/cjs/tools/skillCatalog.cjs +54 -72
  240. package/dist/cjs/tools/skillCatalog.cjs.map +1 -1
  241. package/dist/cjs/tools/streamedToolCallSeals.cjs +46 -34
  242. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
  243. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +612 -771
  244. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  245. package/dist/cjs/tools/subagent/index.cjs +1 -0
  246. package/dist/cjs/tools/toolOutputReferences.cjs +523 -630
  247. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  248. package/dist/cjs/utils/callbacks.cjs +11 -21
  249. package/dist/cjs/utils/callbacks.cjs.map +1 -1
  250. package/dist/cjs/utils/errors.cjs +70 -95
  251. package/dist/cjs/utils/errors.cjs.map +1 -1
  252. package/dist/cjs/utils/events.cjs +32 -42
  253. package/dist/cjs/utils/events.cjs.map +1 -1
  254. package/dist/cjs/utils/graph.cjs +8 -12
  255. package/dist/cjs/utils/graph.cjs.map +1 -1
  256. package/dist/cjs/utils/handlers.cjs +60 -82
  257. package/dist/cjs/utils/handlers.cjs.map +1 -1
  258. package/dist/cjs/utils/index.cjs +9 -0
  259. package/dist/cjs/utils/llm.cjs +19 -27
  260. package/dist/cjs/utils/llm.cjs.map +1 -1
  261. package/dist/cjs/utils/misc.cjs +30 -46
  262. package/dist/cjs/utils/misc.cjs.map +1 -1
  263. package/dist/cjs/utils/run.cjs +50 -66
  264. package/dist/cjs/utils/run.cjs.map +1 -1
  265. package/dist/cjs/utils/schema.cjs +11 -19
  266. package/dist/cjs/utils/schema.cjs.map +1 -1
  267. package/dist/cjs/utils/title.cjs +71 -106
  268. package/dist/cjs/utils/title.cjs.map +1 -1
  269. package/dist/cjs/utils/tokens.cjs +186 -283
  270. package/dist/cjs/utils/tokens.cjs.map +1 -1
  271. package/dist/cjs/utils/truncation.cjs +95 -114
  272. package/dist/cjs/utils/truncation.cjs.map +1 -1
  273. package/dist/esm/agents/AgentContext.mjs +844 -1044
  274. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  275. package/dist/esm/common/constants.mjs +13 -11
  276. package/dist/esm/common/constants.mjs.map +1 -1
  277. package/dist/esm/common/enum.mjs +221 -238
  278. package/dist/esm/common/enum.mjs.map +1 -1
  279. package/dist/esm/common/index.mjs +3 -0
  280. package/dist/esm/events.mjs +121 -167
  281. package/dist/esm/events.mjs.map +1 -1
  282. package/dist/esm/graphs/Graph.mjs +1388 -1804
  283. package/dist/esm/graphs/Graph.mjs.map +1 -1
  284. package/dist/esm/graphs/MultiAgentGraph.mjs +713 -943
  285. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  286. package/dist/esm/graphs/index.mjs +3 -0
  287. package/dist/esm/hitl/askUserQuestion.mjs +60 -60
  288. package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
  289. package/dist/esm/hitl/index.mjs +2 -0
  290. package/dist/esm/hooks/HookRegistry.mjs +176 -200
  291. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  292. package/dist/esm/hooks/createToolPolicyHook.mjs +71 -99
  293. package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -1
  294. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +170 -271
  295. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  296. package/dist/esm/hooks/executeHooks.mjs +227 -280
  297. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  298. package/dist/esm/hooks/index.mjs +7 -0
  299. package/dist/esm/hooks/matchers.mjs +196 -228
  300. package/dist/esm/hooks/matchers.mjs.map +1 -1
  301. package/dist/esm/hooks/types.mjs +24 -22
  302. package/dist/esm/hooks/types.mjs.map +1 -1
  303. package/dist/esm/instrumentation.mjs +109 -132
  304. package/dist/esm/instrumentation.mjs.map +1 -1
  305. package/dist/esm/langchain/google-common.mjs +1 -2
  306. package/dist/esm/langchain/index.mjs +5 -5
  307. package/dist/esm/langchain/language_models/chat_models.mjs +1 -2
  308. package/dist/esm/langchain/messages/tool.mjs +1 -2
  309. package/dist/esm/langchain/messages.mjs +2 -2
  310. package/dist/esm/langchain/openai.mjs +1 -2
  311. package/dist/esm/langchain/prompts.mjs +2 -2
  312. package/dist/esm/langchain/runnables.mjs +2 -2
  313. package/dist/esm/langchain/tools.mjs +2 -2
  314. package/dist/esm/langchain/utils/env.mjs +2 -2
  315. package/dist/esm/langfuse.mjs +60 -76
  316. package/dist/esm/langfuse.mjs.map +1 -1
  317. package/dist/esm/langfuseToolOutputTracing.mjs +267 -395
  318. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  319. package/dist/esm/llm/anthropic/index.mjs +432 -559
  320. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  321. package/dist/esm/llm/anthropic/types.mjs +23 -45
  322. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  323. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +439 -725
  324. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  325. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +171 -253
  326. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  327. package/dist/esm/llm/anthropic/utils/output_parsers.mjs +3 -0
  328. package/dist/esm/llm/anthropic/utils/tools.mjs +12 -24
  329. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  330. package/dist/esm/llm/bedrock/index.mjs +214 -238
  331. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  332. package/dist/esm/llm/bedrock/toolCache.mjs +84 -104
  333. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  334. package/dist/esm/llm/bedrock/utils/index.mjs +3 -0
  335. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +357 -618
  336. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  337. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +140 -147
  338. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
  339. package/dist/esm/llm/fake.mjs +86 -94
  340. package/dist/esm/llm/fake.mjs.map +1 -1
  341. package/dist/esm/llm/google/index.mjs +183 -235
  342. package/dist/esm/llm/google/index.mjs.map +1 -1
  343. package/dist/esm/llm/google/utils/common.mjs +403 -666
  344. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  345. package/dist/esm/llm/google/utils/zod_to_genai_parameters.mjs +3 -0
  346. package/dist/esm/llm/init.mjs +44 -51
  347. package/dist/esm/llm/init.mjs.map +1 -1
  348. package/dist/esm/llm/invoke.mjs +142 -180
  349. package/dist/esm/llm/invoke.mjs.map +1 -1
  350. package/dist/esm/llm/openai/index.mjs +1035 -1268
  351. package/dist/esm/llm/openai/index.mjs.map +1 -1
  352. package/dist/esm/llm/openai/utils/index.mjs +188 -312
  353. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  354. package/dist/esm/llm/openrouter/index.mjs +102 -151
  355. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  356. package/dist/esm/llm/openrouter/toolCache.mjs +35 -42
  357. package/dist/esm/llm/openrouter/toolCache.mjs.map +1 -1
  358. package/dist/esm/llm/providers.mjs +29 -34
  359. package/dist/esm/llm/providers.mjs.map +1 -1
  360. package/dist/esm/llm/request.mjs +20 -31
  361. package/dist/esm/llm/request.mjs.map +1 -1
  362. package/dist/esm/llm/vertexai/index.mjs +446 -449
  363. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  364. package/dist/esm/main.mjs +99 -87
  365. package/dist/esm/messages/anthropicToolCache.mjs +68 -117
  366. package/dist/esm/messages/anthropicToolCache.mjs.map +1 -1
  367. package/dist/esm/messages/cache.mjs +305 -416
  368. package/dist/esm/messages/cache.mjs.map +1 -1
  369. package/dist/esm/messages/content.mjs +36 -47
  370. package/dist/esm/messages/content.mjs.map +1 -1
  371. package/dist/esm/messages/contextPruning.mjs +112 -143
  372. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  373. package/dist/esm/messages/contextPruningSettings.mjs +36 -44
  374. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -1
  375. package/dist/esm/messages/core.mjs +254 -393
  376. package/dist/esm/messages/core.mjs.map +1 -1
  377. package/dist/esm/messages/format.mjs +902 -1383
  378. package/dist/esm/messages/format.mjs.map +1 -1
  379. package/dist/esm/messages/ids.mjs +16 -18
  380. package/dist/esm/messages/ids.mjs.map +1 -1
  381. package/dist/esm/messages/index.mjs +13 -0
  382. package/dist/esm/messages/langchain.mjs +18 -16
  383. package/dist/esm/messages/langchain.mjs.map +1 -1
  384. package/dist/esm/messages/prune.mjs +1053 -1514
  385. package/dist/esm/messages/prune.mjs.map +1 -1
  386. package/dist/esm/messages/recency.mjs +77 -93
  387. package/dist/esm/messages/recency.mjs.map +1 -1
  388. package/dist/esm/messages/reducer.mjs +63 -76
  389. package/dist/esm/messages/reducer.mjs.map +1 -1
  390. package/dist/esm/messages/tools.mjs +49 -75
  391. package/dist/esm/messages/tools.mjs.map +1 -1
  392. package/dist/esm/openai/index.mjs +170 -215
  393. package/dist/esm/openai/index.mjs.map +1 -1
  394. package/dist/esm/responses/index.mjs +301 -389
  395. package/dist/esm/responses/index.mjs.map +1 -1
  396. package/dist/esm/run.mjs +903 -1111
  397. package/dist/esm/run.mjs.map +1 -1
  398. package/dist/esm/session/AgentSession.mjs +806 -985
  399. package/dist/esm/session/AgentSession.mjs.map +1 -1
  400. package/dist/esm/session/JsonlSessionStore.mjs +326 -407
  401. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  402. package/dist/esm/session/handlers.mjs +192 -206
  403. package/dist/esm/session/handlers.mjs.map +1 -1
  404. package/dist/esm/session/ids.mjs +9 -8
  405. package/dist/esm/session/ids.mjs.map +1 -1
  406. package/dist/esm/session/index.mjs +5 -0
  407. package/dist/esm/session/messageSerialization.mjs +94 -154
  408. package/dist/esm/session/messageSerialization.mjs.map +1 -1
  409. package/dist/esm/splitStream.mjs +147 -204
  410. package/dist/esm/splitStream.mjs.map +1 -1
  411. package/dist/esm/stream.mjs +872 -1341
  412. package/dist/esm/stream.mjs.map +1 -1
  413. package/dist/esm/summarization/index.mjs +57 -99
  414. package/dist/esm/summarization/index.mjs.map +1 -1
  415. package/dist/esm/summarization/node.mjs +640 -790
  416. package/dist/esm/summarization/node.mjs.map +1 -1
  417. package/dist/esm/tools/BashExecutor.mjs +103 -129
  418. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  419. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +162 -239
  420. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  421. package/dist/esm/tools/Calculator.mjs +34 -36
  422. package/dist/esm/tools/Calculator.mjs.map +1 -1
  423. package/dist/esm/tools/CodeExecutor.mjs +123 -164
  424. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  425. package/dist/esm/tools/CodeSessionFileSummary.mjs +36 -44
  426. package/dist/esm/tools/CodeSessionFileSummary.mjs.map +1 -1
  427. package/dist/esm/tools/ProgrammaticToolCalling.mjs +454 -644
  428. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  429. package/dist/esm/tools/ReadFile.mjs +17 -18
  430. package/dist/esm/tools/ReadFile.mjs.map +1 -1
  431. package/dist/esm/tools/SkillTool.mjs +26 -25
  432. package/dist/esm/tools/SkillTool.mjs.map +1 -1
  433. package/dist/esm/tools/SubagentTool.mjs +59 -59
  434. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  435. package/dist/esm/tools/ToolNode.mjs +2144 -2684
  436. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  437. package/dist/esm/tools/ToolSearch.mjs +659 -804
  438. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  439. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +248 -338
  440. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
  441. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +170 -195
  442. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -1
  443. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +424 -517
  444. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  445. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +91 -122
  446. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  447. package/dist/esm/tools/cloudflare/index.mjs +5 -0
  448. package/dist/esm/tools/eagerEventExecution.mjs +75 -96
  449. package/dist/esm/tools/eagerEventExecution.mjs.map +1 -1
  450. package/dist/esm/tools/handlers.mjs +200 -260
  451. package/dist/esm/tools/handlers.mjs.map +1 -1
  452. package/dist/esm/tools/local/CompileCheckTool.mjs +150 -210
  453. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  454. package/dist/esm/tools/local/FileCheckpointer.mjs +77 -83
  455. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  456. package/dist/esm/tools/local/LocalCodingTools.mjs +760 -1017
  457. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  458. package/dist/esm/tools/local/LocalExecutionEngine.mjs +663 -936
  459. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  460. package/dist/esm/tools/local/LocalExecutionTools.mjs +49 -90
  461. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  462. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +283 -349
  463. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  464. package/dist/esm/tools/local/attachments.mjs +108 -163
  465. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  466. package/dist/esm/tools/local/bashAst.mjs +99 -111
  467. package/dist/esm/tools/local/bashAst.mjs.map +1 -1
  468. package/dist/esm/tools/local/editStrategies.mjs +126 -167
  469. package/dist/esm/tools/local/editStrategies.mjs.map +1 -1
  470. package/dist/esm/tools/local/index.mjs +13 -0
  471. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +136 -216
  472. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  473. package/dist/esm/tools/local/syntaxCheck.mjs +138 -155
  474. package/dist/esm/tools/local/syntaxCheck.mjs.map +1 -1
  475. package/dist/esm/tools/local/textEncoding.mjs +25 -21
  476. package/dist/esm/tools/local/textEncoding.mjs.map +1 -1
  477. package/dist/esm/tools/local/workspaceFS.mjs +38 -44
  478. package/dist/esm/tools/local/workspaceFS.mjs.map +1 -1
  479. package/dist/esm/tools/ptcTimeout.mjs +27 -42
  480. package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
  481. package/dist/esm/tools/schema.mjs +24 -21
  482. package/dist/esm/tools/schema.mjs.map +1 -1
  483. package/dist/esm/tools/search/anthropic.mjs +24 -31
  484. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  485. package/dist/esm/tools/search/content.mjs +93 -116
  486. package/dist/esm/tools/search/content.mjs.map +1 -1
  487. package/dist/esm/tools/search/firecrawl.mjs +139 -169
  488. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  489. package/dist/esm/tools/search/format.mjs +128 -194
  490. package/dist/esm/tools/search/format.mjs.map +1 -1
  491. package/dist/esm/tools/search/highlights.mjs +165 -230
  492. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  493. package/dist/esm/tools/search/index.mjs +3 -0
  494. package/dist/esm/tools/search/rerankers.mjs +149 -168
  495. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  496. package/dist/esm/tools/search/schema.mjs +39 -37
  497. package/dist/esm/tools/search/schema.mjs.map +1 -1
  498. package/dist/esm/tools/search/search.mjs +426 -528
  499. package/dist/esm/tools/search/search.mjs.map +1 -1
  500. package/dist/esm/tools/search/serper-scraper.mjs +104 -124
  501. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  502. package/dist/esm/tools/search/tavily-scraper.mjs +127 -178
  503. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
  504. package/dist/esm/tools/search/tavily-search.mjs +293 -357
  505. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  506. package/dist/esm/tools/search/tool.mjs +259 -297
  507. package/dist/esm/tools/search/tool.mjs.map +1 -1
  508. package/dist/esm/tools/search/utils.mjs +74 -115
  509. package/dist/esm/tools/search/utils.mjs.map +1 -1
  510. package/dist/esm/tools/skillCatalog.mjs +54 -70
  511. package/dist/esm/tools/skillCatalog.mjs.map +1 -1
  512. package/dist/esm/tools/streamedToolCallSeals.mjs +42 -31
  513. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
  514. package/dist/esm/tools/subagent/SubagentExecutor.mjs +612 -768
  515. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  516. package/dist/esm/tools/subagent/index.mjs +2 -0
  517. package/dist/esm/tools/toolOutputReferences.mjs +523 -624
  518. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  519. package/dist/esm/utils/callbacks.mjs +11 -19
  520. package/dist/esm/utils/callbacks.mjs.map +1 -1
  521. package/dist/esm/utils/errors.mjs +70 -93
  522. package/dist/esm/utils/errors.mjs.map +1 -1
  523. package/dist/esm/utils/events.mjs +32 -40
  524. package/dist/esm/utils/events.mjs.map +1 -1
  525. package/dist/esm/utils/graph.mjs +8 -10
  526. package/dist/esm/utils/graph.mjs.map +1 -1
  527. package/dist/esm/utils/handlers.mjs +60 -80
  528. package/dist/esm/utils/handlers.mjs.map +1 -1
  529. package/dist/esm/utils/index.mjs +10 -0
  530. package/dist/esm/utils/llm.mjs +19 -25
  531. package/dist/esm/utils/llm.mjs.map +1 -1
  532. package/dist/esm/utils/misc.mjs +30 -44
  533. package/dist/esm/utils/misc.mjs.map +1 -1
  534. package/dist/esm/utils/run.mjs +50 -64
  535. package/dist/esm/utils/run.mjs.map +1 -1
  536. package/dist/esm/utils/schema.mjs +11 -17
  537. package/dist/esm/utils/schema.mjs.map +1 -1
  538. package/dist/esm/utils/title.mjs +71 -104
  539. package/dist/esm/utils/title.mjs.map +1 -1
  540. package/dist/esm/utils/tokens.mjs +186 -281
  541. package/dist/esm/utils/tokens.mjs.map +1 -1
  542. package/dist/esm/utils/truncation.mjs +95 -112
  543. package/dist/esm/utils/truncation.mjs.map +1 -1
  544. package/dist/types/llm/bedrock/utils/index.d.ts +1 -1
  545. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +9 -0
  546. package/dist/types/llm/vertexai/index.d.ts +10 -0
  547. package/dist/types/tools/ToolNode.d.ts +8 -0
  548. package/dist/types/tools/search/tool.d.ts +17 -0
  549. package/dist/types/tools/search/types.d.ts +4 -0
  550. package/dist/types/tools/streamedToolCallSeals.d.ts +5 -1
  551. package/dist/types/types/tools.d.ts +10 -0
  552. package/package.json +4 -10
  553. package/src/__tests__/stream.eagerEventExecution.test.ts +703 -0
  554. package/src/llm/bedrock/index.ts +40 -0
  555. package/src/llm/bedrock/streamSealDispatch.test.ts +158 -0
  556. package/src/llm/bedrock/utils/index.ts +1 -0
  557. package/src/llm/bedrock/utils/message_outputs.test.ts +85 -0
  558. package/src/llm/bedrock/utils/message_outputs.ts +43 -0
  559. package/src/llm/google/utils/common.test.ts +64 -0
  560. package/src/llm/google/utils/common.ts +18 -0
  561. package/src/llm/openai/index.ts +95 -1
  562. package/src/llm/openai/sequentialToolCallSeals.test.ts +199 -0
  563. package/src/llm/vertexai/index.ts +31 -0
  564. package/src/llm/vertexai/sealStreamedToolCalls.test.ts +88 -0
  565. package/src/llm/vertexai/streamSealDispatch.test.ts +148 -0
  566. package/src/stream.ts +40 -6
  567. package/src/tools/ToolNode.ts +85 -3
  568. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +368 -0
  569. package/src/tools/search/highlights.ts +9 -1
  570. package/src/tools/search/search.ts +41 -3
  571. package/src/tools/search/source-processing.test.ts +373 -0
  572. package/src/tools/search/tool.ts +22 -2
  573. package/src/tools/search/types.ts +4 -0
  574. package/src/tools/streamedToolCallSeals.ts +37 -9
  575. package/src/types/tools.ts +10 -0
  576. package/dist/cjs/langchain/google-common.cjs.map +0 -1
  577. package/dist/cjs/langchain/index.cjs.map +0 -1
  578. package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
  579. package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
  580. package/dist/cjs/langchain/messages.cjs.map +0 -1
  581. package/dist/cjs/langchain/openai.cjs.map +0 -1
  582. package/dist/cjs/langchain/prompts.cjs.map +0 -1
  583. package/dist/cjs/langchain/runnables.cjs.map +0 -1
  584. package/dist/cjs/langchain/tools.cjs.map +0 -1
  585. package/dist/cjs/langchain/utils/env.cjs.map +0 -1
  586. package/dist/cjs/main.cjs.map +0 -1
  587. package/dist/esm/langchain/google-common.mjs.map +0 -1
  588. package/dist/esm/langchain/index.mjs.map +0 -1
  589. package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
  590. package/dist/esm/langchain/messages/tool.mjs.map +0 -1
  591. package/dist/esm/langchain/messages.mjs.map +0 -1
  592. package/dist/esm/langchain/openai.mjs.map +0 -1
  593. package/dist/esm/langchain/prompts.mjs.map +0 -1
  594. package/dist/esm/langchain/runnables.mjs.map +0 -1
  595. package/dist/esm/langchain/tools.mjs.map +0 -1
  596. package/dist/esm/langchain/utils/env.mjs.map +0 -1
  597. package/dist/esm/main.mjs.map +0 -1
@@ -1,1323 +1,1090 @@
1
- import { AzureOpenAI } from 'openai';
2
- import { ChatXAI as ChatXAI$1 } from '@langchain/xai';
3
- import { ChatGenerationChunk } from '@langchain/core/outputs';
4
- import { ChatDeepSeek as ChatDeepSeek$1 } from '@langchain/deepseek';
5
- import { isAIMessage, AIMessage, AIMessageChunk } from '@langchain/core/messages';
6
- import { isLangChainTool, convertToOpenAITool } from '@langchain/core/utils/function_calling';
7
- import { getEndpoint, AzureChatOpenAI as AzureChatOpenAI$1, ChatOpenAI as ChatOpenAI$1, OpenAIClient, AzureChatOpenAICompletions, AzureChatOpenAIResponses, ChatOpenAIResponses, ChatOpenAICompletions, getHeadersWithUserAgent } from '@langchain/openai';
8
- import { _convertMessagesToOpenAIParams, isReasoningModel } from './utils/index.mjs';
9
-
10
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
1
+ import { OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER, STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY } from "../../tools/streamedToolCallSeals.mjs";
2
+ import { _convertMessagesToOpenAIParams, isReasoningModel } from "./utils/index.mjs";
3
+ import { AIMessage, AIMessageChunk, isAIMessage } from "@langchain/core/messages";
4
+ import { AzureChatOpenAI, AzureChatOpenAICompletions, AzureChatOpenAIResponses, ChatOpenAI, ChatOpenAICompletions, ChatOpenAIResponses, OpenAIClient, getEndpoint, getHeadersWithUserAgent } from "@langchain/openai";
5
+ import { AzureOpenAI } from "openai";
6
+ import { ChatXAI } from "@langchain/xai";
7
+ import { ChatGenerationChunk } from "@langchain/core/outputs";
8
+ import { ChatDeepSeek } from "@langchain/deepseek";
9
+ import { convertToOpenAITool, isLangChainTool } from "@langchain/core/utils/function_calling";
10
+ //#region src/llm/openai/index.ts
11
11
  const iife = (fn) => fn();
12
12
  const STREAM_CHUNK_MIN_SIZE = 4;
13
- const STREAM_BOUNDARIES = new Set([' ', '.', ',', '!', '?', ';', ':']);
13
+ const STREAM_BOUNDARIES = new Set([
14
+ " ",
15
+ ".",
16
+ ",",
17
+ "!",
18
+ "?",
19
+ ";",
20
+ ":"
21
+ ]);
14
22
  function isHeaders(headers) {
15
- return (typeof Headers !== 'undefined' &&
16
- headers !== null &&
17
- typeof headers === 'object' &&
18
- Object.prototype.toString.call(headers) === '[object Headers]');
23
+ return typeof Headers !== "undefined" && headers !== null && typeof headers === "object" && Object.prototype.toString.call(headers) === "[object Headers]";
19
24
  }
20
25
  function normalizeHeaders(headers) {
21
- const output = iife(() => {
22
- // If headers is a Headers instance
23
- if (isHeaders(headers)) {
24
- return headers;
25
- }
26
- // If headers is an array of [key, value] pairs
27
- else if (Array.isArray(headers)) {
28
- return new Headers(headers);
29
- }
30
- // If headers is a NullableHeaders-like object (has 'values' property that is a Headers)
31
- else if (typeof headers === 'object' &&
32
- headers !== null &&
33
- 'values' in headers &&
34
- isHeaders(headers.values)) {
35
- return headers.values;
36
- }
37
- // If headers is a plain object
38
- else if (typeof headers === 'object' && headers !== null) {
39
- const entries = Object.entries(headers)
40
- .filter(([, v]) => typeof v === 'string')
41
- .map(([k, v]) => [k, v]);
42
- return new Headers(entries);
43
- }
44
- return new Headers();
45
- });
46
- return Object.fromEntries(output.entries());
26
+ const output = iife(() => {
27
+ if (isHeaders(headers)) return headers;
28
+ else if (Array.isArray(headers)) return new Headers(headers);
29
+ else if (typeof headers === "object" && headers !== null && "values" in headers && isHeaders(headers.values)) return headers.values;
30
+ else if (typeof headers === "object" && headers !== null) {
31
+ const entries = Object.entries(headers).filter(([, v]) => typeof v === "string").map(([k, v]) => [k, v]);
32
+ return new Headers(entries);
33
+ }
34
+ return new Headers();
35
+ });
36
+ return Object.fromEntries(output.entries());
47
37
  }
48
38
  function createUsageMetadata(usage) {
49
- const usageMetadata = {
50
- input_tokens: usage?.prompt_tokens ?? 0,
51
- output_tokens: usage?.completion_tokens ?? 0,
52
- total_tokens: usage?.total_tokens ?? 0,
53
- };
54
- if (usage == null) {
55
- return usageMetadata;
56
- }
57
- const inputTokenDetails = {};
58
- const outputTokenDetails = {};
59
- let hasInputTokenDetails = false;
60
- let hasOutputTokenDetails = false;
61
- const promptTokenDetails = usage.prompt_tokens_details;
62
- const audioInputTokens = promptTokenDetails?.audio_tokens;
63
- const cachedInputTokens = promptTokenDetails?.cached_tokens;
64
- const cacheWriteInputTokens = promptTokenDetails?.cache_write_tokens;
65
- const audioOutputTokens = usage.completion_tokens_details?.audio_tokens;
66
- const reasoningOutputTokens = usage.completion_tokens_details?.reasoning_tokens;
67
- if (audioInputTokens != null) {
68
- inputTokenDetails.audio = audioInputTokens;
69
- hasInputTokenDetails = true;
70
- }
71
- if (cachedInputTokens != null) {
72
- inputTokenDetails.cache_read = cachedInputTokens;
73
- hasInputTokenDetails = true;
74
- }
75
- if (cacheWriteInputTokens != null) {
76
- inputTokenDetails.cache_creation = cacheWriteInputTokens;
77
- hasInputTokenDetails = true;
78
- }
79
- if (audioOutputTokens != null) {
80
- outputTokenDetails.audio = audioOutputTokens;
81
- hasOutputTokenDetails = true;
82
- }
83
- if (reasoningOutputTokens != null) {
84
- outputTokenDetails.reasoning = reasoningOutputTokens;
85
- hasOutputTokenDetails = true;
86
- }
87
- if (hasInputTokenDetails) {
88
- usageMetadata.input_token_details = inputTokenDetails;
89
- }
90
- if (hasOutputTokenDetails) {
91
- usageMetadata.output_token_details = outputTokenDetails;
92
- }
93
- return usageMetadata;
39
+ const usageMetadata = {
40
+ input_tokens: usage?.prompt_tokens ?? 0,
41
+ output_tokens: usage?.completion_tokens ?? 0,
42
+ total_tokens: usage?.total_tokens ?? 0
43
+ };
44
+ if (usage == null) return usageMetadata;
45
+ const inputTokenDetails = {};
46
+ const outputTokenDetails = {};
47
+ let hasInputTokenDetails = false;
48
+ let hasOutputTokenDetails = false;
49
+ const promptTokenDetails = usage.prompt_tokens_details;
50
+ const audioInputTokens = promptTokenDetails?.audio_tokens;
51
+ const cachedInputTokens = promptTokenDetails?.cached_tokens;
52
+ const cacheWriteInputTokens = promptTokenDetails?.cache_write_tokens;
53
+ const audioOutputTokens = usage.completion_tokens_details?.audio_tokens;
54
+ const reasoningOutputTokens = usage.completion_tokens_details?.reasoning_tokens;
55
+ if (audioInputTokens != null) {
56
+ inputTokenDetails.audio = audioInputTokens;
57
+ hasInputTokenDetails = true;
58
+ }
59
+ if (cachedInputTokens != null) {
60
+ inputTokenDetails.cache_read = cachedInputTokens;
61
+ hasInputTokenDetails = true;
62
+ }
63
+ if (cacheWriteInputTokens != null) {
64
+ inputTokenDetails.cache_creation = cacheWriteInputTokens;
65
+ hasInputTokenDetails = true;
66
+ }
67
+ if (audioOutputTokens != null) {
68
+ outputTokenDetails.audio = audioOutputTokens;
69
+ hasOutputTokenDetails = true;
70
+ }
71
+ if (reasoningOutputTokens != null) {
72
+ outputTokenDetails.reasoning = reasoningOutputTokens;
73
+ hasOutputTokenDetails = true;
74
+ }
75
+ if (hasInputTokenDetails) usageMetadata.input_token_details = inputTokenDetails;
76
+ if (hasOutputTokenDetails) usageMetadata.output_token_details = outputTokenDetails;
77
+ return usageMetadata;
94
78
  }
95
79
  function getExposedOpenAIClient(completions, responses, preferResponses) {
96
- const responsesClient = responses.client;
97
- if (responsesClient?.abortHandler != null) {
98
- return responsesClient;
99
- }
100
- const completionsClient = completions.client;
101
- if (completionsClient?.abortHandler != null) {
102
- return completionsClient;
103
- }
104
- const delegate = preferResponses ? responses : completions;
105
- delegate._getClientOptions(undefined);
106
- return delegate.client;
80
+ const responsesClient = responses.client;
81
+ if (responsesClient?.abortHandler != null) return responsesClient;
82
+ const completionsClient = completions.client;
83
+ if (completionsClient?.abortHandler != null) return completionsClient;
84
+ const delegate = preferResponses ? responses : completions;
85
+ delegate._getClientOptions(void 0);
86
+ return delegate.client;
107
87
  }
108
88
  function getReasoningParams(baseReasoning, options) {
109
- let reasoning;
110
- if (baseReasoning !== undefined) {
111
- reasoning = {
112
- ...reasoning,
113
- ...baseReasoning,
114
- };
115
- }
116
- if (options?.reasoning !== undefined) {
117
- reasoning = {
118
- ...reasoning,
119
- ...options.reasoning,
120
- };
121
- }
122
- if (options?.reasoningEffort !== undefined &&
123
- reasoning?.effort === undefined) {
124
- reasoning = {
125
- ...reasoning,
126
- effort: options.reasoningEffort,
127
- };
128
- }
129
- return reasoning;
89
+ let reasoning;
90
+ if (baseReasoning !== void 0) reasoning = {
91
+ ...reasoning,
92
+ ...baseReasoning
93
+ };
94
+ if (options?.reasoning !== void 0) reasoning = {
95
+ ...reasoning,
96
+ ...options.reasoning
97
+ };
98
+ if (options?.reasoningEffort !== void 0 && reasoning?.effort === void 0) reasoning = {
99
+ ...reasoning,
100
+ effort: options.reasoningEffort
101
+ };
102
+ return reasoning;
130
103
  }
131
104
  function getGatedReasoningParams(model, baseReasoning, options) {
132
- if (!isReasoningModel(model)) {
133
- return;
134
- }
135
- return getReasoningParams(baseReasoning, options);
105
+ if (!isReasoningModel(model)) return;
106
+ return getReasoningParams(baseReasoning, options);
136
107
  }
137
108
  function isObject(value) {
138
- return typeof value === 'object' && value !== null;
109
+ return typeof value === "object" && value !== null;
139
110
  }
140
111
  function isOpenAIChatCompletionChunk(value) {
141
- if (!isObject(value)) {
142
- return false;
143
- }
144
- // Intentionally loose: downstream handlers already tolerate empty choices.
145
- const { choices } = value;
146
- return Array.isArray(choices);
112
+ if (!isObject(value)) return false;
113
+ const { choices } = value;
114
+ return Array.isArray(choices);
147
115
  }
148
116
  function getOpenAIChatCompletionChunk(value) {
149
- if (isOpenAIChatCompletionChunk(value)) {
150
- return value;
151
- }
152
- const { data } = value;
153
- if (isOpenAIChatCompletionChunk(data)) {
154
- return data;
155
- }
156
- return undefined;
117
+ if (isOpenAIChatCompletionChunk(value)) return value;
118
+ const { data } = value;
119
+ if (isOpenAIChatCompletionChunk(data)) return data;
157
120
  }
158
121
  async function* filterOpenAIChatCompletionStream(stream) {
159
- for await (const item of stream) {
160
- const chunk = getOpenAIChatCompletionChunk(item);
161
- if (chunk == null) {
162
- continue;
163
- }
164
- yield chunk;
165
- }
122
+ for await (const item of stream) {
123
+ const chunk = getOpenAIChatCompletionChunk(item);
124
+ if (chunk == null) continue;
125
+ yield chunk;
126
+ }
166
127
  }
167
128
  async function completionWithFilteredOpenAIStream(request, requestOptions, completionWithRetry) {
168
- if (request.stream !== true) {
169
- return (await completionWithRetry(request, requestOptions));
170
- }
171
- const stream = await completionWithRetry(request, requestOptions);
172
- return filterOpenAIChatCompletionStream(stream);
129
+ if (request.stream !== true) return await completionWithRetry(request, requestOptions);
130
+ return filterOpenAIChatCompletionStream(await completionWithRetry(request, requestOptions));
173
131
  }
174
132
  function attachLibreChatDeltaFields(chunk, delta) {
175
- if (!AIMessageChunk.isInstance(chunk)) {
176
- return chunk;
177
- }
178
- const libreChatDelta = delta;
179
- if (libreChatDelta.reasoning != null &&
180
- chunk.additional_kwargs.reasoning_content == null) {
181
- chunk.additional_kwargs.reasoning_content = libreChatDelta.reasoning;
182
- }
183
- if (libreChatDelta.reasoning_details != null) {
184
- chunk.additional_kwargs.reasoning_details =
185
- libreChatDelta.reasoning_details;
186
- }
187
- if (libreChatDelta.provider_specific_fields != null) {
188
- chunk.additional_kwargs.provider_specific_fields =
189
- libreChatDelta.provider_specific_fields;
190
- }
191
- return chunk;
133
+ if (!AIMessageChunk.isInstance(chunk)) return chunk;
134
+ const libreChatDelta = delta;
135
+ if (libreChatDelta.reasoning != null && chunk.additional_kwargs.reasoning_content == null) chunk.additional_kwargs.reasoning_content = libreChatDelta.reasoning;
136
+ if (libreChatDelta.reasoning_details != null) chunk.additional_kwargs.reasoning_details = libreChatDelta.reasoning_details;
137
+ if (libreChatDelta.provider_specific_fields != null) chunk.additional_kwargs.provider_specific_fields = libreChatDelta.provider_specific_fields;
138
+ return chunk;
192
139
  }
193
140
  function attachLibreChatMessageFields(message, rawMessage) {
194
- if (!isAIMessage(message)) {
195
- return message;
196
- }
197
- if (rawMessage.reasoning != null &&
198
- message.additional_kwargs.reasoning_content == null) {
199
- message.additional_kwargs.reasoning_content = rawMessage.reasoning;
200
- }
201
- if (rawMessage.reasoning_details != null) {
202
- message.additional_kwargs.reasoning_details = rawMessage.reasoning_details;
203
- }
204
- if (rawMessage.provider_specific_fields != null) {
205
- message.additional_kwargs.provider_specific_fields =
206
- rawMessage.provider_specific_fields;
207
- }
208
- return message;
141
+ if (!isAIMessage(message)) return message;
142
+ if (rawMessage.reasoning != null && message.additional_kwargs.reasoning_content == null) message.additional_kwargs.reasoning_content = rawMessage.reasoning;
143
+ if (rawMessage.reasoning_details != null) message.additional_kwargs.reasoning_details = rawMessage.reasoning_details;
144
+ if (rawMessage.provider_specific_fields != null) message.additional_kwargs.provider_specific_fields = rawMessage.provider_specific_fields;
145
+ return message;
209
146
  }
210
147
  function getCustomOpenAIClientOptions(owner, options) {
211
- if (!owner.client) {
212
- const openAIEndpointConfig = {
213
- baseURL: owner.clientConfig.baseURL,
214
- };
215
- const endpoint = getEndpoint(openAIEndpointConfig);
216
- const params = {
217
- ...owner.clientConfig,
218
- baseURL: endpoint,
219
- timeout: owner.timeout,
220
- maxRetries: 0,
221
- };
222
- if (params.baseURL == null) {
223
- delete params.baseURL;
224
- }
225
- params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);
226
- owner.client = new CustomOpenAIClient(params);
227
- }
228
- const requestOptions = {
229
- ...owner.clientConfig,
230
- ...options,
231
- };
232
- return requestOptions;
148
+ if (!owner.client) {
149
+ const endpoint = getEndpoint({ baseURL: owner.clientConfig.baseURL });
150
+ const params = {
151
+ ...owner.clientConfig,
152
+ baseURL: endpoint,
153
+ timeout: owner.timeout,
154
+ maxRetries: 0
155
+ };
156
+ if (params.baseURL == null) delete params.baseURL;
157
+ params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);
158
+ owner.client = new CustomOpenAIClient(params);
159
+ }
160
+ return {
161
+ ...owner.clientConfig,
162
+ ...options
163
+ };
233
164
  }
234
165
  function findStreamChunkBoundary(text, minSize) {
235
- if (minSize >= text.length) {
236
- return text.length;
237
- }
238
- for (let position = minSize; position < text.length; position++) {
239
- if (STREAM_BOUNDARIES.has(text[position])) {
240
- return position + 1;
241
- }
242
- }
243
- return text.length;
166
+ if (minSize >= text.length) return text.length;
167
+ for (let position = minSize; position < text.length; position++) if (STREAM_BOUNDARIES.has(text[position])) return position + 1;
168
+ return text.length;
244
169
  }
245
170
  function splitStreamToken(text) {
246
- const chunks = [];
247
- let currentIndex = 0;
248
- while (currentIndex < text.length) {
249
- const remainingText = text.slice(currentIndex);
250
- const chunkSize = findStreamChunkBoundary(remainingText, STREAM_CHUNK_MIN_SIZE);
251
- chunks.push(text.slice(currentIndex, currentIndex + chunkSize));
252
- currentIndex += chunkSize;
253
- }
254
- return chunks;
171
+ const chunks = [];
172
+ let currentIndex = 0;
173
+ while (currentIndex < text.length) {
174
+ const chunkSize = findStreamChunkBoundary(text.slice(currentIndex), STREAM_CHUNK_MIN_SIZE);
175
+ chunks.push(text.slice(currentIndex, currentIndex + chunkSize));
176
+ currentIndex += chunkSize;
177
+ }
178
+ return chunks;
255
179
  }
256
180
  function splitTextGenerationChunk(chunk) {
257
- const { message } = chunk;
258
- if (!chunk.text ||
259
- !(message instanceof AIMessageChunk) ||
260
- typeof message.content !== 'string' ||
261
- message.content !== chunk.text ||
262
- chunk.generationInfo?.logprobs != null ||
263
- chunk.generationInfo?.finish_reason != null) {
264
- return [chunk];
265
- }
266
- const tokenChunks = splitStreamToken(chunk.text);
267
- if (tokenChunks.length <= 1) {
268
- return [chunk];
269
- }
270
- let emittedUsage = false;
271
- return tokenChunks.map((token) => {
272
- const usageMetadata = emittedUsage && message.usage_metadata != null
273
- ? undefined
274
- : message.usage_metadata;
275
- if (message.usage_metadata != null && !emittedUsage) {
276
- emittedUsage = true;
277
- }
278
- return new ChatGenerationChunk({
279
- text: token,
280
- generationInfo: chunk.generationInfo,
281
- message: new AIMessageChunk(Object.assign({}, message, {
282
- content: token,
283
- usage_metadata: usageMetadata,
284
- })),
285
- });
286
- });
181
+ const { message } = chunk;
182
+ if (!chunk.text || !(message instanceof AIMessageChunk) || typeof message.content !== "string" || message.content !== chunk.text || chunk.generationInfo?.logprobs != null || chunk.generationInfo?.finish_reason != null) return [chunk];
183
+ const tokenChunks = splitStreamToken(chunk.text);
184
+ if (tokenChunks.length <= 1) return [chunk];
185
+ let emittedUsage = false;
186
+ return tokenChunks.map((token) => {
187
+ const usageMetadata = emittedUsage && message.usage_metadata != null ? void 0 : message.usage_metadata;
188
+ if (message.usage_metadata != null && !emittedUsage) emittedUsage = true;
189
+ return new ChatGenerationChunk({
190
+ text: token,
191
+ generationInfo: chunk.generationInfo,
192
+ message: new AIMessageChunk(Object.assign({}, message, {
193
+ content: token,
194
+ usage_metadata: usageMetadata
195
+ }))
196
+ });
197
+ });
287
198
  }
288
199
  async function emitStreamChunkCallback(chunk, runManager) {
289
- await runManager?.handleLLMNewToken(chunk.text, getStreamChunkTokenIndices(chunk), undefined, undefined, undefined, { chunk });
200
+ await runManager?.handleLLMNewToken(chunk.text, getStreamChunkTokenIndices(chunk), void 0, void 0, void 0, { chunk });
290
201
  }
291
202
  function getStreamChunkTokenIndices(chunk) {
292
- const prompt = chunk.generationInfo?.prompt;
293
- const completion = chunk.generationInfo?.completion;
294
- if (typeof prompt === 'number' && typeof completion === 'number') {
295
- return { prompt, completion };
296
- }
297
- return undefined;
203
+ const prompt = chunk.generationInfo?.prompt;
204
+ const completion = chunk.generationInfo?.completion;
205
+ if (typeof prompt === "number" && typeof completion === "number") return {
206
+ prompt,
207
+ completion
208
+ };
298
209
  }
299
210
  async function* delayStreamChunks(chunks, delay, signal, runManager) {
300
- let lastYieldedAt;
301
- for await (const chunk of chunks) {
302
- const outputChunks = delay != null && delay > 0 ? splitTextGenerationChunk(chunk) : [chunk];
303
- for (const outputChunk of outputChunks) {
304
- signal?.throwIfAborted();
305
- if (delay != null && delay > 0 && lastYieldedAt != null) {
306
- const timeSinceLastYield = Date.now() - lastYieldedAt;
307
- const timeToWait = Math.max(0, delay - timeSinceLastYield);
308
- if (timeToWait > 0) {
309
- await sleepWithAbort(timeToWait, signal);
310
- }
311
- }
312
- signal?.throwIfAborted();
313
- lastYieldedAt = Date.now();
314
- await emitStreamChunkCallback(outputChunk, runManager);
315
- signal?.throwIfAborted();
316
- yield outputChunk;
317
- }
318
- }
211
+ let lastYieldedAt;
212
+ for await (const chunk of chunks) {
213
+ const outputChunks = delay != null && delay > 0 ? splitTextGenerationChunk(chunk) : [chunk];
214
+ for (const outputChunk of outputChunks) {
215
+ signal?.throwIfAborted();
216
+ if (delay != null && delay > 0 && lastYieldedAt != null) {
217
+ const timeSinceLastYield = Date.now() - lastYieldedAt;
218
+ const timeToWait = Math.max(0, delay - timeSinceLastYield);
219
+ if (timeToWait > 0) await sleepWithAbort(timeToWait, signal);
220
+ }
221
+ signal?.throwIfAborted();
222
+ lastYieldedAt = Date.now();
223
+ await emitStreamChunkCallback(outputChunk, runManager);
224
+ signal?.throwIfAborted();
225
+ yield outputChunk;
226
+ }
227
+ }
319
228
  }
320
229
  async function sleepWithAbort(delay, signal) {
321
- if (delay <= 0) {
322
- return;
323
- }
324
- signal?.throwIfAborted();
325
- await new Promise((resolve, reject) => {
326
- const timeout = setTimeout(() => {
327
- signal?.removeEventListener('abort', onAbort);
328
- resolve();
329
- }, delay);
330
- const onAbort = () => {
331
- clearTimeout(timeout);
332
- signal?.removeEventListener('abort', onAbort);
333
- reject(signal?.reason ?? new Error('AbortError: User aborted request.'));
334
- };
335
- signal?.addEventListener('abort', onAbort, { once: true });
336
- if (signal?.aborted === true) {
337
- onAbort();
338
- }
339
- });
230
+ if (delay <= 0) return;
231
+ signal?.throwIfAborted();
232
+ await new Promise((resolve, reject) => {
233
+ const timeout = setTimeout(() => {
234
+ signal?.removeEventListener("abort", onAbort);
235
+ resolve();
236
+ }, delay);
237
+ const onAbort = () => {
238
+ clearTimeout(timeout);
239
+ signal?.removeEventListener("abort", onAbort);
240
+ reject(signal?.reason ?? /* @__PURE__ */ new Error("AbortError: User aborted request."));
241
+ };
242
+ signal?.addEventListener("abort", onAbort, { once: true });
243
+ if (signal?.aborted === true) onAbort();
244
+ });
340
245
  }
341
246
  function createAbortHandler(controller) {
342
- return function () {
343
- controller.abort();
344
- };
247
+ return function() {
248
+ controller.abort();
249
+ };
345
250
  }
346
251
  /**
347
- * Formats a tool in either OpenAI format, or LangChain structured tool format
348
- * into an OpenAI tool format. If the tool is already in OpenAI format, return without
349
- * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format
350
- * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters
351
- * returned from the `zodFunction` util are not defined.
352
- *
353
- * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.
354
- * @param {Object} [fields] Additional fields to add to the OpenAI tool.
355
- * @returns {ToolDefinition} The inputted tool in OpenAI tool format.
356
- */
252
+ * Formats a tool in either OpenAI format, or LangChain structured tool format
253
+ * into an OpenAI tool format. If the tool is already in OpenAI format, return without
254
+ * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format
255
+ * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters
256
+ * returned from the `zodFunction` util are not defined.
257
+ *
258
+ * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.
259
+ * @param {Object} [fields] Additional fields to add to the OpenAI tool.
260
+ * @returns {ToolDefinition} The inputted tool in OpenAI tool format.
261
+ */
357
262
  function _convertToOpenAITool(tool, fields) {
358
- let toolDef;
359
- if (isLangChainTool(tool)) {
360
- toolDef = convertToOpenAITool(tool);
361
- }
362
- else {
363
- toolDef = tool;
364
- }
365
- return toolDef;
366
- }
367
- class CustomOpenAIClient extends OpenAIClient {
368
- abortHandler;
369
- async fetchWithTimeout(url, init, ms, controller) {
370
- const { signal, ...options } = init || {};
371
- const handler = createAbortHandler(controller);
372
- this.abortHandler = handler;
373
- if (signal)
374
- signal.addEventListener('abort', handler, { once: true });
375
- const timeout = setTimeout(handler, ms);
376
- const fetchOptions = {
377
- signal: controller.signal,
378
- ...options,
379
- };
380
- if (fetchOptions.method != null) {
381
- // Custom methods like 'patch' need to be uppercased
382
- // See https://github.com/nodejs/undici/issues/2294
383
- fetchOptions.method = fetchOptions.method.toUpperCase();
384
- }
385
- return (
386
- // use undefined this binding; fetch errors if bound to something else in browser/cloudflare
387
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
388
- /** @ts-ignore */
389
- this.fetch.call(undefined, url, fetchOptions).finally(() => {
390
- clearTimeout(timeout);
391
- }));
392
- }
393
- }
394
- class CustomAzureOpenAIClient extends AzureOpenAI {
395
- abortHandler;
396
- async fetchWithTimeout(url, init, ms, controller) {
397
- const { signal, ...options } = init || {};
398
- const handler = createAbortHandler(controller);
399
- this.abortHandler = handler;
400
- if (signal)
401
- signal.addEventListener('abort', handler, { once: true });
402
- const timeout = setTimeout(handler, ms);
403
- const fetchOptions = {
404
- signal: controller.signal,
405
- ...options,
406
- };
407
- if (fetchOptions.method != null) {
408
- // Custom methods like 'patch' need to be uppercased
409
- // See https://github.com/nodejs/undici/issues/2294
410
- fetchOptions.method = fetchOptions.method.toUpperCase();
411
- }
412
- return (
413
- // use undefined this binding; fetch errors if bound to something else in browser/cloudflare
414
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
415
- /** @ts-ignore */
416
- this.fetch.call(undefined, url, fetchOptions).finally(() => {
417
- clearTimeout(timeout);
418
- }));
419
- }
263
+ let toolDef;
264
+ if (isLangChainTool(tool)) toolDef = convertToOpenAITool(tool);
265
+ else toolDef = tool;
266
+ if (fields?.strict !== void 0) toolDef.function.strict = fields.strict;
267
+ return toolDef;
420
268
  }
421
- class LibreChatOpenAICompletions extends ChatOpenAICompletions {
422
- includeReasoningContent;
423
- includeReasoningDetails;
424
- convertReasoningDetailsToContent;
425
- constructor(fields) {
426
- super(fields);
427
- this.includeReasoningContent = fields?.includeReasoningContent;
428
- this.includeReasoningDetails = fields?.includeReasoningDetails;
429
- this.convertReasoningDetailsToContent =
430
- fields?.convertReasoningDetailsToContent;
431
- }
432
- _getReasoningParams(options) {
433
- return getReasoningParams(this.reasoning, options);
434
- }
435
- _getClientOptions(options) {
436
- return getCustomOpenAIClientOptions(this, options);
437
- }
438
- async completionWithRetry(request, requestOptions) {
439
- return completionWithFilteredOpenAIStream(request, requestOptions, super.completionWithRetry.bind(this));
440
- }
441
- _convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole) {
442
- return attachLibreChatDeltaFields(super._convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole), delta);
443
- }
444
- _convertCompletionsMessageToBaseMessage(message, rawResponse) {
445
- return attachLibreChatMessageFields(super._convertCompletionsMessageToBaseMessage(message, rawResponse), message);
446
- }
447
- async _generate(messages, options, runManager) {
448
- if (this.includeReasoningContent !== true &&
449
- this.includeReasoningDetails !== true) {
450
- return super._generate(messages, options, runManager);
451
- }
452
- options.signal?.throwIfAborted();
453
- const usageMetadata = {};
454
- const params = this.invocationParams(options);
455
- const messagesMapped = _convertMessagesToOpenAIParams(messages, this.model, {
456
- includeReasoningContent: this.includeReasoningContent,
457
- includeReasoningDetails: this.includeReasoningDetails,
458
- convertReasoningDetailsToContent: this.convertReasoningDetailsToContent,
459
- });
460
- if (params.stream === true) {
461
- const stream = this._streamResponseChunks(messages, options, runManager);
462
- const finalChunks = new Map();
463
- for await (const chunk of stream) {
464
- chunk.message.response_metadata = {
465
- ...chunk.generationInfo,
466
- ...chunk.message.response_metadata,
467
- };
468
- const index = typeof chunk.generationInfo?.completion === 'number'
469
- ? chunk.generationInfo.completion
470
- : 0;
471
- const existingChunk = finalChunks.get(index);
472
- if (existingChunk == null) {
473
- finalChunks.set(index, chunk);
474
- }
475
- else {
476
- finalChunks.set(index, existingChunk.concat(chunk));
477
- }
478
- }
479
- const generations = Array.from(finalChunks.entries())
480
- .sort(([aKey], [bKey]) => aKey - bKey)
481
- .map(([, value]) => value);
482
- const { functions, function_call } = this.invocationParams(options);
483
- const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(messages, functions, function_call);
484
- const completionTokenUsage = await this._getNumTokensFromGenerations(generations);
485
- usageMetadata.input_tokens = promptTokenUsage;
486
- usageMetadata.output_tokens = completionTokenUsage;
487
- usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;
488
- return {
489
- generations,
490
- llmOutput: {
491
- estimatedTokenUsage: {
492
- promptTokens: usageMetadata.input_tokens,
493
- completionTokens: usageMetadata.output_tokens,
494
- totalTokens: usageMetadata.total_tokens,
495
- },
496
- },
497
- };
498
- }
499
- const data = await this.completionWithRetry({
500
- ...params,
501
- stream: false,
502
- messages: messagesMapped,
503
- }, {
504
- signal: options.signal,
505
- ...options.options,
506
- });
507
- const { completion_tokens: completionTokens, prompt_tokens: promptTokens, total_tokens: totalTokens, prompt_tokens_details: promptTokensDetails, completion_tokens_details: completionTokensDetails, } = data.usage ?? {};
508
- if (completionTokens != null) {
509
- usageMetadata.output_tokens =
510
- (usageMetadata.output_tokens ?? 0) + completionTokens;
511
- }
512
- if (promptTokens != null) {
513
- usageMetadata.input_tokens =
514
- (usageMetadata.input_tokens ?? 0) + promptTokens;
515
- }
516
- if (totalTokens != null) {
517
- usageMetadata.total_tokens =
518
- (usageMetadata.total_tokens ?? 0) + totalTokens;
519
- }
520
- const promptTokensDetailsWithCacheWrite = promptTokensDetails;
521
- if (promptTokensDetailsWithCacheWrite?.audio_tokens != null ||
522
- promptTokensDetailsWithCacheWrite?.cached_tokens != null ||
523
- promptTokensDetailsWithCacheWrite?.cache_write_tokens != null) {
524
- usageMetadata.input_token_details = {
525
- ...(promptTokensDetailsWithCacheWrite.audio_tokens != null && {
526
- audio: promptTokensDetailsWithCacheWrite.audio_tokens,
527
- }),
528
- ...(promptTokensDetailsWithCacheWrite.cached_tokens != null && {
529
- cache_read: promptTokensDetailsWithCacheWrite.cached_tokens,
530
- }),
531
- ...(promptTokensDetailsWithCacheWrite.cache_write_tokens != null && {
532
- cache_creation: promptTokensDetailsWithCacheWrite.cache_write_tokens,
533
- }),
534
- };
535
- }
536
- if (completionTokensDetails?.audio_tokens != null ||
537
- completionTokensDetails?.reasoning_tokens != null) {
538
- usageMetadata.output_token_details = {
539
- ...(completionTokensDetails.audio_tokens != null && {
540
- audio: completionTokensDetails.audio_tokens,
541
- }),
542
- ...(completionTokensDetails.reasoning_tokens != null && {
543
- reasoning: completionTokensDetails.reasoning_tokens,
544
- }),
545
- };
546
- }
547
- const generations = [];
548
- for (const part of data.choices) {
549
- const generation = {
550
- text: part.message.content ?? '',
551
- message: this._convertCompletionsMessageToBaseMessage(part.message, data),
552
- };
553
- generation.generationInfo = {
554
- finish_reason: part.finish_reason,
555
- ...(part.logprobs ? { logprobs: part.logprobs } : {}),
556
- };
557
- if (isAIMessage(generation.message)) {
558
- generation.message.usage_metadata = usageMetadata;
559
- }
560
- generation.message = new AIMessage(Object.fromEntries(Object.entries(generation.message).filter(([key]) => !key.startsWith('lc_'))));
561
- generations.push(generation);
562
- }
563
- return {
564
- generations,
565
- llmOutput: {
566
- tokenUsage: {
567
- promptTokens: usageMetadata.input_tokens,
568
- completionTokens: usageMetadata.output_tokens,
569
- totalTokens: usageMetadata.total_tokens,
570
- },
571
- },
572
- };
573
- }
574
- async *_streamResponseChunks(messages, options, runManager) {
575
- if (this.includeReasoningContent !== true &&
576
- this.includeReasoningDetails !== true) {
577
- yield* super._streamResponseChunks(messages, options, runManager);
578
- return;
579
- }
580
- const messagesMapped = _convertMessagesToOpenAIParams(messages, this.model, {
581
- includeReasoningContent: this.includeReasoningContent,
582
- includeReasoningDetails: this.includeReasoningDetails,
583
- convertReasoningDetailsToContent: this.convertReasoningDetailsToContent,
584
- });
585
- const params = {
586
- ...this.invocationParams(options, {
587
- streaming: true,
588
- }),
589
- messages: messagesMapped,
590
- stream: true,
591
- };
592
- let defaultRole;
593
- const streamIterable = await this.completionWithRetry(params, options);
594
- let usage;
595
- for await (const data of streamIterable) {
596
- if (options.signal?.aborted === true) {
597
- return;
598
- }
599
- const choices = data.choices;
600
- const choice = choices?.[0];
601
- if (data.usage != null) {
602
- usage = data.usage;
603
- }
604
- if (choice == null) {
605
- continue;
606
- }
607
- const { delta } = choice;
608
- if (delta == null) {
609
- continue;
610
- }
611
- const chunk = this._convertCompletionsDeltaToBaseMessageChunk(delta, data, defaultRole);
612
- defaultRole = delta.role ?? defaultRole;
613
- const newTokenIndices = {
614
- prompt: options.promptIndex ?? 0,
615
- completion: choice.index,
616
- };
617
- if (typeof chunk.content !== 'string') {
618
- // eslint-disable-next-line no-console
619
- console.log('[WARNING]: Received non-string content from OpenAI. This is currently not supported.');
620
- continue;
621
- }
622
- const generationInfo = { ...newTokenIndices };
623
- if (choice.finish_reason != null) {
624
- generationInfo.finish_reason = choice.finish_reason;
625
- generationInfo.system_fingerprint = data.system_fingerprint;
626
- generationInfo.model_name = data.model;
627
- generationInfo.service_tier = data.service_tier;
628
- }
629
- if (this.logprobs === true) {
630
- generationInfo.logprobs = choice.logprobs;
631
- }
632
- const generationChunk = new ChatGenerationChunk({
633
- message: chunk,
634
- text: chunk.content,
635
- generationInfo,
636
- });
637
- yield generationChunk;
638
- await runManager?.handleLLMNewToken(generationChunk.text, newTokenIndices, undefined, undefined, undefined, { chunk: generationChunk });
639
- }
640
- if (usage) {
641
- const promptTokenDetails = usage.prompt_tokens_details;
642
- const inputTokenDetails = {
643
- ...(promptTokenDetails?.audio_tokens != null && {
644
- audio: promptTokenDetails.audio_tokens,
645
- }),
646
- ...(promptTokenDetails?.cached_tokens != null && {
647
- cache_read: promptTokenDetails.cached_tokens,
648
- }),
649
- ...(promptTokenDetails?.cache_write_tokens != null && {
650
- cache_creation: promptTokenDetails.cache_write_tokens,
651
- }),
652
- };
653
- const outputTokenDetails = {
654
- ...(usage.completion_tokens_details?.audio_tokens != null && {
655
- audio: usage.completion_tokens_details.audio_tokens,
656
- }),
657
- ...(usage.completion_tokens_details?.reasoning_tokens != null && {
658
- reasoning: usage.completion_tokens_details.reasoning_tokens,
659
- }),
660
- };
661
- const generationChunk = new ChatGenerationChunk({
662
- message: new AIMessageChunk({
663
- content: '',
664
- response_metadata: { usage: { ...usage } },
665
- usage_metadata: {
666
- input_tokens: usage.prompt_tokens,
667
- output_tokens: usage.completion_tokens,
668
- total_tokens: usage.total_tokens,
669
- ...(Object.keys(inputTokenDetails).length > 0 && {
670
- input_token_details: inputTokenDetails,
671
- }),
672
- ...(Object.keys(outputTokenDetails).length > 0 && {
673
- output_token_details: outputTokenDetails,
674
- }),
675
- },
676
- }),
677
- text: '',
678
- });
679
- yield generationChunk;
680
- await runManager?.handleLLMNewToken(generationChunk.text, {
681
- prompt: 0,
682
- completion: 0,
683
- }, undefined, undefined, undefined, { chunk: generationChunk });
684
- }
685
- if (options.signal?.aborted === true) {
686
- throw new Error('AbortError');
687
- }
688
- }
689
- }
690
- class LibreChatOpenAIResponses extends ChatOpenAIResponses {
691
- _getReasoningParams(options) {
692
- return getReasoningParams(this.reasoning, options);
693
- }
694
- _getClientOptions(options) {
695
- return getCustomOpenAIClientOptions(this, options);
696
- }
269
+ var CustomOpenAIClient = class extends OpenAIClient {
270
+ abortHandler;
271
+ async fetchWithTimeout(url, init, ms, controller) {
272
+ const { signal, ...options } = init || {};
273
+ const handler = createAbortHandler(controller);
274
+ this.abortHandler = handler;
275
+ if (signal) signal.addEventListener("abort", handler, { once: true });
276
+ const timeout = setTimeout(handler, ms);
277
+ const fetchOptions = {
278
+ signal: controller.signal,
279
+ ...options
280
+ };
281
+ if (fetchOptions.method != null) fetchOptions.method = fetchOptions.method.toUpperCase();
282
+ return this.fetch.call(void 0, url, fetchOptions).finally(() => {
283
+ clearTimeout(timeout);
284
+ });
285
+ }
286
+ };
287
+ var CustomAzureOpenAIClient = class extends AzureOpenAI {
288
+ abortHandler;
289
+ async fetchWithTimeout(url, init, ms, controller) {
290
+ const { signal, ...options } = init || {};
291
+ const handler = createAbortHandler(controller);
292
+ this.abortHandler = handler;
293
+ if (signal) signal.addEventListener("abort", handler, { once: true });
294
+ const timeout = setTimeout(handler, ms);
295
+ const fetchOptions = {
296
+ signal: controller.signal,
297
+ ...options
298
+ };
299
+ if (fetchOptions.method != null) fetchOptions.method = fetchOptions.method.toUpperCase();
300
+ return this.fetch.call(void 0, url, fetchOptions).finally(() => {
301
+ clearTimeout(timeout);
302
+ });
303
+ }
304
+ };
305
+ const OFFICIAL_OPENAI_BASE_URL_PATTERN = /^https:\/\/api\.openai\.com(\/|$)/;
306
+ /**
307
+ * Official OpenAI (api.openai.com) and Azure OpenAI Chat Completions streams
308
+ * emit tool-call deltas strictly sequentially by index: once a delta for a
309
+ * later index appears, a prior index's arguments never change. Stamping this
310
+ * adapter lets the stream handler seal a prior call for eager execution the
311
+ * moment the next call begins. OpenAI-compatible endpoints (custom baseURL)
312
+ * must NOT be stamped — e.g. live Kimi/Moonshot streams revise prior-index
313
+ * args after advancing — so callers gate on the wire endpoint, not the class.
314
+ */
315
+ function stampSequentialStreamedToolCallAdapter(message) {
316
+ if (message instanceof AIMessageChunk && (message.tool_call_chunks?.length ?? 0) > 0) message.response_metadata = {
317
+ ...message.response_metadata,
318
+ [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]: OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER
319
+ };
320
+ return message;
697
321
  }
698
- class LibreChatAzureOpenAICompletions extends AzureChatOpenAICompletions {
699
- _getReasoningParams(options) {
700
- return getGatedReasoningParams(this.model, this.reasoning, options);
701
- }
702
- _getClientOptions(options) {
703
- if (!this.client) {
704
- const openAIEndpointConfig = {
705
- azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
706
- azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
707
- azureOpenAIApiKey: this.azureOpenAIApiKey,
708
- azureOpenAIBasePath: this.azureOpenAIBasePath,
709
- azureADTokenProvider: this.azureADTokenProvider,
710
- baseURL: this.clientConfig.baseURL,
711
- };
712
- const endpoint = getEndpoint(openAIEndpointConfig);
713
- const params = {
714
- ...this.clientConfig,
715
- baseURL: endpoint,
716
- timeout: this.timeout,
717
- maxRetries: 0,
718
- };
719
- if (!this.azureADTokenProvider) {
720
- params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
721
- }
722
- if (params.baseURL == null) {
723
- delete params.baseURL;
724
- }
725
- const defaultHeaders = normalizeHeaders(params.defaultHeaders);
726
- params.defaultHeaders = {
727
- ...params.defaultHeaders,
728
- 'User-Agent': defaultHeaders['User-Agent'] != null
729
- ? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`
730
- : 'librechat-azure-openai-v2',
731
- };
732
- this.client = new CustomAzureOpenAIClient({
733
- apiVersion: this.azureOpenAIApiVersion,
734
- azureADTokenProvider: this.azureADTokenProvider,
735
- ...params,
736
- });
737
- }
738
- const requestOptions = {
739
- ...this.clientConfig,
740
- ...options,
741
- };
742
- if (this.azureOpenAIApiKey != null) {
743
- requestOptions.headers = {
744
- 'api-key': this.azureOpenAIApiKey,
745
- ...requestOptions.headers,
746
- };
747
- requestOptions.query = {
748
- 'api-version': this.azureOpenAIApiVersion,
749
- ...requestOptions.query,
750
- };
751
- }
752
- return requestOptions;
753
- }
754
- async completionWithRetry(request, requestOptions) {
755
- return completionWithFilteredOpenAIStream(request, requestOptions, super.completionWithRetry.bind(this));
756
- }
322
+ function isOfficialOpenAIBaseURL(baseURL) {
323
+ const effectiveBaseURL = baseURL != null && baseURL !== "" ? baseURL : process.env.OPENAI_BASE_URL;
324
+ if (effectiveBaseURL == null || effectiveBaseURL === "") return true;
325
+ return OFFICIAL_OPENAI_BASE_URL_PATTERN.test(effectiveBaseURL);
757
326
  }
758
- class LibreChatAzureOpenAIResponses extends AzureChatOpenAIResponses {
759
- _getReasoningParams(options) {
760
- return getGatedReasoningParams(this.model, this.reasoning, options);
761
- }
762
- _getClientOptions(options) {
763
- if (!this.client) {
764
- const openAIEndpointConfig = {
765
- azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
766
- azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
767
- azureOpenAIApiKey: this.azureOpenAIApiKey,
768
- azureOpenAIBasePath: this.azureOpenAIBasePath,
769
- azureADTokenProvider: this.azureADTokenProvider,
770
- baseURL: this.clientConfig.baseURL,
771
- };
772
- const endpoint = getEndpoint(openAIEndpointConfig);
773
- const params = {
774
- ...this.clientConfig,
775
- baseURL: endpoint,
776
- timeout: this.timeout,
777
- maxRetries: 0,
778
- };
779
- if (!this.azureADTokenProvider) {
780
- params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
781
- }
782
- if (params.baseURL == null) {
783
- delete params.baseURL;
784
- }
785
- const defaultHeaders = normalizeHeaders(params.defaultHeaders);
786
- params.defaultHeaders = {
787
- ...params.defaultHeaders,
788
- 'User-Agent': defaultHeaders['User-Agent'] != null
789
- ? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`
790
- : 'librechat-azure-openai-v2',
791
- };
792
- this.client = new CustomAzureOpenAIClient({
793
- apiVersion: this.azureOpenAIApiVersion,
794
- azureADTokenProvider: this.azureADTokenProvider,
795
- ...params,
796
- });
797
- }
798
- const requestOptions = {
799
- ...this.clientConfig,
800
- ...options,
801
- };
802
- if (this.azureOpenAIApiKey != null) {
803
- requestOptions.headers = {
804
- 'api-key': this.azureOpenAIApiKey,
805
- ...requestOptions.headers,
806
- };
807
- requestOptions.query = {
808
- 'api-version': this.azureOpenAIApiVersion,
809
- ...requestOptions.query,
810
- };
811
- }
812
- return requestOptions;
813
- }
327
+ const AZURE_FIRST_PARTY_BASE_PATH_PATTERN = /^https:\/\/[^/]+\.(openai\.azure\.com|cognitiveservices\.azure\.com|api\.cognitive\.microsoft\.com)(:\d+)?(\/|$)/;
328
+ /**
329
+ * Azure OpenAI is first-party when requests resolve to an instance-name
330
+ * endpoint or an *.openai.azure.com / *.cognitiveservices.azure.com /
331
+ * regional *.api.cognitive.microsoft.com base path. A custom
332
+ * `clientConfig.baseURL` or a non-Azure `azureOpenAIBasePath` routes through
333
+ * a proxy or Azure-compatible endpoint whose stream contract is unknown, so
334
+ * those are not stamped.
335
+ */
336
+ function isFirstPartyAzureEndpoint(args) {
337
+ if (args.baseURL != null && args.baseURL !== "") return false;
338
+ if (args.azureOpenAIBasePath == null || args.azureOpenAIBasePath === "") return true;
339
+ return AZURE_FIRST_PARTY_BASE_PATH_PATTERN.test(args.azureOpenAIBasePath);
814
340
  }
341
+ var LibreChatOpenAICompletions = class extends ChatOpenAICompletions {
342
+ includeReasoningContent;
343
+ includeReasoningDetails;
344
+ convertReasoningDetailsToContent;
345
+ constructor(fields) {
346
+ super(fields);
347
+ this.includeReasoningContent = fields?.includeReasoningContent;
348
+ this.includeReasoningDetails = fields?.includeReasoningDetails;
349
+ this.convertReasoningDetailsToContent = fields?.convertReasoningDetailsToContent;
350
+ }
351
+ _getReasoningParams(options) {
352
+ return getReasoningParams(this.reasoning, options);
353
+ }
354
+ _getClientOptions(options) {
355
+ return getCustomOpenAIClientOptions(this, options);
356
+ }
357
+ async completionWithRetry(request, requestOptions) {
358
+ return completionWithFilteredOpenAIStream(request, requestOptions, super.completionWithRetry.bind(this));
359
+ }
360
+ _convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole) {
361
+ const message = attachLibreChatDeltaFields(super._convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole), delta);
362
+ if (isOfficialOpenAIBaseURL(this.clientConfig.baseURL)) return stampSequentialStreamedToolCallAdapter(message);
363
+ return message;
364
+ }
365
+ _convertCompletionsMessageToBaseMessage(message, rawResponse) {
366
+ return attachLibreChatMessageFields(super._convertCompletionsMessageToBaseMessage(message, rawResponse), message);
367
+ }
368
+ async _generate(messages, options, runManager) {
369
+ if (this.includeReasoningContent !== true && this.includeReasoningDetails !== true) return super._generate(messages, options, runManager);
370
+ options.signal?.throwIfAborted();
371
+ const usageMetadata = {};
372
+ const params = this.invocationParams(options);
373
+ const messagesMapped = _convertMessagesToOpenAIParams(messages, this.model, {
374
+ includeReasoningContent: this.includeReasoningContent,
375
+ includeReasoningDetails: this.includeReasoningDetails,
376
+ convertReasoningDetailsToContent: this.convertReasoningDetailsToContent
377
+ });
378
+ if (params.stream === true) {
379
+ const stream = this._streamResponseChunks(messages, options, runManager);
380
+ const finalChunks = /* @__PURE__ */ new Map();
381
+ for await (const chunk of stream) {
382
+ chunk.message.response_metadata = {
383
+ ...chunk.generationInfo,
384
+ ...chunk.message.response_metadata
385
+ };
386
+ const index = typeof chunk.generationInfo?.completion === "number" ? chunk.generationInfo.completion : 0;
387
+ const existingChunk = finalChunks.get(index);
388
+ if (existingChunk == null) finalChunks.set(index, chunk);
389
+ else finalChunks.set(index, existingChunk.concat(chunk));
390
+ }
391
+ const generations = Array.from(finalChunks.entries()).sort(([aKey], [bKey]) => aKey - bKey).map(([, value]) => value);
392
+ const { functions, function_call } = this.invocationParams(options);
393
+ const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(messages, functions, function_call);
394
+ const completionTokenUsage = await this._getNumTokensFromGenerations(generations);
395
+ usageMetadata.input_tokens = promptTokenUsage;
396
+ usageMetadata.output_tokens = completionTokenUsage;
397
+ usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;
398
+ return {
399
+ generations,
400
+ llmOutput: { estimatedTokenUsage: {
401
+ promptTokens: usageMetadata.input_tokens,
402
+ completionTokens: usageMetadata.output_tokens,
403
+ totalTokens: usageMetadata.total_tokens
404
+ } }
405
+ };
406
+ }
407
+ const data = await this.completionWithRetry({
408
+ ...params,
409
+ stream: false,
410
+ messages: messagesMapped
411
+ }, {
412
+ signal: options.signal,
413
+ ...options.options
414
+ });
415
+ const { completion_tokens: completionTokens, prompt_tokens: promptTokens, total_tokens: totalTokens, prompt_tokens_details: promptTokensDetails, completion_tokens_details: completionTokensDetails } = data.usage ?? {};
416
+ if (completionTokens != null) usageMetadata.output_tokens = (usageMetadata.output_tokens ?? 0) + completionTokens;
417
+ if (promptTokens != null) usageMetadata.input_tokens = (usageMetadata.input_tokens ?? 0) + promptTokens;
418
+ if (totalTokens != null) usageMetadata.total_tokens = (usageMetadata.total_tokens ?? 0) + totalTokens;
419
+ const promptTokensDetailsWithCacheWrite = promptTokensDetails;
420
+ if (promptTokensDetailsWithCacheWrite?.audio_tokens != null || promptTokensDetailsWithCacheWrite?.cached_tokens != null || promptTokensDetailsWithCacheWrite?.cache_write_tokens != null) usageMetadata.input_token_details = {
421
+ ...promptTokensDetailsWithCacheWrite.audio_tokens != null && { audio: promptTokensDetailsWithCacheWrite.audio_tokens },
422
+ ...promptTokensDetailsWithCacheWrite.cached_tokens != null && { cache_read: promptTokensDetailsWithCacheWrite.cached_tokens },
423
+ ...promptTokensDetailsWithCacheWrite.cache_write_tokens != null && { cache_creation: promptTokensDetailsWithCacheWrite.cache_write_tokens }
424
+ };
425
+ if (completionTokensDetails?.audio_tokens != null || completionTokensDetails?.reasoning_tokens != null) usageMetadata.output_token_details = {
426
+ ...completionTokensDetails.audio_tokens != null && { audio: completionTokensDetails.audio_tokens },
427
+ ...completionTokensDetails.reasoning_tokens != null && { reasoning: completionTokensDetails.reasoning_tokens }
428
+ };
429
+ const generations = [];
430
+ for (const part of data.choices) {
431
+ const generation = {
432
+ text: part.message.content ?? "",
433
+ message: this._convertCompletionsMessageToBaseMessage(part.message, data)
434
+ };
435
+ generation.generationInfo = {
436
+ finish_reason: part.finish_reason,
437
+ ...part.logprobs ? { logprobs: part.logprobs } : {}
438
+ };
439
+ if (isAIMessage(generation.message)) generation.message.usage_metadata = usageMetadata;
440
+ generation.message = new AIMessage(Object.fromEntries(Object.entries(generation.message).filter(([key]) => !key.startsWith("lc_"))));
441
+ generations.push(generation);
442
+ }
443
+ return {
444
+ generations,
445
+ llmOutput: { tokenUsage: {
446
+ promptTokens: usageMetadata.input_tokens,
447
+ completionTokens: usageMetadata.output_tokens,
448
+ totalTokens: usageMetadata.total_tokens
449
+ } }
450
+ };
451
+ }
452
+ async *_streamResponseChunks(messages, options, runManager) {
453
+ if (this.includeReasoningContent !== true && this.includeReasoningDetails !== true) {
454
+ yield* super._streamResponseChunks(messages, options, runManager);
455
+ return;
456
+ }
457
+ const messagesMapped = _convertMessagesToOpenAIParams(messages, this.model, {
458
+ includeReasoningContent: this.includeReasoningContent,
459
+ includeReasoningDetails: this.includeReasoningDetails,
460
+ convertReasoningDetailsToContent: this.convertReasoningDetailsToContent
461
+ });
462
+ const params = {
463
+ ...this.invocationParams(options, { streaming: true }),
464
+ messages: messagesMapped,
465
+ stream: true
466
+ };
467
+ let defaultRole;
468
+ const streamIterable = await this.completionWithRetry(params, options);
469
+ let usage;
470
+ for await (const data of streamIterable) {
471
+ if (options.signal?.aborted === true) return;
472
+ const choice = data.choices?.[0];
473
+ if (data.usage != null) usage = data.usage;
474
+ if (choice == null) continue;
475
+ const { delta } = choice;
476
+ if (delta == null) continue;
477
+ const chunk = this._convertCompletionsDeltaToBaseMessageChunk(delta, data, defaultRole);
478
+ defaultRole = delta.role ?? defaultRole;
479
+ const newTokenIndices = {
480
+ prompt: options.promptIndex ?? 0,
481
+ completion: choice.index
482
+ };
483
+ if (typeof chunk.content !== "string") {
484
+ console.log("[WARNING]: Received non-string content from OpenAI. This is currently not supported.");
485
+ continue;
486
+ }
487
+ const generationInfo = { ...newTokenIndices };
488
+ if (choice.finish_reason != null) {
489
+ generationInfo.finish_reason = choice.finish_reason;
490
+ generationInfo.system_fingerprint = data.system_fingerprint;
491
+ generationInfo.model_name = data.model;
492
+ generationInfo.service_tier = data.service_tier;
493
+ }
494
+ if (this.logprobs === true) generationInfo.logprobs = choice.logprobs;
495
+ const generationChunk = new ChatGenerationChunk({
496
+ message: chunk,
497
+ text: chunk.content,
498
+ generationInfo
499
+ });
500
+ yield generationChunk;
501
+ await runManager?.handleLLMNewToken(generationChunk.text, newTokenIndices, void 0, void 0, void 0, { chunk: generationChunk });
502
+ }
503
+ if (usage) {
504
+ const promptTokenDetails = usage.prompt_tokens_details;
505
+ const inputTokenDetails = {
506
+ ...promptTokenDetails?.audio_tokens != null && { audio: promptTokenDetails.audio_tokens },
507
+ ...promptTokenDetails?.cached_tokens != null && { cache_read: promptTokenDetails.cached_tokens },
508
+ ...promptTokenDetails?.cache_write_tokens != null && { cache_creation: promptTokenDetails.cache_write_tokens }
509
+ };
510
+ const outputTokenDetails = {
511
+ ...usage.completion_tokens_details?.audio_tokens != null && { audio: usage.completion_tokens_details.audio_tokens },
512
+ ...usage.completion_tokens_details?.reasoning_tokens != null && { reasoning: usage.completion_tokens_details.reasoning_tokens }
513
+ };
514
+ const generationChunk = new ChatGenerationChunk({
515
+ message: new AIMessageChunk({
516
+ content: "",
517
+ response_metadata: { usage: { ...usage } },
518
+ usage_metadata: {
519
+ input_tokens: usage.prompt_tokens,
520
+ output_tokens: usage.completion_tokens,
521
+ total_tokens: usage.total_tokens,
522
+ ...Object.keys(inputTokenDetails).length > 0 && { input_token_details: inputTokenDetails },
523
+ ...Object.keys(outputTokenDetails).length > 0 && { output_token_details: outputTokenDetails }
524
+ }
525
+ }),
526
+ text: ""
527
+ });
528
+ yield generationChunk;
529
+ await runManager?.handleLLMNewToken(generationChunk.text, {
530
+ prompt: 0,
531
+ completion: 0
532
+ }, void 0, void 0, void 0, { chunk: generationChunk });
533
+ }
534
+ if (options.signal?.aborted === true) throw new Error("AbortError");
535
+ }
536
+ };
537
+ var LibreChatOpenAIResponses = class extends ChatOpenAIResponses {
538
+ _getReasoningParams(options) {
539
+ return getReasoningParams(this.reasoning, options);
540
+ }
541
+ _getClientOptions(options) {
542
+ return getCustomOpenAIClientOptions(this, options);
543
+ }
544
+ };
545
+ var LibreChatAzureOpenAICompletions = class extends AzureChatOpenAICompletions {
546
+ _getReasoningParams(options) {
547
+ return getGatedReasoningParams(this.model, this.reasoning, options);
548
+ }
549
+ _convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole) {
550
+ const message = super._convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole);
551
+ if (isFirstPartyAzureEndpoint({
552
+ baseURL: this.clientConfig.baseURL,
553
+ azureOpenAIBasePath: this.azureOpenAIBasePath
554
+ })) return stampSequentialStreamedToolCallAdapter(message);
555
+ return message;
556
+ }
557
+ _getClientOptions(options) {
558
+ if (!this.client) {
559
+ const openAIEndpointConfig = {
560
+ azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
561
+ azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
562
+ azureOpenAIApiKey: this.azureOpenAIApiKey,
563
+ azureOpenAIBasePath: this.azureOpenAIBasePath,
564
+ azureADTokenProvider: this.azureADTokenProvider,
565
+ baseURL: this.clientConfig.baseURL
566
+ };
567
+ const endpoint = getEndpoint(openAIEndpointConfig);
568
+ const params = {
569
+ ...this.clientConfig,
570
+ baseURL: endpoint,
571
+ timeout: this.timeout,
572
+ maxRetries: 0
573
+ };
574
+ if (!this.azureADTokenProvider) params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
575
+ if (params.baseURL == null) delete params.baseURL;
576
+ const defaultHeaders = normalizeHeaders(params.defaultHeaders);
577
+ params.defaultHeaders = {
578
+ ...params.defaultHeaders,
579
+ "User-Agent": defaultHeaders["User-Agent"] != null ? `${defaultHeaders["User-Agent"]}: librechat-azure-openai-v2` : "librechat-azure-openai-v2"
580
+ };
581
+ this.client = new CustomAzureOpenAIClient({
582
+ apiVersion: this.azureOpenAIApiVersion,
583
+ azureADTokenProvider: this.azureADTokenProvider,
584
+ ...params
585
+ });
586
+ }
587
+ const requestOptions = {
588
+ ...this.clientConfig,
589
+ ...options
590
+ };
591
+ if (this.azureOpenAIApiKey != null) {
592
+ requestOptions.headers = {
593
+ "api-key": this.azureOpenAIApiKey,
594
+ ...requestOptions.headers
595
+ };
596
+ requestOptions.query = {
597
+ "api-version": this.azureOpenAIApiVersion,
598
+ ...requestOptions.query
599
+ };
600
+ }
601
+ return requestOptions;
602
+ }
603
+ async completionWithRetry(request, requestOptions) {
604
+ return completionWithFilteredOpenAIStream(request, requestOptions, super.completionWithRetry.bind(this));
605
+ }
606
+ };
607
+ var LibreChatAzureOpenAIResponses = class extends AzureChatOpenAIResponses {
608
+ _getReasoningParams(options) {
609
+ return getGatedReasoningParams(this.model, this.reasoning, options);
610
+ }
611
+ _getClientOptions(options) {
612
+ if (!this.client) {
613
+ const openAIEndpointConfig = {
614
+ azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
615
+ azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
616
+ azureOpenAIApiKey: this.azureOpenAIApiKey,
617
+ azureOpenAIBasePath: this.azureOpenAIBasePath,
618
+ azureADTokenProvider: this.azureADTokenProvider,
619
+ baseURL: this.clientConfig.baseURL
620
+ };
621
+ const endpoint = getEndpoint(openAIEndpointConfig);
622
+ const params = {
623
+ ...this.clientConfig,
624
+ baseURL: endpoint,
625
+ timeout: this.timeout,
626
+ maxRetries: 0
627
+ };
628
+ if (!this.azureADTokenProvider) params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
629
+ if (params.baseURL == null) delete params.baseURL;
630
+ const defaultHeaders = normalizeHeaders(params.defaultHeaders);
631
+ params.defaultHeaders = {
632
+ ...params.defaultHeaders,
633
+ "User-Agent": defaultHeaders["User-Agent"] != null ? `${defaultHeaders["User-Agent"]}: librechat-azure-openai-v2` : "librechat-azure-openai-v2"
634
+ };
635
+ this.client = new CustomAzureOpenAIClient({
636
+ apiVersion: this.azureOpenAIApiVersion,
637
+ azureADTokenProvider: this.azureADTokenProvider,
638
+ ...params
639
+ });
640
+ }
641
+ const requestOptions = {
642
+ ...this.clientConfig,
643
+ ...options
644
+ };
645
+ if (this.azureOpenAIApiKey != null) {
646
+ requestOptions.headers = {
647
+ "api-key": this.azureOpenAIApiKey,
648
+ ...requestOptions.headers
649
+ };
650
+ requestOptions.query = {
651
+ "api-version": this.azureOpenAIApiVersion,
652
+ ...requestOptions.query
653
+ };
654
+ }
655
+ return requestOptions;
656
+ }
657
+ };
815
658
  function withLibreChatOpenAIFields(fields) {
816
- const nextFields = fields ?? {};
817
- return {
818
- ...nextFields,
819
- completions: nextFields.completions ?? new LibreChatOpenAICompletions(nextFields),
820
- responses: nextFields.responses ?? new LibreChatOpenAIResponses(nextFields),
821
- };
822
- }
823
- class ChatOpenAI extends ChatOpenAI$1 {
824
- _lc_stream_delay;
825
- constructor(fields) {
826
- super(withLibreChatOpenAIFields(fields));
827
- this._lc_stream_delay = fields?._lc_stream_delay;
828
- }
829
- get exposedClient() {
830
- return getExposedOpenAIClient(this.completions, this.responses, this._useResponsesApi(undefined));
831
- }
832
- static lc_name() {
833
- return 'LibreChatOpenAI';
834
- }
835
- _getClientOptions(options) {
836
- if (!this.client) {
837
- const openAIEndpointConfig = {
838
- baseURL: this.clientConfig.baseURL,
839
- };
840
- const endpoint = getEndpoint(openAIEndpointConfig);
841
- const params = {
842
- ...this.clientConfig,
843
- baseURL: endpoint,
844
- timeout: this.timeout,
845
- maxRetries: 0,
846
- };
847
- if (params.baseURL == null) {
848
- delete params.baseURL;
849
- }
850
- this.client = new CustomOpenAIClient(params);
851
- }
852
- const requestOptions = {
853
- ...this.clientConfig,
854
- ...options,
855
- };
856
- return requestOptions;
857
- }
858
- /**
859
- * Returns backwards compatible reasoning parameters from constructor params and call options
860
- * @internal
861
- */
862
- getReasoningParams(options) {
863
- return getReasoningParams(this.reasoning, options);
864
- }
865
- _getReasoningParams(options) {
866
- return this.getReasoningParams(options);
867
- }
868
- async *_streamResponseChunks(messages, options, runManager) {
869
- yield* delayStreamChunks(super._streamResponseChunks(messages, options, undefined), this._lc_stream_delay, options.signal, runManager);
870
- }
871
- }
872
- class AzureChatOpenAI extends AzureChatOpenAI$1 {
873
- _lc_stream_delay;
874
- constructor(fields) {
875
- super(fields);
876
- this.completions = new LibreChatAzureOpenAICompletions(fields);
877
- this.responses = new LibreChatAzureOpenAIResponses(fields);
878
- this._lc_stream_delay = fields?._lc_stream_delay;
879
- }
880
- get exposedClient() {
881
- return getExposedOpenAIClient(this.completions, this.responses, this._useResponsesApi(undefined));
882
- }
883
- static lc_name() {
884
- return 'LibreChatAzureOpenAI';
885
- }
886
- /**
887
- * Returns backwards compatible reasoning parameters from constructor params and call options
888
- * @internal
889
- */
890
- getReasoningParams(options) {
891
- return getGatedReasoningParams(this.model, this.reasoning, options);
892
- }
893
- _getReasoningParams(options) {
894
- return this.getReasoningParams(options);
895
- }
896
- _getClientOptions(options) {
897
- if (!this.client) {
898
- const openAIEndpointConfig = {
899
- azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
900
- azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
901
- azureOpenAIApiKey: this.azureOpenAIApiKey,
902
- azureOpenAIBasePath: this.azureOpenAIBasePath,
903
- azureADTokenProvider: this.azureADTokenProvider,
904
- baseURL: this.clientConfig.baseURL,
905
- };
906
- const endpoint = getEndpoint(openAIEndpointConfig);
907
- const params = {
908
- ...this.clientConfig,
909
- baseURL: endpoint,
910
- timeout: this.timeout,
911
- maxRetries: 0,
912
- };
913
- if (!this.azureADTokenProvider) {
914
- params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
915
- }
916
- if (params.baseURL == null) {
917
- delete params.baseURL;
918
- }
919
- const defaultHeaders = normalizeHeaders(params.defaultHeaders);
920
- params.defaultHeaders = {
921
- ...params.defaultHeaders,
922
- 'User-Agent': defaultHeaders['User-Agent'] != null
923
- ? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`
924
- : 'librechat-azure-openai-v2',
925
- };
926
- this.client = new CustomAzureOpenAIClient({
927
- apiVersion: this.azureOpenAIApiVersion,
928
- azureADTokenProvider: this.azureADTokenProvider,
929
- ...params,
930
- });
931
- }
932
- const requestOptions = {
933
- ...this.clientConfig,
934
- ...options,
935
- };
936
- if (this.azureOpenAIApiKey != null) {
937
- requestOptions.headers = {
938
- 'api-key': this.azureOpenAIApiKey,
939
- ...requestOptions.headers,
940
- };
941
- requestOptions.query = {
942
- 'api-version': this.azureOpenAIApiVersion,
943
- ...requestOptions.query,
944
- };
945
- }
946
- return requestOptions;
947
- }
948
- async *_streamResponseChunks(messages, options, runManager) {
949
- yield* delayStreamChunks(super._streamResponseChunks(messages, options, undefined), this._lc_stream_delay, options.signal, runManager);
950
- }
951
- }
952
- class ChatDeepSeek extends ChatDeepSeek$1 {
953
- _lc_stream_delay;
954
- constructor(fields) {
955
- super(fields);
956
- this._lc_stream_delay = fields?._lc_stream_delay;
957
- }
958
- get exposedClient() {
959
- return this.client;
960
- }
961
- static lc_name() {
962
- return 'LibreChatDeepSeek';
963
- }
964
- _convertDeepSeekMessages(messages) {
965
- return _convertMessagesToOpenAIParams(messages, this.model, {
966
- includeReasoningContent: true,
967
- });
968
- }
969
- async _generate(messages, options, runManager) {
970
- options.signal?.throwIfAborted();
971
- const params = this.invocationParams(options);
972
- if (params.stream === true) {
973
- return super._generate(messages, options, runManager);
974
- }
975
- const messagesMapped = this._convertDeepSeekMessages(messages);
976
- const response = await this.completionWithRetry({
977
- ...params,
978
- stream: false,
979
- messages: messagesMapped,
980
- }, {
981
- signal: options.signal,
982
- ...options.options,
983
- });
984
- const usageMetadata = createUsageMetadata(response.usage);
985
- const generations = response.choices.map((part) => {
986
- const text = part.message.content ?? '';
987
- const generation = {
988
- text,
989
- message: this._convertCompletionsMessageToBaseMessage(part.message, response),
990
- };
991
- generation.generationInfo = {
992
- finish_reason: part.finish_reason,
993
- ...(part.logprobs != null ? { logprobs: part.logprobs } : {}),
994
- };
995
- if (isAIMessage(generation.message)) {
996
- generation.message.usage_metadata = usageMetadata;
997
- }
998
- generation.message = new AIMessage(Object.fromEntries(Object.entries(generation.message).filter(([key]) => !key.startsWith('lc_'))));
999
- return generation;
1000
- });
1001
- return {
1002
- generations,
1003
- llmOutput: {
1004
- tokenUsage: {
1005
- promptTokens: usageMetadata.input_tokens,
1006
- completionTokens: usageMetadata.output_tokens,
1007
- totalTokens: usageMetadata.total_tokens,
1008
- },
1009
- },
1010
- };
1011
- }
1012
- _getClientOptions(options) {
1013
- if (!this.client) {
1014
- const openAIEndpointConfig = {
1015
- baseURL: this.clientConfig.baseURL,
1016
- };
1017
- const endpoint = getEndpoint(openAIEndpointConfig);
1018
- const params = {
1019
- ...this.clientConfig,
1020
- baseURL: endpoint,
1021
- timeout: this.timeout,
1022
- maxRetries: 0,
1023
- };
1024
- if (params.baseURL == null) {
1025
- delete params.baseURL;
1026
- }
1027
- this.client = new CustomOpenAIClient(params);
1028
- }
1029
- const requestOptions = {
1030
- ...this.clientConfig,
1031
- ...options,
1032
- };
1033
- return requestOptions;
1034
- }
1035
- async *_streamResponseChunks(messages, options, runManager) {
1036
- yield* delayStreamChunks(this._streamResponseChunksWithReasoning(messages, options, undefined), this._lc_stream_delay, options.signal, runManager);
1037
- }
1038
- /** Parses raw `<think>` fallback tags across chunks and emits sanitized DeepSeek stream chunks. */
1039
- async *_streamResponseChunksWithReasoning(messages, options, runManager) {
1040
- const stream = this._streamResponseChunksFromReasoningMessages(messages, options);
1041
- const thinkStartTag = '<think>';
1042
- const thinkEndTag = '</think>';
1043
- let tokensBuffer = '';
1044
- let isThinking = false;
1045
- for await (const chunk of stream) {
1046
- if (options.signal?.aborted === true) {
1047
- throw new Error('AbortError');
1048
- }
1049
- const reasoningContent = chunk.message.additional_kwargs.reasoning_content;
1050
- if (reasoningContent != null && reasoningContent !== '') {
1051
- yield* this._yieldDeepSeekStreamChunk(chunk, runManager);
1052
- continue;
1053
- }
1054
- const text = chunk.text;
1055
- if (text === '') {
1056
- yield* this._yieldDeepSeekStreamChunk(chunk, runManager);
1057
- continue;
1058
- }
1059
- tokensBuffer += text;
1060
- while (tokensBuffer !== '') {
1061
- if (isThinking) {
1062
- const thinkEndIndex = tokensBuffer.indexOf(thinkEndTag);
1063
- if (thinkEndIndex !== -1) {
1064
- const thoughtContent = tokensBuffer.substring(0, thinkEndIndex);
1065
- if (thoughtContent !== '') {
1066
- yield* this._yieldDeepSeekReasoningText(chunk, thoughtContent, runManager);
1067
- }
1068
- tokensBuffer = tokensBuffer.substring(thinkEndIndex + thinkEndTag.length);
1069
- isThinking = false;
1070
- continue;
1071
- }
1072
- const splitIndex = this._getDeepSeekPartialTagSplitIndex(tokensBuffer, thinkEndTag);
1073
- if (splitIndex !== -1) {
1074
- const safeToYield = tokensBuffer.substring(0, splitIndex);
1075
- if (safeToYield !== '') {
1076
- yield* this._yieldDeepSeekReasoningText(chunk, safeToYield, runManager);
1077
- }
1078
- tokensBuffer = tokensBuffer.substring(splitIndex);
1079
- break;
1080
- }
1081
- yield* this._yieldDeepSeekReasoningText(chunk, tokensBuffer, runManager);
1082
- tokensBuffer = '';
1083
- break;
1084
- }
1085
- const thinkStartIndex = tokensBuffer.indexOf(thinkStartTag);
1086
- if (thinkStartIndex !== -1) {
1087
- const beforeThink = tokensBuffer.substring(0, thinkStartIndex);
1088
- if (beforeThink !== '') {
1089
- yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, beforeThink), runManager);
1090
- }
1091
- tokensBuffer = tokensBuffer.substring(thinkStartIndex + thinkStartTag.length);
1092
- isThinking = true;
1093
- continue;
1094
- }
1095
- const splitIndex = this._getDeepSeekPartialTagSplitIndex(tokensBuffer, thinkStartTag);
1096
- if (splitIndex !== -1) {
1097
- const safeToYield = tokensBuffer.substring(0, splitIndex);
1098
- if (safeToYield !== '') {
1099
- yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, safeToYield), runManager);
1100
- }
1101
- tokensBuffer = tokensBuffer.substring(splitIndex);
1102
- break;
1103
- }
1104
- yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, tokensBuffer), runManager);
1105
- tokensBuffer = '';
1106
- break;
1107
- }
1108
- }
1109
- if (tokensBuffer === '') {
1110
- return;
1111
- }
1112
- if (isThinking) {
1113
- yield* this._yieldDeepSeekStreamChunk(new ChatGenerationChunk({
1114
- message: new AIMessageChunk({
1115
- content: '',
1116
- additional_kwargs: {
1117
- reasoning_content: tokensBuffer,
1118
- },
1119
- }),
1120
- text: '',
1121
- }), runManager);
1122
- return;
1123
- }
1124
- yield* this._yieldDeepSeekStreamChunk(new ChatGenerationChunk({
1125
- message: new AIMessageChunk({
1126
- content: tokensBuffer,
1127
- }),
1128
- text: tokensBuffer,
1129
- }), runManager);
1130
- }
1131
- async *_streamResponseChunksFromReasoningMessages(messages, options) {
1132
- const params = {
1133
- ...this.invocationParams(options, { streaming: true }),
1134
- stream: true,
1135
- };
1136
- const messagesMapped = this._convertDeepSeekMessages(messages);
1137
- const streamIterable = await this.completionWithRetry({
1138
- ...params,
1139
- messages: messagesMapped,
1140
- }, {
1141
- signal: options.signal,
1142
- ...options.options,
1143
- });
1144
- let defaultRole;
1145
- let usage;
1146
- for await (const data of streamIterable) {
1147
- if (options.signal?.aborted === true) {
1148
- throw new Error('AbortError');
1149
- }
1150
- if (data.usage != null) {
1151
- usage = data.usage;
1152
- }
1153
- if (data.choices.length === 0) {
1154
- continue;
1155
- }
1156
- const choice = data.choices[0];
1157
- const { delta } = choice;
1158
- const messageChunk = this._convertCompletionsDeltaToBaseMessageChunk(delta, data, defaultRole);
1159
- defaultRole = delta.role ?? defaultRole;
1160
- if (typeof messageChunk.content !== 'string') {
1161
- continue;
1162
- }
1163
- const messageText = messageChunk.content;
1164
- const newTokenIndices = {
1165
- prompt: options.promptIndex ?? 0,
1166
- completion: choice.index,
1167
- };
1168
- const generationInfo = { ...newTokenIndices };
1169
- if (choice.finish_reason != null) {
1170
- Object.assign(generationInfo, {
1171
- finish_reason: choice.finish_reason,
1172
- system_fingerprint: data.system_fingerprint,
1173
- model_name: data.model,
1174
- service_tier: data.service_tier,
1175
- });
1176
- }
1177
- if (this.logprobs === true) {
1178
- Object.assign(generationInfo, { logprobs: choice.logprobs });
1179
- }
1180
- const generationChunk = new ChatGenerationChunk({
1181
- message: messageChunk,
1182
- text: messageText,
1183
- generationInfo,
1184
- });
1185
- yield generationChunk;
1186
- }
1187
- if (usage != null) {
1188
- const usageMetadata = createUsageMetadata(usage);
1189
- const generationChunk = new ChatGenerationChunk({
1190
- message: new AIMessageChunk({
1191
- content: '',
1192
- response_metadata: {
1193
- usage: { ...usage },
1194
- },
1195
- usage_metadata: usageMetadata,
1196
- }),
1197
- text: '',
1198
- generationInfo: {
1199
- prompt: 0,
1200
- completion: 0,
1201
- },
1202
- });
1203
- yield generationChunk;
1204
- }
1205
- if (options.signal?.aborted === true) {
1206
- throw new Error('AbortError');
1207
- }
1208
- }
1209
- _createDeepSeekStreamChunk(chunk, content, additionalKwargs, text = content) {
1210
- if (!(chunk.message instanceof AIMessageChunk)) {
1211
- return new ChatGenerationChunk({
1212
- message: new AIMessageChunk({
1213
- content,
1214
- additional_kwargs: additionalKwargs ?? chunk.message.additional_kwargs,
1215
- response_metadata: chunk.message.response_metadata,
1216
- id: chunk.message.id,
1217
- }),
1218
- text,
1219
- generationInfo: chunk.generationInfo,
1220
- });
1221
- }
1222
- const message = chunk.message;
1223
- return new ChatGenerationChunk({
1224
- message: new AIMessageChunk({
1225
- content,
1226
- additional_kwargs: additionalKwargs ?? message.additional_kwargs,
1227
- response_metadata: message.response_metadata,
1228
- tool_calls: message.tool_calls,
1229
- tool_call_chunks: message.tool_call_chunks,
1230
- id: message.id,
1231
- }),
1232
- text,
1233
- generationInfo: chunk.generationInfo,
1234
- });
1235
- }
1236
- _createDeepSeekReasoningStreamChunk(chunk, reasoningContent) {
1237
- return this._createDeepSeekStreamChunk(chunk, '', {
1238
- ...chunk.message.additional_kwargs,
1239
- reasoning_content: reasoningContent,
1240
- }, '');
1241
- }
1242
- async *_yieldDeepSeekReasoningText(chunk, reasoningContent, runManager) {
1243
- yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekReasoningStreamChunk(chunk, reasoningContent), runManager);
1244
- }
1245
- async *_yieldDeepSeekStreamChunk(chunk, runManager) {
1246
- yield chunk;
1247
- await runManager?.handleLLMNewToken(chunk.text, this._getDeepSeekTokenIndices(chunk), undefined, undefined, undefined, { chunk });
1248
- }
1249
- _getDeepSeekTokenIndices(chunk) {
1250
- return getStreamChunkTokenIndices(chunk);
1251
- }
1252
- _getDeepSeekPartialTagSplitIndex(text, tag) {
1253
- for (let i = tag.length - 1; i >= 1; i--) {
1254
- if (text.endsWith(tag.substring(0, i))) {
1255
- return text.length - i;
1256
- }
1257
- }
1258
- return -1;
1259
- }
1260
- }
1261
- class ChatMoonshot extends ChatOpenAI {
1262
- constructor(fields) {
1263
- super({
1264
- ...fields,
1265
- includeReasoningContent: true,
1266
- });
1267
- }
1268
- static lc_name() {
1269
- return 'LibreChatMoonshot';
1270
- }
1271
- }
1272
- class ChatXAI extends ChatXAI$1 {
1273
- _lc_stream_delay;
1274
- constructor(fields) {
1275
- super(fields);
1276
- this._lc_stream_delay = fields?._lc_stream_delay;
1277
- const customBaseURL = fields?.configuration?.baseURL ?? fields?.clientConfig?.baseURL;
1278
- if (customBaseURL != null && customBaseURL) {
1279
- this.clientConfig = {
1280
- ...this.clientConfig,
1281
- baseURL: customBaseURL,
1282
- };
1283
- // Reset the client to force recreation with new config
1284
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1285
- this.client = undefined;
1286
- }
1287
- }
1288
- static lc_name() {
1289
- return 'LibreChatXAI';
1290
- }
1291
- get exposedClient() {
1292
- return this.client;
1293
- }
1294
- _getClientOptions(options) {
1295
- if (!this.client) {
1296
- const openAIEndpointConfig = {
1297
- baseURL: this.clientConfig.baseURL,
1298
- };
1299
- const endpoint = getEndpoint(openAIEndpointConfig);
1300
- const params = {
1301
- ...this.clientConfig,
1302
- baseURL: endpoint,
1303
- timeout: this.timeout,
1304
- maxRetries: 0,
1305
- };
1306
- if (params.baseURL == null) {
1307
- delete params.baseURL;
1308
- }
1309
- this.client = new CustomOpenAIClient(params);
1310
- }
1311
- const requestOptions = {
1312
- ...this.clientConfig,
1313
- ...options,
1314
- };
1315
- return requestOptions;
1316
- }
1317
- async *_streamResponseChunks(messages, options, runManager) {
1318
- yield* delayStreamChunks(super._streamResponseChunks(messages, options, undefined), this._lc_stream_delay, options.signal, runManager);
1319
- }
659
+ const nextFields = fields ?? {};
660
+ return {
661
+ ...nextFields,
662
+ completions: nextFields.completions ?? new LibreChatOpenAICompletions(nextFields),
663
+ responses: nextFields.responses ?? new LibreChatOpenAIResponses(nextFields)
664
+ };
1320
665
  }
666
+ var ChatOpenAI$1 = class extends ChatOpenAI {
667
+ _lc_stream_delay;
668
+ constructor(fields) {
669
+ super(withLibreChatOpenAIFields(fields));
670
+ this._lc_stream_delay = fields?._lc_stream_delay;
671
+ }
672
+ get exposedClient() {
673
+ return getExposedOpenAIClient(this.completions, this.responses, this._useResponsesApi(void 0));
674
+ }
675
+ static lc_name() {
676
+ return "LibreChatOpenAI";
677
+ }
678
+ _getClientOptions(options) {
679
+ if (!this.client) {
680
+ const endpoint = getEndpoint({ baseURL: this.clientConfig.baseURL });
681
+ const params = {
682
+ ...this.clientConfig,
683
+ baseURL: endpoint,
684
+ timeout: this.timeout,
685
+ maxRetries: 0
686
+ };
687
+ if (params.baseURL == null) delete params.baseURL;
688
+ this.client = new CustomOpenAIClient(params);
689
+ }
690
+ return {
691
+ ...this.clientConfig,
692
+ ...options
693
+ };
694
+ }
695
+ /**
696
+ * Returns backwards compatible reasoning parameters from constructor params and call options
697
+ * @internal
698
+ */
699
+ getReasoningParams(options) {
700
+ return getReasoningParams(this.reasoning, options);
701
+ }
702
+ _getReasoningParams(options) {
703
+ return this.getReasoningParams(options);
704
+ }
705
+ async *_streamResponseChunks(messages, options, runManager) {
706
+ yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
707
+ }
708
+ };
709
+ var AzureChatOpenAI$1 = class extends AzureChatOpenAI {
710
+ _lc_stream_delay;
711
+ constructor(fields) {
712
+ super(fields);
713
+ this.completions = new LibreChatAzureOpenAICompletions(fields);
714
+ this.responses = new LibreChatAzureOpenAIResponses(fields);
715
+ this._lc_stream_delay = fields?._lc_stream_delay;
716
+ }
717
+ get exposedClient() {
718
+ return getExposedOpenAIClient(this.completions, this.responses, this._useResponsesApi(void 0));
719
+ }
720
+ static lc_name() {
721
+ return "LibreChatAzureOpenAI";
722
+ }
723
+ /**
724
+ * Returns backwards compatible reasoning parameters from constructor params and call options
725
+ * @internal
726
+ */
727
+ getReasoningParams(options) {
728
+ return getGatedReasoningParams(this.model, this.reasoning, options);
729
+ }
730
+ _getReasoningParams(options) {
731
+ return this.getReasoningParams(options);
732
+ }
733
+ _getClientOptions(options) {
734
+ if (!this.client) {
735
+ const openAIEndpointConfig = {
736
+ azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
737
+ azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
738
+ azureOpenAIApiKey: this.azureOpenAIApiKey,
739
+ azureOpenAIBasePath: this.azureOpenAIBasePath,
740
+ azureADTokenProvider: this.azureADTokenProvider,
741
+ baseURL: this.clientConfig.baseURL
742
+ };
743
+ const endpoint = getEndpoint(openAIEndpointConfig);
744
+ const params = {
745
+ ...this.clientConfig,
746
+ baseURL: endpoint,
747
+ timeout: this.timeout,
748
+ maxRetries: 0
749
+ };
750
+ if (!this.azureADTokenProvider) params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
751
+ if (params.baseURL == null) delete params.baseURL;
752
+ const defaultHeaders = normalizeHeaders(params.defaultHeaders);
753
+ params.defaultHeaders = {
754
+ ...params.defaultHeaders,
755
+ "User-Agent": defaultHeaders["User-Agent"] != null ? `${defaultHeaders["User-Agent"]}: librechat-azure-openai-v2` : "librechat-azure-openai-v2"
756
+ };
757
+ this.client = new CustomAzureOpenAIClient({
758
+ apiVersion: this.azureOpenAIApiVersion,
759
+ azureADTokenProvider: this.azureADTokenProvider,
760
+ ...params
761
+ });
762
+ }
763
+ const requestOptions = {
764
+ ...this.clientConfig,
765
+ ...options
766
+ };
767
+ if (this.azureOpenAIApiKey != null) {
768
+ requestOptions.headers = {
769
+ "api-key": this.azureOpenAIApiKey,
770
+ ...requestOptions.headers
771
+ };
772
+ requestOptions.query = {
773
+ "api-version": this.azureOpenAIApiVersion,
774
+ ...requestOptions.query
775
+ };
776
+ }
777
+ return requestOptions;
778
+ }
779
+ async *_streamResponseChunks(messages, options, runManager) {
780
+ yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
781
+ }
782
+ };
783
+ var ChatDeepSeek$1 = class extends ChatDeepSeek {
784
+ _lc_stream_delay;
785
+ constructor(fields) {
786
+ super(fields);
787
+ this._lc_stream_delay = fields?._lc_stream_delay;
788
+ }
789
+ get exposedClient() {
790
+ return this.client;
791
+ }
792
+ static lc_name() {
793
+ return "LibreChatDeepSeek";
794
+ }
795
+ _convertDeepSeekMessages(messages) {
796
+ return _convertMessagesToOpenAIParams(messages, this.model, { includeReasoningContent: true });
797
+ }
798
+ async _generate(messages, options, runManager) {
799
+ options.signal?.throwIfAborted();
800
+ const params = this.invocationParams(options);
801
+ if (params.stream === true) return super._generate(messages, options, runManager);
802
+ const messagesMapped = this._convertDeepSeekMessages(messages);
803
+ const response = await this.completionWithRetry({
804
+ ...params,
805
+ stream: false,
806
+ messages: messagesMapped
807
+ }, {
808
+ signal: options.signal,
809
+ ...options.options
810
+ });
811
+ const usageMetadata = createUsageMetadata(response.usage);
812
+ return {
813
+ generations: response.choices.map((part) => {
814
+ const generation = {
815
+ text: part.message.content ?? "",
816
+ message: this._convertCompletionsMessageToBaseMessage(part.message, response)
817
+ };
818
+ generation.generationInfo = {
819
+ finish_reason: part.finish_reason,
820
+ ...part.logprobs != null ? { logprobs: part.logprobs } : {}
821
+ };
822
+ if (isAIMessage(generation.message)) generation.message.usage_metadata = usageMetadata;
823
+ generation.message = new AIMessage(Object.fromEntries(Object.entries(generation.message).filter(([key]) => !key.startsWith("lc_"))));
824
+ return generation;
825
+ }),
826
+ llmOutput: { tokenUsage: {
827
+ promptTokens: usageMetadata.input_tokens,
828
+ completionTokens: usageMetadata.output_tokens,
829
+ totalTokens: usageMetadata.total_tokens
830
+ } }
831
+ };
832
+ }
833
+ _getClientOptions(options) {
834
+ if (!this.client) {
835
+ const endpoint = getEndpoint({ baseURL: this.clientConfig.baseURL });
836
+ const params = {
837
+ ...this.clientConfig,
838
+ baseURL: endpoint,
839
+ timeout: this.timeout,
840
+ maxRetries: 0
841
+ };
842
+ if (params.baseURL == null) delete params.baseURL;
843
+ this.client = new CustomOpenAIClient(params);
844
+ }
845
+ return {
846
+ ...this.clientConfig,
847
+ ...options
848
+ };
849
+ }
850
+ async *_streamResponseChunks(messages, options, runManager) {
851
+ yield* delayStreamChunks(this._streamResponseChunksWithReasoning(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
852
+ }
853
+ /** Parses raw `<think>` fallback tags across chunks and emits sanitized DeepSeek stream chunks. */
854
+ async *_streamResponseChunksWithReasoning(messages, options, runManager) {
855
+ const stream = this._streamResponseChunksFromReasoningMessages(messages, options);
856
+ const thinkStartTag = "<think>";
857
+ const thinkEndTag = "</think>";
858
+ let tokensBuffer = "";
859
+ let isThinking = false;
860
+ for await (const chunk of stream) {
861
+ if (options.signal?.aborted === true) throw new Error("AbortError");
862
+ const reasoningContent = chunk.message.additional_kwargs.reasoning_content;
863
+ if (reasoningContent != null && reasoningContent !== "") {
864
+ yield* this._yieldDeepSeekStreamChunk(chunk, runManager);
865
+ continue;
866
+ }
867
+ const text = chunk.text;
868
+ if (text === "") {
869
+ yield* this._yieldDeepSeekStreamChunk(chunk, runManager);
870
+ continue;
871
+ }
872
+ tokensBuffer += text;
873
+ while (tokensBuffer !== "") {
874
+ if (isThinking) {
875
+ const thinkEndIndex = tokensBuffer.indexOf(thinkEndTag);
876
+ if (thinkEndIndex !== -1) {
877
+ const thoughtContent = tokensBuffer.substring(0, thinkEndIndex);
878
+ if (thoughtContent !== "") yield* this._yieldDeepSeekReasoningText(chunk, thoughtContent, runManager);
879
+ tokensBuffer = tokensBuffer.substring(thinkEndIndex + 8);
880
+ isThinking = false;
881
+ continue;
882
+ }
883
+ const splitIndex = this._getDeepSeekPartialTagSplitIndex(tokensBuffer, thinkEndTag);
884
+ if (splitIndex !== -1) {
885
+ const safeToYield = tokensBuffer.substring(0, splitIndex);
886
+ if (safeToYield !== "") yield* this._yieldDeepSeekReasoningText(chunk, safeToYield, runManager);
887
+ tokensBuffer = tokensBuffer.substring(splitIndex);
888
+ break;
889
+ }
890
+ yield* this._yieldDeepSeekReasoningText(chunk, tokensBuffer, runManager);
891
+ tokensBuffer = "";
892
+ break;
893
+ }
894
+ const thinkStartIndex = tokensBuffer.indexOf(thinkStartTag);
895
+ if (thinkStartIndex !== -1) {
896
+ const beforeThink = tokensBuffer.substring(0, thinkStartIndex);
897
+ if (beforeThink !== "") yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, beforeThink), runManager);
898
+ tokensBuffer = tokensBuffer.substring(thinkStartIndex + 7);
899
+ isThinking = true;
900
+ continue;
901
+ }
902
+ const splitIndex = this._getDeepSeekPartialTagSplitIndex(tokensBuffer, thinkStartTag);
903
+ if (splitIndex !== -1) {
904
+ const safeToYield = tokensBuffer.substring(0, splitIndex);
905
+ if (safeToYield !== "") yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, safeToYield), runManager);
906
+ tokensBuffer = tokensBuffer.substring(splitIndex);
907
+ break;
908
+ }
909
+ yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, tokensBuffer), runManager);
910
+ tokensBuffer = "";
911
+ break;
912
+ }
913
+ }
914
+ if (tokensBuffer === "") return;
915
+ if (isThinking) {
916
+ yield* this._yieldDeepSeekStreamChunk(new ChatGenerationChunk({
917
+ message: new AIMessageChunk({
918
+ content: "",
919
+ additional_kwargs: { reasoning_content: tokensBuffer }
920
+ }),
921
+ text: ""
922
+ }), runManager);
923
+ return;
924
+ }
925
+ yield* this._yieldDeepSeekStreamChunk(new ChatGenerationChunk({
926
+ message: new AIMessageChunk({ content: tokensBuffer }),
927
+ text: tokensBuffer
928
+ }), runManager);
929
+ }
930
+ async *_streamResponseChunksFromReasoningMessages(messages, options) {
931
+ const params = {
932
+ ...this.invocationParams(options, { streaming: true }),
933
+ stream: true
934
+ };
935
+ const messagesMapped = this._convertDeepSeekMessages(messages);
936
+ const streamIterable = await this.completionWithRetry({
937
+ ...params,
938
+ messages: messagesMapped
939
+ }, {
940
+ signal: options.signal,
941
+ ...options.options
942
+ });
943
+ let defaultRole;
944
+ let usage;
945
+ for await (const data of streamIterable) {
946
+ if (options.signal?.aborted === true) throw new Error("AbortError");
947
+ if (data.usage != null) usage = data.usage;
948
+ if (data.choices.length === 0) continue;
949
+ const choice = data.choices[0];
950
+ const { delta } = choice;
951
+ const messageChunk = this._convertCompletionsDeltaToBaseMessageChunk(delta, data, defaultRole);
952
+ defaultRole = delta.role ?? defaultRole;
953
+ if (typeof messageChunk.content !== "string") continue;
954
+ const messageText = messageChunk.content;
955
+ const generationInfo = {
956
+ prompt: options.promptIndex ?? 0,
957
+ completion: choice.index
958
+ };
959
+ if (choice.finish_reason != null) Object.assign(generationInfo, {
960
+ finish_reason: choice.finish_reason,
961
+ system_fingerprint: data.system_fingerprint,
962
+ model_name: data.model,
963
+ service_tier: data.service_tier
964
+ });
965
+ if (this.logprobs === true) Object.assign(generationInfo, { logprobs: choice.logprobs });
966
+ yield new ChatGenerationChunk({
967
+ message: messageChunk,
968
+ text: messageText,
969
+ generationInfo
970
+ });
971
+ }
972
+ if (usage != null) {
973
+ const usageMetadata = createUsageMetadata(usage);
974
+ yield new ChatGenerationChunk({
975
+ message: new AIMessageChunk({
976
+ content: "",
977
+ response_metadata: { usage: { ...usage } },
978
+ usage_metadata: usageMetadata
979
+ }),
980
+ text: "",
981
+ generationInfo: {
982
+ prompt: 0,
983
+ completion: 0
984
+ }
985
+ });
986
+ }
987
+ if (options.signal?.aborted === true) throw new Error("AbortError");
988
+ }
989
+ _createDeepSeekStreamChunk(chunk, content, additionalKwargs, text = content) {
990
+ if (!(chunk.message instanceof AIMessageChunk)) return new ChatGenerationChunk({
991
+ message: new AIMessageChunk({
992
+ content,
993
+ additional_kwargs: additionalKwargs ?? chunk.message.additional_kwargs,
994
+ response_metadata: chunk.message.response_metadata,
995
+ id: chunk.message.id
996
+ }),
997
+ text,
998
+ generationInfo: chunk.generationInfo
999
+ });
1000
+ const message = chunk.message;
1001
+ return new ChatGenerationChunk({
1002
+ message: new AIMessageChunk({
1003
+ content,
1004
+ additional_kwargs: additionalKwargs ?? message.additional_kwargs,
1005
+ response_metadata: message.response_metadata,
1006
+ tool_calls: message.tool_calls,
1007
+ tool_call_chunks: message.tool_call_chunks,
1008
+ id: message.id
1009
+ }),
1010
+ text,
1011
+ generationInfo: chunk.generationInfo
1012
+ });
1013
+ }
1014
+ _createDeepSeekReasoningStreamChunk(chunk, reasoningContent) {
1015
+ return this._createDeepSeekStreamChunk(chunk, "", {
1016
+ ...chunk.message.additional_kwargs,
1017
+ reasoning_content: reasoningContent
1018
+ }, "");
1019
+ }
1020
+ async *_yieldDeepSeekReasoningText(chunk, reasoningContent, runManager) {
1021
+ yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekReasoningStreamChunk(chunk, reasoningContent), runManager);
1022
+ }
1023
+ async *_yieldDeepSeekStreamChunk(chunk, runManager) {
1024
+ yield chunk;
1025
+ await runManager?.handleLLMNewToken(chunk.text, this._getDeepSeekTokenIndices(chunk), void 0, void 0, void 0, { chunk });
1026
+ }
1027
+ _getDeepSeekTokenIndices(chunk) {
1028
+ return getStreamChunkTokenIndices(chunk);
1029
+ }
1030
+ _getDeepSeekPartialTagSplitIndex(text, tag) {
1031
+ for (let i = tag.length - 1; i >= 1; i--) if (text.endsWith(tag.substring(0, i))) return text.length - i;
1032
+ return -1;
1033
+ }
1034
+ };
1035
+ var ChatMoonshot = class extends ChatOpenAI$1 {
1036
+ constructor(fields) {
1037
+ super({
1038
+ ...fields,
1039
+ includeReasoningContent: true
1040
+ });
1041
+ }
1042
+ static lc_name() {
1043
+ return "LibreChatMoonshot";
1044
+ }
1045
+ };
1046
+ var ChatXAI$1 = class extends ChatXAI {
1047
+ _lc_stream_delay;
1048
+ constructor(fields) {
1049
+ super(fields);
1050
+ this._lc_stream_delay = fields?._lc_stream_delay;
1051
+ const customBaseURL = fields?.configuration?.baseURL ?? fields?.clientConfig?.baseURL;
1052
+ if (customBaseURL != null && customBaseURL) {
1053
+ this.clientConfig = {
1054
+ ...this.clientConfig,
1055
+ baseURL: customBaseURL
1056
+ };
1057
+ this.client = void 0;
1058
+ }
1059
+ }
1060
+ static lc_name() {
1061
+ return "LibreChatXAI";
1062
+ }
1063
+ get exposedClient() {
1064
+ return this.client;
1065
+ }
1066
+ _getClientOptions(options) {
1067
+ if (!this.client) {
1068
+ const endpoint = getEndpoint({ baseURL: this.clientConfig.baseURL });
1069
+ const params = {
1070
+ ...this.clientConfig,
1071
+ baseURL: endpoint,
1072
+ timeout: this.timeout,
1073
+ maxRetries: 0
1074
+ };
1075
+ if (params.baseURL == null) delete params.baseURL;
1076
+ this.client = new CustomOpenAIClient(params);
1077
+ }
1078
+ return {
1079
+ ...this.clientConfig,
1080
+ ...options
1081
+ };
1082
+ }
1083
+ async *_streamResponseChunks(messages, options, runManager) {
1084
+ yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
1085
+ }
1086
+ };
1087
+ //#endregion
1088
+ export { AzureChatOpenAI$1 as AzureChatOpenAI, ChatDeepSeek$1 as ChatDeepSeek, ChatMoonshot, ChatOpenAI$1 as ChatOpenAI, ChatXAI$1 as ChatXAI, CustomOpenAIClient, _convertToOpenAITool, emitStreamChunkCallback };
1321
1089
 
1322
- export { AzureChatOpenAI, ChatDeepSeek, ChatMoonshot, ChatOpenAI, ChatXAI, CustomAzureOpenAIClient, CustomOpenAIClient, _convertToOpenAITool, emitStreamChunkCallback, isHeaders, normalizeHeaders };
1323
- //# sourceMappingURL=index.mjs.map
1090
+ //# sourceMappingURL=index.mjs.map