@librechat/agents 2.4.321 → 3.0.0-rc1

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 (266) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +218 -0
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -0
  3. package/dist/cjs/common/enum.cjs +14 -5
  4. package/dist/cjs/common/enum.cjs.map +1 -1
  5. package/dist/cjs/events.cjs +10 -6
  6. package/dist/cjs/events.cjs.map +1 -1
  7. package/dist/cjs/graphs/Graph.cjs +309 -212
  8. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs +322 -0
  10. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -0
  11. package/dist/cjs/llm/anthropic/index.cjs +54 -9
  12. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  13. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  14. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +52 -6
  15. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  16. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +22 -2
  17. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  18. package/dist/cjs/llm/anthropic/utils/tools.cjs +29 -0
  19. package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -0
  20. package/dist/cjs/llm/google/index.cjs +144 -0
  21. package/dist/cjs/llm/google/index.cjs.map +1 -0
  22. package/dist/cjs/llm/google/utils/common.cjs +477 -0
  23. package/dist/cjs/llm/google/utils/common.cjs.map +1 -0
  24. package/dist/cjs/llm/ollama/index.cjs +67 -0
  25. package/dist/cjs/llm/ollama/index.cjs.map +1 -0
  26. package/dist/cjs/llm/ollama/utils.cjs +158 -0
  27. package/dist/cjs/llm/ollama/utils.cjs.map +1 -0
  28. package/dist/cjs/llm/openai/index.cjs +389 -3
  29. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  30. package/dist/cjs/llm/openai/utils/index.cjs +672 -0
  31. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -0
  32. package/dist/cjs/llm/providers.cjs +15 -15
  33. package/dist/cjs/llm/providers.cjs.map +1 -1
  34. package/dist/cjs/llm/text.cjs +14 -3
  35. package/dist/cjs/llm/text.cjs.map +1 -1
  36. package/dist/cjs/llm/vertexai/index.cjs +330 -0
  37. package/dist/cjs/llm/vertexai/index.cjs.map +1 -0
  38. package/dist/cjs/main.cjs +11 -0
  39. package/dist/cjs/main.cjs.map +1 -1
  40. package/dist/cjs/run.cjs +120 -81
  41. package/dist/cjs/run.cjs.map +1 -1
  42. package/dist/cjs/stream.cjs +85 -51
  43. package/dist/cjs/stream.cjs.map +1 -1
  44. package/dist/cjs/tools/ToolNode.cjs +10 -4
  45. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  46. package/dist/cjs/tools/handlers.cjs +119 -13
  47. package/dist/cjs/tools/handlers.cjs.map +1 -1
  48. package/dist/cjs/tools/search/anthropic.cjs +40 -0
  49. package/dist/cjs/tools/search/anthropic.cjs.map +1 -0
  50. package/dist/cjs/tools/search/firecrawl.cjs +61 -13
  51. package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
  52. package/dist/cjs/tools/search/format.cjs +9 -3
  53. package/dist/cjs/tools/search/format.cjs.map +1 -1
  54. package/dist/cjs/tools/search/rerankers.cjs +35 -50
  55. package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
  56. package/dist/cjs/tools/search/schema.cjs +70 -0
  57. package/dist/cjs/tools/search/schema.cjs.map +1 -0
  58. package/dist/cjs/tools/search/search.cjs +145 -38
  59. package/dist/cjs/tools/search/search.cjs.map +1 -1
  60. package/dist/cjs/tools/search/tool.cjs +165 -48
  61. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  62. package/dist/cjs/tools/search/utils.cjs +34 -5
  63. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  64. package/dist/cjs/utils/events.cjs +31 -0
  65. package/dist/cjs/utils/events.cjs.map +1 -0
  66. package/dist/cjs/utils/title.cjs +57 -21
  67. package/dist/cjs/utils/title.cjs.map +1 -1
  68. package/dist/cjs/utils/tokens.cjs +54 -7
  69. package/dist/cjs/utils/tokens.cjs.map +1 -1
  70. package/dist/esm/agents/AgentContext.mjs +216 -0
  71. package/dist/esm/agents/AgentContext.mjs.map +1 -0
  72. package/dist/esm/common/enum.mjs +15 -6
  73. package/dist/esm/common/enum.mjs.map +1 -1
  74. package/dist/esm/events.mjs +10 -6
  75. package/dist/esm/events.mjs.map +1 -1
  76. package/dist/esm/graphs/Graph.mjs +311 -214
  77. package/dist/esm/graphs/Graph.mjs.map +1 -1
  78. package/dist/esm/graphs/MultiAgentGraph.mjs +320 -0
  79. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -0
  80. package/dist/esm/llm/anthropic/index.mjs +54 -9
  81. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  82. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  83. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +52 -6
  84. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  85. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +22 -2
  86. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  87. package/dist/esm/llm/anthropic/utils/tools.mjs +27 -0
  88. package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -0
  89. package/dist/esm/llm/google/index.mjs +142 -0
  90. package/dist/esm/llm/google/index.mjs.map +1 -0
  91. package/dist/esm/llm/google/utils/common.mjs +471 -0
  92. package/dist/esm/llm/google/utils/common.mjs.map +1 -0
  93. package/dist/esm/llm/ollama/index.mjs +65 -0
  94. package/dist/esm/llm/ollama/index.mjs.map +1 -0
  95. package/dist/esm/llm/ollama/utils.mjs +155 -0
  96. package/dist/esm/llm/ollama/utils.mjs.map +1 -0
  97. package/dist/esm/llm/openai/index.mjs +388 -4
  98. package/dist/esm/llm/openai/index.mjs.map +1 -1
  99. package/dist/esm/llm/openai/utils/index.mjs +666 -0
  100. package/dist/esm/llm/openai/utils/index.mjs.map +1 -0
  101. package/dist/esm/llm/providers.mjs +5 -5
  102. package/dist/esm/llm/providers.mjs.map +1 -1
  103. package/dist/esm/llm/text.mjs +14 -3
  104. package/dist/esm/llm/text.mjs.map +1 -1
  105. package/dist/esm/llm/vertexai/index.mjs +328 -0
  106. package/dist/esm/llm/vertexai/index.mjs.map +1 -0
  107. package/dist/esm/main.mjs +6 -5
  108. package/dist/esm/main.mjs.map +1 -1
  109. package/dist/esm/run.mjs +121 -83
  110. package/dist/esm/run.mjs.map +1 -1
  111. package/dist/esm/stream.mjs +87 -54
  112. package/dist/esm/stream.mjs.map +1 -1
  113. package/dist/esm/tools/ToolNode.mjs +10 -4
  114. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  115. package/dist/esm/tools/handlers.mjs +119 -15
  116. package/dist/esm/tools/handlers.mjs.map +1 -1
  117. package/dist/esm/tools/search/anthropic.mjs +37 -0
  118. package/dist/esm/tools/search/anthropic.mjs.map +1 -0
  119. package/dist/esm/tools/search/firecrawl.mjs +61 -13
  120. package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
  121. package/dist/esm/tools/search/format.mjs +10 -4
  122. package/dist/esm/tools/search/format.mjs.map +1 -1
  123. package/dist/esm/tools/search/rerankers.mjs +35 -50
  124. package/dist/esm/tools/search/rerankers.mjs.map +1 -1
  125. package/dist/esm/tools/search/schema.mjs +61 -0
  126. package/dist/esm/tools/search/schema.mjs.map +1 -0
  127. package/dist/esm/tools/search/search.mjs +146 -39
  128. package/dist/esm/tools/search/search.mjs.map +1 -1
  129. package/dist/esm/tools/search/tool.mjs +164 -47
  130. package/dist/esm/tools/search/tool.mjs.map +1 -1
  131. package/dist/esm/tools/search/utils.mjs +33 -6
  132. package/dist/esm/tools/search/utils.mjs.map +1 -1
  133. package/dist/esm/utils/events.mjs +29 -0
  134. package/dist/esm/utils/events.mjs.map +1 -0
  135. package/dist/esm/utils/title.mjs +57 -22
  136. package/dist/esm/utils/title.mjs.map +1 -1
  137. package/dist/esm/utils/tokens.mjs +54 -8
  138. package/dist/esm/utils/tokens.mjs.map +1 -1
  139. package/dist/types/agents/AgentContext.d.ts +91 -0
  140. package/dist/types/common/enum.d.ts +15 -6
  141. package/dist/types/events.d.ts +5 -4
  142. package/dist/types/graphs/Graph.d.ts +64 -67
  143. package/dist/types/graphs/MultiAgentGraph.d.ts +37 -0
  144. package/dist/types/graphs/index.d.ts +1 -0
  145. package/dist/types/llm/anthropic/index.d.ts +11 -0
  146. package/dist/types/llm/anthropic/types.d.ts +9 -3
  147. package/dist/types/llm/anthropic/utils/message_inputs.d.ts +1 -1
  148. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +4 -4
  149. package/dist/types/llm/anthropic/utils/tools.d.ts +3 -0
  150. package/dist/types/llm/google/index.d.ts +13 -0
  151. package/dist/types/llm/google/types.d.ts +32 -0
  152. package/dist/types/llm/google/utils/common.d.ts +19 -0
  153. package/dist/types/llm/google/utils/tools.d.ts +10 -0
  154. package/dist/types/llm/google/utils/zod_to_genai_parameters.d.ts +14 -0
  155. package/dist/types/llm/ollama/index.d.ts +7 -0
  156. package/dist/types/llm/ollama/utils.d.ts +7 -0
  157. package/dist/types/llm/openai/index.d.ts +72 -3
  158. package/dist/types/llm/openai/types.d.ts +10 -0
  159. package/dist/types/llm/openai/utils/index.d.ts +20 -0
  160. package/dist/types/llm/text.d.ts +1 -1
  161. package/dist/types/llm/vertexai/index.d.ts +293 -0
  162. package/dist/types/messages/reducer.d.ts +9 -0
  163. package/dist/types/run.d.ts +19 -12
  164. package/dist/types/scripts/ant_web_search.d.ts +1 -0
  165. package/dist/types/scripts/args.d.ts +2 -1
  166. package/dist/types/scripts/handoff-test.d.ts +1 -0
  167. package/dist/types/scripts/multi-agent-conditional.d.ts +1 -0
  168. package/dist/types/scripts/multi-agent-parallel.d.ts +1 -0
  169. package/dist/types/scripts/multi-agent-sequence.d.ts +1 -0
  170. package/dist/types/scripts/multi-agent-test.d.ts +1 -0
  171. package/dist/types/stream.d.ts +10 -3
  172. package/dist/types/tools/CodeExecutor.d.ts +2 -2
  173. package/dist/types/tools/ToolNode.d.ts +1 -1
  174. package/dist/types/tools/handlers.d.ts +17 -4
  175. package/dist/types/tools/search/anthropic.d.ts +16 -0
  176. package/dist/types/tools/search/firecrawl.d.ts +16 -0
  177. package/dist/types/tools/search/rerankers.d.ts +8 -5
  178. package/dist/types/tools/search/schema.d.ts +16 -0
  179. package/dist/types/tools/search/tool.d.ts +13 -0
  180. package/dist/types/tools/search/types.d.ts +64 -9
  181. package/dist/types/tools/search/utils.d.ts +9 -2
  182. package/dist/types/types/graph.d.ts +95 -15
  183. package/dist/types/types/llm.d.ts +24 -10
  184. package/dist/types/types/run.d.ts +46 -8
  185. package/dist/types/types/stream.d.ts +16 -2
  186. package/dist/types/types/tools.d.ts +1 -1
  187. package/dist/types/utils/events.d.ts +6 -0
  188. package/dist/types/utils/title.d.ts +2 -1
  189. package/dist/types/utils/tokens.d.ts +24 -0
  190. package/package.json +35 -18
  191. package/src/agents/AgentContext.ts +315 -0
  192. package/src/common/enum.ts +14 -5
  193. package/src/events.ts +24 -13
  194. package/src/graphs/Graph.ts +495 -312
  195. package/src/graphs/MultiAgentGraph.ts +381 -0
  196. package/src/graphs/index.ts +2 -1
  197. package/src/llm/anthropic/Jacob_Lee_Resume_2023.pdf +0 -0
  198. package/src/llm/anthropic/index.ts +78 -13
  199. package/src/llm/anthropic/llm.spec.ts +491 -115
  200. package/src/llm/anthropic/types.ts +39 -3
  201. package/src/llm/anthropic/utils/message_inputs.ts +67 -11
  202. package/src/llm/anthropic/utils/message_outputs.ts +21 -2
  203. package/src/llm/anthropic/utils/output_parsers.ts +25 -6
  204. package/src/llm/anthropic/utils/tools.ts +29 -0
  205. package/src/llm/google/index.ts +218 -0
  206. package/src/llm/google/types.ts +43 -0
  207. package/src/llm/google/utils/common.ts +646 -0
  208. package/src/llm/google/utils/tools.ts +160 -0
  209. package/src/llm/google/utils/zod_to_genai_parameters.ts +86 -0
  210. package/src/llm/ollama/index.ts +89 -0
  211. package/src/llm/ollama/utils.ts +193 -0
  212. package/src/llm/openai/index.ts +600 -14
  213. package/src/llm/openai/types.ts +24 -0
  214. package/src/llm/openai/utils/index.ts +912 -0
  215. package/src/llm/openai/utils/isReasoningModel.test.ts +90 -0
  216. package/src/llm/providers.ts +10 -9
  217. package/src/llm/text.ts +26 -7
  218. package/src/llm/vertexai/index.ts +360 -0
  219. package/src/messages/reducer.ts +80 -0
  220. package/src/run.ts +181 -112
  221. package/src/scripts/ant_web_search.ts +158 -0
  222. package/src/scripts/args.ts +12 -8
  223. package/src/scripts/cli4.ts +29 -21
  224. package/src/scripts/cli5.ts +29 -21
  225. package/src/scripts/code_exec.ts +54 -23
  226. package/src/scripts/code_exec_files.ts +48 -17
  227. package/src/scripts/code_exec_simple.ts +46 -27
  228. package/src/scripts/handoff-test.ts +135 -0
  229. package/src/scripts/image.ts +52 -20
  230. package/src/scripts/multi-agent-conditional.ts +220 -0
  231. package/src/scripts/multi-agent-example-output.md +110 -0
  232. package/src/scripts/multi-agent-parallel.ts +337 -0
  233. package/src/scripts/multi-agent-sequence.ts +212 -0
  234. package/src/scripts/multi-agent-test.ts +186 -0
  235. package/src/scripts/search.ts +4 -12
  236. package/src/scripts/simple.ts +25 -10
  237. package/src/scripts/tools.ts +48 -18
  238. package/src/specs/anthropic.simple.test.ts +150 -34
  239. package/src/specs/azure.simple.test.ts +325 -0
  240. package/src/specs/openai.simple.test.ts +140 -33
  241. package/src/specs/openrouter.simple.test.ts +107 -0
  242. package/src/specs/prune.test.ts +4 -9
  243. package/src/specs/reasoning.test.ts +80 -44
  244. package/src/specs/token-memoization.test.ts +39 -0
  245. package/src/stream.test.ts +94 -0
  246. package/src/stream.ts +139 -60
  247. package/src/tools/ToolNode.ts +21 -7
  248. package/src/tools/handlers.ts +192 -18
  249. package/src/tools/search/anthropic.ts +51 -0
  250. package/src/tools/search/firecrawl.ts +78 -24
  251. package/src/tools/search/format.ts +10 -5
  252. package/src/tools/search/rerankers.ts +50 -62
  253. package/src/tools/search/schema.ts +63 -0
  254. package/src/tools/search/search.ts +167 -34
  255. package/src/tools/search/tool.ts +222 -46
  256. package/src/tools/search/types.ts +65 -10
  257. package/src/tools/search/utils.ts +37 -5
  258. package/src/types/graph.ts +272 -103
  259. package/src/types/llm.ts +25 -12
  260. package/src/types/run.ts +51 -13
  261. package/src/types/stream.ts +22 -1
  262. package/src/types/tools.ts +16 -10
  263. package/src/utils/events.ts +32 -0
  264. package/src/utils/llmConfig.ts +20 -8
  265. package/src/utils/title.ts +104 -30
  266. package/src/utils/tokens.ts +69 -10
