@librechat/agents 3.1.85 → 3.1.87

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 (166) hide show
  1. package/README.md +69 -0
  2. package/dist/cjs/agents/AgentContext.cjs +7 -2
  3. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  4. package/dist/cjs/events.cjs +23 -0
  5. package/dist/cjs/events.cjs.map +1 -1
  6. package/dist/cjs/graphs/Graph.cjs +133 -18
  7. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  8. package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
  9. package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
  10. package/dist/cjs/llm/anthropic/index.cjs +251 -53
  11. package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
  12. package/dist/cjs/llm/init.cjs +1 -5
  13. package/dist/cjs/llm/init.cjs.map +1 -1
  14. package/dist/cjs/llm/openai/index.cjs +113 -24
  15. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  16. package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
  17. package/dist/cjs/llm/openrouter/index.cjs +3 -1
  18. package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
  19. package/dist/cjs/main.cjs +18 -5
  20. package/dist/cjs/main.cjs.map +1 -1
  21. package/dist/cjs/openai/index.cjs +253 -0
  22. package/dist/cjs/openai/index.cjs.map +1 -0
  23. package/dist/cjs/responses/index.cjs +448 -0
  24. package/dist/cjs/responses/index.cjs.map +1 -0
  25. package/dist/cjs/run.cjs +108 -7
  26. package/dist/cjs/run.cjs.map +1 -1
  27. package/dist/cjs/session/AgentSession.cjs +1057 -0
  28. package/dist/cjs/session/AgentSession.cjs.map +1 -0
  29. package/dist/cjs/session/JsonlSessionStore.cjs +425 -0
  30. package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -0
  31. package/dist/cjs/session/handlers.cjs +221 -0
  32. package/dist/cjs/session/handlers.cjs.map +1 -0
  33. package/dist/cjs/session/ids.cjs +22 -0
  34. package/dist/cjs/session/ids.cjs.map +1 -0
  35. package/dist/cjs/session/messageSerialization.cjs +179 -0
  36. package/dist/cjs/session/messageSerialization.cjs.map +1 -0
  37. package/dist/cjs/stream.cjs +472 -11
  38. package/dist/cjs/stream.cjs.map +1 -1
  39. package/dist/cjs/summarization/node.cjs +1 -1
  40. package/dist/cjs/summarization/node.cjs.map +1 -1
  41. package/dist/cjs/tools/ToolNode.cjs +177 -59
  42. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  43. package/dist/cjs/tools/eagerEventExecution.cjs +113 -0
  44. package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -0
  45. package/dist/cjs/tools/handlers.cjs +1 -1
  46. package/dist/cjs/tools/handlers.cjs.map +1 -1
  47. package/dist/cjs/tools/streamedToolCallSeals.cjs +42 -0
  48. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -0
  49. package/dist/esm/agents/AgentContext.mjs +7 -2
  50. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  51. package/dist/esm/events.mjs +23 -1
  52. package/dist/esm/events.mjs.map +1 -1
  53. package/dist/esm/graphs/Graph.mjs +133 -18
  54. package/dist/esm/graphs/Graph.mjs.map +1 -1
  55. package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
  56. package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
  57. package/dist/esm/llm/anthropic/index.mjs +251 -53
  58. package/dist/esm/llm/anthropic/index.mjs.map +1 -1
  59. package/dist/esm/llm/init.mjs +1 -5
  60. package/dist/esm/llm/init.mjs.map +1 -1
  61. package/dist/esm/llm/openai/index.mjs +113 -25
  62. package/dist/esm/llm/openai/index.mjs.map +1 -1
  63. package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
  64. package/dist/esm/llm/openrouter/index.mjs +4 -2
  65. package/dist/esm/llm/openrouter/index.mjs.map +1 -1
  66. package/dist/esm/main.mjs +5 -1
  67. package/dist/esm/main.mjs.map +1 -1
  68. package/dist/esm/openai/index.mjs +246 -0
  69. package/dist/esm/openai/index.mjs.map +1 -0
  70. package/dist/esm/responses/index.mjs +440 -0
  71. package/dist/esm/responses/index.mjs.map +1 -0
  72. package/dist/esm/run.mjs +108 -7
  73. package/dist/esm/run.mjs.map +1 -1
  74. package/dist/esm/session/AgentSession.mjs +1054 -0
  75. package/dist/esm/session/AgentSession.mjs.map +1 -0
  76. package/dist/esm/session/JsonlSessionStore.mjs +422 -0
  77. package/dist/esm/session/JsonlSessionStore.mjs.map +1 -0
  78. package/dist/esm/session/handlers.mjs +219 -0
  79. package/dist/esm/session/handlers.mjs.map +1 -0
  80. package/dist/esm/session/ids.mjs +17 -0
  81. package/dist/esm/session/ids.mjs.map +1 -0
  82. package/dist/esm/session/messageSerialization.mjs +173 -0
  83. package/dist/esm/session/messageSerialization.mjs.map +1 -0
  84. package/dist/esm/stream.mjs +473 -12
  85. package/dist/esm/stream.mjs.map +1 -1
  86. package/dist/esm/summarization/node.mjs +1 -1
  87. package/dist/esm/summarization/node.mjs.map +1 -1
  88. package/dist/esm/tools/ToolNode.mjs +177 -59
  89. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  90. package/dist/esm/tools/eagerEventExecution.mjs +107 -0
  91. package/dist/esm/tools/eagerEventExecution.mjs.map +1 -0
  92. package/dist/esm/tools/handlers.mjs +1 -1
  93. package/dist/esm/tools/handlers.mjs.map +1 -1
  94. package/dist/esm/tools/streamedToolCallSeals.mjs +36 -0
  95. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -0
  96. package/dist/types/events.d.ts +1 -0
  97. package/dist/types/graphs/Graph.d.ts +24 -9
  98. package/dist/types/index.d.ts +1 -0
  99. package/dist/types/llm/openai/index.d.ts +1 -0
  100. package/dist/types/openai/index.d.ts +75 -0
  101. package/dist/types/responses/index.d.ts +97 -0
  102. package/dist/types/run.d.ts +2 -0
  103. package/dist/types/session/AgentSession.d.ts +32 -0
  104. package/dist/types/session/JsonlSessionStore.d.ts +67 -0
  105. package/dist/types/session/handlers.d.ts +8 -0
  106. package/dist/types/session/ids.d.ts +4 -0
  107. package/dist/types/session/index.d.ts +5 -0
  108. package/dist/types/session/messageSerialization.d.ts +7 -0
  109. package/dist/types/session/types.d.ts +191 -0
  110. package/dist/types/tools/ToolNode.d.ts +12 -1
  111. package/dist/types/tools/eagerEventExecution.d.ts +23 -0
  112. package/dist/types/tools/streamedToolCallSeals.d.ts +13 -0
  113. package/dist/types/types/hitl.d.ts +4 -0
  114. package/dist/types/types/run.d.ts +11 -1
  115. package/dist/types/types/tools.d.ts +36 -0
  116. package/package.json +19 -2
  117. package/src/__tests__/stream.eagerEventExecution.test.ts +2458 -0
  118. package/src/agents/AgentContext.ts +7 -2
  119. package/src/agents/__tests__/AgentContext.test.ts +254 -5
  120. package/src/events.ts +29 -0
  121. package/src/graphs/Graph.ts +224 -50
  122. package/src/graphs/MultiAgentGraph.ts +1 -1
  123. package/src/graphs/__tests__/composition.smoke.test.ts +30 -0
  124. package/src/index.ts +3 -0
  125. package/src/llm/anthropic/index.ts +356 -84
  126. package/src/llm/anthropic/llm.spec.ts +64 -0
  127. package/src/llm/custom-chat-models.smoke.test.ts +175 -4
  128. package/src/llm/openai/contentBlocks.test.ts +35 -0
  129. package/src/llm/openai/deepseek.test.ts +201 -2
  130. package/src/llm/openai/index.ts +171 -26
  131. package/src/llm/openai/utils/index.ts +22 -0
  132. package/src/llm/openrouter/index.ts +4 -2
  133. package/src/openai/__tests__/openai.test.ts +337 -0
  134. package/src/openai/index.ts +404 -0
  135. package/src/responses/__tests__/responses.test.ts +652 -0
  136. package/src/responses/index.ts +677 -0
  137. package/src/run.ts +158 -8
  138. package/src/scripts/compare_pi_vs_ours.ts +592 -173
  139. package/src/scripts/session_live.ts +548 -0
  140. package/src/session/AgentSession.ts +1432 -0
  141. package/src/session/JsonlSessionStore.ts +572 -0
  142. package/src/session/__tests__/JsonlSessionStore.test.ts +1410 -0
  143. package/src/session/__tests__/handlers.test.ts +161 -0
  144. package/src/session/handlers.ts +272 -0
  145. package/src/session/ids.ts +17 -0
  146. package/src/session/index.ts +44 -0
  147. package/src/session/messageSerialization.ts +207 -0
  148. package/src/session/types.ts +275 -0
  149. package/src/specs/custom-event-await.test.ts +89 -0
  150. package/src/specs/summarization.test.ts +1 -1
  151. package/src/stream.ts +755 -48
  152. package/src/summarization/node.ts +1 -1
  153. package/src/tools/ToolNode.ts +299 -126
  154. package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +373 -0
  155. package/src/tools/__tests__/handlers.test.ts +2 -1
  156. package/src/tools/__tests__/hitl.test.ts +206 -110
  157. package/src/tools/eagerEventExecution.ts +153 -0
  158. package/src/tools/handlers.ts +8 -4
  159. package/src/tools/streamedToolCallSeals.ts +57 -0
  160. package/src/types/hitl.ts +4 -0
  161. package/src/types/run.ts +11 -0
  162. package/src/types/tools.ts +36 -0
  163. package/dist/cjs/llm/text.cjs +0 -69
  164. package/dist/cjs/llm/text.cjs.map +0 -1
  165. package/dist/esm/llm/text.mjs +0 -67
  166. package/dist/esm/llm/text.mjs.map +0 -1
