@librechat/agents 3.1.86 → 3.1.88

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 (160) hide show
  1. package/README.md +69 -0
  2. package/dist/cjs/events.cjs +23 -0
  3. package/dist/cjs/events.cjs.map +1 -1
  4. package/dist/cjs/graphs/Graph.cjs +133 -18
  5. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  6. package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
  7. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  8. package/dist/cjs/llm/anthropic/index.cjs +251 -53
  9. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  10. package/dist/cjs/llm/init.cjs +1 -5
  11. package/dist/cjs/llm/init.cjs.map +1 -1
  12. package/dist/cjs/llm/openai/index.cjs +113 -24
  13. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  14. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  15. package/dist/cjs/llm/openrouter/index.cjs +3 -1
  16. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  17. package/dist/cjs/main.cjs +18 -5
  18. package/dist/cjs/main.cjs.map +1 -1
  19. package/dist/cjs/openai/index.cjs +253 -0
  20. package/dist/cjs/openai/index.cjs.map +1 -0
  21. package/dist/cjs/responses/index.cjs +448 -0
  22. package/dist/cjs/responses/index.cjs.map +1 -0
  23. package/dist/cjs/run.cjs +108 -7
  24. package/dist/cjs/run.cjs.map +1 -1
  25. package/dist/cjs/session/AgentSession.cjs +1057 -0
  26. package/dist/cjs/session/AgentSession.cjs.map +1 -0
  27. package/dist/cjs/session/JsonlSessionStore.cjs +425 -0
  28. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -0
  29. package/dist/cjs/session/handlers.cjs +221 -0
  30. package/dist/cjs/session/handlers.cjs.map +1 -0
  31. package/dist/cjs/session/ids.cjs +22 -0
  32. package/dist/cjs/session/ids.cjs.map +1 -0
  33. package/dist/cjs/session/messageSerialization.cjs +179 -0
  34. package/dist/cjs/session/messageSerialization.cjs.map +1 -0
  35. package/dist/cjs/stream.cjs +475 -11
  36. package/dist/cjs/stream.cjs.map +1 -1
  37. package/dist/cjs/summarization/node.cjs +1 -1
  38. package/dist/cjs/summarization/node.cjs.map +1 -1
  39. package/dist/cjs/tools/ToolNode.cjs +177 -59
  40. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  41. package/dist/cjs/tools/eagerEventExecution.cjs +113 -0
  42. package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -0
  43. package/dist/cjs/tools/handlers.cjs +1 -1
  44. package/dist/cjs/tools/handlers.cjs.map +1 -1
  45. package/dist/cjs/tools/streamedToolCallSeals.cjs +42 -0
  46. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -0
  47. package/dist/esm/events.mjs +23 -1
  48. package/dist/esm/events.mjs.map +1 -1
  49. package/dist/esm/graphs/Graph.mjs +133 -18
  50. package/dist/esm/graphs/Graph.mjs.map +1 -1
  51. package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
  52. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  53. package/dist/esm/llm/anthropic/index.mjs +251 -53
  54. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  55. package/dist/esm/llm/init.mjs +1 -5
  56. package/dist/esm/llm/init.mjs.map +1 -1
  57. package/dist/esm/llm/openai/index.mjs +113 -25
  58. package/dist/esm/llm/openai/index.mjs.map +1 -1
  59. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  60. package/dist/esm/llm/openrouter/index.mjs +4 -2
  61. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  62. package/dist/esm/main.mjs +5 -1
  63. package/dist/esm/main.mjs.map +1 -1
  64. package/dist/esm/openai/index.mjs +246 -0
  65. package/dist/esm/openai/index.mjs.map +1 -0
  66. package/dist/esm/responses/index.mjs +440 -0
  67. package/dist/esm/responses/index.mjs.map +1 -0
  68. package/dist/esm/run.mjs +108 -7
  69. package/dist/esm/run.mjs.map +1 -1
  70. package/dist/esm/session/AgentSession.mjs +1054 -0
  71. package/dist/esm/session/AgentSession.mjs.map +1 -0
  72. package/dist/esm/session/JsonlSessionStore.mjs +422 -0
  73. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -0
  74. package/dist/esm/session/handlers.mjs +219 -0
  75. package/dist/esm/session/handlers.mjs.map +1 -0
  76. package/dist/esm/session/ids.mjs +17 -0
  77. package/dist/esm/session/ids.mjs.map +1 -0
  78. package/dist/esm/session/messageSerialization.mjs +173 -0
  79. package/dist/esm/session/messageSerialization.mjs.map +1 -0
  80. package/dist/esm/stream.mjs +476 -12
  81. package/dist/esm/stream.mjs.map +1 -1
  82. package/dist/esm/summarization/node.mjs +1 -1
  83. package/dist/esm/summarization/node.mjs.map +1 -1
  84. package/dist/esm/tools/ToolNode.mjs +177 -59
  85. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  86. package/dist/esm/tools/eagerEventExecution.mjs +107 -0
  87. package/dist/esm/tools/eagerEventExecution.mjs.map +1 -0
  88. package/dist/esm/tools/handlers.mjs +1 -1
  89. package/dist/esm/tools/handlers.mjs.map +1 -1
  90. package/dist/esm/tools/streamedToolCallSeals.mjs +36 -0
  91. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -0
  92. package/dist/types/events.d.ts +1 -0
  93. package/dist/types/graphs/Graph.d.ts +24 -9
  94. package/dist/types/index.d.ts +1 -0
  95. package/dist/types/llm/openai/index.d.ts +1 -0
  96. package/dist/types/openai/index.d.ts +75 -0
  97. package/dist/types/responses/index.d.ts +97 -0
  98. package/dist/types/run.d.ts +2 -0
  99. package/dist/types/session/AgentSession.d.ts +32 -0
  100. package/dist/types/session/JsonlSessionStore.d.ts +67 -0
  101. package/dist/types/session/handlers.d.ts +8 -0
  102. package/dist/types/session/ids.d.ts +4 -0
  103. package/dist/types/session/index.d.ts +5 -0
  104. package/dist/types/session/messageSerialization.d.ts +7 -0
  105. package/dist/types/session/types.d.ts +191 -0
  106. package/dist/types/tools/ToolNode.d.ts +12 -1
  107. package/dist/types/tools/eagerEventExecution.d.ts +23 -0
  108. package/dist/types/tools/streamedToolCallSeals.d.ts +13 -0
  109. package/dist/types/types/hitl.d.ts +4 -0
  110. package/dist/types/types/run.d.ts +11 -1
  111. package/dist/types/types/tools.d.ts +36 -0
  112. package/package.json +19 -2
  113. package/src/__tests__/stream.eagerEventExecution.test.ts +2571 -0
  114. package/src/events.ts +29 -0
  115. package/src/graphs/Graph.ts +224 -50
  116. package/src/graphs/MultiAgentGraph.ts +1 -1
  117. package/src/graphs/__tests__/composition.smoke.test.ts +30 -0
  118. package/src/index.ts +3 -0
  119. package/src/llm/anthropic/index.ts +356 -84
  120. package/src/llm/anthropic/llm.spec.ts +64 -0
  121. package/src/llm/custom-chat-models.smoke.test.ts +175 -4
  122. package/src/llm/openai/contentBlocks.test.ts +35 -0
  123. package/src/llm/openai/deepseek.test.ts +201 -2
  124. package/src/llm/openai/index.ts +171 -26
  125. package/src/llm/openai/utils/index.ts +22 -0
  126. package/src/llm/openrouter/index.ts +4 -2
  127. package/src/openai/__tests__/openai.test.ts +337 -0
  128. package/src/openai/index.ts +404 -0
  129. package/src/responses/__tests__/responses.test.ts +652 -0
  130. package/src/responses/index.ts +677 -0
  131. package/src/run.ts +158 -8
  132. package/src/scripts/compare_pi_vs_ours.ts +592 -173
  133. package/src/scripts/session_live.ts +548 -0
  134. package/src/session/AgentSession.ts +1432 -0
  135. package/src/session/JsonlSessionStore.ts +572 -0
  136. package/src/session/__tests__/JsonlSessionStore.test.ts +1410 -0
  137. package/src/session/__tests__/handlers.test.ts +161 -0
  138. package/src/session/handlers.ts +272 -0
  139. package/src/session/ids.ts +17 -0
  140. package/src/session/index.ts +44 -0
  141. package/src/session/messageSerialization.ts +207 -0
  142. package/src/session/types.ts +275 -0
  143. package/src/specs/custom-event-await.test.ts +89 -0
  144. package/src/specs/summarization.test.ts +1 -1
  145. package/src/stream.ts +756 -48
  146. package/src/summarization/node.ts +1 -1
  147. package/src/tools/ToolNode.ts +299 -126
  148. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +373 -0
  149. package/src/tools/__tests__/handlers.test.ts +2 -1
  150. package/src/tools/__tests__/hitl.test.ts +206 -110
  151. package/src/tools/eagerEventExecution.ts +153 -0
  152. package/src/tools/handlers.ts +8 -4
  153. package/src/tools/streamedToolCallSeals.ts +57 -0
  154. package/src/types/hitl.ts +4 -0
  155. package/src/types/run.ts +11 -0
  156. package/src/types/tools.ts +36 -0
  157. package/dist/cjs/llm/text.cjs +0 -69
  158. package/dist/cjs/llm/text.cjs.map +0 -1
  159. package/dist/esm/llm/text.mjs +0 -67
  160. package/dist/esm/llm/text.mjs.map +0 -1
