@librechat/agents 3.1.75 → 3.1.77-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/dist/cjs/graphs/Graph.cjs +22 -3
  2. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  3. package/dist/cjs/hitl/askUserQuestion.cjs +67 -0
  4. package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -0
  5. package/dist/cjs/hooks/HookRegistry.cjs +54 -0
  6. package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
  7. package/dist/cjs/hooks/createToolPolicyHook.cjs +115 -0
  8. package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -0
  9. package/dist/cjs/hooks/executeHooks.cjs +40 -1
  10. package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
  11. package/dist/cjs/hooks/types.cjs +1 -0
  12. package/dist/cjs/hooks/types.cjs.map +1 -1
  13. package/dist/cjs/langchain/google-common.cjs +3 -0
  14. package/dist/cjs/langchain/google-common.cjs.map +1 -0
  15. package/dist/cjs/langchain/index.cjs +86 -0
  16. package/dist/cjs/langchain/index.cjs.map +1 -0
  17. package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
  18. package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
  19. package/dist/cjs/langchain/messages/tool.cjs +3 -0
  20. package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
  21. package/dist/cjs/langchain/messages.cjs +51 -0
  22. package/dist/cjs/langchain/messages.cjs.map +1 -0
  23. package/dist/cjs/langchain/openai.cjs +3 -0
  24. package/dist/cjs/langchain/openai.cjs.map +1 -0
  25. package/dist/cjs/langchain/prompts.cjs +11 -0
  26. package/dist/cjs/langchain/prompts.cjs.map +1 -0
  27. package/dist/cjs/langchain/runnables.cjs +19 -0
  28. package/dist/cjs/langchain/runnables.cjs.map +1 -0
  29. package/dist/cjs/langchain/tools.cjs +23 -0
  30. package/dist/cjs/langchain/tools.cjs.map +1 -0
  31. package/dist/cjs/langchain/utils/env.cjs +11 -0
  32. package/dist/cjs/langchain/utils/env.cjs.map +1 -0
  33. package/dist/cjs/llm/anthropic/index.cjs +145 -52
  34. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  35. package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
  36. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +21 -14
  37. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  38. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +84 -70
  39. package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
  40. package/dist/cjs/llm/bedrock/index.cjs +1 -1
  41. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  42. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +213 -3
  43. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  44. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +2 -1
  45. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
  46. package/dist/cjs/llm/google/utils/common.cjs +5 -4
  47. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  48. package/dist/cjs/llm/openai/index.cjs +519 -655
  49. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  50. package/dist/cjs/llm/openai/utils/index.cjs +20 -458
  51. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  52. package/dist/cjs/llm/openrouter/index.cjs +57 -175
  53. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  54. package/dist/cjs/llm/vertexai/index.cjs +5 -3
  55. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  56. package/dist/cjs/main.cjs +112 -3
  57. package/dist/cjs/main.cjs.map +1 -1
  58. package/dist/cjs/messages/cache.cjs +2 -1
  59. package/dist/cjs/messages/cache.cjs.map +1 -1
  60. package/dist/cjs/messages/core.cjs +7 -6
  61. package/dist/cjs/messages/core.cjs.map +1 -1
  62. package/dist/cjs/messages/format.cjs +73 -15
  63. package/dist/cjs/messages/format.cjs.map +1 -1
  64. package/dist/cjs/messages/langchain.cjs +26 -0
  65. package/dist/cjs/messages/langchain.cjs.map +1 -0
  66. package/dist/cjs/messages/prune.cjs +7 -6
  67. package/dist/cjs/messages/prune.cjs.map +1 -1
  68. package/dist/cjs/run.cjs +400 -42
  69. package/dist/cjs/run.cjs.map +1 -1
  70. package/dist/cjs/tools/ToolNode.cjs +556 -56
  71. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  72. package/dist/cjs/tools/search/search.cjs +55 -66
  73. package/dist/cjs/tools/search/search.cjs.map +1 -1
  74. package/dist/cjs/tools/search/tavily-scraper.cjs +189 -0
  75. package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -0
  76. package/dist/cjs/tools/search/tavily-search.cjs +372 -0
  77. package/dist/cjs/tools/search/tavily-search.cjs.map +1 -0
  78. package/dist/cjs/tools/search/tool.cjs +26 -4
  79. package/dist/cjs/tools/search/tool.cjs.map +1 -1
  80. package/dist/cjs/tools/search/utils.cjs +10 -3
  81. package/dist/cjs/tools/search/utils.cjs.map +1 -1
  82. package/dist/esm/graphs/Graph.mjs +22 -3
  83. package/dist/esm/graphs/Graph.mjs.map +1 -1
  84. package/dist/esm/hitl/askUserQuestion.mjs +65 -0
  85. package/dist/esm/hitl/askUserQuestion.mjs.map +1 -0
  86. package/dist/esm/hooks/HookRegistry.mjs +54 -0
  87. package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
  88. package/dist/esm/hooks/createToolPolicyHook.mjs +113 -0
  89. package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -0
  90. package/dist/esm/hooks/executeHooks.mjs +40 -1
  91. package/dist/esm/hooks/executeHooks.mjs.map +1 -1
  92. package/dist/esm/hooks/types.mjs +1 -0
  93. package/dist/esm/hooks/types.mjs.map +1 -1
  94. package/dist/esm/langchain/google-common.mjs +2 -0
  95. package/dist/esm/langchain/google-common.mjs.map +1 -0
  96. package/dist/esm/langchain/index.mjs +5 -0
  97. package/dist/esm/langchain/index.mjs.map +1 -0
  98. package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
  99. package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
  100. package/dist/esm/langchain/messages/tool.mjs +2 -0
  101. package/dist/esm/langchain/messages/tool.mjs.map +1 -0
  102. package/dist/esm/langchain/messages.mjs +2 -0
  103. package/dist/esm/langchain/messages.mjs.map +1 -0
  104. package/dist/esm/langchain/openai.mjs +2 -0
  105. package/dist/esm/langchain/openai.mjs.map +1 -0
  106. package/dist/esm/langchain/prompts.mjs +2 -0
  107. package/dist/esm/langchain/prompts.mjs.map +1 -0
  108. package/dist/esm/langchain/runnables.mjs +2 -0
  109. package/dist/esm/langchain/runnables.mjs.map +1 -0
  110. package/dist/esm/langchain/tools.mjs +2 -0
  111. package/dist/esm/langchain/tools.mjs.map +1 -0
  112. package/dist/esm/langchain/utils/env.mjs +2 -0
  113. package/dist/esm/langchain/utils/env.mjs.map +1 -0
  114. package/dist/esm/llm/anthropic/index.mjs +146 -54
  115. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  116. package/dist/esm/llm/anthropic/types.mjs.map +1 -1
  117. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +21 -14
  118. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  119. package/dist/esm/llm/anthropic/utils/message_outputs.mjs +84 -71
  120. package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
  121. package/dist/esm/llm/bedrock/index.mjs +1 -1
  122. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  123. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +214 -4
  124. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  125. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +2 -1
  126. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
  127. package/dist/esm/llm/google/utils/common.mjs +5 -4
  128. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  129. package/dist/esm/llm/openai/index.mjs +520 -656
  130. package/dist/esm/llm/openai/index.mjs.map +1 -1
  131. package/dist/esm/llm/openai/utils/index.mjs +23 -459
  132. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  133. package/dist/esm/llm/openrouter/index.mjs +57 -175
  134. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  135. package/dist/esm/llm/vertexai/index.mjs +5 -3
  136. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  137. package/dist/esm/main.mjs +7 -0
  138. package/dist/esm/main.mjs.map +1 -1
  139. package/dist/esm/messages/cache.mjs +2 -1
  140. package/dist/esm/messages/cache.mjs.map +1 -1
  141. package/dist/esm/messages/core.mjs +7 -6
  142. package/dist/esm/messages/core.mjs.map +1 -1
  143. package/dist/esm/messages/format.mjs +73 -15
  144. package/dist/esm/messages/format.mjs.map +1 -1
  145. package/dist/esm/messages/langchain.mjs +23 -0
  146. package/dist/esm/messages/langchain.mjs.map +1 -0
  147. package/dist/esm/messages/prune.mjs +7 -6
  148. package/dist/esm/messages/prune.mjs.map +1 -1
  149. package/dist/esm/run.mjs +400 -42
  150. package/dist/esm/run.mjs.map +1 -1
  151. package/dist/esm/tools/ToolNode.mjs +557 -57
  152. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  153. package/dist/esm/tools/search/search.mjs +55 -66
  154. package/dist/esm/tools/search/search.mjs.map +1 -1
  155. package/dist/esm/tools/search/tavily-scraper.mjs +186 -0
  156. package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -0
  157. package/dist/esm/tools/search/tavily-search.mjs +370 -0
  158. package/dist/esm/tools/search/tavily-search.mjs.map +1 -0
  159. package/dist/esm/tools/search/tool.mjs +26 -4
  160. package/dist/esm/tools/search/tool.mjs.map +1 -1
  161. package/dist/esm/tools/search/utils.mjs +10 -3
  162. package/dist/esm/tools/search/utils.mjs.map +1 -1
  163. package/dist/types/graphs/Graph.d.ts +7 -0
  164. package/dist/types/hitl/askUserQuestion.d.ts +55 -0
  165. package/dist/types/hitl/index.d.ts +6 -0
  166. package/dist/types/hooks/HookRegistry.d.ts +58 -0
  167. package/dist/types/hooks/createToolPolicyHook.d.ts +87 -0
  168. package/dist/types/hooks/index.d.ts +4 -1
  169. package/dist/types/hooks/types.d.ts +109 -3
  170. package/dist/types/index.d.ts +10 -0
  171. package/dist/types/langchain/google-common.d.ts +1 -0
  172. package/dist/types/langchain/index.d.ts +8 -0
  173. package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
  174. package/dist/types/langchain/messages/tool.d.ts +1 -0
  175. package/dist/types/langchain/messages.d.ts +2 -0
  176. package/dist/types/langchain/openai.d.ts +1 -0
  177. package/dist/types/langchain/prompts.d.ts +1 -0
  178. package/dist/types/langchain/runnables.d.ts +2 -0
  179. package/dist/types/langchain/tools.d.ts +2 -0
  180. package/dist/types/langchain/utils/env.d.ts +1 -0
  181. package/dist/types/llm/anthropic/index.d.ts +22 -9
  182. package/dist/types/llm/anthropic/types.d.ts +5 -1
  183. package/dist/types/llm/anthropic/utils/message_outputs.d.ts +13 -6
  184. package/dist/types/llm/anthropic/utils/output_parsers.d.ts +1 -1
  185. package/dist/types/llm/openai/index.d.ts +21 -24
  186. package/dist/types/llm/openrouter/index.d.ts +11 -9
  187. package/dist/types/llm/vertexai/index.d.ts +1 -0
  188. package/dist/types/messages/cache.d.ts +4 -1
  189. package/dist/types/messages/format.d.ts +4 -1
  190. package/dist/types/messages/langchain.d.ts +27 -0
  191. package/dist/types/run.d.ts +117 -1
  192. package/dist/types/tools/ToolNode.d.ts +26 -1
  193. package/dist/types/tools/search/tavily-scraper.d.ts +19 -0
  194. package/dist/types/tools/search/tavily-search.d.ts +4 -0
  195. package/dist/types/tools/search/types.d.ts +99 -5
  196. package/dist/types/tools/search/utils.d.ts +2 -2
  197. package/dist/types/types/graph.d.ts +23 -37
  198. package/dist/types/types/hitl.d.ts +272 -0
  199. package/dist/types/types/index.d.ts +1 -0
  200. package/dist/types/types/llm.d.ts +3 -3
  201. package/dist/types/types/run.d.ts +33 -0
  202. package/dist/types/types/stream.d.ts +1 -1
  203. package/dist/types/types/tools.d.ts +19 -0
  204. package/package.json +80 -17
  205. package/src/graphs/Graph.ts +33 -4
  206. package/src/graphs/__tests__/composition.smoke.test.ts +188 -0
  207. package/src/hitl/askUserQuestion.ts +72 -0
  208. package/src/hitl/index.ts +7 -0
  209. package/src/hooks/HookRegistry.ts +71 -0
  210. package/src/hooks/__tests__/createToolPolicyHook.test.ts +259 -0
  211. package/src/hooks/createToolPolicyHook.ts +184 -0
  212. package/src/hooks/executeHooks.ts +50 -1
  213. package/src/hooks/index.ts +6 -0
  214. package/src/hooks/types.ts +112 -0
  215. package/src/index.ts +22 -0
  216. package/src/langchain/google-common.ts +1 -0
  217. package/src/langchain/index.ts +8 -0
  218. package/src/langchain/language_models/chat_models.ts +1 -0
  219. package/src/langchain/messages/tool.ts +5 -0
  220. package/src/langchain/messages.ts +21 -0
  221. package/src/langchain/openai.ts +1 -0
  222. package/src/langchain/prompts.ts +1 -0
  223. package/src/langchain/runnables.ts +7 -0
  224. package/src/langchain/tools.ts +8 -0
  225. package/src/langchain/utils/env.ts +1 -0
  226. package/src/llm/anthropic/index.ts +252 -84
  227. package/src/llm/anthropic/llm.spec.ts +751 -102
  228. package/src/llm/anthropic/types.ts +9 -1
  229. package/src/llm/anthropic/utils/message_inputs.ts +37 -19
  230. package/src/llm/anthropic/utils/message_outputs.ts +119 -101
  231. package/src/llm/bedrock/index.ts +2 -2
  232. package/src/llm/bedrock/llm.spec.ts +341 -0
  233. package/src/llm/bedrock/utils/message_inputs.ts +303 -4
  234. package/src/llm/bedrock/utils/message_outputs.ts +2 -1
  235. package/src/llm/custom-chat-models.smoke.test.ts +836 -0
  236. package/src/llm/google/llm.spec.ts +339 -57
  237. package/src/llm/google/utils/common.ts +53 -48
  238. package/src/llm/openai/contentBlocks.test.ts +346 -0
  239. package/src/llm/openai/index.ts +856 -833
  240. package/src/llm/openai/utils/index.ts +107 -78
  241. package/src/llm/openai/utils/messages.test.ts +159 -0
  242. package/src/llm/openrouter/index.ts +124 -247
  243. package/src/llm/openrouter/reasoning.test.ts +8 -1
  244. package/src/llm/vertexai/index.ts +11 -5
  245. package/src/llm/vertexai/llm.spec.ts +28 -1
  246. package/src/messages/cache.test.ts +4 -3
  247. package/src/messages/cache.ts +3 -2
  248. package/src/messages/core.ts +16 -9
  249. package/src/messages/format.ts +96 -16
  250. package/src/messages/formatAgentMessages.test.ts +166 -1
  251. package/src/messages/langchain.ts +39 -0
  252. package/src/messages/prune.ts +12 -8
  253. package/src/run.ts +456 -47
  254. package/src/scripts/caching.ts +2 -3
  255. package/src/specs/summarization.test.ts +51 -58
  256. package/src/tools/ToolNode.ts +706 -63
  257. package/src/tools/__tests__/hitl.test.ts +3593 -0
  258. package/src/tools/search/search.ts +83 -73
  259. package/src/tools/search/tavily-scraper.ts +235 -0
  260. package/src/tools/search/tavily-search.ts +424 -0
  261. package/src/tools/search/tavily.test.ts +965 -0
  262. package/src/tools/search/tool.ts +36 -26
  263. package/src/tools/search/types.ts +133 -8
  264. package/src/tools/search/utils.ts +13 -5
  265. package/src/types/graph.ts +32 -87
  266. package/src/types/hitl.ts +303 -0
  267. package/src/types/index.ts +1 -0
  268. package/src/types/llm.ts +3 -3
  269. package/src/types/run.ts +33 -0
  270. package/src/types/stream.ts +1 -1
  271. package/src/types/tools.ts +19 -0
  272. package/src/utils/llmConfig.ts +1 -6