@@ -0,0 +1,275 @@
1
+ import type { RunnableConfig } from '@langchain/core/runnables';
2
+ import type { BaseMessage } from '@langchain/core/messages';
3
+ import type { BaseCheckpointSaver } from '@langchain/langgraph';
4
+ import type * as t from '@/types';
5
+
6
+ export type JsonPrimitive = string | number | boolean | null;
7
+
8
+ export type JsonValue =
9
+ | JsonPrimitive
10
+ | JsonValue[]
11
+ | {
12
+ [key: string]: JsonValue;
13
+ };
14
+
15
+ export type JsonObject = {
16
+ [key: string]: JsonValue;
17
+ };
18
+
19
+ export type SessionEntryType =
20
+ | 'message'
21
+ | 'summary'
22
+ | 'compaction'
23
+ | 'checkpoint'
24
+ | 'label'
25
+ | 'run_event'
26
+ | 'session_state';
27
+
28
+ export interface SessionHeader {
29
+ type: 'session';
30
+ version: 1;
31
+ id: string;
32
+ timestamp: string;
33
+ cwd: string;
34
+ name?: string;
35
+ parentSession?: string;
36
+ }
37
+
38
+ export interface SessionEntryBase<TType extends SessionEntryType, TData> {
39
+ type: TType;
40
+ id: string;
41
+ parentId: string | null;
42
+ timestamp: string;
43
+ data: TData;
44
+ }
45
+
46
+ export interface SerializedSessionMessage {
47
+ messageType: string;
48
+ content: JsonValue;
49
+ additionalKwargs?: JsonObject;
50
+ responseMetadata?: JsonObject;
51
+ id?: string;
52
+ name?: string;
53
+ toolCallId?: string;
54
+ toolCalls?: JsonValue;
55
+ usageMetadata?: JsonObject;
56
+ }
57
+
58
+ export type SessionMessageEntry = SessionEntryBase<
59
+ 'message',
60
+ {
61
+ role: string;
62
+ message: SerializedSessionMessage;
63
+ }
64
+ >;
65
+
66
+ export type SessionSummaryEntry = SessionEntryBase<
67
+ 'summary',
68
+ {
69
+ text: string;
70
+ tokenCount?: number;
71
+ retainedEntryIds: JsonValue[];
72
+ summarizedEntryIds: JsonValue[];
73
+ instructions?: string;
74
+ }
75
+ >;
76
+
77
+ export type SessionCompactionEntry = SessionEntryBase<
78
+ 'compaction',
79
+ {
80
+ summaryEntryId: string;
81
+ retainedEntryIds: JsonValue[];
82
+ summarizedEntryIds: JsonValue[];
83
+ }
84
+ >;
85
+
86
+ export type SessionCheckpointEntry = SessionEntryBase<
87
+ 'checkpoint',
88
+ {
89
+ provider: 'langgraph';
90
+ source: 'run' | 'resume' | 'reset';
91
+ threadId: string;
92
+ runId?: string;
93
+ checkpointId?: string;
94
+ checkpointNs?: string;
95
+ parentCheckpointId?: string;
96
+ reason?: string;
97
+ }
98
+ >;
99
+
100
+ export type SessionLabelEntry = SessionEntryBase<
101
+ 'label',
102
+ {
103
+ targetEntryId: string;
104
+ label: string;
105
+ }
106
+ >;
107
+
108
+ export type SessionRunEventEntry = SessionEntryBase<
109
+ 'run_event',
110
+ {
111
+ event: string;
112
+ runId?: string;
113
+ threadId?: string;
114
+ payload?: JsonValue;
115
+ }
116
+ >;
117
+
118
+ export type SessionStateEntry = SessionEntryBase<
119
+ 'session_state',
120
+ {
121
+ leafId: string | null;
122
+ }
123
+ >;
124
+
125
+ export type SessionEntry =
126
+ | SessionMessageEntry
127
+ | SessionSummaryEntry
128
+ | SessionCompactionEntry
129
+ | SessionCheckpointEntry
130
+ | SessionLabelEntry
131
+ | SessionRunEventEntry
132
+ | SessionStateEntry;
133
+
134
+ export interface SessionTreeNode {
135
+ entry: SessionEntry;
136
+ children: SessionTreeNode[];
137
+ }
138
+
139
+ export interface SessionListItem {
140
+ id: string;
141
+ path: string;
142
+ cwd: string;
143
+ timestamp: string;
144
+ name?: string;
145
+ leafId?: string | null;
146
+ }
147
+
148
+ export type SessionPosition = 'before' | 'at';
149
+
150
+ export interface SessionForkOptions {
151
+ position?: SessionPosition;
152
+ cwd?: string;
153
+ name?: string;
154
+ }
155
+
156
+ export interface SessionBranchOptions {
157
+ position?: SessionPosition;
158
+ summarizeAbandoned?: boolean | { instructions?: string };
159
+ }
160
+
161
+ export interface SessionCompactOptions {
162
+ instructions?: string;
163
+ retainRecentTurns?: number;
164
+ }
165
+
166
+ export interface AgentSessionRunResult {
167
+ text: string;
168
+ content: t.MessageContentComplex[];
169
+ messages: BaseMessage[];
170
+ usage: AgentSessionUsage;
171
+ steps: t.RunStep[];
172
+ interrupt: t.RunInterruptResult | undefined;
173
+ haltedReason: string | undefined;
174
+ runId: string;
175
+ threadId: string;
176
+ }
177
+
178
+ export interface AgentSessionUsage {
179
+ inputTokens: number;
180
+ outputTokens: number;
181
+ totalTokens: number;
182
+ }
183
+
184
+ export interface AgentSessionCheckpointReference {
185
+ provider: 'langgraph';
186
+ threadId: string;
187
+ checkpointId?: string;
188
+ checkpointNs?: string;
189
+ parentCheckpointId?: string;
190
+ }
191
+
192
+ export interface AgentSessionCheckpointLookupOptions {
193
+ threadId?: string;
194
+ checkpointNs?: string;
195
+ config?: RunnableConfig;
196
+ }
197
+
198
+ export interface AgentSessionCheckpointingOptions {
199
+ enabled?: boolean;
200
+ checkpointer?: BaseCheckpointSaver;
201
+ }
202
+
203
+ export type AgentSessionCheckpointing =
204
+ | boolean
205
+ | AgentSessionCheckpointingOptions;
206
+
207
+ export type AgentSessionInput = string | BaseMessage | BaseMessage[] | t.IState;
208
+
209
+ export interface AgentSessionRunOptions {
210
+ runId?: string;
211
+ threadId?: string;
212
+ config?: Partial<RunnableConfig> & { version?: 'v1' | 'v2' };
213
+ streamOptions?: t.EventStreamOptions;
214
+ }
215
+
216
+ export interface AgentSessionStreamEvent {
217
+ type:
218
+ | 'run.started'
219
+ | 'message.delta'
220
+ | 'reasoning.delta'
221
+ | 'tool.started'
222
+ | 'tool.delta'
223
+ | 'tool.completed'
224
+ | 'usage.updated'
225
+ | 'run.completed'
226
+ | 'run.failed'
227
+ | 'run.interrupted'
228
+ | 'run.halted';
229
+ sequence: number;
230
+ runId: string;
231
+ threadId: string;
232
+ timestamp: string;
233
+ data?: JsonValue;
234
+ }
235
+
236
+ export interface AgentSessionStream
237
+ extends AsyncIterable<AgentSessionStreamEvent> {
238
+ toTextStream(): AsyncIterable<string>;
239
+ finalResult(): Promise<AgentSessionRunResult>;
240
+ }
241
+
242
+ export interface AgentSessionHandlersResult {
243
+ contentParts: Array<t.MessageContentComplex | undefined>;
244
+ steps: t.RunStep[];
245
+ usage: AgentSessionUsage;
246
+ events: AgentSessionStreamEvent[];
247
+ handlers: Record<string, t.EventHandler>;
248
+ }
249
+
250
+ export type AgentSessionConfig =
251
+ | {
252
+ runConfig: t.RunConfig;
253
+ cwd?: string;
254
+ sessionPath?: string;
255
+ sessionId?: string;
256
+ name?: string;
257
+ ephemeral?: boolean;
258
+ checkpointing?: AgentSessionCheckpointing;
259
+ }
260
+ | ({
261
+ runId?: string;
262
+ cwd?: string;
263
+ sessionPath?: string;
264
+ sessionId?: string;
265
+ name?: string;
266
+ ephemeral?: boolean;
267
+ checkpointing?: AgentSessionCheckpointing;
268
+ } & Omit<t.RunConfig, 'runId'>);
269
+
270
+ export interface CreateSessionFileOptions {
271
+ cwd: string;
272
+ name?: string;
273
+ parentSession?: string;
274
+ sessionId?: string;
275
+ }
@@ -22,6 +22,95 @@ describe('Custom event handler awaitHandlers behavior', () => {
22
22
  version: 'v2' as const,
23
23
  };
24
24
 
25
+ it('does not redispatch SDK custom events yielded by streamEvents', async () => {
26
+ const handledEvents: GraphEvents[] = [];
27
+ const customHandlers: Record<string | GraphEvents, t.EventHandler> = {
28
+ [GraphEvents.ON_MESSAGE_DELTA]: {
29
+ handle: (event: GraphEvents): void => {
30
+ handledEvents.push(event);
31
+ },
32
+ },
33
+ };
34
+
35
+ const run = await Run.create<t.IState>({
36
+ runId: 'test-custom-events-skip-stream-loop',
37
+ graphConfig: {
38
+ type: 'standard',
39
+ llmConfig,
40
+ },
41
+ skipCleanup: true,
42
+ customHandlers,
43
+ });
44
+
45
+ async function* streamEvents(): AsyncGenerator<t.StreamEvent> {
46
+ yield {
47
+ event: GraphEvents.ON_MESSAGE_DELTA,
48
+ name: 'custom-event',
49
+ run_id: 'custom-event-run',
50
+ metadata: {},
51
+ data: {},
52
+ };
53
+ }
54
+
55
+ run.graphRunnable = { streamEvents } as unknown as t.CompiledStateWorkflow;
56
+
57
+ await run.processStream({ messages: [new HumanMessage('hello')] }, config);
58
+
59
+ expect(handledEvents).toEqual([]);
60
+ });
61
+
62
+ it('dispatches message deltas through the graph handler registry', async () => {
63
+ const handledEvents: Array<{
64
+ data: t.MessageDeltaEvent;
65
+ metadata?: Record<string, unknown>;
66
+ }> = [];
67
+ const customHandlers: Record<string | GraphEvents, t.EventHandler> = {
68
+ [GraphEvents.ON_MESSAGE_DELTA]: {
69
+ handle: (_event, data, metadata): void => {
70
+ handledEvents.push({
71
+ data: data as t.MessageDeltaEvent,
72
+ metadata,
73
+ });
74
+ },
75
+ },
76
+ };
77
+
78
+ const run = await Run.create<t.IState>({
79
+ runId: 'test-message-delta-direct-dispatch',
80
+ graphConfig: {
81
+ type: 'standard',
82
+ llmConfig,
83
+ },
84
+ skipCleanup: true,
85
+ customHandlers,
86
+ });
87
+ if (!run.Graph) {
88
+ throw new Error('Expected graph to be initialized');
89
+ }
90
+
91
+ const metadata = { thread_id: 'thread_direct', langgraph_step: 1 };
92
+ run.Graph.config = { configurable: { thread_id: 'thread_direct' } };
93
+ await run.Graph.dispatchMessageDelta(
94
+ 'step_direct',
95
+ {
96
+ content: [{ type: ContentTypes.TEXT, text: 'hello' }],
97
+ },
98
+ metadata
99
+ );
100
+
101
+ expect(handledEvents).toEqual([
102
+ {
103
+ data: {
104
+ id: 'step_direct',
105
+ delta: {
106
+ content: [{ type: ContentTypes.TEXT, text: 'hello' }],
107
+ },
108
+ },
109
+ metadata,
110
+ },
111
+ ]);
112
+ });
113
+
25
114
  it('should fully aggregate all content before processStream returns', async () => {
26
115
  const longResponse =
27
116
  'The quick brown fox jumps over the lazy dog and then runs across the field to find shelter from the rain';
@@ -428,7 +428,7 @@ const hasAnthropic = process.env.ANTHROPIC_API_KEY != null;
428
428
 
429
429
  // Turn 7: absolute minimum context if still nothing
430
430
  if (spies.onSummarizeStartSpy.mock.calls.length === 0) {
431
- ({ run, contentParts } = await createRun(2200));
431
+ ({ run, contentParts } = await createRun(1200));
432
432
  await runTurn({ run, conversationHistory }, 'What is 1+1?', streamConfig);
433
433
  logTurn('T7', conversationHistory);
434
434
  }