@librechat/agents 3.4.7 → 3.5.1

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 (924) 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 +0 -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 +0 -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/package.json +35 -32
  582. package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +0 -52
  583. package/dist/types/test/mockTools.d.ts +0 -28
  584. package/dist/types/utils/__tests__/fixtures/contextOverflowSignatures.d.ts +0 -40
  585. package/src/__tests__/stream.eagerArgsDivergence.test.ts +0 -911
  586. package/src/__tests__/stream.eagerEventExecution.test.ts +0 -5046
  587. package/src/__tests__/stream.streamLimits.test.ts +0 -1982
  588. package/src/agents/__tests__/AgentContext.anthropic.live.test.ts +0 -448
  589. package/src/agents/__tests__/AgentContext.bedrock.live.test.ts +0 -655
  590. package/src/agents/__tests__/AgentContext.openrouter.live.test.ts +0 -128
  591. package/src/agents/__tests__/AgentContext.overflow.test.ts +0 -205
  592. package/src/agents/__tests__/AgentContext.test.ts +0 -2425
  593. package/src/agents/__tests__/projection.test.ts +0 -73
  594. package/src/agents/__tests__/promptCacheLiveHelpers.ts +0 -175
  595. package/src/aggregator.test.ts +0 -1214
  596. package/src/graphs/__tests__/Graph.breakerLifecycle.test.ts +0 -273
  597. package/src/graphs/__tests__/Graph.closeRunStep.test.ts +0 -385
  598. package/src/graphs/__tests__/Graph.contextOverflow.test.ts +0 -1766
  599. package/src/graphs/__tests__/Graph.preemptSignal.test.ts +0 -126
  600. package/src/graphs/__tests__/Graph.reasoning.test.ts +0 -1717
  601. package/src/graphs/__tests__/Graph.subagentResumeState.test.ts +0 -80
  602. package/src/graphs/__tests__/MultiAgentGraph.test.ts +0 -177
  603. package/src/graphs/__tests__/composition.smoke.test.ts +0 -509
  604. package/src/graphs/__tests__/createGraph.test.ts +0 -206
  605. package/src/hooks/__tests__/HookRegistry.test.ts +0 -334
  606. package/src/hooks/__tests__/compactHooks.test.ts +0 -250
  607. package/src/hooks/__tests__/createToolPolicyHook.test.ts +0 -268
  608. package/src/hooks/__tests__/createWorkspacePolicyHook.test.ts +0 -405
  609. package/src/hooks/__tests__/executeHooks.test.ts +0 -1294
  610. package/src/hooks/__tests__/integration.test.ts +0 -337
  611. package/src/hooks/__tests__/matchers.test.ts +0 -238
  612. package/src/hooks/__tests__/preemptBoundary.test.ts +0 -152
  613. package/src/hooks/__tests__/toolHooks.test.ts +0 -669
  614. package/src/llm/__tests__/contextOverflowRecovery.test.ts +0 -401
  615. package/src/llm/__tests__/fallbackOverflow.test.ts +0 -287
  616. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  617. package/src/llm/anthropic/inherited-content-utils.spec.ts +0 -249
  618. package/src/llm/anthropic/inherited-stream-events.spec.ts +0 -1259
  619. package/src/llm/anthropic/inherited-strict.spec.ts +0 -302
  620. package/src/llm/anthropic/llm.spec.ts +0 -3394
  621. package/src/llm/anthropic/utils/cross-provider-reasoning.test.ts +0 -383
  622. package/src/llm/anthropic/utils/cross-provider-server-tools.test.ts +0 -110
  623. package/src/llm/anthropic/utils/server-tool-inputs.test.ts +0 -508
  624. package/src/llm/anthropic/utils/streaming-tool-input.test.ts +0 -361
  625. package/src/llm/anthropic/utils/stripPrefillCache.test.ts +0 -111
  626. package/src/llm/anthropic/utils/tool-id-normalization.test.ts +0 -287
  627. package/src/llm/bedrock/inherited-cache.spec.ts +0 -144
  628. package/src/llm/bedrock/inherited.spec.ts +0 -724
  629. package/src/llm/bedrock/llm.spec.ts +0 -1533
  630. package/src/llm/bedrock/streamSealDispatch.test.ts +0 -331
  631. package/src/llm/bedrock/toolCache.test.ts +0 -194
  632. package/src/llm/bedrock/utils/cross-provider-reasoning.test.ts +0 -131
  633. package/src/llm/bedrock/utils/cross-provider-server-tools.test.ts +0 -122
  634. package/src/llm/bedrock/utils/message_inputs.test.ts +0 -650
  635. package/src/llm/bedrock/utils/message_outputs.test.ts +0 -85
  636. package/src/llm/bedrock/utils/toolResultCachePoint.test.ts +0 -118
  637. package/src/llm/custom-chat-models.smoke.test.ts +0 -1966
  638. package/src/llm/google/data/gettysburg10.wav +0 -0
  639. package/src/llm/google/data/hotdog.jpg +0 -0
  640. package/src/llm/google/inherited-stream-events.spec.ts +0 -350
  641. package/src/llm/google/llm.spec.ts +0 -1388
  642. package/src/llm/google/streamSmoothing.test.ts +0 -121
  643. package/src/llm/google/utils/common.test.ts +0 -196
  644. package/src/llm/invoke.alternation.test.ts +0 -87
  645. package/src/llm/invoke.handoffCue.test.ts +0 -112
  646. package/src/llm/invoke.streamLimits.test.ts +0 -142
  647. package/src/llm/invoke.test.ts +0 -1198
  648. package/src/llm/mistral/streamSmoothing.test.ts +0 -97
  649. package/src/llm/openai/cacheWriteTokens.test.ts +0 -112
  650. package/src/llm/openai/contentBlocks.test.ts +0 -381
  651. package/src/llm/openai/deepseek.test.ts +0 -747
  652. package/src/llm/openai/inherited-deepseek.spec.ts +0 -347
  653. package/src/llm/openai/inherited-xai.spec.ts +0 -416
  654. package/src/llm/openai/llm.spec.ts +0 -1774
  655. package/src/llm/openai/managedRequests.test.ts +0 -182
  656. package/src/llm/openai/sequentialToolCallSeals.test.ts +0 -199
  657. package/src/llm/openai/streamMetadata.spec.ts +0 -86
  658. package/src/llm/openai/streamMetadataDedup.spec.ts +0 -166
  659. package/src/llm/openai/utils/isReasoningModel.test.ts +0 -90
  660. package/src/llm/openai/utils/messages.test.ts +0 -488
  661. package/src/llm/openrouter/reasoning.test.ts +0 -561
  662. package/src/llm/openrouter/toolCache.test.ts +0 -134
  663. package/src/llm/preempt.test.ts +0 -323
  664. package/src/llm/stream/chunkAdapters.test.ts +0 -202
  665. package/src/llm/stream/reassembly.test.ts +0 -241
  666. package/src/llm/stream/smoother.bench.test.ts +0 -155
  667. package/src/llm/stream/smoother.test.ts +0 -519
  668. package/src/llm/streamLimits.test.ts +0 -450
  669. package/src/llm/truncation.test.ts +0 -242
  670. package/src/llm/vertexai/fixThoughtSignatures.test.ts +0 -154
  671. package/src/llm/vertexai/inherited-stream-events.spec.ts +0 -271
  672. package/src/llm/vertexai/llm.spec.ts +0 -159
  673. package/src/llm/vertexai/repairUsageMetadata.test.ts +0 -54
  674. package/src/llm/vertexai/sealStreamedToolCalls.test.ts +0 -88
  675. package/src/llm/vertexai/streamSealDispatch.test.ts +0 -148
  676. package/src/llm/vertexai/streamSmoothing.test.ts +0 -109
  677. package/src/messages/__tests__/anthropicToolCache.test.ts +0 -339
  678. package/src/messages/__tests__/observationMasking.test.ts +0 -312
  679. package/src/messages/__tests__/recency.test.ts +0 -267
  680. package/src/messages/__tests__/tools.test.ts +0 -473
  681. package/src/messages/alternation.test.ts +0 -212
  682. package/src/messages/assistantPhase.test.ts +0 -75
  683. package/src/messages/cache.tail.test.ts +0 -533
  684. package/src/messages/cache.test.ts +0 -2166
  685. package/src/messages/content.test.ts +0 -362
  686. package/src/messages/contextPruning.test.ts +0 -184
  687. package/src/messages/ensureThinkingBlock.test.ts +0 -1427
  688. package/src/messages/foldToollessToolBlocks.test.ts +0 -596
  689. package/src/messages/formatAgentMessages.reducer.test.ts +0 -162
  690. package/src/messages/formatAgentMessages.skills.test.ts +0 -513
  691. package/src/messages/formatAgentMessages.steer.test.ts +0 -598
  692. package/src/messages/formatAgentMessages.test.ts +0 -8111
  693. package/src/messages/formatAgentMessages.tools.test.ts +0 -522
  694. package/src/messages/formatMessage.test.ts +0 -693
  695. package/src/messages/handoffCue.test.ts +0 -96
  696. package/src/messages/injected.test.ts +0 -107
  697. package/src/messages/labelContentByAgent.test.ts +0 -962
  698. package/src/messages/reducer.spec.ts +0 -32
  699. package/src/messages/shiftIndexTokenCountMap.test.ts +0 -81
  700. package/src/messages/tailCacheConversion.test.ts +0 -161
  701. package/src/openai/__tests__/openai.test.ts +0 -337
  702. package/src/responses/__tests__/responses.test.ts +0 -652
  703. package/src/scripts/abort.ts +0 -157
  704. package/src/scripts/activity-labels/captured.json +0 -56
  705. package/src/scripts/activity-labels/checks.cjs +0 -205
  706. package/src/scripts/activity-labels/corpus.cjs +0 -473
  707. package/src/scripts/activity-labels/report.cjs +0 -203
  708. package/src/scripts/activity-labels/rescore.cjs +0 -102
  709. package/src/scripts/activity-labels/run.ts +0 -705
  710. package/src/scripts/activity-labels/variants.ts +0 -71
  711. package/src/scripts/ant_web_search.ts +0 -159
  712. package/src/scripts/ant_web_search_edge_case.ts +0 -163
  713. package/src/scripts/ant_web_search_error_edge_case.ts +0 -149
  714. package/src/scripts/args.ts +0 -48
  715. package/src/scripts/bedrock-cache-debug.ts +0 -250
  716. package/src/scripts/bedrock-content-aggregation-test.ts +0 -266
  717. package/src/scripts/bedrock-merge-test.ts +0 -107
  718. package/src/scripts/bedrock-parallel-tools-test.ts +0 -204
  719. package/src/scripts/bench-prompt-cache.ts +0 -479
  720. package/src/scripts/caching.ts +0 -132
  721. package/src/scripts/cli.ts +0 -172
  722. package/src/scripts/cli2.ts +0 -133
  723. package/src/scripts/cli3.ts +0 -184
  724. package/src/scripts/cli4.ts +0 -191
  725. package/src/scripts/cli5.ts +0 -191
  726. package/src/scripts/code_exec.ts +0 -214
  727. package/src/scripts/code_exec_files.ts +0 -237
  728. package/src/scripts/code_exec_multi_session.ts +0 -237
  729. package/src/scripts/code_exec_ptc.ts +0 -335
  730. package/src/scripts/code_exec_session.ts +0 -283
  731. package/src/scripts/code_exec_simple.ts +0 -148
  732. package/src/scripts/compare_pi_vs_ours.ts +0 -1259
  733. package/src/scripts/content.ts +0 -139
  734. package/src/scripts/context-overflow-probe.ts +0 -997
  735. package/src/scripts/empty_input.ts +0 -137
  736. package/src/scripts/handoff-test.ts +0 -134
  737. package/src/scripts/local_engine.ts +0 -166
  738. package/src/scripts/local_engine_checkpointer.ts +0 -205
  739. package/src/scripts/local_engine_compile.ts +0 -263
  740. package/src/scripts/local_engine_hooks.ts +0 -226
  741. package/src/scripts/local_engine_image.ts +0 -201
  742. package/src/scripts/local_engine_ptc.ts +0 -151
  743. package/src/scripts/local_engine_workspace.ts +0 -258
  744. package/src/scripts/memory.ts +0 -107
  745. package/src/scripts/multi-agent-chain.ts +0 -332
  746. package/src/scripts/multi-agent-conditional.ts +0 -222
  747. package/src/scripts/multi-agent-document-review-chain.ts +0 -198
  748. package/src/scripts/multi-agent-hybrid-flow.ts +0 -311
  749. package/src/scripts/multi-agent-parallel-start.ts +0 -265
  750. package/src/scripts/multi-agent-parallel.ts +0 -395
  751. package/src/scripts/multi-agent-sequence.ts +0 -217
  752. package/src/scripts/multi-agent-subagent.ts +0 -246
  753. package/src/scripts/multi-agent-supervisor.ts +0 -366
  754. package/src/scripts/multi-agent-test.ts +0 -187
  755. package/src/scripts/openrouter_prompt_cache_live.ts +0 -310
  756. package/src/scripts/parallel-asymmetric-tools-test.ts +0 -275
  757. package/src/scripts/parallel-full-metadata-test.ts +0 -241
  758. package/src/scripts/parallel-tools-test.ts +0 -341
  759. package/src/scripts/preempt-probe.ts +0 -330
  760. package/src/scripts/preempt-scenarios.ts +0 -388
  761. package/src/scripts/programmatic_exec.ts +0 -387
  762. package/src/scripts/programmatic_exec_agent.ts +0 -232
  763. package/src/scripts/search.ts +0 -147
  764. package/src/scripts/sequential-full-metadata-test.ts +0 -198
  765. package/src/scripts/session_live.ts +0 -548
  766. package/src/scripts/simple.ts +0 -226
  767. package/src/scripts/single-agent-metadata-test.ts +0 -196
  768. package/src/scripts/stream.ts +0 -141
  769. package/src/scripts/subagent-configurable-inheritance.ts +0 -252
  770. package/src/scripts/subagent-event-driven-debug.ts +0 -190
  771. package/src/scripts/subagent-tools-debug.ts +0 -160
  772. package/src/scripts/subagent-usage-sink.ts +0 -176
  773. package/src/scripts/summarization-recency.ts +0 -462
  774. package/src/scripts/test-custom-prompt-key.ts +0 -145
  775. package/src/scripts/test-handoff-input.ts +0 -170
  776. package/src/scripts/test-handoff-preamble.ts +0 -278
  777. package/src/scripts/test-handoff-steering.ts +0 -430
  778. package/src/scripts/test-multi-agent-list-handoff.ts +0 -418
  779. package/src/scripts/test-parallel-agent-labeling.ts +0 -327
  780. package/src/scripts/test-parallel-handoffs.ts +0 -292
  781. package/src/scripts/test-thinking-handoff-bedrock.ts +0 -154
  782. package/src/scripts/test-thinking-handoff.ts +0 -156
  783. package/src/scripts/test-thinking-to-thinking-handoff-bedrock.ts +0 -166
  784. package/src/scripts/test-tool-before-handoff-role-order.ts +0 -276
  785. package/src/scripts/test-tools-before-handoff.ts +0 -222
  786. package/src/scripts/test_code_api.ts +0 -354
  787. package/src/scripts/thinking-bedrock.ts +0 -160
  788. package/src/scripts/thinking-vertexai.ts +0 -168
  789. package/src/scripts/thinking.ts +0 -172
  790. package/src/scripts/tool_search.ts +0 -153
  791. package/src/scripts/tools.ts +0 -163
  792. package/src/session/__tests__/JsonlSessionStore.test.ts +0 -1463
  793. package/src/session/__tests__/handlers.test.ts +0 -161
  794. package/src/specs/activity-label-observability.live.test.ts +0 -262
  795. package/src/specs/activity-label-observability.test.ts +0 -167
  796. package/src/specs/activity-label-prompt.test.ts +0 -359
  797. package/src/specs/activity-label-trace-seed.test.ts +0 -47
  798. package/src/specs/activity-phase-label.test.ts +0 -306
  799. package/src/specs/agent-handoffs.live.test.ts +0 -140
  800. package/src/specs/agent-handoffs.test.ts +0 -2465
  801. package/src/specs/anthropic.simple.test.ts +0 -453
  802. package/src/specs/ask-user-question-batch.test.ts +0 -289
  803. package/src/specs/ask-user-questions.live.test.ts +0 -185
  804. package/src/specs/ask-user-questions.test.ts +0 -293
  805. package/src/specs/azure.simple.test.ts +0 -502
  806. package/src/specs/bedrock-toolless.live.test.ts +0 -123
  807. package/src/specs/bedrock-truncation.live.test.ts +0 -191
  808. package/src/specs/cache.simple.test.ts +0 -416
  809. package/src/specs/context-accuracy.live.test.ts +0 -409
  810. package/src/specs/context-overflow-recovery.live.test.ts +0 -213
  811. package/src/specs/context-usage-event.test.ts +0 -117
  812. package/src/specs/context-usage.live.test.ts +0 -297
  813. package/src/specs/custom-event-await.test.ts +0 -304
  814. package/src/specs/deepseek.simple.test.ts +0 -290
  815. package/src/specs/deterministic-trace-id.test.ts +0 -43
  816. package/src/specs/discovered-tools.test.ts +0 -217
  817. package/src/specs/durability-checkpoint.integration.test.ts +0 -243
  818. package/src/specs/graph-subagent.live.test.ts +0 -242
  819. package/src/specs/graph-subagent.test.ts +0 -322
  820. package/src/specs/handoffCue.test.ts +0 -165
  821. package/src/specs/langfuse-callbacks.test.ts +0 -1578
  822. package/src/specs/langfuse-config.test.ts +0 -247
  823. package/src/specs/langfuse-instrumentation.test.ts +0 -393
  824. package/src/specs/langfuse-metadata.test.ts +0 -245
  825. package/src/specs/langfuse-routing.integration.test.ts +0 -844
  826. package/src/specs/langfuse-runtime-context.test.ts +0 -92
  827. package/src/specs/langfuse-span-registry.test.ts +0 -87
  828. package/src/specs/langfuse-tool-output-tracing.test.ts +0 -1858
  829. package/src/specs/langfuse-trace-shaping.test.ts +0 -591
  830. package/src/specs/moonshot.simple.test.ts +0 -367
  831. package/src/specs/multi-agent-summarization.test.ts +0 -396
  832. package/src/specs/openai.simple.test.ts +0 -315
  833. package/src/specs/openrouter.simple.test.ts +0 -275
  834. package/src/specs/preemptSeal.test.ts +0 -678
  835. package/src/specs/prune.test.ts +0 -3741
  836. package/src/specs/reasoning.test.ts +0 -201
  837. package/src/specs/run-step-timestamps.test.ts +0 -414
  838. package/src/specs/spec.utils.ts +0 -15
  839. package/src/specs/subagent.test.ts +0 -864
  840. package/src/specs/summarization-unit.test.ts +0 -973
  841. package/src/specs/summarization.test.ts +0 -3823
  842. package/src/specs/summarize-prune.test.ts +0 -376
  843. package/src/specs/thinking-handoff.test.ts +0 -621
  844. package/src/specs/thinking-prune.test.ts +0 -827
  845. package/src/specs/token-accounting-e2e.test.ts +0 -1034
  846. package/src/specs/token-accounting-pipeline.test.ts +0 -1008
  847. package/src/specs/token-distribution-edge-case.test.ts +0 -315
  848. package/src/specs/token-memoization.test.ts +0 -40
  849. package/src/specs/tokens.test.ts +0 -1000
  850. package/src/specs/tool-error-resume.test.ts +0 -194
  851. package/src/specs/tool-error.test.ts +0 -198
  852. package/src/specs/vllm-reasoning-toolcalls.test.ts +0 -340
  853. package/src/stream.dispatch.test.ts +0 -63
  854. package/src/stream.test.ts +0 -144
  855. package/src/summarization/__tests__/aggregator.test.ts +0 -236
  856. package/src/summarization/__tests__/node.test.ts +0 -1996
  857. package/src/summarization/__tests__/trigger.test.ts +0 -149
  858. package/src/summarization/chunkHandler.test.ts +0 -196
  859. package/src/test/mockTools.ts +0 -386
  860. package/src/tools/Calculator.test.ts +0 -278
  861. package/src/tools/__tests__/BashExecutor.test.ts +0 -108
  862. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +0 -939
  863. package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +0 -858
  864. package/src/tools/__tests__/CodeExecutor.stateful.test.ts +0 -124
  865. package/src/tools/__tests__/LocalExecutionRoots.test.ts +0 -8
  866. package/src/tools/__tests__/LocalExecutionTools.test.ts +0 -2733
  867. package/src/tools/__tests__/ProgrammaticToolCalling.integration.test.ts +0 -318
  868. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -1557
  869. package/src/tools/__tests__/ReadFile.test.ts +0 -44
  870. package/src/tools/__tests__/SkillTool.test.ts +0 -442
  871. package/src/tools/__tests__/SubagentExecutor.test.ts +0 -3728
  872. package/src/tools/__tests__/SubagentReplay.test.ts +0 -329
  873. package/src/tools/__tests__/SubagentTool.test.ts +0 -149
  874. package/src/tools/__tests__/ToolNode.breakerSignal.test.ts +0 -595
  875. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +0 -1191
  876. package/src/tools/__tests__/ToolNode.invalidToolCalls.test.ts +0 -757
  877. package/src/tools/__tests__/ToolNode.langfuse.test.ts +0 -57
  878. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +0 -736
  879. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +0 -1710
  880. package/src/tools/__tests__/ToolNode.runtimeState.test.ts +0 -120
  881. package/src/tools/__tests__/ToolNode.session.test.ts +0 -1352
  882. package/src/tools/__tests__/ToolNode.streamLimits.test.ts +0 -69
  883. package/src/tools/__tests__/ToolSearch.integration.test.ts +0 -161
  884. package/src/tools/__tests__/ToolSearch.test.ts +0 -1227
  885. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +0 -561
  886. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +0 -980
  887. package/src/tools/__tests__/directToolHooks.test.ts +0 -700
  888. package/src/tools/__tests__/eagerEventExecution.session.test.ts +0 -92
  889. package/src/tools/__tests__/handlers.test.ts +0 -997
  890. package/src/tools/__tests__/hitl.test.ts +0 -4663
  891. package/src/tools/__tests__/intentArg.test.ts +0 -357
  892. package/src/tools/__tests__/intentCoverage.test.ts +0 -139
  893. package/src/tools/__tests__/localToolNames.test.ts +0 -75
  894. package/src/tools/__tests__/skillCatalog.test.ts +0 -161
  895. package/src/tools/__tests__/subagentHooks.test.ts +0 -1651
  896. package/src/tools/__tests__/toolOutputReferences.test.ts +0 -515
  897. package/src/tools/__tests__/workspaceSeam.test.ts +0 -147
  898. package/src/tools/local/__tests__/FileCheckpointer.test.ts +0 -162
  899. package/src/tools/local/__tests__/editStrategies.test.ts +0 -134
  900. package/src/tools/search/content.test.ts +0 -173
  901. package/src/tools/search/crw.test.ts +0 -836
  902. package/src/tools/search/format.test.ts +0 -242
  903. package/src/tools/search/http-agent.test.ts +0 -133
  904. package/src/tools/search/jina-reranker.test.ts +0 -306
  905. package/src/tools/search/keenable-scraper.test.ts +0 -153
  906. package/src/tools/search/keenable.test.ts +0 -183
  907. package/src/tools/search/outcome.test.ts +0 -90
  908. package/src/tools/search/output.md +0 -2775
  909. package/src/tools/search/rag-api-reranker.test.ts +0 -891
  910. package/src/tools/search/source-processing.test.ts +0 -516
  911. package/src/tools/search/tavily.test.ts +0 -965
  912. package/src/tools/search/test.html +0 -884
  913. package/src/tools/search/test.md +0 -643
  914. package/src/tools/subagent/__tests__/SubagentExecutionRegistry.test.ts +0 -637
  915. package/src/tools/subagent/__tests__/SubagentExecutor.lazy.test.ts +0 -3054
  916. package/src/tools/subagent/__tests__/childGraphConfig.test.ts +0 -521
  917. package/src/utils/__tests__/apportion.test.ts +0 -32
  918. package/src/utils/__tests__/errors.test.ts +0 -270
  919. package/src/utils/__tests__/fixtures/contextOverflowSignatures.ts +0 -336
  920. package/src/utils/__tests__/redactSecrets.test.ts +0 -56
  921. package/src/utils/__tests__/truncation.test.ts +0 -66
  922. package/src/utils/llm.test.ts +0 -18
  923. package/src/utils/proxy.test.ts +0 -176
  924. package/src/utils/toolContent.test.ts +0 -1432
