@librechat/agents 3.2.2 → 3.2.31

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 (401) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +3 -2
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/events.cjs.map +1 -1
  4. package/dist/cjs/graphs/Graph.cjs +200 -54
  5. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  6. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  7. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +13 -7
  8. package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
  9. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  10. package/dist/cjs/hooks/types.cjs.map +1 -1
  11. package/dist/cjs/instrumentation.cjs +33 -0
  12. package/dist/cjs/instrumentation.cjs.map +1 -1
  13. package/dist/cjs/langfuse.cjs +17 -1
  14. package/dist/cjs/langfuse.cjs.map +1 -1
  15. package/dist/cjs/langfuseToolOutputTracing.cjs +2 -2
  16. package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
  17. package/dist/cjs/llm/anthropic/index.cjs +1 -1
  18. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  19. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  20. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +1 -1
  21. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  22. package/dist/cjs/llm/bedrock/index.cjs +2 -2
  23. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  24. package/dist/cjs/llm/bedrock/toolCache.cjs +8 -5
  25. package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
  26. package/dist/cjs/llm/fake.cjs +16 -14
  27. package/dist/cjs/llm/fake.cjs.map +1 -1
  28. package/dist/cjs/llm/google/index.cjs +22 -0
  29. package/dist/cjs/llm/google/index.cjs.map +1 -1
  30. package/dist/cjs/llm/google/utils/common.cjs +88 -27
  31. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  32. package/dist/cjs/llm/init.cjs +2 -2
  33. package/dist/cjs/llm/invoke.cjs +108 -11
  34. package/dist/cjs/llm/invoke.cjs.map +1 -1
  35. package/dist/cjs/llm/openai/index.cjs +1 -1
  36. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  37. package/dist/cjs/llm/openai/utils/index.cjs +1 -1
  38. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  39. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  40. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  41. package/dist/cjs/main.cjs +1 -0
  42. package/dist/cjs/main.cjs.map +1 -1
  43. package/dist/cjs/messages/cache.cjs +8 -7
  44. package/dist/cjs/messages/cache.cjs.map +1 -1
  45. package/dist/cjs/messages/content.cjs.map +1 -1
  46. package/dist/cjs/messages/contextPruning.cjs.map +1 -1
  47. package/dist/cjs/messages/format.cjs +124 -17
  48. package/dist/cjs/messages/format.cjs.map +1 -1
  49. package/dist/cjs/messages/prune.cjs.map +1 -1
  50. package/dist/cjs/messages/reducer.cjs +1 -1
  51. package/dist/cjs/messages/reducer.cjs.map +1 -1
  52. package/dist/cjs/messages/tools.cjs +1 -1
  53. package/dist/cjs/messages/tools.cjs.map +1 -1
  54. package/dist/cjs/openai/index.cjs.map +1 -1
  55. package/dist/cjs/responses/index.cjs.map +1 -1
  56. package/dist/cjs/run.cjs +47 -21
  57. package/dist/cjs/run.cjs.map +1 -1
  58. package/dist/cjs/session/AgentSession.cjs +4 -4
  59. package/dist/cjs/session/AgentSession.cjs.map +1 -1
  60. package/dist/cjs/session/JsonlSessionStore.cjs +2 -2
  61. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
  62. package/dist/cjs/session/handlers.cjs +2 -2
  63. package/dist/cjs/session/handlers.cjs.map +1 -1
  64. package/dist/cjs/stream.cjs +248 -25
  65. package/dist/cjs/stream.cjs.map +1 -1
  66. package/dist/cjs/summarization/node.cjs.map +1 -1
  67. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +1 -1
  68. package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
  69. package/dist/cjs/tools/Calculator.cjs +1 -1
  70. package/dist/cjs/tools/Calculator.cjs.map +1 -1
  71. package/dist/cjs/tools/CodeExecutor.cjs +1 -1
  72. package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
  73. package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
  74. package/dist/cjs/tools/ToolNode.cjs +37 -18
  75. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  76. package/dist/cjs/tools/ToolSearch.cjs +1 -1
  77. package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
  78. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +7 -4
  79. package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
  80. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +4 -4
  81. package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
  82. package/dist/cjs/tools/handlers.cjs +2 -1
  83. package/dist/cjs/tools/handlers.cjs.map +1 -1
  84. package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
  85. package/dist/cjs/tools/local/FileCheckpointer.cjs +2 -1
  86. package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
  87. package/dist/cjs/tools/local/LocalCodingTools.cjs +45 -19
  88. package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
  89. package/dist/cjs/tools/local/LocalExecutionEngine.cjs +3 -3
  90. package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
  91. package/dist/cjs/tools/local/LocalExecutionTools.cjs +2 -2
  92. package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
  93. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +4 -3
  94. package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
  95. package/dist/cjs/tools/local/attachments.cjs +0 -5
  96. package/dist/cjs/tools/local/attachments.cjs.map +1 -1
  97. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +4 -4
  98. package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
  99. package/dist/cjs/tools/search/firecrawl.cjs +1 -1
  100. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  101. package/dist/cjs/tools/search/rerankers.cjs +7 -3
  102. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  103. package/dist/cjs/tools/search/tavily-search.cjs +1 -1
  104. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
  105. package/dist/cjs/tools/search/utils.cjs +76 -8
  106. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  107. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -1
  108. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  109. package/dist/cjs/utils/handlers.cjs +1 -1
  110. package/dist/cjs/utils/handlers.cjs.map +1 -1
  111. package/dist/cjs/utils/run.cjs +1 -1
  112. package/dist/cjs/utils/run.cjs.map +1 -1
  113. package/dist/esm/agents/AgentContext.mjs +3 -2
  114. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  115. package/dist/esm/events.mjs.map +1 -1
  116. package/dist/esm/graphs/Graph.mjs +200 -54
  117. package/dist/esm/graphs/Graph.mjs.map +1 -1
  118. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  119. package/dist/esm/hooks/createWorkspacePolicyHook.mjs +13 -7
  120. package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
  121. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  122. package/dist/esm/hooks/types.mjs.map +1 -1
  123. package/dist/esm/instrumentation.mjs +33 -1
  124. package/dist/esm/instrumentation.mjs.map +1 -1
  125. package/dist/esm/langfuse.mjs +17 -2
  126. package/dist/esm/langfuse.mjs.map +1 -1
  127. package/dist/esm/langfuseToolOutputTracing.mjs +2 -2
  128. package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
  129. package/dist/esm/llm/anthropic/index.mjs +1 -1
  130. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  131. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  132. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +1 -1
  133. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  134. package/dist/esm/llm/bedrock/index.mjs +2 -2
  135. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  136. package/dist/esm/llm/bedrock/toolCache.mjs +8 -5
  137. package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
  138. package/dist/esm/llm/fake.mjs +16 -14
  139. package/dist/esm/llm/fake.mjs.map +1 -1
  140. package/dist/esm/llm/google/index.mjs +23 -1
  141. package/dist/esm/llm/google/index.mjs.map +1 -1
  142. package/dist/esm/llm/google/utils/common.mjs +88 -27
  143. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  144. package/dist/esm/llm/init.mjs +2 -2
  145. package/dist/esm/llm/invoke.mjs +104 -7
  146. package/dist/esm/llm/invoke.mjs.map +1 -1
  147. package/dist/esm/llm/openai/index.mjs +1 -1
  148. package/dist/esm/llm/openai/index.mjs.map +1 -1
  149. package/dist/esm/llm/openai/utils/index.mjs +1 -1
  150. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  151. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  152. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  153. package/dist/esm/main.mjs +1 -1
  154. package/dist/esm/messages/cache.mjs +8 -7
  155. package/dist/esm/messages/cache.mjs.map +1 -1
  156. package/dist/esm/messages/content.mjs.map +1 -1
  157. package/dist/esm/messages/contextPruning.mjs.map +1 -1
  158. package/dist/esm/messages/format.mjs +124 -18
  159. package/dist/esm/messages/format.mjs.map +1 -1
  160. package/dist/esm/messages/prune.mjs.map +1 -1
  161. package/dist/esm/messages/reducer.mjs +1 -1
  162. package/dist/esm/messages/reducer.mjs.map +1 -1
  163. package/dist/esm/messages/tools.mjs +1 -1
  164. package/dist/esm/messages/tools.mjs.map +1 -1
  165. package/dist/esm/openai/index.mjs.map +1 -1
  166. package/dist/esm/responses/index.mjs.map +1 -1
  167. package/dist/esm/run.mjs +47 -21
  168. package/dist/esm/run.mjs.map +1 -1
  169. package/dist/esm/session/AgentSession.mjs +4 -4
  170. package/dist/esm/session/AgentSession.mjs.map +1 -1
  171. package/dist/esm/session/JsonlSessionStore.mjs +2 -2
  172. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
  173. package/dist/esm/session/handlers.mjs +2 -2
  174. package/dist/esm/session/handlers.mjs.map +1 -1
  175. package/dist/esm/stream.mjs +248 -25
  176. package/dist/esm/stream.mjs.map +1 -1
  177. package/dist/esm/summarization/node.mjs.map +1 -1
  178. package/dist/esm/tools/BashProgrammaticToolCalling.mjs +1 -1
  179. package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
  180. package/dist/esm/tools/Calculator.mjs +1 -1
  181. package/dist/esm/tools/Calculator.mjs.map +1 -1
  182. package/dist/esm/tools/CodeExecutor.mjs +1 -1
  183. package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
  184. package/dist/esm/tools/SubagentTool.mjs.map +1 -1
  185. package/dist/esm/tools/ToolNode.mjs +37 -18
  186. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  187. package/dist/esm/tools/ToolSearch.mjs +1 -1
  188. package/dist/esm/tools/ToolSearch.mjs.map +1 -1
  189. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +7 -4
  190. package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
  191. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +4 -4
  192. package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
  193. package/dist/esm/tools/handlers.mjs +2 -1
  194. package/dist/esm/tools/handlers.mjs.map +1 -1
  195. package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
  196. package/dist/esm/tools/local/FileCheckpointer.mjs +2 -1
  197. package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
  198. package/dist/esm/tools/local/LocalCodingTools.mjs +45 -19
  199. package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
  200. package/dist/esm/tools/local/LocalExecutionEngine.mjs +3 -3
  201. package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
  202. package/dist/esm/tools/local/LocalExecutionTools.mjs +2 -2
  203. package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
  204. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +4 -3
  205. package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
  206. package/dist/esm/tools/local/attachments.mjs +0 -5
  207. package/dist/esm/tools/local/attachments.mjs.map +1 -1
  208. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +4 -4
  209. package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
  210. package/dist/esm/tools/search/firecrawl.mjs +1 -1
  211. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  212. package/dist/esm/tools/search/rerankers.mjs +8 -4
  213. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  214. package/dist/esm/tools/search/tavily-search.mjs +1 -1
  215. package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
  216. package/dist/esm/tools/search/utils.mjs +76 -9
  217. package/dist/esm/tools/search/utils.mjs.map +1 -1
  218. package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -1
  219. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  220. package/dist/esm/utils/handlers.mjs +1 -1
  221. package/dist/esm/utils/handlers.mjs.map +1 -1
  222. package/dist/esm/utils/run.mjs +1 -1
  223. package/dist/esm/utils/run.mjs.map +1 -1
  224. package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +1 -1
  225. package/dist/types/events.d.ts +1 -1
  226. package/dist/types/graphs/Graph.d.ts +7 -1
  227. package/dist/types/hooks/executeHooks.d.ts +1 -1
  228. package/dist/types/hooks/types.d.ts +5 -0
  229. package/dist/types/instrumentation.d.ts +1 -0
  230. package/dist/types/langfuse.d.ts +4 -0
  231. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +1 -1
  232. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +1 -1
  233. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +2 -2
  234. package/dist/types/llm/bedrock/index.d.ts +2 -2
  235. package/dist/types/llm/fake.d.ts +3 -3
  236. package/dist/types/llm/google/index.d.ts +1 -0
  237. package/dist/types/llm/google/types.d.ts +1 -1
  238. package/dist/types/llm/google/utils/common.d.ts +2 -2
  239. package/dist/types/llm/google/utils/tools.d.ts +1 -1
  240. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +1 -1
  241. package/dist/types/llm/openai/index.d.ts +2 -2
  242. package/dist/types/llm/openai/utils/index.d.ts +1 -1
  243. package/dist/types/llm/openrouter/index.d.ts +4 -4
  244. package/dist/types/messages/contextPruning.d.ts +1 -1
  245. package/dist/types/messages/format.d.ts +9 -4
  246. package/dist/types/messages/prune.d.ts +1 -1
  247. package/dist/types/session/JsonlSessionStore.d.ts +1 -1
  248. package/dist/types/session/handlers.d.ts +1 -1
  249. package/dist/types/session/types.d.ts +1 -1
  250. package/dist/types/summarization/node.d.ts +1 -1
  251. package/dist/types/tools/SubagentTool.d.ts +2 -2
  252. package/dist/types/tools/ToolNode.d.ts +9 -2
  253. package/dist/types/tools/cloudflare/CloudflareSandboxExecutionEngine.d.ts +1 -1
  254. package/dist/types/tools/search/types.d.ts +1 -1
  255. package/dist/types/tools/search/utils.d.ts +11 -0
  256. package/dist/types/types/graph.d.ts +12 -4
  257. package/dist/types/types/llm.d.ts +4 -3
  258. package/dist/types/types/messages.d.ts +1 -1
  259. package/dist/types/types/run.d.ts +6 -6
  260. package/dist/types/types/stream.d.ts +2 -2
  261. package/dist/types/types/tools.d.ts +5 -1
  262. package/dist/types/utils/handlers.d.ts +2 -2
  263. package/dist/types/utils/run.d.ts +1 -1
  264. package/package.json +6 -3
  265. package/src/__tests__/stream.eagerEventExecution.test.ts +543 -6
  266. package/src/agents/AgentContext.ts +2 -2
  267. package/src/agents/__tests__/AgentContext.test.ts +3 -3
  268. package/src/agents/__tests__/promptCacheLiveHelpers.ts +1 -1
  269. package/src/events.ts +1 -1
  270. package/src/graphs/Graph.ts +329 -72
  271. package/src/graphs/MultiAgentGraph.ts +1 -1
  272. package/src/graphs/__tests__/Graph.reasoning.test.ts +919 -6
  273. package/src/graphs/__tests__/MultiAgentGraph.test.ts +1 -1
  274. package/src/graphs/__tests__/composition.smoke.test.ts +1 -1
  275. package/src/hooks/__tests__/HookRegistry.test.ts +1 -1
  276. package/src/hooks/__tests__/compactHooks.test.ts +8 -8
  277. package/src/hooks/__tests__/createWorkspacePolicyHook.test.ts +34 -22
  278. package/src/hooks/__tests__/executeHooks.test.ts +3 -3
  279. package/src/hooks/__tests__/integration.test.ts +3 -3
  280. package/src/hooks/__tests__/toolHooks.test.ts +10 -10
  281. package/src/hooks/createWorkspacePolicyHook.ts +17 -14
  282. package/src/hooks/executeHooks.ts +1 -1
  283. package/src/hooks/types.ts +5 -0
  284. package/src/instrumentation.ts +49 -8
  285. package/src/langfuse.ts +35 -1
  286. package/src/langfuseToolOutputTracing.ts +2 -2
  287. package/src/llm/anthropic/index.ts +1 -1
  288. package/src/llm/anthropic/utils/message_inputs.ts +1 -1
  289. package/src/llm/anthropic/utils/message_outputs.ts +3 -5
  290. package/src/llm/anthropic/utils/output_parsers.ts +5 -5
  291. package/src/llm/bedrock/index.ts +4 -4
  292. package/src/llm/bedrock/toolCache.test.ts +48 -9
  293. package/src/llm/bedrock/toolCache.ts +11 -6
  294. package/src/llm/custom-chat-models.smoke.test.ts +114 -0
  295. package/src/llm/fake.ts +30 -25
  296. package/src/llm/google/index.ts +43 -1
  297. package/src/llm/google/llm.spec.ts +173 -1
  298. package/src/llm/google/types.ts +1 -1
  299. package/src/llm/google/utils/common.ts +154 -45
  300. package/src/llm/google/utils/tools.ts +8 -8
  301. package/src/llm/google/utils/zod_to_genai_parameters.ts +4 -4
  302. package/src/llm/invoke.test.ts +3 -3
  303. package/src/llm/invoke.ts +170 -10
  304. package/src/llm/openai/index.ts +4 -4
  305. package/src/llm/openai/utils/index.ts +14 -14
  306. package/src/llm/openrouter/index.ts +4 -4
  307. package/src/llm/openrouter/reasoning.test.ts +2 -2
  308. package/src/llm/vertexai/fixThoughtSignatures.test.ts +1 -1
  309. package/src/llm/vertexai/index.ts +1 -1
  310. package/src/messages/cache.test.ts +22 -0
  311. package/src/messages/cache.ts +25 -12
  312. package/src/messages/content.ts +1 -1
  313. package/src/messages/contextPruning.ts +1 -1
  314. package/src/messages/format.ts +227 -43
  315. package/src/messages/formatAgentMessages.skills.test.ts +105 -26
  316. package/src/messages/formatAgentMessages.test.ts +841 -10
  317. package/src/messages/labelContentByAgent.test.ts +2 -2
  318. package/src/messages/prune.ts +1 -1
  319. package/src/messages/reducer.ts +1 -1
  320. package/src/messages/tools.ts +1 -1
  321. package/src/openai/__tests__/openai.test.ts +2 -2
  322. package/src/openai/index.ts +1 -1
  323. package/src/responses/__tests__/responses.test.ts +2 -2
  324. package/src/responses/index.ts +1 -1
  325. package/src/run.ts +82 -47
  326. package/src/session/AgentSession.ts +6 -6
  327. package/src/session/JsonlSessionStore.ts +3 -3
  328. package/src/session/__tests__/JsonlSessionStore.test.ts +5 -5
  329. package/src/session/__tests__/handlers.test.ts +2 -2
  330. package/src/session/handlers.ts +5 -5
  331. package/src/session/types.ts +1 -1
  332. package/src/specs/agent-handoffs.test.ts +1 -1
  333. package/src/specs/deterministic-trace-id.test.ts +50 -0
  334. package/src/specs/langfuse-callbacks.test.ts +2 -2
  335. package/src/specs/langfuse-metadata.test.ts +39 -0
  336. package/src/specs/langfuse-tool-output-tracing.test.ts +1 -1
  337. package/src/specs/multi-agent-summarization.test.ts +4 -4
  338. package/src/specs/subagent.test.ts +3 -3
  339. package/src/specs/summarization-unit.test.ts +1 -1
  340. package/src/specs/thinking-handoff.test.ts +1 -1
  341. package/src/splitStream.test.ts +48 -0
  342. package/src/stream.test.ts +53 -3
  343. package/src/stream.ts +450 -39
  344. package/src/summarization/__tests__/aggregator.test.ts +2 -2
  345. package/src/summarization/__tests__/node.test.ts +2 -2
  346. package/src/summarization/node.ts +1 -1
  347. package/src/tools/BashProgrammaticToolCalling.ts +5 -5
  348. package/src/tools/Calculator.ts +1 -1
  349. package/src/tools/CodeExecutor.ts +2 -4
  350. package/src/tools/SubagentTool.ts +2 -2
  351. package/src/tools/ToolNode.ts +37 -16
  352. package/src/tools/ToolSearch.ts +1 -1
  353. package/src/tools/__tests__/CloudflareSandboxExecution.test.ts +4 -4
  354. package/src/tools/__tests__/CodeApiAuthHeaders.test.ts +12 -12
  355. package/src/tools/__tests__/LocalExecutionTools.test.ts +125 -93
  356. package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +29 -5
  357. package/src/tools/__tests__/ReadFile.test.ts +1 -1
  358. package/src/tools/__tests__/SkillTool.test.ts +4 -4
  359. package/src/tools/__tests__/SubagentExecutor.test.ts +17 -13
  360. package/src/tools/__tests__/SubagentTool.test.ts +2 -2
  361. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +1 -1
  362. package/src/tools/__tests__/ToolNode.outputReferences.test.ts +2 -5
  363. package/src/tools/__tests__/ToolNode.session.test.ts +1 -1
  364. package/src/tools/__tests__/ToolSearch.test.ts +1 -1
  365. package/src/tools/__tests__/annotateMessagesForLLM.test.ts +1 -1
  366. package/src/tools/__tests__/directToolHITLResumeScope.test.ts +35 -32
  367. package/src/tools/__tests__/directToolHooks.test.ts +41 -0
  368. package/src/tools/__tests__/handlers.test.ts +2 -2
  369. package/src/tools/__tests__/hitl.test.ts +11 -11
  370. package/src/tools/__tests__/localToolNames.test.ts +8 -6
  371. package/src/tools/__tests__/skillCatalog.test.ts +1 -1
  372. package/src/tools/__tests__/subagentHooks.test.ts +20 -10
  373. package/src/tools/__tests__/workspaceSeam.test.ts +20 -7
  374. package/src/tools/cloudflare/CloudflareSandboxExecutionEngine.ts +9 -6
  375. package/src/tools/cloudflare/CloudflareSandboxTools.ts +19 -19
  376. package/src/tools/handlers.ts +5 -5
  377. package/src/tools/local/CompileCheckTool.ts +4 -7
  378. package/src/tools/local/FileCheckpointer.ts +6 -5
  379. package/src/tools/local/LocalCodingTools.ts +100 -45
  380. package/src/tools/local/LocalExecutionEngine.ts +5 -5
  381. package/src/tools/local/LocalExecutionTools.ts +9 -9
  382. package/src/tools/local/LocalProgrammaticToolCalling.ts +5 -4
  383. package/src/tools/local/attachments.ts +0 -6
  384. package/src/tools/local/resolveLocalExecutionTools.ts +15 -15
  385. package/src/tools/search/firecrawl.ts +1 -1
  386. package/src/tools/search/jina-reranker.test.ts +148 -37
  387. package/src/tools/search/rerankers.ts +14 -4
  388. package/src/tools/search/tavily-search.ts +2 -2
  389. package/src/tools/search/types.ts +1 -1
  390. package/src/tools/search/utils.ts +99 -9
  391. package/src/tools/subagent/SubagentExecutor.ts +12 -6
  392. package/src/types/graph.ts +20 -12
  393. package/src/types/llm.ts +7 -6
  394. package/src/types/messages.ts +1 -1
  395. package/src/types/run.ts +7 -7
  396. package/src/types/stream.ts +2 -2
  397. package/src/types/tools.ts +5 -1
  398. package/src/utils/handlers.ts +2 -2
  399. package/src/utils/llmConfig.ts +1 -1
  400. package/src/utils/logging.ts +20 -10
  401. package/src/utils/run.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"reducer.mjs","sources":["../../../src/messages/reducer.ts"],"sourcesContent":["import {\n BaseMessage,\n RemoveMessage,\n BaseMessageLike,\n coerceMessageLikeToMessage,\n} from '@langchain/core/messages';\nimport { v4 } from 'uuid';\n\nexport const REMOVE_ALL_MESSAGES = '__remove_all__';\n\n/**\n * Creates a message that instructs messagesStateReducer to remove ALL\n * existing messages from state. Messages appearing after this one in\n * the array become the new state.\n *\n * Usage (in a node return value):\n * ```ts\n * return { messages: [createRemoveAllMessage(), ...survivingMessages] };\n * ```\n *\n * This works because the reducer checks for `getType() === 'remove'`\n * with `id === REMOVE_ALL_MESSAGES` and discards everything before it.\n *\n * NOTE: Uses RemoveMessage from @langchain/core with a sentinel id so\n * the reducer can distinguish a \"remove-all\" marker from a single-message\n * removal.\n */\nexport function createRemoveAllMessage(): BaseMessage {\n return new RemoveMessage({ id: REMOVE_ALL_MESSAGES });\n}\n\nexport type Messages =\n | Array<BaseMessage | BaseMessageLike>\n | BaseMessage\n | BaseMessageLike;\n\n/**\n * Prebuilt reducer that combines returned messages.\n * Can handle standard messages and special modifiers like {@link RemoveMessage}\n * instances.\n */\nexport function messagesStateReducer(\n left: Messages,\n right: Messages\n): BaseMessage[] {\n const leftArray = Array.isArray(left) ? left : [left];\n const rightArray = Array.isArray(right) ? right : [right];\n // coerce to message\n const leftMessages = (leftArray as BaseMessageLike[]).map(\n coerceMessageLikeToMessage\n );\n const rightMessages = (rightArray as BaseMessageLike[]).map(\n coerceMessageLikeToMessage\n );\n // assign missing ids\n for (const m of leftMessages) {\n if (m.id === null || m.id === undefined) {\n m.id = v4();\n m.lc_kwargs.id = m.id;\n }\n }\n\n let removeAllIdx: number | undefined;\n for (let i = 0; i < rightMessages.length; i += 1) {\n const m = rightMessages[i];\n if (m.id === null || m.id === undefined) {\n m.id = v4();\n m.lc_kwargs.id = m.id;\n }\n\n if (m.getType() === 'remove' && m.id === REMOVE_ALL_MESSAGES) {\n removeAllIdx = i;\n }\n }\n\n if (removeAllIdx != null) return rightMessages.slice(removeAllIdx + 1);\n\n // merge\n const merged = [...leftMessages];\n const mergedById = new Map(merged.map((m, i) => [m.id, i]));\n const idsToRemove = new Set();\n for (const m of rightMessages) {\n const existingIdx = mergedById.get(m.id);\n if (existingIdx !== undefined) {\n if (m.getType() === 'remove') {\n idsToRemove.add(m.id);\n } else {\n idsToRemove.delete(m.id);\n merged[existingIdx] = m;\n }\n } else {\n if (m.getType() === 'remove') {\n throw new Error(\n `Attempting to delete a message with an ID that doesn't exist ('${m.id}')`\n );\n }\n mergedById.set(m.id, merged.length);\n merged.push(m);\n }\n }\n return merged.filter((m) => !idsToRemove.has(m.id));\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reducer.mjs","sources":["../../../src/messages/reducer.ts"],"sourcesContent":["import { v4 } from 'uuid';\nimport {\n BaseMessage,\n RemoveMessage,\n BaseMessageLike,\n coerceMessageLikeToMessage,\n} from '@langchain/core/messages';\n\nexport const REMOVE_ALL_MESSAGES = '__remove_all__';\n\n/**\n * Creates a message that instructs messagesStateReducer to remove ALL\n * existing messages from state. Messages appearing after this one in\n * the array become the new state.\n *\n * Usage (in a node return value):\n * ```ts\n * return { messages: [createRemoveAllMessage(), ...survivingMessages] };\n * ```\n *\n * This works because the reducer checks for `getType() === 'remove'`\n * with `id === REMOVE_ALL_MESSAGES` and discards everything before it.\n *\n * NOTE: Uses RemoveMessage from @langchain/core with a sentinel id so\n * the reducer can distinguish a \"remove-all\" marker from a single-message\n * removal.\n */\nexport function createRemoveAllMessage(): BaseMessage {\n return new RemoveMessage({ id: REMOVE_ALL_MESSAGES });\n}\n\nexport type Messages =\n | Array<BaseMessage | BaseMessageLike>\n | BaseMessage\n | BaseMessageLike;\n\n/**\n * Prebuilt reducer that combines returned messages.\n * Can handle standard messages and special modifiers like {@link RemoveMessage}\n * instances.\n */\nexport function messagesStateReducer(\n left: Messages,\n right: Messages\n): BaseMessage[] {\n const leftArray = Array.isArray(left) ? left : [left];\n const rightArray = Array.isArray(right) ? right : [right];\n // coerce to message\n const leftMessages = (leftArray as BaseMessageLike[]).map(\n coerceMessageLikeToMessage\n );\n const rightMessages = (rightArray as BaseMessageLike[]).map(\n coerceMessageLikeToMessage\n );\n // assign missing ids\n for (const m of leftMessages) {\n if (m.id === null || m.id === undefined) {\n m.id = v4();\n m.lc_kwargs.id = m.id;\n }\n }\n\n let removeAllIdx: number | undefined;\n for (let i = 0; i < rightMessages.length; i += 1) {\n const m = rightMessages[i];\n if (m.id === null || m.id === undefined) {\n m.id = v4();\n m.lc_kwargs.id = m.id;\n }\n\n if (m.getType() === 'remove' && m.id === REMOVE_ALL_MESSAGES) {\n removeAllIdx = i;\n }\n }\n\n if (removeAllIdx != null) return rightMessages.slice(removeAllIdx + 1);\n\n // merge\n const merged = [...leftMessages];\n const mergedById = new Map(merged.map((m, i) => [m.id, i]));\n const idsToRemove = new Set();\n for (const m of rightMessages) {\n const existingIdx = mergedById.get(m.id);\n if (existingIdx !== undefined) {\n if (m.getType() === 'remove') {\n idsToRemove.add(m.id);\n } else {\n idsToRemove.delete(m.id);\n merged[existingIdx] = m;\n }\n } else {\n if (m.getType() === 'remove') {\n throw new Error(\n `Attempting to delete a message with an ID that doesn't exist ('${m.id}')`\n );\n }\n mergedById.set(m.id, merged.length);\n merged.push(m);\n }\n }\n return merged.filter((m) => !idsToRemove.has(m.id));\n}\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ToolMessage, AIMessageChunk } from '@langchain/core/messages';
2
- import { Constants } from '../common/enum.mjs';
3
2
  import { findLastIndex } from './core.mjs';
3
+ import { Constants } from '../common/enum.mjs';
4
4
 
5
5
  // src/messages/toolDiscovery.ts
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tools.mjs","sources":["../../../src/messages/tools.ts"],"sourcesContent":["// src/messages/toolDiscovery.ts\nimport { AIMessageChunk, ToolMessage } from '@langchain/core/messages';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { Constants } from '@/common';\nimport { findLastIndex } from './core';\n\ntype ToolSearchArtifact = {\n tool_references?: Array<{ tool_name: string }>;\n};\n\n/**\n * Extracts discovered tool names from tool search results in the current turn.\n * Only processes tool search messages after the latest AI message with tool calls.\n *\n * Similar pattern to formatArtifactPayload - finds relevant messages efficiently\n * by identifying the latest AI parent and only processing subsequent tool messages.\n *\n * @param messages - All messages in the conversation\n * @returns Array of discovered tool names (empty if no new discoveries)\n */\nexport function extractToolDiscoveries(messages: BaseMessage[]): string[] {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return [];\n\n // Find the latest AIMessage with tool_calls that this tool message belongs to\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return [];\n\n // Collect tool_call_ids from the AI message\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Only process tool search results after the AI message that belong to this turn\n const discoveredNames: string[] = [];\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (!(msg instanceof ToolMessage)) continue;\n if (msg.name !== Constants.TOOL_SEARCH) continue;\n if (!toolCallIds.has(msg.tool_call_id)) continue;\n\n // This is a tool search result from the current turn\n if (typeof msg.artifact === 'object' && msg.artifact != null) {\n const artifact = msg.artifact as ToolSearchArtifact;\n if (artifact.tool_references && artifact.tool_references.length > 0) {\n for (const ref of artifact.tool_references) {\n discoveredNames.push(ref.tool_name);\n }\n }\n }\n }\n\n return discoveredNames;\n}\n\n/**\n * Checks if the current turn has any tool search results.\n * Quick check to avoid full extraction when not needed.\n */\nexport function hasToolSearchInCurrentTurn(messages: BaseMessage[]): boolean {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return false;\n\n // Find the latest AIMessage with tool_calls\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return false;\n\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Check if any tool search results exist after the AI message\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (\n msg instanceof ToolMessage &&\n msg.name === Constants.TOOL_SEARCH &&\n toolCallIds.has(msg.tool_call_id)\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.mjs","sources":["../../../src/messages/tools.ts"],"sourcesContent":["// src/messages/toolDiscovery.ts\nimport { AIMessageChunk, ToolMessage } from '@langchain/core/messages';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { findLastIndex } from './core';\nimport { Constants } from '@/common';\n\ntype ToolSearchArtifact = {\n tool_references?: Array<{ tool_name: string }>;\n};\n\n/**\n * Extracts discovered tool names from tool search results in the current turn.\n * Only processes tool search messages after the latest AI message with tool calls.\n *\n * Similar pattern to formatArtifactPayload - finds relevant messages efficiently\n * by identifying the latest AI parent and only processing subsequent tool messages.\n *\n * @param messages - All messages in the conversation\n * @returns Array of discovered tool names (empty if no new discoveries)\n */\nexport function extractToolDiscoveries(messages: BaseMessage[]): string[] {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return [];\n\n // Find the latest AIMessage with tool_calls that this tool message belongs to\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return [];\n\n // Collect tool_call_ids from the AI message\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Only process tool search results after the AI message that belong to this turn\n const discoveredNames: string[] = [];\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (!(msg instanceof ToolMessage)) continue;\n if (msg.name !== Constants.TOOL_SEARCH) continue;\n if (!toolCallIds.has(msg.tool_call_id)) continue;\n\n // This is a tool search result from the current turn\n if (typeof msg.artifact === 'object' && msg.artifact != null) {\n const artifact = msg.artifact as ToolSearchArtifact;\n if (artifact.tool_references && artifact.tool_references.length > 0) {\n for (const ref of artifact.tool_references) {\n discoveredNames.push(ref.tool_name);\n }\n }\n }\n }\n\n return discoveredNames;\n}\n\n/**\n * Checks if the current turn has any tool search results.\n * Quick check to avoid full extraction when not needed.\n */\nexport function hasToolSearchInCurrentTurn(messages: BaseMessage[]): boolean {\n const lastMessage = messages[messages.length - 1];\n if (!(lastMessage instanceof ToolMessage)) return false;\n\n // Find the latest AIMessage with tool_calls\n const latestAIParentIndex = findLastIndex(\n messages,\n (msg) =>\n (msg instanceof AIMessageChunk &&\n (msg.tool_calls?.length ?? 0) > 0 &&\n msg.tool_calls?.some((tc) => tc.id === lastMessage.tool_call_id)) ??\n false\n );\n\n if (latestAIParentIndex === -1) return false;\n\n const aiMessage = messages[latestAIParentIndex] as AIMessageChunk;\n const toolCallIds = new Set(aiMessage.tool_calls?.map((tc) => tc.id) ?? []);\n\n // Check if any tool search results exist after the AI message\n for (let i = latestAIParentIndex + 1; i < messages.length; i++) {\n const msg = messages[i];\n if (\n msg instanceof ToolMessage &&\n msg.name === Constants.TOOL_SEARCH &&\n toolCallIds.has(msg.tool_call_id)\n ) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/openai/index.ts"],"sourcesContent":["import { GraphEvents } from '@/common';\nimport type { UsageMetadata } from '@langchain/core/messages';\nimport type * as t from '@/types';\n\nexport interface OpenAICompatibleWriter {\n write(data: string): void | Promise<void>;\n}\n\nexport interface OpenAIResponseContext {\n requestId: string;\n model: string;\n created: number;\n}\n\nexport interface OpenAICompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n}\n\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface OpenAIChatCompletionChunkChoice {\n index: number;\n delta: {\n role?: 'assistant';\n content?: string | null;\n reasoning?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: 'function';\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n };\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n}\n\nexport interface OpenAIChatCompletionChunk {\n id: string;\n object: 'chat.completion.chunk';\n created: number;\n model: string;\n choices: OpenAIChatCompletionChunkChoice[];\n usage?: OpenAICompletionUsage;\n}\n\nexport interface OpenAIStreamTracker {\n hasRole: boolean;\n hasText: boolean;\n hasReasoning: boolean;\n lastChunkKind?: 'text' | 'reasoning' | 'tool_call';\n toolCalls: Map<number, OpenAIToolCall>;\n toolCallsByStep?: Map<string, Map<number, OpenAIToolCall>>;\n usage: {\n promptTokens: number;\n completionTokens: number;\n reasoningTokens: number;\n };\n}\n\nexport interface OpenAIHandlerConfig {\n writer: OpenAICompatibleWriter;\n context: OpenAIResponseContext;\n tracker: OpenAIStreamTracker;\n}\n\ninterface OpenAIToolCallFragment {\n index?: number;\n id?: string;\n name?: string;\n args?: string | object;\n function?: {\n name?: string;\n arguments?: string | object;\n };\n}\n\nexport function createOpenAIStreamTracker(): OpenAIStreamTracker {\n return {\n hasRole: false,\n hasText: false,\n hasReasoning: false,\n toolCalls: new Map(),\n toolCallsByStep: new Map(),\n usage: {\n promptTokens: 0,\n completionTokens: 0,\n reasoningTokens: 0,\n },\n };\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction getReasoningTokenCount(usage: Partial<UsageMetadata>): number {\n return getTokenCount(usage.output_token_details?.reasoning);\n}\n\nfunction getToolCallIndex(\n toolCall: OpenAIToolCallFragment,\n fallbackIndex: number\n): number {\n return typeof toolCall.index === 'number' ? toolCall.index : fallbackIndex;\n}\n\nfunction getToolCallName(toolCall: OpenAIToolCallFragment): string {\n return toolCall.name ?? toolCall.function?.name ?? '';\n}\n\nfunction getToolCallArguments(toolCall: OpenAIToolCallFragment): string {\n const args = toolCall.args ?? toolCall.function?.arguments;\n if (args == null) {\n return '';\n }\n if (typeof args === 'string') {\n return args;\n }\n return JSON.stringify(args);\n}\n\nfunction getStepToolCalls(\n tracker: OpenAIStreamTracker,\n stepId: string\n): Map<number, OpenAIToolCall> {\n const toolCallsByStep = tracker.toolCallsByStep ?? new Map();\n tracker.toolCallsByStep = toolCallsByStep;\n const existing = toolCallsByStep.get(stepId);\n if (existing != null) {\n return existing;\n }\n const stepToolCalls = new Map<number, OpenAIToolCall>();\n toolCallsByStep.set(stepId, stepToolCalls);\n return stepToolCalls;\n}\n\nexport function createChatCompletionChunk(\n context: OpenAIResponseContext,\n delta: OpenAIChatCompletionChunkChoice['delta'],\n finishReason: OpenAIChatCompletionChunkChoice['finish_reason'] = null,\n usage?: OpenAICompletionUsage\n): OpenAIChatCompletionChunk {\n return {\n id: context.requestId,\n object: 'chat.completion.chunk',\n created: context.created,\n model: context.model,\n choices: [{ index: 0, delta, finish_reason: finishReason }],\n ...(usage ? { usage } : {}),\n };\n}\n\nexport function createChatCompletionUsageChunk(\n context: OpenAIResponseContext,\n usage: OpenAICompletionUsage\n): OpenAIChatCompletionChunk {\n return {\n id: context.requestId,\n object: 'chat.completion.chunk',\n created: context.created,\n model: context.model,\n choices: [],\n usage,\n };\n}\n\nexport async function writeOpenAISSE(\n writer: OpenAICompatibleWriter,\n data: OpenAIChatCompletionChunk | '[DONE]'\n): Promise<void> {\n await writer.write(\n `data: ${data === '[DONE]' ? data : JSON.stringify(data)}\\n\\n`\n );\n}\n\nfunction getTextParts(\n data: t.MessageDeltaEvent | t.ReasoningDeltaEvent\n): string[] {\n const parts = data.delta.content ?? [];\n const text: string[] = [];\n for (const part of parts) {\n if ('text' in part && typeof part.text === 'string') {\n text.push(part.text);\n continue;\n }\n if ('think' in part && typeof part.think === 'string') {\n text.push(part.think);\n }\n }\n return text;\n}\n\nasync function emitAssistantRoleChunk(\n config: OpenAIHandlerConfig\n): Promise<void> {\n if (config.tracker.hasRole) {\n return;\n }\n config.tracker.hasRole = true;\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, { role: 'assistant' })\n );\n}\n\nasync function emitToolCallChunk(params: {\n config: OpenAIHandlerConfig;\n stepId: string;\n toolCall: OpenAIToolCallFragment;\n fallbackIndex: number;\n completed: boolean;\n}): Promise<void> {\n const { config, stepId, toolCall, fallbackIndex, completed } = params;\n const index = getToolCallIndex(toolCall, fallbackIndex);\n const stepToolCalls = getStepToolCalls(config.tracker, stepId);\n const existing = stepToolCalls.get(index);\n const current = existing ?? {\n id: toolCall.id ?? '',\n type: 'function' as const,\n function: { name: '', arguments: '' },\n };\n const name = getToolCallName(toolCall);\n const args = getToolCallArguments(toolCall);\n const idChanged =\n toolCall.id != null && toolCall.id !== '' && current.id !== toolCall.id;\n const nameChanged = name !== '' && current.function.name !== name;\n let argumentDelta = '';\n if (completed) {\n if (args !== '' && args !== current.function.arguments) {\n argumentDelta = args.startsWith(current.function.arguments)\n ? args.slice(current.function.arguments.length)\n : args;\n current.function.arguments = args;\n }\n } else if (args !== '') {\n argumentDelta = args;\n current.function.arguments += args;\n }\n if (toolCall.id != null && toolCall.id !== '') {\n current.id = toolCall.id;\n }\n if (name !== '') {\n current.function.name = name;\n }\n stepToolCalls.set(index, current);\n config.tracker.toolCalls.set(index, current);\n if (!idChanged && !nameChanged && argumentDelta === '' && existing) {\n return;\n }\n config.tracker.lastChunkKind = 'tool_call';\n const functionDelta: { name?: string; arguments?: string } = {};\n if (nameChanged || (!existing && current.function.name !== '')) {\n functionDelta.name = current.function.name;\n }\n if (argumentDelta !== '') {\n functionDelta.arguments = argumentDelta;\n }\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, {\n tool_calls: [\n {\n index,\n ...(current.id !== '' ? { id: current.id } : {}),\n type: 'function',\n ...(functionDelta.name != null || functionDelta.arguments != null\n ? { function: functionDelta }\n : {}),\n },\n ],\n })\n );\n}\n\nexport function createOpenAIHandlers(\n config: OpenAIHandlerConfig\n): Record<string, t.EventHandler> {\n return {\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n for (const text of getTextParts(data as t.MessageDeltaEvent)) {\n config.tracker.hasText = true;\n config.tracker.lastChunkKind = 'text';\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, { content: text })\n );\n }\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n for (const text of getTextParts(data as t.ReasoningDeltaEvent)) {\n config.tracker.hasReasoning = true;\n config.tracker.lastChunkKind = 'reasoning';\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, { reasoning: text })\n );\n }\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const delta = runStepDelta.delta;\n if (delta.type !== 'tool_calls') {\n return;\n }\n const toolCalls = delta.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n await emitToolCallChunk({\n config,\n stepId: runStepDelta.id,\n toolCall: toolCalls[index],\n fallbackIndex: index,\n completed: false,\n });\n }\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (_event, data): Promise<void> => {\n const runStep = data as t.RunStep;\n if (runStep.stepDetails.type !== 'tool_calls') {\n return;\n }\n const toolCalls = runStep.stepDetails.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n await emitToolCallChunk({\n config,\n stepId: runStep.id,\n toolCall: toolCalls[index],\n fallbackIndex: index,\n completed: true,\n });\n }\n },\n },\n [GraphEvents.CHAT_MODEL_END]: {\n handle: (_event, data): void => {\n const usage = (data as t.ModelEndData)?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!usage) {\n return;\n }\n config.tracker.usage.promptTokens += getTokenCount(usage.input_tokens);\n config.tracker.usage.completionTokens += getTokenCount(\n usage.output_tokens\n );\n config.tracker.usage.reasoningTokens += getReasoningTokenCount(usage);\n },\n },\n };\n}\n\nexport async function sendOpenAIFinalChunk(\n config: OpenAIHandlerConfig,\n finishReason?: OpenAIChatCompletionChunkChoice['finish_reason']\n): Promise<void> {\n const resolvedFinishReason =\n finishReason ??\n (config.tracker.lastChunkKind === 'tool_call' ? 'tool_calls' : 'stop');\n const usage: OpenAICompletionUsage = {\n prompt_tokens: config.tracker.usage.promptTokens,\n completion_tokens: config.tracker.usage.completionTokens,\n total_tokens:\n config.tracker.usage.promptTokens + config.tracker.usage.completionTokens,\n };\n if (config.tracker.usage.reasoningTokens > 0) {\n usage.completion_tokens_details = {\n reasoning_tokens: config.tracker.usage.reasoningTokens,\n };\n }\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, {}, resolvedFinishReason)\n );\n await writeOpenAISSE(\n config.writer,\n createChatCompletionUsageChunk(config.context, usage)\n );\n await writeOpenAISSE(config.writer, '[DONE]');\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/openai/index.ts"],"sourcesContent":["import type { UsageMetadata } from '@langchain/core/messages';\nimport type * as t from '@/types';\nimport { GraphEvents } from '@/common';\n\nexport interface OpenAICompatibleWriter {\n write(data: string): void | Promise<void>;\n}\n\nexport interface OpenAIResponseContext {\n requestId: string;\n model: string;\n created: number;\n}\n\nexport interface OpenAICompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n completion_tokens_details?: {\n reasoning_tokens?: number;\n };\n}\n\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface OpenAIChatCompletionChunkChoice {\n index: number;\n delta: {\n role?: 'assistant';\n content?: string | null;\n reasoning?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: 'function';\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n };\n finish_reason: 'stop' | 'length' | 'tool_calls' | 'content_filter' | null;\n}\n\nexport interface OpenAIChatCompletionChunk {\n id: string;\n object: 'chat.completion.chunk';\n created: number;\n model: string;\n choices: OpenAIChatCompletionChunkChoice[];\n usage?: OpenAICompletionUsage;\n}\n\nexport interface OpenAIStreamTracker {\n hasRole: boolean;\n hasText: boolean;\n hasReasoning: boolean;\n lastChunkKind?: 'text' | 'reasoning' | 'tool_call';\n toolCalls: Map<number, OpenAIToolCall>;\n toolCallsByStep?: Map<string, Map<number, OpenAIToolCall>>;\n usage: {\n promptTokens: number;\n completionTokens: number;\n reasoningTokens: number;\n };\n}\n\nexport interface OpenAIHandlerConfig {\n writer: OpenAICompatibleWriter;\n context: OpenAIResponseContext;\n tracker: OpenAIStreamTracker;\n}\n\ninterface OpenAIToolCallFragment {\n index?: number;\n id?: string;\n name?: string;\n args?: string | object;\n function?: {\n name?: string;\n arguments?: string | object;\n };\n}\n\nexport function createOpenAIStreamTracker(): OpenAIStreamTracker {\n return {\n hasRole: false,\n hasText: false,\n hasReasoning: false,\n toolCalls: new Map(),\n toolCallsByStep: new Map(),\n usage: {\n promptTokens: 0,\n completionTokens: 0,\n reasoningTokens: 0,\n },\n };\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction getReasoningTokenCount(usage: Partial<UsageMetadata>): number {\n return getTokenCount(usage.output_token_details?.reasoning);\n}\n\nfunction getToolCallIndex(\n toolCall: OpenAIToolCallFragment,\n fallbackIndex: number\n): number {\n return typeof toolCall.index === 'number' ? toolCall.index : fallbackIndex;\n}\n\nfunction getToolCallName(toolCall: OpenAIToolCallFragment): string {\n return toolCall.name ?? toolCall.function?.name ?? '';\n}\n\nfunction getToolCallArguments(toolCall: OpenAIToolCallFragment): string {\n const args = toolCall.args ?? toolCall.function?.arguments;\n if (args == null) {\n return '';\n }\n if (typeof args === 'string') {\n return args;\n }\n return JSON.stringify(args);\n}\n\nfunction getStepToolCalls(\n tracker: OpenAIStreamTracker,\n stepId: string\n): Map<number, OpenAIToolCall> {\n const toolCallsByStep = tracker.toolCallsByStep ?? new Map();\n tracker.toolCallsByStep = toolCallsByStep;\n const existing = toolCallsByStep.get(stepId);\n if (existing != null) {\n return existing;\n }\n const stepToolCalls = new Map<number, OpenAIToolCall>();\n toolCallsByStep.set(stepId, stepToolCalls);\n return stepToolCalls;\n}\n\nexport function createChatCompletionChunk(\n context: OpenAIResponseContext,\n delta: OpenAIChatCompletionChunkChoice['delta'],\n finishReason: OpenAIChatCompletionChunkChoice['finish_reason'] = null,\n usage?: OpenAICompletionUsage\n): OpenAIChatCompletionChunk {\n return {\n id: context.requestId,\n object: 'chat.completion.chunk',\n created: context.created,\n model: context.model,\n choices: [{ index: 0, delta, finish_reason: finishReason }],\n ...(usage ? { usage } : {}),\n };\n}\n\nexport function createChatCompletionUsageChunk(\n context: OpenAIResponseContext,\n usage: OpenAICompletionUsage\n): OpenAIChatCompletionChunk {\n return {\n id: context.requestId,\n object: 'chat.completion.chunk',\n created: context.created,\n model: context.model,\n choices: [],\n usage,\n };\n}\n\nexport async function writeOpenAISSE(\n writer: OpenAICompatibleWriter,\n data: OpenAIChatCompletionChunk | '[DONE]'\n): Promise<void> {\n await writer.write(\n `data: ${data === '[DONE]' ? data : JSON.stringify(data)}\\n\\n`\n );\n}\n\nfunction getTextParts(\n data: t.MessageDeltaEvent | t.ReasoningDeltaEvent\n): string[] {\n const parts = data.delta.content ?? [];\n const text: string[] = [];\n for (const part of parts) {\n if ('text' in part && typeof part.text === 'string') {\n text.push(part.text);\n continue;\n }\n if ('think' in part && typeof part.think === 'string') {\n text.push(part.think);\n }\n }\n return text;\n}\n\nasync function emitAssistantRoleChunk(\n config: OpenAIHandlerConfig\n): Promise<void> {\n if (config.tracker.hasRole) {\n return;\n }\n config.tracker.hasRole = true;\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, { role: 'assistant' })\n );\n}\n\nasync function emitToolCallChunk(params: {\n config: OpenAIHandlerConfig;\n stepId: string;\n toolCall: OpenAIToolCallFragment;\n fallbackIndex: number;\n completed: boolean;\n}): Promise<void> {\n const { config, stepId, toolCall, fallbackIndex, completed } = params;\n const index = getToolCallIndex(toolCall, fallbackIndex);\n const stepToolCalls = getStepToolCalls(config.tracker, stepId);\n const existing = stepToolCalls.get(index);\n const current = existing ?? {\n id: toolCall.id ?? '',\n type: 'function' as const,\n function: { name: '', arguments: '' },\n };\n const name = getToolCallName(toolCall);\n const args = getToolCallArguments(toolCall);\n const idChanged =\n toolCall.id != null && toolCall.id !== '' && current.id !== toolCall.id;\n const nameChanged = name !== '' && current.function.name !== name;\n let argumentDelta = '';\n if (completed) {\n if (args !== '' && args !== current.function.arguments) {\n argumentDelta = args.startsWith(current.function.arguments)\n ? args.slice(current.function.arguments.length)\n : args;\n current.function.arguments = args;\n }\n } else if (args !== '') {\n argumentDelta = args;\n current.function.arguments += args;\n }\n if (toolCall.id != null && toolCall.id !== '') {\n current.id = toolCall.id;\n }\n if (name !== '') {\n current.function.name = name;\n }\n stepToolCalls.set(index, current);\n config.tracker.toolCalls.set(index, current);\n if (!idChanged && !nameChanged && argumentDelta === '' && existing) {\n return;\n }\n config.tracker.lastChunkKind = 'tool_call';\n const functionDelta: { name?: string; arguments?: string } = {};\n if (nameChanged || (!existing && current.function.name !== '')) {\n functionDelta.name = current.function.name;\n }\n if (argumentDelta !== '') {\n functionDelta.arguments = argumentDelta;\n }\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, {\n tool_calls: [\n {\n index,\n ...(current.id !== '' ? { id: current.id } : {}),\n type: 'function',\n ...(functionDelta.name != null || functionDelta.arguments != null\n ? { function: functionDelta }\n : {}),\n },\n ],\n })\n );\n}\n\nexport function createOpenAIHandlers(\n config: OpenAIHandlerConfig\n): Record<string, t.EventHandler> {\n return {\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n for (const text of getTextParts(data as t.MessageDeltaEvent)) {\n config.tracker.hasText = true;\n config.tracker.lastChunkKind = 'text';\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, { content: text })\n );\n }\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n for (const text of getTextParts(data as t.ReasoningDeltaEvent)) {\n config.tracker.hasReasoning = true;\n config.tracker.lastChunkKind = 'reasoning';\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, { reasoning: text })\n );\n }\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const delta = runStepDelta.delta;\n if (delta.type !== 'tool_calls') {\n return;\n }\n const toolCalls = delta.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n await emitToolCallChunk({\n config,\n stepId: runStepDelta.id,\n toolCall: toolCalls[index],\n fallbackIndex: index,\n completed: false,\n });\n }\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (_event, data): Promise<void> => {\n const runStep = data as t.RunStep;\n if (runStep.stepDetails.type !== 'tool_calls') {\n return;\n }\n const toolCalls = runStep.stepDetails.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n await emitToolCallChunk({\n config,\n stepId: runStep.id,\n toolCall: toolCalls[index],\n fallbackIndex: index,\n completed: true,\n });\n }\n },\n },\n [GraphEvents.CHAT_MODEL_END]: {\n handle: (_event, data): void => {\n const usage = (data as t.ModelEndData)?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!usage) {\n return;\n }\n config.tracker.usage.promptTokens += getTokenCount(usage.input_tokens);\n config.tracker.usage.completionTokens += getTokenCount(\n usage.output_tokens\n );\n config.tracker.usage.reasoningTokens += getReasoningTokenCount(usage);\n },\n },\n };\n}\n\nexport async function sendOpenAIFinalChunk(\n config: OpenAIHandlerConfig,\n finishReason?: OpenAIChatCompletionChunkChoice['finish_reason']\n): Promise<void> {\n const resolvedFinishReason =\n finishReason ??\n (config.tracker.lastChunkKind === 'tool_call' ? 'tool_calls' : 'stop');\n const usage: OpenAICompletionUsage = {\n prompt_tokens: config.tracker.usage.promptTokens,\n completion_tokens: config.tracker.usage.completionTokens,\n total_tokens:\n config.tracker.usage.promptTokens + config.tracker.usage.completionTokens,\n };\n if (config.tracker.usage.reasoningTokens > 0) {\n usage.completion_tokens_details = {\n reasoning_tokens: config.tracker.usage.reasoningTokens,\n };\n }\n await emitAssistantRoleChunk(config);\n await writeOpenAISSE(\n config.writer,\n createChatCompletionChunk(config.context, {}, resolvedFinishReason)\n );\n await writeOpenAISSE(\n config.writer,\n createChatCompletionUsageChunk(config.context, usage)\n );\n await writeOpenAISSE(config.writer, '[DONE]');\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/responses/index.ts"],"sourcesContent":["import { GraphEvents } from '@/common';\nimport type { UsageMetadata } from '@langchain/core/messages';\nimport type * as t from '@/types';\n\nexport interface ResponsesCompatibleWriter {\n write(data: string): void | Promise<void>;\n}\n\nexport type ResponseStatus =\n | 'in_progress'\n | 'completed'\n | 'failed'\n | 'incomplete';\nexport type ItemStatus = 'in_progress' | 'incomplete' | 'completed';\n\nexport interface ResponseContext {\n responseId: string;\n model: string;\n createdAt: number;\n previousResponseId?: string;\n instructions?: string;\n}\n\nexport interface ResponseOutputTextContent {\n type: 'output_text';\n text: string;\n annotations: [];\n logprobs: [];\n}\n\nexport interface ResponseMessageItem {\n type: 'message';\n id: string;\n role: 'assistant';\n status: ItemStatus;\n content: ResponseOutputTextContent[];\n}\n\nexport interface ResponseFunctionCallItem {\n type: 'function_call';\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status: ItemStatus;\n}\n\nexport interface ResponseReasoningItem {\n type: 'reasoning';\n id: string;\n status: ItemStatus;\n content: Array<{ type: 'reasoning_text'; text: string }>;\n summary: [];\n}\n\nexport type ResponseOutputItem =\n | ResponseMessageItem\n | ResponseFunctionCallItem\n | ResponseReasoningItem;\n\nexport interface ResponseObject {\n id: string;\n object: 'response';\n created_at: number;\n completed_at: number | null;\n status: ResponseStatus;\n model: string;\n previous_response_id: string | null;\n instructions: string | null;\n output: ResponseOutputItem[];\n error: { type: string; message: string; code?: string } | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n } | null;\n}\n\nexport interface ResponseEvent {\n type: string;\n sequence_number: number;\n [key: string]: unknown;\n}\n\nexport interface ResponseTracker {\n sequenceNumber: number;\n items: ResponseOutputItem[];\n message: ResponseMessageItem | undefined;\n reasoning: ResponseReasoningItem | undefined;\n functionCalls: Map<string, ResponseFunctionCallItem>;\n functionCallsByStep: Map<string, Array<ResponseFunctionCallItem | undefined>>;\n responseCreated: boolean;\n usage: {\n inputTokens: number;\n outputTokens: number;\n };\n nextSequence(): number;\n}\n\nexport interface ResponsesHandlerConfig {\n writer: ResponsesCompatibleWriter;\n context: ResponseContext;\n tracker: ResponseTracker;\n}\n\nlet responseItemId = 0;\n\nfunction createItemId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}${(responseItemId++).toString(36)}`;\n}\n\nexport function createResponseTracker(): ResponseTracker {\n const tracker: ResponseTracker = {\n sequenceNumber: 0,\n items: [],\n message: undefined,\n reasoning: undefined,\n functionCalls: new Map(),\n functionCallsByStep: new Map(),\n responseCreated: false,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n nextSequence: () => tracker.sequenceNumber++,\n };\n return tracker;\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\ninterface ResponseToolCallFragment {\n index?: number;\n id?: string;\n name?: string;\n args?: string | object;\n function?: {\n name?: string;\n arguments?: string | object;\n };\n}\n\nfunction getToolCallIndex(\n toolCall: ResponseToolCallFragment,\n fallbackIndex: number\n): number {\n return typeof toolCall.index === 'number' ? toolCall.index : fallbackIndex;\n}\n\nfunction getToolCallPositionKey(\n stepId: string,\n toolCall: ResponseToolCallFragment,\n fallbackIndex: number\n): string {\n const index = getToolCallIndex(toolCall, fallbackIndex);\n if (stepId !== '') {\n return `${stepId}:${index}`;\n }\n return `tool:${index}`;\n}\n\nfunction getToolCallIdKey(\n toolCall: ResponseToolCallFragment\n): string | undefined {\n return toolCall.id != null && toolCall.id !== '' ? toolCall.id : undefined;\n}\n\nfunction getExistingFunctionCall(\n config: ResponsesHandlerConfig,\n idKey: string | undefined,\n positionKey: string | undefined,\n stepId: string,\n toolCall: ResponseToolCallFragment\n): ResponseFunctionCallItem | undefined {\n const keyed =\n idKey == null\n ? undefined\n : (config.tracker.functionCalls.get(idKey) ??\n (positionKey == null\n ? undefined\n : config.tracker.functionCalls.get(positionKey)));\n if (keyed != null) {\n return keyed;\n }\n const positioned =\n positionKey == null\n ? undefined\n : config.tracker.functionCalls.get(positionKey);\n if (positioned != null) {\n return positioned;\n }\n if (stepId === '') {\n return undefined;\n }\n return findFunctionCallByStep(config, stepId, toolCall);\n}\n\nfunction findFunctionCallByStep(\n config: ResponsesHandlerConfig,\n stepId: string,\n toolCall: ResponseToolCallFragment\n): ResponseFunctionCallItem | undefined {\n const items = config.tracker.functionCallsByStep.get(stepId);\n if (items == null) {\n return undefined;\n }\n const index = typeof toolCall.index === 'number' ? toolCall.index : undefined;\n if (index != null) {\n return items[index];\n }\n const name = getToolCallName(toolCall);\n let fallback: ResponseFunctionCallItem | undefined;\n for (const item of items) {\n if (item == null || item.status === 'completed') {\n continue;\n }\n if (name !== '' && item.name !== name) {\n continue;\n }\n if (fallback != null) {\n return undefined;\n }\n fallback = item;\n }\n return fallback;\n}\n\nfunction trackFunctionCallKeys(\n config: ResponsesHandlerConfig,\n item: ResponseFunctionCallItem,\n idKey: string | undefined,\n positionKey: string\n): void {\n config.tracker.functionCalls.set(positionKey, item);\n if (idKey != null) {\n config.tracker.functionCalls.set(idKey, item);\n }\n}\n\nfunction trackFunctionCallStep(\n config: ResponsesHandlerConfig,\n stepId: string,\n item: ResponseFunctionCallItem,\n fallbackIndex: number\n): void {\n if (stepId === '') {\n return;\n }\n const items = config.tracker.functionCallsByStep.get(stepId) ?? [];\n items[fallbackIndex] = item;\n config.tracker.functionCallsByStep.set(stepId, items);\n}\n\nfunction getToolCallName(toolCall: ResponseToolCallFragment): string {\n return toolCall.name ?? toolCall.function?.name ?? '';\n}\n\nfunction getToolCallArguments(toolCall: ResponseToolCallFragment): string {\n const args = toolCall.args ?? toolCall.function?.arguments;\n if (args == null) {\n return '';\n }\n if (typeof args === 'string') {\n return args;\n }\n return JSON.stringify(args);\n}\n\nasync function ensureFunctionCall(\n config: ResponsesHandlerConfig,\n stepId: string,\n toolCall: ResponseToolCallFragment,\n fallbackIndex: number\n): Promise<ResponseFunctionCallItem> {\n await ensureResponseCreated(config);\n const positionKey = getToolCallPositionKey(stepId, toolCall, fallbackIndex);\n const idKey = getToolCallIdKey(toolCall);\n const existing = getExistingFunctionCall(\n config,\n idKey,\n positionKey,\n stepId,\n toolCall\n );\n const toolCallIndex = getToolCallIndex(toolCall, fallbackIndex);\n const name = getToolCallName(toolCall);\n if (existing) {\n trackFunctionCallKeys(config, existing, idKey, positionKey);\n trackFunctionCallStep(config, stepId, existing, toolCallIndex);\n if (idKey != null) {\n existing.call_id = idKey;\n }\n if (name !== '') {\n existing.name = name;\n }\n return existing;\n }\n const item: ResponseFunctionCallItem = {\n type: 'function_call',\n id: createItemId('fc'),\n call_id: idKey ?? positionKey,\n name,\n arguments: '',\n status: 'in_progress',\n };\n trackFunctionCallKeys(config, item, idKey, positionKey);\n trackFunctionCallStep(config, stepId, item, toolCallIndex);\n config.tracker.items.push(item);\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.added',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.length - 1,\n item,\n });\n return item;\n}\n\nasync function emitFunctionCallArgumentsDelta(params: {\n config: ResponsesHandlerConfig;\n item: ResponseFunctionCallItem;\n delta: string;\n}): Promise<void> {\n if (params.delta === '') {\n return;\n }\n params.item.arguments += params.delta;\n await writeResponseEvent(params.config.writer, {\n type: 'response.function_call_arguments.delta',\n sequence_number: params.config.tracker.nextSequence(),\n item_id: params.item.id,\n output_index: params.config.tracker.items.indexOf(params.item),\n call_id: params.item.call_id,\n delta: params.delta,\n });\n}\n\nasync function emitFunctionCallArgumentsDone(\n config: ResponsesHandlerConfig,\n item: ResponseFunctionCallItem\n): Promise<void> {\n await writeResponseEvent(config.writer, {\n type: 'response.function_call_arguments.done',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: config.tracker.items.indexOf(item),\n call_id: item.call_id,\n name: item.name,\n arguments: item.arguments,\n });\n}\n\nasync function completeFunctionCall(\n config: ResponsesHandlerConfig,\n stepId: string,\n toolCall: ResponseToolCallFragment\n): Promise<void> {\n const fallbackIndex =\n typeof toolCall.index === 'number' ? toolCall.index : undefined;\n const positionKey =\n fallbackIndex == null\n ? undefined\n : getToolCallPositionKey(stepId, toolCall, fallbackIndex);\n const item =\n getExistingFunctionCall(\n config,\n getToolCallIdKey(toolCall),\n positionKey,\n stepId,\n toolCall\n ) ??\n (await ensureFunctionCall(config, stepId, toolCall, fallbackIndex ?? 0));\n if (item.status === 'completed') {\n return;\n }\n const finalArguments = getToolCallArguments(toolCall);\n if (\n finalArguments !== '' &&\n finalArguments !== item.arguments &&\n finalArguments.startsWith(item.arguments)\n ) {\n await emitFunctionCallArgumentsDelta({\n config,\n item,\n delta: finalArguments.slice(item.arguments.length),\n });\n } else if (finalArguments !== '') {\n item.arguments = finalArguments;\n }\n await emitFunctionCallArgumentsDone(config, item);\n item.status = 'completed';\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.done',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.indexOf(item),\n item,\n });\n}\n\nexport function buildResponse(\n context: ResponseContext,\n tracker: ResponseTracker,\n status: ResponseStatus = 'in_progress'\n): ResponseObject {\n const completed = status === 'completed';\n return {\n id: context.responseId,\n object: 'response',\n created_at: context.createdAt,\n completed_at: completed ? Math.floor(Date.now() / 1000) : null,\n status,\n model: context.model,\n previous_response_id: context.previousResponseId ?? null,\n instructions: context.instructions ?? null,\n output: tracker.items,\n error: null,\n usage: completed\n ? {\n input_tokens: tracker.usage.inputTokens,\n output_tokens: tracker.usage.outputTokens,\n total_tokens: tracker.usage.inputTokens + tracker.usage.outputTokens,\n }\n : null,\n };\n}\n\nexport async function writeResponseEvent(\n writer: ResponsesCompatibleWriter,\n event: ResponseEvent\n): Promise<void> {\n await writer.write(`event: ${event.type}\\n`);\n await writer.write(`data: ${JSON.stringify(event)}\\n\\n`);\n}\n\nexport async function writeResponsesDone(\n writer: ResponsesCompatibleWriter\n): Promise<void> {\n await writer.write('data: [DONE]\\n\\n');\n}\n\nexport async function ensureResponseCreated(\n config: ResponsesHandlerConfig\n): Promise<void> {\n if (config.tracker.responseCreated) {\n return;\n }\n config.tracker.responseCreated = true;\n await writeResponseEvent(config.writer, {\n type: 'response.created',\n sequence_number: config.tracker.nextSequence(),\n response: buildResponse(config.context, config.tracker),\n });\n}\n\nasync function emitOutputContentDone(\n config: ResponsesHandlerConfig,\n item: ResponseMessageItem | ResponseReasoningItem\n): Promise<void> {\n const outputIndex = config.tracker.items.indexOf(item);\n if (item.type === 'message') {\n await writeResponseEvent(config.writer, {\n type: 'response.output_text.done',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n text: item.content[0].text,\n });\n return;\n }\n await writeResponseEvent(config.writer, {\n type: 'response.reasoning_text.done',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n text: item.content[0].text,\n });\n}\n\nasync function ensureMessage(\n config: ResponsesHandlerConfig\n): Promise<ResponseMessageItem> {\n await ensureResponseCreated(config);\n if (config.tracker.message) {\n return config.tracker.message;\n }\n const item: ResponseMessageItem = {\n type: 'message',\n id: createItemId('msg'),\n role: 'assistant',\n status: 'in_progress',\n content: [{ type: 'output_text', text: '', annotations: [], logprobs: [] }],\n };\n config.tracker.message = item;\n config.tracker.items.push(item);\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.added',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.length - 1,\n item,\n });\n return item;\n}\n\nasync function ensureReasoning(\n config: ResponsesHandlerConfig\n): Promise<ResponseReasoningItem> {\n await ensureResponseCreated(config);\n if (config.tracker.reasoning) {\n return config.tracker.reasoning;\n }\n const item: ResponseReasoningItem = {\n type: 'reasoning',\n id: createItemId('reason'),\n status: 'in_progress',\n content: [{ type: 'reasoning_text', text: '' }],\n summary: [],\n };\n config.tracker.reasoning = item;\n config.tracker.items.push(item);\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.added',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.length - 1,\n item,\n });\n return item;\n}\n\nexport function createResponsesEventHandlers(\n config: ResponsesHandlerConfig\n): Record<string, t.EventHandler> {\n return {\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const item = await ensureMessage(config);\n for (const part of (data as t.MessageDeltaEvent).delta.content ?? []) {\n if (!('text' in part) || typeof part.text !== 'string') {\n continue;\n }\n item.content[0].text += part.text;\n await writeResponseEvent(config.writer, {\n type: 'response.output_text.delta',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: config.tracker.items.indexOf(item),\n content_index: 0,\n delta: part.text,\n });\n }\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const item = await ensureReasoning(config);\n for (const part of (data as t.ReasoningDeltaEvent).delta.content ??\n []) {\n let text: string | undefined;\n if ('think' in part && typeof part.think === 'string') {\n text = part.think;\n } else if ('text' in part && typeof part.text === 'string') {\n text = part.text;\n }\n if (typeof text !== 'string') {\n continue;\n }\n item.content[0].text += text;\n await writeResponseEvent(config.writer, {\n type: 'response.reasoning_text.delta',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: config.tracker.items.indexOf(item),\n content_index: 0,\n delta: text,\n });\n }\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (_event, data): Promise<void> => {\n const runStep = data as t.RunStep;\n if (runStep.stepDetails.type !== 'tool_calls') {\n return;\n }\n const toolCalls = runStep.stepDetails.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n await ensureFunctionCall(config, runStep.id, toolCalls[index], index);\n }\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const runStepDelta = data as t.RunStepDeltaEvent;\n if (runStepDelta.delta.type !== 'tool_calls') {\n return;\n }\n const toolCalls = runStepDelta.delta.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n const item = await ensureFunctionCall(\n config,\n runStepDelta.id,\n toolCalls[index],\n index\n );\n await emitFunctionCallArgumentsDelta({\n config,\n item,\n delta: getToolCallArguments(toolCalls[index]),\n });\n }\n },\n },\n [GraphEvents.ON_RUN_STEP_COMPLETED]: {\n handle: async (_event, data): Promise<void> => {\n const completed = data as {\n result?: {\n id?: string;\n index?: number;\n type?: string;\n tool_call?: ResponseToolCallFragment;\n };\n };\n if (!completed.result?.tool_call) {\n return;\n }\n await completeFunctionCall(\n config,\n completed.result.id ?? '',\n completed.result.tool_call\n );\n },\n },\n [GraphEvents.CHAT_MODEL_END]: {\n handle: (_event, data): void => {\n const usage = (data as t.ModelEndData)?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!usage) {\n return;\n }\n config.tracker.usage.inputTokens += getTokenCount(usage.input_tokens);\n config.tracker.usage.outputTokens += getTokenCount(usage.output_tokens);\n },\n },\n };\n}\n\nexport async function emitResponseCompleted(\n config: ResponsesHandlerConfig\n): Promise<void> {\n await ensureResponseCreated(config);\n for (const item of config.tracker.items) {\n if (item.status === 'completed') {\n continue;\n }\n if (item.type === 'message' || item.type === 'reasoning') {\n await emitOutputContentDone(config, item);\n } else {\n await emitFunctionCallArgumentsDone(config, item);\n }\n item.status = 'completed';\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.done',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.indexOf(item),\n item,\n });\n }\n await writeResponseEvent(config.writer, {\n type: 'response.completed',\n sequence_number: config.tracker.nextSequence(),\n response: buildResponse(config.context, config.tracker, 'completed'),\n });\n await writeResponsesDone(config.writer);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/responses/index.ts"],"sourcesContent":["import type { UsageMetadata } from '@langchain/core/messages';\nimport type * as t from '@/types';\nimport { GraphEvents } from '@/common';\n\nexport interface ResponsesCompatibleWriter {\n write(data: string): void | Promise<void>;\n}\n\nexport type ResponseStatus =\n | 'in_progress'\n | 'completed'\n | 'failed'\n | 'incomplete';\nexport type ItemStatus = 'in_progress' | 'incomplete' | 'completed';\n\nexport interface ResponseContext {\n responseId: string;\n model: string;\n createdAt: number;\n previousResponseId?: string;\n instructions?: string;\n}\n\nexport interface ResponseOutputTextContent {\n type: 'output_text';\n text: string;\n annotations: [];\n logprobs: [];\n}\n\nexport interface ResponseMessageItem {\n type: 'message';\n id: string;\n role: 'assistant';\n status: ItemStatus;\n content: ResponseOutputTextContent[];\n}\n\nexport interface ResponseFunctionCallItem {\n type: 'function_call';\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status: ItemStatus;\n}\n\nexport interface ResponseReasoningItem {\n type: 'reasoning';\n id: string;\n status: ItemStatus;\n content: Array<{ type: 'reasoning_text'; text: string }>;\n summary: [];\n}\n\nexport type ResponseOutputItem =\n | ResponseMessageItem\n | ResponseFunctionCallItem\n | ResponseReasoningItem;\n\nexport interface ResponseObject {\n id: string;\n object: 'response';\n created_at: number;\n completed_at: number | null;\n status: ResponseStatus;\n model: string;\n previous_response_id: string | null;\n instructions: string | null;\n output: ResponseOutputItem[];\n error: { type: string; message: string; code?: string } | null;\n usage: {\n input_tokens: number;\n output_tokens: number;\n total_tokens: number;\n } | null;\n}\n\nexport interface ResponseEvent {\n type: string;\n sequence_number: number;\n [key: string]: unknown;\n}\n\nexport interface ResponseTracker {\n sequenceNumber: number;\n items: ResponseOutputItem[];\n message: ResponseMessageItem | undefined;\n reasoning: ResponseReasoningItem | undefined;\n functionCalls: Map<string, ResponseFunctionCallItem>;\n functionCallsByStep: Map<string, Array<ResponseFunctionCallItem | undefined>>;\n responseCreated: boolean;\n usage: {\n inputTokens: number;\n outputTokens: number;\n };\n nextSequence(): number;\n}\n\nexport interface ResponsesHandlerConfig {\n writer: ResponsesCompatibleWriter;\n context: ResponseContext;\n tracker: ResponseTracker;\n}\n\nlet responseItemId = 0;\n\nfunction createItemId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}${(responseItemId++).toString(36)}`;\n}\n\nexport function createResponseTracker(): ResponseTracker {\n const tracker: ResponseTracker = {\n sequenceNumber: 0,\n items: [],\n message: undefined,\n reasoning: undefined,\n functionCalls: new Map(),\n functionCallsByStep: new Map(),\n responseCreated: false,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n },\n nextSequence: () => tracker.sequenceNumber++,\n };\n return tracker;\n}\n\nfunction getTokenCount(value: number | null | undefined): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\ninterface ResponseToolCallFragment {\n index?: number;\n id?: string;\n name?: string;\n args?: string | object;\n function?: {\n name?: string;\n arguments?: string | object;\n };\n}\n\nfunction getToolCallIndex(\n toolCall: ResponseToolCallFragment,\n fallbackIndex: number\n): number {\n return typeof toolCall.index === 'number' ? toolCall.index : fallbackIndex;\n}\n\nfunction getToolCallPositionKey(\n stepId: string,\n toolCall: ResponseToolCallFragment,\n fallbackIndex: number\n): string {\n const index = getToolCallIndex(toolCall, fallbackIndex);\n if (stepId !== '') {\n return `${stepId}:${index}`;\n }\n return `tool:${index}`;\n}\n\nfunction getToolCallIdKey(\n toolCall: ResponseToolCallFragment\n): string | undefined {\n return toolCall.id != null && toolCall.id !== '' ? toolCall.id : undefined;\n}\n\nfunction getExistingFunctionCall(\n config: ResponsesHandlerConfig,\n idKey: string | undefined,\n positionKey: string | undefined,\n stepId: string,\n toolCall: ResponseToolCallFragment\n): ResponseFunctionCallItem | undefined {\n const keyed =\n idKey == null\n ? undefined\n : (config.tracker.functionCalls.get(idKey) ??\n (positionKey == null\n ? undefined\n : config.tracker.functionCalls.get(positionKey)));\n if (keyed != null) {\n return keyed;\n }\n const positioned =\n positionKey == null\n ? undefined\n : config.tracker.functionCalls.get(positionKey);\n if (positioned != null) {\n return positioned;\n }\n if (stepId === '') {\n return undefined;\n }\n return findFunctionCallByStep(config, stepId, toolCall);\n}\n\nfunction findFunctionCallByStep(\n config: ResponsesHandlerConfig,\n stepId: string,\n toolCall: ResponseToolCallFragment\n): ResponseFunctionCallItem | undefined {\n const items = config.tracker.functionCallsByStep.get(stepId);\n if (items == null) {\n return undefined;\n }\n const index = typeof toolCall.index === 'number' ? toolCall.index : undefined;\n if (index != null) {\n return items[index];\n }\n const name = getToolCallName(toolCall);\n let fallback: ResponseFunctionCallItem | undefined;\n for (const item of items) {\n if (item == null || item.status === 'completed') {\n continue;\n }\n if (name !== '' && item.name !== name) {\n continue;\n }\n if (fallback != null) {\n return undefined;\n }\n fallback = item;\n }\n return fallback;\n}\n\nfunction trackFunctionCallKeys(\n config: ResponsesHandlerConfig,\n item: ResponseFunctionCallItem,\n idKey: string | undefined,\n positionKey: string\n): void {\n config.tracker.functionCalls.set(positionKey, item);\n if (idKey != null) {\n config.tracker.functionCalls.set(idKey, item);\n }\n}\n\nfunction trackFunctionCallStep(\n config: ResponsesHandlerConfig,\n stepId: string,\n item: ResponseFunctionCallItem,\n fallbackIndex: number\n): void {\n if (stepId === '') {\n return;\n }\n const items = config.tracker.functionCallsByStep.get(stepId) ?? [];\n items[fallbackIndex] = item;\n config.tracker.functionCallsByStep.set(stepId, items);\n}\n\nfunction getToolCallName(toolCall: ResponseToolCallFragment): string {\n return toolCall.name ?? toolCall.function?.name ?? '';\n}\n\nfunction getToolCallArguments(toolCall: ResponseToolCallFragment): string {\n const args = toolCall.args ?? toolCall.function?.arguments;\n if (args == null) {\n return '';\n }\n if (typeof args === 'string') {\n return args;\n }\n return JSON.stringify(args);\n}\n\nasync function ensureFunctionCall(\n config: ResponsesHandlerConfig,\n stepId: string,\n toolCall: ResponseToolCallFragment,\n fallbackIndex: number\n): Promise<ResponseFunctionCallItem> {\n await ensureResponseCreated(config);\n const positionKey = getToolCallPositionKey(stepId, toolCall, fallbackIndex);\n const idKey = getToolCallIdKey(toolCall);\n const existing = getExistingFunctionCall(\n config,\n idKey,\n positionKey,\n stepId,\n toolCall\n );\n const toolCallIndex = getToolCallIndex(toolCall, fallbackIndex);\n const name = getToolCallName(toolCall);\n if (existing) {\n trackFunctionCallKeys(config, existing, idKey, positionKey);\n trackFunctionCallStep(config, stepId, existing, toolCallIndex);\n if (idKey != null) {\n existing.call_id = idKey;\n }\n if (name !== '') {\n existing.name = name;\n }\n return existing;\n }\n const item: ResponseFunctionCallItem = {\n type: 'function_call',\n id: createItemId('fc'),\n call_id: idKey ?? positionKey,\n name,\n arguments: '',\n status: 'in_progress',\n };\n trackFunctionCallKeys(config, item, idKey, positionKey);\n trackFunctionCallStep(config, stepId, item, toolCallIndex);\n config.tracker.items.push(item);\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.added',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.length - 1,\n item,\n });\n return item;\n}\n\nasync function emitFunctionCallArgumentsDelta(params: {\n config: ResponsesHandlerConfig;\n item: ResponseFunctionCallItem;\n delta: string;\n}): Promise<void> {\n if (params.delta === '') {\n return;\n }\n params.item.arguments += params.delta;\n await writeResponseEvent(params.config.writer, {\n type: 'response.function_call_arguments.delta',\n sequence_number: params.config.tracker.nextSequence(),\n item_id: params.item.id,\n output_index: params.config.tracker.items.indexOf(params.item),\n call_id: params.item.call_id,\n delta: params.delta,\n });\n}\n\nasync function emitFunctionCallArgumentsDone(\n config: ResponsesHandlerConfig,\n item: ResponseFunctionCallItem\n): Promise<void> {\n await writeResponseEvent(config.writer, {\n type: 'response.function_call_arguments.done',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: config.tracker.items.indexOf(item),\n call_id: item.call_id,\n name: item.name,\n arguments: item.arguments,\n });\n}\n\nasync function completeFunctionCall(\n config: ResponsesHandlerConfig,\n stepId: string,\n toolCall: ResponseToolCallFragment\n): Promise<void> {\n const fallbackIndex =\n typeof toolCall.index === 'number' ? toolCall.index : undefined;\n const positionKey =\n fallbackIndex == null\n ? undefined\n : getToolCallPositionKey(stepId, toolCall, fallbackIndex);\n const item =\n getExistingFunctionCall(\n config,\n getToolCallIdKey(toolCall),\n positionKey,\n stepId,\n toolCall\n ) ??\n (await ensureFunctionCall(config, stepId, toolCall, fallbackIndex ?? 0));\n if (item.status === 'completed') {\n return;\n }\n const finalArguments = getToolCallArguments(toolCall);\n if (\n finalArguments !== '' &&\n finalArguments !== item.arguments &&\n finalArguments.startsWith(item.arguments)\n ) {\n await emitFunctionCallArgumentsDelta({\n config,\n item,\n delta: finalArguments.slice(item.arguments.length),\n });\n } else if (finalArguments !== '') {\n item.arguments = finalArguments;\n }\n await emitFunctionCallArgumentsDone(config, item);\n item.status = 'completed';\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.done',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.indexOf(item),\n item,\n });\n}\n\nexport function buildResponse(\n context: ResponseContext,\n tracker: ResponseTracker,\n status: ResponseStatus = 'in_progress'\n): ResponseObject {\n const completed = status === 'completed';\n return {\n id: context.responseId,\n object: 'response',\n created_at: context.createdAt,\n completed_at: completed ? Math.floor(Date.now() / 1000) : null,\n status,\n model: context.model,\n previous_response_id: context.previousResponseId ?? null,\n instructions: context.instructions ?? null,\n output: tracker.items,\n error: null,\n usage: completed\n ? {\n input_tokens: tracker.usage.inputTokens,\n output_tokens: tracker.usage.outputTokens,\n total_tokens: tracker.usage.inputTokens + tracker.usage.outputTokens,\n }\n : null,\n };\n}\n\nexport async function writeResponseEvent(\n writer: ResponsesCompatibleWriter,\n event: ResponseEvent\n): Promise<void> {\n await writer.write(`event: ${event.type}\\n`);\n await writer.write(`data: ${JSON.stringify(event)}\\n\\n`);\n}\n\nexport async function writeResponsesDone(\n writer: ResponsesCompatibleWriter\n): Promise<void> {\n await writer.write('data: [DONE]\\n\\n');\n}\n\nexport async function ensureResponseCreated(\n config: ResponsesHandlerConfig\n): Promise<void> {\n if (config.tracker.responseCreated) {\n return;\n }\n config.tracker.responseCreated = true;\n await writeResponseEvent(config.writer, {\n type: 'response.created',\n sequence_number: config.tracker.nextSequence(),\n response: buildResponse(config.context, config.tracker),\n });\n}\n\nasync function emitOutputContentDone(\n config: ResponsesHandlerConfig,\n item: ResponseMessageItem | ResponseReasoningItem\n): Promise<void> {\n const outputIndex = config.tracker.items.indexOf(item);\n if (item.type === 'message') {\n await writeResponseEvent(config.writer, {\n type: 'response.output_text.done',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n text: item.content[0].text,\n });\n return;\n }\n await writeResponseEvent(config.writer, {\n type: 'response.reasoning_text.done',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: outputIndex,\n content_index: 0,\n text: item.content[0].text,\n });\n}\n\nasync function ensureMessage(\n config: ResponsesHandlerConfig\n): Promise<ResponseMessageItem> {\n await ensureResponseCreated(config);\n if (config.tracker.message) {\n return config.tracker.message;\n }\n const item: ResponseMessageItem = {\n type: 'message',\n id: createItemId('msg'),\n role: 'assistant',\n status: 'in_progress',\n content: [{ type: 'output_text', text: '', annotations: [], logprobs: [] }],\n };\n config.tracker.message = item;\n config.tracker.items.push(item);\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.added',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.length - 1,\n item,\n });\n return item;\n}\n\nasync function ensureReasoning(\n config: ResponsesHandlerConfig\n): Promise<ResponseReasoningItem> {\n await ensureResponseCreated(config);\n if (config.tracker.reasoning) {\n return config.tracker.reasoning;\n }\n const item: ResponseReasoningItem = {\n type: 'reasoning',\n id: createItemId('reason'),\n status: 'in_progress',\n content: [{ type: 'reasoning_text', text: '' }],\n summary: [],\n };\n config.tracker.reasoning = item;\n config.tracker.items.push(item);\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.added',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.length - 1,\n item,\n });\n return item;\n}\n\nexport function createResponsesEventHandlers(\n config: ResponsesHandlerConfig\n): Record<string, t.EventHandler> {\n return {\n [GraphEvents.ON_MESSAGE_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const item = await ensureMessage(config);\n for (const part of (data as t.MessageDeltaEvent).delta.content ?? []) {\n if (!('text' in part) || typeof part.text !== 'string') {\n continue;\n }\n item.content[0].text += part.text;\n await writeResponseEvent(config.writer, {\n type: 'response.output_text.delta',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: config.tracker.items.indexOf(item),\n content_index: 0,\n delta: part.text,\n });\n }\n },\n },\n [GraphEvents.ON_REASONING_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const item = await ensureReasoning(config);\n for (const part of (data as t.ReasoningDeltaEvent).delta.content ??\n []) {\n let text: string | undefined;\n if ('think' in part && typeof part.think === 'string') {\n text = part.think;\n } else if ('text' in part && typeof part.text === 'string') {\n text = part.text;\n }\n if (typeof text !== 'string') {\n continue;\n }\n item.content[0].text += text;\n await writeResponseEvent(config.writer, {\n type: 'response.reasoning_text.delta',\n sequence_number: config.tracker.nextSequence(),\n item_id: item.id,\n output_index: config.tracker.items.indexOf(item),\n content_index: 0,\n delta: text,\n });\n }\n },\n },\n [GraphEvents.ON_RUN_STEP]: {\n handle: async (_event, data): Promise<void> => {\n const runStep = data as t.RunStep;\n if (runStep.stepDetails.type !== 'tool_calls') {\n return;\n }\n const toolCalls = runStep.stepDetails.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n await ensureFunctionCall(config, runStep.id, toolCalls[index], index);\n }\n },\n },\n [GraphEvents.ON_RUN_STEP_DELTA]: {\n handle: async (_event, data): Promise<void> => {\n const runStepDelta = data as t.RunStepDeltaEvent;\n if (runStepDelta.delta.type !== 'tool_calls') {\n return;\n }\n const toolCalls = runStepDelta.delta.tool_calls ?? [];\n for (let index = 0; index < toolCalls.length; index++) {\n const item = await ensureFunctionCall(\n config,\n runStepDelta.id,\n toolCalls[index],\n index\n );\n await emitFunctionCallArgumentsDelta({\n config,\n item,\n delta: getToolCallArguments(toolCalls[index]),\n });\n }\n },\n },\n [GraphEvents.ON_RUN_STEP_COMPLETED]: {\n handle: async (_event, data): Promise<void> => {\n const completed = data as {\n result?: {\n id?: string;\n index?: number;\n type?: string;\n tool_call?: ResponseToolCallFragment;\n };\n };\n if (!completed.result?.tool_call) {\n return;\n }\n await completeFunctionCall(\n config,\n completed.result.id ?? '',\n completed.result.tool_call\n );\n },\n },\n [GraphEvents.CHAT_MODEL_END]: {\n handle: (_event, data): void => {\n const usage = (data as t.ModelEndData)?.output?.usage_metadata as\n | Partial<UsageMetadata>\n | undefined;\n if (!usage) {\n return;\n }\n config.tracker.usage.inputTokens += getTokenCount(usage.input_tokens);\n config.tracker.usage.outputTokens += getTokenCount(usage.output_tokens);\n },\n },\n };\n}\n\nexport async function emitResponseCompleted(\n config: ResponsesHandlerConfig\n): Promise<void> {\n await ensureResponseCreated(config);\n for (const item of config.tracker.items) {\n if (item.status === 'completed') {\n continue;\n }\n if (item.type === 'message' || item.type === 'reasoning') {\n await emitOutputContentDone(config, item);\n } else {\n await emitFunctionCallArgumentsDone(config, item);\n }\n item.status = 'completed';\n await writeResponseEvent(config.writer, {\n type: 'response.output_item.done',\n sequence_number: config.tracker.nextSequence(),\n output_index: config.tracker.items.indexOf(item),\n item,\n });\n }\n await writeResponseEvent(config.writer, {\n type: 'response.completed',\n sequence_number: config.tracker.nextSequence(),\n response: buildResponse(config.context, config.tracker, 'completed'),\n });\n await writeResponsesDone(config.writer);\n}\n"],"names":[],"mappings":"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"}
package/dist/esm/run.mjs CHANGED
@@ -1,23 +1,23 @@
1
- import { initializeLangfuseTracing } from './instrumentation.mjs';
1
+ import { HumanMessage } from '@langchain/core/messages';
2
2
  import { PromptTemplate } from '@langchain/core/prompts';
3
3
  import { RunnableLambda } from '@langchain/core/runnables';
4
4
  import { ChatOpenAI as ChatOpenAI$1, AzureChatOpenAI as AzureChatOpenAI$1 } from '@langchain/openai';
5
- import { MemorySaver, Command, isInterrupted, INTERRUPT } from '@langchain/langgraph';
6
- import { HumanMessage } from '@langchain/core/messages';
7
5
  import { BaseCallbackHandler } from '@langchain/core/callbacks/base';
6
+ import { MemorySaver, Command, isInterrupted, INTERRUPT } from '@langchain/langgraph';
7
+ import { createLangfuseTraceMetadata, getLangfuseTraceName, createLangfuseHandler, withLangfuseAttributes, disposeLangfuseHandler, isLangfuseCallbackHandler } from './langfuse.mjs';
8
+ import { resolveLangfuseConfig, withLangfuseToolOutputTracingConfig } from './langfuseToolOutputTracing.mjs';
9
+ import { appendCallbacks, findCallback } from './utils/callbacks.mjs';
8
10
  import { createCompletionTitleRunnable, createTitleRunnable } from './utils/title.mjs';
11
+ import { initializeLangfuseTracing, runWithTraceIdSeed } from './instrumentation.mjs';
9
12
  import { createTokenCounter, encodingForModel } from './utils/tokens.mjs';
10
13
  import { GraphEvents, Callback, TitleMethod } from './common/enum.mjs';
11
14
  import { MultiAgentGraph } from './graphs/MultiAgentGraph.mjs';
12
15
  import { StandardGraph } from './graphs/Graph.mjs';
13
16
  import { initializeModel } from './llm/init.mjs';
14
17
  import { HandlerRegistry } from './events.mjs';
18
+ import { isOpenAILike } from './utils/llm.mjs';
15
19
  import { executeHooks } from './hooks/executeHooks.mjs';
16
20
  import './hooks/createWorkspacePolicyHook.mjs';
17
- import { isOpenAILike } from './utils/llm.mjs';
18
- import { appendCallbacks, findCallback } from './utils/callbacks.mjs';
19
- import { createLangfuseTraceMetadata, createLangfuseHandler, getLangfuseTraceName, disposeLangfuseHandler, isLangfuseCallbackHandler } from './langfuse.mjs';
20
- import { resolveLangfuseConfig, withLangfuseToolOutputTracingConfig } from './langfuseToolOutputTracing.mjs';
21
21
 
22
22
  // src/run.ts
23
23
  const defaultOmitOptions = new Set([
@@ -427,7 +427,7 @@ class Run {
427
427
  };
428
428
  }
429
429
  shouldClearHookSession(streamThrew) {
430
- return (this._interrupt == null || this._haltedReason != null || streamThrew);
430
+ return this._interrupt == null || this._haltedReason != null || streamThrew;
431
431
  }
432
432
  isAwaitingResume(streamThrew) {
433
433
  return (this._interrupt != null && this._haltedReason == null && !streamThrew);
@@ -560,6 +560,7 @@ class Run {
560
560
  agentId: graph.defaultAgentId,
561
561
  agentName: primaryContext?.name,
562
562
  });
563
+ const traceName = config.runName ?? getLangfuseTraceName(traceMetadata);
563
564
  const streamLangfuseConfig = this.getStreamLangfuseConfig(graph);
564
565
  initializeLangfuseTracing(streamLangfuseConfig);
565
566
  const langfuseHandler = createLangfuseHandler({
@@ -570,7 +571,7 @@ class Run {
570
571
  tags: ['librechat', 'agent'],
571
572
  });
572
573
  if (langfuseHandler != null) {
573
- config.runName = config.runName ?? getLangfuseTraceName(traceMetadata);
574
+ config.runName = traceName;
574
575
  config.callbacks = appendCallbacks(config.callbacks, [langfuseHandler]);
575
576
  }
576
577
  if (!this.id) {
@@ -711,7 +712,19 @@ class Run {
711
712
  }
712
713
  };
713
714
  try {
714
- await withLangfuseToolOutputTracingConfig(streamLangfuseConfig, consumeStream, this.getStreamToolOutputTracingLangfuseConfig(graph));
715
+ // When opted in, seed the root trace id from this run's id so feedback /
716
+ // other external signals can be attached to the trace later without a
717
+ // lookup (see SeededTraceIdGenerator in ./instrumentation).
718
+ await runWithTraceIdSeed(streamLangfuseConfig?.deterministicTraceId === true
719
+ ? this.id
720
+ : undefined, () => withLangfuseToolOutputTracingConfig(streamLangfuseConfig, () => withLangfuseAttributes({
721
+ langfuse: streamLangfuseConfig,
722
+ userId,
723
+ sessionId,
724
+ traceName,
725
+ traceMetadata,
726
+ tags: ['librechat', 'agent'],
727
+ }, consumeStream), this.getStreamToolOutputTracingLangfuseConfig(graph)));
715
728
  }
716
729
  catch (err) {
717
730
  streamThrew = true;
@@ -973,6 +986,9 @@ class Run {
973
986
  }
974
987
  async generateTitle({ provider, inputText, contentParts, titlePrompt, clientOptions, chainOptions, skipLanguage, titleMethod = TitleMethod.COMPLETION, titlePromptTemplate, }) {
975
988
  let titleLangfuseHandler;
989
+ let titleLangfuseConfig;
990
+ let titleUserId;
991
+ let titleSessionId;
976
992
  const titleContext = this.Graph == null
977
993
  ? undefined
978
994
  : this.Graph.agentContexts.get(this.Graph.defaultAgentId);
@@ -982,18 +998,20 @@ class Run {
982
998
  });
983
999
  const titleRunName = getLangfuseTraceName(traceMetadata, 'LibreChat Title');
984
1000
  if (chainOptions != null) {
985
- const userId = typeof chainOptions.configurable?.user_id === 'string'
986
- ? chainOptions.configurable.user_id
987
- : undefined;
988
- const sessionId = typeof chainOptions.configurable?.thread_id === 'string'
989
- ? chainOptions.configurable.thread_id
990
- : undefined;
991
- const titleLangfuseConfig = resolveLangfuseConfig(this.langfuse, titleContext?.langfuse);
1001
+ titleUserId =
1002
+ typeof chainOptions.configurable?.user_id === 'string'
1003
+ ? chainOptions.configurable.user_id
1004
+ : undefined;
1005
+ titleSessionId =
1006
+ typeof chainOptions.configurable?.thread_id === 'string'
1007
+ ? chainOptions.configurable.thread_id
1008
+ : undefined;
1009
+ titleLangfuseConfig = resolveLangfuseConfig(this.langfuse, titleContext?.langfuse);
992
1010
  initializeLangfuseTracing(titleLangfuseConfig);
993
1011
  titleLangfuseHandler = createLangfuseHandler({
994
1012
  langfuse: titleLangfuseConfig,
995
- userId,
996
- sessionId,
1013
+ userId: titleUserId,
1014
+ sessionId: titleSessionId,
997
1015
  traceMetadata,
998
1016
  tags: ['librechat', 'title'],
999
1017
  });
@@ -1047,9 +1065,17 @@ class Run {
1047
1065
  runId: this.id,
1048
1066
  runName: chainOptions?.runName ?? titleRunName,
1049
1067
  });
1068
+ const invokeTitleChain = (runtimeConfig) => withLangfuseAttributes({
1069
+ langfuse: titleLangfuseConfig,
1070
+ userId: titleUserId,
1071
+ sessionId: titleSessionId,
1072
+ traceName: runtimeConfig.runName ?? titleRunName,
1073
+ traceMetadata,
1074
+ tags: ['librechat', 'title'],
1075
+ }, () => fullChain.invoke({ input: inputText, output: response }, runtimeConfig));
1050
1076
  try {
1051
1077
  try {
1052
- return await withLangfuseToolOutputTracingConfig(this.langfuse, () => fullChain.invoke({ input: inputText, output: response }, invokeConfig), titleContext?.langfuse);
1078
+ return await withLangfuseToolOutputTracingConfig(this.langfuse, () => invokeTitleChain(invokeConfig), titleContext?.langfuse);
1053
1079
  }
1054
1080
  catch (_e) {
1055
1081
  // Fallback: strip callbacks to avoid EventStream tracer errors in certain environments
@@ -1059,7 +1085,7 @@ class Run {
1059
1085
  const safeConfig = Object.assign({}, rest, {
1060
1086
  callbacks: langfuseHandler ? [langfuseHandler] : [],
1061
1087
  });
1062
- return await withLangfuseToolOutputTracingConfig(this.langfuse, () => fullChain.invoke({ input: inputText, output: response }, safeConfig), titleContext?.langfuse);
1088
+ return await withLangfuseToolOutputTracingConfig(this.langfuse, () => invokeTitleChain(safeConfig), titleContext?.langfuse);
1063
1089
  }
1064
1090
  }
1065
1091
  finally {