@@ -13,36 +13,53 @@ import type { Anthropic } from '@anthropic-ai/sdk';
13
13
  import type {
14
14
  AnthropicMessageCreateParams,
15
15
  AnthropicStreamingMessageCreateParams,
16
- AnthropicStreamUsage,
17
16
  AnthropicMessageStartEvent,
18
17
  AnthropicMessageDeltaEvent,
19
18
  AnthropicOutputConfig,
19
+ AnthropicBeta,
20
+ ChatAnthropicToolType,
21
+ AnthropicMCPServerURLDefinition,
22
+ AnthropicContextManagementConfigParam,
20
23
  } from '@/llm/anthropic/types';
21
- import { _makeMessageChunkFromAnthropicEvent } from './utils/message_outputs';
24
+ import {
25
+ _makeMessageChunkFromAnthropicEvent,
26
+ getAnthropicUsageMetadata,
27
+ } from './utils/message_outputs';
22
28
  import { _convertMessagesToAnthropicPayload } from './utils/message_inputs';
23
29
  import { handleToolChoice } from './utils/tools';
24
30
  import { TextStream } from '@/llm/text';
25
31
 
32
+ const ANTHROPIC_TOOL_BETAS: Partial<Record<string, AnthropicBeta>> = {
33
+ tool_search_tool_regex_20251119: 'advanced-tool-use-2025-11-20',
34
+ tool_search_tool_bm25_20251119: 'advanced-tool-use-2025-11-20',
35
+ memory_20250818: 'context-management-2025-06-27',
36
+ web_fetch_20250910: 'web-fetch-2025-09-10',
37
+ code_execution_20250825: 'code-execution-2025-08-25',
38
+ computer_20251124: 'computer-use-2025-11-24',
39
+ computer_20250124: 'computer-use-2025-01-24',
40
+ mcp_toolset: 'mcp-client-2025-11-20',
41
+ };
42
+
26
43
  function _toolsInParams(
27
44
  params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams
28
45
  ): boolean {
29
46
  return !!(params.tools && params.tools.length > 0);
30
47
  }