@@ -48,15 +48,61 @@ function getTokenCountForMessage(message, getTokenCount) {
48
48
  processValue(message.content);
49
49
  return numTokens;
50
50
  }
51
+ let encoderPromise;
52
+ let tokenCounterPromise;
53
+ async function getSharedEncoder() {
54
+ if (encoderPromise) {
55
+ return encoderPromise;
56
+ }
57
+ encoderPromise = (async () => {
58
+ const res = await fetch('https://tiktoken.pages.dev/js/o200k_base.json');
59
+ const o200k_base = await res.json();
60
+ return new Tiktoken(o200k_base);
61
+ })();
62
+ return encoderPromise;
63
+ }
64
+ /**
65
+ * Creates a singleton token counter function that reuses the same encoder instance.
66
+ * This avoids creating multiple function closures and prevents potential memory issues.
67
+ */
51
68
  const createTokenCounter = async () => {
52
- const res = await fetch('https://tiktoken.pages.dev/js/o200k_base.json');
53
- const o200k_base = await res.json();
54
- const countTokens = (text) => {
55
- const enc = new Tiktoken(o200k_base);
56
- return enc.encode(text).length;
57
- };
58
- return (message) => getTokenCountForMessage(message, countTokens);
69
+ if (tokenCounterPromise) {
70
+ return tokenCounterPromise;
71
+ }
72
+ tokenCounterPromise = (async () => {
73
+ const enc = await getSharedEncoder();
74
+ const countTokens = (text) => enc.encode(text).length;
75
+ return (message) => getTokenCountForMessage(message, countTokens);
76
+ })();
77
+ return tokenCounterPromise;
78
+ };
79
+ /**
80
+ * Utility to manage the token encoder lifecycle explicitly.
81
+ * Useful for applications that need fine-grained control over resource management.
82
+ */
83
+ const TokenEncoderManager = {
84
+ /**
85
+ * Pre-initializes the encoder. This can be called during app startup
86
+ * to avoid lazy loading delays later.
87
+ */
88
+ async initialize() {
89
+ await getSharedEncoder();
90
+ },
91
+ /**
92
+ * Clears the cached encoder and token counter.
93
+ * Useful for testing or when you need to force a fresh reload.
94
+ */
95
+ reset() {
96
+ encoderPromise = undefined;
97
+ tokenCounterPromise = undefined;
98
+ },
99
+ /**
100
+ * Checks if the encoder has been initialized.
101
+ */
102
+ isInitialized() {
103
+ return encoderPromise !== undefined;
104
+ },
59
105
  };
