@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.
- package/README.md +69 -0
- package/dist/cjs/agents/AgentContext.cjs +7 -2
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/events.cjs +23 -0
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +133 -18
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +251 -53
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/init.cjs +1 -5
- package/dist/cjs/llm/init.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +113 -24
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +3 -1
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +18 -5
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/openai/index.cjs +253 -0
- package/dist/cjs/openai/index.cjs.map +1 -0
- package/dist/cjs/responses/index.cjs +448 -0
- package/dist/cjs/responses/index.cjs.map +1 -0
- package/dist/cjs/run.cjs +108 -7
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +1057 -0
- package/dist/cjs/session/AgentSession.cjs.map +1 -0
- package/dist/cjs/session/JsonlSessionStore.cjs +425 -0
- package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -0
- package/dist/cjs/session/handlers.cjs +221 -0
- package/dist/cjs/session/handlers.cjs.map +1 -0
- package/dist/cjs/session/ids.cjs +22 -0
- package/dist/cjs/session/ids.cjs.map +1 -0
- package/dist/cjs/session/messageSerialization.cjs +179 -0
- package/dist/cjs/session/messageSerialization.cjs.map +1 -0
- package/dist/cjs/stream.cjs +472 -11
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +1 -1
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +177 -59
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/eagerEventExecution.cjs +113 -0
- package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -0
- package/dist/cjs/tools/handlers.cjs +1 -1
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/streamedToolCallSeals.cjs +42 -0
- package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs +7 -2
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/events.mjs +23 -1
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +133 -18
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +251 -53
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/init.mjs +1 -5
- package/dist/esm/llm/init.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +113 -25
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +4 -2
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/main.mjs +5 -1
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/openai/index.mjs +246 -0
- package/dist/esm/openai/index.mjs.map +1 -0
- package/dist/esm/responses/index.mjs +440 -0
- package/dist/esm/responses/index.mjs.map +1 -0
- package/dist/esm/run.mjs +108 -7
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +1054 -0
- package/dist/esm/session/AgentSession.mjs.map +1 -0
- package/dist/esm/session/JsonlSessionStore.mjs +422 -0
- package/dist/esm/session/JsonlSessionStore.mjs.map +1 -0
- package/dist/esm/session/handlers.mjs +219 -0
- package/dist/esm/session/handlers.mjs.map +1 -0
- package/dist/esm/session/ids.mjs +17 -0
- package/dist/esm/session/ids.mjs.map +1 -0
- package/dist/esm/session/messageSerialization.mjs +173 -0
- package/dist/esm/session/messageSerialization.mjs.map +1 -0
- package/dist/esm/stream.mjs +473 -12
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +1 -1
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +177 -59
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/eagerEventExecution.mjs +107 -0
- package/dist/esm/tools/eagerEventExecution.mjs.map +1 -0
- package/dist/esm/tools/handlers.mjs +1 -1
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/streamedToolCallSeals.mjs +36 -0
- package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -0
- package/dist/types/events.d.ts +1 -0
- package/dist/types/graphs/Graph.d.ts +24 -9
- package/dist/types/index.d.ts +1 -0
- package/dist/types/llm/openai/index.d.ts +1 -0
- package/dist/types/openai/index.d.ts +75 -0
- package/dist/types/responses/index.d.ts +97 -0
- package/dist/types/run.d.ts +2 -0
- package/dist/types/session/AgentSession.d.ts +32 -0
- package/dist/types/session/JsonlSessionStore.d.ts +67 -0
- package/dist/types/session/handlers.d.ts +8 -0
- package/dist/types/session/ids.d.ts +4 -0
- package/dist/types/session/index.d.ts +5 -0
- package/dist/types/session/messageSerialization.d.ts +7 -0
- package/dist/types/session/types.d.ts +191 -0
- package/dist/types/tools/ToolNode.d.ts +12 -1
- package/dist/types/tools/eagerEventExecution.d.ts +23 -0
- package/dist/types/tools/streamedToolCallSeals.d.ts +13 -0
- package/dist/types/types/hitl.d.ts +4 -0
- package/dist/types/types/run.d.ts +11 -1
- package/dist/types/types/tools.d.ts +36 -0
- package/package.json +19 -2
- package/src/__tests__/stream.eagerEventExecution.test.ts +2458 -0
- package/src/agents/AgentContext.ts +7 -2
- package/src/agents/__tests__/AgentContext.test.ts +254 -5
- package/src/events.ts +29 -0
- package/src/graphs/Graph.ts +224 -50
- package/src/graphs/MultiAgentGraph.ts +1 -1
- package/src/graphs/__tests__/composition.smoke.test.ts +30 -0
- package/src/index.ts +3 -0
- package/src/llm/anthropic/index.ts +356 -84
- package/src/llm/anthropic/llm.spec.ts +64 -0
- package/src/llm/custom-chat-models.smoke.test.ts +175 -4
- package/src/llm/openai/contentBlocks.test.ts +35 -0
- package/src/llm/openai/deepseek.test.ts +201 -2
- package/src/llm/openai/index.ts +171 -26
- package/src/llm/openai/utils/index.ts +22 -0
- package/src/llm/openrouter/index.ts +4 -2
- package/src/openai/__tests__/openai.test.ts +337 -0
- package/src/openai/index.ts +404 -0
- package/src/responses/__tests__/responses.test.ts +652 -0
- package/src/responses/index.ts +677 -0
- package/src/run.ts +158 -8
- package/src/scripts/compare_pi_vs_ours.ts +592 -173
- package/src/scripts/session_live.ts +548 -0
- package/src/session/AgentSession.ts +1432 -0
- package/src/session/JsonlSessionStore.ts +572 -0
- package/src/session/__tests__/JsonlSessionStore.test.ts +1410 -0
- package/src/session/__tests__/handlers.test.ts +161 -0
- package/src/session/handlers.ts +272 -0
- package/src/session/ids.ts +17 -0
- package/src/session/index.ts +44 -0
- package/src/session/messageSerialization.ts +207 -0
- package/src/session/types.ts +275 -0
- package/src/specs/custom-event-await.test.ts +89 -0
- package/src/specs/summarization.test.ts +1 -1
- package/src/stream.ts +755 -48
- package/src/summarization/node.ts +1 -1
- package/src/tools/ToolNode.ts +299 -126
- package/src/tools/__tests__/ToolNode.eagerEventExecution.test.ts +373 -0
- package/src/tools/__tests__/handlers.test.ts +2 -1
- package/src/tools/__tests__/hitl.test.ts +206 -110
- package/src/tools/eagerEventExecution.ts +153 -0
- package/src/tools/handlers.ts +8 -4
- package/src/tools/streamedToolCallSeals.ts +57 -0
- package/src/types/hitl.ts +4 -0
- package/src/types/run.ts +11 -0
- package/src/types/tools.ts +36 -0
- package/dist/cjs/llm/text.cjs +0 -69
- package/dist/cjs/llm/text.cjs.map +0 -1
- package/dist/esm/llm/text.mjs +0 -67
- 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(
|
|
431
|
+
({ run, contentParts } = await createRun(1200));
|
|
432
432
|
await runTurn({ run, conversationHistory }, 'What is 1+1?', streamConfig);
|
|
433
433
|
logTurn('T7', conversationHistory);
|
|
434
434
|
}
|