@@ -1,13 +1,4 @@
1
1
  //#region src/llm/openai/streamMetadata.ts
2
- /**
3
- * `@langchain/openai` stamps these scalar fields together onto every chunk
4
- * whose `choice.finish_reason` is set. Providers that emit `finish_reason` on
5
- * more than one streamed chunk (e.g. OpenRouter) otherwise make core's
6
- * `_mergeDicts` concatenate them into `stopstop` / duplicated model names — in
7
- * both the aggregated graph message and the Langfuse trace. Core keeps
8
- * `id`/`name`/`model_provider` last but not these, so keep the first occurrence
9
- * and drop later repeats at the source, before either aggregation runs.
10
- */
11
2
  const REPEATED_SCALAR_METADATA_FIELDS = [
12
3
  "model_name",
13
4
  "finish_reason",
@@ -18,18 +9,6 @@ function completionIndex(generationInfo) {
18
9
  const completion = generationInfo?.completion;
19
10
  return typeof completion === "number" ? completion : 0;
20
11
  }
21
- /**
22
- * Strip scalar `response_metadata`/`generationInfo` fields that have already
23
- * appeared on an earlier chunk of the same completion (tracked in `seen`),
24
- * keeping the first occurrence so the aggregated message still carries the
25
- * value once. Scoped per completion index so multi-choice (`n > 1`) responses,
26
- * which `_generate` aggregates separately, keep each choice's own metadata.
27
- *
28
- * Deletes from a shallow clone rather than in place: providers such as
29
- * `ChatDeepSeek` split one raw chunk into several synthetic pieces that share
30
- * the same `response_metadata`/`generationInfo` objects, so mutating in place
31
- * would strip fields from sibling chunks that were already emitted.
32
- */
33
12
  function dropRepeatedScalarMetadata(chunk, seen) {
34
13
  const generationInfo = chunk.generationInfo;
35
14
  const responseMetadata = chunk.message.response_metadata;
@@ -1 +1 @@
1
- {"version":3,"file":"streamMetadata.mjs","names":[],"sources":["../../../../src/llm/openai/streamMetadata.ts"],"sourcesContent":["import type { ChatGenerationChunk } from '@langchain/core/outputs';\n\n/**\n * `@langchain/openai` stamps these scalar fields together onto every chunk\n * whose `choice.finish_reason` is set. Providers that emit `finish_reason` on\n * more than one streamed chunk (e.g. OpenRouter) otherwise make core's\n * `_mergeDicts` concatenate them into `stopstop` / duplicated model names — in\n * both the aggregated graph message and the Langfuse trace. Core keeps\n * `id`/`name`/`model_provider` last but not these, so keep the first occurrence\n * and drop later repeats at the source, before either aggregation runs.\n */\nconst REPEATED_SCALAR_METADATA_FIELDS = [\n 'model_name',\n 'finish_reason',\n 'service_tier',\n 'system_fingerprint',\n] as const;\n\n/** Per-completion-index set of scalar fields already emitted this stream. */\nexport type SeenScalarMetadata = Map<number, Set<string>>;\n\nfunction completionIndex(\n generationInfo: Record<string, unknown> | undefined\n): number {\n const completion = generationInfo?.completion;\n return typeof completion === 'number' ? completion : 0;\n}\n\n/**\n * Strip scalar `response_metadata`/`generationInfo` fields that have already\n * appeared on an earlier chunk of the same completion (tracked in `seen`),\n * keeping the first occurrence so the aggregated message still carries the\n * value once. Scoped per completion index so multi-choice (`n > 1`) responses,\n * which `_generate` aggregates separately, keep each choice's own metadata.\n *\n * Deletes from a shallow clone rather than in place: providers such as\n * `ChatDeepSeek` split one raw chunk into several synthetic pieces that share\n * the same `response_metadata`/`generationInfo` objects, so mutating in place\n * would strip fields from sibling chunks that were already emitted.\n */\nexport function dropRepeatedScalarMetadata(\n chunk: ChatGenerationChunk,\n seen: SeenScalarMetadata\n): void {\n const generationInfo = chunk.generationInfo as\n | Record<string, unknown>\n | undefined;\n const responseMetadata = chunk.message.response_metadata as Record<\n string,\n unknown\n >;\n\n const index = completionIndex(generationInfo);\n let seenFields = seen.get(index);\n if (seenFields == null) {\n seenFields = new Set<string>();\n seen.set(index, seenFields);\n }\n\n const dropFromGenerationInfo: string[] = [];\n const dropFromResponseMetadata: string[] = [];\n for (const field of REPEATED_SCALAR_METADATA_FIELDS) {\n const inGenerationInfo =\n generationInfo != null && generationInfo[field] != null;\n const inResponseMetadata = responseMetadata[field] != null;\n if (!inGenerationInfo && !inResponseMetadata) {\n continue;\n }\n if (!seenFields.has(field)) {\n seenFields.add(field);\n continue;\n }\n if (inGenerationInfo) {\n dropFromGenerationInfo.push(field);\n }\n if (inResponseMetadata) {\n dropFromResponseMetadata.push(field);\n }\n }\n\n if (dropFromGenerationInfo.length > 0 && generationInfo != null) {\n const cloned = { ...generationInfo };\n for (const field of dropFromGenerationInfo) {\n delete cloned[field];\n }\n chunk.generationInfo = cloned;\n }\n if (dropFromResponseMetadata.length > 0) {\n const cloned = { ...responseMetadata };\n for (const field of dropFromResponseMetadata) {\n delete cloned[field];\n }\n chunk.message.response_metadata = cloned;\n }\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAM,kCAAkC;CACtC;CACA;CACA;CACA;AACF;AAKA,SAAS,gBACP,gBACQ;CACR,MAAM,aAAa,gBAAgB;CACnC,OAAO,OAAO,eAAe,WAAW,aAAa;AACvD;;;;;;;;;;;;;AAcA,SAAgB,2BACd,OACA,MACM;CACN,MAAM,iBAAiB,MAAM;CAG7B,MAAM,mBAAmB,MAAM,QAAQ;CAKvC,MAAM,QAAQ,gBAAgB,cAAc;CAC5C,IAAI,aAAa,KAAK,IAAI,KAAK;CAC/B,IAAI,cAAc,MAAM;EACtB,6BAAa,IAAI,IAAY;EAC7B,KAAK,IAAI,OAAO,UAAU;CAC5B;CAEA,MAAM,yBAAmC,CAAC;CAC1C,MAAM,2BAAqC,CAAC;CAC5C,KAAK,MAAM,SAAS,iCAAiC;EACnD,MAAM,mBACJ,kBAAkB,QAAQ,eAAe,UAAU;EACrD,MAAM,qBAAqB,iBAAiB,UAAU;EACtD,IAAI,CAAC,oBAAoB,CAAC,oBACxB;EAEF,IAAI,CAAC,WAAW,IAAI,KAAK,GAAG;GAC1B,WAAW,IAAI,KAAK;GACpB;EACF;EACA,IAAI,kBACF,uBAAuB,KAAK,KAAK;EAEnC,IAAI,oBACF,yBAAyB,KAAK,KAAK;CAEvC;CAEA,IAAI,uBAAuB,SAAS,KAAK,kBAAkB,MAAM;EAC/D,MAAM,SAAS,EAAE,GAAG,eAAe;EACnC,KAAK,MAAM,SAAS,wBAClB,OAAO,OAAO;EAEhB,MAAM,iBAAiB;CACzB;CACA,IAAI,yBAAyB,SAAS,GAAG;EACvC,MAAM,SAAS,EAAE,GAAG,iBAAiB;EACrC,KAAK,MAAM,SAAS,0BAClB,OAAO,OAAO;EAEhB,MAAM,QAAQ,oBAAoB;CACpC;AACF"}
1
+ {"version":3,"file":"streamMetadata.mjs","names":[],"sources":["../../../../src/llm/openai/streamMetadata.ts"],"mappings":";AAWA,MAAM,kCAAkC;CACtC;CACA;CACA;CACA;AACF;AAKA,SAAS,gBACP,gBACQ;CACR,MAAM,aAAa,gBAAgB;CACnC,OAAO,OAAO,eAAe,WAAW,aAAa;AACvD;AAcA,SAAgB,2BACd,OACA,MACM;CACN,MAAM,iBAAiB,MAAM;CAG7B,MAAM,mBAAmB,MAAM,QAAQ;CAKvC,MAAM,QAAQ,gBAAgB,cAAc;CAC5C,IAAI,aAAa,KAAK,IAAI,KAAK;CAC/B,IAAI,cAAc,MAAM;EACtB,6BAAa,IAAI,IAAY;EAC7B,KAAK,IAAI,OAAO,UAAU;CAC5B;CAEA,MAAM,yBAAmC,CAAC;CAC1C,MAAM,2BAAqC,CAAC;CAC5C,KAAK,MAAM,SAAS,iCAAiC;EACnD,MAAM,mBACJ,kBAAkB,QAAQ,eAAe,UAAU;EACrD,MAAM,qBAAqB,iBAAiB,UAAU;EACtD,IAAI,CAAC,oBAAoB,CAAC,oBACxB;EAEF,IAAI,CAAC,WAAW,IAAI,KAAK,GAAG;GAC1B,WAAW,IAAI,KAAK;GACpB;EACF;EACA,IAAI,kBACF,uBAAuB,KAAK,KAAK;EAEnC,IAAI,oBACF,yBAAyB,KAAK,KAAK;CAEvC;CAEA,IAAI,uBAAuB,SAAS,KAAK,kBAAkB,MAAM;EAC/D,MAAM,SAAS,EAAE,GAAG,eAAe;EACnC,KAAK,MAAM,SAAS,wBAClB,OAAO,OAAO;EAEhB,MAAM,iBAAiB;CACzB;CACA,IAAI,yBAAyB,SAAS,GAAG;EACvC,MAAM,SAAS,EAAE,GAAG,iBAAiB;EACrC,KAAK,MAAM,SAAS,0BAClB,OAAO,OAAO;EAEhB,MAAM,QAAQ,oBAAoB;CACpC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/llm/openai/utils/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/explicit-function-return-type */\nimport { type OpenAI as OpenAIClient } from 'openai';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport {\n makeInvalidToolCall,\n parseToolCall,\n} from '@langchain/core/output_parsers/openai_tools';\nimport {\n AIMessage,\n AIMessageChunk,\n type BaseMessage,\n ChatMessage,\n ToolMessage,\n isAIMessage,\n type UsageMetadata,\n type BaseMessageFields,\n type MessageContentComplex,\n type InvalidToolCall,\n type MessageContentImageUrl,\n StandardContentBlockConverter,\n parseBase64DataUrl,\n parseMimeType,\n convertToProviderContentBlock,\n isDataContentBlock,\n} from '@langchain/core/messages';\nimport type {\n ChatCompletionContentPartText,\n ChatCompletionContentPartImage,\n ChatCompletionContentPartInputAudio,\n ChatCompletionContentPart,\n} from 'openai/resources/chat/completions';\nimport type {\n OpenAICallOptions,\n OpenAIChatInput,\n ChatOpenAIReasoningSummary,\n} from '@langchain/openai';\nimport type { ToolCall, ToolCallChunk } from '@langchain/core/messages/tool';\nimport {\n getBoundedCacheControlledTextToolContent,\n getComputerCallOutputScreenshot,\n isComputerCallOutputMessage,\n serializeStructuredValueBounded,\n} from '@/utils/toolContent';\nimport {\n STREAMED_TOOL_CALL_SEAL_METADATA_KEY,\n STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY,\n OPENAI_RESPONSES_STREAMED_TOOL_CALL_ADAPTER,\n} from '@/tools/streamedToolCallSeals';\nimport {\n calculateMaxToolCallInputChars,\n projectToolCallInputs,\n serializeToolCallInput,\n} from '@/messages/prune';\nimport { HARD_MAX_TOOL_RESULT_CHARS } from '@/utils/truncation';\nimport { toLangChainContent } from '@/messages/langchain';\n\nexport type { OpenAICallOptions, OpenAIChatInput };\n\n// Utility types to get hidden OpenAI response types\ntype ExtractAsyncIterableType<T> = T extends AsyncIterable<infer U> ? U : never;\ntype ExcludeController<T> = T extends { controller: unknown } ? never : T;\ntype ExcludeNonController<T> = T extends { controller: unknown } ? T : never;\n\ntype ResponsesCreate = OpenAIClient.Responses['create'];\ntype ResponsesParse = OpenAIClient.Responses['parse'];\n\ntype ResponsesInputItem = OpenAIClient.Responses.ResponseInputItem;\n\ntype ResponsesCreateInvoke = ExcludeController<\n Awaited<ReturnType<ResponsesCreate>>\n>;\n\ntype ResponsesParseInvoke = ExcludeController<\n Awaited<ReturnType<ResponsesParse>>\n>;\n\ntype ResponsesCreateStream = ExcludeNonController<\n Awaited<ReturnType<ResponsesCreate>>\n>;\n\nexport type ResponseReturnStreamEvents =\n ExtractAsyncIterableType<ResponsesCreateStream>;\n\n// TODO import from SDK when available\ntype OpenAIRoleEnum =\n | 'system'\n | 'developer'\n | 'assistant'\n | 'user'\n | 'function'\n | 'tool';\n\ntype OpenAICompletionParam =\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam;\n\nconst MAX_PROVIDER_TOOL_CALL_INPUT_CHARS = calculateMaxToolCallInputChars();\n\nfunction convertLangChainToolCallToBoundedOpenAI(toolCall: ToolCall): {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n} {\n if (toolCall.id == null) {\n throw new Error('All OpenAI tool calls must have an \"id\" field.');\n }\n return {\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.name,\n arguments: serializeToolCallInput(\n toolCall.args,\n MAX_PROVIDER_TOOL_CALL_INPUT_CHARS\n ),\n },\n };\n}\n\nfunction extractGenericMessageCustomRole(message: ChatMessage) {\n if (\n message.role !== 'system' &&\n message.role !== 'developer' &&\n message.role !== 'assistant' &&\n message.role !== 'user' &&\n message.role !== 'function' &&\n message.role !== 'tool'\n ) {\n console.warn(`Unknown message role: ${message.role}`);\n }\n\n return message.role as OpenAIRoleEnum;\n}\n\nexport function messageToOpenAIRole(message: BaseMessage): OpenAIRoleEnum {\n const type = message._getType();\n switch (type) {\n case 'system':\n return 'system';\n case 'ai':\n return 'assistant';\n case 'human':\n return 'user';\n case 'function':\n return 'function';\n case 'tool':\n return 'tool';\n case 'generic': {\n if (!ChatMessage.isInstance(message))\n throw new Error('Invalid generic chat message');\n return extractGenericMessageCustomRole(message);\n }\n default:\n throw new Error(`Unknown message type: ${type}`);\n }\n}\n\nconst completionsApiContentBlockConverter: StandardContentBlockConverter<{\n text: ChatCompletionContentPartText;\n image: ChatCompletionContentPartImage;\n audio: ChatCompletionContentPartInputAudio;\n file: ChatCompletionContentPart.File;\n}> = {\n providerName: 'ChatOpenAI',\n\n fromStandardTextBlock(block): ChatCompletionContentPartText {\n return { type: 'text', text: block.text };\n },\n\n fromStandardImageBlock(block): ChatCompletionContentPartImage {\n if (block.source_type === 'url') {\n return {\n type: 'image_url',\n image_url: {\n url: block.url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as 'auto' | 'low' | 'high' }\n : {}),\n },\n };\n }\n\n if (block.source_type === 'base64') {\n const url = `data:${block.mime_type ?? ''};base64,${block.data}`;\n return {\n type: 'image_url',\n image_url: {\n url,\n ...(block.metadata?.detail\n ? { detail: block.metadata.detail as 'auto' | 'low' | 'high' }\n : {}),\n },\n };\n }\n\n throw new Error(\n `Image content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardAudioBlock(block): ChatCompletionContentPartInputAudio {\n if (block.source_type === 'url') {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL audio blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n const rawMimeType = data.mime_type || block.mime_type || '';\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(rawMimeType);\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== 'audio' ||\n (mimeType.subtype !== 'wav' && mimeType.subtype !== 'mp3')\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: 'input_audio',\n input_audio: {\n format: mimeType.subtype,\n data: data.data,\n },\n };\n }\n\n if (block.source_type === 'base64') {\n let mimeType: { type: string; subtype: string };\n\n try {\n mimeType = parseMimeType(block.mime_type ?? '');\n } catch {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n if (\n mimeType.type !== 'audio' ||\n (mimeType.subtype !== 'wav' && mimeType.subtype !== 'mp3')\n ) {\n throw new Error(\n `Audio blocks with source_type ${block.source_type} must have mime type of audio/wav or audio/mp3`\n );\n }\n\n return {\n type: 'input_audio',\n input_audio: {\n format: mimeType.subtype,\n data: block.data,\n },\n };\n }\n\n throw new Error(\n `Audio content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n\n fromStandardFileBlock(block): ChatCompletionContentPart.File {\n if (block.source_type === 'url') {\n const data = parseBase64DataUrl({ dataUrl: block.url });\n if (!data) {\n throw new Error(\n `URL file blocks with source_type ${block.source_type} must be formatted as a data URL for ChatOpenAI`\n );\n }\n\n return {\n type: 'file',\n file: {\n file_data: block.url, // formatted as base64 data URL\n ...(block.metadata?.filename || block.metadata?.name\n ? {\n filename: (block.metadata.filename ||\n block.metadata.name) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === 'base64') {\n return {\n type: 'file',\n file: {\n file_data: `data:${block.mime_type ?? ''};base64,${block.data}`,\n ...(block.metadata?.filename ||\n block.metadata?.name ||\n block.metadata?.title\n ? {\n filename: (block.metadata.filename ||\n block.metadata.name ||\n block.metadata.title) as string,\n }\n : {}),\n },\n };\n }\n\n if (block.source_type === 'id') {\n return {\n type: 'file',\n file: {\n file_id: block.id,\n },\n };\n }\n\n throw new Error(\n `File content blocks with source_type ${block.source_type} are not supported for ChatOpenAI`\n );\n },\n};\n\n/** Options for converting messages to OpenAI params */\nexport interface ConvertMessagesOptions {\n /** Include reasoning_content field for DeepSeek thinking mode with tool calls */\n includeReasoningContent?: boolean;\n /** Include reasoning_details field for OpenRouter/Gemini thinking mode with tool calls */\n includeReasoningDetails?: boolean;\n /** Convert reasoning_details to content blocks for Claude (requires content array format) */\n convertReasoningDetailsToContent?: boolean;\n /** Preserve OpenRouter's canonical cache-decorated tool text block. */\n preserveToolCacheControl?: boolean;\n}\n\n// Used in LangSmith, export is important here\nexport function _convertMessagesToOpenAIParams(\n messages: BaseMessage[],\n model?: string,\n options?: ConvertMessagesOptions\n): OpenAICompletionParam[] {\n const projectedMessages = projectToolCallInputs(\n messages,\n MAX_PROVIDER_TOOL_CALL_INPUT_CHARS\n );\n let hasReasoningToolCallContext = false;\n // TODO: Function messages do not support array content, fix cast\n return projectedMessages.flatMap((message) => {\n let role = messageToOpenAIRole(message);\n if (role === 'system' && isReasoningModel(model)) {\n role = 'developer';\n }\n\n let hasAnthropicThinkingBlock: boolean = false;\n\n let content: unknown;\n if (\n role === 'tool' &&\n typeof message.content !== 'string' &&\n !isComputerCallOutputMessage(message)\n ) {\n content =\n options?.preserveToolCacheControl === true\n ? getBoundedCacheControlledTextToolContent(\n message.content,\n HARD_MAX_TOOL_RESULT_CHARS\n )\n : undefined;\n content ??= serializeStructuredValueBounded(\n message.content,\n HARD_MAX_TOOL_RESULT_CHARS\n ).content;\n } else if (typeof message.content === 'string') {\n content = message.content;\n } else {\n content = message.content.map((m) => {\n if ('type' in m && m.type === 'thinking') {\n hasAnthropicThinkingBlock = true;\n return m;\n }\n if (isDataContentBlock(m)) {\n return convertToProviderContentBlock(\n m,\n completionsApiContentBlockConverter\n );\n }\n return m;\n });\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const completionParam: Record<string, any> = {\n role,\n content,\n };\n let messageHasToolCalls = false;\n let messageIsToolResult = false;\n if (message.name != null) {\n completionParam.name = message.name;\n }\n if (message.additional_kwargs.function_call != null) {\n completionParam.function_call = message.additional_kwargs.function_call;\n completionParam.content = '';\n }\n if (isAIMessage(message) && !!message.tool_calls?.length) {\n messageHasToolCalls = true;\n completionParam.tool_calls = message.tool_calls.map(\n convertLangChainToolCallToBoundedOpenAI\n );\n completionParam.content = hasAnthropicThinkingBlock ? content : '';\n if (\n options?.includeReasoningDetails === true &&\n message.additional_kwargs.reasoning_details != null\n ) {\n // For Claude via OpenRouter, convert reasoning_details to content blocks\n const isClaudeModel =\n model?.includes('claude') === true ||\n model?.includes('anthropic') === true;\n if (\n options.convertReasoningDetailsToContent === true &&\n isClaudeModel\n ) {\n const reasoningDetails = message.additional_kwargs\n .reasoning_details as Record<string, unknown>[];\n const contentBlocks = [];\n\n // Add thinking blocks from reasoning_details\n for (const detail of reasoningDetails) {\n if (detail.type === 'reasoning.text' && detail.text != null) {\n contentBlocks.push({\n type: 'thinking',\n thinking: detail.text,\n });\n } else if (\n detail.type === 'reasoning.encrypted' &&\n detail.data != null\n ) {\n contentBlocks.push({\n type: 'redacted_thinking',\n data: detail.data,\n id: detail.id,\n });\n }\n }\n\n // Set content to array with thinking blocks\n if (contentBlocks.length > 0) {\n completionParam.content = contentBlocks;\n }\n } else {\n // For non-Claude models, pass as separate field\n completionParam.reasoning_details =\n message.additional_kwargs.reasoning_details;\n }\n }\n } else {\n if (message.additional_kwargs.tool_calls != null) {\n messageHasToolCalls =\n !Array.isArray(message.additional_kwargs.tool_calls) ||\n message.additional_kwargs.tool_calls.length > 0;\n completionParam.tool_calls = message.additional_kwargs.tool_calls;\n if (\n options?.includeReasoningDetails === true &&\n message.additional_kwargs.reasoning_details != null\n ) {\n // For Claude via OpenRouter, convert reasoning_details to content blocks\n const isClaudeModel =\n model?.includes('claude') === true ||\n model?.includes('anthropic') === true;\n if (\n options.convertReasoningDetailsToContent === true &&\n isClaudeModel\n ) {\n const reasoningDetails = message.additional_kwargs\n .reasoning_details as Record<string, unknown>[];\n const contentBlocks = [];\n\n // Add thinking blocks from reasoning_details\n for (const detail of reasoningDetails) {\n if (detail.type === 'reasoning.text' && detail.text != null) {\n contentBlocks.push({\n type: 'thinking',\n thinking: detail.text,\n });\n } else if (\n detail.type === 'reasoning.encrypted' &&\n detail.data != null\n ) {\n contentBlocks.push({\n type: 'redacted_thinking',\n data: detail.data,\n id: detail.id,\n });\n }\n }\n\n // Set content to array with thinking blocks\n if (contentBlocks.length > 0) {\n completionParam.content = contentBlocks;\n }\n } else {\n // For non-Claude models, pass as separate field\n completionParam.reasoning_details =\n message.additional_kwargs.reasoning_details;\n }\n }\n }\n if ((message as ToolMessage).tool_call_id != null) {\n messageIsToolResult = true;\n completionParam.tool_call_id = (message as ToolMessage).tool_call_id;\n }\n }\n\n if (\n options?.includeReasoningContent === true &&\n isAIMessage(message) &&\n (hasReasoningToolCallContext || messageHasToolCalls) &&\n typeof message.additional_kwargs.reasoning_content === 'string' &&\n message.additional_kwargs.reasoning_content !== ''\n ) {\n completionParam.reasoning_content =\n message.additional_kwargs.reasoning_content;\n }\n\n if (messageHasToolCalls || messageIsToolResult) {\n hasReasoningToolCallContext = true;\n }\n\n if (\n message.additional_kwargs.audio &&\n typeof message.additional_kwargs.audio === 'object' &&\n 'id' in message.additional_kwargs.audio\n ) {\n const audioMessage = {\n role: 'assistant',\n audio: {\n id: message.additional_kwargs.audio.id,\n },\n };\n return [completionParam, audioMessage] as OpenAICompletionParam[];\n }\n\n return completionParam as OpenAICompletionParam;\n });\n}\n\nconst _FUNCTION_CALL_IDS_MAP_KEY = '__openai_function_call_ids__';\n\nfunction _convertReasoningSummaryToOpenAIResponsesParams(\n reasoning: ChatOpenAIReasoningSummary\n): OpenAIClient.Responses.ResponseReasoningItem {\n // combine summary parts that have the the same index and then remove the indexes\n const summary = (\n reasoning.summary.length > 1\n ? reasoning.summary.reduce(\n (acc, curr) => {\n const last = acc.at(-1);\n\n if (last!.index === curr.index) {\n last!.text += curr.text;\n } else {\n acc.push(curr);\n }\n return acc;\n },\n [{ ...reasoning.summary[0] }]\n )\n : reasoning.summary\n ).map((s) =>\n Object.fromEntries(Object.entries(s).filter(([k]) => k !== 'index'))\n ) as OpenAIClient.Responses.ResponseReasoningItem.Summary[];\n\n return {\n ...reasoning,\n summary,\n } as OpenAIClient.Responses.ResponseReasoningItem;\n}\n\nexport function _convertMessagesToOpenAIResponsesParams(\n messages: BaseMessage[],\n model?: string,\n zdrEnabled?: boolean\n): ResponsesInputItem[] {\n const projectedMessages = projectToolCallInputs(\n messages,\n MAX_PROVIDER_TOOL_CALL_INPUT_CHARS\n );\n return projectedMessages.flatMap(\n (lcMsg): ResponsesInputItem | ResponsesInputItem[] => {\n const additional_kwargs =\n lcMsg.additional_kwargs as BaseMessageFields['additional_kwargs'] & {\n [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n type?: string;\n refusal?: string;\n };\n const responseMetadata = lcMsg.response_metadata as {\n output?: ResponsesInputItem[];\n };\n\n let role = messageToOpenAIRole(lcMsg);\n if (role === 'system' && isReasoningModel(model)) role = 'developer';\n\n if (role === 'function') {\n throw new Error('Function messages are not supported in Responses API');\n }\n\n if (role === 'tool') {\n const toolMessage = lcMsg as ToolMessage;\n\n // Handle computer call output\n if (additional_kwargs.type === 'computer_call_output') {\n const screenshot = getComputerCallOutputScreenshot(\n toolMessage.content\n );\n if (screenshot == null) {\n throw new Error('Invalid computer call output');\n }\n\n const output: OpenAIClient.Responses.ResponseComputerToolCallOutputScreenshot =\n 'image_url' in screenshot\n ? {\n type: 'computer_screenshot',\n image_url: screenshot.image_url,\n }\n : {\n type: 'computer_screenshot',\n file_id: screenshot.file_id,\n };\n const computerCallOutput: ResponsesInputItem = {\n type: 'computer_call_output',\n output,\n call_id: toolMessage.tool_call_id,\n };\n return computerCallOutput;\n }\n\n return {\n type: 'function_call_output',\n call_id: toolMessage.tool_call_id,\n id: toolMessage.id?.startsWith('fc_') ? toolMessage.id : undefined,\n output:\n typeof toolMessage.content !== 'string'\n ? serializeStructuredValueBounded(\n toolMessage.content,\n HARD_MAX_TOOL_RESULT_CHARS\n ).content\n : toolMessage.content,\n };\n }\n\n if (role === 'assistant') {\n // if we have the original response items, just reuse them\n if (\n !zdrEnabled &&\n responseMetadata.output != null &&\n Array.isArray(responseMetadata.output) &&\n responseMetadata.output.length > 0 &&\n responseMetadata.output.every((item) => 'type' in item)\n ) {\n return responseMetadata.output;\n }\n\n // otherwise, try to reconstruct the response from what we have\n\n const input: ResponsesInputItem[] = [];\n\n // reasoning items\n if (additional_kwargs.reasoning && !zdrEnabled) {\n const reasoningItem = _convertReasoningSummaryToOpenAIResponsesParams(\n additional_kwargs.reasoning\n );\n input.push(reasoningItem);\n }\n\n // ai content\n let content = lcMsg.content as\n | string\n | Array<\n | MessageContentComplex\n | OpenAIClient.Responses.ResponseOutputText\n | OpenAIClient.Responses.ResponseOutputRefusal\n >;\n if (additional_kwargs.refusal) {\n if (typeof content === 'string') {\n content = [{ type: 'output_text', text: content, annotations: [] }];\n }\n content = [\n ...content,\n { type: 'refusal', refusal: additional_kwargs.refusal },\n ];\n }\n\n input.push({\n type: 'message',\n role: 'assistant',\n ...(lcMsg.id && !zdrEnabled && lcMsg.id.startsWith('msg_')\n ? { id: lcMsg.id }\n : {}),\n content:\n typeof content === 'string'\n ? content\n : content.flatMap((item) => {\n if (item.type === 'text') {\n const textItem = item as MessageContentComplex & {\n annotations?: unknown[];\n };\n return {\n type: 'output_text',\n text: item.text,\n annotations: textItem.annotations ?? [],\n };\n }\n\n if (item.type === 'output_text' || item.type === 'refusal') {\n return item;\n }\n\n return [];\n }),\n } as ResponsesInputItem);\n\n const functionCallIds = additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY];\n\n if (isAIMessage(lcMsg) && !!lcMsg.tool_calls?.length) {\n input.push(\n ...lcMsg.tool_calls.map(\n (toolCall): ResponsesInputItem => ({\n type: 'function_call',\n name: toolCall.name,\n arguments: serializeToolCallInput(\n toolCall.args,\n MAX_PROVIDER_TOOL_CALL_INPUT_CHARS\n ),\n call_id: toolCall.id!,\n ...(zdrEnabled ? { id: functionCallIds?.[toolCall.id!] } : {}),\n })\n )\n );\n } else if (additional_kwargs.tool_calls) {\n input.push(\n ...additional_kwargs.tool_calls.map(\n (toolCall): ResponsesInputItem => ({\n type: 'function_call',\n name: toolCall.function.name,\n call_id: toolCall.id,\n arguments: toolCall.function.arguments,\n ...(zdrEnabled ? { id: functionCallIds?.[toolCall.id] } : {}),\n })\n )\n );\n }\n\n const toolOutputs =\n ((responseMetadata.output as Array<ResponsesInputItem> | undefined)\n ?.length ?? 0) > 0\n ? responseMetadata.output\n : additional_kwargs.tool_outputs;\n\n const fallthroughCallTypes: ResponsesInputItem['type'][] = [\n 'computer_call',\n /** @ts-ignore */\n 'mcp_call',\n /** @ts-ignore */\n 'code_interpreter_call',\n /** @ts-ignore */\n 'image_generation_call',\n ];\n\n if (toolOutputs != null) {\n const castToolOutputs = toolOutputs as Array<ResponsesInputItem>;\n const fallthroughCalls = castToolOutputs.filter((item) =>\n fallthroughCallTypes.includes(item.type)\n );\n if (fallthroughCalls.length > 0) input.push(...fallthroughCalls);\n }\n\n return input;\n }\n\n if (role === 'user' || role === 'system' || role === 'developer') {\n if (typeof lcMsg.content === 'string') {\n return { type: 'message', role, content: lcMsg.content };\n }\n\n const messages: ResponsesInputItem[] = [];\n const content = (lcMsg.content as MessageContentComplex[]).flatMap(\n (item) => {\n if (item.type === 'mcp_approval_response') {\n const approvalResponse = item as MessageContentComplex & {\n approval_request_id: string;\n approve: boolean;\n };\n messages.push({\n // @ts-ignore\n type: 'mcp_approval_response',\n approval_request_id: approvalResponse.approval_request_id,\n approve: approvalResponse.approve,\n });\n }\n if (isDataContentBlock(item)) {\n return convertToProviderContentBlock(\n item,\n completionsApiContentBlockConverter\n );\n }\n if (item.type === 'text') {\n return {\n type: 'input_text',\n text: item.text,\n };\n }\n if (item.type === 'image_url') {\n const imageItem = item as MessageContentImageUrl;\n return {\n type: 'input_image',\n image_url:\n typeof imageItem.image_url === 'string'\n ? imageItem.image_url\n : imageItem.image_url.url,\n detail:\n typeof imageItem.image_url === 'string'\n ? 'auto'\n : imageItem.image_url.detail,\n };\n }\n if (\n item.type === 'input_text' ||\n item.type === 'input_image' ||\n item.type === 'input_file'\n ) {\n return item;\n }\n return [];\n }\n );\n\n if (content.length > 0) {\n messages.push({\n type: 'message',\n role,\n content,\n } as ResponsesInputItem);\n }\n return messages;\n }\n\n console.warn(\n `Unsupported role found when converting to OpenAI Responses API: ${role}`\n );\n return [];\n }\n );\n}\n\nexport function isReasoningModel(model?: string) {\n return model != null && model !== '' && /\\b(o\\d|gpt-[5-9])\\b/i.test(model);\n}\n\nfunction _convertOpenAIResponsesMessageToBaseMessage(\n response: ResponsesCreateInvoke | ResponsesParseInvoke\n): BaseMessage {\n if (response.error) {\n // TODO: add support for `addLangChainErrorFields`\n const error = new Error(response.error.message);\n error.name = response.error.code;\n throw error;\n }\n\n let messageId: string | undefined;\n const content: MessageContentComplex[] = [];\n const tool_calls: ToolCall[] = [];\n const invalid_tool_calls: InvalidToolCall[] = [];\n const response_metadata: Record<string, unknown> = {\n model: response.model,\n created_at: response.created_at,\n id: response.id,\n incomplete_details: response.incomplete_details,\n metadata: response.metadata,\n object: response.object,\n status: response.status,\n user: response.user,\n service_tier: response.service_tier,\n\n // for compatibility with chat completion calls.\n model_name: response.model,\n };\n\n const additional_kwargs: {\n [key: string]: unknown;\n refusal?: string;\n reasoning?: OpenAIClient.Responses.ResponseReasoningItem;\n tool_outputs?: unknown[];\n parsed?: unknown;\n [_FUNCTION_CALL_IDS_MAP_KEY]?: Record<string, string>;\n } = {};\n\n for (const item of response.output) {\n if (item.type === 'message') {\n messageId = item.id;\n content.push(\n ...item.content.flatMap((part) => {\n if (part.type === 'output_text') {\n if ('parsed' in part && part.parsed != null) {\n additional_kwargs.parsed = part.parsed;\n }\n return {\n type: 'text',\n text: part.text,\n annotations: part.annotations,\n };\n }\n\n if (part.type === 'refusal') {\n additional_kwargs.refusal = part.refusal;\n return [];\n }\n\n return part;\n })\n );\n } else if (item.type === 'function_call') {\n const fnAdapter = {\n function: { name: item.name, arguments: item.arguments },\n id: item.call_id,\n };\n\n try {\n tool_calls.push(parseToolCall(fnAdapter, { returnId: true }));\n } catch (e: unknown) {\n let errMessage: string | undefined;\n if (\n typeof e === 'object' &&\n e != null &&\n 'message' in e &&\n typeof e.message === 'string'\n ) {\n errMessage = e.message;\n }\n invalid_tool_calls.push(makeInvalidToolCall(fnAdapter, errMessage));\n }\n\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] ??= {};\n if (item.id) {\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY][item.call_id] = item.id;\n }\n } else if (item.type === 'reasoning') {\n additional_kwargs.reasoning = item;\n } else {\n additional_kwargs.tool_outputs ??= [];\n additional_kwargs.tool_outputs.push(item);\n }\n }\n\n return new AIMessage({\n id: messageId,\n content: toLangChainContent(content),\n tool_calls,\n invalid_tool_calls,\n usage_metadata: response.usage,\n additional_kwargs,\n response_metadata,\n });\n}\n\nexport function _convertOpenAIResponsesDeltaToBaseMessageChunk(\n chunk: ResponseReturnStreamEvents\n) {\n const content: MessageContentComplex[] = [];\n let generationInfo: Record<string, unknown> = {};\n let usage_metadata: UsageMetadata | undefined;\n const tool_call_chunks: ToolCallChunk[] = [];\n const response_metadata: Record<string, unknown> = {};\n const additional_kwargs: {\n [key: string]: unknown;\n reasoning?: Partial<ChatOpenAIReasoningSummary>;\n tool_outputs?: unknown[];\n } = {};\n let id: string | undefined;\n if (chunk.type === 'response.output_text.delta') {\n content.push({\n type: 'text',\n text: chunk.delta,\n index: chunk.content_index,\n });\n /** @ts-ignore */\n } else if (chunk.type === 'response.output_text_annotation.added') {\n content.push({\n type: 'text',\n text: '',\n /** @ts-ignore */\n annotations: [chunk.annotation],\n /** @ts-ignore */\n index: chunk.content_index,\n });\n } else if (\n chunk.type === 'response.output_item.added' &&\n chunk.item.type === 'message'\n ) {\n id = chunk.item.id;\n } else if (\n chunk.type === 'response.output_item.added' &&\n chunk.item.type === 'function_call'\n ) {\n response_metadata[STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY] =\n OPENAI_RESPONSES_STREAMED_TOOL_CALL_ADAPTER;\n tool_call_chunks.push({\n type: 'tool_call_chunk',\n name: chunk.item.name,\n args: chunk.item.arguments,\n id: chunk.item.call_id,\n index: chunk.output_index,\n });\n\n additional_kwargs[_FUNCTION_CALL_IDS_MAP_KEY] = {\n [chunk.item.call_id]: chunk.item.id,\n };\n } else if (\n chunk.type === 'response.output_item.done' &&\n [\n 'web_search_call',\n 'file_search_call',\n 'computer_call',\n 'code_interpreter_call',\n 'mcp_call',\n 'mcp_list_tools',\n 'mcp_approval_request',\n 'image_generation_call',\n ].includes(chunk.item.type)\n ) {\n additional_kwargs.tool_outputs = [chunk.item];\n } else if (chunk.type === 'response.created') {\n response_metadata.id = chunk.response.id;\n response_metadata.model_name = chunk.response.model;\n response_metadata.model = chunk.response.model;\n } else if (chunk.type === 'response.completed') {\n const msg = _convertOpenAIResponsesMessageToBaseMessage(chunk.response);\n\n usage_metadata = chunk.response.usage;\n if (chunk.response.text?.format?.type === 'json_schema') {\n additional_kwargs.parsed ??= JSON.parse(msg.text);\n }\n for (const [key, value] of Object.entries(chunk.response)) {\n if (key !== 'id') response_metadata[key] = value;\n }\n } else if (chunk.type === 'response.function_call_arguments.delta') {\n response_metadata[STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY] =\n OPENAI_RESPONSES_STREAMED_TOOL_CALL_ADAPTER;\n tool_call_chunks.push({\n type: 'tool_call_chunk',\n args: chunk.delta,\n index: chunk.output_index,\n });\n } else if (chunk.type === 'response.function_call_arguments.done') {\n response_metadata[STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY] =\n OPENAI_RESPONSES_STREAMED_TOOL_CALL_ADAPTER;\n response_metadata[STREAMED_TOOL_CALL_SEAL_METADATA_KEY] = {\n kind: 'single',\n index: chunk.output_index,\n };\n tool_call_chunks.push({\n type: 'tool_call_chunk',\n name: chunk.name,\n args: chunk.arguments,\n index: chunk.output_index,\n });\n } else if (\n chunk.type === 'response.web_search_call.completed' ||\n chunk.type === 'response.file_search_call.completed'\n ) {\n generationInfo = {\n tool_outputs: {\n id: chunk.item_id,\n type: chunk.type.replace('response.', '').replace('.completed', ''),\n status: 'completed',\n },\n };\n } else if (chunk.type === 'response.refusal.done') {\n additional_kwargs.refusal = chunk.refusal;\n } else if (\n chunk.type === 'response.output_item.added' &&\n 'item' in chunk &&\n chunk.item.type === 'reasoning'\n ) {\n const summary: ChatOpenAIReasoningSummary['summary'] | undefined = chunk\n .item.summary\n ? chunk.item.summary.map((s, index) => ({\n ...s,\n index,\n }))\n : undefined;\n\n additional_kwargs.reasoning = {\n // We only capture ID in the first chunk or else the concatenated result of all chunks will\n // have an ID field that is repeated once per chunk. There is special handling for the `type`\n // field that prevents this, however.\n id: chunk.item.id,\n type: chunk.item.type,\n ...(summary ? { summary } : {}),\n };\n } else if (chunk.type === 'response.reasoning_summary_part.added') {\n additional_kwargs.reasoning = {\n type: 'reasoning',\n summary: [{ ...chunk.part, index: chunk.summary_index }],\n };\n } else if (chunk.type === 'response.reasoning_summary_text.delta') {\n additional_kwargs.reasoning = {\n type: 'reasoning',\n summary: [\n { text: chunk.delta, type: 'summary_text', index: chunk.summary_index },\n ],\n };\n /** @ts-ignore */\n } else if (chunk.type === 'response.image_generation_call.partial_image') {\n // noop/fixme: retaining partial images in a message chunk means that _all_\n // partial images get kept in history, so we don't do anything here.\n return null;\n } else {\n return null;\n }\n\n return new ChatGenerationChunk({\n // Legacy reasons, `onLLMNewToken` should pulls this out\n text: content.map((part) => ('text' in part ? part.text : '')).join(''),\n message: new AIMessageChunk({\n id,\n content: toLangChainContent(content),\n tool_call_chunks,\n usage_metadata,\n additional_kwargs,\n response_metadata,\n }),\n generationInfo,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/llm/openai/utils/index.ts"],"mappings":"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"}
@@ -13,7 +13,6 @@ function getReasoningDetails(value) {
13
13
  }
14
14
  var ChatOpenRouter = class extends ChatOpenAI {
15
15
  openRouterReasoning;
16
- /** @deprecated Use `reasoning` object instead */
17
16
  includeReasoning;
18
17
  constructor(_fields) {
19
18
  const fieldsWithoutPromptCache = { ..._fields };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/llm/openrouter/index.ts"],"sourcesContent":["import type {\n ChatOpenAICallOptions,\n OpenAIChatInput,\n OpenAIClient,\n} from '@langchain/openai';\nimport type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type { ChatGenerationChunk } from '@langchain/core/outputs';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { SeenScalarMetadata } from '@/llm/openai/streamMetadata';\nimport type { PromptCacheTtl } from '@/messages/cache';\nimport { dropRepeatedScalarMetadata } from '@/llm/openai/streamMetadata';\nimport { ChatOpenAI, emitStreamChunkCallback } from '@/llm/openai';\n\nexport type OpenRouterReasoningEffort =\n | 'xhigh'\n | 'high'\n | 'medium'\n | 'low'\n | 'minimal'\n | 'none';\n\nexport interface OpenRouterReasoning {\n effort?: OpenRouterReasoningEffort;\n max_tokens?: number;\n exclude?: boolean;\n enabled?: boolean;\n}\n\nexport interface ChatOpenRouterCallOptions\n extends Omit<ChatOpenAICallOptions, 'reasoning'> {\n /** @deprecated Use `reasoning` object instead */\n include_reasoning?: boolean;\n reasoning?: OpenRouterReasoning;\n modelKwargs?: OpenAIChatInput['modelKwargs'];\n useResponsesApi?: boolean;\n promptCache?: boolean;\n /**\n * Prompt-cache breakpoint TTL. Defaults to `'1h'` (extended cache) when\n * `promptCache` is enabled; set `'5m'` for the legacy 5-minute behavior.\n * OpenRouter forwards this to Claude upstreams (Anthropic / Bedrock / Vertex),\n * which downgrade to 5m where the extended TTL isn't supported.\n */\n promptCacheTtl?: PromptCacheTtl;\n}\n\nexport type ChatOpenRouterInput = Partial<\n ChatOpenRouterCallOptions & OpenAIChatInput\n> & {\n /** Minimum delay in ms between visible streamed deltas (default 25; 0 disables). */\n _lc_stream_delay?: number;\n};\n\n/** invocationParams return type extended with OpenRouter reasoning */\nexport type OpenRouterInvocationParams = Omit<\n OpenAIClient.Chat.ChatCompletionCreateParams,\n 'messages'\n> & {\n reasoning?: OpenRouterReasoning;\n cache_control?: { type: 'ephemeral'; ttl?: '1h' };\n};\n\ntype InvocationParamsExtra = {\n streaming?: boolean;\n};\n\ninterface OpenRouterReasoningTextDetail {\n type: 'reasoning.text';\n text?: string;\n format?: string;\n index?: number;\n}\n\ninterface OpenRouterReasoningEncryptedDetail {\n type: 'reasoning.encrypted';\n id?: string;\n data?: string;\n format?: string;\n index?: number;\n}\n\ntype OpenRouterReasoningDetail =\n | OpenRouterReasoningTextDetail\n | OpenRouterReasoningEncryptedDetail;\n\nfunction isReasoningTextDetail(\n value: unknown\n): value is OpenRouterReasoningTextDetail {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n value.type === 'reasoning.text'\n );\n}\n\nfunction isReasoningEncryptedDetail(\n value: unknown\n): value is OpenRouterReasoningEncryptedDetail {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n value.type === 'reasoning.encrypted'\n );\n}\n\nfunction getReasoningDetails(value: unknown): OpenRouterReasoningDetail[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter(\n (detail): detail is OpenRouterReasoningDetail =>\n isReasoningTextDetail(detail) || isReasoningEncryptedDetail(detail)\n );\n}\n\nexport class ChatOpenRouter extends ChatOpenAI {\n private openRouterReasoning?: OpenRouterReasoning;\n /** @deprecated Use `reasoning` object instead */\n private includeReasoning?: boolean;\n\n constructor(_fields: ChatOpenRouterInput) {\n const fieldsWithoutPromptCache: ChatOpenRouterInput = { ..._fields };\n delete fieldsWithoutPromptCache.promptCache;\n delete fieldsWithoutPromptCache.promptCacheTtl;\n\n const {\n include_reasoning,\n reasoning: openRouterReasoning,\n modelKwargs = {},\n ...fields\n } = fieldsWithoutPromptCache;\n\n // Extract reasoning from modelKwargs if provided there (e.g., from LLMConfig)\n const { reasoning: mkReasoning, ...restModelKwargs } = modelKwargs as {\n reasoning?: OpenRouterReasoning;\n } & Record<string, unknown>;\n const mergedReasoning =\n mkReasoning != null || openRouterReasoning != null\n ? {\n ...mkReasoning,\n ...openRouterReasoning,\n }\n : undefined;\n const runtimeReasoning =\n mergedReasoning ??\n (include_reasoning === true ? { enabled: true } : undefined);\n const parentModelKwargs =\n runtimeReasoning == null\n ? restModelKwargs\n : { ...restModelKwargs, reasoning: runtimeReasoning };\n\n super({\n ...fields,\n modelKwargs: parentModelKwargs,\n includeReasoningDetails: true,\n convertReasoningDetailsToContent: true,\n preserveToolCacheControl: true,\n responsesPromptCache: _fields.promptCache,\n responsesPromptCacheTtl: _fields.promptCacheTtl,\n });\n\n // Merge reasoning config: modelKwargs.reasoning < constructor reasoning\n if (mergedReasoning != null) {\n this.openRouterReasoning = mergedReasoning;\n }\n\n this.includeReasoning = include_reasoning;\n }\n static lc_name(): 'LibreChatOpenRouter' {\n return 'LibreChatOpenRouter';\n }\n\n // OpenRouter widens OpenAI reasoning with extra effort levels ('xhigh' | 'none' | 'minimal').\n override invocationParams(\n options?: this['ParsedCallOptions'],\n extra?: InvocationParamsExtra\n ): OpenRouterInvocationParams {\n type MutableParams = Omit<\n OpenAIClient.Chat.ChatCompletionCreateParams,\n 'messages'\n > & {\n reasoning_effort?: string;\n reasoning?: OpenRouterReasoning;\n cache_control?: { type: 'ephemeral'; ttl?: '1h' };\n };\n\n const optionsWithDefaults = this._combineCallOptions(options);\n const useResponsesApi = this._useResponsesApi(options);\n const params = (\n useResponsesApi\n ? this.responses.invocationParams(optionsWithDefaults)\n : this.completions.invocationParams(optionsWithDefaults, extra)\n ) as MutableParams;\n\n // Remove the OpenAI-native reasoning_effort that the parent sets;\n // OpenRouter uses a `reasoning` object instead\n delete params.reasoning_effort;\n\n // Build the OpenRouter reasoning config\n const reasoning = this.buildOpenRouterReasoning(optionsWithDefaults);\n if (reasoning != null) {\n params.reasoning = reasoning;\n } else {\n delete params.reasoning;\n }\n\n return params;\n }\n\n private buildOpenRouterReasoning(\n options?: this['ParsedCallOptions']\n ): OpenRouterReasoning | undefined {\n let reasoning: OpenRouterReasoning | undefined;\n\n // 1. Instance-level reasoning config (from constructor)\n if (this.openRouterReasoning != null) {\n reasoning = { ...this.openRouterReasoning };\n }\n\n // 2. LangChain-style reasoning params (from parent's `this.reasoning`)\n const lcReasoning = this.getReasoningParams(options);\n if (lcReasoning?.effort != null) {\n reasoning = {\n ...reasoning,\n effort: lcReasoning.effort as OpenRouterReasoningEffort,\n };\n }\n\n // 3. Call-level reasoning override\n const callReasoning = (options as ChatOpenRouterCallOptions | undefined)\n ?.reasoning;\n if (callReasoning != null) {\n reasoning = { ...reasoning, ...callReasoning };\n }\n\n // 4. Legacy include_reasoning backward compatibility\n if (reasoning == null && this.includeReasoning === true) {\n reasoning = { enabled: true };\n }\n\n return reasoning;\n }\n\n override async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const reasoningTextByIndex = new Map<\n number,\n OpenRouterReasoningTextDetail\n >();\n const reasoningEncryptedById = new Map<\n string,\n OpenRouterReasoningEncryptedDetail\n >();\n // Consume the raw (un-deduped) stream so `finish_reason` survives as the\n // reasoning-flush signal below; de-duplicate after that, before emitting.\n const seenScalarMetadata: SeenScalarMetadata = new Map();\n\n for await (const generationChunk of super._streamRawResponseChunks(\n messages,\n options,\n undefined\n )) {\n let currentReasoningText = '';\n const reasoningDetails = getReasoningDetails(\n generationChunk.message.additional_kwargs.reasoning_details\n );\n\n for (const detail of reasoningDetails) {\n if (detail.type === 'reasoning.text') {\n currentReasoningText += detail.text ?? '';\n const index = detail.index ?? 0;\n const existing = reasoningTextByIndex.get(index);\n if (existing != null) {\n existing.text = `${existing.text ?? ''}${detail.text ?? ''}`;\n continue;\n }\n reasoningTextByIndex.set(index, {\n ...detail,\n text: detail.text ?? '',\n });\n continue;\n }\n if (detail.id != null) {\n reasoningEncryptedById.set(detail.id, { ...detail });\n }\n }\n\n if (\n currentReasoningText.length > 0 &&\n generationChunk.message.additional_kwargs.reasoning == null\n ) {\n generationChunk.message.additional_kwargs.reasoning =\n currentReasoningText;\n }\n\n if (generationChunk.generationInfo?.finish_reason != null) {\n const finalReasoningDetails = [\n ...reasoningTextByIndex.values(),\n ...reasoningEncryptedById.values(),\n ];\n if (finalReasoningDetails.length > 0) {\n generationChunk.message.additional_kwargs.reasoning_details =\n finalReasoningDetails;\n } else {\n delete generationChunk.message.additional_kwargs.reasoning_details;\n }\n } else {\n delete generationChunk.message.additional_kwargs.reasoning_details;\n }\n\n dropRepeatedScalarMetadata(generationChunk, seenScalarMetadata);\n await emitStreamChunkCallback(generationChunk, runManager);\n yield generationChunk;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/llm/openrouter/index.ts"],"mappings":"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"}
@@ -23,12 +23,6 @@ function markCacheControl(tool, ttl) {
23
23
  cache_control: buildAnthropicCacheControl(ttl)
24
24
  };
25
25
  }
26
- /**
27
- * Drop any existing `cache_control` from a tool. Reused/caller-supplied tools
28
- * can carry a stale marker (e.g. from a prior `promptCacheTtl: '5m'` run); since
29
- * all tools serialize before system/messages, a leftover 5-minute marker ahead
30
- * of the resolved breakpoint would violate the longer-TTL-first ordering.
31
- */
32
26
  function stripCacheControl(tool) {
33
27
  if (tool.cache_control == null) return tool;
34
28
  const { cache_control: _omit, ...rest } = tool;
@@ -1 +1 @@
1
- {"version":3,"file":"toolCache.mjs","names":[],"sources":["../../../../src/llm/openrouter/toolCache.ts"],"sourcesContent":["import type { BindToolsInput } from '@langchain/core/language_models/chat_models';\nimport type { OpenAIClient } from '@langchain/openai';\nimport type { GraphTools } from '@/types';\nimport {\n buildAnthropicCacheControl,\n type PromptCacheTtl,\n} from '@/messages/cache';\nimport { _convertToOpenAITool } from '@/llm/openai';\n\ntype OpenRouterCacheControl = { type: 'ephemeral'; ttl?: '1h' };\n\ntype OpenRouterToolWithCacheControl = OpenAIClient.ChatCompletionTool & {\n cache_control?: OpenRouterCacheControl;\n defer_loading?: boolean;\n};\n\ntype ToolNameCandidate = {\n name?: unknown;\n function?: {\n name?: unknown;\n };\n defer_loading?: unknown;\n};\n\nfunction getToolName(tool: unknown): string | undefined {\n const candidate = tool as ToolNameCandidate;\n if (typeof candidate.name === 'string') {\n return candidate.name;\n }\n if (typeof candidate.function?.name === 'string') {\n return candidate.function.name;\n }\n return undefined;\n}\n\nfunction hasDeferredMarker(tool: unknown): boolean {\n return (tool as ToolNameCandidate).defer_loading === true;\n}\n\nfunction toOpenRouterTool(tool: unknown): OpenRouterToolWithCacheControl {\n const converted = _convertToOpenAITool(\n tool as BindToolsInput\n ) as OpenRouterToolWithCacheControl;\n\n if (hasDeferredMarker(tool)) {\n return { ...converted, defer_loading: true };\n }\n\n return converted;\n}\n\nfunction markCacheControl(\n tool: OpenRouterToolWithCacheControl,\n ttl?: PromptCacheTtl\n): OpenRouterToolWithCacheControl {\n return {\n ...tool,\n cache_control: buildAnthropicCacheControl(ttl),\n };\n}\n\n/**\n * Drop any existing `cache_control` from a tool. Reused/caller-supplied tools\n * can carry a stale marker (e.g. from a prior `promptCacheTtl: '5m'` run); since\n * all tools serialize before system/messages, a leftover 5-minute marker ahead\n * of the resolved breakpoint would violate the longer-TTL-first ordering.\n */\nfunction stripCacheControl(\n tool: OpenRouterToolWithCacheControl\n): OpenRouterToolWithCacheControl {\n if (tool.cache_control == null) {\n return tool;\n }\n const { cache_control: _omit, ...rest } = tool;\n return rest;\n}\n\nexport function partitionAndMarkOpenRouterToolCache(\n tools: GraphTools | undefined,\n isDeferred: (toolName: string) => boolean,\n ttl?: PromptCacheTtl\n): GraphTools | undefined {\n if (tools == null || tools.length === 0) {\n return tools;\n }\n\n const staticTools: OpenRouterToolWithCacheControl[] = [];\n const deferredTools: OpenRouterToolWithCacheControl[] = [];\n\n for (const tool of tools as readonly unknown[]) {\n const converted = toOpenRouterTool(tool);\n const name = getToolName(converted) ?? getToolName(tool);\n\n if (name != null && isDeferred(name)) {\n deferredTools.push(converted);\n continue;\n }\n\n staticTools.push(converted);\n }\n\n // Deferred tools sit after the breakpoint but still before system/messages,\n // so strip any stale marker off them.\n for (let i = 0; i < deferredTools.length; i++) {\n deferredTools[i] = stripCacheControl(deferredTools[i]);\n }\n\n if (staticTools.length === 0) {\n return [...deferredTools] as GraphTools;\n }\n\n // Strip stale markers off the earlier static tools, then stamp only the last\n // static tool with the resolved TTL (markCacheControl overwrites any marker).\n for (let i = 0; i < staticTools.length - 1; i++) {\n staticTools[i] = stripCacheControl(staticTools[i]);\n }\n staticTools[staticTools.length - 1] = markCacheControl(\n staticTools[staticTools.length - 1],\n ttl\n );\n\n return [...staticTools, ...deferredTools] as GraphTools;\n}\n"],"mappings":";;;AAwBA,SAAS,YAAY,MAAmC;CACtD,MAAM,YAAY;CAClB,IAAI,OAAO,UAAU,SAAS,UAC5B,OAAO,UAAU;CAEnB,IAAI,OAAO,UAAU,UAAU,SAAS,UACtC,OAAO,UAAU,SAAS;AAG9B;AAEA,SAAS,kBAAkB,MAAwB;CACjD,OAAQ,KAA2B,kBAAkB;AACvD;AAEA,SAAS,iBAAiB,MAA+C;CACvE,MAAM,YAAY,qBAChB,IACF;CAEA,IAAI,kBAAkB,IAAI,GACxB,OAAO;EAAE,GAAG;EAAW,eAAe;CAAK;CAG7C,OAAO;AACT;AAEA,SAAS,iBACP,MACA,KACgC;CAChC,OAAO;EACL,GAAG;EACH,eAAe,2BAA2B,GAAG;CAC/C;AACF;;;;;;;AAQA,SAAS,kBACP,MACgC;CAChC,IAAI,KAAK,iBAAiB,MACxB,OAAO;CAET,MAAM,EAAE,eAAe,OAAO,GAAG,SAAS;CAC1C,OAAO;AACT;AAEA,SAAgB,oCACd,OACA,YACA,KACwB;CACxB,IAAI,SAAS,QAAQ,MAAM,WAAW,GACpC,OAAO;CAGT,MAAM,cAAgD,CAAC;CACvD,MAAM,gBAAkD,CAAC;CAEzD,KAAK,MAAM,QAAQ,OAA6B;EAC9C,MAAM,YAAY,iBAAiB,IAAI;EACvC,MAAM,OAAO,YAAY,SAAS,KAAK,YAAY,IAAI;EAEvD,IAAI,QAAQ,QAAQ,WAAW,IAAI,GAAG;GACpC,cAAc,KAAK,SAAS;GAC5B;EACF;EAEA,YAAY,KAAK,SAAS;CAC5B;CAIA,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KACxC,cAAc,KAAK,kBAAkB,cAAc,EAAE;CAGvD,IAAI,YAAY,WAAW,GACzB,OAAO,CAAC,GAAG,aAAa;CAK1B,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,SAAS,GAAG,KAC1C,YAAY,KAAK,kBAAkB,YAAY,EAAE;CAEnD,YAAY,YAAY,SAAS,KAAK,iBACpC,YAAY,YAAY,SAAS,IACjC,GACF;CAEA,OAAO,CAAC,GAAG,aAAa,GAAG,aAAa;AAC1C"}
1
+ {"version":3,"file":"toolCache.mjs","names":[],"sources":["../../../../src/llm/openrouter/toolCache.ts"],"mappings":";;;AAwBA,SAAS,YAAY,MAAmC;CACtD,MAAM,YAAY;CAClB,IAAI,OAAO,UAAU,SAAS,UAC5B,OAAO,UAAU;CAEnB,IAAI,OAAO,UAAU,UAAU,SAAS,UACtC,OAAO,UAAU,SAAS;AAG9B;AAEA,SAAS,kBAAkB,MAAwB;CACjD,OAAQ,KAA2B,kBAAkB;AACvD;AAEA,SAAS,iBAAiB,MAA+C;CACvE,MAAM,YAAY,qBAChB,IACF;CAEA,IAAI,kBAAkB,IAAI,GACxB,OAAO;EAAE,GAAG;EAAW,eAAe;CAAK;CAG7C,OAAO;AACT;AAEA,SAAS,iBACP,MACA,KACgC;CAChC,OAAO;EACL,GAAG;EACH,eAAe,2BAA2B,GAAG;CAC/C;AACF;AAQA,SAAS,kBACP,MACgC;CAChC,IAAI,KAAK,iBAAiB,MACxB,OAAO;CAET,MAAM,EAAE,eAAe,OAAO,GAAG,SAAS;CAC1C,OAAO;AACT;AAEA,SAAgB,oCACd,OACA,YACA,KACwB;CACxB,IAAI,SAAS,QAAQ,MAAM,WAAW,GACpC,OAAO;CAGT,MAAM,cAAgD,CAAC;CACvD,MAAM,gBAAkD,CAAC;CAEzD,KAAK,MAAM,QAAQ,OAA6B;EAC9C,MAAM,YAAY,iBAAiB,IAAI;EACvC,MAAM,OAAO,YAAY,SAAS,KAAK,YAAY,IAAI;EAEvD,IAAI,QAAQ,QAAQ,WAAW,IAAI,GAAG;GACpC,cAAc,KAAK,SAAS;GAC5B;EACF;EAEA,YAAY,KAAK,SAAS;CAC5B;CAIA,KAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KACxC,cAAc,KAAK,kBAAkB,cAAc,EAAE;CAGvD,IAAI,YAAY,WAAW,GACzB,OAAO,CAAC,GAAG,aAAa;CAK1B,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,SAAS,GAAG,KAC1C,YAAY,KAAK,kBAAkB,YAAY,EAAE;CAEnD,YAAY,YAAY,SAAS,KAAK,iBACpC,YAAY,YAAY,SAAS,IACjC,GACF;CAEA,OAAO,CAAC,GAAG,aAAa,GAAG,aAAa;AAC1C"}
@@ -2,29 +2,11 @@ import "../common/constants.mjs";
2
2
  import "../common/enum.mjs";
3
3
  import "../common/index.mjs";
4
4
  //#region src/llm/preempt.ts
5
- /**
6
- * Normalizes a host-supplied seal budget.
7
- *
8
- * Read in two places that interpret it differently — a numeric comparison in
9
- * the seal gate and an addition into the recursion limit — so a value like
10
- * `1.5` would permit two seals while reserving fractional headroom, `NaN`
11
- * would poison the recursion limit outright, and `Infinity` would remove both
12
- * bounds at once. Normalizing once keeps the two readings in agreement.
13
- *
14
- * `0` is honored as a deliberate "never seal"; anything not finite falls back
15
- * to the default rather than silently disabling the feature.
16
- */
17
5
  function resolveMaxSeals(maxSeals) {
18
6
  if (maxSeals == null || !Number.isFinite(maxSeals)) return 8;
19
7
  const whole = Math.floor(maxSeals);
20
8
  return whole > 0 ? whole : 0;
21
9
  }
22
- /**
23
- * True when the accumulated content carries at least one non-whitespace text
24
- * block. `thinking` / `reasoning` blocks deliberately do not count: they are
25
- * stripped or signed on several providers and cannot stand in for the visible
26
- * assistant turn a sealed sequence needs.
27
- */
28
10
  function hasNonEmptyTextContent(content) {
29
11
  if (typeof content === "string") return content.trim() !== "";
30
12
  for (const block of content) {
@@ -34,19 +16,6 @@ function hasNonEmptyTextContent(content) {
34
16
  }
35
17
  return false;
36
18
  }
37
- /**
38
- * True while a Gemini server-side tool call is still awaiting its response.
39
- *
40
- * Google's server-side tools (Search, URL context) never populate
41
- * `tool_calls` or `tool_call_chunks` — those are derived from `functionCall`
42
- * parts only, while a server-side invocation arrives as a `toolCall` CONTENT
43
- * block and its result as a later `toolResponse` block. The tool-call gates
44
- * cannot see it, so sealing between the two would replay a model turn holding
45
- * an unanswered server-side call.
46
- *
47
- * Counted rather than id-matched: Google answers calls in order, and counting
48
- * stays correct when a part omits its id.
49
- */
50
19
  function hasOpenGoogleServerToolCall(content) {
51
20
  if (typeof content === "string") return false;
52
21
  let calls = 0;
@@ -55,11 +24,6 @@ function hasOpenGoogleServerToolCall(content) {
55
24
  else if (block.type === "toolResponse") responses += 1;
56
25
  return calls > responses;
57
26
  }
58
- /**
59
- * Ids of Anthropic server-side tool calls whose paired result block is already
60
- * on the accumulated content. Those calls are answered and cannot be orphaned
61
- * by a seal.
62
- */
63
27
  function settledServerToolCallIds(content) {
64
28
  const settled = /* @__PURE__ */ new Set();
65
29
  if (typeof content === "string") return settled;
@@ -70,7 +34,6 @@ function settledServerToolCallIds(content) {
70
34
  }
71
35
  return settled;
72
36
  }
73
- /** Tool calls still awaiting an answer, ignoring ones already settled. */
74
37
  function countOpenToolCalls(calls, settled) {
75
38
  if (calls == null || calls.length === 0) return 0;
76
39
  if (settled.size === 0) return calls.length;
@@ -78,46 +41,8 @@ function countOpenToolCalls(calls, settled) {
78
41
  for (const call of calls) if (call.id == null || !settled.has(call.id)) open += 1;
79
42
  return open;
80
43
  }
81
- /**
82
- * Cooperative mid-generation seal gate. Returns true ONLY when sealing here
83
- * yields a message sequence valid on EVERY supported provider:
84
- * - non-whitespace TEXT content, so the FIRST injected user turn is preceded
85
- * by a non-empty assistant turn — no empty-content 400s. Note this says
86
- * nothing about adjacency AMONG several injected turns: a boundary that
87
- * drains two steers emits two consecutive user messages, which strict
88
- * providers reject. That is normalized at the provider-facing hop by
89
- * `coalesceAdjacentUserTurns`, not here;
90
- * - no tool call in flight, so no `tool_use` can be orphaned AND no eagerly
91
- * prestarted execution can be stripped out from under the model.
92
- *
93
- * Anthropic's server-side tools need no check of their own. Every
94
- * `server_tool_use` content block also emits a `tool_call_chunk`
95
- * (`_makeMessageChunkFromAnthropicEvent`), and `concat` keeps that chunk on
96
- * the accumulated message for the remainder of the turn, so the tool-call
97
- * gates below already cover it. The practical consequence is worth stating
98
- * plainly: once a turn starts a web search it is no longer preemptible, and
99
- * a queued message waits for the ordinary tool boundary instead.
100
- *
101
- * Nothing is stripped and nothing is repaired: when the accumulated shape is
102
- * not already safe the stream simply runs on, and whatever the host queued
103
- * lands at the next tool boundary instead. Chunks accumulate monotonically
104
- * through `concat`, so an unsafe shape can never be observed at a seal point.
105
- */
106
44
  function canSealPreempt(chunk) {
107
45
  if (chunk == null) return false;
108
- /**
109
- * Anthropic's server-side tools run inside the provider, so unlike a client
110
- * tool they never reach `ToolNode` and never produce a `PostToolBatch`
111
- * boundary. `concat` also keeps their `server_tool_use` chunk on the
112
- * accumulated message for the rest of the turn. Together that means a naive
113
- * tool-call gate makes a turn permanently unsealable the moment a web
114
- * search starts, with no later boundary to drain into — the queued message
115
- * waits for the whole turn to finish rather than for the next tool step.
116
- *
117
- * So calls whose paired result block has already landed are treated as
118
- * settled: they cannot be orphaned, because the provider has already
119
- * answered them.
120
- */
121
46
  const settled = settledServerToolCallIds(chunk.content);
122
47
  if (countOpenToolCalls(chunk.tool_calls, settled) > 0) return false;
123
48
  if (countOpenToolCalls(chunk.tool_call_chunks, settled) > 0) return false;
@@ -1 +1 @@
1
- {"version":3,"file":"preempt.mjs","names":[],"sources":["../../../src/llm/preempt.ts"],"sourcesContent":["// src/llm/preempt.ts\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport { ContentTypes, DEFAULT_MAX_SEALS } from '@/common';\n\n/**\n * Normalizes a host-supplied seal budget.\n *\n * Read in two places that interpret it differently — a numeric comparison in\n * the seal gate and an addition into the recursion limit — so a value like\n * `1.5` would permit two seals while reserving fractional headroom, `NaN`\n * would poison the recursion limit outright, and `Infinity` would remove both\n * bounds at once. Normalizing once keeps the two readings in agreement.\n *\n * `0` is honored as a deliberate \"never seal\"; anything not finite falls back\n * to the default rather than silently disabling the feature.\n */\nexport function resolveMaxSeals(maxSeals: number | undefined): number {\n if (maxSeals == null || !Number.isFinite(maxSeals)) {\n return DEFAULT_MAX_SEALS;\n }\n const whole = Math.floor(maxSeals);\n return whole > 0 ? whole : 0;\n}\n\n/**\n * True when the accumulated content carries at least one non-whitespace text\n * block. `thinking` / `reasoning` blocks deliberately do not count: they are\n * stripped or signed on several providers and cannot stand in for the visible\n * assistant turn a sealed sequence needs.\n */\nfunction hasNonEmptyTextContent(content: AIMessageChunk['content']): boolean {\n if (typeof content === 'string') {\n return content.trim() !== '';\n }\n for (const block of content) {\n if (block.type !== ContentTypes.TEXT) {\n continue;\n }\n const text = block[ContentTypes.TEXT];\n if (typeof text === 'string' && text.trim() !== '') {\n return true;\n }\n }\n return false;\n}\n\n/**\n * True while a Gemini server-side tool call is still awaiting its response.\n *\n * Google's server-side tools (Search, URL context) never populate\n * `tool_calls` or `tool_call_chunks` — those are derived from `functionCall`\n * parts only, while a server-side invocation arrives as a `toolCall` CONTENT\n * block and its result as a later `toolResponse` block. The tool-call gates\n * cannot see it, so sealing between the two would replay a model turn holding\n * an unanswered server-side call.\n *\n * Counted rather than id-matched: Google answers calls in order, and counting\n * stays correct when a part omits its id.\n */\nfunction hasOpenGoogleServerToolCall(\n content: AIMessageChunk['content']\n): boolean {\n if (typeof content === 'string') {\n return false;\n }\n let calls = 0;\n let responses = 0;\n for (const block of content) {\n if (block.type === 'toolCall') {\n calls += 1;\n } else if (block.type === 'toolResponse') {\n responses += 1;\n }\n }\n return calls > responses;\n}\n\n/**\n * Ids of Anthropic server-side tool calls whose paired result block is already\n * on the accumulated content. Those calls are answered and cannot be orphaned\n * by a seal.\n */\nfunction settledServerToolCallIds(\n content: AIMessageChunk['content']\n): Set<string> {\n const settled = new Set<string>();\n if (typeof content === 'string') {\n return settled;\n }\n for (const block of content) {\n if (block.type !== 'web_search_tool_result') {\n continue;\n }\n const id = block.tool_use_id;\n if (typeof id === 'string') {\n settled.add(id);\n }\n }\n return settled;\n}\n\n/** Tool calls still awaiting an answer, ignoring ones already settled. */\nfunction countOpenToolCalls(\n calls: ReadonlyArray<{ id?: string }> | undefined,\n settled: Set<string>\n): number {\n if (calls == null || calls.length === 0) {\n return 0;\n }\n if (settled.size === 0) {\n return calls.length;\n }\n let open = 0;\n for (const call of calls) {\n if (call.id == null || !settled.has(call.id)) {\n open += 1;\n }\n }\n return open;\n}\n\n/**\n * Cooperative mid-generation seal gate. Returns true ONLY when sealing here\n * yields a message sequence valid on EVERY supported provider:\n * - non-whitespace TEXT content, so the FIRST injected user turn is preceded\n * by a non-empty assistant turn — no empty-content 400s. Note this says\n * nothing about adjacency AMONG several injected turns: a boundary that\n * drains two steers emits two consecutive user messages, which strict\n * providers reject. That is normalized at the provider-facing hop by\n * `coalesceAdjacentUserTurns`, not here;\n * - no tool call in flight, so no `tool_use` can be orphaned AND no eagerly\n * prestarted execution can be stripped out from under the model.\n *\n * Anthropic's server-side tools need no check of their own. Every\n * `server_tool_use` content block also emits a `tool_call_chunk`\n * (`_makeMessageChunkFromAnthropicEvent`), and `concat` keeps that chunk on\n * the accumulated message for the remainder of the turn, so the tool-call\n * gates below already cover it. The practical consequence is worth stating\n * plainly: once a turn starts a web search it is no longer preemptible, and\n * a queued message waits for the ordinary tool boundary instead.\n *\n * Nothing is stripped and nothing is repaired: when the accumulated shape is\n * not already safe the stream simply runs on, and whatever the host queued\n * lands at the next tool boundary instead. Chunks accumulate monotonically\n * through `concat`, so an unsafe shape can never be observed at a seal point.\n */\nexport function canSealPreempt(chunk: AIMessageChunk | undefined): boolean {\n if (chunk == null) {\n return false;\n }\n /**\n * Anthropic's server-side tools run inside the provider, so unlike a client\n * tool they never reach `ToolNode` and never produce a `PostToolBatch`\n * boundary. `concat` also keeps their `server_tool_use` chunk on the\n * accumulated message for the rest of the turn. Together that means a naive\n * tool-call gate makes a turn permanently unsealable the moment a web\n * search starts, with no later boundary to drain into — the queued message\n * waits for the whole turn to finish rather than for the next tool step.\n *\n * So calls whose paired result block has already landed are treated as\n * settled: they cannot be orphaned, because the provider has already\n * answered them.\n */\n const settled = settledServerToolCallIds(chunk.content);\n if (countOpenToolCalls(chunk.tool_calls, settled) > 0) {\n return false;\n }\n if (countOpenToolCalls(chunk.tool_call_chunks, settled) > 0) {\n return false;\n }\n if ((chunk.invalid_tool_calls?.length ?? 0) > 0) {\n return false;\n }\n if (hasOpenGoogleServerToolCall(chunk.content)) {\n return false;\n }\n return hasNonEmptyTextContent(chunk.content);\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,SAAgB,gBAAgB,UAAsC;CACpE,IAAI,YAAY,QAAQ,CAAC,OAAO,SAAS,QAAQ,GAC/C,OAAA;CAEF,MAAM,QAAQ,KAAK,MAAM,QAAQ;CACjC,OAAO,QAAQ,IAAI,QAAQ;AAC7B;;;;;;;AAQA,SAAS,uBAAuB,SAA6C;CAC3E,IAAI,OAAO,YAAY,UACrB,OAAO,QAAQ,KAAK,MAAM;CAE5B,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,MAAM,SAAA,QACR;EAEF,MAAM,OAAO,MAAA;EACb,IAAI,OAAO,SAAS,YAAY,KAAK,KAAK,MAAM,IAC9C,OAAO;CAEX;CACA,OAAO;AACT;;;;;;;;;;;;;;AAeA,SAAS,4BACP,SACS;CACT,IAAI,OAAO,YAAY,UACrB,OAAO;CAET,IAAI,QAAQ;CACZ,IAAI,YAAY;CAChB,KAAK,MAAM,SAAS,SAClB,IAAI,MAAM,SAAS,YACjB,SAAS;MACJ,IAAI,MAAM,SAAS,gBACxB,aAAa;CAGjB,OAAO,QAAQ;AACjB;;;;;;AAOA,SAAS,yBACP,SACa;CACb,MAAM,0BAAU,IAAI,IAAY;CAChC,IAAI,OAAO,YAAY,UACrB,OAAO;CAET,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,MAAM,SAAS,0BACjB;EAEF,MAAM,KAAK,MAAM;EACjB,IAAI,OAAO,OAAO,UAChB,QAAQ,IAAI,EAAE;CAElB;CACA,OAAO;AACT;;AAGA,SAAS,mBACP,OACA,SACQ;CACR,IAAI,SAAS,QAAQ,MAAM,WAAW,GACpC,OAAO;CAET,IAAI,QAAQ,SAAS,GACnB,OAAO,MAAM;CAEf,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,OACjB,IAAI,KAAK,MAAM,QAAQ,CAAC,QAAQ,IAAI,KAAK,EAAE,GACzC,QAAQ;CAGZ,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,eAAe,OAA4C;CACzE,IAAI,SAAS,MACX,OAAO;;;;;;;;;;;;;;CAeT,MAAM,UAAU,yBAAyB,MAAM,OAAO;CACtD,IAAI,mBAAmB,MAAM,YAAY,OAAO,IAAI,GAClD,OAAO;CAET,IAAI,mBAAmB,MAAM,kBAAkB,OAAO,IAAI,GACxD,OAAO;CAET,KAAK,MAAM,oBAAoB,UAAU,KAAK,GAC5C,OAAO;CAET,IAAI,4BAA4B,MAAM,OAAO,GAC3C,OAAO;CAET,OAAO,uBAAuB,MAAM,OAAO;AAC7C"}
1
+ {"version":3,"file":"preempt.mjs","names":[],"sources":["../../../src/llm/preempt.ts"],"mappings":";;;;AAgBA,SAAgB,gBAAgB,UAAsC;CACpE,IAAI,YAAY,QAAQ,CAAC,OAAO,SAAS,QAAQ,GAC/C,OAAA;CAEF,MAAM,QAAQ,KAAK,MAAM,QAAQ;CACjC,OAAO,QAAQ,IAAI,QAAQ;AAC7B;AAQA,SAAS,uBAAuB,SAA6C;CAC3E,IAAI,OAAO,YAAY,UACrB,OAAO,QAAQ,KAAK,MAAM;CAE5B,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,MAAM,SAAA,QACR;EAEF,MAAM,OAAO,MAAA;EACb,IAAI,OAAO,SAAS,YAAY,KAAK,KAAK,MAAM,IAC9C,OAAO;CAEX;CACA,OAAO;AACT;AAeA,SAAS,4BACP,SACS;CACT,IAAI,OAAO,YAAY,UACrB,OAAO;CAET,IAAI,QAAQ;CACZ,IAAI,YAAY;CAChB,KAAK,MAAM,SAAS,SAClB,IAAI,MAAM,SAAS,YACjB,SAAS;MACJ,IAAI,MAAM,SAAS,gBACxB,aAAa;CAGjB,OAAO,QAAQ;AACjB;AAOA,SAAS,yBACP,SACa;CACb,MAAM,0BAAU,IAAI,IAAY;CAChC,IAAI,OAAO,YAAY,UACrB,OAAO;CAET,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,MAAM,SAAS,0BACjB;EAEF,MAAM,KAAK,MAAM;EACjB,IAAI,OAAO,OAAO,UAChB,QAAQ,IAAI,EAAE;CAElB;CACA,OAAO;AACT;AAGA,SAAS,mBACP,OACA,SACQ;CACR,IAAI,SAAS,QAAQ,MAAM,WAAW,GACpC,OAAO;CAET,IAAI,QAAQ,SAAS,GACnB,OAAO,MAAM;CAEf,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,OACjB,IAAI,KAAK,MAAM,QAAQ,CAAC,QAAQ,IAAI,KAAK,EAAE,GACzC,QAAQ;CAGZ,OAAO;AACT;AA2BA,SAAgB,eAAe,OAA4C;CACzE,IAAI,SAAS,MACX,OAAO;CAeT,MAAM,UAAU,yBAAyB,MAAM,OAAO;CACtD,IAAI,mBAAmB,MAAM,YAAY,OAAO,IAAI,GAClD,OAAO;CAET,IAAI,mBAAmB,MAAM,kBAAkB,OAAO,IAAI,GACxD,OAAO;CAET,KAAK,MAAM,oBAAoB,UAAU,KAAK,GAC5C,OAAO;CAET,IAAI,4BAA4B,MAAM,OAAO,GAC3C,OAAO;CAET,OAAO,uBAAuB,MAAM,OAAO;AAC7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"providers.mjs","names":[],"sources":["../../../src/llm/providers.ts"],"sourcesContent":["// src/llm/providers.ts\nimport { CustomChatMistralAI } from '@/llm/mistral';\nimport type {\n ChatModelConstructorMap,\n ProviderOptionsMap,\n ChatModelMap,\n} from '@/types';\nimport {\n AzureChatOpenAI,\n ChatDeepSeek,\n ChatMoonshot,\n ChatOpenAI,\n ChatXAI,\n} from '@/llm/openai';\nimport { CustomChatGoogleGenerativeAI } from '@/llm/google';\nimport { CustomChatBedrockConverse } from '@/llm/bedrock';\nimport { CustomAnthropic } from '@/llm/anthropic';\nimport { ChatOpenRouter } from '@/llm/openrouter';\nimport { ChatVertexAI } from '@/llm/vertexai';\nimport { Providers } from '@/common';\n\nexport const llmProviders: Partial<ChatModelConstructorMap> = {\n [Providers.XAI]: ChatXAI,\n [Providers.OPENAI]: ChatOpenAI,\n [Providers.AZURE]: AzureChatOpenAI,\n [Providers.VERTEXAI]: ChatVertexAI,\n [Providers.DEEPSEEK]: ChatDeepSeek,\n [Providers.MISTRALAI]: CustomChatMistralAI,\n [Providers.MISTRAL]: CustomChatMistralAI,\n [Providers.ANTHROPIC]: CustomAnthropic,\n [Providers.OPENROUTER]: ChatOpenRouter,\n [Providers.BEDROCK]: CustomChatBedrockConverse,\n // [Providers.ANTHROPIC]: ChatAnthropic,\n [Providers.GOOGLE]: CustomChatGoogleGenerativeAI,\n [Providers.MOONSHOT]: ChatMoonshot,\n};\n\nexport const manualToolStreamProviders = new Set<Providers | string>([\n Providers.ANTHROPIC,\n Providers.BEDROCK,\n]);\n\nexport const getChatModelClass = <P extends Providers>(\n provider: P\n): new (config: ProviderOptionsMap[P]) => ChatModelMap[P] => {\n const ChatModelClass = llmProviders[provider];\n if (!ChatModelClass) {\n throw new Error(`Unsupported LLM provider: ${provider}`);\n }\n\n return ChatModelClass;\n};\n"],"mappings":";;;;;;;;;;AAqBA,MAAa,eAAiD;UAC3C;aACG;kBACD;eACG;eACA;gBACC;cACF;gBACE;iBACC;cACH;aAED;eACE;AACxB;AAEA,MAAa,4BAA4B,IAAI,IAAwB,CAAA,aAAA,SAGrE,CAAC;AAED,MAAa,qBACX,aAC2D;CAC3D,MAAM,iBAAiB,aAAa;CACpC,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,6BAA6B,UAAU;CAGzD,OAAO;AACT"}
1
+ {"version":3,"file":"providers.mjs","names":[],"sources":["../../../src/llm/providers.ts"],"mappings":";;;;;;;;;;AAqBA,MAAa,eAAiD;UAC3C;aACG;kBACD;eACG;eACA;gBACC;cACF;gBACE;iBACC;cACH;aAED;eACE;AACxB;AAEA,MAAa,4BAA4B,IAAI,IAAwB,CAAA,aAAA,SAGrE,CAAC;AAED,MAAa,qBACX,aAC2D;CAC3D,MAAM,iBAAiB,aAAa;CACpC,IAAI,CAAC,gBACH,MAAM,IAAI,MAAM,6BAA6B,UAAU;CAGzD,OAAO;AACT"}
@@ -1,11 +1,6 @@
1
1
  import "../common/enum.mjs";
2
2
  import "../common/index.mjs";
3
3
  //#region src/llm/request.ts
4
- /**
5
- * Returns true when the provider + clientOptions indicate extended thinking
6
- * is enabled. Works across Anthropic (direct), Bedrock (additionalModelRequestFields),
7
- * and OpenAI-compat (modelKwargs.thinking).
8
- */
9
4
  function isThinkingEnabled(provider, clientOptions) {
10
5
  if (!clientOptions) return false;
11
6
  if (provider === "anthropic" && clientOptions.thinking != null) return true;
@@ -13,11 +8,6 @@ function isThinkingEnabled(provider, clientOptions) {
13
8
  if (provider === "openAI" && (clientOptions.modelKwargs?.thinking)?.type === "enabled") return true;
14
9
  return false;
15
10
  }
16
- /**
17
- * Returns the correct key for setting max output tokens on the model
18
- * constructor options. Google/Vertex use `maxOutputTokens`, all others
19
- * use `maxTokens`.
20
- */
21
11
  function getMaxOutputTokensKey(provider) {
22
12
  return provider === "google" || provider === "vertexai" ? "maxOutputTokens" : "maxTokens";
23
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"request.mjs","names":[],"sources":["../../../src/llm/request.ts"],"sourcesContent":["import type * as t from '@/types';\nimport { Providers } from '@/common';\n\n/**\n * Returns true when the provider + clientOptions indicate extended thinking\n * is enabled. Works across Anthropic (direct), Bedrock (additionalModelRequestFields),\n * and OpenAI-compat (modelKwargs.thinking).\n */\nexport function isThinkingEnabled(\n provider: Providers,\n clientOptions?: t.ClientOptions\n): boolean {\n if (!clientOptions) return false;\n\n if (\n provider === Providers.ANTHROPIC &&\n (clientOptions as t.AnthropicClientOptions).thinking != null\n ) {\n return true;\n }\n\n if (\n provider === Providers.BEDROCK &&\n (clientOptions as t.BedrockAnthropicInput).additionalModelRequestFields?.[\n 'thinking'\n ] != null\n ) {\n return true;\n }\n\n if (\n provider === Providers.OPENAI &&\n (\n (clientOptions as t.OpenAIClientOptions).modelKwargs\n ?.thinking as t.AnthropicClientOptions['thinking']\n )?.type === 'enabled'\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Returns the correct key for setting max output tokens on the model\n * constructor options. Google/Vertex use `maxOutputTokens`, all others\n * use `maxTokens`.\n */\nexport function getMaxOutputTokensKey(\n provider: Providers | string\n): 'maxOutputTokens' | 'maxTokens' {\n return provider === Providers.GOOGLE || provider === Providers.VERTEXAI\n ? 'maxOutputTokens'\n : 'maxTokens';\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,kBACd,UACA,eACS;CACT,IAAI,CAAC,eAAe,OAAO;CAE3B,IACE,aAAA,eACC,cAA2C,YAAY,MAExD,OAAO;CAGT,IACE,aAAA,aACC,cAA0C,+BACzC,eACG,MAEL,OAAO;CAGT,IACE,aAAA,aAEG,cAAwC,aACrC,SAAA,EACH,SAAS,WAEZ,OAAO;CAGT,OAAO;AACT;;;;;;AAOA,SAAgB,sBACd,UACiC;CACjC,OAAO,aAAA,YAAiC,aAAA,aACpC,oBACA;AACN"}
1
+ {"version":3,"file":"request.mjs","names":[],"sources":["../../../src/llm/request.ts"],"mappings":";;;AAQA,SAAgB,kBACd,UACA,eACS;CACT,IAAI,CAAC,eAAe,OAAO;CAE3B,IACE,aAAA,eACC,cAA2C,YAAY,MAExD,OAAO;CAGT,IACE,aAAA,aACC,cAA0C,+BACzC,eACG,MAEL,OAAO;CAGT,IACE,aAAA,aAEG,cAAwC,aACrC,SAAA,EACH,SAAS,WAEZ,OAAO;CAGT,OAAO;AACT;AAOA,SAAgB,sBACd,UACiC;CACjC,OAAO,aAAA,YAAiC,aAAA,aACpC,oBACA;AACN"}
@@ -2,14 +2,6 @@ import { smoothStream } from "./smoother.mjs";
2
2
  import { AIMessageChunk } from "@langchain/core/messages";
3
3
  import { ChatGenerationChunk } from "@langchain/core/outputs";
4
4
  //#region src/llm/stream/chunkAdapters.ts
5
- /**
6
- * Rebuilds a generation chunk carrying one piece of a split plain-text chunk.
7
- * Unsplit pieces return the original chunk untouched, so disabled smoothing is
8
- * byte-identical to no smoothing. Usage metadata, additional kwargs and
9
- * response metadata survive only on the first piece: the aggregator merges
10
- * dicts by concatenating string fields, so replicating them across pieces
11
- * would duplicate reasoning text and scalar metadata once per piece.
12
- */
13
5
  function cloneGenerationChunkPiece(chunk, piece) {
14
6
  if (piece.isFirst && piece.isLast) return chunk;
15
7
  const message = chunk.message;
@@ -29,15 +21,6 @@ const SPLITTABLE_TEXT_PART_KEYS = new Set([
29
21
  "text",
30
22
  "index"
31
23
  ]);
32
- /**
33
- * Returns the sole plain text part of a single-element complex content array
34
- * (the shape google-common emits for text deltas), or null when the part
35
- * carries anything beyond `type`/`text`/`index` (thought signatures, media,
36
- * function calls) and must not be sliced. The part must carry a numeric
37
- * `index`: it is the aggregator's list-merge key, and without it each split
38
- * piece would append as a separate content part instead of merging back
39
- * into one — index-less parts pace whole instead.
40
- */
41
24
  function getSplittableTextPart(message, chunkText) {
42
25
  const content = message.content;
43
26
  if (!Array.isArray(content) || content.length !== 1) return null;
@@ -64,25 +47,6 @@ function clonePartGenerationChunkPiece(chunk, part, piece) {
64
47
  }))
65
48
  });
66
49
  }
67
- /**
68
- * Provider-agnostic classification of a `ChatGenerationChunk` for the
69
- * smoothing engine:
70
- * - splittable: plain visible text — string content equal to `chunk.text`, or
71
- * a single plain text part (google-common's delta shape) — with no
72
- * logprobs / finish_reason; sliced adaptively at the pacing cadence.
73
- * - atomic: any other text-bearing chunk (complex content arrays, logprobs,
74
- * finish_reason, provider-specific reasoning payloads surfaced via
75
- * `getAtomicText`) — paced as one piece, never split.
76
- * - passthrough: tool-call deltas, usage-only and metadata chunks — strict
77
- * FIFO, zero delay.
78
- */
79
- /**
80
- * google-common stamps `logprobs: { content: [] }` on every chunk, so only
81
- * logprobs that actually carry data may block splitting here. This is looser
82
- * than the OpenAI-family adapter in `llm/openai/index.ts`, which treats ANY
83
- * logprobs as atomic (its providers only attach logprobs when requested, and
84
- * the DeepSeek suite pins that contract) — do not unify the two predicates.
85
- */
86
50
  function hasMeaningfulLogprobs(generationInfo) {
87
51
  const logprobs = generationInfo?.logprobs;
88
52
  if (logprobs == null) return false;
@@ -90,23 +54,9 @@ function hasMeaningfulLogprobs(generationInfo) {
90
54
  if (Array.isArray(content)) return content.length > 0;
91
55
  return true;
92
56
  }
93
- /** google-common reports the terminal reason camelCase (`finishReason`). */
94
57
  function hasFinishReason(generationInfo) {
95
58
  return generationInfo?.finish_reason != null || generationInfo?.finishReason != null;
96
59
  }
97
- /**
98
- * Chunks that pair visible text with reasoning payloads in
99
- * `additional_kwargs` (Gemini thought summaries, reasoning_content deltas,
100
- * OpenRouter reasoning_details) must pace whole: split pieces would each
101
- * carry the same kwargs and downstream merging — the aggregator's dict merge
102
- * or OpenRouter's reasoning_details accumulation — duplicates them once per
103
- * piece.
104
- */
105
- /**
106
- * Mixed text/tool-call deltas must never split: cloned pieces would each
107
- * carry the same tool_call_chunks and downstream accumulation would corrupt
108
- * the assembled tool arguments.
109
- */
110
60
  function hasToolCallChunks(message) {
111
61
  return (message.tool_call_chunks?.length ?? 0) > 0;
112
62
  }
@@ -116,12 +66,6 @@ function hasReasoningKwargs(message) {
116
66
  if (Array.isArray(kwargs.reasoning_details) && kwargs.reasoning_details.length > 0) return true;
117
67
  return kwargs.reasoning != null;
118
68
  }
119
- /**
120
- * Extracts the visible reasoning text a kwargs-borne delta contributes, so
121
- * reasoning-only chunks (Gemini thoughts, DeepSeek reasoning_content,
122
- * OpenAI reasoning summaries, OpenRouter reasoning_details) pace atomically
123
- * at the cadence instead of passing through unsmoothed.
124
- */
125
69
  function getReasoningKwargsText(message) {
126
70
  const kwargs = message.additional_kwargs;
127
71
  if (typeof kwargs.reasoning_content === "string" && kwargs.reasoning_content !== "") return kwargs.reasoning_content;
@@ -170,12 +114,6 @@ function toGenerationSmoothItem(chunk, getAtomicText) {
170
114
  emit: () => chunk
171
115
  };
172
116
  }
173
- /**
174
- * Wraps a provider's raw chunk stream with adaptive smoothing and per-piece
175
- * `handleLLMNewToken` dispatch. The raw stream must NOT dispatch runManager
176
- * callbacks itself — callback-echo consumers would otherwise observe the
177
- * unsmoothed deltas.
178
- */
179
117
  async function* smoothGenerationChunks({ chunks, delayMs, signal, runManager }) {
180
118
  const source = (async function* () {
181
119
  for await (const chunk of chunks) yield toGenerationSmoothItem(chunk, getReasoningKwargsText);
@@ -1 +1 @@
1
- {"version":3,"file":"chunkAdapters.mjs","names":[],"sources":["../../../../src/llm/stream/chunkAdapters.ts"],"sourcesContent":["import { AIMessageChunk } from '@langchain/core/messages';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type { SmoothItem, SmoothPiece } from '@/llm/stream/smoother';\nimport { smoothStream } from '@/llm/stream/smoother';\n\n/**\n * Rebuilds a generation chunk carrying one piece of a split plain-text chunk.\n * Unsplit pieces return the original chunk untouched, so disabled smoothing is\n * byte-identical to no smoothing. Usage metadata, additional kwargs and\n * response metadata survive only on the first piece: the aggregator merges\n * dicts by concatenating string fields, so replicating them across pieces\n * would duplicate reasoning text and scalar metadata once per piece.\n */\nexport function cloneGenerationChunkPiece(\n chunk: ChatGenerationChunk,\n piece: SmoothPiece\n): ChatGenerationChunk {\n if (piece.isFirst && piece.isLast) {\n return chunk;\n }\n const message = chunk.message as AIMessageChunk;\n return new ChatGenerationChunk({\n text: piece.text,\n generationInfo: piece.isFirst ? chunk.generationInfo : undefined,\n message: new AIMessageChunk(\n Object.assign({}, message, {\n content: piece.text,\n usage_metadata: piece.isFirst ? message.usage_metadata : undefined,\n additional_kwargs: piece.isFirst ? message.additional_kwargs : {},\n response_metadata: piece.isFirst ? message.response_metadata : {},\n })\n ),\n });\n}\n\nconst SPLITTABLE_TEXT_PART_KEYS: ReadonlySet<string> = new Set([\n 'type',\n 'text',\n 'index',\n]);\n\n/**\n * Returns the sole plain text part of a single-element complex content array\n * (the shape google-common emits for text deltas), or null when the part\n * carries anything beyond `type`/`text`/`index` (thought signatures, media,\n * function calls) and must not be sliced. The part must carry a numeric\n * `index`: it is the aggregator's list-merge key, and without it each split\n * piece would append as a separate content part instead of merging back\n * into one — index-less parts pace whole instead.\n */\nfunction getSplittableTextPart(\n message: AIMessageChunk,\n chunkText: string\n): Record<string, unknown> | null {\n const content = message.content;\n if (!Array.isArray(content) || content.length !== 1) {\n return null;\n }\n const part: unknown = content[0];\n if (part == null || typeof part !== 'object') {\n return null;\n }\n const record = part as Record<string, unknown>;\n if (typeof record.text !== 'string' || record.text !== chunkText) {\n return null;\n }\n if (record.type != null && record.type !== 'text') {\n return null;\n }\n if (typeof record.index !== 'number') {\n return null;\n }\n if (!Object.keys(record).every((key) => SPLITTABLE_TEXT_PART_KEYS.has(key))) {\n return null;\n }\n return record;\n}\n\nfunction clonePartGenerationChunkPiece(\n chunk: ChatGenerationChunk,\n part: Record<string, unknown>,\n piece: SmoothPiece\n): ChatGenerationChunk {\n if (piece.isFirst && piece.isLast) {\n return chunk;\n }\n const message = chunk.message as AIMessageChunk;\n return new ChatGenerationChunk({\n text: piece.text,\n generationInfo: piece.isFirst ? chunk.generationInfo : undefined,\n message: new AIMessageChunk(\n Object.assign({}, message, {\n content: [Object.assign({}, part, { text: piece.text })],\n usage_metadata: piece.isFirst ? message.usage_metadata : undefined,\n additional_kwargs: piece.isFirst ? message.additional_kwargs : {},\n response_metadata: piece.isFirst ? message.response_metadata : {},\n })\n ),\n });\n}\n\n/**\n * Provider-agnostic classification of a `ChatGenerationChunk` for the\n * smoothing engine:\n * - splittable: plain visible text — string content equal to `chunk.text`, or\n * a single plain text part (google-common's delta shape) — with no\n * logprobs / finish_reason; sliced adaptively at the pacing cadence.\n * - atomic: any other text-bearing chunk (complex content arrays, logprobs,\n * finish_reason, provider-specific reasoning payloads surfaced via\n * `getAtomicText`) — paced as one piece, never split.\n * - passthrough: tool-call deltas, usage-only and metadata chunks — strict\n * FIFO, zero delay.\n */\n/**\n * google-common stamps `logprobs: { content: [] }` on every chunk, so only\n * logprobs that actually carry data may block splitting here. This is looser\n * than the OpenAI-family adapter in `llm/openai/index.ts`, which treats ANY\n * logprobs as atomic (its providers only attach logprobs when requested, and\n * the DeepSeek suite pins that contract) — do not unify the two predicates.\n */\nfunction hasMeaningfulLogprobs(\n generationInfo: ChatGenerationChunk['generationInfo']\n): boolean {\n const logprobs = generationInfo?.logprobs;\n if (logprobs == null) {\n return false;\n }\n const content = (logprobs as { content?: unknown }).content;\n if (Array.isArray(content)) {\n return content.length > 0;\n }\n return true;\n}\n\n/** google-common reports the terminal reason camelCase (`finishReason`). */\nfunction hasFinishReason(\n generationInfo: ChatGenerationChunk['generationInfo']\n): boolean {\n return (\n generationInfo?.finish_reason != null || generationInfo?.finishReason != null\n );\n}\n\n/**\n * Chunks that pair visible text with reasoning payloads in\n * `additional_kwargs` (Gemini thought summaries, reasoning_content deltas,\n * OpenRouter reasoning_details) must pace whole: split pieces would each\n * carry the same kwargs and downstream merging — the aggregator's dict merge\n * or OpenRouter's reasoning_details accumulation — duplicates them once per\n * piece.\n */\n/**\n * Mixed text/tool-call deltas must never split: cloned pieces would each\n * carry the same tool_call_chunks and downstream accumulation would corrupt\n * the assembled tool arguments.\n */\nexport function hasToolCallChunks(message: AIMessageChunk): boolean {\n return (message.tool_call_chunks?.length ?? 0) > 0;\n}\n\nexport function hasReasoningKwargs(message: AIMessageChunk): boolean {\n const kwargs = message.additional_kwargs;\n if (\n typeof kwargs.reasoning_content === 'string' &&\n kwargs.reasoning_content !== ''\n ) {\n return true;\n }\n if (\n Array.isArray(kwargs.reasoning_details) &&\n kwargs.reasoning_details.length > 0\n ) {\n return true;\n }\n return kwargs.reasoning != null;\n}\n\n/**\n * Extracts the visible reasoning text a kwargs-borne delta contributes, so\n * reasoning-only chunks (Gemini thoughts, DeepSeek reasoning_content,\n * OpenAI reasoning summaries, OpenRouter reasoning_details) pace atomically\n * at the cadence instead of passing through unsmoothed.\n */\nexport function getReasoningKwargsText(message: AIMessageChunk): string {\n const kwargs = message.additional_kwargs;\n if (\n typeof kwargs.reasoning_content === 'string' &&\n kwargs.reasoning_content !== ''\n ) {\n return kwargs.reasoning_content;\n }\n const reasoning = kwargs.reasoning;\n if (typeof reasoning === 'string' && reasoning !== '') {\n return reasoning;\n }\n if (reasoning != null && typeof reasoning === 'object') {\n const summaryText = (\n reasoning as { summary?: { text?: unknown }[] }\n ).summary?.[0]?.text;\n if (typeof summaryText === 'string' && summaryText !== '') {\n return summaryText;\n }\n }\n const details = kwargs.reasoning_details;\n if (Array.isArray(details)) {\n let text = '';\n for (const detail of details) {\n if (detail != null && typeof detail === 'object') {\n const detailText = (detail as { text?: unknown }).text;\n if (typeof detailText === 'string') {\n text += detailText;\n }\n }\n }\n if (text !== '') {\n return text;\n }\n }\n return '';\n}\n\nexport function toGenerationSmoothItem(\n chunk: ChatGenerationChunk,\n getAtomicText?: (message: AIMessageChunk) => string\n): SmoothItem<ChatGenerationChunk> {\n const { message } = chunk;\n const isMessageChunk = message instanceof AIMessageChunk;\n const cleanGenerationInfo =\n !hasMeaningfulLogprobs(chunk.generationInfo) &&\n !hasFinishReason(chunk.generationInfo);\n const splittable =\n Boolean(chunk.text) &&\n isMessageChunk &&\n typeof message.content === 'string' &&\n message.content === chunk.text &&\n cleanGenerationInfo &&\n !hasReasoningKwargs(message) &&\n !hasToolCallChunks(message);\n\n if (splittable) {\n return {\n text: chunk.text,\n smooth: true,\n emit: (piece) => cloneGenerationChunkPiece(chunk, piece),\n };\n }\n\n const splittablePart =\n Boolean(chunk.text) &&\n isMessageChunk &&\n cleanGenerationInfo &&\n !hasReasoningKwargs(message) &&\n !hasToolCallChunks(message)\n ? getSplittableTextPart(message, chunk.text)\n : null;\n if (splittablePart != null) {\n return {\n text: chunk.text,\n smooth: true,\n emit: (piece) =>\n clonePartGenerationChunkPiece(chunk, splittablePart, piece),\n };\n }\n\n const pacedText =\n chunk.text ||\n (isMessageChunk && getAtomicText != null ? getAtomicText(message) : '');\n if (pacedText !== '') {\n return {\n text: pacedText,\n smooth: true,\n atomic: true,\n emit: () => chunk,\n };\n }\n\n return { text: '', smooth: false, emit: () => chunk };\n}\n\n/**\n * Wraps a provider's raw chunk stream with adaptive smoothing and per-piece\n * `handleLLMNewToken` dispatch. The raw stream must NOT dispatch runManager\n * callbacks itself — callback-echo consumers would otherwise observe the\n * unsmoothed deltas.\n */\nexport async function* smoothGenerationChunks({\n chunks,\n delayMs,\n signal,\n runManager,\n}: {\n chunks: AsyncGenerator<ChatGenerationChunk>;\n delayMs: number;\n signal?: AbortSignal;\n runManager?: CallbackManagerForLLMRun;\n}): AsyncGenerator<ChatGenerationChunk> {\n const source = (async function* (): AsyncGenerator<\n SmoothItem<ChatGenerationChunk>\n > {\n for await (const chunk of chunks) {\n yield toGenerationSmoothItem(chunk, getReasoningKwargsText);\n }\n })();\n\n for await (const outputChunk of smoothStream({ source, delayMs, signal })) {\n yield outputChunk;\n await runManager?.handleLLMNewToken(\n outputChunk.text || '',\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: outputChunk }\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chunkAdapters.mjs","names":[],"sources":["../../../../src/llm/stream/chunkAdapters.ts"],"mappings":"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"}