60
106
 
61
- export { createTokenCounter, getTokenCountForMessage };
107
+ export { TokenEncoderManager, createTokenCounter, getTokenCountForMessage };
62
108
  //# sourceMappingURL=tokens.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.mjs","sources":["../../../src/utils/tokens.ts"],"sourcesContent":["import { Tiktoken } from 'js-tiktoken/lite';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { ContentTypes } from '@/common/enum';\n\nexport function getTokenCountForMessage(message: BaseMessage, getTokenCount: (text: string) => number): number {\n const tokensPerMessage = 3;\n\n const processValue = (value: unknown): void => {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (\n !item ||\n !item.type ||\n item.type === ContentTypes.ERROR ||\n item.type === ContentTypes.IMAGE_URL\n ) {\n continue;\n }\n\n if (item.type === ContentTypes.TOOL_CALL && item.tool_call != null) {\n const toolName = item.tool_call?.name || '';\n if (toolName != null && toolName && typeof toolName === 'string') {\n numTokens += getTokenCount(toolName);\n }\n\n const args = item.tool_call?.args || '';\n if (args != null && args && typeof args === 'string') {\n numTokens += getTokenCount(args);\n }\n\n const output = item.tool_call?.output || '';\n if (output != null && output && typeof output === 'string') {\n numTokens += getTokenCount(output);\n }\n continue;\n }\n\n const nestedValue = item[item.type];\n\n if (!nestedValue) {\n continue;\n }\n\n processValue(nestedValue);\n }\n } else if (typeof value === 'string') {\n numTokens += getTokenCount(value);\n } else if (typeof value === 'number') {\n numTokens += getTokenCount(value.toString());\n } else if (typeof value === 'boolean') {\n numTokens += getTokenCount(value.toString());\n }\n };\n\n let numTokens = tokensPerMessage;\n processValue(message.content);\n return numTokens;\n}\n\nexport const createTokenCounter = async () => {\n const res = await fetch('https://tiktoken.pages.dev/js/o200k_base.json');\n const o200k_base = await res.json();\n\n const countTokens = (text: string): number => {\n const enc = new Tiktoken(o200k_base);\n return enc.encode(text).length;\n };\n\n return (message: BaseMessage): number => getTokenCountForMessage(message, countTokens);\n};"],"names":[],"mappings":";;;AAIgB,SAAA,uBAAuB,CAAC,OAAoB,EAAE,aAAuC,EAAA;IACnG,MAAM,gBAAgB,GAAG,CAAC;AAE1B,IAAA,MAAM,YAAY,GAAG,CAAC,KAAc,KAAU;AAC5C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,gBAAA,IACE,CAAC,IAAI;oBACL,CAAC,IAAI,CAAC,IAAI;AACV,oBAAA,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,KAAK;AAChC,oBAAA,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,SAAS,EACpC;oBACA;;AAGF,gBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;oBAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE;oBAC3C,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAChE,wBAAA,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC;;oBAGtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE;oBACvC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACpD,wBAAA,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC;;oBAGlC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE;oBAC3C,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC1D,wBAAA,SAAS,IAAI,aAAa,CAAC,MAAM,CAAC;;oBAEpC;;gBAGF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAEnC,IAAI,CAAC,WAAW,EAAE;oBAChB;;gBAGF,YAAY,CAAC,WAAW,CAAC;;;AAEtB,aAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACpC,YAAA,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC;;AAC5B,aAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACpC,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;;AACvC,aAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;YACrC,SAAS,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;;AAEhD,KAAC;IAED,IAAI,SAAS,GAAG,gBAAgB;AAChC,IAAA,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC;AAC7B,IAAA,OAAO,SAAS;AAClB;AAEa,MAAA,kBAAkB,GAAG,YAAW;AAC3C,IAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,+CAA+C,CAAC;AACxE,IAAA,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;AAEnC,IAAA,MAAM,WAAW,GAAG,CAAC,IAAY,KAAY;AAC3C,QAAA,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC;QACpC,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;AAChC,KAAC;IAED,OAAO,CAAC,OAAoB,KAAa,uBAAuB,CAAC,OAAO,EAAE,WAAW,CAAC;AACxF;;;;"}
