@librechat/agents 3.4.6 → 3.5.0

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 (1027) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +0 -356
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/agents/projection.cjs +0 -9
  4. package/dist/cjs/agents/projection.cjs.map +1 -1
  5. package/dist/cjs/common/constants.cjs +0 -26
  6. package/dist/cjs/common/constants.cjs.map +1 -1
  7. package/dist/cjs/common/enum.cjs +0 -85
  8. package/dist/cjs/common/enum.cjs.map +1 -1
  9. package/dist/cjs/events.cjs +0 -14
  10. package/dist/cjs/events.cjs.map +1 -1
  11. package/dist/cjs/graphs/Graph.cjs +1 -909
  12. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  13. package/dist/cjs/graphs/MultiAgentGraph.cjs +7 -272
  14. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  15. package/dist/cjs/graphs/applyGraphRuntimeConfig.cjs.map +1 -1
  16. package/dist/cjs/graphs/createGraph.cjs.map +1 -1
  17. package/dist/cjs/hitl/askUserQuestion.cjs +0 -53
  18. package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
  19. package/dist/cjs/hitl/askUserQuestions.cjs +0 -20
  20. package/dist/cjs/hitl/askUserQuestions.cjs.map +1 -1
  21. package/dist/cjs/hitl/askUserQuestionsInterrupt.cjs +0 -6
  22. package/dist/cjs/hitl/askUserQuestionsInterrupt.cjs.map +1 -1
  23. package/dist/cjs/hooks/HookRegistry.cjs +0 -127
  24. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  25. package/dist/cjs/hooks/createToolPolicyHook.cjs +0 -38
  26. package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -1
  27. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +0 -77
  28. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
  29. package/dist/cjs/hooks/executeHooks.cjs +0 -79
  30. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  31. package/dist/cjs/hooks/index.cjs +0 -16
  32. package/dist/cjs/hooks/index.cjs.map +1 -1
  33. package/dist/cjs/hooks/matchers.cjs +0 -104
  34. package/dist/cjs/hooks/matchers.cjs.map +1 -1
  35. package/dist/cjs/hooks/types.cjs +0 -8
  36. package/dist/cjs/hooks/types.cjs.map +1 -1
  37. package/dist/cjs/instrumentation.cjs +0 -14
  38. package/dist/cjs/instrumentation.cjs.map +1 -1
  39. package/dist/cjs/langfuse.cjs +0 -75
  40. package/dist/cjs/langfuse.cjs.map +1 -1
  41. package/dist/cjs/langfuseConfig.cjs.map +1 -1
  42. package/dist/cjs/langfuseRuntimeContext.cjs +0 -13
  43. package/dist/cjs/langfuseRuntimeContext.cjs.map +1 -1
  44. package/dist/cjs/langfuseRuntimeScope.cjs +0 -4
  45. package/dist/cjs/langfuseRuntimeScope.cjs.map +1 -1
  46. package/dist/cjs/langfuseSpanRegistry.cjs +0 -28
  47. package/dist/cjs/langfuseSpanRegistry.cjs.map +1 -1
  48. package/dist/cjs/langfuseToolOutputTracing.cjs +0 -3
  49. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  50. package/dist/cjs/langfuseTraceShaping.cjs +0 -74
  51. package/dist/cjs/langfuseTraceShaping.cjs.map +1 -1
  52. package/dist/cjs/llm/anthropic/index.cjs +0 -3
  53. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  54. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  55. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +1 -111
  56. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  57. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +0 -1
  58. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  59. package/dist/cjs/llm/anthropic/utils/stream_events.cjs +0 -8
  60. package/dist/cjs/llm/anthropic/utils/stream_events.cjs.map +1 -1
  61. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
  62. package/dist/cjs/llm/bedrock/cachePoints.cjs.map +1 -1
  63. package/dist/cjs/llm/bedrock/index.cjs +1 -95
  64. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  65. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  66. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +0 -78
  67. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  68. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +0 -24
  69. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
  70. package/dist/cjs/llm/contextOverflowRecovery.cjs +0 -62
  71. package/dist/cjs/llm/contextOverflowRecovery.cjs.map +1 -1
  72. package/dist/cjs/llm/fake.cjs.map +1 -1
  73. package/dist/cjs/llm/google/index.cjs +2 -21
  74. package/dist/cjs/llm/google/index.cjs.map +1 -1
  75. package/dist/cjs/llm/google/utils/common.cjs +5 -35
  76. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  77. package/dist/cjs/llm/init.cjs +0 -9
  78. package/dist/cjs/llm/init.cjs.map +1 -1
  79. package/dist/cjs/llm/invoke.cjs +1 -270
  80. package/dist/cjs/llm/invoke.cjs.map +1 -1
  81. package/dist/cjs/llm/mistral/index.cjs.map +1 -1
  82. package/dist/cjs/llm/openai/index.cjs +0 -99
  83. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  84. package/dist/cjs/llm/openai/streamMetadata.cjs +0 -21
  85. package/dist/cjs/llm/openai/streamMetadata.cjs.map +1 -1
  86. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  87. package/dist/cjs/llm/openrouter/index.cjs +0 -1
  88. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  89. package/dist/cjs/llm/openrouter/toolCache.cjs +0 -6
  90. package/dist/cjs/llm/openrouter/toolCache.cjs.map +1 -1
  91. package/dist/cjs/llm/preempt.cjs +0 -75
  92. package/dist/cjs/llm/preempt.cjs.map +1 -1
  93. package/dist/cjs/llm/providers.cjs.map +1 -1
  94. package/dist/cjs/llm/request.cjs +0 -10
  95. package/dist/cjs/llm/request.cjs.map +1 -1
  96. package/dist/cjs/llm/stream/chunkAdapters.cjs +0 -62
  97. package/dist/cjs/llm/stream/chunkAdapters.cjs.map +1 -1
  98. package/dist/cjs/llm/stream/smoother.cjs +0 -58
  99. package/dist/cjs/llm/stream/smoother.cjs.map +1 -1
  100. package/dist/cjs/llm/streamLimits.cjs +4 -293
  101. package/dist/cjs/llm/streamLimits.cjs.map +1 -1
  102. package/dist/cjs/llm/truncation.cjs +0 -36
  103. package/dist/cjs/llm/truncation.cjs.map +1 -1
  104. package/dist/cjs/llm/vertexai/index.cjs +0 -330
  105. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  106. package/dist/cjs/messages/alternation.cjs +0 -43
  107. package/dist/cjs/messages/alternation.cjs.map +1 -1
  108. package/dist/cjs/messages/anthropicToolCache.cjs +0 -45
  109. package/dist/cjs/messages/anthropicToolCache.cjs.map +1 -1
  110. package/dist/cjs/messages/assistantPhase.cjs +0 -12
  111. package/dist/cjs/messages/assistantPhase.cjs.map +1 -1
  112. package/dist/cjs/messages/budget.cjs +0 -9
  113. package/dist/cjs/messages/budget.cjs.map +1 -1
  114. package/dist/cjs/messages/cache.cjs +0 -172
  115. package/dist/cjs/messages/cache.cjs.map +1 -1
  116. package/dist/cjs/messages/content.cjs +0 -9
  117. package/dist/cjs/messages/content.cjs.map +1 -1
  118. package/dist/cjs/messages/contextPruning.cjs +0 -15
  119. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  120. package/dist/cjs/messages/contextPruningSettings.cjs +0 -3
  121. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -1
  122. package/dist/cjs/messages/core.cjs +0 -48
  123. package/dist/cjs/messages/core.cjs.map +1 -1
  124. package/dist/cjs/messages/format.cjs +1 -345
  125. package/dist/cjs/messages/format.cjs.map +1 -1
  126. package/dist/cjs/messages/handoffCue.cjs +0 -36
  127. package/dist/cjs/messages/handoffCue.cjs.map +1 -1
  128. package/dist/cjs/messages/ids.cjs.map +1 -1
  129. package/dist/cjs/messages/injected.cjs +0 -33
  130. package/dist/cjs/messages/injected.cjs.map +1 -1
  131. package/dist/cjs/messages/langchain.cjs +0 -14
  132. package/dist/cjs/messages/langchain.cjs.map +1 -1
  133. package/dist/cjs/messages/prune.cjs +1 -184
  134. package/dist/cjs/messages/prune.cjs.map +1 -1
  135. package/dist/cjs/messages/recency.cjs +0 -32
  136. package/dist/cjs/messages/recency.cjs.map +1 -1
  137. package/dist/cjs/messages/reducer.cjs +0 -30
  138. package/dist/cjs/messages/reducer.cjs.map +1 -1
  139. package/dist/cjs/messages/tools.cjs +0 -14
  140. package/dist/cjs/messages/tools.cjs.map +1 -1
  141. package/dist/cjs/openai/index.cjs.map +1 -1
  142. package/dist/cjs/prompts/activityLabel.cjs +9 -79
  143. package/dist/cjs/prompts/activityLabel.cjs.map +1 -1
  144. package/dist/cjs/responses/index.cjs.map +1 -1
  145. package/dist/cjs/run.cjs +2 -538
  146. package/dist/cjs/run.cjs.map +1 -1
  147. package/dist/cjs/session/AgentSession.cjs +1 -17
  148. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  149. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  150. package/dist/cjs/session/handlers.cjs +0 -7
  151. package/dist/cjs/session/handlers.cjs.map +1 -1
  152. package/dist/cjs/session/ids.cjs.map +1 -1
  153. package/dist/cjs/session/messageSerialization.cjs +0 -4
  154. package/dist/cjs/session/messageSerialization.cjs.map +1 -1
  155. package/dist/cjs/stream.cjs +1 -93
  156. package/dist/cjs/stream.cjs.map +1 -1
  157. package/dist/cjs/summarization/index.cjs +0 -27
  158. package/dist/cjs/summarization/index.cjs.map +1 -1
  159. package/dist/cjs/summarization/node.cjs +0 -273
  160. package/dist/cjs/summarization/node.cjs.map +1 -1
  161. package/dist/cjs/tools/BashExecutor.cjs +0 -35
  162. package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
  163. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +0 -24
  164. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  165. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  166. package/dist/cjs/tools/CodeExecutor.cjs +0 -13
  167. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  168. package/dist/cjs/tools/CodeSessionFileSummary.cjs.map +1 -1
  169. package/dist/cjs/tools/ProgrammaticToolCalling.cjs +0 -101
  170. package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
  171. package/dist/cjs/tools/ReadFile.cjs.map +1 -1
  172. package/dist/cjs/tools/SkillTool.cjs +0 -5
  173. package/dist/cjs/tools/SkillTool.cjs.map +1 -1
  174. package/dist/cjs/tools/SubagentTool.cjs +0 -10
  175. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  176. package/dist/cjs/tools/ToolNode.cjs +6 -1038
  177. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  178. package/dist/cjs/tools/ToolSearch.cjs +0 -179
  179. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  180. package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
  181. package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -1
  182. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +0 -39
  183. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  184. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  185. package/dist/cjs/tools/eagerEventExecution.cjs +0 -6
  186. package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -1
  187. package/dist/cjs/tools/handlers.cjs +1 -41
  188. package/dist/cjs/tools/handlers.cjs.map +1 -1
  189. package/dist/cjs/tools/intentArg.cjs +1 -132
  190. package/dist/cjs/tools/intentArg.cjs.map +1 -1
  191. package/dist/cjs/tools/local/CompileCheckTool.cjs +0 -25
  192. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  193. package/dist/cjs/tools/local/FileCheckpointer.cjs +0 -23
  194. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  195. package/dist/cjs/tools/local/LocalCodingTools.cjs +0 -80
  196. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  197. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +0 -126
  198. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  199. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  200. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +0 -12
  201. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  202. package/dist/cjs/tools/local/attachments.cjs +0 -44
  203. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  204. package/dist/cjs/tools/local/bashAst.cjs +0 -16
  205. package/dist/cjs/tools/local/bashAst.cjs.map +1 -1
  206. package/dist/cjs/tools/local/editStrategies.cjs +0 -14
  207. package/dist/cjs/tools/local/editStrategies.cjs.map +1 -1
  208. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  209. package/dist/cjs/tools/local/syntaxCheck.cjs +0 -31
  210. package/dist/cjs/tools/local/syntaxCheck.cjs.map +1 -1
  211. package/dist/cjs/tools/local/textEncoding.cjs +0 -11
  212. package/dist/cjs/tools/local/textEncoding.cjs.map +1 -1
  213. package/dist/cjs/tools/local/workspaceFS.cjs +0 -33
  214. package/dist/cjs/tools/local/workspaceFS.cjs.map +1 -1
  215. package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
  216. package/dist/cjs/tools/schema.cjs +0 -8
  217. package/dist/cjs/tools/schema.cjs.map +1 -1
  218. package/dist/cjs/tools/search/anthropic.cjs +0 -9
  219. package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
  220. package/dist/cjs/tools/search/content.cjs.map +1 -1
  221. package/dist/cjs/tools/search/crw-scraper.cjs +0 -33
  222. package/dist/cjs/tools/search/crw-scraper.cjs.map +1 -1
  223. package/dist/cjs/tools/search/crw-search.cjs +0 -2
  224. package/dist/cjs/tools/search/crw-search.cjs.map +1 -1
  225. package/dist/cjs/tools/search/firecrawl.cjs +0 -25
  226. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  227. package/dist/cjs/tools/search/format.cjs +0 -30
  228. package/dist/cjs/tools/search/format.cjs.map +1 -1
  229. package/dist/cjs/tools/search/highlights.cjs +0 -16
  230. package/dist/cjs/tools/search/highlights.cjs.map +1 -1
  231. package/dist/cjs/tools/search/keenable-scraper.cjs +0 -8
  232. package/dist/cjs/tools/search/keenable-scraper.cjs.map +1 -1
  233. package/dist/cjs/tools/search/keenable-search.cjs +0 -7
  234. package/dist/cjs/tools/search/keenable-search.cjs.map +1 -1
  235. package/dist/cjs/tools/search/rerankers.cjs +0 -35
  236. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  237. package/dist/cjs/tools/search/schema.cjs +0 -1
  238. package/dist/cjs/tools/search/schema.cjs.map +1 -1
  239. package/dist/cjs/tools/search/search.cjs +1 -14
  240. package/dist/cjs/tools/search/search.cjs.map +1 -1
  241. package/dist/cjs/tools/search/serper-scraper.cjs +0 -46
  242. package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
  243. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
  244. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  245. package/dist/cjs/tools/search/tool.cjs +0 -25
  246. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  247. package/dist/cjs/tools/search/utils.cjs +0 -8
  248. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  249. package/dist/cjs/tools/skillCatalog.cjs +0 -6
  250. package/dist/cjs/tools/skillCatalog.cjs.map +1 -1
  251. package/dist/cjs/tools/streamedToolCallSeals.cjs +0 -6
  252. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
  253. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs +0 -2
  254. package/dist/cjs/tools/subagent/SubagentExecutionRegistry.cjs.map +1 -1
  255. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +3 -213
  256. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  257. package/dist/cjs/tools/subagent/SubagentReplay.cjs.map +1 -1
  258. package/dist/cjs/tools/subagent/childGraphConfig.cjs +0 -4
  259. package/dist/cjs/tools/subagent/childGraphConfig.cjs.map +1 -1
  260. package/dist/cjs/tools/subagent/runtimeLimits.cjs.map +1 -1
  261. package/dist/cjs/tools/toolOutputReferences.cjs +1 -322
  262. package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
  263. package/dist/cjs/types/hitl.cjs +0 -5
  264. package/dist/cjs/types/hitl.cjs.map +1 -1
  265. package/dist/cjs/utils/callbacks.cjs.map +1 -1
  266. package/dist/cjs/utils/errors.cjs +14 -165
  267. package/dist/cjs/utils/errors.cjs.map +1 -1
  268. package/dist/cjs/utils/events.cjs +0 -10
  269. package/dist/cjs/utils/events.cjs.map +1 -1
  270. package/dist/cjs/utils/graph.cjs.map +1 -1
  271. package/dist/cjs/utils/handlers.cjs +0 -3
  272. package/dist/cjs/utils/handlers.cjs.map +1 -1
  273. package/dist/cjs/utils/llm.cjs +0 -1
  274. package/dist/cjs/utils/llm.cjs.map +1 -1
  275. package/dist/cjs/utils/misc.cjs +0 -16
  276. package/dist/cjs/utils/misc.cjs.map +1 -1
  277. package/dist/cjs/utils/proxy.cjs +0 -26
  278. package/dist/cjs/utils/proxy.cjs.map +1 -1
  279. package/dist/cjs/utils/run.cjs +0 -6
  280. package/dist/cjs/utils/run.cjs.map +1 -1
  281. package/dist/cjs/utils/schema.cjs +0 -5
  282. package/dist/cjs/utils/schema.cjs.map +1 -1
  283. package/dist/cjs/utils/title.cjs +0 -6
  284. package/dist/cjs/utils/title.cjs.map +1 -1
  285. package/dist/cjs/utils/tokens.cjs +0 -113
  286. package/dist/cjs/utils/tokens.cjs.map +1 -1
  287. package/dist/cjs/utils/toolContent.cjs +0 -41
  288. package/dist/cjs/utils/toolContent.cjs.map +1 -1
  289. package/dist/cjs/utils/truncation.cjs +0 -61
  290. package/dist/cjs/utils/truncation.cjs.map +1 -1
  291. package/dist/esm/agents/AgentContext.mjs +0 -356
  292. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  293. package/dist/esm/agents/projection.mjs +0 -9
  294. package/dist/esm/agents/projection.mjs.map +1 -1
  295. package/dist/esm/common/constants.mjs +0 -26
  296. package/dist/esm/common/constants.mjs.map +1 -1
  297. package/dist/esm/common/enum.mjs +0 -85
  298. package/dist/esm/common/enum.mjs.map +1 -1
  299. package/dist/esm/events.mjs +0 -14
  300. package/dist/esm/events.mjs.map +1 -1
  301. package/dist/esm/graphs/Graph.mjs +1 -909
  302. package/dist/esm/graphs/Graph.mjs.map +1 -1
  303. package/dist/esm/graphs/MultiAgentGraph.mjs +7 -272
  304. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  305. package/dist/esm/graphs/applyGraphRuntimeConfig.mjs.map +1 -1
  306. package/dist/esm/graphs/createGraph.mjs.map +1 -1
  307. package/dist/esm/hitl/askUserQuestion.mjs +0 -53
  308. package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
  309. package/dist/esm/hitl/askUserQuestions.mjs +0 -20
  310. package/dist/esm/hitl/askUserQuestions.mjs.map +1 -1
  311. package/dist/esm/hitl/askUserQuestionsInterrupt.mjs +0 -6
  312. package/dist/esm/hitl/askUserQuestionsInterrupt.mjs.map +1 -1
  313. package/dist/esm/hooks/HookRegistry.mjs +0 -127
  314. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  315. package/dist/esm/hooks/createToolPolicyHook.mjs +0 -38
  316. package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -1
  317. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +0 -77
  318. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  319. package/dist/esm/hooks/executeHooks.mjs +0 -79
  320. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  321. package/dist/esm/hooks/index.mjs +0 -16
  322. package/dist/esm/hooks/index.mjs.map +1 -1
  323. package/dist/esm/hooks/matchers.mjs +0 -104
  324. package/dist/esm/hooks/matchers.mjs.map +1 -1
  325. package/dist/esm/hooks/types.mjs +0 -8
  326. package/dist/esm/hooks/types.mjs.map +1 -1
  327. package/dist/esm/instrumentation.mjs +0 -14
  328. package/dist/esm/instrumentation.mjs.map +1 -1
  329. package/dist/esm/langfuse.mjs +0 -75
  330. package/dist/esm/langfuse.mjs.map +1 -1
  331. package/dist/esm/langfuseConfig.mjs.map +1 -1
  332. package/dist/esm/langfuseRuntimeContext.mjs +0 -13
  333. package/dist/esm/langfuseRuntimeContext.mjs.map +1 -1
  334. package/dist/esm/langfuseRuntimeScope.mjs +0 -4
  335. package/dist/esm/langfuseRuntimeScope.mjs.map +1 -1
  336. package/dist/esm/langfuseSpanRegistry.mjs +0 -28
  337. package/dist/esm/langfuseSpanRegistry.mjs.map +1 -1
  338. package/dist/esm/langfuseToolOutputTracing.mjs +0 -3
  339. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  340. package/dist/esm/langfuseTraceShaping.mjs +0 -74
  341. package/dist/esm/langfuseTraceShaping.mjs.map +1 -1
  342. package/dist/esm/llm/anthropic/index.mjs +0 -3
  343. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  344. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  345. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +1 -111
  346. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  347. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +0 -1
  348. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  349. package/dist/esm/llm/anthropic/utils/stream_events.mjs +0 -8
  350. package/dist/esm/llm/anthropic/utils/stream_events.mjs.map +1 -1
  351. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
  352. package/dist/esm/llm/bedrock/cachePoints.mjs.map +1 -1
  353. package/dist/esm/llm/bedrock/index.mjs +1 -95
  354. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  355. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  356. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +0 -78
  357. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  358. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +0 -24
  359. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
  360. package/dist/esm/llm/contextOverflowRecovery.mjs +0 -62
  361. package/dist/esm/llm/contextOverflowRecovery.mjs.map +1 -1
  362. package/dist/esm/llm/fake.mjs.map +1 -1
  363. package/dist/esm/llm/google/index.mjs +2 -21
  364. package/dist/esm/llm/google/index.mjs.map +1 -1
  365. package/dist/esm/llm/google/utils/common.mjs +5 -35
  366. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  367. package/dist/esm/llm/init.mjs +0 -9
  368. package/dist/esm/llm/init.mjs.map +1 -1
  369. package/dist/esm/llm/invoke.mjs +1 -270
  370. package/dist/esm/llm/invoke.mjs.map +1 -1
  371. package/dist/esm/llm/mistral/index.mjs.map +1 -1
  372. package/dist/esm/llm/openai/index.mjs +0 -99
  373. package/dist/esm/llm/openai/index.mjs.map +1 -1
  374. package/dist/esm/llm/openai/streamMetadata.mjs +0 -21
  375. package/dist/esm/llm/openai/streamMetadata.mjs.map +1 -1
  376. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  377. package/dist/esm/llm/openrouter/index.mjs +0 -1
  378. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  379. package/dist/esm/llm/openrouter/toolCache.mjs +0 -6
  380. package/dist/esm/llm/openrouter/toolCache.mjs.map +1 -1
  381. package/dist/esm/llm/preempt.mjs +0 -75
  382. package/dist/esm/llm/preempt.mjs.map +1 -1
  383. package/dist/esm/llm/providers.mjs.map +1 -1
  384. package/dist/esm/llm/request.mjs +0 -10
  385. package/dist/esm/llm/request.mjs.map +1 -1
  386. package/dist/esm/llm/stream/chunkAdapters.mjs +0 -62
  387. package/dist/esm/llm/stream/chunkAdapters.mjs.map +1 -1
  388. package/dist/esm/llm/stream/smoother.mjs +0 -58
  389. package/dist/esm/llm/stream/smoother.mjs.map +1 -1
  390. package/dist/esm/llm/streamLimits.mjs +4 -293
  391. package/dist/esm/llm/streamLimits.mjs.map +1 -1
  392. package/dist/esm/llm/truncation.mjs +0 -36
  393. package/dist/esm/llm/truncation.mjs.map +1 -1
  394. package/dist/esm/llm/vertexai/index.mjs +0 -330
  395. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  396. package/dist/esm/messages/alternation.mjs +0 -43
  397. package/dist/esm/messages/alternation.mjs.map +1 -1
  398. package/dist/esm/messages/anthropicToolCache.mjs +0 -45
  399. package/dist/esm/messages/anthropicToolCache.mjs.map +1 -1
  400. package/dist/esm/messages/assistantPhase.mjs +0 -12
  401. package/dist/esm/messages/assistantPhase.mjs.map +1 -1
  402. package/dist/esm/messages/budget.mjs +0 -9
  403. package/dist/esm/messages/budget.mjs.map +1 -1
  404. package/dist/esm/messages/cache.mjs +0 -172
  405. package/dist/esm/messages/cache.mjs.map +1 -1
  406. package/dist/esm/messages/content.mjs +0 -9
  407. package/dist/esm/messages/content.mjs.map +1 -1
  408. package/dist/esm/messages/contextPruning.mjs +0 -15
  409. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  410. package/dist/esm/messages/contextPruningSettings.mjs +0 -3
  411. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -1
  412. package/dist/esm/messages/core.mjs +0 -48
  413. package/dist/esm/messages/core.mjs.map +1 -1
  414. package/dist/esm/messages/format.mjs +1 -345
  415. package/dist/esm/messages/format.mjs.map +1 -1
  416. package/dist/esm/messages/handoffCue.mjs +0 -36
  417. package/dist/esm/messages/handoffCue.mjs.map +1 -1
  418. package/dist/esm/messages/ids.mjs.map +1 -1
  419. package/dist/esm/messages/injected.mjs +0 -33
  420. package/dist/esm/messages/injected.mjs.map +1 -1
  421. package/dist/esm/messages/langchain.mjs +0 -14
  422. package/dist/esm/messages/langchain.mjs.map +1 -1
  423. package/dist/esm/messages/prune.mjs +1 -184
  424. package/dist/esm/messages/prune.mjs.map +1 -1
  425. package/dist/esm/messages/recency.mjs +0 -32
  426. package/dist/esm/messages/recency.mjs.map +1 -1
  427. package/dist/esm/messages/reducer.mjs +0 -30
  428. package/dist/esm/messages/reducer.mjs.map +1 -1
  429. package/dist/esm/messages/tools.mjs +0 -14
  430. package/dist/esm/messages/tools.mjs.map +1 -1
  431. package/dist/esm/openai/index.mjs.map +1 -1
  432. package/dist/esm/prompts/activityLabel.mjs +9 -79
  433. package/dist/esm/prompts/activityLabel.mjs.map +1 -1
  434. package/dist/esm/responses/index.mjs.map +1 -1
  435. package/dist/esm/run.mjs +2 -538
  436. package/dist/esm/run.mjs.map +1 -1
  437. package/dist/esm/session/AgentSession.mjs +1 -17
  438. package/dist/esm/session/AgentSession.mjs.map +1 -1
  439. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  440. package/dist/esm/session/handlers.mjs +0 -7
  441. package/dist/esm/session/handlers.mjs.map +1 -1
  442. package/dist/esm/session/ids.mjs.map +1 -1
  443. package/dist/esm/session/messageSerialization.mjs +0 -4
  444. package/dist/esm/session/messageSerialization.mjs.map +1 -1
  445. package/dist/esm/stream.mjs +1 -93
  446. package/dist/esm/stream.mjs.map +1 -1
  447. package/dist/esm/summarization/index.mjs +0 -27
  448. package/dist/esm/summarization/index.mjs.map +1 -1
  449. package/dist/esm/summarization/node.mjs +0 -273
  450. package/dist/esm/summarization/node.mjs.map +1 -1
  451. package/dist/esm/tools/BashExecutor.mjs +0 -35
  452. package/dist/esm/tools/BashExecutor.mjs.map +1 -1
  453. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +0 -24
  454. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  455. package/dist/esm/tools/Calculator.mjs.map +1 -1
  456. package/dist/esm/tools/CodeExecutor.mjs +0 -13
  457. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  458. package/dist/esm/tools/CodeSessionFileSummary.mjs.map +1 -1
  459. package/dist/esm/tools/ProgrammaticToolCalling.mjs +0 -101
  460. package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
  461. package/dist/esm/tools/ReadFile.mjs.map +1 -1
  462. package/dist/esm/tools/SkillTool.mjs +0 -5
  463. package/dist/esm/tools/SkillTool.mjs.map +1 -1
  464. package/dist/esm/tools/SubagentTool.mjs +0 -10
  465. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  466. package/dist/esm/tools/ToolNode.mjs +6 -1038
  467. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  468. package/dist/esm/tools/ToolSearch.mjs +0 -179
  469. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  470. package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
  471. package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -1
  472. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +0 -39
  473. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  474. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  475. package/dist/esm/tools/eagerEventExecution.mjs +0 -6
  476. package/dist/esm/tools/eagerEventExecution.mjs.map +1 -1
  477. package/dist/esm/tools/handlers.mjs +1 -41
  478. package/dist/esm/tools/handlers.mjs.map +1 -1
  479. package/dist/esm/tools/intentArg.mjs +1 -132
  480. package/dist/esm/tools/intentArg.mjs.map +1 -1
  481. package/dist/esm/tools/local/CompileCheckTool.mjs +0 -25
  482. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  483. package/dist/esm/tools/local/FileCheckpointer.mjs +0 -23
  484. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  485. package/dist/esm/tools/local/LocalCodingTools.mjs +0 -80
  486. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  487. package/dist/esm/tools/local/LocalExecutionEngine.mjs +0 -126
  488. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  489. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  490. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +0 -12
  491. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  492. package/dist/esm/tools/local/attachments.mjs +0 -44
  493. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  494. package/dist/esm/tools/local/bashAst.mjs +0 -16
  495. package/dist/esm/tools/local/bashAst.mjs.map +1 -1
  496. package/dist/esm/tools/local/editStrategies.mjs +0 -14
  497. package/dist/esm/tools/local/editStrategies.mjs.map +1 -1
  498. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  499. package/dist/esm/tools/local/syntaxCheck.mjs +0 -31
  500. package/dist/esm/tools/local/syntaxCheck.mjs.map +1 -1
  501. package/dist/esm/tools/local/textEncoding.mjs +0 -11
  502. package/dist/esm/tools/local/textEncoding.mjs.map +1 -1
  503. package/dist/esm/tools/local/workspaceFS.mjs +0 -33
  504. package/dist/esm/tools/local/workspaceFS.mjs.map +1 -1
  505. package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
  506. package/dist/esm/tools/schema.mjs +0 -8
  507. package/dist/esm/tools/schema.mjs.map +1 -1
  508. package/dist/esm/tools/search/anthropic.mjs +0 -9
  509. package/dist/esm/tools/search/anthropic.mjs.map +1 -1
  510. package/dist/esm/tools/search/content.mjs.map +1 -1
  511. package/dist/esm/tools/search/crw-scraper.mjs +0 -33
  512. package/dist/esm/tools/search/crw-scraper.mjs.map +1 -1
  513. package/dist/esm/tools/search/crw-search.mjs +0 -2
  514. package/dist/esm/tools/search/crw-search.mjs.map +1 -1
  515. package/dist/esm/tools/search/firecrawl.mjs +0 -25
  516. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  517. package/dist/esm/tools/search/format.mjs +0 -30
  518. package/dist/esm/tools/search/format.mjs.map +1 -1
  519. package/dist/esm/tools/search/highlights.mjs +0 -16
  520. package/dist/esm/tools/search/highlights.mjs.map +1 -1
  521. package/dist/esm/tools/search/keenable-scraper.mjs +0 -8
  522. package/dist/esm/tools/search/keenable-scraper.mjs.map +1 -1
  523. package/dist/esm/tools/search/keenable-search.mjs +0 -7
  524. package/dist/esm/tools/search/keenable-search.mjs.map +1 -1
  525. package/dist/esm/tools/search/rerankers.mjs +0 -35
  526. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  527. package/dist/esm/tools/search/schema.mjs +0 -1
  528. package/dist/esm/tools/search/schema.mjs.map +1 -1
  529. package/dist/esm/tools/search/search.mjs +1 -14
  530. package/dist/esm/tools/search/search.mjs.map +1 -1
  531. package/dist/esm/tools/search/serper-scraper.mjs +0 -46
  532. package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
  533. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
  534. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  535. package/dist/esm/tools/search/tool.mjs +0 -25
  536. package/dist/esm/tools/search/tool.mjs.map +1 -1
  537. package/dist/esm/tools/search/utils.mjs +0 -8
  538. package/dist/esm/tools/search/utils.mjs.map +1 -1
  539. package/dist/esm/tools/skillCatalog.mjs +0 -6
  540. package/dist/esm/tools/skillCatalog.mjs.map +1 -1
  541. package/dist/esm/tools/streamedToolCallSeals.mjs +0 -6
  542. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
  543. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs +0 -2
  544. package/dist/esm/tools/subagent/SubagentExecutionRegistry.mjs.map +1 -1
  545. package/dist/esm/tools/subagent/SubagentExecutor.mjs +3 -213
  546. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  547. package/dist/esm/tools/subagent/SubagentReplay.mjs.map +1 -1
  548. package/dist/esm/tools/subagent/childGraphConfig.mjs +0 -4
  549. package/dist/esm/tools/subagent/childGraphConfig.mjs.map +1 -1
  550. package/dist/esm/tools/subagent/runtimeLimits.mjs.map +1 -1
  551. package/dist/esm/tools/toolOutputReferences.mjs +1 -322
  552. package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
  553. package/dist/esm/types/hitl.mjs +0 -5
  554. package/dist/esm/types/hitl.mjs.map +1 -1
  555. package/dist/esm/utils/callbacks.mjs.map +1 -1
  556. package/dist/esm/utils/errors.mjs +14 -165
  557. package/dist/esm/utils/errors.mjs.map +1 -1
  558. package/dist/esm/utils/events.mjs +0 -10
  559. package/dist/esm/utils/events.mjs.map +1 -1
  560. package/dist/esm/utils/graph.mjs.map +1 -1
  561. package/dist/esm/utils/handlers.mjs +0 -3
  562. package/dist/esm/utils/handlers.mjs.map +1 -1
  563. package/dist/esm/utils/llm.mjs +0 -1
  564. package/dist/esm/utils/llm.mjs.map +1 -1
  565. package/dist/esm/utils/misc.mjs +0 -16
  566. package/dist/esm/utils/misc.mjs.map +1 -1
  567. package/dist/esm/utils/proxy.mjs +0 -26
  568. package/dist/esm/utils/proxy.mjs.map +1 -1
  569. package/dist/esm/utils/run.mjs +0 -6
  570. package/dist/esm/utils/run.mjs.map +1 -1
  571. package/dist/esm/utils/schema.mjs +0 -5
  572. package/dist/esm/utils/schema.mjs.map +1 -1
  573. package/dist/esm/utils/title.mjs +0 -6
  574. package/dist/esm/utils/title.mjs.map +1 -1
  575. package/dist/esm/utils/tokens.mjs +0 -113
  576. package/dist/esm/utils/tokens.mjs.map +1 -1
  577. package/dist/esm/utils/toolContent.mjs +0 -41
  578. package/dist/esm/utils/toolContent.mjs.map +1 -1
  579. package/dist/esm/utils/truncation.mjs +0 -61
  580. package/dist/esm/utils/truncation.mjs.map +1 -1
  581. package/dist/types/agents/AgentContext.d.ts +3 -3
  582. package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +3 -3
  583. package/dist/types/agents/projection.d.ts +1 -1
  584. package/dist/types/events.d.ts +2 -2
  585. package/dist/types/graphs/Graph.d.ts +11 -11
  586. package/dist/types/graphs/MultiAgentGraph.d.ts +2 -2
  587. package/dist/types/graphs/createGraph.d.ts +4 -4
  588. package/dist/types/graphs/graphFactory.d.ts +1 -1
  589. package/dist/types/hitl/askUserQuestion.d.ts +1 -1
  590. package/dist/types/hitl/askUserQuestions.d.ts +1 -1
  591. package/dist/types/hitl/askUserQuestionsInterrupt.d.ts +1 -1
  592. package/dist/types/hooks/types.d.ts +1 -1
  593. package/dist/types/instrumentation.d.ts +1 -1
  594. package/dist/types/langfuse.d.ts +3 -3
  595. package/dist/types/langfuseConfig.d.ts +2 -2
  596. package/dist/types/langfuseRuntimeContext.d.ts +1 -1
  597. package/dist/types/langfuseRuntimeScope.d.ts +2 -2
  598. package/dist/types/langfuseSpanRegistry.d.ts +1 -1
  599. package/dist/types/langfuseToolOutputTracing.d.ts +3 -3
  600. package/dist/types/llm/anthropic/index.d.ts +1 -1
  601. package/dist/types/llm/bedrock/index.d.ts +1 -1
  602. package/dist/types/llm/bedrock/toolCache.d.ts +2 -2
  603. package/dist/types/llm/contextOverflowRecovery.d.ts +2 -2
  604. package/dist/types/llm/google/index.d.ts +1 -1
  605. package/dist/types/llm/init.d.ts +2 -2
  606. package/dist/types/llm/invoke.d.ts +6 -6
  607. package/dist/types/llm/mistral/index.d.ts +1 -1
  608. package/dist/types/llm/openai/index.d.ts +2 -2
  609. package/dist/types/llm/openrouter/index.d.ts +2 -2
  610. package/dist/types/llm/openrouter/toolCache.d.ts +2 -2
  611. package/dist/types/llm/providers.d.ts +2 -2
  612. package/dist/types/llm/request.d.ts +2 -2
  613. package/dist/types/llm/stream/chunkAdapters.d.ts +1 -1
  614. package/dist/types/llm/streamLimits.d.ts +1 -1
  615. package/dist/types/llm/truncation.d.ts +1 -1
  616. package/dist/types/llm/vertexai/index.d.ts +1 -1
  617. package/dist/types/messages/alternation.d.ts +1 -1
  618. package/dist/types/messages/anthropicToolCache.d.ts +2 -2
  619. package/dist/types/messages/assistantPhase.d.ts +3 -3
  620. package/dist/types/messages/budget.d.ts +1 -1
  621. package/dist/types/messages/cache.d.ts +1 -1
  622. package/dist/types/messages/contextPruning.d.ts +2 -2
  623. package/dist/types/messages/core.d.ts +2 -2
  624. package/dist/types/messages/format.d.ts +2 -2
  625. package/dist/types/messages/ids.d.ts +2 -2
  626. package/dist/types/messages/injected.d.ts +1 -1
  627. package/dist/types/messages/langchain.d.ts +1 -1
  628. package/dist/types/messages/prune.d.ts +3 -3
  629. package/dist/types/openai/index.d.ts +1 -1
  630. package/dist/types/prompts/activityLabel.d.ts +2 -2
  631. package/dist/types/responses/index.d.ts +1 -1
  632. package/dist/types/run.d.ts +3 -3
  633. package/dist/types/session/handlers.d.ts +1 -1
  634. package/dist/types/session/types.d.ts +1 -1
  635. package/dist/types/stream.d.ts +4 -4
  636. package/dist/types/summarization/index.d.ts +1 -1
  637. package/dist/types/summarization/node.d.ts +6 -6
  638. package/dist/types/test/mockTools.d.ts +1 -1
  639. package/dist/types/tools/BashExecutor.d.ts +2 -2
  640. package/dist/types/tools/BashProgrammaticToolCalling.d.ts +2 -2
  641. package/dist/types/tools/CodeExecutor.d.ts +3 -3
  642. package/dist/types/tools/CodeSessionFileSummary.d.ts +1 -1
  643. package/dist/types/tools/ProgrammaticToolCalling.d.ts +2 -2
  644. package/dist/types/tools/ReadFile.d.ts +1 -1
  645. package/dist/types/tools/SkillTool.d.ts +1 -1
  646. package/dist/types/tools/SubagentTool.d.ts +3 -3
  647. package/dist/types/tools/ToolNode.d.ts +5 -5
  648. package/dist/types/tools/ToolSearch.d.ts +2 -2
  649. package/dist/types/tools/cloudflare/CloudflareBridgeRuntime.d.ts +1 -1
  650. package/dist/types/tools/cloudflare/CloudflareProgrammaticToolCalling.d.ts +1 -1
  651. package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +2 -2
  652. package/dist/types/tools/cloudflare/CloudflareSandboxTools.d.ts +1 -1
  653. package/dist/types/tools/eagerEventExecution.d.ts +1 -1
  654. package/dist/types/tools/handlers.d.ts +3 -3
  655. package/dist/types/tools/intentArg.d.ts +1 -1
  656. package/dist/types/tools/local/CompileCheckTool.d.ts +2 -2
  657. package/dist/types/tools/local/FileCheckpointer.d.ts +1 -1
  658. package/dist/types/tools/local/LocalCodingTools.d.ts +2 -2
  659. package/dist/types/tools/local/LocalExecutionEngine.d.ts +1 -1
  660. package/dist/types/tools/local/LocalExecutionTools.d.ts +1 -1
  661. package/dist/types/tools/local/LocalProgrammaticToolCalling.d.ts +1 -1
  662. package/dist/types/tools/local/bashAst.d.ts +1 -1
  663. package/dist/types/tools/local/resolveLocalExecutionTools.d.ts +1 -1
  664. package/dist/types/tools/local/syntaxCheck.d.ts +1 -1
  665. package/dist/types/tools/ptcTimeout.d.ts +1 -1
  666. package/dist/types/tools/schema.d.ts +1 -1
  667. package/dist/types/tools/search/anthropic.d.ts +1 -1
  668. package/dist/types/tools/skillCatalog.d.ts +1 -1
  669. package/dist/types/tools/subagent/SubagentExecutor.d.ts +5 -5
  670. package/dist/types/tools/subagent/SubagentReplay.d.ts +3 -3
  671. package/dist/types/tools/subagent/childGraphConfig.d.ts +2 -2
  672. package/dist/types/types/activityLabel.d.ts +3 -3
  673. package/dist/types/types/graph.d.ts +7 -7
  674. package/dist/types/types/llm.d.ts +9 -9
  675. package/dist/types/types/run.d.ts +7 -7
  676. package/dist/types/types/stream.d.ts +5 -5
  677. package/dist/types/types/summarize.d.ts +2 -2
  678. package/dist/types/types/tools.d.ts +5 -5
  679. package/dist/types/utils/__tests__/fixtures/contextOverflowSignatures.d.ts +1 -1
  680. package/dist/types/utils/errors.d.ts +1 -1
  681. package/dist/types/utils/events.d.ts +1 -1
  682. package/dist/types/utils/handlers.d.ts +3 -3
  683. package/dist/types/utils/llm.d.ts +1 -1
  684. package/dist/types/utils/llmConfig.d.ts +1 -1
  685. package/dist/types/utils/title.d.ts +1 -1
  686. package/package.json +10 -3
  687. package/src/llm/google/utils/common.ts +6 -4
  688. package/src/__tests__/stream.eagerArgsDivergence.test.ts +0 -911
  689. package/src/__tests__/stream.eagerEventExecution.test.ts +0 -5046
  690. package/src/__tests__/stream.streamLimits.test.ts +0 -1982
  691. package/src/agents/__tests__/AgentContext.anthropic.live.test.ts +0 -448
  692. package/src/agents/__tests__/AgentContext.bedrock.live.test.ts +0 -655
  693. package/src/agents/__tests__/AgentContext.openrouter.live.test.ts +0 -128
  694. package/src/agents/__tests__/AgentContext.overflow.test.ts +0 -205
  695. package/src/agents/__tests__/AgentContext.test.ts +0 -2425
  696. package/src/agents/__tests__/projection.test.ts +0 -73
  697. package/src/agents/__tests__/promptCacheLiveHelpers.ts +0 -175
  698. package/src/aggregator.test.ts +0 -1214
  699. package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +0 -273
  700. package/src/graphs/__tests__/Graph.closeRunStep.test.ts +0 -385
  701. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +0 -1766
  702. package/src/graphs/__tests__/Graph.preemptSignal.test.ts +0 -126
  703. package/src/graphs/__tests__/Graph.reasoning.test.ts +0 -1717
  704. package/src/graphs/__tests__/Graph.subagentResumeState.test.ts +0 -80
  705. package/src/graphs/__tests__/MultiAgentGraph.test.ts +0 -177
  706. package/src/graphs/__tests__/composition.smoke.test.ts +0 -509
  707. package/src/graphs/__tests__/createGraph.test.ts +0 -206
  708. package/src/hooks/__tests__/HookRegistry.test.ts +0 -334
  709. package/src/hooks/__tests__/compactHooks.test.ts +0 -250
  710. package/src/hooks/__tests__/createToolPolicyHook.test.ts +0 -268
  711. package/src/hooks/__tests__/createWorkspacePolicyHook.test.ts +0 -405
  712. package/src/hooks/__tests__/executeHooks.test.ts +0 -1294
  713. package/src/hooks/__tests__/integration.test.ts +0 -337
  714. package/src/hooks/__tests__/matchers.test.ts +0 -238
  715. package/src/hooks/__tests__/preemptBoundary.test.ts +0 -152
  716. package/src/hooks/__tests__/toolHooks.test.ts +0 -669
  717. package/src/llm/__tests__/contextOverflowRecovery.test.ts +0 -401
  718. package/src/llm/__tests__/fallbackOverflow.test.ts +0 -287
  719. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  720. package/src/llm/anthropic/inherited-content-utils.spec.ts +0 -249
  721. package/src/llm/anthropic/inherited-stream-events.spec.ts +0 -1259
  722. package/src/llm/anthropic/inherited-strict.spec.ts +0 -302
  723. package/src/llm/anthropic/llm.spec.ts +0 -3394
  724. package/src/llm/anthropic/utils/cross-provider-reasoning.test.ts +0 -383
  725. package/src/llm/anthropic/utils/cross-provider-server-tools.test.ts +0 -110
  726. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +0 -508
  727. package/src/llm/anthropic/utils/streaming-tool-input.test.ts +0 -361
  728. package/src/llm/anthropic/utils/stripPrefillCache.test.ts +0 -111
  729. package/src/llm/anthropic/utils/tool-id-normalization.test.ts +0 -287
  730. package/src/llm/bedrock/inherited-cache.spec.ts +0 -144
  731. package/src/llm/bedrock/inherited.spec.ts +0 -724
  732. package/src/llm/bedrock/llm.spec.ts +0 -1533
  733. package/src/llm/bedrock/streamSealDispatch.test.ts +0 -331
  734. package/src/llm/bedrock/toolCache.test.ts +0 -194
  735. package/src/llm/bedrock/utils/cross-provider-reasoning.test.ts +0 -131
  736. package/src/llm/bedrock/utils/cross-provider-server-tools.test.ts +0 -122
  737. package/src/llm/bedrock/utils/message_inputs.test.ts +0 -650
  738. package/src/llm/bedrock/utils/message_outputs.test.ts +0 -85
  739. package/src/llm/bedrock/utils/toolResultCachePoint.test.ts +0 -118
  740. package/src/llm/custom-chat-models.smoke.test.ts +0 -1966
  741. package/src/llm/google/data/gettysburg10.wav +0 -0
  742. package/src/llm/google/data/hotdog.jpg +0 -0
  743. package/src/llm/google/inherited-stream-events.spec.ts +0 -350
  744. package/src/llm/google/llm.spec.ts +0 -1388
  745. package/src/llm/google/streamSmoothing.test.ts +0 -121
  746. package/src/llm/google/utils/common.test.ts +0 -185
  747. package/src/llm/invoke.alternation.test.ts +0 -87
  748. package/src/llm/invoke.handoffCue.test.ts +0 -112
  749. package/src/llm/invoke.streamLimits.test.ts +0 -142
  750. package/src/llm/invoke.test.ts +0 -1198
  751. package/src/llm/mistral/streamSmoothing.test.ts +0 -97
  752. package/src/llm/openai/cacheWriteTokens.test.ts +0 -112
  753. package/src/llm/openai/contentBlocks.test.ts +0 -381
  754. package/src/llm/openai/deepseek.test.ts +0 -747
  755. package/src/llm/openai/inherited-deepseek.spec.ts +0 -347
  756. package/src/llm/openai/inherited-xai.spec.ts +0 -416
  757. package/src/llm/openai/llm.spec.ts +0 -1774
  758. package/src/llm/openai/managedRequests.test.ts +0 -182
  759. package/src/llm/openai/sequentialToolCallSeals.test.ts +0 -199
  760. package/src/llm/openai/streamMetadata.spec.ts +0 -86
  761. package/src/llm/openai/streamMetadataDedup.spec.ts +0 -166
  762. package/src/llm/openai/utils/isReasoningModel.test.ts +0 -90
  763. package/src/llm/openai/utils/messages.test.ts +0 -488
  764. package/src/llm/openrouter/reasoning.test.ts +0 -561
  765. package/src/llm/openrouter/toolCache.test.ts +0 -134
  766. package/src/llm/preempt.test.ts +0 -323
  767. package/src/llm/stream/chunkAdapters.test.ts +0 -202
  768. package/src/llm/stream/reassembly.test.ts +0 -241
  769. package/src/llm/stream/smoother.bench.test.ts +0 -155
  770. package/src/llm/stream/smoother.test.ts +0 -519
  771. package/src/llm/streamLimits.test.ts +0 -450
  772. package/src/llm/truncation.test.ts +0 -242
  773. package/src/llm/vertexai/fixThoughtSignatures.test.ts +0 -154
  774. package/src/llm/vertexai/inherited-stream-events.spec.ts +0 -271
  775. package/src/llm/vertexai/llm.spec.ts +0 -159
  776. package/src/llm/vertexai/repairUsageMetadata.test.ts +0 -54
  777. package/src/llm/vertexai/sealStreamedToolCalls.test.ts +0 -88
  778. package/src/llm/vertexai/streamSealDispatch.test.ts +0 -148
  779. package/src/llm/vertexai/streamSmoothing.test.ts +0 -109
  780. package/src/messages/__tests__/anthropicToolCache.test.ts +0 -339
  781. package/src/messages/__tests__/observationMasking.test.ts +0 -312
  782. package/src/messages/__tests__/recency.test.ts +0 -267
  783. package/src/messages/__tests__/tools.test.ts +0 -473
  784. package/src/messages/alternation.test.ts +0 -212
  785. package/src/messages/assistantPhase.test.ts +0 -75
  786. package/src/messages/cache.tail.test.ts +0 -533
  787. package/src/messages/cache.test.ts +0 -2166
  788. package/src/messages/content.test.ts +0 -362
  789. package/src/messages/contextPruning.test.ts +0 -184
  790. package/src/messages/ensureThinkingBlock.test.ts +0 -1427
  791. package/src/messages/foldToollessToolBlocks.test.ts +0 -596
  792. package/src/messages/formatAgentMessages.reducer.test.ts +0 -162
  793. package/src/messages/formatAgentMessages.skills.test.ts +0 -513
  794. package/src/messages/formatAgentMessages.steer.test.ts +0 -598
  795. package/src/messages/formatAgentMessages.test.ts +0 -8111
  796. package/src/messages/formatAgentMessages.tools.test.ts +0 -522
  797. package/src/messages/formatMessage.test.ts +0 -693
  798. package/src/messages/handoffCue.test.ts +0 -96
  799. package/src/messages/injected.test.ts +0 -107
  800. package/src/messages/labelContentByAgent.test.ts +0 -962
  801. package/src/messages/reducer.spec.ts +0 -32
  802. package/src/messages/shiftIndexTokenCountMap.test.ts +0 -81
  803. package/src/messages/tailCacheConversion.test.ts +0 -161
  804. package/src/openai/__tests__/openai.test.ts +0 -337
  805. package/src/responses/__tests__/responses.test.ts +0 -652
  806. package/src/scripts/abort.ts +0 -157
  807. package/src/scripts/activity-labels/captured.json +0 -56
  808. package/src/scripts/activity-labels/checks.cjs +0 -205
  809. package/src/scripts/activity-labels/corpus.cjs +0 -473
  810. package/src/scripts/activity-labels/report.cjs +0 -203
  811. package/src/scripts/activity-labels/rescore.cjs +0 -102
  812. package/src/scripts/activity-labels/run.ts +0 -705
  813. package/src/scripts/activity-labels/variants.ts +0 -71
  814. package/src/scripts/ant_web_search.ts +0 -159
  815. package/src/scripts/ant_web_search_edge_case.ts +0 -163
  816. package/src/scripts/ant_web_search_error_edge_case.ts +0 -149
  817. package/src/scripts/args.ts +0 -48
  818. package/src/scripts/bedrock-cache-debug.ts +0 -250
  819. package/src/scripts/bedrock-content-aggregation-test.ts +0 -266
  820. package/src/scripts/bedrock-merge-test.ts +0 -107
  821. package/src/scripts/bedrock-parallel-tools-test.ts +0 -204
  822. package/src/scripts/bench-prompt-cache.ts +0 -479
  823. package/src/scripts/caching.ts +0 -132
  824. package/src/scripts/cli.ts +0 -172
  825. package/src/scripts/cli2.ts +0 -133
  826. package/src/scripts/cli3.ts +0 -184
  827. package/src/scripts/cli4.ts +0 -191
  828. package/src/scripts/cli5.ts +0 -191
  829. package/src/scripts/code_exec.ts +0 -214
  830. package/src/scripts/code_exec_files.ts +0 -237
  831. package/src/scripts/code_exec_multi_session.ts +0 -237
  832. package/src/scripts/code_exec_ptc.ts +0 -335
  833. package/src/scripts/code_exec_session.ts +0 -283
  834. package/src/scripts/code_exec_simple.ts +0 -148
  835. package/src/scripts/compare_pi_vs_ours.ts +0 -1259
  836. package/src/scripts/content.ts +0 -139
  837. package/src/scripts/context-overflow-probe.ts +0 -997
  838. package/src/scripts/empty_input.ts +0 -137
  839. package/src/scripts/handoff-test.ts +0 -134
  840. package/src/scripts/local_engine.ts +0 -166
  841. package/src/scripts/local_engine_checkpointer.ts +0 -205
  842. package/src/scripts/local_engine_compile.ts +0 -263
  843. package/src/scripts/local_engine_hooks.ts +0 -226
  844. package/src/scripts/local_engine_image.ts +0 -201
  845. package/src/scripts/local_engine_ptc.ts +0 -151
  846. package/src/scripts/local_engine_workspace.ts +0 -258
  847. package/src/scripts/memory.ts +0 -107
  848. package/src/scripts/multi-agent-chain.ts +0 -332
  849. package/src/scripts/multi-agent-conditional.ts +0 -222
  850. package/src/scripts/multi-agent-document-review-chain.ts +0 -198
  851. package/src/scripts/multi-agent-hybrid-flow.ts +0 -311
  852. package/src/scripts/multi-agent-parallel-start.ts +0 -265
  853. package/src/scripts/multi-agent-parallel.ts +0 -395
  854. package/src/scripts/multi-agent-sequence.ts +0 -217
  855. package/src/scripts/multi-agent-subagent.ts +0 -246
  856. package/src/scripts/multi-agent-supervisor.ts +0 -366
  857. package/src/scripts/multi-agent-test.ts +0 -187
  858. package/src/scripts/openrouter_prompt_cache_live.ts +0 -310
  859. package/src/scripts/parallel-asymmetric-tools-test.ts +0 -275
  860. package/src/scripts/parallel-full-metadata-test.ts +0 -241
  861. package/src/scripts/parallel-tools-test.ts +0 -341
  862. package/src/scripts/preempt-probe.ts +0 -330
  863. package/src/scripts/preempt-scenarios.ts +0 -388
  864. package/src/scripts/programmatic_exec.ts +0 -387
  865. package/src/scripts/programmatic_exec_agent.ts +0 -232
  866. package/src/scripts/search.ts +0 -147
  867. package/src/scripts/sequential-full-metadata-test.ts +0 -198
  868. package/src/scripts/session_live.ts +0 -548
  869. package/src/scripts/simple.ts +0 -226
  870. package/src/scripts/single-agent-metadata-test.ts +0 -196
  871. package/src/scripts/stream.ts +0 -141
  872. package/src/scripts/subagent-configurable-inheritance.ts +0 -252
  873. package/src/scripts/subagent-event-driven-debug.ts +0 -190
  874. package/src/scripts/subagent-tools-debug.ts +0 -160
  875. package/src/scripts/subagent-usage-sink.ts +0 -176
  876. package/src/scripts/summarization-recency.ts +0 -462
  877. package/src/scripts/test-custom-prompt-key.ts +0 -145
  878. package/src/scripts/test-handoff-input.ts +0 -170
  879. package/src/scripts/test-handoff-preamble.ts +0 -278
  880. package/src/scripts/test-handoff-steering.ts +0 -430
  881. package/src/scripts/test-multi-agent-list-handoff.ts +0 -418
  882. package/src/scripts/test-parallel-agent-labeling.ts +0 -327
  883. package/src/scripts/test-parallel-handoffs.ts +0 -292
  884. package/src/scripts/test-thinking-handoff-bedrock.ts +0 -154
  885. package/src/scripts/test-thinking-handoff.ts +0 -156
  886. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +0 -166
  887. package/src/scripts/test-tool-before-handoff-role-order.ts +0 -276
  888. package/src/scripts/test-tools-before-handoff.ts +0 -222
  889. package/src/scripts/test_code_api.ts +0 -354
  890. package/src/scripts/thinking-bedrock.ts +0 -160
  891. package/src/scripts/thinking-vertexai.ts +0 -168
  892. package/src/scripts/thinking.ts +0 -172
  893. package/src/scripts/tool_search.ts +0 -153
  894. package/src/scripts/tools.ts +0 -163
  895. package/src/session/__tests__/JsonlSessionStore.test.ts +0 -1463
  896. package/src/session/__tests__/handlers.test.ts +0 -161
  897. package/src/specs/activity-label-observability.live.test.ts +0 -262
  898. package/src/specs/activity-label-observability.test.ts +0 -167
  899. package/src/specs/activity-label-prompt.test.ts +0 -359
  900. package/src/specs/activity-label-trace-seed.test.ts +0 -47
  901. package/src/specs/activity-phase-label.test.ts +0 -306
  902. package/src/specs/agent-handoffs.live.test.ts +0 -140
  903. package/src/specs/agent-handoffs.test.ts +0 -2465
  904. package/src/specs/anthropic.simple.test.ts +0 -453
  905. package/src/specs/ask-user-question-batch.test.ts +0 -289
  906. package/src/specs/ask-user-questions.live.test.ts +0 -185
  907. package/src/specs/ask-user-questions.test.ts +0 -293
  908. package/src/specs/azure.simple.test.ts +0 -502
  909. package/src/specs/bedrock-toolless.live.test.ts +0 -123
  910. package/src/specs/bedrock-truncation.live.test.ts +0 -191
  911. package/src/specs/cache.simple.test.ts +0 -416
  912. package/src/specs/context-accuracy.live.test.ts +0 -409
  913. package/src/specs/context-overflow-recovery.live.test.ts +0 -213
  914. package/src/specs/context-usage-event.test.ts +0 -117
  915. package/src/specs/context-usage.live.test.ts +0 -297
  916. package/src/specs/custom-event-await.test.ts +0 -304
  917. package/src/specs/deepseek.simple.test.ts +0 -290
  918. package/src/specs/deterministic-trace-id.test.ts +0 -43
  919. package/src/specs/discovered-tools.test.ts +0 -217
  920. package/src/specs/durability-checkpoint.integration.test.ts +0 -243
  921. package/src/specs/graph-subagent.live.test.ts +0 -242
  922. package/src/specs/graph-subagent.test.ts +0 -322
  923. package/src/specs/handoffCue.test.ts +0 -165
  924. package/src/specs/langfuse-callbacks.test.ts +0 -1578
  925. package/src/specs/langfuse-config.test.ts +0 -247
  926. package/src/specs/langfuse-instrumentation.test.ts +0 -393
  927. package/src/specs/langfuse-metadata.test.ts +0 -245
  928. package/src/specs/langfuse-routing.integration.test.ts +0 -844
  929. package/src/specs/langfuse-runtime-context.test.ts +0 -92
  930. package/src/specs/langfuse-span-registry.test.ts +0 -87
  931. package/src/specs/langfuse-tool-output-tracing.test.ts +0 -1858
  932. package/src/specs/langfuse-trace-shaping.test.ts +0 -591
  933. package/src/specs/moonshot.simple.test.ts +0 -367
  934. package/src/specs/multi-agent-summarization.test.ts +0 -396
  935. package/src/specs/openai.simple.test.ts +0 -315
  936. package/src/specs/openrouter.simple.test.ts +0 -275
  937. package/src/specs/preemptSeal.test.ts +0 -678
  938. package/src/specs/prune.test.ts +0 -3741
  939. package/src/specs/reasoning.test.ts +0 -201
  940. package/src/specs/run-step-timestamps.test.ts +0 -414
  941. package/src/specs/spec.utils.ts +0 -15
  942. package/src/specs/subagent.test.ts +0 -864
  943. package/src/specs/summarization-unit.test.ts +0 -973
  944. package/src/specs/summarization.test.ts +0 -3823
  945. package/src/specs/summarize-prune.test.ts +0 -376
  946. package/src/specs/thinking-handoff.test.ts +0 -621
  947. package/src/specs/thinking-prune.test.ts +0 -827
  948. package/src/specs/token-accounting-e2e.test.ts +0 -1034
  949. package/src/specs/token-accounting-pipeline.test.ts +0 -1008
  950. package/src/specs/token-distribution-edge-case.test.ts +0 -315
  951. package/src/specs/token-memoization.test.ts +0 -40
  952. package/src/specs/tokens.test.ts +0 -1000
  953. package/src/specs/tool-error-resume.test.ts +0 -194
  954. package/src/specs/tool-error.test.ts +0 -198
  955. package/src/specs/vllm-reasoning-toolcalls.test.ts +0 -340
  956. package/src/stream.dispatch.test.ts +0 -63
  957. package/src/stream.test.ts +0 -144
  958. package/src/summarization/__tests__/aggregator.test.ts +0 -236
  959. package/src/summarization/__tests__/node.test.ts +0 -1996
  960. package/src/summarization/__tests__/trigger.test.ts +0 -149
  961. package/src/summarization/chunkHandler.test.ts +0 -196
  962. package/src/test/mockTools.ts +0 -386
  963. package/src/tools/Calculator.test.ts +0 -278
  964. package/src/tools/__tests__/BashExecutor.test.ts +0 -108
  965. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +0 -939
  966. package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +0 -858
  967. package/src/tools/__tests__/CodeExecutor.stateful.test.ts +0 -124
  968. package/src/tools/__tests__/LocalExecutionRoots.test.ts +0 -8
  969. package/src/tools/__tests__/LocalExecutionTools.test.ts +0 -2733
  970. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +0 -318
  971. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -1557
  972. package/src/tools/__tests__/ReadFile.test.ts +0 -44
  973. package/src/tools/__tests__/SkillTool.test.ts +0 -442
  974. package/src/tools/__tests__/SubagentExecutor.test.ts +0 -3728
  975. package/src/tools/__tests__/SubagentReplay.test.ts +0 -329
  976. package/src/tools/__tests__/SubagentTool.test.ts +0 -149
  977. package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +0 -595
  978. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +0 -1191
  979. package/src/tools/__tests__/ToolNode.invalidToolCalls.test.ts +0 -757
  980. package/src/tools/__tests__/ToolNode.langfuse.test.ts +0 -57
  981. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +0 -736
  982. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +0 -1710
  983. package/src/tools/__tests__/ToolNode.runtimeState.test.ts +0 -120
  984. package/src/tools/__tests__/ToolNode.session.test.ts +0 -1352
  985. package/src/tools/__tests__/ToolNode.streamLimits.test.ts +0 -69
  986. package/src/tools/__tests__/ToolSearch.integration.test.ts +0 -161
  987. package/src/tools/__tests__/ToolSearch.test.ts +0 -1227
  988. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +0 -561
  989. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +0 -980
  990. package/src/tools/__tests__/directToolHooks.test.ts +0 -700
  991. package/src/tools/__tests__/eagerEventExecution.session.test.ts +0 -92
  992. package/src/tools/__tests__/handlers.test.ts +0 -997
  993. package/src/tools/__tests__/hitl.test.ts +0 -4663
  994. package/src/tools/__tests__/intentArg.test.ts +0 -357
  995. package/src/tools/__tests__/intentCoverage.test.ts +0 -139
  996. package/src/tools/__tests__/localToolNames.test.ts +0 -75
  997. package/src/tools/__tests__/skillCatalog.test.ts +0 -161
  998. package/src/tools/__tests__/subagentHooks.test.ts +0 -1651
  999. package/src/tools/__tests__/toolOutputReferences.test.ts +0 -515
  1000. package/src/tools/__tests__/workspaceSeam.test.ts +0 -147
  1001. package/src/tools/local/__tests__/FileCheckpointer.test.ts +0 -162
  1002. package/src/tools/local/__tests__/editStrategies.test.ts +0 -134
  1003. package/src/tools/search/content.test.ts +0 -173
  1004. package/src/tools/search/crw.test.ts +0 -836
  1005. package/src/tools/search/format.test.ts +0 -242
  1006. package/src/tools/search/http-agent.test.ts +0 -133
  1007. package/src/tools/search/jina-reranker.test.ts +0 -306
  1008. package/src/tools/search/keenable-scraper.test.ts +0 -153
  1009. package/src/tools/search/keenable.test.ts +0 -183
  1010. package/src/tools/search/outcome.test.ts +0 -90
  1011. package/src/tools/search/output.md +0 -2775
  1012. package/src/tools/search/rag-api-reranker.test.ts +0 -891
  1013. package/src/tools/search/source-processing.test.ts +0 -516
  1014. package/src/tools/search/tavily.test.ts +0 -965
  1015. package/src/tools/search/test.html +0 -884
  1016. package/src/tools/search/test.md +0 -643
  1017. package/src/tools/subagent/__tests__/SubagentExecutionRegistry.test.ts +0 -637
  1018. package/src/tools/subagent/__tests__/SubagentExecutor.lazy.test.ts +0 -3054
  1019. package/src/tools/subagent/__tests__/childGraphConfig.test.ts +0 -521
  1020. package/src/utils/__tests__/apportion.test.ts +0 -32
  1021. package/src/utils/__tests__/errors.test.ts +0 -270
  1022. package/src/utils/__tests__/fixtures/contextOverflowSignatures.ts +0 -336
  1023. package/src/utils/__tests__/redactSecrets.test.ts +0 -56
  1024. package/src/utils/__tests__/truncation.test.ts +0 -66
  1025. package/src/utils/llm.test.ts +0 -18
  1026. package/src/utils/proxy.test.ts +0 -176
  1027. package/src/utils/toolContent.test.ts +0 -1432