@@ -14,7 +14,7 @@ import { messagesStateReducer } from '../messages/reducer.mjs';
14
14
  import { GraphNodeKeys, ContentTypes, Providers, StepTypes, GraphEvents } from '../common/enum.mjs';
15
15
  import { resetIfNotEmpty, joinKeys } from '../utils/graph.mjs';
16
16
  import { isAnthropicLike, isOpenAILike, isGoogleLike } from '../utils/llm.mjs';
17
- import { handleToolCalls } from '../tools/handlers.mjs';
17
+ import '../stream.mjs';
18
18
  import { sleep } from '../utils/run.mjs';
19
19
  import 'ai-tokenizer';
20
20
  import 'zod-to-json-schema';
@@ -29,6 +29,7 @@ import { createSummarizeNode } from '../summarization/node.mjs';
29
29
  import { createSchemaOnlyTools } from '../tools/schema.mjs';
30
30
  import { AgentContext } from '../agents/AgentContext.mjs';
31
31
  import { createFakeStreamingLLM } from '../llm/fake.mjs';
32
+ import { handleToolCalls } from '../tools/handlers.mjs';
32
33
  import '../tools/local/CompileCheckTool.mjs';
33
34
  import 'path';
34
35
  import 'fs/promises';
@@ -51,6 +52,9 @@ import { partitionAndMarkOpenRouterToolCache } from '../llm/openrouter/toolCache
51
52
  const { AGENT, TOOLS, SUMMARIZE } = GraphNodeKeys;
