@librechat/agents 3.1.57 → 3.1.61

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 (214) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +326 -62
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/enum.cjs +13 -0
  4. package/dist/cjs/common/enum.cjs.map +1 -1
  5. package/dist/cjs/events.cjs +7 -27
  6. package/dist/cjs/events.cjs.map +1 -1
  7. package/dist/cjs/graphs/Graph.cjs +303 -222
  8. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  9. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +4 -4
  10. package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
  11. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +6 -2
  12. package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
  13. package/dist/cjs/llm/init.cjs +60 -0
  14. package/dist/cjs/llm/init.cjs.map +1 -0
  15. package/dist/cjs/llm/invoke.cjs +90 -0
  16. package/dist/cjs/llm/invoke.cjs.map +1 -0
  17. package/dist/cjs/llm/openai/index.cjs +2 -0
  18. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  19. package/dist/cjs/llm/request.cjs +41 -0
  20. package/dist/cjs/llm/request.cjs.map +1 -0
  21. package/dist/cjs/main.cjs +40 -0
  22. package/dist/cjs/main.cjs.map +1 -1
  23. package/dist/cjs/messages/cache.cjs +76 -89
  24. package/dist/cjs/messages/cache.cjs.map +1 -1
  25. package/dist/cjs/messages/contextPruning.cjs +156 -0
  26. package/dist/cjs/messages/contextPruning.cjs.map +1 -0
  27. package/dist/cjs/messages/contextPruningSettings.cjs +53 -0
  28. package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -0
  29. package/dist/cjs/messages/core.cjs +23 -37
  30. package/dist/cjs/messages/core.cjs.map +1 -1
  31. package/dist/cjs/messages/format.cjs +156 -11
  32. package/dist/cjs/messages/format.cjs.map +1 -1
  33. package/dist/cjs/messages/prune.cjs +1161 -49
  34. package/dist/cjs/messages/prune.cjs.map +1 -1
  35. package/dist/cjs/messages/reducer.cjs +87 -0
  36. package/dist/cjs/messages/reducer.cjs.map +1 -0
  37. package/dist/cjs/run.cjs +81 -42
  38. package/dist/cjs/run.cjs.map +1 -1
  39. package/dist/cjs/stream.cjs +54 -7
  40. package/dist/cjs/stream.cjs.map +1 -1
  41. package/dist/cjs/summarization/index.cjs +75 -0
  42. package/dist/cjs/summarization/index.cjs.map +1 -0
  43. package/dist/cjs/summarization/node.cjs +663 -0
  44. package/dist/cjs/summarization/node.cjs.map +1 -0
  45. package/dist/cjs/tools/ToolNode.cjs +16 -8
  46. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  47. package/dist/cjs/tools/handlers.cjs +2 -0
  48. package/dist/cjs/tools/handlers.cjs.map +1 -1
  49. package/dist/cjs/utils/errors.cjs +115 -0
  50. package/dist/cjs/utils/errors.cjs.map +1 -0
  51. package/dist/cjs/utils/events.cjs +17 -0
  52. package/dist/cjs/utils/events.cjs.map +1 -1
  53. package/dist/cjs/utils/handlers.cjs +16 -0
  54. package/dist/cjs/utils/handlers.cjs.map +1 -1
  55. package/dist/cjs/utils/llm.cjs +10 -0
  56. package/dist/cjs/utils/llm.cjs.map +1 -1
  57. package/dist/cjs/utils/tokens.cjs +247 -14
  58. package/dist/cjs/utils/tokens.cjs.map +1 -1
  59. package/dist/cjs/utils/truncation.cjs +107 -0
  60. package/dist/cjs/utils/truncation.cjs.map +1 -0
  61. package/dist/esm/agents/AgentContext.mjs +325 -61
  62. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  63. package/dist/esm/common/enum.mjs +13 -0
  64. package/dist/esm/common/enum.mjs.map +1 -1
  65. package/dist/esm/events.mjs +8 -28
  66. package/dist/esm/events.mjs.map +1 -1
  67. package/dist/esm/graphs/Graph.mjs +307 -226
  68. package/dist/esm/graphs/Graph.mjs.map +1 -1
  69. package/dist/esm/llm/anthropic/utils/message_inputs.mjs +4 -4
  70. package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
  71. package/dist/esm/llm/bedrock/utils/message_inputs.mjs +6 -2
  72. package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
  73. package/dist/esm/llm/init.mjs +58 -0
  74. package/dist/esm/llm/init.mjs.map +1 -0
  75. package/dist/esm/llm/invoke.mjs +87 -0
  76. package/dist/esm/llm/invoke.mjs.map +1 -0
  77. package/dist/esm/llm/openai/index.mjs +2 -0
  78. package/dist/esm/llm/openai/index.mjs.map +1 -1
  79. package/dist/esm/llm/request.mjs +38 -0
  80. package/dist/esm/llm/request.mjs.map +1 -0
  81. package/dist/esm/main.mjs +13 -3
  82. package/dist/esm/main.mjs.map +1 -1
  83. package/dist/esm/messages/cache.mjs +76 -89
  84. package/dist/esm/messages/cache.mjs.map +1 -1
  85. package/dist/esm/messages/contextPruning.mjs +154 -0
  86. package/dist/esm/messages/contextPruning.mjs.map +1 -0
  87. package/dist/esm/messages/contextPruningSettings.mjs +50 -0
  88. package/dist/esm/messages/contextPruningSettings.mjs.map +1 -0
  89. package/dist/esm/messages/core.mjs +23 -37
  90. package/dist/esm/messages/core.mjs.map +1 -1
  91. package/dist/esm/messages/format.mjs +156 -11
  92. package/dist/esm/messages/format.mjs.map +1 -1
  93. package/dist/esm/messages/prune.mjs +1158 -52
  94. package/dist/esm/messages/prune.mjs.map +1 -1
  95. package/dist/esm/messages/reducer.mjs +83 -0
  96. package/dist/esm/messages/reducer.mjs.map +1 -0
  97. package/dist/esm/run.mjs +82 -43
  98. package/dist/esm/run.mjs.map +1 -1
  99. package/dist/esm/stream.mjs +54 -7
  100. package/dist/esm/stream.mjs.map +1 -1
  101. package/dist/esm/summarization/index.mjs +73 -0
  102. package/dist/esm/summarization/index.mjs.map +1 -0
  103. package/dist/esm/summarization/node.mjs +659 -0
  104. package/dist/esm/summarization/node.mjs.map +1 -0
  105. package/dist/esm/tools/ToolNode.mjs +16 -8
  106. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  107. package/dist/esm/tools/handlers.mjs +2 -0
  108. package/dist/esm/tools/handlers.mjs.map +1 -1
  109. package/dist/esm/utils/errors.mjs +111 -0
  110. package/dist/esm/utils/errors.mjs.map +1 -0
  111. package/dist/esm/utils/events.mjs +17 -1
  112. package/dist/esm/utils/events.mjs.map +1 -1
  113. package/dist/esm/utils/handlers.mjs +16 -0
  114. package/dist/esm/utils/handlers.mjs.map +1 -1
  115. package/dist/esm/utils/llm.mjs +10 -1
  116. package/dist/esm/utils/llm.mjs.map +1 -1
  117. package/dist/esm/utils/tokens.mjs +245 -15
  118. package/dist/esm/utils/tokens.mjs.map +1 -1
  119. package/dist/esm/utils/truncation.mjs +102 -0
  120. package/dist/esm/utils/truncation.mjs.map +1 -0
  121. package/dist/types/agents/AgentContext.d.ts +124 -6
  122. package/dist/types/common/enum.d.ts +14 -1
  123. package/dist/types/graphs/Graph.d.ts +22 -27
  124. package/dist/types/index.d.ts +5 -0
  125. package/dist/types/llm/init.d.ts +18 -0
  126. package/dist/types/llm/invoke.d.ts +48 -0
  127. package/dist/types/llm/request.d.ts +14 -0
  128. package/dist/types/messages/contextPruning.d.ts +42 -0
  129. package/dist/types/messages/contextPruningSettings.d.ts +44 -0
  130. package/dist/types/messages/core.d.ts +1 -1
  131. package/dist/types/messages/format.d.ts +17 -1
  132. package/dist/types/messages/index.d.ts +3 -0
  133. package/dist/types/messages/prune.d.ts +162 -1
  134. package/dist/types/messages/reducer.d.ts +18 -0
  135. package/dist/types/run.d.ts +12 -1
  136. package/dist/types/summarization/index.d.ts +20 -0
  137. package/dist/types/summarization/node.d.ts +29 -0
  138. package/dist/types/tools/ToolNode.d.ts +3 -1
  139. package/dist/types/types/graph.d.ts +44 -6
  140. package/dist/types/types/index.d.ts +1 -0
  141. package/dist/types/types/run.d.ts +30 -0
  142. package/dist/types/types/stream.d.ts +31 -4
  143. package/dist/types/types/summarize.d.ts +47 -0
  144. package/dist/types/types/tools.d.ts +7 -0
  145. package/dist/types/utils/errors.d.ts +28 -0
  146. package/dist/types/utils/events.d.ts +13 -0
  147. package/dist/types/utils/index.d.ts +2 -0
  148. package/dist/types/utils/llm.d.ts +4 -0
  149. package/dist/types/utils/tokens.d.ts +14 -1
  150. package/dist/types/utils/truncation.d.ts +49 -0
  151. package/package.json +3 -3
  152. package/src/agents/AgentContext.ts +388 -58
  153. package/src/agents/__tests__/AgentContext.test.ts +265 -5
  154. package/src/common/enum.ts +13 -0
  155. package/src/events.ts +9 -39
  156. package/src/graphs/Graph.ts +468 -331
  157. package/src/index.ts +7 -0
  158. package/src/llm/anthropic/llm.spec.ts +3 -3
  159. package/src/llm/anthropic/utils/message_inputs.ts +6 -4
  160. package/src/llm/bedrock/llm.spec.ts +1 -1
  161. package/src/llm/bedrock/utils/message_inputs.ts +6 -2
  162. package/src/llm/init.ts +63 -0
  163. package/src/llm/invoke.ts +144 -0
  164. package/src/llm/request.ts +55 -0
  165. package/src/messages/__tests__/observationMasking.test.ts +221 -0
  166. package/src/messages/cache.ts +77 -102
  167. package/src/messages/contextPruning.ts +191 -0
  168. package/src/messages/contextPruningSettings.ts +90 -0
  169. package/src/messages/core.ts +32 -53
  170. package/src/messages/ensureThinkingBlock.test.ts +39 -39
  171. package/src/messages/format.ts +227 -15
  172. package/src/messages/formatAgentMessages.test.ts +511 -1
  173. package/src/messages/index.ts +3 -0
  174. package/src/messages/prune.ts +1548 -62
  175. package/src/messages/reducer.ts +22 -0
  176. package/src/run.ts +104 -51
  177. package/src/scripts/bedrock-merge-test.ts +1 -1
  178. package/src/scripts/test-thinking-handoff-bedrock.ts +1 -1
  179. package/src/scripts/test-thinking-handoff.ts +1 -1
  180. package/src/scripts/thinking-bedrock.ts +1 -1
  181. package/src/scripts/thinking.ts +1 -1
  182. package/src/specs/anthropic.simple.test.ts +1 -1
  183. package/src/specs/multi-agent-summarization.test.ts +396 -0
  184. package/src/specs/prune.test.ts +1196 -23
  185. package/src/specs/summarization-unit.test.ts +868 -0
  186. package/src/specs/summarization.test.ts +3827 -0
  187. package/src/specs/summarize-prune.test.ts +376 -0
  188. package/src/specs/thinking-handoff.test.ts +10 -10
  189. package/src/specs/thinking-prune.test.ts +7 -4
  190. package/src/specs/token-accounting-e2e.test.ts +1034 -0
  191. package/src/specs/token-accounting-pipeline.test.ts +882 -0
  192. package/src/specs/token-distribution-edge-case.test.ts +25 -26
  193. package/src/splitStream.test.ts +42 -33
  194. package/src/stream.ts +64 -11
  195. package/src/summarization/__tests__/aggregator.test.ts +153 -0
  196. package/src/summarization/__tests__/node.test.ts +708 -0
  197. package/src/summarization/__tests__/trigger.test.ts +50 -0
  198. package/src/summarization/index.ts +102 -0
  199. package/src/summarization/node.ts +982 -0
  200. package/src/tools/ToolNode.ts +25 -3
  201. package/src/types/graph.ts +62 -7
  202. package/src/types/index.ts +1 -0
  203. package/src/types/run.ts +32 -0
  204. package/src/types/stream.ts +45 -5
  205. package/src/types/summarize.ts +58 -0
  206. package/src/types/tools.ts +7 -0
  207. package/src/utils/errors.ts +117 -0
  208. package/src/utils/events.ts +31 -0
  209. package/src/utils/handlers.ts +18 -0
  210. package/src/utils/index.ts +2 -0
  211. package/src/utils/llm.ts +12 -0
  212. package/src/utils/tokens.ts +336 -18
  213. package/src/utils/truncation.ts +124 -0
  214. package/src/scripts/image.ts +0 -180
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  BaseMessage,
3
+ RemoveMessage,
3
4
  BaseMessageLike,