1
+ {"version":3,"file":"tokens.mjs","sources":["../../../src/utils/tokens.ts"],"sourcesContent":["import { Tiktoken } from 'js-tiktoken/lite';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport { ContentTypes } from '@/common/enum';\n\nexport function getTokenCountForMessage(\n message: BaseMessage,\n getTokenCount: (text: string) => number\n): number {\n const tokensPerMessage = 3;\n\n const processValue = (value: unknown): void => {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (\n !item ||\n !item.type ||\n item.type === ContentTypes.ERROR ||\n item.type === ContentTypes.IMAGE_URL\n ) {\n continue;\n }\n\n if (item.type === ContentTypes.TOOL_CALL && item.tool_call != null) {\n const toolName = item.tool_call?.name || '';\n if (toolName != null && toolName && typeof toolName === 'string') {\n numTokens += getTokenCount(toolName);\n }\n\n const args = item.tool_call?.args || '';\n if (args != null && args && typeof args === 'string') {\n numTokens += getTokenCount(args);\n }\n\n const output = item.tool_call?.output || '';\n if (output != null && output && typeof output === 'string') {\n numTokens += getTokenCount(output);\n }\n continue;\n }\n\n const nestedValue = item[item.type];\n\n if (!nestedValue) {\n continue;\n }\n\n processValue(nestedValue);\n }\n } else if (typeof value === 'string') {\n numTokens += getTokenCount(value);\n } else if (typeof value === 'number') {\n numTokens += getTokenCount(value.toString());\n } else if (typeof value === 'boolean') {\n numTokens += getTokenCount(value.toString());\n }\n };\n\n let numTokens = tokensPerMessage;\n processValue(message.content);\n return numTokens;\n}\n\nlet encoderPromise: Promise<Tiktoken> | undefined;\nlet tokenCounterPromise: Promise<(message: BaseMessage) => number> | undefined;\n\nasync function getSharedEncoder(): Promise<Tiktoken> {\n if (encoderPromise) {\n return encoderPromise;\n }\n encoderPromise = (async (): Promise<Tiktoken> => {\n const res = await fetch('https://tiktoken.pages.dev/js/o200k_base.json');\n const o200k_base = await res.json();\n return new Tiktoken(o200k_base);\n })();\n return encoderPromise;\n}\n\n/**\n * Creates a singleton token counter function that reuses the same encoder instance.\n * This avoids creating multiple function closures and prevents potential memory issues.\n */\nexport const createTokenCounter = async (): Promise<\n (message: BaseMessage) => number\n> => {\n if (tokenCounterPromise) {\n return tokenCounterPromise;\n }\n\n tokenCounterPromise = (async (): Promise<\n (message: BaseMessage) => number\n > => {\n const enc = await getSharedEncoder();\n const countTokens = (text: string): number => enc.encode(text).length;\n return (message: BaseMessage): number =>\n getTokenCountForMessage(message, countTokens);\n })();\n\n return tokenCounterPromise;\n};\n\n/**\n * Utility to manage the token encoder lifecycle explicitly.\n * Useful for applications that need fine-grained control over resource management.\n */\nexport const TokenEncoderManager = {\n /**\n * Pre-initializes the encoder. This can be called during app startup\n * to avoid lazy loading delays later.\n */\n async initialize(): Promise<void> {\n await getSharedEncoder();\n },\n\n /**\n * Clears the cached encoder and token counter.\n * Useful for testing or when you need to force a fresh reload.\n */\n reset(): void {\n encoderPromise = undefined;\n tokenCounterPromise = undefined;\n },\n\n /**\n * Checks if the encoder has been initialized.\n */\n isInitialized(): boolean {\n return encoderPromise !== undefined;\n },\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { SystemMessage } from '@langchain/core/messages';
2
+ import type { UsageMetadata, BaseMessage } from '@langchain/core/messages';
3
+ import type { RunnableConfig, Runnable } from '@langchain/core/runnables';
4
+ import type * as t from '@/types';
5
+ import type { createPruneMessages } from '@/messages';
6
+ import { ContentTypes, Providers } from '@/common';
7
+ /**
8
+ * Encapsulates agent-specific state that can vary between agents in a multi-agent system
9
+ */
10
+ export declare class AgentContext {
11
+ /**
12
+ * Create an AgentContext from configuration with token accounting initialization
13
+ */
14
+ static fromConfig(agentConfig: t.AgentInputs, tokenCounter?: t.TokenCounter, indexTokenCountMap?: Record<string, number>): AgentContext;
15
+ /** Agent identifier */
16
+ agentId: string;
17
+ /** Provider for this specific agent */
18
+ provider: Providers;
19
+ /** Client options for this agent */
20
+ clientOptions?: t.ClientOptions;
21
+ /** Token count map indexed by message position */
22
+ indexTokenCountMap: Record<string, number | undefined>;
23
+ /** Maximum context tokens for this agent */
24
+ maxContextTokens?: number;
25
+ /** Current usage metadata for this agent */
26
+ currentUsage?: Partial<UsageMetadata>;
27
+ /** Prune messages function configured for this agent */
28
+ pruneMessages?: ReturnType<typeof createPruneMessages>;
29
+ /** Token counter function for this agent */
30
+ tokenCounter?: t.TokenCounter;
31
+ /** Instructions/system message token count */
32
+ instructionTokens: number;
33
+ /** The amount of time that should pass before another consecutive API call */
34
+ streamBuffer?: number;
35
+ /** Last stream call timestamp for rate limiting */
36
+ lastStreamCall?: number;
37
+ /** Tools available to this agent */
38
+ tools?: t.GraphTools;
39
+ /** Tool map for this agent */
40
+ toolMap?: t.ToolMap;
41
+ /** Instructions for this agent */
42
+ instructions?: string;
43
+ /** Additional instructions for this agent */
44
+ additionalInstructions?: string;
45
+ /** Reasoning key for this agent */
46
+ reasoningKey: 'reasoning_content' | 'reasoning';
47
+ /** Last token for reasoning detection */
48
+ lastToken?: string;
49
+ /** Token type switch state */
50
+ tokenTypeSwitch?: 'reasoning' | 'content';
51
+ /** Current token type being processed */
52
+ currentTokenType: ContentTypes.TEXT | ContentTypes.THINK | 'think_and_text';
53
+ /** Whether tools should end the workflow */
54
+ toolEnd: boolean;
55
+ /** System runnable for this agent */
56
+ systemRunnable?: Runnable<BaseMessage[], (BaseMessage | SystemMessage)[], RunnableConfig<Record<string, unknown>>>;
57
+ /** Promise for token calculation initialization */
58
+ tokenCalculationPromise?: Promise<void>;
59
+ constructor({ agentId, provider, clientOptions, maxContextTokens, streamBuffer, tokenCounter, tools, toolMap, instructions, additionalInstructions, reasoningKey, toolEnd, instructionTokens, }: {
60
+ agentId: string;
61
+ provider: Providers;
62
+ clientOptions?: t.ClientOptions;
63
+ maxContextTokens?: number;
64
+ streamBuffer?: number;
65
+ tokenCounter?: t.TokenCounter;
66
+ tools?: t.GraphTools;
67
+ toolMap?: t.ToolMap;
68
+ instructions?: string;
69
+ additionalInstructions?: string;
70
+ reasoningKey?: 'reasoning_content' | 'reasoning';
71
+ toolEnd?: boolean;
72
+ instructionTokens?: number;
73
+ });
74
+ /**
75
+ * Create system runnable from instructions and calculate tokens if tokenCounter is available
76
+ */
77
+ private createSystemRunnable;
78
+ /**
79
+ * Reset context for a new run
80
+ */
81
+ reset(): void;
82
+ /**
83
+ * Update the token count map with instruction tokens
84
+ */
85
+ updateTokenMapWithInstructions(baseTokenMap: Record<string, number>): void;
86
+ /**
87
+ * Calculate tool tokens and add to instruction tokens
88
+ * Note: System message tokens are calculated during systemRunnable creation
89
+ */
90
+ calculateInstructionTokens(tokenCounter: t.TokenCounter): Promise<void>;
91
+ }
@@ -66,8 +66,9 @@ export declare enum Providers {
66
66
  XAI = "xai"
67
67
  }
68
68
  export declare enum GraphNodeKeys {
69
- TOOLS = "tools",
70
- AGENT = "agent",
69
+ TOOLS = "tools=",
70
+ AGENT = "agent=",
71
+ ROUTER = "router",
71
72
  PRE_TOOLS = "pre_tools",
72
73
  POST_TOOLS = "post_tools"
73
74
  }
@@ -92,10 +93,12 @@ export declare enum ContentTypes {
92
93
  IMAGE_FILE = "image_file",
93
94
  /** Anthropic */
94
95
  THINKING = "thinking",
95
- /** Bedrock */
96
- REASONING_CONTENT = "reasoning_content",
96
+ /** Vertex AI / Google Common */
97
+ REASONING = "reasoning",
97
98
  /** Multi-Agent Switch */
98
- AGENT_UPDATE = "agent_update"
99
+ AGENT_UPDATE = "agent_update",
100
+ /** Bedrock */
101
+ REASONING_CONTENT = "reasoning_content"
99
102
  }
100
103
  export declare enum ToolCallTypes {
101
104
  FUNCTION = "function",
@@ -107,7 +110,8 @@ export declare enum ToolCallTypes {
107
110
  export declare enum Callback {
108
111
  TOOL_ERROR = "handleToolError",
109
112
  TOOL_START = "handleToolStart",
110
- TOOL_END = "handleToolEnd"
113
+ TOOL_END = "handleToolEnd",
114
+ CUSTOM_EVENT = "handleCustomEvent"
111
115
  }
112
116
  export declare enum Constants {
113
117
  OFFICIAL_CODE_BASEURL = "https://api.librechat.ai/v1",
@@ -115,6 +119,11 @@ export declare enum Constants {
115
119
  WEB_SEARCH = "web_search",
116
120
  CONTENT_AND_ARTIFACT = "content_and_artifact"
117
121
  }
122
+ export declare enum TitleMethod {
123
+ STRUCTURED = "structured",
124
+ FUNCTIONS = "functions",
125
+ COMPLETION = "completion"
126
+ }
118
127
  export declare enum EnvVar {
119
128
  CODE_API_KEY = "LIBRECHAT_CODE_API_KEY",
120
129
  CODE_BASEURL = "LIBRECHAT_CODE_BASEURL"
@@ -1,5 +1,5 @@
1
1
  import type { UsageMetadata, BaseMessageFields } from '@langchain/core/messages';
2
- import type { Graph } from '@/graphs';
2
+ import type { MultiAgentGraph, StandardGraph } from '@/graphs';
3
3
  import type * as t from '@/types';
4
4
  export declare class HandlerRegistry {
5
5
  private handlers;
@@ -9,12 +9,13 @@ export declare class HandlerRegistry {
9
9
  export declare class ModelEndHandler implements t.EventHandler {
10
10
  collectedUsage?: UsageMetadata[];
11
11
  constructor(collectedUsage?: UsageMetadata[]);
12
- handle(event: string, data: t.ModelEndData, metadata?: Record<string, unknown>, graph?: Graph): void;
12
+ handle(event: string, data: t.ModelEndData, metadata?: Record<string, unknown>, graph?: StandardGraph | MultiAgentGraph): Promise<void>;
13
13
  }
14
14
  export declare class ToolEndHandler implements t.EventHandler {
15
15
  private callback?;
16
- constructor(callback?: t.ToolEndCallback);
17
- handle(event: string, data: t.StreamEventData | undefined, metadata?: Record<string, unknown>, graph?: Graph): void;
16
+ private omitOutput?;
17
+ constructor(callback?: t.ToolEndCallback, omitOutput?: (name?: string) => boolean);
18
+ handle(event: string, data: t.StreamEventData | undefined, metadata?: Record<string, unknown>, graph?: StandardGraph | MultiAgentGraph): Promise<void>;
18
19
  }
19
20
  export declare class TestLLMStreamHandler implements t.EventHandler {
20
21
  handle(event: string, data: t.StreamEventData | undefined): void;
@@ -1,29 +1,23 @@
1
1
  import { ToolNode } from '@langchain/langgraph/prebuilt';
2
- import { START } from '@langchain/langgraph';
3
2
  import { Runnable, RunnableConfig } from '@langchain/core/runnables';
4
- import { SystemMessage } from '@langchain/core/messages';
5
- import type { BaseMessage, UsageMetadata } from '@langchain/core/messages';
6
- import type * as t from '@/types';
7
- import { Providers, GraphNodeKeys, Callback, ContentTypes } from '@/common';
3
+ import type { UsageMetadata, BaseMessage } from '@langchain/core/messages';
8
4
  import type { ToolCall } from '@langchain/core/messages/tool';
5
+ import type * as t from '@/types';
6
+ import { Providers } from '@/common';
9
7
  import { ToolNode as CustomToolNode } from '@/tools/ToolNode';
10
- import { createPruneMessages } from '@/messages';
8
+ import { AgentContext } from '@/agents/AgentContext';
11
9
  import { HandlerRegistry } from '@/events';
12
- export type GraphNode = GraphNodeKeys | typeof START;
13
- export type ClientCallback<T extends unknown[]> = (graph: StandardGraph, ...args: T) => void;
14
- export type ClientCallbacks = {
15
- [Callback.TOOL_ERROR]?: ClientCallback<[Error, string]>;
16
- [Callback.TOOL_START]?: ClientCallback<unknown[]>;
17
- [Callback.TOOL_END]?: ClientCallback<unknown[]>;
18
- };
19
- export type SystemCallbacks = {
20
- [K in keyof ClientCallbacks]: ClientCallbacks[K] extends ClientCallback<infer Args> ? (...args: Args) => void : never;
21
- };
22
- export declare abstract class Graph<T extends t.BaseGraphState = t.BaseGraphState, TNodeName extends string = string> {
10
+ export declare abstract class Graph<T extends t.BaseGraphState = t.BaseGraphState, _TNodeName extends string = string> {
23
11
  abstract resetValues(): void;
24
- abstract createGraphState(): t.GraphStateChannels<T>;
25
- abstract initializeTools(): CustomToolNode<T> | ToolNode<T>;
26
- abstract initializeModel(): Runnable;
12
+ abstract initializeTools({ currentTools, currentToolMap, }: {
13
+ currentTools?: t.GraphTools;
14
+ currentToolMap?: t.ToolMap;
15
+ }): CustomToolNode<T> | ToolNode<T>;
16
+ abstract initializeModel({ currentModel, tools, clientOptions, }: {
17
+ currentModel?: t.ChatModel;
18
+ tools?: t.GraphTools;
19
+ clientOptions?: t.ClientOptions;
20
+ }): Runnable;
27
21
  abstract getRunMessages(): BaseMessage[] | undefined;
28
22
  abstract getContentParts(): t.MessageContentComplex[] | undefined;
29
23
  abstract generateStepId(stepKey: string): [string, number];
@@ -32,17 +26,12 @@ export declare abstract class Graph<T extends t.BaseGraphState = t.BaseGraphStat
32
26
  abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;
33
27
  abstract getStepIdByKey(stepKey: string, index?: number): string;
34
28
  abstract getRunStep(stepId: string): t.RunStep | undefined;
35
- abstract dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): string;
36
- abstract dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void;
37
- abstract dispatchMessageDelta(id: string, delta: t.MessageDelta): void;
38
- abstract dispatchReasoningDelta(stepId: string, delta: t.ReasoningDelta): void;
39
- abstract handleToolCallCompleted(data: t.ToolEndData, metadata?: Record<string, unknown>): void;
40
- abstract createCallModel(): (state: T, config?: RunnableConfig) => Promise<Partial<T>>;
41
- abstract createWorkflow(): t.CompiledWorkflow<T>;
42
- lastToken?: string;
43
- tokenTypeSwitch?: 'reasoning' | 'content';
44
- reasoningKey: 'reasoning_content' | 'reasoning';
45
- currentTokenType: ContentTypes.TEXT | ContentTypes.THINK | 'think_and_text';
29
+ abstract dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): Promise<string>;
30
+ abstract dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): Promise<void>;
31
+ abstract dispatchMessageDelta(id: string, delta: t.MessageDelta): Promise<void>;
32
+ abstract dispatchReasoningDelta(stepId: string, delta: t.ReasoningDelta): Promise<void>;
33
+ abstract handleToolCallCompleted(data: t.ToolEndData, metadata?: Record<string, unknown>, omitOutput?: boolean): Promise<void>;
34
+ abstract createCallModel(agentId?: string, currentModel?: t.ChatModel): (state: T, config?: RunnableConfig) => Promise<Partial<T>>;
46
35
  messageStepHasToolCalls: Map<string, boolean>;
47
36
  messageIdsByStepKey: Map<string, string>;
48
37
  prelimMessageIdsByStepKey: Map<string, string>;
@@ -51,34 +40,27 @@ export declare abstract class Graph<T extends t.BaseGraphState = t.BaseGraphStat
51
40
  stepKeyIds: Map<string, string[]>;
52
41
  contentIndexMap: Map<string, number>;
53
42
  toolCallStepIds: Map<string, string>;
54
- currentUsage: Partial<UsageMetadata> | undefined;
55
- indexTokenCountMap: Record<string, number | undefined>;
56
- maxContextTokens: number | undefined;
57
- pruneMessages?: ReturnType<typeof createPruneMessages>;
58
- /** The amount of time that should pass before another consecutive API call */
59
- streamBuffer: number | undefined;
60
- tokenCounter?: t.TokenCounter;
61
43
  signal?: AbortSignal;
62
- }
63
- export declare class StandardGraph extends Graph<t.BaseGraphState, GraphNode> {
64
- private graphState;
65
- clientOptions: t.ClientOptions;
66
- boundModel?: Runnable;
67
- /** The last recorded timestamp that a stream API call was invoked */
68
- lastStreamCall: number | undefined;
44
+ /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */
45
+ invokedToolIds?: Set<string>;
69
46
  handlerRegistry: HandlerRegistry | undefined;
70
- systemMessage: SystemMessage | undefined;
47
+ }
48
+ export declare class StandardGraph extends Graph<t.BaseGraphState, t.GraphNode> {
49
+ overrideModel?: t.ChatModel;
50
+ /** Optional compile options passed into workflow.compile() */
51
+ compileOptions?: t.CompileOptions | undefined;
71
52
  messages: BaseMessage[];
72
53
  runId: string | undefined;
73
- tools?: t.GenericTool[];
74
- toolMap?: t.ToolMap;
75
54
  startIndex: number;
76
- provider: Providers;
77
- toolEnd: boolean;
78
55
  signal?: AbortSignal;
79
- constructor({ runId, tools, signal, toolMap, provider, streamBuffer, instructions, reasoningKey, clientOptions, toolEnd, additional_instructions, }: t.StandardGraphInput);
56
+ /** Map of agent contexts by agent ID */
57
+ agentContexts: Map<string, AgentContext>;
58
+ /** Default agent ID to use */
59
+ defaultAgentId: string;
60
+ constructor({ runId, signal, agents, tokenCounter, indexTokenCountMap, }: t.StandardGraphInput);
80
61
  resetValues(keepContent?: boolean): void;
81
62
  getRunStep(stepId: string): t.RunStep | undefined;
63
+ getAgentContext(metadata: Record<string, unknown> | undefined): AgentContext;
82
64
  getStepKey(metadata: Record<string, unknown> | undefined): string;
83
65
  getStepIdByKey(stepKey: string, index?: number): string;
84
66
  generateStepId(stepKey: string): [string, number];
@@ -86,34 +68,49 @@ export declare class StandardGraph extends Graph<t.BaseGraphState, GraphNode> {
86
68
  checkKeyList(keyList: (string | number | undefined)[]): boolean;
87
69
  getRunMessages(): BaseMessage[] | undefined;
88
70
  getContentParts(): t.MessageContentComplex[] | undefined;
89
- createGraphState(): t.GraphStateChannels<t.BaseGraphState>;
90
- initializeTools(): CustomToolNode<t.BaseGraphState> | ToolNode<t.BaseGraphState>;
91
- initializeModel(): Runnable;
71
+ createSystemRunnable({ provider, clientOptions, instructions, additional_instructions, }: {
72
+ provider?: Providers;
73
+ clientOptions?: t.ClientOptions;
74
+ instructions?: string;
75
+ additional_instructions?: string;
76
+ }): t.SystemRunnable | undefined;
77
+ initializeTools({ currentTools, currentToolMap, }: {
78
+ currentTools?: t.GraphTools;
79
+ currentToolMap?: t.ToolMap;
80
+ }): CustomToolNode<t.BaseGraphState> | ToolNode<t.BaseGraphState>;
81
+ initializeModel({ provider, tools, clientOptions, }: {
82
+ provider: Providers;
83
+ tools?: t.GraphTools;
84
+ clientOptions?: t.ClientOptions;
85
+ }): Runnable;
92
86
  overrideTestModel(responses: string[], sleep?: number, toolCalls?: ToolCall[]): void;
93
- getNewModel({ clientOptions, omitOriginalOptions, }: {
87
+ getNewModel({ provider, clientOptions, }: {
88
+ provider: Providers;
94
89
  clientOptions?: t.ClientOptions;
95
- omitOriginalOptions?: Set<string>;
96
90
  }): t.ChatModelInstance;
97
- storeUsageMetadata(finalMessage?: BaseMessage): void;
98
- cleanupSignalListener(): void;
99
- createCallModel(): (state: t.BaseGraphState, config?: RunnableConfig) => Promise<Partial<t.BaseGraphState>>;
100
- createWorkflow(): t.CompiledWorkflow<t.BaseGraphState>;
91
+ getUsageMetadata(finalMessage?: BaseMessage): Partial<UsageMetadata> | undefined;
92
+ /** Execute model invocation with streaming support */
93
+ private attemptInvoke;
94
+ cleanupSignalListener(currentModel?: t.ChatModel): void;
95
+ createCallModel(agentId?: string, currentModel?: t.ChatModel): (state: t.BaseGraphState, config?: RunnableConfig) => Promise<Partial<t.BaseGraphState>>;
96
+ createAgentNode(agentId: string): t.CompiledAgentWorfklow;
97
+ createWorkflow(): t.CompiledStateWorkflow;
101
98
  /**
102
99
  * Dispatches a run step to the client, returns the step ID
103
100
  */
104
- dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): string;
105
- handleToolCallCompleted(data: t.ToolEndData, metadata?: Record<string, unknown>): void;
101
+ dispatchRunStep(stepKey: string, stepDetails: t.StepDetails): Promise<string>;
102
+ handleToolCallCompleted(data: t.ToolEndData, metadata?: Record<string, unknown>, omitOutput?: boolean): Promise<void>;
106
103
  /**
107
104
  * Static version of handleToolCallError to avoid creating strong references
108
105
  * that prevent garbage collection
109
106
  */
110
- static handleToolCallErrorStatic(graph: StandardGraph, data: t.ToolErrorData, metadata?: Record<string, unknown>): void;
107
+ static handleToolCallErrorStatic(graph: StandardGraph, data: t.ToolErrorData, metadata?: Record<string, unknown>): Promise<void>;
111
108
  /**
112
109
  * Instance method that delegates to the static method
113
110
  * Kept for backward compatibility
114
111
  */
115
- handleToolCallError(data: t.ToolErrorData, metadata?: Record<string, unknown>): void;
116
- dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): void;
117
- dispatchMessageDelta(id: string, delta: t.MessageDelta): void;
118
- dispatchReasoningDelta: (stepId: string, delta: t.ReasoningDelta) => void;
112
+ handleToolCallError(data: t.ToolErrorData, metadata?: Record<string, unknown>): Promise<void>;
113
+ dispatchRunStepDelta(id: string, delta: t.ToolCallDelta): Promise<void>;
114
+ dispatchMessageDelta(id: string, delta: t.MessageDelta): Promise<void>;
115
+ dispatchReasoningDelta: (stepId: string, delta: t.ReasoningDelta) => Promise<void>;
119
116
  }
@@ -0,0 +1,37 @@
1
+ import type * as t from '@/types';
2
+ import { StandardGraph } from './Graph';
3
+ /**
4
+ * MultiAgentGraph extends StandardGraph to support dynamic multi-agent workflows
5
+ * with handoffs, fan-in/fan-out, and other composable patterns
6
+ */
7
+ export declare class MultiAgentGraph extends StandardGraph {
8
+ private edges;
9
+ private startingNodes;
10
+ private directEdges;
11
+ private handoffEdges;
12
+ constructor(input: t.MultiAgentGraphInput);
13
+ /**
14
+ * Categorize edges into handoff and direct types
15
+ */
16
+ private categorizeEdges;
17
+ /**
18
+ * Analyze graph structure to determine starting nodes and connections
19
+ */
20
+ private analyzeGraph;
21
+ /**
22
+ * Create handoff tools for agents based on handoff edges only
23
+ */
24
+ private createHandoffTools;
25
+ /**
26
+ * Create handoff tools for an edge (handles multiple destinations)
27
+ */
28
+ private createHandoffToolsForEdge;
29
+ /**
30
+ * Create a complete agent subgraph (similar to createReactAgent)
31
+ */
32
+ private createAgentSubgraph;
33
+ /**
34
+ * Create the multi-agent workflow with dynamic handoffs
35
+ */
36
+ createWorkflow(): t.CompiledStateWorkflow;
37
+ }
@@ -1 +1,2 @@
1
1
  export * from './Graph';
2
+ export * from './MultiAgentGraph';
@@ -4,9 +4,15 @@ import type { BaseChatModelParams } from '@langchain/core/language_models/chat_m
4
4
  import type { BaseMessage, UsageMetadata } from '@langchain/core/messages';
5
5
  import type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';
6
6
  import type { AnthropicInput } from '@langchain/anthropic';
7
+ import type { AnthropicMessageCreateParams, AnthropicStreamingMessageCreateParams } from '@/llm/anthropic/types';
7
8
  export type CustomAnthropicInput = AnthropicInput & {
8
9
  _lc_stream_delay?: number;
9
10
  } & BaseChatModelParams;
11
+ /**
12
+ * A type representing additional parameters that can be passed to the
13
+ * Anthropic API.
14
+ */
15
+ type Kwargs = Record<string, any>;
10
16
  export declare class CustomAnthropic extends ChatAnthropicMessages {
11
17
  _lc_stream_delay: number;
12
18
  private message_start;
@@ -14,6 +20,10 @@ export declare class CustomAnthropic extends ChatAnthropicMessages {
14
20
  private tools_in_params?;
15
21
  private emitted_usage?;
16
22
  constructor(fields?: CustomAnthropicInput);
23
+ /**
24
+ * Get the parameters used to invoke the model
25
+ */
26
+ invocationParams(options?: this['ParsedCallOptions']): Omit<AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams, 'messages'> & Kwargs;
17
27
  /**
18
28
  * Get stream usage as returned by this client's API response.
19
29
  * @returns The stream usage object.
@@ -23,3 +33,4 @@ export declare class CustomAnthropic extends ChatAnthropicMessages {
23
33
  private createGenerationChunk;
24
34
  _streamResponseChunks(messages: BaseMessage[], options: this['ParsedCallOptions'], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
25
35
  }
36
+ export {};
@@ -1,15 +1,15 @@
1
1
  import Anthropic from '@anthropic-ai/sdk';
2
2
  import { BindToolsInput } from '@langchain/core/language_models/chat_models';
3
+ export type AnthropicStreamUsage = Anthropic.Usage;
4
+ export type AnthropicMessageDeltaEvent = Anthropic.MessageDeltaEvent;
5
+ export type AnthropicMessageStartEvent = Anthropic.MessageStartEvent;
3
6
  export type AnthropicToolResponse = {
4
7
  type: 'tool_use';
5
8
  id: string;
6
9
  name: string;
7
10
  input: Record<string, any>;
8
11
  };
9
- export type AnthropicStreamUsage = Anthropic.Usage;
10
12
  export type AnthropicMessageParam = Anthropic.MessageParam;
11
- export type AnthropicMessageDeltaEvent = Anthropic.MessageDeltaEvent;
12
- export type AnthropicMessageStartEvent = Anthropic.MessageStartEvent;
13
13
  export type AnthropicMessageResponse = Anthropic.ContentBlock | AnthropicToolResponse;
14
14
  export type AnthropicMessageCreateParams = Anthropic.MessageCreateParamsNonStreaming;
15
15
  export type AnthropicStreamingMessageCreateParams = Anthropic.MessageCreateParamsStreaming;
@@ -28,4 +28,10 @@ export type AnthropicToolResultBlockParam = Anthropic.Messages.ToolResultBlockPa
28
28
  export type AnthropicDocumentBlockParam = Anthropic.Messages.DocumentBlockParam;
29
29
  export type AnthropicThinkingBlockParam = Anthropic.Messages.ThinkingBlockParam;
30
30
  export type AnthropicRedactedThinkingBlockParam = Anthropic.Messages.RedactedThinkingBlockParam;
31
+ export type AnthropicServerToolUseBlockParam = Anthropic.Messages.ServerToolUseBlockParam;
32
+ export type AnthropicWebSearchToolResultBlockParam = Anthropic.Messages.WebSearchToolResultBlockParam;
33
+ export type AnthropicWebSearchResultBlockParam = Anthropic.Messages.WebSearchResultBlockParam;
34
+ export type AnthropicSearchResultBlockParam = Anthropic.Beta.BetaSearchResultBlockParam;
35
+ export type AnthropicContentBlock = AnthropicTextBlockParam | AnthropicImageBlockParam | AnthropicToolUseBlockParam | AnthropicToolResultBlockParam | AnthropicDocumentBlockParam | AnthropicThinkingBlockParam | AnthropicRedactedThinkingBlockParam | AnthropicServerToolUseBlockParam | AnthropicWebSearchToolResultBlockParam | AnthropicWebSearchResultBlockParam;
36
+ export type ChatAnthropicContentBlock = AnthropicTextBlockParam | AnthropicImageBlockParam | AnthropicToolUseBlockParam | AnthropicToolResultBlockParam | AnthropicDocumentBlockParam | AnthropicThinkingBlockParam | AnthropicRedactedThinkingBlockParam | AnthropicServerToolUseBlockParam | AnthropicWebSearchToolResultBlockParam | AnthropicWebSearchResultBlockParam | AnthropicSearchResultBlockParam;
31
37
  export declare function isAnthropicImageBlockParam(block: unknown): block is AnthropicImageBlockParam;
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { type BaseMessage } from '@langchain/core/messages';
5
5
  import { ToolCall } from '@langchain/core/messages/tool';
6
- import type { AnthropicMessageCreateParams, AnthropicToolResponse } from '@/llm/anthropic/types';
6
+ import { AnthropicMessageCreateParams, AnthropicToolResponse } from '../types';
7
7
  export declare function _convertLangChainToolCallToAnthropic(toolCall: ToolCall): AnthropicToolResponse;
8
8
  /**
9
9
  * Formats messages as a prompt for the model.
@@ -1,9 +1,9 @@
1
- import { z } from 'zod';
2
1
  import { BaseLLMOutputParser } from '@langchain/core/output_parsers';
3
- import { JsonOutputKeyToolsParserParams } from '@langchain/core/output_parsers/openai_tools';
2
+ import { JsonOutputKeyToolsParserParamsInterop } from '@langchain/core/output_parsers/openai_tools';
4
3
  import { ChatGeneration } from '@langchain/core/outputs';
5
4
  import { ToolCall } from '@langchain/core/messages/tool';
6
- interface AnthropicToolsOutputParserParams<T extends Record<string, any>> extends JsonOutputKeyToolsParserParams<T> {
5
+ import { InteropZodType } from '@langchain/core/utils/types';
6
+ interface AnthropicToolsOutputParserParams<T extends Record<string, any>> extends JsonOutputKeyToolsParserParamsInterop<T> {
7
7
  }
8
8
  export declare class AnthropicToolsOutputParser<T extends Record<string, any> = Record<string, any>> extends BaseLLMOutputParser<T> {
9
9
  static lc_name(): string;
@@ -13,7 +13,7 @@ export declare class AnthropicToolsOutputParser<T extends Record<string, any> =
13
13
  keyName: string;
14
14
  /** Whether to return only the first tool call. */
15
15
  returnSingle: boolean;
16
- zodSchema?: z.ZodType<T>;
16
+ zodSchema?: InteropZodType<T>;
17
17
  constructor(params: AnthropicToolsOutputParserParams<T>);
18
18
  protected _validateResult(result: unknown): Promise<T>;
19
19
  parseResult(generations: ChatGeneration[]): Promise<T>;
@@ -0,0 +1,3 @@
1
+ import type { Anthropic } from '@anthropic-ai/sdk';
2
+ import { AnthropicToolChoice } from '../types.js';
3
+ export declare function handleToolChoice(toolChoice?: AnthropicToolChoice): Anthropic.Messages.ToolChoiceAuto | Anthropic.Messages.ToolChoiceAny | Anthropic.Messages.ToolChoiceTool | undefined;
@@ -0,0 +1,13 @@
1
+ import { ChatGenerationChunk } from '@langchain/core/outputs';
2
+ import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
3
+ import type { GenerateContentRequest } from '@google/generative-ai';
4
+ import type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';
5
+ import type { BaseMessage } from '@langchain/core/messages';
6
+ import type { GeminiGenerationConfig } from '@langchain/google-common';
7
+ import type { GoogleClientOptions } from '@/types';
8
+ export declare class CustomChatGoogleGenerativeAI extends ChatGoogleGenerativeAI {
9
+ thinkingConfig?: GeminiGenerationConfig['thinkingConfig'];
10
+ constructor(fields: GoogleClientOptions);
11
+ invocationParams(options?: this['ParsedCallOptions']): Omit<GenerateContentRequest, 'contents'>;
12
+ _streamResponseChunks(messages: BaseMessage[], options: this['ParsedCallOptions'], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
13
+ }
@@ -0,0 +1,32 @@
1
+ import { CodeExecutionTool, FunctionDeclarationsTool as GoogleGenerativeAIFunctionDeclarationsTool, GoogleSearchRetrievalTool } from '@google/generative-ai';
2
+ import { BindToolsInput } from '@langchain/core/language_models/chat_models';
3
+ export type GoogleGenerativeAIToolType = BindToolsInput | GoogleGenerativeAIFunctionDeclarationsTool | CodeExecutionTool | GoogleSearchRetrievalTool;
4
+ /** Enum for content modality types */
5
+ declare enum Modality {
6
+ MODALITY_UNSPECIFIED = "MODALITY_UNSPECIFIED",
7
+ TEXT = "TEXT",
8
+ IMAGE = "IMAGE",
9
+ VIDEO = "VIDEO",
10
+ AUDIO = "AUDIO",
11
+ DOCUMENT = "DOCUMENT"
12
+ }
13
+ /** Interface for modality token count */
14
+ interface ModalityTokenCount {
15
+ modality: Modality;
16
+ tokenCount: number;
17
+ }
18
+ /** Main interface for Gemini API usage metadata */
19
+ export interface GeminiApiUsageMetadata {
20
+ promptTokenCount?: number;
21
+ totalTokenCount?: number;
22
+ thoughtsTokenCount?: number;
23
+ candidatesTokenCount?: number;
24
+ toolUsePromptTokenCount?: number;
25
+ cachedContentTokenCount?: number;
26
+ promptTokensDetails: ModalityTokenCount[];
27
+ candidatesTokensDetails?: ModalityTokenCount[];
28
+ cacheTokensDetails?: ModalityTokenCount[];
29
+ toolUsePromptTokensDetails?: ModalityTokenCount[];
30
+ trafficType?: string;
31
+ }
32
+ export {};