52
53
  /** Minimum relative variance before calibrated toolSchemaTokens overrides current value. */
53
54
  const CALIBRATION_VARIANCE_THRESHOLD = 0.15;
55
+ function getHandlerDispatchedEventKey(eventName, stepId) {
56
+ return `${eventName}:${stepId}`;
57
+ }
54
58
  class Graph {
55
59
  messageStepHasToolCalls = new Map();
56
60
  messageIdsByStepKey = new Map();
@@ -61,11 +65,12 @@ class Graph {
61
65
  contentIndexMap = new Map();
62
66
  toolCallStepIds = new Map();
63
67
  /**
64
- * Step IDs that have been dispatched via handler registry directly
65
- * (in dispatchRunStep). Used by the custom event callback to skip
66
- * duplicate dispatch through the LangGraph callback chain.
68
+ * Step IDs dispatched through the handler registry during this run.
69
+ * Event echo suppression is tracked separately so repeated deltas for
70
+ * the same step are scoped to the active custom event dispatch.
67
71
  */
68
72
  handlerDispatchedStepIds = new Set();
73
+ handlerDispatchedEventCounts = new Map();
69
74
  signal;
70
75
  /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */
71
76
  invokedToolIds;
@@ -84,6 +89,16 @@ class Graph {
84
89
  * graph compiles.
85
90
  */
86
91
  toolOutputReferences;
92
+ /**
93
+ * Run-scoped opt-in for eager event-driven tool execution. The stream
94
+ * handler may prestart eligible event-driven tools; ToolNode later
95
+ * consumes the settled promises while preserving final ToolMessage order.
96
+ */
97
+ eagerEventToolExecution;
98
+ eagerEventToolExecutions = new Map();
99
+ eagerEventToolUsageCount = new Map();
100
+ eagerEventToolUsageCountsByAgentId = new Map();
101
+ eagerEventToolCallChunks = new Map();
87
102
  /**
88
103
  * Run-scoped execution backend for built-in code tools. Defaults to the
89
104
  * remote Code API sandbox when unset.
@@ -122,7 +137,12 @@ class Graph {
122
137
  this.hookRegistry = undefined;
123
138
  this.humanInTheLoop = undefined;
124
139
  this.toolOutputReferences = undefined;
140
+ this.eagerEventToolExecution = undefined;
141
+ this.eagerEventToolExecutions.clear();
142
+ this.clearEagerEventToolUsageCounts();
143
+ this.eagerEventToolCallChunks.clear();
125
144
  this.toolExecution = undefined;
145
+ this.handlerDispatchedEventCounts.clear();
126
146
  /**
127
147
  * ToolNodes compiled from this graph captured the registry
128
148
  * instance at construction time, so simply dropping the Graph's
@@ -152,6 +172,39 @@ class Graph {
152
172
  this._compiledToolNodes.clear();
153
173
  this.sessions.clear();
154
174
  }
175
+ getEagerEventToolUsageCount(agentId) {
176
+ if (agentId == null || agentId === '') {
177
+ return this.eagerEventToolUsageCount;
178
+ }
179
+ let usageCount = this.eagerEventToolUsageCountsByAgentId.get(agentId);
180
+ if (usageCount == null) {
181
+ usageCount = new Map();
182
+ this.eagerEventToolUsageCountsByAgentId.set(agentId, usageCount);
183
+ }
184
+ return usageCount;
185
+ }
186
+ clearEagerEventToolUsageCounts() {
187
+ this.eagerEventToolUsageCount.clear();
188
+ for (const usageCount of this.eagerEventToolUsageCountsByAgentId.values()) {
189
+ usageCount.clear();
190
+ }
191
+ }
192
+ markHandlerDispatchedEvent(eventName, stepId) {
193
+ const key = getHandlerDispatchedEventKey(eventName, stepId);
194
+ this.handlerDispatchedEventCounts.set(key, (this.handlerDispatchedEventCounts.get(key) ?? 0) + 1);
195
+ return () => {
196
+ const count = this.handlerDispatchedEventCounts.get(key) ?? 0;
197
+ if (count <= 1) {
198
+ this.handlerDispatchedEventCounts.delete(key);
199
+ return;
200
+ }
201
+ this.handlerDispatchedEventCounts.set(key, count - 1);
202
+ };
203
+ }
204
+ hasHandlerDispatchedEvent(eventName, stepId) {
205
+ const key = getHandlerDispatchedEventKey(eventName, stepId);
206
+ return (this.handlerDispatchedEventCounts.get(key) ?? 0) > 0;
207
+ }
155
208
  /**
156
209
  * Subclass hook to register a freshly compiled ToolNode so
157
210
  * `clearHeavyState` can flush its per-Run direct-path turn cache
@@ -282,7 +335,11 @@ class StandardGraph extends Graph {
282
335
  * a stale reference on 2nd+ processStream calls.
283
336
  */
284
337
  this.toolCallStepIds.clear();
338
+ this.eagerEventToolExecutions.clear();
339
+ this.clearEagerEventToolUsageCounts();
340
+ this.eagerEventToolCallChunks.clear();
285
341
  this.handlerDispatchedStepIds = resetIfNotEmpty(this.handlerDispatchedStepIds, new Set());
342
+ this.handlerDispatchedEventCounts = resetIfNotEmpty(this.handlerDispatchedEventCounts, new Map());
286
343
  this.messageIdsByStepKey = resetIfNotEmpty(this.messageIdsByStepKey, new Map());
287
344
  this.messageStepHasToolCalls = resetIfNotEmpty(this.messageStepHasToolCalls, new Map());
288
345
  this.prelimMessageIdsByStepKey = resetIfNotEmpty(this.prelimMessageIdsByStepKey, new Map());
@@ -506,6 +563,9 @@ class StandardGraph extends Graph {
506
563
  toolRegistry: agentContext?.toolRegistry,
507
564
  hookRegistry: this.hookRegistry,
508
565
  humanInTheLoop: this.humanInTheLoop,
566
+ eagerEventToolExecution: this.eagerEventToolExecution,
567
+ eagerEventToolExecutions: this.eagerEventToolExecutions,
568
+ eagerEventToolUsageCount: this.getEagerEventToolUsageCount(agentContext?.agentId),
509
569
  toolExecution: this.toolExecution,
510
570
  directToolNames: directToolNames.size > 0 ? directToolNames : undefined,
511
571
  maxContextTokens: agentContext?.maxContextTokens,
@@ -956,7 +1016,7 @@ class StandardGraph extends Graph {
956
1016
  if (typeof content === 'string') {
957
1017
  await this.dispatchMessageDelta(stepId, {
958
1018
  content: [{ type: ContentTypes.TEXT, text: content }],
959
- });
1019
+ }, metadata);
960
1020
  }
961
1021
  else if (Array.isArray(content) &&
962
1022
  content.every((c) => typeof c === 'object' &&
@@ -965,7 +1025,7 @@ class StandardGraph extends Graph {
965
1025
  c.type.startsWith('text'))) {
966
1026
  await this.dispatchMessageDelta(stepId, {
967
1027
  content: content,
968
- });
1028
+ }, metadata);
969
1029
  }
970
1030
  }
971
1031
  }