4
5
  coerceMessageLikeToMessage,
5
6
  } from '@langchain/core/messages';
@@ -7,6 +8,27 @@ import { v4 } from 'uuid';
7
8
 
8
9
  export const REMOVE_ALL_MESSAGES = '__remove_all__';
9
10
 
11
+ /**
12
+ * Creates a message that instructs messagesStateReducer to remove ALL
13
+ * existing messages from state. Messages appearing after this one in
14
+ * the array become the new state.
15
+ *
16
+ * Usage (in a node return value):
17
+ * ```ts
18
+ * return { messages: [createRemoveAllMessage(), ...survivingMessages] };
19
+ * ```
20
+ *
21
+ * This works because the reducer checks for `getType() === 'remove'`
22
+ * with `id === REMOVE_ALL_MESSAGES` and discards everything before it.
23
+ *
24
+ * NOTE: Uses RemoveMessage from @langchain/core with a sentinel id so
25
+ * the reducer can distinguish a "remove-all" marker from a single-message
26
+ * removal.
27
+ */
28
+ export function createRemoveAllMessage(): BaseMessage {
29
+ return new RemoveMessage({ id: REMOVE_ALL_MESSAGES });
30
+ }
31
+
10
32
  export type Messages =
11
33
  | Array<BaseMessage | BaseMessageLike>