31
- function _documentsInParams(
48
+ export function _documentsInParams(
32
49
  params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams
33
50
  ): boolean {
34
- for (const message of params.messages ?? []) {
51
+ for (const message of params.messages) {
35
52
  if (typeof message.content === 'string') {
36
53
  continue;
37
54
  }
38
- for (const block of message.content ?? []) {
55
+ for (const block of message.content) {
39
56
  if (
40
57
  typeof block === 'object' &&
41
- block != null &&
58
+ block !== null &&
42
59
  block.type === 'document' &&
43
60
  block.citations != null &&
44
61
  typeof block.citations === 'object' &&
45
- block.citations.enabled
62
+ block.citations.enabled === true
46
63
  ) {
47
64
  return true;
48
65
  }
@@ -61,15 +78,166 @@ function _thinkingInParams(
61
78
  }
62
79
 
63
80
  function _compactionInParams(
64
- params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams
81
+ params: (
82
+ | AnthropicMessageCreateParams
83
+ | AnthropicStreamingMessageCreateParams
84
+ ) & {
85
+ context_management?: AnthropicContextManagementConfigParam;
86
+ }
65
87
  ): boolean {
66
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
67
- const cm = (params as any).context_management;
68
- return !!cm?.edits?.some(
69
- (e: { type: string }) => e.type === 'compact_20260112'
88
+ return (
89
+ params.context_management?.edits?.some(
90
+ (edit) => edit.type === 'compact_20260112'
91
+ ) === true
70
92
  );
71
93
  }
72
94
 
95
+ function isThinkingEnabled(thinking: Anthropic.ThinkingConfigParam): boolean {
96
+ return thinking.type === 'enabled' || thinking.type === 'adaptive';
97
+ }
98
+
99
+ function isOpus47Model(model?: string): boolean {
100
+ return /^claude-opus-4-7(?:-|$)/.test(model ?? '');
101
+ }
102
+
103
+ function combineBetas(
104
+ ...betaGroups: (AnthropicBeta[] | undefined)[]
105
+ ): AnthropicBeta[] {
106
+ const betas = new Set<AnthropicBeta>();
107
+ for (const betaGroup of betaGroups) {
108
+ for (const beta of betaGroup ?? []) {
109
+ betas.add(beta);
110
+ }
111
+ }
112
+ return [...betas];
113
+ }
114
+
115
+ function getToolBetas(tools?: ChatAnthropicToolType[]): AnthropicBeta[] {
116
+ const betas = new Set<AnthropicBeta>();
117
+ for (const tool of tools ?? []) {
118
+ if (typeof tool !== 'object' || !('type' in tool)) {
119
+ continue;
120
+ }
121
+ const beta = ANTHROPIC_TOOL_BETAS[String(tool.type)];
122
+ if (beta != null) {
123
+ betas.add(beta);
124
+ }
125
+ }
126
+ return [...betas];
127
+ }
128
+
129
+ function getCompactionBetas(
130
+ contextManagement?: AnthropicContextManagementConfigParam
131
+ ): AnthropicBeta[] {
132
+ return contextManagement?.edits?.some(
133
+ (edit) => edit.type === 'compact_20260112'
134
+ ) === true
135
+ ? ['compact-2026-01-12']
136
+ : [];
137
+ }
138
+
139
+ function getTaskBudgetBetas(
140
+ model: string,
141
+ outputConfig?: AnthropicOutputConfig
142
+ ): AnthropicBeta[] {
143
+ return isOpus47Model(model) &&
144
+ outputConfig != null &&
145
+ 'task_budget' in outputConfig &&
146
+ outputConfig.task_budget != null
147
+ ? ['task-budgets-2026-03-13']
148
+ : [];
149
+ }
150
+
151
+ function isSetSamplingValue(value?: number | null): value is number {
152
+ return value != null && value !== -1;
153
+ }
154
+
155
+ function isNonDefaultTemperature(value?: number): boolean {
156
+ return isSetSamplingValue(value) && value !== 1;
157
+ }
158
+
159
+ function validateInvocationParamCompatibility({
160
+ model,
161
+ thinking,
162
+ topK,
163
+ topP,
164
+ temperature,
165
+ }: {
166
+ model: string;
167
+ thinking: Anthropic.ThinkingConfigParam;
168
+ topK?: number;
169
+ topP?: number | null;
170
+ temperature?: number;
171
+ }): void {
172
+ const opus47 = isOpus47Model(model);
173
+ if (opus47 && thinking.type === 'enabled') {
174
+ throw new Error(
175
+ 'thinking.type="enabled" is not supported for claude-opus-4-7; use thinking.type="adaptive" instead'
176
+ );
177
+ }
178
+ if (opus47 && 'budget_tokens' in thinking) {
179
+ throw new Error(
180
+ 'thinking.budget_tokens is not supported for claude-opus-4-7; use outputConfig.effort instead'
181
+ );
182
+ }
183
+ if (opus47) {
184
+ if (isSetSamplingValue(topK)) {
185
+ throw new Error(
186
+ 'topK is not supported for claude-opus-4-7; omit topK/topP/temperature or use model prompting instead'
187
+ );
188
+ }
189
+ if (isSetSamplingValue(topP) && topP !== 1) {
190
+ throw new Error(
191
+ 'topP is not supported for claude-opus-4-7 when set to non-default values'
192
+ );
193
+ }
194
+ if (isNonDefaultTemperature(temperature)) {
195
+ throw new Error(
196
+ 'temperature is not supported for claude-opus-4-7 when set to non-default values'
197
+ );
198
+ }
199
+ }
200
+ if (!isThinkingEnabled(thinking)) {
201
+ return;
202
+ }
203
+ if (isSetSamplingValue(topK)) {
204
+ throw new Error('topK is not supported when thinking is enabled');
205
+ }
206
+ if (isSetSamplingValue(topP)) {
207
+ throw new Error('topP is not supported when thinking is enabled');
208
+ }
209
+ if (isNonDefaultTemperature(temperature)) {
210
+ throw new Error('temperature is not supported when thinking is enabled');
211
+ }
212
+ }
213
+
214
+ function getSamplingParams({
215
+ model,
216
+ thinking,
217
+ topK,
218
+ topP,
219
+ temperature,
220
+ }: {
221
+ model: string;
222
+ thinking: Anthropic.ThinkingConfigParam;
223
+ topK?: number;
224
+ topP?: number | null;
225
+ temperature?: number;
226
+ }): {
227
+ temperature?: number;
228
+ top_k?: number;
229
+ top_p?: number;
230
+ } {
231
+ if (isThinkingEnabled(thinking) || isOpus47Model(model)) {
232
+ return {};
233
+ }
234
+ return {
235
+ ...(isSetSamplingValue(temperature) ? { temperature } : {}),
236
+ ...(isSetSamplingValue(topK) ? { top_k: topK } : {}),
237
+ ...(isSetSamplingValue(topP) ? { top_p: topP } : {}),
238
+ };
239
+ }
240
+
73
241
  function extractToken(
74
242
  chunk: AIMessageChunk
75
243
  ): [string, 'string' | 'input' | 'content'] | [undefined] {
@@ -88,13 +256,15 @@ function extractToken(
88
256
  chunk.content.length >= 1 &&
89
257
  'text' in chunk.content[0]
90
258
  ) {
91
- return [chunk.content[0].text, 'content'];
259
+ const text = chunk.content[0].text;
260
+ return typeof text === 'string' ? [text, 'content'] : [undefined];
92
261
  } else if (
93
262
  Array.isArray(chunk.content) &&
94
263
  chunk.content.length >= 1 &&
95
264
  'thinking' in chunk.content[0]
96
265
  ) {
97
- return [chunk.content[0].thinking, 'content'];
266
+ const thinking = chunk.content[0].thinking;
267
+ return typeof thinking === 'string' ? [thinking, 'content'] : [undefined];
98
268
  }
99
269
  return [undefined];
100
270
  }
@@ -122,7 +292,11 @@ function cloneChunk(
122
292
  content: [Object.assign({}, content, { text })],
123
293
  })
124
294
  );
125
- } else if (tokenType === 'content' && content.type?.startsWith('thinking')) {
295
+ } else if (
296
+ tokenType === 'content' &&
297
+ typeof content.type === 'string' &&
298
+ content.type.startsWith('thinking')
299
+ ) {
126
300
  return new AIMessageChunk(
127
301
  Object.assign({}, chunk, {
128
302
  content: [Object.assign({}, content, { thinking: text })],
@@ -137,16 +311,26 @@ export type CustomAnthropicInput = AnthropicInput & {
137
311
  _lc_stream_delay?: number;
138
312
  outputConfig?: AnthropicOutputConfig;
139
313
  inferenceGeo?: string;
140
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
141
- contextManagement?: any;
314
+ contextManagement?: AnthropicContextManagementConfigParam;
142
315
  } & BaseChatModelParams;
143
316
 
144
- /**
145
- * A type representing additional parameters that can be passed to the
146
- * Anthropic API.
147
- */
148
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
149
- type Kwargs = Record<string, any>;
317
+ export type CustomAnthropicCallOptions = {
318
+ outputConfig?: AnthropicOutputConfig;
319
+ outputFormat?: Anthropic.Messages.JSONOutputFormat;
320
+ inferenceGeo?: string;
321
+ betas?: AnthropicBeta[];
322
+ container?: string;
323
+ mcp_servers?: AnthropicMCPServerURLDefinition[];
324
+ };
325
+
326
+ type CustomAnthropicInvocationParams = {
327
+ betas?: AnthropicBeta[];
328
+ container?: string;
329
+ context_management?: AnthropicContextManagementConfigParam;
330
+ inference_geo?: string;
331
+ mcp_servers?: AnthropicMCPServerURLDefinition[];
332
+ output_config?: AnthropicOutputConfig;
333
+ };
150
334
 
151
335
  export class CustomAnthropic extends ChatAnthropicMessages {
152
336
  _lc_stream_delay: number;
@@ -157,8 +341,7 @@ export class CustomAnthropic extends ChatAnthropicMessages {
157
341
  top_k: number | undefined;
158
342
  outputConfig?: AnthropicOutputConfig;
159
343
  inferenceGeo?: string;
160
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
161
- contextManagement?: any;
344
+ contextManagement?: AnthropicContextManagementConfigParam;
162
345
  constructor(fields?: CustomAnthropicInput) {
163
346
  super(fields);
164
347
  this.resetTokenEvents();
@@ -177,20 +360,19 @@ export class CustomAnthropic extends ChatAnthropicMessages {
177
360
  * Get the parameters used to invoke the model
178
361
  */
179
362
  override invocationParams(
180
- options?: this['ParsedCallOptions']
363
+ options?: this['ParsedCallOptions'] & CustomAnthropicCallOptions
181
364
  ): Omit<
182
365
  AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams,
183
366
  'messages'
184
367
  > &
185
- Kwargs {
368
+ CustomAnthropicInvocationParams {
186
369
  const tool_choice:
187
370
  | Anthropic.Messages.ToolChoiceAuto
188
371
  | Anthropic.Messages.ToolChoiceAny
189
372
  | Anthropic.Messages.ToolChoiceTool
190
373
  | undefined = handleToolChoice(options?.tool_choice);
191
374
 
192
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
193
- const callOptions = options as Record<string, any> | undefined;
375
+ const callOptions = options as CustomAnthropicCallOptions | undefined;
194
376
  const mergedOutputConfig: AnthropicOutputConfig | undefined = (():
195
377
  | AnthropicOutputConfig
196
378
  | undefined => {
@@ -207,49 +389,49 @@ export class CustomAnthropic extends ChatAnthropicMessages {
207
389
  const inferenceGeo = callOptions?.inferenceGeo ?? this.inferenceGeo;
208
390
 
209
391
  const contextManagement = this.contextManagement;
392
+ const toolBetas = getToolBetas(options?.tools);
393
+ const compactionBetas = getCompactionBetas(contextManagement);
394
+ const taskBudgetBetas = getTaskBudgetBetas(this.model, mergedOutputConfig);
395
+ const formattedTools = this.formatStructuredToolToAnthropic(options?.tools);
210
396
 
211
397
  const sharedParams = {
212
- tools: this.formatStructuredToolToAnthropic(options?.tools),
398
+ tools: formattedTools,
213
399
  tool_choice,
214
400
  thinking: this.thinking,
215
- ...(mergedOutputConfig ? { output_config: mergedOutputConfig } : {}),
216
- ...(inferenceGeo ? { inference_geo: inferenceGeo } : {}),
217
- ...(contextManagement ? { context_management: contextManagement } : {}),
401
+ context_management: contextManagement,
218
402
  ...this.invocationKwargs,
403
+ container: callOptions?.container,
404
+ betas: combineBetas(
405
+ this.betas,
406
+ callOptions?.betas,
407
+ toolBetas,
408
+ compactionBetas,
409
+ taskBudgetBetas
410
+ ),
411
+ output_config: mergedOutputConfig,
412
+ inference_geo: inferenceGeo,
413
+ mcp_servers: callOptions?.mcp_servers,
219
414
  };
415
+ validateInvocationParamCompatibility({
416
+ model: this.model,
417
+ thinking: this.thinking,
418
+ topK: this.top_k,
419
+ topP: this.topP,
420
+ temperature: this.temperature,
421
+ });
220
422
 
221
- if (this.thinking.type === 'enabled' || this.thinking.type === 'adaptive') {
222
- if (this.top_k !== -1 && (this.top_k as number | undefined) != null) {
223
- throw new Error('topK is not supported when thinking is enabled');
224
- }
225
- if (this.topP !== -1 && (this.topP as number | undefined) != null) {
226
- throw new Error('topP is not supported when thinking is enabled');
227
- }
228
- if (
229
- this.temperature !== 1 &&
230
- (this.temperature as number | undefined) != null
231
- ) {
232
- throw new Error(
233
- 'temperature is not supported when thinking is enabled'
234
- );
235
- }
236
-
237
- return {
238
- model: this.model,
239
- stop_sequences: options?.stop ?? this.stopSequences,
240
- stream: this.streaming,
241
- max_tokens: this.maxTokens,
242
- ...sharedParams,
243
- };
244
- }
245
423
  return {
246
424
  model: this.model,
247
- temperature: this.temperature,
248
- top_k: this.top_k,
249
- top_p: this.topP,
250
425
  stop_sequences: options?.stop ?? this.stopSequences,
251
426
  stream: this.streaming,
252
427
  max_tokens: this.maxTokens,
428
+ ...getSamplingParams({
429
+ model: this.model,
430
+ thinking: this.thinking,
431
+ topK: this.top_k,
432
+ topP: this.topP,
433
+ temperature: this.temperature,
434
+ }),
253
435
  ...sharedParams,
254
436
  };
255
437
  }
@@ -262,34 +444,19 @@ export class CustomAnthropic extends ChatAnthropicMessages {
262
444
  if (this.emitted_usage === true) {
263
445
  return;
264
446
  }
265
- const inputUsage = this.message_start?.message.usage as
266
- | undefined
267
- | AnthropicStreamUsage;
268
- const outputUsage = this.message_delta?.usage as
269
- | undefined
270
- | Partial<AnthropicStreamUsage>;
447
+ const inputUsage = this.message_start?.message.usage;
448
+ const outputUsage = this.message_delta?.usage;
271
449
  if (!outputUsage) {
272
450
  return;
273
451
  }
274
- const totalUsage: UsageMetadata = {
275
- input_tokens: inputUsage?.input_tokens ?? 0,
276
- output_tokens: outputUsage.output_tokens ?? 0,
277
- total_tokens:
278
- (inputUsage?.input_tokens ?? 0) + (outputUsage.output_tokens ?? 0),
279
- };
280
-
281
- if (
282
- inputUsage?.cache_creation_input_tokens != null ||
283
- inputUsage?.cache_read_input_tokens != null
284
- ) {
285
- totalUsage.input_token_details = {
286
- cache_creation: inputUsage.cache_creation_input_tokens ?? 0,
287
- cache_read: inputUsage.cache_read_input_tokens ?? 0,
288
- };
289
- }
290
452
 
291
453
  this.emitted_usage = true;
292
- return totalUsage;
454
+ return getAnthropicUsageMetadata({
455
+ input_tokens: inputUsage?.input_tokens,
456
+ output_tokens: outputUsage.output_tokens,
457
+ cache_creation_input_tokens: inputUsage?.cache_creation_input_tokens,
458
+ cache_read_input_tokens: inputUsage?.cache_read_input_tokens,
459
+ });
293
460
  }
294
461
 
295
462
  resetTokenEvents(): void {
@@ -363,9 +530,10 @@ export class CustomAnthropic extends ChatAnthropicMessages {
363
530
 
364
531
  const stream = await this.createStreamWithRetry(payload, {
365
532
  headers: options.headers,
533
+ signal: options.signal,
366
534
  });
367
535
 
368
- const shouldStreamUsage = this.streamUsage ?? options.streamUsage;
536
+ const shouldStreamUsage = options.streamUsage ?? this.streamUsage;
369
537
 
370
538
  for await (const data of stream) {
371
539
  if (options.signal?.aborted === true) {