@@ -995,7 +1055,7 @@ class StandardGraph extends Graph {
995
1055
  if (typeof content === 'string') {
996
1056
  await this.dispatchMessageDelta(stepId, {
997
1057
  content: [{ type: ContentTypes.TEXT, text: content }],
998
- });
1058
+ }, metadata);
999
1059
  }
1000
1060
  else if (Array.isArray(content) &&
1001
1061
  content.every((c) => typeof c === 'object' &&
@@ -1004,7 +1064,7 @@ class StandardGraph extends Graph {
1004
1064
  c.type.startsWith('text'))) {
1005
1065
  await this.dispatchMessageDelta(stepId, {
1006
1066
  content: content,
1007
- });
1067
+ }, metadata);
1008
1068
  }
1009
1069
  }
1010
1070
  }
@@ -1174,8 +1234,16 @@ class StandardGraph extends Graph {
1174
1234
  await handler.handle(GraphEvents.ON_RUN_STEP, runStep, resolvedConfig?.configurable, this);
1175
1235
  this.handlerDispatchedStepIds.add(runStep.id);
1176
1236
  }
1177
- if (resolvedConfig) {
1178
- await safeDispatchCustomEvent(GraphEvents.ON_RUN_STEP, runStep, resolvedConfig);
1237
+ const unmarkHandlerDispatchedEvent = handler
1238
+ ? this.markHandlerDispatchedEvent(GraphEvents.ON_RUN_STEP, runStep.id)
1239
+ : undefined;
1240
+ try {
1241
+ if (resolvedConfig) {
1242
+ await safeDispatchCustomEvent(GraphEvents.ON_RUN_STEP, runStep, resolvedConfig);
1243
+ }
1244
+ }
1245
+ finally {
1246
+ unmarkHandlerDispatchedEvent?.();
1179
1247
  }
1180
1248
  },