@@ -1,1966 +0,0 @@
1
- import { convertMessagesToResponsesInput } from '@langchain/openai';
2
- import {
3
- AIMessage,
4
- AIMessageChunk,
5
- HumanMessage,
6
- } from '@langchain/core/messages';
7
- import type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';
8
- import type { OpenAIChatInput, OpenAIClient } from '@langchain/openai';
9
- import type { ChatGenerationChunk } from '@langchain/core/outputs';
10
- import type {
11
- ChatAnthropicToolType,
12
- AnthropicMCPServerURLDefinition,
13
- } from '@/llm/anthropic/types';
14
- import type { ChatOpenRouterCallOptions } from '@/llm/openrouter';
15
- import type { CustomAnthropicInput } from '@/llm/anthropic';
16
- import {
17
- ChatXAI,
18
- ChatOpenAI,
19
- ChatDeepSeek,
20
- ChatMoonshot,
21
- AzureChatOpenAI,
22
- CustomOpenAIClient,
23
- CustomAzureOpenAIClient,
24
- } from '@/llm/openai';
25
- import {
26
- OPENAI_RESPONSES_REPLAY_POSITIONS_KEY,
27
- projectOpenAIResponsesToolMessageContent,
28
- } from '@/messages/core';
29
- import { CustomChatGoogleGenerativeAI } from '@/llm/google';
30
- import { CustomChatBedrockConverse } from '@/llm/bedrock';
31
- import { ChatOpenRouter } from '@/llm/openrouter';
32
- import { CustomAnthropic } from '@/llm/anthropic';
33
- import { ChatVertexAI } from '@/llm/vertexai';
34
-
35
- type OpenAIRequestOptions = Parameters<ChatOpenAI['_getClientOptions']>[0];
36
- type OpenAIRequestOptionsWithBaseURL = ReturnType<
37
- ChatXAI['_getClientOptions']
38
- > & {
39
- baseURL?: string;
40
- };
41
- type OpenAIResponsesDelegate = {
42
- client?: unknown;
43
- _getClientOptions: (options?: OpenAIRequestOptions) => OpenAIRequestOptions;
44
- };
45
- type StreamingOpenAIResponsesDelegate = OpenAIResponsesDelegate & {
46
- completionWithRetry: (
47
- request: OpenAIClient.Responses.ResponseCreateParamsStreaming
48
- ) => Promise<AsyncIterable<OpenAIClient.Responses.ResponseStreamEvent>>;
49
- };
50
- type MockableResponsesDelegate = OpenAIResponsesDelegate & {
51
- completionWithRetry: (request: {
52
- input?: unknown;
53
- stream?: boolean;
54
- }) => Promise<unknown>;
55
- _generate: (
56
- messages: AIMessage[],
57
- options: Record<string, unknown>
58
- ) => Promise<unknown>;
59
- _streamChatModelEvents: (
60
- messages: AIMessage[],
61
- options: Record<string, unknown>
62
- ) => AsyncGenerator<unknown>;
63
- _streamResponseChunks: (
64
- messages: AIMessage[],
65
- options: Record<string, unknown>
66
- ) => AsyncGenerator<ChatGenerationChunk>;
67
- };
68
- type AnthropicCallOptions = Parameters<
69
- CustomAnthropic['invocationParams']
70
- >[0] & {
71
- outputConfig?: CustomAnthropicInput['outputConfig'] & {
72
- task_budget?: { type: 'token_budget'; value: number };
73
- };
74
- inferenceGeo?: CustomAnthropicInput['inferenceGeo'];
75
- betas?: CustomAnthropicInput['betas'];
76
- container?: string;
77
- mcp_servers?: AnthropicMCPServerURLDefinition[];
78
- tools?: ChatAnthropicToolType[];
79
- };
80
- type AzureReasoningModel = AzureChatOpenAI & {
81
- reasoning?: { effort: 'low' | 'high' };
82
- };
83
- type OpenRouterFields = Partial<
84
- ChatOpenRouterCallOptions & Pick<OpenAIChatInput, 'model' | 'apiKey'>
85
- >;
86
- type CompletionDelegate = {
87
- completionWithRetry: (request: { messages?: unknown }) => Promise<unknown>;
88
- };
89
- type CompletionBackedModel = {
90
- completions: CompletionDelegate;
91
- };
92
- type StreamingCompletionRequest = {
93
- messages?: unknown;
94
- stream?: boolean;
95
- };
96
- type StreamingCompletionDelegate = {
97
- completionWithRetry: (
98
- request: StreamingCompletionRequest
99
- ) => Promise<
100
- AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>
101
- >;
102
- };
103
- type StreamingCompletionBackedModel = {
104
- completions: StreamingCompletionDelegate;
105
- };
106
- type OpenAIStreamEvent = {
107
- event: string;
108
- data?: unknown;
109
- };
110
- type OpenAIStreamItem =
111
- | OpenAIClient.Chat.Completions.ChatCompletionChunk
112
- | OpenAIStreamEvent;
113
- type FetchOutcome = 'resolved' | 'rejected' | 'pending';
114
- type AbortableFetchCapture = {
115
- fetch: typeof fetch;
116
- getSignal: () => AbortSignal | undefined;
117
- };
118
- type FetchTimeoutClient = {
119
- fetchWithTimeout: (
120
- url: RequestInfo,
121
- init: RequestInit | undefined,
122
- ms: number,
123
- controller: AbortController
124
- ) => Promise<Response>;
125
- };
126
- type MockableCompletionCreate = (
127
- request: unknown,
128
- options?: unknown
129
- ) => Promise<
130
- AsyncIterable<OpenAIStreamItem> | OpenAIClient.Chat.Completions.ChatCompletion
131
- >;
132
- type MockableCompletionClient = {
133
- chat: {
134
- completions: {
135
- create: MockableCompletionCreate;
136
- };
137
- };
138
- };
139
- type MockableCompletionDelegate = OpenAIResponsesDelegate & {
140
- client?: MockableCompletionClient;
141
- };
142
- type OpenRouterReasoningStreamDelta =
143
- OpenAIClient.Chat.Completions.ChatCompletionChunk.Choice.Delta & {
144
- reasoning_details?: Array<
145
- | {
146
- type: 'reasoning.text';
147
- text?: string;
148
- format?: string;
149
- index?: number;
150
- }
151
- | {
152
- type: 'reasoning.encrypted';
153
- id?: string;
154
- data?: string;
155
- format?: string;
156
- index?: number;
157
- }
158
- >;
159
- };
160
- type OpenRouterReasoningStreamChoice = Omit<
161
- OpenAIClient.Chat.Completions.ChatCompletionChunk.Choice,
162
- 'delta'
163
- > & {
164
- delta: OpenRouterReasoningStreamDelta;
165
- };
166
- type OpenAICompatibleReasoningStreamDelta =
167
- OpenAIClient.Chat.Completions.ChatCompletionChunk.Choice.Delta & {
168
- reasoning?: string;
169
- reasoning_details?: Array<{
170
- type: 'reasoning.text';
171
- text?: string;
172
- format?: string;
173
- index?: number;
174
- }>;
175
- };
176
- type OpenAICompatibleReasoningStreamChoice = Omit<
177
- OpenAIClient.Chat.Completions.ChatCompletionChunk.Choice,
178
- 'delta'
179
- > & {
180
- delta: OpenAICompatibleReasoningStreamDelta;
181
- };
182
- type PromptTokensDetailsWithCacheWrite = NonNullable<
183
- OpenAIClient.Completions.CompletionUsage['prompt_tokens_details']
184
- > & {
185
- cache_write_tokens?: number;
186
- };
187
- type CompletionUsageWithCacheWrite = Omit<
188
- OpenAIClient.Completions.CompletionUsage,
189
- 'prompt_tokens_details'
190
- > & {
191
- prompt_tokens_details?: PromptTokensDetailsWithCacheWrite;
192
- };
193
- type OpenAIStreamModel = ChatOpenAI | AzureChatOpenAI;
194
-
195
- class CallbackTestChatOpenRouter extends ChatOpenRouter {
196
- streamChunksWithCallbacks(
197
- runManager?: CallbackManagerForLLMRun
198
- ): AsyncGenerator<ChatGenerationChunk> {
199
- return this._streamResponseChunks(
200
- [new HumanMessage('hi')],
201
- {} as this['ParsedCallOptions'],
202
- runManager
203
- );
204
- }
205
- }
206
-
207
- const baseAzureFields = {
208
- azureOpenAIApiKey: 'test-azure-key',
209
- azureOpenAIApiVersion: '2024-10-21',
210
- azureOpenAIApiInstanceName: 'test-instance',
211
- azureOpenAIApiDeploymentName: 'test-deployment',
212
- };
213
-
214
- function createPersistedPreemptedAzureMessage(): AIMessage {
215
- return new AIMessage({
216
- id: 'msg_persisted_azure',
217
- content: [{ type: 'text', text: 'Partial Azure answer.' }],
218
- additional_kwargs: {
219
- reasoning: {
220
- id: 'rs_persisted_azure',
221
- type: 'reasoning',
222
- status: 'in_progress',
223
- summary: [],
224
- },
225
- tool_outputs: [
226
- {
227
- id: 'local_persisted_azure',
228
- type: 'local_shell_call_output',
229
- status: 'completed',
230
- output: 'AZURE_SERVER_RESULT',
231
- },
232
- ],
233
- [OPENAI_RESPONSES_REPLAY_POSITIONS_KEY]: [
234
- {
235
- itemId: 'local_persisted_azure',
236
- kind: 'output',
237
- outputIndex: 0,
238
- },
239
- {
240
- itemId: 'rs_persisted_azure',
241
- kind: 'reasoning',
242
- outputIndex: 1,
243
- },
244
- {
245
- itemId: 'msg_persisted_azure',
246
- kind: 'text',
247
- outputIndex: 2,
248
- contentIndex: 0,
249
- },
250
- ],
251
- },
252
- response_metadata: {
253
- id: 'resp_persisted_azure',
254
- model_provider: 'openai',
255
- preempted: true,
256
- },
257
- });
258
- }
259
-
260
- function expectNeutralizedAzureResponsesRequest(request: unknown): void {
261
- const serialized = JSON.stringify(request);
262
- expect(serialized).toContain('AZURE_SERVER_RESULT');
263
- expect(serialized.match(/AZURE_SERVER_RESULT/g)).toHaveLength(1);
264
- expect(serialized).toContain('serverToolResult');
265
- expect(serialized).not.toContain('msg_persisted_azure');
266
- expect(serialized).not.toContain('rs_persisted_azure');
267
- expect(serialized).not.toContain('local_persisted_azure');
268
- expect(serialized).not.toContain('resp_persisted_azure');
269
- expect(serialized).not.toContain(OPENAI_RESPONSES_REPLAY_POSITIONS_KEY);
270
- expect(serialized).not.toContain('local_shell_call_output');
271
- }
272
-
273
- function createCompletedAzureResponse(): OpenAIClient.Responses.Response {
274
- return {
275
- id: 'resp_fresh_azure',
276
- created_at: 0,
277
- error: null,
278
- incomplete_details: null,
279
- instructions: null,
280
- metadata: {},
281
- model: 'gpt-5',
282
- object: 'response',
283
- output: [
284
- {
285
- id: 'msg_fresh_azure',
286
- type: 'message',
287
- role: 'assistant',
288
- status: 'completed',
289
- content: [
290
- {
291
- type: 'output_text',
292
- text: 'Fresh Azure answer.',
293
- annotations: [],
294
- },
295
- ],
296
- },
297
- ],
298
- output_text: 'Fresh Azure answer.',
299
- parallel_tool_calls: true,
300
- status: 'completed',
301
- temperature: null,
302
- tool_choice: 'auto',
303
- tools: [],
304
- top_p: null,
305
- usage: {
306
- input_tokens: 1,
307
- input_tokens_details: { cached_tokens: 0, cache_write_tokens: 0 },
308
- output_tokens: 1,
309
- output_tokens_details: { reasoning_tokens: 0 },
310
- total_tokens: 2,
311
- },
312
- } as OpenAIClient.Responses.Response;
313
- }
314
-
315
- const waitForFetchOutcome = (
316
- promise: Promise<Response>,
317
- timeoutMs = 100
318
- ): Promise<FetchOutcome> =>
319
- Promise.race([
320
- promise.then(
321
- () => 'resolved' as const,
322
- () => 'rejected' as const
323
- ),
324
- new Promise<'pending'>((resolve) => {
325
- setTimeout(() => resolve('pending'), timeoutMs);
326
- }),
327
- ]);
328
-
329
- const createAbortableFetch = (): AbortableFetchCapture => {
330
- let requestSignal: AbortSignal | undefined;
331
- return {
332
- fetch: async (_url, init): Promise<Response> =>
333
- new Promise<Response>((_resolve, reject) => {
334
- requestSignal = init?.signal ?? undefined;
335
- requestSignal?.addEventListener(
336
- 'abort',
337
- () => reject(new Error('Aborted')),
338
- { once: true }
339
- );
340
- }),
341
- getSignal: () => requestSignal,
342
- };
343
- };
344
-
345
- const expectFetchTimeoutAbort = async (
346
- client: FetchTimeoutClient,
347
- capturedFetch: AbortableFetchCapture,
348
- url: string
349
- ): Promise<void> => {
350
- const controller = new AbortController();
351
-
352
- const response = client.fetchWithTimeout(
353
- url,
354
- { method: 'post' },
355
- 10,
356
- controller
357
- );
358
-
359
- await expect(waitForFetchOutcome(response)).resolves.toBe('rejected');
360
- expect(controller.signal.aborted).toBe(true);
361
- expect(capturedFetch.getSignal()?.aborted).toBe(true);
362
- };
363
-
364
- const baseBedrockFields = {
365
- region: 'us-east-1',
366
- credentials: {
367
- accessKeyId: 'test-access-key',
368
- secretAccessKey: 'test-secret-key',
369
- },
370
- };
371
-
372
- const createOpenAIStreamChunk = (
373
- content: string,
374
- finishReason: OpenAIClient.Chat.Completions.ChatCompletionChunk.Choice['finish_reason'] = null
375
- ): OpenAIClient.Chat.Completions.ChatCompletionChunk => ({
376
- id: 'chatcmpl-hermes-test',
377
- object: 'chat.completion.chunk',
378
- created: 0,
379
- model: 'hermes-agent',
380
- choices: [
381
- {
382
- index: 0,
383
- delta: { content },
384
- finish_reason: finishReason,
385
- },
386
- ],
387
- });
388
-
389
- async function* createOpenAIStreamWithCustomEvents(): AsyncGenerator<OpenAIStreamItem> {
390
- yield createOpenAIStreamChunk('Hello ');
391
- yield {
392
- event: 'hermes.tool.progress',
393
- data: {
394
- tool: 'execute_code',
395
- toolCallId: 'call_1',
396
- status: 'running',
397
- },
398
- };
399
- yield {
400
- event: 'hermes.tool.progress',
401
- data: null,
402
- };
403
- yield {
404
- event: 'message',
405
- data: createOpenAIStreamChunk('world', 'stop'),
406
- };
407
- }
408
-
409
- function mockCompletionStream(
410
- model: OpenAIStreamModel
411
- ): MockableCompletionCreate {
412
- const completions = (
413
- model as unknown as { completions: MockableCompletionDelegate }
414
- ).completions;
415
- completions._getClientOptions(undefined);
416
- const client = completions.client;
417
- if (client == null) {
418
- throw new Error('Expected OpenAI completions client');
419
- }
420
-
421
- const createMock = jest.fn(async () =>
422
- createOpenAIStreamWithCustomEvents()
423
- ) as MockableCompletionCreate;
424
- client.chat.completions.create = createMock;
425
- return createMock;
426
- }
427
-
428
- function mockCompletion(
429
- model: ChatOpenAI,
430
- response: OpenAIClient.Chat.Completions.ChatCompletion
431
- ): MockableCompletionCreate {
432
- const completions = (
433
- model as unknown as { completions: MockableCompletionDelegate }
434
- ).completions;
435
- completions._getClientOptions(undefined);
436
- const client = completions.client;
437
- if (client == null) {
438
- throw new Error('Expected OpenAI completions client');
439
- }
440
-
441
- const createMock = jest.fn(async () => response) as MockableCompletionCreate;
442
- client.chat.completions.create = createMock;
443
- return createMock;
444
- }
445
-
446
- async function expectCustomSSEEventsSkipped(
447
- model: OpenAIStreamModel
448
- ): Promise<void> {
449
- const createMock = mockCompletionStream(model);
450
- const chunks: AIMessageChunk[] = [];
451
- const stream = await model.stream([new HumanMessage('use a tool')]);
452
- for await (const chunk of stream) {
453
- chunks.push(chunk);
454
- }
455
-
456
- const text = chunks
457
- .map((chunk) => (typeof chunk.content === 'string' ? chunk.content : ''))
458
- .join('');
459
- expect(chunks).toHaveLength(2);
460
- expect(text).toBe('Hello world');
461
- expect(createMock).toHaveBeenCalledWith(
462
- expect.objectContaining({ stream: true }),
463
- expect.any(Object)
464
- );
465
- }
466
-
467
- describe('custom chat model class smoke tests', () => {
468
- it('keeps the custom OpenAI client, stream delay, and reasoning precedence', () => {
469
- const model = new ChatOpenAI({
470
- model: 'gpt-5',
471
- apiKey: 'test-key',
472
- reasoning: { effort: 'low' },
473
- _lc_stream_delay: 3,
474
- });
475
-
476
- const requestOptions = model._getClientOptions({
477
- headers: { 'x-smoke': 'openai' },
478
- } as OpenAIRequestOptions);
479
-
480
- expect(ChatOpenAI.lc_name()).toBe('LibreChatOpenAI');
481
- expect(model._lc_stream_delay).toBe(3);
482
- expect(model.exposedClient).toBeInstanceOf(CustomOpenAIClient);
483
- expect(requestOptions.headers).toEqual(
484
- expect.objectContaining({ 'x-smoke': 'openai' })
485
- );
486
- expect(model.getReasoningParams({ reasoning: { effort: 'high' } })).toEqual(
487
- { effort: 'high' }
488
- );
489
- const params = model.invocationParams({ reasoningEffort: 'medium' }) as {
490
- reasoning?: unknown;
491
- reasoning_effort?: unknown;
492
- };
493
- expect(params.reasoning ?? { effort: params.reasoning_effort }).toEqual({
494
- effort: 'low',
495
- });
496
- });
497
-
498
- it('keeps the custom OpenAI client on the Responses API path', () => {
499
- const model = new ChatOpenAI({
500
- model: 'gpt-5',
501
- apiKey: 'test-key',
502
- useResponsesApi: true,
503
- maxTokens: 32,
504
- reasoning: { effort: 'low' },
505
- });
506
-
507
- const params = model.invocationParams({
508
- reasoningEffort: 'high',
509
- }) as {
510
- max_output_tokens?: number;
511
- max_completion_tokens?: number;
512
- reasoning?: unknown;
513
- };
514
- const responses = (
515
- model as unknown as { responses: OpenAIResponsesDelegate }
516
- ).responses;
517
- const requestOptions = responses._getClientOptions({
518
- headers: { 'x-smoke': 'responses' },
519
- } as OpenAIRequestOptions);
520
-
521
- expect(params.max_output_tokens).toBe(32);
522
- expect(params.max_completion_tokens).toBeUndefined();
523
- expect(params.reasoning).toEqual({ effort: 'low' });
524
- expect(responses.client).toBeInstanceOf(CustomOpenAIClient);
525
- const responsesClient = responses.client as CustomOpenAIClient;
526
- responsesClient.abortHandler = (): void => undefined;
527
- expect(model.exposedClient).toBe(responsesClient);
528
- expect(requestOptions?.headers).toEqual(
529
- expect.objectContaining({ 'x-smoke': 'responses' })
530
- );
531
- });
532
-
533
- it('retains replayable Responses output items before a terminal event', async () => {
534
- const model = new ChatOpenAI({
535
- model: 'gpt-5',
536
- apiKey: 'test-key',
537
- useResponsesApi: true,
538
- });
539
- const responses = (
540
- model as unknown as { responses: StreamingOpenAIResponsesDelegate }
541
- ).responses;
542
- const items = [
543
- {
544
- id: 'local_output_item',
545
- type: 'local_shell_call_output',
546
- status: 'completed',
547
- output: 'local output',
548
- },
549
- {
550
- id: 'shell_output_item',
551
- call_id: 'shell_call_id',
552
- type: 'shell_call_output',
553
- status: 'completed',
554
- max_output_length: 1_000,
555
- output: [
556
- {
557
- stdout: 'shell output',
558
- stderr: '',
559
- outcome: { type: 'exit', exit_code: 0 },
560
- },
561
- ],
562
- },
563
- {
564
- id: 'patch_output_item',
565
- call_id: 'patch_call_id',
566
- type: 'apply_patch_call_output',
567
- status: 'completed',
568
- output: 'patch output',
569
- },
570
- {
571
- id: 'program_output_item',
572
- call_id: 'program_call_id',
573
- type: 'program_output',
574
- status: 'completed',
575
- result: 'program output',
576
- },
577
- ] as const;
578
- responses.completionWithRetry = async () =>
579
- (async function* () {
580
- for (let i = 0; i < items.length; i++) {
581
- yield {
582
- type: 'response.output_item.done',
583
- sequence_number: i,
584
- output_index: i,
585
- item: items[i],
586
- } as unknown as OpenAIClient.Responses.ResponseStreamEvent;
587
- }
588
- yield {
589
- type: 'response.output_item.added',
590
- sequence_number: items.length,
591
- output_index: items.length,
592
- item: {
593
- id: 'msg_partial',
594
- type: 'message',
595
- role: 'assistant',
596
- status: 'in_progress',
597
- content: [],
598
- },
599
- } as OpenAIClient.Responses.ResponseStreamEvent;
600
- yield {
601
- type: 'response.output_text.delta',
602
- sequence_number: items.length + 1,
603
- output_index: items.length,
604
- content_index: 0,
605
- item_id: 'msg_partial',
606
- delta: 'Partial ',
607
- logprobs: [],
608
- } as OpenAIClient.Responses.ResponseStreamEvent;
609
- yield {
610
- type: 'response.output_text.delta',
611
- sequence_number: items.length + 2,
612
- output_index: items.length,
613
- content_index: 0,
614
- item_id: 'msg_partial',
615
- delta: 'answer.',
616
- logprobs: [],
617
- } as OpenAIClient.Responses.ResponseStreamEvent;
618
- })();
619
-
620
- const chunks: AIMessageChunk[] = [];
621
- const stream = await model.stream([new HumanMessage('run tools')]);
622
- for await (const chunk of stream) {
623
- chunks.push(chunk as AIMessageChunk);
624
- }
625
- const combined = chunks.reduce<AIMessageChunk | undefined>(
626
- (current, chunk) =>
627
- current == null ? chunk : (current.concat(chunk) as AIMessageChunk),
628
- undefined
629
- );
630
-
631
- expect(chunks).toHaveLength(items.length + 3);
632
- expect(combined?.text).toBe('Partial answer.');
633
- expect(combined?.additional_kwargs.tool_outputs).toEqual(items);
634
- expect(
635
- combined?.additional_kwargs[OPENAI_RESPONSES_REPLAY_POSITIONS_KEY]
636
- ).toEqual([
637
- ...items.map((item, outputIndex) => ({
638
- itemId: item.id,
639
- kind: 'output',
640
- outputIndex,
641
- })),
642
- {
643
- itemId: 'msg_partial',
644
- kind: 'message',
645
- outputIndex: items.length,
646
- },
647
- {
648
- contentIndex: 0,
649
- itemId: 'msg_partial',
650
- kind: 'text',
651
- outputIndex: items.length,
652
- },
653
- ]);
654
- });
655
-
656
- it('rehydrates one-chunk Responses replay ordering from constructor kwargs', async () => {
657
- const model = new ChatOpenAI({
658
- model: 'gpt-5',
659
- apiKey: 'test-key',
660
- useResponsesApi: true,
661
- });
662
- const responses = (
663
- model as unknown as { responses: StreamingOpenAIResponsesDelegate }
664
- ).responses;
665
- responses.completionWithRetry = async () =>
666
- (async function* () {
667
- yield {
668
- type: 'response.output_text.delta',
669
- sequence_number: 0,
670
- output_index: 3,
671
- content_index: 2,
672
- item_id: 'msg_one_chunk',
673
- delta: 'Partial answer.',
674
- logprobs: [],
675
- } as OpenAIClient.Responses.ResponseStreamEvent;
676
- })();
677
-
678
- const stream = await model.stream([new HumanMessage('answer')]);
679
- const result = await stream.next();
680
- expect(result.done).toBe(false);
681
- const chunk = result.value as AIMessageChunk;
682
- const serializedFields = JSON.parse(
683
- JSON.stringify(chunk.lc_kwargs)
684
- ) as ConstructorParameters<typeof AIMessageChunk>[0];
685
- const rehydrated = new AIMessageChunk(serializedFields);
686
-
687
- expect(chunk.content).toEqual([
688
- { type: 'text', text: 'Partial answer.', index: 0 },
689
- ]);
690
- expect(rehydrated.content).toEqual([
691
- { type: 'text', text: 'Partial answer.', index: 0 },
692
- ]);
693
- expect(
694
- rehydrated.additional_kwargs[OPENAI_RESPONSES_REPLAY_POSITIONS_KEY]
695
- ).toEqual([
696
- {
697
- contentIndex: 2,
698
- itemId: 'msg_one_chunk',
699
- kind: 'text',
700
- outputIndex: 3,
701
- },
702
- ]);
703
- });
704
-
705
- it.each(['response.completed', 'response.incomplete'] as const)(
706
- 'removes provisional replay outputs after %s supplies the authoritative output',
707
- async (terminalType) => {
708
- const model = new ChatOpenAI({
709
- model: 'gpt-5',
710
- apiKey: 'test-key',
711
- useResponsesApi: true,
712
- });
713
- const responses = (
714
- model as unknown as { responses: StreamingOpenAIResponsesDelegate }
715
- ).responses;
716
- const streamedToolOutput = {
717
- id: 'web_search_item',
718
- type: 'web_search_call',
719
- status: 'completed',
720
- } as const;
721
- const provisionalReplayOutput = {
722
- id: 'local_output_item',
723
- type: 'local_shell_call_output',
724
- status: 'completed',
725
- output: 'stale provisional local output',
726
- } as const;
727
- const authoritativeReplayOutput = {
728
- ...provisionalReplayOutput,
729
- output: 'unique authoritative local output',
730
- } as const;
731
- responses.completionWithRetry = async () =>
732
- (async function* () {
733
- yield {
734
- type: 'response.output_item.done',
735
- sequence_number: 0,
736
- output_index: 0,
737
- item: streamedToolOutput,
738
- } as unknown as OpenAIClient.Responses.ResponseStreamEvent;
739
- yield {
740
- type: 'response.output_item.done',
741
- sequence_number: 1,
742
- output_index: 1,
743
- item: provisionalReplayOutput,
744
- } as unknown as OpenAIClient.Responses.ResponseStreamEvent;
745
- yield {
746
- type: terminalType,
747
- sequence_number: 2,
748
- response: {
749
- id: 'resp_terminal',
750
- model: 'gpt-5',
751
- output: [streamedToolOutput, authoritativeReplayOutput],
752
- status:
753
- terminalType === 'response.completed'
754
- ? 'completed'
755
- : 'incomplete',
756
- usage: null,
757
- },
758
- } as unknown as OpenAIClient.Responses.ResponseStreamEvent;
759
- })();
760
-
761
- let tracedResult: unknown;
762
- const chunks: AIMessageChunk[] = [];
763
- const stream = await model.stream([new HumanMessage('run tools')], {
764
- callbacks: [
765
- {
766
- handleLLMEnd(result: unknown): void {
767
- tracedResult = result;
768
- },
769
- },
770
- ],
771
- });
772
- for await (const chunk of stream) {
773
- chunks.push(chunk as AIMessageChunk);
774
- }
775
- const combined = chunks.reduce<AIMessageChunk | undefined>(
776
- (current, chunk) =>
777
- current == null ? chunk : (current.concat(chunk) as AIMessageChunk),
778
- undefined
779
- );
780
-
781
- expect(combined?.additional_kwargs.tool_outputs).toEqual([
782
- streamedToolOutput,
783
- ]);
784
- expect(combined?.response_metadata.output).toEqual([
785
- streamedToolOutput,
786
- authoritativeReplayOutput,
787
- ]);
788
- expect(combined?.toJSON()).toEqual(
789
- expect.objectContaining({
790
- id: ['langchain_core', 'messages', 'AIMessageChunk'],
791
- })
792
- );
793
- expect(
794
- JSON.stringify(combined).match(/unique authoritative local output/g)
795
- ).toHaveLength(1);
796
- expect(JSON.stringify(combined)).not.toContain(
797
- 'stale provisional local output'
798
- );
799
- expect(JSON.stringify(combined?.lc_kwargs)).not.toContain(
800
- 'stale provisional local output'
801
- );
802
- expect(combined?.lc_kwargs.additional_kwargs).toEqual(
803
- expect.objectContaining({ tool_outputs: [streamedToolOutput] })
804
- );
805
- expect(combined?.additional_kwargs).not.toHaveProperty(
806
- OPENAI_RESPONSES_REPLAY_POSITIONS_KEY
807
- );
808
- expect(combined?.lc_kwargs.additional_kwargs).not.toHaveProperty(
809
- OPENAI_RESPONSES_REPLAY_POSITIONS_KEY
810
- );
811
- expect(
812
- JSON.stringify(tracedResult).match(/unique authoritative local output/g)
813
- ).toHaveLength(1);
814
- expect(JSON.stringify(tracedResult)).not.toContain(
815
- 'stale provisional local output'
816
- );
817
- expect(JSON.stringify(tracedResult)).not.toContain(
818
- OPENAI_RESPONSES_REPLAY_POSITIONS_KEY
819
- );
820
- }
821
- );
822
-
823
- it('removes replay positions on a text-only terminal response', async () => {
824
- const model = new ChatOpenAI({
825
- model: 'gpt-5',
826
- apiKey: 'test-key',
827
- useResponsesApi: true,
828
- });
829
- const responses = (
830
- model as unknown as { responses: StreamingOpenAIResponsesDelegate }
831
- ).responses;
832
- const messageItem = {
833
- id: 'msg_terminal',
834
- type: 'message',
835
- role: 'assistant',
836
- status: 'completed',
837
- content: [
838
- {
839
- type: 'output_text',
840
- text: 'Complete answer.',
841
- annotations: [],
842
- logprobs: [],
843
- },
844
- ],
845
- } as const;
846
- responses.completionWithRetry = async () =>
847
- (async function* () {
848
- yield {
849
- type: 'response.output_text.delta',
850
- sequence_number: 0,
851
- output_index: 0,
852
- content_index: 0,
853
- item_id: messageItem.id,
854
- delta: messageItem.content[0].text,
855
- logprobs: [],
856
- } as OpenAIClient.Responses.ResponseStreamEvent;
857
- yield {
858
- type: 'response.completed',
859
- sequence_number: 1,
860
- response: {
861
- id: 'resp_text_terminal',
862
- model: 'gpt-5',
863
- output: [messageItem],
864
- status: 'completed',
865
- usage: null,
866
- },
867
- } as unknown as OpenAIClient.Responses.ResponseStreamEvent;
868
- })();
869
-
870
- let combined: AIMessageChunk | undefined;
871
- const stream = await model.stream([new HumanMessage('answer')]);
872
- for await (const chunk of stream) {
873
- combined =
874
- combined == null
875
- ? (chunk as AIMessageChunk)
876
- : (combined.concat(chunk as AIMessageChunk) as AIMessageChunk);
877
- }
878
-
879
- expect(combined?.text).toBe('Complete answer.');
880
- expect(combined?.response_metadata.output).toEqual([messageItem]);
881
- expect(combined?.additional_kwargs).not.toHaveProperty(
882
- OPENAI_RESPONSES_REPLAY_POSITIONS_KEY
883
- );
884
- expect(combined?.lc_kwargs.additional_kwargs).not.toHaveProperty(
885
- OPENAI_RESPONSES_REPLAY_POSITIONS_KEY
886
- );
887
- });
888
-
889
- it('keeps a raw server result between distinct Responses output messages', async () => {
890
- const model = new ChatOpenAI({
891
- model: 'gpt-5',
892
- apiKey: 'test-key',
893
- useResponsesApi: true,
894
- });
895
- const responses = (
896
- model as unknown as { responses: StreamingOpenAIResponsesDelegate }
897
- ).responses;
898
- responses.completionWithRetry = async () =>
899
- (async function* () {
900
- yield {
901
- type: 'response.output_text.delta',
902
- sequence_number: 0,
903
- output_index: 0,
904
- content_index: 0,
905
- item_id: 'msg_first',
906
- delta: 'First narration.',
907
- logprobs: [],
908
- } as OpenAIClient.Responses.ResponseStreamEvent;
909
- yield {
910
- type: 'response.output_item.done',
911
- sequence_number: 1,
912
- output_index: 1,
913
- item: {
914
- id: 'local_output_item',
915
- type: 'local_shell_call_output',
916
- status: 'completed',
917
- output: 'middle server result',
918
- },
919
- } as OpenAIClient.Responses.ResponseStreamEvent;
920
- yield {
921
- type: 'response.output_text.delta',
922
- sequence_number: 2,
923
- output_index: 2,
924
- content_index: 0,
925
- item_id: 'msg_second',
926
- delta: 'Second narration.',
927
- logprobs: [],
928
- } as OpenAIClient.Responses.ResponseStreamEvent;
929
- })();
930
-
931
- let combined: AIMessageChunk | undefined;
932
- const stream = await model.stream([new HumanMessage('run a server tool')]);
933
- for await (const chunk of stream) {
934
- combined =
935
- combined == null
936
- ? (chunk as AIMessageChunk)
937
- : (combined.concat(chunk as AIMessageChunk) as AIMessageChunk);
938
- }
939
- expect(combined).toBeDefined();
940
- combined!.response_metadata.preempted = true;
941
-
942
- const [projected] = projectOpenAIResponsesToolMessageContent([combined!]);
943
- const providerInput = convertMessagesToResponsesInput({
944
- messages: [projected],
945
- model: 'gpt-5',
946
- zdrEnabled: false,
947
- });
948
- const serialized = JSON.stringify(providerInput);
949
- const firstIndex = serialized.indexOf('First narration.');
950
- const resultIndex = serialized.indexOf('middle server result');
951
- const secondIndex = serialized.indexOf('Second narration.');
952
-
953
- expect(firstIndex).toBeGreaterThanOrEqual(0);
954
- expect(firstIndex).toBeLessThan(resultIndex);
955
- expect(resultIndex).toBeLessThan(secondIndex);
956
- });
957
-
958
- it('keeps streamed generated images and server results in cross-item order', async () => {
959
- const model = new ChatOpenAI({
960
- model: 'gpt-5',
961
- apiKey: 'test-key',
962
- useResponsesApi: true,
963
- });
964
- const responses = (
965
- model as unknown as { responses: StreamingOpenAIResponsesDelegate }
966
- ).responses;
967
- responses.completionWithRetry = async () =>
968
- (async function* () {
969
- yield {
970
- type: 'response.output_text.delta',
971
- sequence_number: 0,
972
- output_index: 0,
973
- content_index: 0,
974
- item_id: 'msg_first',
975
- delta: 'First narration.',
976
- logprobs: [],
977
- } as OpenAIClient.Responses.ResponseStreamEvent;
978
- yield {
979
- type: 'response.output_item.done',
980
- sequence_number: 1,
981
- output_index: 1,
982
- item: {
983
- id: 'ig_middle',
984
- type: 'image_generation_call',
985
- status: 'completed',
986
- result: 'AA==',
987
- },
988
- } as OpenAIClient.Responses.ResponseStreamEvent;
989
- yield {
990
- type: 'response.output_item.done',
991
- sequence_number: 2,
992
- output_index: 2,
993
- item: {
994
- id: 'local_middle',
995
- type: 'local_shell_call_output',
996
- status: 'completed',
997
- output: 'middle server result',
998
- },
999
- } as OpenAIClient.Responses.ResponseStreamEvent;
1000
- yield {
1001
- type: 'response.output_item.added',
1002
- sequence_number: 3,
1003
- output_index: 3,
1004
- item: {
1005
- id: 'rs_middle',
1006
- type: 'reasoning',
1007
- status: 'in_progress',
1008
- summary: [],
1009
- },
1010
- } as OpenAIClient.Responses.ResponseStreamEvent;
1011
- yield {
1012
- type: 'response.output_item.done',
1013
- sequence_number: 4,
1014
- output_index: 3,
1015
- item: {
1016
- id: 'rs_middle',
1017
- type: 'reasoning',
1018
- status: 'incomplete',
1019
- summary: [],
1020
- encrypted_content: 'opaque-middle-reasoning',
1021
- },
1022
- } as OpenAIClient.Responses.ResponseStreamEvent;
1023
- yield {
1024
- type: 'response.output_text.delta',
1025
- sequence_number: 5,
1026
- output_index: 4,
1027
- content_index: 0,
1028
- item_id: 'msg_second',
1029
- delta: 'Second narration.',
1030
- logprobs: [],
1031
- } as OpenAIClient.Responses.ResponseStreamEvent;
1032
- })();
1033
-
1034
- let combined: AIMessageChunk | undefined;
1035
- const stream = await model.stream([new HumanMessage('generate and run')]);
1036
- for await (const chunk of stream) {
1037
- combined =
1038
- combined == null
1039
- ? (chunk as AIMessageChunk)
1040
- : (combined.concat(chunk as AIMessageChunk) as AIMessageChunk);
1041
- }
1042
- expect(combined).toBeDefined();
1043
- expect(combined!.additional_kwargs.reasoning).toEqual({
1044
- id: 'rs_middle',
1045
- type: 'reasoning',
1046
- status: 'incomplete',
1047
- summary: [],
1048
- encrypted_content: 'opaque-middle-reasoning',
1049
- });
1050
- expect(
1051
- combined!.additional_kwargs[OPENAI_RESPONSES_REPLAY_POSITIONS_KEY]
1052
- ).toEqual([
1053
- {
1054
- contentIndex: 0,
1055
- itemId: 'msg_first',
1056
- kind: 'text',
1057
- outputIndex: 0,
1058
- },
1059
- { itemId: 'ig_middle', kind: 'output', outputIndex: 1 },
1060
- { itemId: 'local_middle', kind: 'output', outputIndex: 2 },
1061
- { itemId: 'rs_middle', kind: 'reasoning', outputIndex: 3 },
1062
- {
1063
- contentIndex: 0,
1064
- itemId: 'msg_second',
1065
- kind: 'text',
1066
- outputIndex: 4,
1067
- },
1068
- ]);
1069
- combined!.response_metadata.preempted = true;
1070
-
1071
- const [projected] = projectOpenAIResponsesToolMessageContent([combined!]);
1072
- const providerInput = convertMessagesToResponsesInput({
1073
- messages: [projected],
1074
- model: 'gpt-5',
1075
- zdrEnabled: false,
1076
- });
1077
- const serialized = JSON.stringify(providerInput);
1078
- const firstIndex = serialized.indexOf('First narration.');
1079
- const imageIndex = serialized.indexOf('data:image/png;base64,AA==');
1080
- const resultIndex = serialized.indexOf('middle server result');
1081
- const reasoningIndex = serialized.indexOf('opaque-middle-reasoning');
1082
- const secondIndex = serialized.indexOf('Second narration.');
1083
-
1084
- expect(firstIndex).toBeGreaterThanOrEqual(0);
1085
- expect(firstIndex).toBeLessThan(imageIndex);
1086
- expect(imageIndex).toBeLessThan(resultIndex);
1087
- expect(resultIndex).toBeLessThan(reasoningIndex);
1088
- expect(reasoningIndex).toBeLessThan(secondIndex);
1089
- expect(serialized).not.toContain('ig_middle');
1090
- expect(serialized).not.toContain('local_middle');
1091
- expect(projected.additional_kwargs).not.toHaveProperty(
1092
- OPENAI_RESPONSES_REPLAY_POSITIONS_KEY
1093
- );
1094
- });
1095
-
1096
- it('keeps Azure client customization and gates reasoning to reasoning models', () => {
1097
- const model = new AzureChatOpenAI({
1098
- ...baseAzureFields,
1099
- _lc_stream_delay: 4,
1100
- }) as AzureReasoningModel;
1101
- model.model = 'gpt-5';
1102
- model.reasoning = { effort: 'low' };
1103
-
1104
- const requestOptions = model._getClientOptions({
1105
- headers: { 'x-smoke': 'azure' },
1106
- });
1107
-
1108
- expect(AzureChatOpenAI.lc_name()).toBe('LibreChatAzureOpenAI');
1109
- expect(model._lc_stream_delay).toBe(4);
1110
- expect(model.exposedClient).toBeInstanceOf(CustomAzureOpenAIClient);
1111
- const azureResponses = (
1112
- model as unknown as { responses: OpenAIResponsesDelegate }
1113
- ).responses;
1114
- azureResponses._getClientOptions(undefined);
1115
- expect(azureResponses.client).toBeInstanceOf(CustomAzureOpenAIClient);
1116
- const azureResponsesClient =
1117
- azureResponses.client as CustomAzureOpenAIClient;
1118
- azureResponsesClient.abortHandler = (): void => undefined;
1119
- expect(model.exposedClient).toBe(azureResponsesClient);
1120
- expect(requestOptions.headers).toEqual(
1121
- expect.objectContaining({
1122
- 'api-key': 'test-azure-key',
1123
- 'x-smoke': 'azure',
1124
- })
1125
- );
1126
- expect(requestOptions.query).toEqual(
1127
- expect.objectContaining({ 'api-version': '2024-10-21' })
1128
- );
1129
- expect(model.getReasoningParams()).toEqual({ effort: 'low' });
1130
-
1131
- const nonReasoningModel = new AzureChatOpenAI({
1132
- ...baseAzureFields,
1133
- }) as AzureReasoningModel;
1134
- nonReasoningModel.model = 'gpt-4o';
1135
- nonReasoningModel.reasoning = { effort: 'low' };
1136
- expect(nonReasoningModel.getReasoningParams()).toBeUndefined();
1137
- });
1138
-
1139
- it('sanitizes persisted preempted history on direct Azure Responses streams', async () => {
1140
- const model = new AzureChatOpenAI({
1141
- ...baseAzureFields,
1142
- });
1143
- model.model = 'gpt-5';
1144
- const responses = (
1145
- model as unknown as { responses: MockableResponsesDelegate }
1146
- ).responses;
1147
- const requests: unknown[] = [];
1148
- responses.completionWithRetry = async (request) => {
1149
- requests.push(request);
1150
- return (async function* () {})();
1151
- };
1152
- const message = createPersistedPreemptedAzureMessage();
1153
- const originalSerialized = JSON.stringify(message.toJSON());
1154
-
1155
- for await (const _chunk of responses._streamResponseChunks([message], {})) {
1156
- // The empty mock stream intentionally yields no chunks.
1157
- }
1158
- for await (const _event of responses._streamChatModelEvents(
1159
- [message],
1160
- {}
1161
- )) {
1162
- // The empty mock stream intentionally yields no events.
1163
- }
1164
-
1165
- expect(requests).toHaveLength(2);
1166
- for (const request of requests) {
1167
- expectNeutralizedAzureResponsesRequest(request);
1168
- }
1169
- expect(JSON.stringify(message.toJSON())).toBe(originalSerialized);
1170
- });
1171
-
1172
- it('sanitizes persisted preempted history on direct Azure Responses generation', async () => {
1173
- const model = new AzureChatOpenAI({
1174
- ...baseAzureFields,
1175
- });
1176
- model.model = 'gpt-5';
1177
- const responses = (
1178
- model as unknown as { responses: MockableResponsesDelegate }
1179
- ).responses;
1180
- let request: unknown;
1181
- responses.completionWithRetry = async (nextRequest) => {
1182
- request = nextRequest;
1183
- return createCompletedAzureResponse();
1184
- };
1185
- const message = createPersistedPreemptedAzureMessage();
1186
- const originalSerialized = JSON.stringify(message.toJSON());
1187
-
1188
- await responses._generate([message], {});
1189
-
1190
- expectNeutralizedAzureResponsesRequest(request);
1191
- expect(JSON.stringify(message.toJSON())).toBe(originalSerialized);
1192
- });
1193
-
1194
- it('keeps DeepSeek, Moonshot, and xAI on LibreChat wrapper semantics', () => {
1195
- const deepSeek = new ChatDeepSeek({
1196
- model: 'deepseek-chat',
1197
- apiKey: 'test-key',
1198
- _lc_stream_delay: 5,
1199
- });
1200
- deepSeek._getClientOptions();
1201
-
1202
- const moonshot = new ChatMoonshot({
1203
- model: 'moonshot-v1-8k',
1204
- apiKey: 'test-key',
1205
- _lc_stream_delay: 6,
1206
- });
1207
-
1208
- const xai = new ChatXAI({
1209
- model: 'grok-3-fast',
1210
- apiKey: 'test-key',
1211
- configuration: { baseURL: 'https://xai.test/v1' },
1212
- _lc_stream_delay: 7,
1213
- });
1214
- const xaiRequestOptions =
1215
- xai._getClientOptions() as OpenAIRequestOptionsWithBaseURL;
1216
-
1217
- expect(ChatDeepSeek.lc_name()).toBe('LibreChatDeepSeek');
1218
- expect(deepSeek._lc_stream_delay).toBe(5);
1219
- expect(deepSeek.exposedClient).toBeInstanceOf(CustomOpenAIClient);
1220
- expect(ChatMoonshot.lc_name()).toBe('LibreChatMoonshot');
1221
- expect(moonshot._lc_stream_delay).toBe(6);
1222
- expect(ChatXAI.lc_name()).toBe('LibreChatXAI');
1223
- expect(xai._lc_stream_delay).toBe(7);
1224
- expect(xai.exposedClient).toBeInstanceOf(CustomOpenAIClient);
1225
- expect(xaiRequestOptions.baseURL).toBe('https://xai.test/v1');
1226
- });
1227
-
1228
- it('skips custom OpenAI-compatible SSE events during OpenAI streaming', async () => {
1229
- await expectCustomSSEEventsSkipped(
1230
- new ChatOpenAI({
1231
- model: 'hermes-agent',
1232
- apiKey: 'test-key',
1233
- streaming: true,
1234
- })
1235
- );
1236
- });
1237
-
1238
- it('preserves OpenAI-compatible reasoning deltas during OpenAI streaming', async () => {
1239
- const model = new ChatOpenAI({
1240
- model: 'openai/gpt-oss-120b',
1241
- apiKey: 'test-key',
1242
- streaming: true,
1243
- });
1244
- const completions = (model as unknown as StreamingCompletionBackedModel)
1245
- .completions;
1246
- const createChunk = (
1247
- choice: OpenAICompatibleReasoningStreamChoice
1248
- ): OpenAIClient.Chat.Completions.ChatCompletionChunk => ({
1249
- id: 'chatcmpl-openai-compatible-reasoning',
1250
- object: 'chat.completion.chunk',
1251
- created: 0,
1252
- model: 'openai/gpt-oss-120b',
1253
- choices: [choice],
1254
- });
1255
-
1256
- async function* streamChunks(): AsyncGenerator<OpenAIClient.Chat.Completions.ChatCompletionChunk> {
1257
- yield createChunk({
1258
- index: 0,
1259
- delta: {
1260
- role: 'assistant',
1261
- content: '',
1262
- },
1263
- finish_reason: null,
1264
- });
1265
- yield createChunk({
1266
- index: 0,
1267
- delta: {
1268
- reasoning: 'Think ',
1269
- reasoning_details: [
1270
- {
1271
- type: 'reasoning.text',
1272
- text: 'Think ',
1273
- format: 'text',
1274
- index: 0,
1275
- },
1276
- ],
1277
- },
1278
- finish_reason: null,
1279
- });
1280
- yield createChunk({
1281
- index: 0,
1282
- delta: {
1283
- reasoning: 'hard',
1284
- reasoning_details: [
1285
- {
1286
- type: 'reasoning.text',
1287
- text: 'hard',
1288
- format: 'text',
1289
- index: 0,
1290
- },
1291
- ],
1292
- },
1293
- finish_reason: null,
1294
- });
1295
- yield createChunk({
1296
- index: 0,
1297
- delta: { content: 'answer' },
1298
- finish_reason: 'stop',
1299
- });
1300
- }
1301
-
1302
- completions.completionWithRetry = async (): Promise<
1303
- AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>
1304
- > => streamChunks();
1305
-
1306
- const chunks: AIMessageChunk[] = [];
1307
- const stream = await model.stream([new HumanMessage('think')]);
1308
- for await (const chunk of stream) {
1309
- chunks.push(chunk);
1310
- }
1311
-
1312
- expect(
1313
- chunks
1314
- .map((chunk) => chunk.additional_kwargs.reasoning_content)
1315
- .filter((reasoningContent) => reasoningContent != null)
1316
- ).toEqual(['Think ', 'hard']);
1317
- expect(chunks[1].additional_kwargs.reasoning_details).toEqual([
1318
- {
1319
- type: 'reasoning.text',
1320
- text: 'Think ',
1321
- format: 'text',
1322
- index: 0,
1323
- },
1324
- ]);
1325
- expect(chunks[2].additional_kwargs.reasoning_details).toEqual([
1326
- {
1327
- type: 'reasoning.text',
1328
- text: 'hard',
1329
- format: 'text',
1330
- index: 0,
1331
- },
1332
- ]);
1333
- expect(chunks.at(-1)?.content).toBe('answer');
1334
- });
1335
-
1336
- it('skips custom OpenAI-compatible SSE events during Azure streaming', async () => {
1337
- await expectCustomSSEEventsSkipped(
1338
- new AzureChatOpenAI({
1339
- ...baseAzureFields,
1340
- })
1341
- );
1342
- });
1343
-
1344
- it('passes non-streaming OpenAI completions through unchanged', async () => {
1345
- const model = new ChatOpenAI({
1346
- model: 'hermes-agent',
1347
- apiKey: 'test-key',
1348
- });
1349
- const createMock = mockCompletion(model, {
1350
- id: 'chatcmpl-nonstream-test',
1351
- object: 'chat.completion',
1352
- created: 0,
1353
- model: 'hermes-agent',
1354
- choices: [
1355
- {
1356
- index: 0,
1357
- finish_reason: 'stop',
1358
- logprobs: null,
1359
- message: {
1360
- role: 'assistant',
1361
- content: 'plain response',
1362
- refusal: null,
1363
- },
1364
- },
1365
- ],
1366
- });
1367
-
1368
- const response = await model.invoke([new HumanMessage('no stream')]);
1369
-
1370
- expect(response.content).toBe('plain response');
1371
- expect(createMock).toHaveBeenCalledWith(
1372
- expect.objectContaining({ stream: false }),
1373
- expect.any(Object)
1374
- );
1375
- });
1376
-
1377
- it('keeps Moonshot reasoning content in completion requests', async () => {
1378
- const moonshot = new ChatMoonshot({
1379
- model: 'moonshot-v1-8k',
1380
- apiKey: 'test-key',
1381
- streaming: false,
1382
- });
1383
- const completions = (moonshot as unknown as CompletionBackedModel)
1384
- .completions;
1385
- let requestMessages: unknown;
1386
-
1387
- completions.completionWithRetry = async (request): Promise<unknown> => {
1388
- requestMessages = request.messages;
1389
- return {
1390
- id: 'chatcmpl-test',
1391
- object: 'chat.completion',
1392
- created: 0,
1393
- model: 'moonshot-v1-8k',
1394
- choices: [
1395
- {
1396
- index: 0,
1397
- finish_reason: 'stop',
1398
- message: {
1399
- role: 'assistant',
1400
- content: 'ok',
1401
- },
1402
- },
1403
- ],
1404
- };
1405
- };
1406
-
1407
- await moonshot.invoke([
1408
- new AIMessage({
1409
- content: '',
1410
- additional_kwargs: { reasoning_content: 'kept-thinking' },
1411
- tool_calls: [
1412
- {
1413
- id: 'call_1',
1414
- name: 'lookup',
1415
- args: { q: 'test' },
1416
- type: 'tool_call',
1417
- },
1418
- ],
1419
- }),
1420
- ]);
1421
-
1422
- expect(requestMessages).toEqual([
1423
- expect.objectContaining({
1424
- role: 'assistant',
1425
- content: '',
1426
- reasoning_content: 'kept-thinking',
1427
- tool_calls: expect.any(Array),
1428
- }),
1429
- ]);
1430
- });
1431
-
1432
- it('keeps OpenRouter reasoning isolated from OpenAI reasoning_effort', () => {
1433
- const fields: OpenRouterFields = {
1434
- model: 'openrouter/test-model',
1435
- apiKey: 'test-key',
1436
- reasoning: { effort: 'xhigh', max_tokens: 2048 },
1437
- };
1438
- const model = new ChatOpenRouter(fields);
1439
-
1440
- const params = model.invocationParams();
1441
-
1442
- expect(ChatOpenRouter.lc_name()).toBe('LibreChatOpenRouter');
1443
- expect(params.reasoning).toEqual({ effort: 'xhigh', max_tokens: 2048 });
1444
- expect(params.reasoning_effort).toBeUndefined();
1445
-
1446
- const callParams = model.invocationParams({
1447
- reasoning: { effort: 'low', exclude: true },
1448
- } as ChatOpenRouterCallOptions);
1449
- expect(callParams.reasoning).toEqual({
1450
- effort: 'low',
1451
- max_tokens: 2048,
1452
- exclude: true,
1453
- });
1454
-
1455
- const legacyModel = new ChatOpenRouter({
1456
- model: 'openrouter/test-model',
1457
- apiKey: 'test-key',
1458
- include_reasoning: true,
1459
- });
1460
- expect(legacyModel.invocationParams().reasoning).toEqual({
1461
- enabled: true,
1462
- });
1463
- });
1464
-
1465
- it('keeps OpenRouter streaming reasoning details stable', async () => {
1466
- const model = new ChatOpenRouter({
1467
- model: 'anthropic/claude-sonnet-test',
1468
- apiKey: 'test-key',
1469
- });
1470
- const completions = (model as unknown as StreamingCompletionBackedModel)
1471
- .completions;
1472
- let requestMessages: unknown;
1473
- const createChunk = (
1474
- choice: OpenRouterReasoningStreamChoice
1475
- ): OpenAIClient.Chat.Completions.ChatCompletionChunk => ({
1476
- id: 'chatcmpl-openrouter-test',
1477
- object: 'chat.completion.chunk',
1478
- created: 0,
1479
- model: 'anthropic/claude-sonnet-test',
1480
- choices: [choice],
1481
- });
1482
-
1483
- async function* streamChunks(): AsyncGenerator<OpenAIClient.Chat.Completions.ChatCompletionChunk> {
1484
- yield createChunk({
1485
- index: 0,
1486
- delta: {
1487
- role: 'assistant',
1488
- content: '',
1489
- reasoning_details: [
1490
- {
1491
- type: 'reasoning.text',
1492
- text: 'Think ',
1493
- format: 'text',
1494
- index: 0,
1495
- },
1496
- ],
1497
- },
1498
- finish_reason: null,
1499
- });
1500
- yield createChunk({
1501
- index: 0,
1502
- delta: {
1503
- content: 'answer',
1504
- reasoning_details: [
1505
- { type: 'reasoning.text', text: 'hard', index: 0 },
1506
- {
1507
- type: 'reasoning.encrypted',
1508
- id: 'sig_1',
1509
- data: 'encrypted',
1510
- format: 'anthropic',
1511
- index: 1,
1512
- },
1513
- ],
1514
- },
1515
- finish_reason: null,
1516
- });
1517
- yield createChunk({
1518
- index: 0,
1519
- delta: { content: '' },
1520
- finish_reason: 'stop',
1521
- });
1522
- }
1523
-
1524
- completions.completionWithRetry = async (
1525
- request
1526
- ): Promise<
1527
- AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>
1528
- > => {
1529
- requestMessages = request.messages;
1530
- return streamChunks();
1531
- };
1532
-
1533
- const chunks: AIMessageChunk[] = [];
1534
- const stream = await model.stream([
1535
- new AIMessage({
1536
- content: '',
1537
- additional_kwargs: {
1538
- reasoning_details: [
1539
- {
1540
- type: 'reasoning.text',
1541
- text: 'previous thought',
1542
- index: 0,
1543
- },
1544
- {
1545
- type: 'reasoning.encrypted',
1546
- id: 'prev_sig',
1547
- data: 'previous encrypted',
1548
- index: 1,
1549
- },
1550
- ],
1551
- },
1552
- tool_calls: [
1553
- {
1554
- id: 'call_1',
1555
- name: 'lookup',
1556
- args: { q: 'test' },
1557
- type: 'tool_call',
1558
- },
1559
- ],
1560
- }),
1561
- ]);
1562
- for await (const chunk of stream) {
1563
- chunks.push(chunk);
1564
- }
1565
-
1566
- expect(requestMessages).toEqual([
1567
- expect.objectContaining({
1568
- role: 'assistant',
1569
- tool_calls: expect.any(Array),
1570
- content: [
1571
- expect.objectContaining({
1572
- type: 'thinking',
1573
- thinking: 'previous thought',
1574
- }),
1575
- expect.objectContaining({
1576
- type: 'redacted_thinking',
1577
- data: 'previous encrypted',
1578
- id: 'prev_sig',
1579
- }),
1580
- ],
1581
- }),
1582
- ]);
1583
- expect(chunks).toHaveLength(3);
1584
- expect(chunks[0].additional_kwargs.reasoning).toBe('Think ');
1585
- expect(chunks[0].additional_kwargs.reasoning_details).toBeUndefined();
1586
- expect(chunks[1].additional_kwargs.reasoning).toBe('hard');
1587
- expect(chunks[1].additional_kwargs.reasoning_details).toBeUndefined();
1588
- expect(chunks[2].additional_kwargs.reasoning_details).toEqual([
1589
- {
1590
- type: 'reasoning.text',
1591
- text: 'Think hard',
1592
- format: 'text',
1593
- index: 0,
1594
- },
1595
- {
1596
- type: 'reasoning.encrypted',
1597
- id: 'sig_1',
1598
- data: 'encrypted',
1599
- format: 'anthropic',
1600
- index: 1,
1601
- },
1602
- ]);
1603
- });
1604
-
1605
- it('maps OpenRouter cache write usage to cache_creation in streaming responses', async () => {
1606
- const model = new ChatOpenRouter({
1607
- model: 'anthropic/claude-sonnet-test',
1608
- apiKey: 'test-key',
1609
- streamUsage: true,
1610
- });
1611
- const completions = (model as unknown as StreamingCompletionBackedModel)
1612
- .completions;
1613
- const usage: CompletionUsageWithCacheWrite = {
1614
- prompt_tokens: 11,
1615
- completion_tokens: 7,
1616
- total_tokens: 18,
1617
- prompt_tokens_details: {
1618
- audio_tokens: 2,
1619
- cached_tokens: 3,
1620
- cache_write_tokens: 5,
1621
- },
1622
- completion_tokens_details: {
1623
- audio_tokens: 4,
1624
- reasoning_tokens: 6,
1625
- },
1626
- };
1627
-
1628
- async function* streamChunks(): AsyncGenerator<OpenAIClient.Chat.Completions.ChatCompletionChunk> {
1629
- yield createOpenAIStreamChunk('answer', 'stop');
1630
- yield {
1631
- id: 'chatcmpl-openrouter-usage',
1632
- object: 'chat.completion.chunk',
1633
- created: 0,
1634
- model: 'anthropic/claude-sonnet-test',
1635
- choices: [],
1636
- usage,
1637
- } as OpenAIClient.Chat.Completions.ChatCompletionChunk;
1638
- }
1639
-
1640
- completions.completionWithRetry = async (): Promise<
1641
- AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>
1642
- > => streamChunks();
1643
-
1644
- const chunks: AIMessageChunk[] = [];
1645
- const stream = await model.stream([new HumanMessage('hi')]);
1646
- for await (const chunk of stream) {
1647
- chunks.push(chunk);
1648
- }
1649
-
1650
- const usageChunk = chunks.find(
1651
- (chunk) => chunk.usage_metadata?.input_token_details?.cache_creation === 5
1652
- );
1653
- expect(usageChunk?.usage_metadata).toEqual({
1654
- input_tokens: 11,
1655
- output_tokens: 7,
1656
- total_tokens: 18,
1657
- input_token_details: {
1658
- audio: 2,
1659
- cache_read: 3,
1660
- cache_creation: 5,
1661
- },
1662
- output_token_details: {
1663
- audio: 4,
1664
- reasoning: 6,
1665
- },
1666
- });
1667
- });
1668
-
1669
- it('emits OpenRouter callbacks before an early stream break', async () => {
1670
- const model = new CallbackTestChatOpenRouter({
1671
- model: 'openai/gpt-4o-mini',
1672
- apiKey: 'test-key',
1673
- _lc_stream_delay: 1,
1674
- } as OpenRouterFields & { _lc_stream_delay: number });
1675
- const completions = (model as unknown as StreamingCompletionBackedModel)
1676
- .completions;
1677
- const textChunks: string[] = [];
1678
- const callbackTokens: string[] = [];
1679
-
1680
- async function* streamChunks(): AsyncGenerator<OpenAIClient.Chat.Completions.ChatCompletionChunk> {
1681
- yield createOpenAIStreamChunk('alpha beta gamma');
1682
- }
1683
-
1684
- completions.completionWithRetry = async (): Promise<
1685
- AsyncIterable<OpenAIClient.Chat.Completions.ChatCompletionChunk>
1686
- > => streamChunks();
1687
-
1688
- const runManager = {
1689
- handleLLMNewToken(token: string): void {
1690
- if (token !== '') {
1691
- callbackTokens.push(token);
1692
- }
1693
- },
1694
- } as unknown as CallbackManagerForLLMRun;
1695
-
1696
- for await (const chunk of model.streamChunksWithCallbacks(runManager)) {
1697
- if (chunk.text !== '') {
1698
- textChunks.push(chunk.text);
1699
- }
1700
- break;
1701
- }
1702
-
1703
- expect(textChunks).toEqual(['alpha beta gamma']);
1704
- expect(callbackTokens).toEqual(textChunks);
1705
- });
1706
-
1707
- it('keeps Anthropic output, residency, compaction, and stream-delay options', () => {
1708
- const contextManagement = {
1709
- edits: [
1710
- {
1711
- type: 'compact_20260112' as const,
1712
- trigger: { type: 'input_tokens' as const, value: 50000 },
1713
- },
1714
- ],
1715
- };
1716
- const model = new CustomAnthropic({
1717
- model: 'claude-sonnet-4-5-20250929',
1718
- apiKey: 'test-key',
1719
- maxTokens: 4096,
1720
- outputConfig: { effort: 'medium' },
1721
- inferenceGeo: 'us',
1722
- contextManagement,
1723
- _lc_stream_delay: 8,
1724
- });
1725
- const defaultModel = new CustomAnthropic({
1726
- model: 'claude-sonnet-4-5-20250929',
1727
- apiKey: 'test-key',
1728
- });
1729
-
1730
- const params = model.invocationParams({
1731
- outputConfig: { effort: 'low' },
1732
- inferenceGeo: 'eu',
1733
- } as AnthropicCallOptions);
1734
-
1735
- expect(CustomAnthropic.lc_name()).toBe('LibreChatAnthropic');
1736
- expect(model._lc_stream_delay).toBe(8);
1737
- expect(defaultModel._lc_stream_delay).toBe(25);
1738
- expect(params.output_config).toEqual({ effort: 'low' });
1739
- expect(params.inference_geo).toBe('eu');
1740
- expect(params.context_management).toEqual(contextManagement);
1741
- });
1742
-
1743
- it('keeps Anthropic beta, MCP, and container request wiring current', () => {
1744
- const contextManagement = {
1745
- edits: [
1746
- {
1747
- type: 'compact_20260112' as const,
1748
- trigger: { type: 'input_tokens' as const, value: 50000 },
1749
- },
1750
- ],
1751
- };
1752
- const mcpServers: AnthropicMCPServerURLDefinition[] = [
1753
- {
1754
- type: 'url',
1755
- url: 'https://example.com/mcp',
1756
- name: 'docs',
1757
- },
1758
- ];
1759
- const model = new CustomAnthropic({
1760
- model: 'claude-opus-4-7-test',
1761
- apiKey: 'test-key',
1762
- maxTokens: 4096,
1763
- contextManagement,
1764
- betas: ['model-beta'],
1765
- });
1766
-
1767
- const params = model.invocationParams({
1768
- outputConfig: {
1769
- effort: 'low',
1770
- task_budget: { type: 'token_budget', value: 1024 },
1771
- },
1772
- betas: ['request-beta', 'model-beta'],
1773
- container: 'container_123',
1774
- mcp_servers: mcpServers,
1775
- tools: [
1776
- {
1777
- type: 'tool_search_tool_bm25_20251119',
1778
- name: 'search',
1779
- } as ChatAnthropicToolType,
1780
- ],
1781
- } as AnthropicCallOptions);
1782
-
1783
- expect(params.betas).toEqual([
1784
- 'model-beta',
1785
- 'request-beta',
1786
- 'advanced-tool-use-2025-11-20',
1787
- 'compact-2026-01-12',
1788
- 'task-budgets-2026-03-13',
1789
- ]);
1790
- expect(params.container).toBe('container_123');
1791
- expect(params.mcp_servers).toBe(mcpServers);
1792
- expect(params.temperature).toBeUndefined();
1793
- expect(params.top_k).toBeUndefined();
1794
- expect(params.top_p).toBeUndefined();
1795
- });
1796
-
1797
- it('matches Anthropic Opus 4.7 sampling compatibility checks', () => {
1798
- const thinkingModel = new CustomAnthropic({
1799
- model: 'claude-opus-4-7-test',
1800
- apiKey: 'test-key',
1801
- maxTokens: 4096,
1802
- thinking: { type: 'enabled', budget_tokens: 1024 },
1803
- });
1804
- const topKModel = new CustomAnthropic({
1805
- model: 'claude-opus-4-7-test',
1806
- apiKey: 'test-key',
1807
- maxTokens: 4096,
1808
- topK: 5,
1809
- });
1810
-
1811
- expect(() => thinkingModel.invocationParams()).toThrow(
1812
- 'thinking.type="enabled" is not supported for claude-opus-4-7'
1813
- );
1814
- expect(() => topKModel.invocationParams()).toThrow(
1815
- 'topK is not supported for claude-opus-4-7'
1816
- );
1817
- });
1818
-
1819
- it('keeps Bedrock Converse application profiles and service tier passthroughs', () => {
1820
- const applicationInferenceProfile =
1821
- 'arn:aws:bedrock:eu-west-1:123456789012:application-inference-profile/test-profile';
1822
- const model = new CustomChatBedrockConverse({
1823
- ...baseBedrockFields,
1824
- model: 'anthropic.claude-3-haiku-20240307-v1:0',
1825
- applicationInferenceProfile,
1826
- serviceTier: 'priority',
1827
- _lc_stream_delay: 12,
1828
- });
1829
- const defaultStreamDelayModel = new CustomChatBedrockConverse({
1830
- ...baseBedrockFields,
1831
- model: 'anthropic.claude-3-haiku-20240307-v1:0',
1832
- });
1833
-
1834
- expect(CustomChatBedrockConverse.lc_name()).toBe(
1835
- 'LibreChatBedrockConverse'
1836
- );
1837
- expect(model.applicationInferenceProfile).toBe(applicationInferenceProfile);
1838
- expect(model._lc_stream_delay).toBe(12);
1839
- expect(defaultStreamDelayModel._lc_stream_delay).toBe(25);
1840
- expect(model.invocationParams({}).serviceTier).toEqual({
1841
- type: 'priority',
1842
- });
1843
- expect(model.invocationParams({ serviceTier: 'flex' }).serviceTier).toEqual(
1844
- { type: 'flex' }
1845
- );
1846
- });
1847
-
1848
- it('keeps Google and Vertex thinking configuration wiring offline', () => {
1849
- const thinkingConfig = {
1850
- thinkingLevel: 'HIGH' as const,
1851
- includeThoughts: true,
1852
- };
1853
- const google = new CustomChatGoogleGenerativeAI({
1854
- model: 'models/gemini-3-pro-preview',
1855
- apiKey: 'test-key',
1856
- thinkingConfig,
1857
- });
1858
- const vertex = new ChatVertexAI({
1859
- model: 'gemini-3-pro-preview',
1860
- location: 'global',
1861
- thinkingBudget: -1,
1862
- thinkingConfig,
1863
- });
1864
-
1865
- expect(CustomChatGoogleGenerativeAI.lc_name()).toBe(
1866
- 'LibreChatGoogleGenerativeAI'
1867
- );
1868
- expect(google.model).toBe('gemini-3-pro-preview');
1869
- expect(google._isMultimodalModel).toBe(true);
1870
- expect(google.thinkingConfig).toEqual(thinkingConfig);
1871
- expect(ChatVertexAI.lc_name()).toBe('LibreChatVertexAI');
1872
- expect(vertex.dynamicThinkingBudget).toBe(true);
1873
- expect(vertex.thinkingConfig).toEqual(thinkingConfig);
1874
- expect(vertex.invocationParams({}).maxReasoningTokens).toBe(-1);
1875
- });
1876
-
1877
- it('uppercases custom OpenAI fetch methods before dispatch', async () => {
1878
- let method: string | undefined;
1879
- const client = new CustomOpenAIClient({
1880
- apiKey: 'test-key',
1881
- fetch: async (_url, init): Promise<Response> => {
1882
- method = init?.method;
1883
- return new Response('{}', { status: 200 });
1884
- },
1885
- });
1886
-
1887
- const response = await client.fetchWithTimeout(
1888
- 'https://example.test/v1/chat/completions',
1889
- { method: 'patch' },
1890
- 1000,
1891
- new AbortController()
1892
- );
1893
-
1894
- expect(response.status).toBe(200);
1895
- expect(method).toBe('PATCH');
1896
- expect(client.abortHandler).toBeDefined();
1897
- });
1898
-
1899
- it('aborts custom OpenAI fetches when the request timeout elapses', async () => {
1900
- const capturedFetch = createAbortableFetch();
1901
- const client = new CustomOpenAIClient({
1902
- apiKey: 'test-key',
1903
- fetch: capturedFetch.fetch,
1904
- });
1905
-
1906
- await expectFetchTimeoutAbort(
1907
- client,
1908
- capturedFetch,
1909
- 'https://example.test/v1/chat/completions'
1910
- );
1911
- });
1912
-
1913
- it('aborts custom Azure OpenAI fetches when the request timeout elapses', async () => {
1914
- const capturedFetch = createAbortableFetch();
1915
- const client = new CustomAzureOpenAIClient({
1916
- apiKey: 'test-azure-key',
1917
- apiVersion: '2024-10-21',
1918
- baseURL: 'https://example.test/openai/deployments/test-deployment',
1919
- fetch: capturedFetch.fetch,
1920
- });
1921
-
1922
- await expectFetchTimeoutAbort(
1923
- client,
1924
- capturedFetch,
1925
- 'https://example.test/openai/deployments/test-deployment/chat/completions'
1926
- );
1927
- });
1928
-
1929
- it('propagates caller abort signals to custom OpenAI fetches', async () => {
1930
- const capturedFetch = createAbortableFetch();
1931
- const client = new CustomOpenAIClient({
1932
- apiKey: 'test-key',
1933
- fetch: capturedFetch.fetch,
1934
- });
1935
- const callerController = new AbortController();
1936
- const requestController = new AbortController();
1937
-
1938
- const response = client.fetchWithTimeout(
1939
- 'https://example.test/v1/chat/completions',
1940
- { method: 'post', signal: callerController.signal },
1941
- 1000,
1942
- requestController
1943
- );
1944
-
1945
- callerController.abort();
1946
-
1947
- await expect(waitForFetchOutcome(response)).resolves.toBe('rejected');
1948
- expect(requestController.signal.aborted).toBe(true);
1949
- expect(capturedFetch.getSignal()?.aborted).toBe(true);
1950
- });
1951
- });
1952
-
1953
- describe('StreamSmoothingOptions type surface', () => {
1954
- it('accepts _lc_stream_delay: 0 across the typed provider options', () => {
1955
- const azure: import('@/types').AzureClientOptions = { _lc_stream_delay: 0 };
1956
- const openrouter: ChatOpenRouterCallOptions &
1957
- import('@/types').StreamSmoothingOptions = { _lc_stream_delay: 0 };
1958
- const mistral: import('@/types').MistralAIClientOptions = {
1959
- model: 'mistral-large-latest',
1960
- _lc_stream_delay: 0,
1961
- };
1962
- expect(azure._lc_stream_delay).toBe(0);
1963
- expect(openrouter._lc_stream_delay).toBe(0);
1964
- expect(mistral._lc_stream_delay).toBe(0);
1965
- });
1966
- });