12
34
  | BaseMessage
package/src/run.ts CHANGED
@@ -20,6 +20,7 @@ import { createTokenCounter, encodingForModel } from '@/utils/tokens';
20
20
  import { GraphEvents, Callback, TitleMethod } from '@/common';
21
21
  import { MultiAgentGraph } from '@/graphs/MultiAgentGraph';
22
22
  import { StandardGraph } from '@/graphs/Graph';
23
+ import { initializeModel } from '@/llm/init';
23
24
  import { HandlerRegistry } from '@/events';
24
25
  import { isOpenAILike } from '@/utils/llm';
25
26
  import { isPresent } from '@/utils/misc';
@@ -42,10 +43,12 @@ export class Run<_T extends t.BaseGraphState> {
42
43
  private tokenCounter?: t.TokenCounter;
43
44
  private handlerRegistry?: HandlerRegistry;
44
45
  private indexTokenCountMap?: Record<string, number>;
46
+ calibrationRatio: number = 1;
45
47
  graphRunnable?: t.CompiledStateWorkflow;
46
48
  Graph: StandardGraph | MultiAgentGraph | undefined;
47
49
  returnContent: boolean = false;
48
50
  private skipCleanup: boolean = false;
51
+ private _streamResult: t.MessageContentComplex[] | undefined;
49
52
 
50
53
  private constructor(config: Partial<t.RunConfig>) {
51
54
  const runId = config.runId ?? '';
@@ -56,6 +59,9 @@ export class Run<_T extends t.BaseGraphState> {
56
59
  this.id = runId;
57
60
  this.tokenCounter = config.tokenCounter;
58
61
  this.indexTokenCountMap = config.indexTokenCountMap;
62
+ if (config.calibrationRatio != null && config.calibrationRatio > 0) {
63
+ this.calibrationRatio = config.calibrationRatio;
64
+ }
59
65
 
60
66
  const handlerRegistry = new HandlerRegistry();
61
67
 
@@ -133,6 +139,7 @@ export class Run<_T extends t.BaseGraphState> {
133
139
  agents: [agentConfig],
134
140
  tokenCounter: this.tokenCounter,
135
141
  indexTokenCountMap: this.indexTokenCountMap,
142
+ calibrationRatio: this.calibrationRatio,
136
143
  });
137
144
  /** Propagate compile options from graph config */
138
145
  standardGraph.compileOptions = config.compileOptions;
@@ -151,6 +158,7 @@ export class Run<_T extends t.BaseGraphState> {
151
158
  edges,
152
159
  tokenCounter: this.tokenCounter,
153
160
  indexTokenCountMap: this.indexTokenCountMap,
161
+ calibrationRatio: this.calibrationRatio,
154
162
  });
155
163
 
156
164
  if (compileOptions != null) {
@@ -184,6 +192,24 @@ export class Run<_T extends t.BaseGraphState> {
184
192
  return this.Graph.getRunMessages();
185
193
  }
186
194
 
195
+ /**
196
+ * Returns the current calibration ratio (EMA of provider-vs-estimate token ratios).
197
+ * Hosts should persist this value and pass it back as `RunConfig.calibrationRatio`
198
+ * on the next run for the same conversation so the pruner starts with an accurate
199
+ * scaling factor instead of the default (1).
200
+ */
201
+ getCalibrationRatio(): number {
202
+ return this.calibrationRatio;
203
+ }
204
+
205
+ getResolvedInstructionOverhead(): number | undefined {
206
+ return this.Graph?.getResolvedInstructionOverhead();
207
+ }
208
+
209
+ getToolCount(): number {
210
+ return this.Graph?.getToolCount() ?? 0;
211
+ }
212
+
187
213
  /**
188
214
  * Creates a custom event callback handler that intercepts custom events
189
215
  * and processes them through our handler registry instead of EventStreamCallbackHandler
@@ -196,6 +222,16 @@ export class Run<_T extends t.BaseGraphState> {
196
222
  tags?: string[],
197
223
  metadata?: Record<string, unknown>
198
224
  ): Promise<void> => {
225
+ // ON_RUN_STEP is dispatched directly via handler registry in
226
+ // Graph.dispatchRunStep (primary, reliable path). Skip the
227
+ // callback-based dispatch to prevent double handling.
228
+ if (
229
+ eventName === GraphEvents.ON_RUN_STEP &&
230
+ this.Graph != null &&
231
+ this.Graph.handlerDispatchedStepIds.has((data as t.RunStep).id)
232
+ ) {
233
+ return;
234
+ }
199
235
  const handler = this.handlerRegistry?.getHandler(eventName);
200
236
  if (handler && this.Graph) {
201
237
  return await handler.handle(
@@ -217,7 +253,10 @@ export class Run<_T extends t.BaseGraphState> {
217
253
 
218
254
  async processStream(
219
255
  inputs: t.IState,
220
- config: Partial<RunnableConfig> & { version: 'v1' | 'v2'; run_id?: string },
256
+ callerConfig: Partial<RunnableConfig> & {
257
+ version: 'v1' | 'v2';
258
+ run_id?: string;
259
+ },
221
260
  streamOptions?: t.EventStreamOptions
222
261
  ): Promise<MessageContentComplex[] | undefined> {
223
262
  if (this.graphRunnable == null) {
@@ -231,6 +270,15 @@ export class Run<_T extends t.BaseGraphState> {
231
270
  );
232
271
  }
233
272
 
273
+ const config: Partial<RunnableConfig> & {
274
+ version: 'v1' | 'v2';
275
+ run_id?: string;
276
+ } = {
277
+ recursionLimit: 50,
278
+ ...callerConfig,
279
+ configurable: { ...callerConfig.configurable },
280
+ };
281
+
234
282
  this.Graph.resetValues(streamOptions?.keepContent);
235
283
 
236
284
  /** Custom event callback to intercept and handle custom events */
@@ -293,61 +341,68 @@ export class Run<_T extends t.BaseGraphState> {
293
341
  ignoreCustomEvent: true,
294
342
  });
295
343
 
296
- for await (const event of stream) {
297
- const { data, metadata, ...info } = event;
344
+ try {
345
+ for await (const event of stream) {
346
+ const { data, metadata, ...info } = event;
298
347
 
299
- const eventName: t.EventName = info.event;
348
+ const eventName: t.EventName = info.event;
300
349
 
301
- /** Skip custom events as they're handled by our callback */
302
- if (eventName === GraphEvents.ON_CUSTOM_EVENT) {
303
- continue;
304
- }
350
+ /** Skip custom events as they're handled by our callback */
351
+ if (eventName === GraphEvents.ON_CUSTOM_EVENT) {
352
+ continue;
353
+ }
305
354
 
306
- const handler = this.handlerRegistry?.getHandler(eventName);
307
- if (handler) {
308
- await handler.handle(eventName, data, metadata, this.Graph);
355
+ const handler = this.handlerRegistry?.getHandler(eventName);
356
+ if (handler) {
357
+ await handler.handle(eventName, data, metadata, this.Graph);
358
+ }
309
359
  }
310
- }
311
-
312
- /**
313
- * Break the reference chain that keeps heavy data alive via
314
- * LangGraph's internal `__pregel_scratchpad.currentTaskInput` →
315
- * `@langchain/core` `RunTree.extra[lc:child_config]`
316
- * Node.js `AsyncLocalStorage` context captured by timers/promises.
317
- *
318
- * Without this, base64-encoded images/PDFs in message content remain
319
- * reachable from lingering `Timeout` handles until GC runs.
320
- */
321
- if (!this.skipCleanup) {
322
- if (
323
- (config.configurable as Record<string, unknown> | undefined) != null
324
- ) {
325
- for (const key of Object.getOwnPropertySymbols(config.configurable)) {
326
- const val = config.configurable[key as unknown as string] as
327
- | Record<string, unknown>
328
- | undefined;
329
- if (
330
- val != null &&
331
- typeof val === 'object' &&
332
- 'currentTaskInput' in val
333
- ) {
334
- (val as Record<string, unknown>).currentTaskInput = undefined;
360
+ } finally {
361
+ /**
362
+ * Break the reference chain that keeps heavy data alive via
363
+ * LangGraph's internal `__pregel_scratchpad.currentTaskInput`
364
+ * `@langchain/core` `RunTree.extra[lc:child_config]` →
365
+ * Node.js `AsyncLocalStorage` context captured by timers/promises.
366
+ *
367
+ * Without this, base64-encoded images/PDFs in message content remain
368
+ * reachable from lingering `Timeout` handles until GC runs.
369
+ */
370
+ if (!this.skipCleanup) {
371
+ if (
372
+ (config.configurable as Record<string, unknown> | undefined) != null
373
+ ) {
374
+ for (const key of Object.getOwnPropertySymbols(config.configurable)) {
375
+ const val = config.configurable[key as unknown as string] as
376
+ | Record<string, unknown>
377
+ | undefined;
378
+ if (
379
+ val != null &&
380
+ typeof val === 'object' &&
381
+ 'currentTaskInput' in val
382
+ ) {
383
+ (val as Record<string, unknown>).currentTaskInput = undefined;
384
+ }
385
+ delete config.configurable[key as unknown as string];
335
386
  }
336
- delete config.configurable[key as unknown as string];
387
+ config.configurable = undefined;
337
388
  }
338
- config.configurable = undefined;
389
+ config.callbacks = undefined;
339
390
  }
340
- config.callbacks = undefined;
341
- }
342
391
 
343
- const result = this.returnContent
344
- ? this.Graph.getContentParts()
345
- : undefined;
392
+ const result = this.returnContent
393
+ ? this.Graph.getContentParts()
394
+ : undefined;
395
+
396
+ this.calibrationRatio = this.Graph.getCalibrationRatio();
397
+
398
+ if (!this.skipCleanup) {
399
+ this.Graph.clearHeavyState();
400
+ }
346
401
 
347
- if (!this.skipCleanup) {
348
- this.Graph.clearHeavyState();
402
+ this._streamResult = result;
349
403
  }
350
- return result;
404
+
405
+ return this._streamResult;
351
406
  }
352
407
 
353
408
  private createSystemCallback<K extends keyof t.ClientCallbacks>(
@@ -422,13 +477,11 @@ export class Run<_T extends t.BaseGraphState> {
422
477
  })
423
478
  .join('\n');
424
479
 
425
- const model = this.Graph?.getNewModel({
480
+ const model = initializeModel({
426
481
  provider,
427
482
  clientOptions,
428
- });
429
- if (!model) {
430
- return { language: '', title: '' };
431
- }
483
+ }) as t.ChatModelInstance;
484
+
432
485
  if (
433
486
  isOpenAILike(provider) &&
434
487
  (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)
@@ -9,7 +9,7 @@ import { Providers } from '@/common';
9
9
 
10
10
  async function testBedrockMerge(): Promise<void> {
11
11
  const model = new CustomChatBedrockConverse({
12
- model: 'us.anthropic.claude-3-7-sonnet-20250219-v1:0',
12
+ model: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',
13
13
  region: process.env.BEDROCK_AWS_REGION,
14
14
  credentials: {
15
15
  accessKeyId: process.env.BEDROCK_AWS_ACCESS_KEY_ID!,
@@ -56,7 +56,7 @@ async function testBedrockThinkingHandoff() {
56
56
  provider: Providers.BEDROCK,
57
57
  clientOptions: {
58
58
  region: process.env.BEDROCK_AWS_REGION || 'us-east-1',
59
- model: 'us.anthropic.claude-3-7-sonnet-20250219-v1:0',
59
+ model: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',
60
60
  credentials: {
61
61
  accessKeyId: process.env.BEDROCK_AWS_ACCESS_KEY_ID!,
62
62
  secretAccessKey: process.env.BEDROCK_AWS_SECRET_ACCESS_KEY!,
@@ -63,7 +63,7 @@ async function testThinkingHandoff() {
63
63
  agentId: 'code_reviewer',
64
64
  provider: Providers.ANTHROPIC,
65
65
  clientOptions: {
66
- modelName: 'claude-3-7-sonnet-20250219',
66
+ modelName: 'claude-sonnet-4-5-20250929',
67
67
  apiKey: process.env.ANTHROPIC_API_KEY,
68
68
  thinking: {
69
69
  type: 'enabled',
@@ -75,7 +75,7 @@ async function testBedrockThinking(): Promise<void> {
75
75
  // Enable thinking with token budget for Bedrock
76
76
  const llmConfig = {
77
77
  ...baseLlmConfig,
78
- model: 'us.anthropic.claude-3-7-sonnet-20250219-v1:0',
78
+ model: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0',
79
79
  maxTokens: 5000,
80
80
  additionalModelRequestFields: {
81
81
  thinking: { type: 'enabled', budget_tokens: 2000 },
@@ -79,7 +79,7 @@ async function testThinking(): Promise<void> {
79
79
  // Enable thinking with token budget
80
80
  const llmConfig = {
81
81
  ...baseLlmConfig,
82
- model: 'claude-3-7-sonnet-latest',
82
+ model: 'claude-sonnet-4-5-20250929',
83
83
  thinking: { type: 'enabled', budget_tokens: 2000 },
84
84
  };
85
85
 
@@ -24,7 +24,7 @@ import { Run } from '@/run';
24
24
 
25
25
  const provider = Providers.ANTHROPIC;
26
26
  describe(`${capitalizeFirstLetter(provider)} Streaming Tests`, () => {
27
- jest.setTimeout(60000);
27
+ jest.setTimeout(90000);
28
28
  let run: Run<t.IState>;
29
29
  let runningHistory: BaseMessage[];
30
30
  let collectedUsage: UsageMetadata[];