1181
1249
  dispatchRunStepCompleted: async (stepId, result, nodeConfig) => {
@@ -1206,7 +1274,7 @@ class StandardGraph extends Graph {
1206
1274
  const StateAnnotation = Annotation.Root({
1207
1275
  messages: Annotation({
1208
1276
  reducer: (a, b) => {
1209
- if (!a.length) {
1277
+ if (!this.messages.length) {
1210
1278
  this.startIndex = a.length + b.length;
1211
1279
  }
1212
1280
  const result = messagesStateReducer(a, b);
@@ -1303,7 +1371,15 @@ class StandardGraph extends Graph {
1303
1371
  // but the primary dispatch above guarantees the event reaches the handler.
1304
1372
  // The customEventCallback in run.ts skips events already dispatched above
1305
1373
  // to prevent double handling.
1306
- await safeDispatchCustomEvent(GraphEvents.ON_RUN_STEP, runStep, this.config);
1374
+ const unmarkHandlerDispatchedEvent = handler
1375
+ ? this.markHandlerDispatchedEvent(GraphEvents.ON_RUN_STEP, stepId)
1376
+ : undefined;
1377
+ try {
1378
+ await safeDispatchCustomEvent(GraphEvents.ON_RUN_STEP, runStep, this.config);
1379
+ }
1380
+ finally {
1381
+ unmarkHandlerDispatchedEvent?.();
1382
+ }
1307
1383
  return stepId;
1308
1384
  }
1309
1385
  /**
@@ -1352,7 +1428,7 @@ class StandardGraph extends Graph {
1352
1428
  async handleToolCallError(data, metadata) {
1353
1429
  await StandardGraph.handleToolCallErrorStatic(this, data, metadata);
1354
1430
  }
1355
- async dispatchRunStepDelta(id, delta) {
1431
+ async dispatchRunStepDelta(id, delta, metadata) {
1356
1432
  if (!this.config) {
1357
1433
  throw new Error('No config provided');
1358
1434
  }
@@ -1363,9 +1439,22 @@ class StandardGraph extends Graph {
1363
1439
  id,
1364
1440
  delta,
1365
1441
  };
1366
- await safeDispatchCustomEvent(GraphEvents.ON_RUN_STEP_DELTA, runStepDelta, this.config);
1442
+ const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_RUN_STEP_DELTA);
1443
+ if (handler) {
1444
+ await handler.handle(GraphEvents.ON_RUN_STEP_DELTA, runStepDelta, metadata, this);
1445
+ this.handlerDispatchedStepIds.add(id);
1446
+ }
1447
+ const unmarkHandlerDispatchedEvent = handler
1448
+ ? this.markHandlerDispatchedEvent(GraphEvents.ON_RUN_STEP_DELTA, id)
1449
+ : undefined;
1450
+ try {
1451
+ await safeDispatchCustomEvent(GraphEvents.ON_RUN_STEP_DELTA, runStepDelta, this.config);
1452
+ }
1453
+ finally {
1454
+ unmarkHandlerDispatchedEvent?.();
1455
+ }
1367
1456
  }
1368
- async dispatchMessageDelta(id, delta) {
1457
+ async dispatchMessageDelta(id, delta, metadata) {
1369
1458
  if (!this.config) {
1370
1459
  throw new Error('No config provided');
1371
1460
  }
@@ -1373,9 +1462,22 @@ class StandardGraph extends Graph {
1373
1462
  id,
1374
1463
  delta,
1375
1464
  };
1376
- await safeDispatchCustomEvent(GraphEvents.ON_MESSAGE_DELTA, messageDelta, this.config);
1465
+ const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_MESSAGE_DELTA);
1466
+ if (handler) {
1467
+ await handler.handle(GraphEvents.ON_MESSAGE_DELTA, messageDelta, metadata, this);
1468
+ this.handlerDispatchedStepIds.add(id);
1469
+ }
1470
+ const unmarkHandlerDispatchedEvent = handler
1471
+ ? this.markHandlerDispatchedEvent(GraphEvents.ON_MESSAGE_DELTA, id)
1472
+ : undefined;
1473
+ try {
1474
+ await safeDispatchCustomEvent(GraphEvents.ON_MESSAGE_DELTA, messageDelta, this.config);
1475
+ }
1476
+ finally {
1477
+ unmarkHandlerDispatchedEvent?.();
1478
+ }
1377
1479
  }
1378
- dispatchReasoningDelta = async (stepId, delta) => {
1480
+ dispatchReasoningDelta = async (stepId, delta, metadata) => {
1379
1481
  if (!this.config) {
1380
1482
  throw new Error('No config provided');
1381
1483
  }
@@ -1383,7 +1485,20 @@ class StandardGraph extends Graph {
1383
1485
  id: stepId,
1384
1486
  delta,
1385
1487
  };
1386
- await safeDispatchCustomEvent(GraphEvents.ON_REASONING_DELTA, reasoningDelta, this.config);
1488
+ const handler = this.handlerRegistry?.getHandler(GraphEvents.ON_REASONING_DELTA);
1489
+ if (handler) {
1490
+ await handler.handle(GraphEvents.ON_REASONING_DELTA, reasoningDelta, metadata, this);
1491
+ this.handlerDispatchedStepIds.add(stepId);
1492
+ }
1493
+ const unmarkHandlerDispatchedEvent = handler
1494
+ ? this.markHandlerDispatchedEvent(GraphEvents.ON_REASONING_DELTA, stepId)
1495
+ : undefined;
1496
+ try {
1497
+ await safeDispatchCustomEvent(GraphEvents.ON_REASONING_DELTA, reasoningDelta, this.config);
1498
+ }
1499
+ finally {
1500
+ unmarkHandlerDispatchedEvent?.();
1501
+ }
1387
1502
  };
1388
1503
  }
1389
1504