@langchain/vue 0.0.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.
- package/LICENSE +21 -0
- package/README.md +252 -0
- package/dist/index.cjs +473 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +23 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +441 -0
- package/dist/index.js.map +1 -0
- package/dist/stream.custom.cjs +167 -0
- package/dist/stream.custom.cjs.map +1 -0
- package/dist/stream.custom.js +167 -0
- package/dist/stream.custom.js.map +1 -0
- package/package.json +78 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { useStreamCustom } from "./stream.custom.js";
|
|
2
|
+
import { computed, onMounted, onUnmounted, ref, shallowRef, watch } from "vue";
|
|
3
|
+
import { FetchStreamTransport, MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, SubagentManager, calculateDepthFromNamespace, extractInterrupts, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterStream, getBranchContext, getMessagesMetadataMap, isSubagentNamespace, toMessageClass, unique } from "@langchain/langgraph-sdk/ui";
|
|
4
|
+
import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
|
|
5
|
+
import { Client } from "@langchain/langgraph-sdk";
|
|
6
|
+
|
|
7
|
+
//#region src/index.ts
|
|
8
|
+
function fetchHistory(client, threadId, options) {
|
|
9
|
+
if (options?.limit === false) return client.threads.getState(threadId).then((state) => {
|
|
10
|
+
if (state.checkpoint == null) return [];
|
|
11
|
+
return [state];
|
|
12
|
+
});
|
|
13
|
+
const limit = typeof options?.limit === "number" ? options.limit : 10;
|
|
14
|
+
return client.threads.getHistory(threadId, { limit });
|
|
15
|
+
}
|
|
16
|
+
function useStreamLGP(options) {
|
|
17
|
+
const runMetadataStorage = (() => {
|
|
18
|
+
if (typeof window === "undefined") return null;
|
|
19
|
+
const storage = options.reconnectOnMount;
|
|
20
|
+
if (storage === true) return window.sessionStorage;
|
|
21
|
+
if (typeof storage === "function") return storage();
|
|
22
|
+
return null;
|
|
23
|
+
})();
|
|
24
|
+
const getMessages = (value) => {
|
|
25
|
+
const messagesKey = options.messagesKey ?? "messages";
|
|
26
|
+
return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
|
|
27
|
+
};
|
|
28
|
+
const setMessages = (current, messages) => {
|
|
29
|
+
const messagesKey = options.messagesKey ?? "messages";
|
|
30
|
+
return {
|
|
31
|
+
...current,
|
|
32
|
+
[messagesKey]: messages
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
const historyLimit = typeof options.fetchStateHistory === "object" && options.fetchStateHistory != null ? options.fetchStateHistory.limit ?? false : options.fetchStateHistory ?? false;
|
|
36
|
+
const threadId = ref(void 0);
|
|
37
|
+
const client = options.client ?? new Client({ apiUrl: options.apiUrl });
|
|
38
|
+
const history = shallowRef({
|
|
39
|
+
data: void 0,
|
|
40
|
+
error: void 0,
|
|
41
|
+
isLoading: false,
|
|
42
|
+
mutate: async () => void 0
|
|
43
|
+
});
|
|
44
|
+
async function mutate(mutateId) {
|
|
45
|
+
const tid = mutateId ?? threadId.value;
|
|
46
|
+
if (!tid) return void 0;
|
|
47
|
+
try {
|
|
48
|
+
const data = await fetchHistory(client, tid, { limit: historyLimit });
|
|
49
|
+
history.value = {
|
|
50
|
+
data,
|
|
51
|
+
error: void 0,
|
|
52
|
+
isLoading: false,
|
|
53
|
+
mutate
|
|
54
|
+
};
|
|
55
|
+
return data;
|
|
56
|
+
} catch (err) {
|
|
57
|
+
history.value = {
|
|
58
|
+
...history.value,
|
|
59
|
+
error: err,
|
|
60
|
+
isLoading: false
|
|
61
|
+
};
|
|
62
|
+
options.onError?.(err, void 0);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
history.value = {
|
|
67
|
+
...history.value,
|
|
68
|
+
mutate
|
|
69
|
+
};
|
|
70
|
+
const branch = ref("");
|
|
71
|
+
const branchContext = computed(() => getBranchContext(branch.value, history.value.data ?? void 0));
|
|
72
|
+
const messageManager = new MessageTupleManager();
|
|
73
|
+
const stream = new StreamManager(messageManager, {
|
|
74
|
+
throttle: options.throttle ?? false,
|
|
75
|
+
subagentToolNames: options.subagentToolNames,
|
|
76
|
+
filterSubagentMessages: options.filterSubagentMessages,
|
|
77
|
+
toMessage: toMessageClass
|
|
78
|
+
});
|
|
79
|
+
const pendingRuns = new PendingRunsTracker();
|
|
80
|
+
const queueEntries = shallowRef(pendingRuns.entries);
|
|
81
|
+
const queueSize = ref(pendingRuns.size);
|
|
82
|
+
const historyValues = computed(() => branchContext.value.threadHead?.values ?? options.initialValues ?? {});
|
|
83
|
+
const historyError = computed(() => {
|
|
84
|
+
const error = branchContext.value.threadHead?.tasks?.at(-1)?.error;
|
|
85
|
+
if (error == null) return void 0;
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(error);
|
|
88
|
+
if (StreamError.isStructuredError(parsed)) return new StreamError(parsed);
|
|
89
|
+
return parsed;
|
|
90
|
+
} catch {}
|
|
91
|
+
return error;
|
|
92
|
+
});
|
|
93
|
+
const streamValues = shallowRef(stream.values);
|
|
94
|
+
const streamError = shallowRef(stream.error);
|
|
95
|
+
const isLoading = shallowRef(stream.isLoading);
|
|
96
|
+
const values = computed(() => streamValues.value ?? historyValues.value);
|
|
97
|
+
const error = computed(() => streamError.value ?? historyError.value ?? history.value.error);
|
|
98
|
+
const messageMetadata = computed(() => getMessagesMetadataMap({
|
|
99
|
+
initialValues: options.initialValues,
|
|
100
|
+
history: history.value.data,
|
|
101
|
+
getMessages,
|
|
102
|
+
branchContext: branchContext.value
|
|
103
|
+
}));
|
|
104
|
+
const unsubscribe = stream.subscribe(() => {
|
|
105
|
+
streamValues.value = stream.values;
|
|
106
|
+
streamError.value = stream.error;
|
|
107
|
+
isLoading.value = stream.isLoading;
|
|
108
|
+
});
|
|
109
|
+
const unsubQueue = pendingRuns.subscribe(() => {
|
|
110
|
+
queueEntries.value = pendingRuns.entries;
|
|
111
|
+
queueSize.value = pendingRuns.size;
|
|
112
|
+
});
|
|
113
|
+
onUnmounted(() => {
|
|
114
|
+
unsubscribe();
|
|
115
|
+
unsubQueue();
|
|
116
|
+
});
|
|
117
|
+
watch(() => {
|
|
118
|
+
const hvMessages = getMessages(historyValues.value);
|
|
119
|
+
return {
|
|
120
|
+
should: options.filterSubagentMessages && !isLoading.value && !history.value.isLoading && hvMessages.length > 0,
|
|
121
|
+
len: hvMessages.length
|
|
122
|
+
};
|
|
123
|
+
}, ({ should }) => {
|
|
124
|
+
if (should) {
|
|
125
|
+
const hvMessages = getMessages(historyValues.value);
|
|
126
|
+
stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });
|
|
127
|
+
}
|
|
128
|
+
}, { immediate: true });
|
|
129
|
+
function stop() {
|
|
130
|
+
return stream.stop(historyValues.value, { onStop: (args) => {
|
|
131
|
+
if (runMetadataStorage && threadId.value) {
|
|
132
|
+
const runId = runMetadataStorage.getItem(`lg:stream:${threadId.value}`);
|
|
133
|
+
if (runId) client.runs.cancel(threadId.value, runId);
|
|
134
|
+
runMetadataStorage.removeItem(`lg:stream:${threadId.value}`);
|
|
135
|
+
}
|
|
136
|
+
options.onStop?.(args);
|
|
137
|
+
} });
|
|
138
|
+
}
|
|
139
|
+
function setBranch(value) {
|
|
140
|
+
branch.value = value;
|
|
141
|
+
}
|
|
142
|
+
async function joinStream(runId, lastEventId, joinOptions) {
|
|
143
|
+
lastEventId ??= "-1";
|
|
144
|
+
if (!threadId.value) return;
|
|
145
|
+
const callbackMeta = {
|
|
146
|
+
thread_id: threadId.value,
|
|
147
|
+
run_id: runId
|
|
148
|
+
};
|
|
149
|
+
await stream.start(async (signal) => {
|
|
150
|
+
const rawStream = client.runs.joinStream(threadId.value, runId, {
|
|
151
|
+
signal,
|
|
152
|
+
lastEventId,
|
|
153
|
+
streamMode: joinOptions?.streamMode
|
|
154
|
+
});
|
|
155
|
+
return joinOptions?.filter != null ? filterStream(rawStream, joinOptions.filter) : rawStream;
|
|
156
|
+
}, {
|
|
157
|
+
getMessages,
|
|
158
|
+
setMessages,
|
|
159
|
+
initialValues: historyValues.value,
|
|
160
|
+
callbacks: options,
|
|
161
|
+
async onSuccess() {
|
|
162
|
+
runMetadataStorage?.removeItem(`lg:stream:${threadId.value}`);
|
|
163
|
+
const lastHead = (await mutate(threadId.value))?.at(0);
|
|
164
|
+
if (lastHead) options.onFinish?.(lastHead, callbackMeta);
|
|
165
|
+
},
|
|
166
|
+
onError(error) {
|
|
167
|
+
options.onError?.(error, callbackMeta);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function submitDirect(values, submitOptions) {
|
|
172
|
+
const currentBranchContext = branchContext.value;
|
|
173
|
+
const checkpointId = submitOptions?.checkpoint?.checkpoint_id;
|
|
174
|
+
branch.value = checkpointId != null ? currentBranchContext.branchByCheckpoint[checkpointId]?.branch ?? "" : "";
|
|
175
|
+
const includeImplicitBranch = historyLimit === true || typeof historyLimit === "number";
|
|
176
|
+
const shouldRefetch = options.onFinish != null || includeImplicitBranch;
|
|
177
|
+
let checkpoint = submitOptions?.checkpoint ?? (includeImplicitBranch ? currentBranchContext.threadHead?.checkpoint : void 0) ?? void 0;
|
|
178
|
+
if (submitOptions?.checkpoint === null) checkpoint = void 0;
|
|
179
|
+
if (checkpoint != null) delete checkpoint.thread_id;
|
|
180
|
+
let callbackMeta;
|
|
181
|
+
let rejoinKey;
|
|
182
|
+
let usableThreadId;
|
|
183
|
+
return stream.start(async (signal) => {
|
|
184
|
+
usableThreadId = threadId.value;
|
|
185
|
+
if (!usableThreadId) {
|
|
186
|
+
usableThreadId = (await client.threads.create({
|
|
187
|
+
threadId: submitOptions?.threadId,
|
|
188
|
+
metadata: submitOptions?.metadata
|
|
189
|
+
})).thread_id;
|
|
190
|
+
threadId.value = usableThreadId;
|
|
191
|
+
options.onThreadId?.(usableThreadId);
|
|
192
|
+
}
|
|
193
|
+
const streamMode = unique([
|
|
194
|
+
...submitOptions?.streamMode ?? [],
|
|
195
|
+
"values",
|
|
196
|
+
"messages-tuple"
|
|
197
|
+
]);
|
|
198
|
+
if (options.onUpdateEvent && !streamMode.includes("updates")) streamMode.push("updates");
|
|
199
|
+
if (options.onCustomEvent && !streamMode.includes("custom")) streamMode.push("custom");
|
|
200
|
+
if (options.onCheckpointEvent && !streamMode.includes("checkpoints")) streamMode.push("checkpoints");
|
|
201
|
+
if (options.onTaskEvent && !streamMode.includes("tasks")) streamMode.push("tasks");
|
|
202
|
+
if ("onDebugEvent" in options && options.onDebugEvent && !streamMode.includes("debug")) streamMode.push("debug");
|
|
203
|
+
if ("onLangChainEvent" in options && options.onLangChainEvent && !streamMode.includes("events")) streamMode.push("events");
|
|
204
|
+
stream.setStreamValues(() => {
|
|
205
|
+
const prev = {
|
|
206
|
+
...historyValues.value,
|
|
207
|
+
...stream.values
|
|
208
|
+
};
|
|
209
|
+
if (submitOptions?.optimisticValues != null) return {
|
|
210
|
+
...prev,
|
|
211
|
+
...typeof submitOptions.optimisticValues === "function" ? submitOptions.optimisticValues(prev) : submitOptions.optimisticValues
|
|
212
|
+
};
|
|
213
|
+
return { ...prev };
|
|
214
|
+
});
|
|
215
|
+
const streamResumable = submitOptions?.streamResumable ?? !!runMetadataStorage;
|
|
216
|
+
return client.runs.stream(usableThreadId, options.assistantId, {
|
|
217
|
+
input: values,
|
|
218
|
+
config: submitOptions?.config,
|
|
219
|
+
context: submitOptions?.context,
|
|
220
|
+
command: submitOptions?.command,
|
|
221
|
+
interruptBefore: submitOptions?.interruptBefore,
|
|
222
|
+
interruptAfter: submitOptions?.interruptAfter,
|
|
223
|
+
metadata: submitOptions?.metadata,
|
|
224
|
+
multitaskStrategy: submitOptions?.multitaskStrategy,
|
|
225
|
+
onCompletion: submitOptions?.onCompletion,
|
|
226
|
+
onDisconnect: submitOptions?.onDisconnect ?? (streamResumable ? "continue" : "cancel"),
|
|
227
|
+
signal,
|
|
228
|
+
checkpoint,
|
|
229
|
+
streamMode,
|
|
230
|
+
streamSubgraphs: submitOptions?.streamSubgraphs,
|
|
231
|
+
streamResumable,
|
|
232
|
+
durability: submitOptions?.durability,
|
|
233
|
+
onRunCreated(params) {
|
|
234
|
+
callbackMeta = {
|
|
235
|
+
run_id: params.run_id,
|
|
236
|
+
thread_id: params.thread_id ?? usableThreadId
|
|
237
|
+
};
|
|
238
|
+
if (runMetadataStorage) {
|
|
239
|
+
rejoinKey = `lg:stream:${usableThreadId}`;
|
|
240
|
+
runMetadataStorage.setItem(rejoinKey, callbackMeta.run_id);
|
|
241
|
+
}
|
|
242
|
+
options.onCreated?.(callbackMeta);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}, {
|
|
246
|
+
getMessages,
|
|
247
|
+
setMessages,
|
|
248
|
+
initialValues: historyValues.value,
|
|
249
|
+
callbacks: options,
|
|
250
|
+
async onSuccess() {
|
|
251
|
+
if (rejoinKey) runMetadataStorage?.removeItem(rejoinKey);
|
|
252
|
+
if (shouldRefetch && usableThreadId) {
|
|
253
|
+
const lastHead = (await mutate(usableThreadId))?.at(0);
|
|
254
|
+
if (lastHead) {
|
|
255
|
+
options.onFinish?.(lastHead, callbackMeta);
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
onError: (error) => options.onError?.(error, callbackMeta),
|
|
261
|
+
onFinish: () => {}
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
const submitting = ref(false);
|
|
265
|
+
watch(() => ({
|
|
266
|
+
loading: isLoading.value,
|
|
267
|
+
submitting: submitting.value,
|
|
268
|
+
size: pendingRuns.size
|
|
269
|
+
}), ({ loading, submitting: s, size }) => {
|
|
270
|
+
if (!loading && !s && size > 0) {
|
|
271
|
+
const next = pendingRuns.shift();
|
|
272
|
+
if (next) {
|
|
273
|
+
submitting.value = true;
|
|
274
|
+
joinStream(next.id).finally(() => {
|
|
275
|
+
submitting.value = false;
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
async function submit(values, submitOptions) {
|
|
281
|
+
if (stream.isLoading || submitting.value) {
|
|
282
|
+
if (submitOptions?.multitaskStrategy === "interrupt" || submitOptions?.multitaskStrategy === "rollback") {
|
|
283
|
+
submitting.value = true;
|
|
284
|
+
try {
|
|
285
|
+
await submitDirect(values, submitOptions);
|
|
286
|
+
} finally {
|
|
287
|
+
submitting.value = false;
|
|
288
|
+
}
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const usableThreadId = threadId.value;
|
|
292
|
+
if (usableThreadId) {
|
|
293
|
+
const run = await client.runs.create(usableThreadId, options.assistantId, {
|
|
294
|
+
input: values,
|
|
295
|
+
config: submitOptions?.config,
|
|
296
|
+
context: submitOptions?.context,
|
|
297
|
+
command: submitOptions?.command,
|
|
298
|
+
interruptBefore: submitOptions?.interruptBefore,
|
|
299
|
+
interruptAfter: submitOptions?.interruptAfter,
|
|
300
|
+
metadata: submitOptions?.metadata,
|
|
301
|
+
multitaskStrategy: "enqueue",
|
|
302
|
+
streamResumable: true,
|
|
303
|
+
streamSubgraphs: submitOptions?.streamSubgraphs,
|
|
304
|
+
durability: submitOptions?.durability
|
|
305
|
+
});
|
|
306
|
+
pendingRuns.add({
|
|
307
|
+
id: run.run_id,
|
|
308
|
+
values,
|
|
309
|
+
options: submitOptions,
|
|
310
|
+
createdAt: new Date(run.created_at)
|
|
311
|
+
});
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
submitting.value = true;
|
|
316
|
+
const result = submitDirect(values, submitOptions);
|
|
317
|
+
Promise.resolve(result).finally(() => {
|
|
318
|
+
submitting.value = false;
|
|
319
|
+
});
|
|
320
|
+
return result;
|
|
321
|
+
}
|
|
322
|
+
let shouldReconnect = !!runMetadataStorage;
|
|
323
|
+
onMounted(() => {
|
|
324
|
+
if (shouldReconnect && runMetadataStorage && threadId.value) {
|
|
325
|
+
const runId = runMetadataStorage.getItem(`lg:stream:${threadId.value}`);
|
|
326
|
+
if (runId) {
|
|
327
|
+
shouldReconnect = false;
|
|
328
|
+
joinStream(runId);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
watch(() => threadId.value, () => {
|
|
333
|
+
shouldReconnect = !!runMetadataStorage;
|
|
334
|
+
});
|
|
335
|
+
const toolCalls = computed(() => getToolCallsWithResults(getMessages(values.value)));
|
|
336
|
+
function getToolCalls(message) {
|
|
337
|
+
return getToolCallsWithResults(getMessages(values.value)).filter((tc) => tc.aiMessage.id === message.id);
|
|
338
|
+
}
|
|
339
|
+
const interrupts = computed(() => {
|
|
340
|
+
const v = values.value;
|
|
341
|
+
if (v != null && "__interrupt__" in v && Array.isArray(v.__interrupt__)) {
|
|
342
|
+
const valueInterrupts = v.__interrupt__;
|
|
343
|
+
if (valueInterrupts.length === 0) return [{ when: "breakpoint" }];
|
|
344
|
+
return valueInterrupts;
|
|
345
|
+
}
|
|
346
|
+
if (isLoading.value) return [];
|
|
347
|
+
const allInterrupts = (branchContext.value.threadHead?.tasks ?? []).flatMap((t) => t.interrupts ?? []);
|
|
348
|
+
if (allInterrupts.length > 0) return allInterrupts;
|
|
349
|
+
if (!(branchContext.value.threadHead?.next ?? []).length || error.value != null) return [];
|
|
350
|
+
return [{ when: "breakpoint" }];
|
|
351
|
+
});
|
|
352
|
+
const flatHistory = computed(() => {
|
|
353
|
+
if (historyLimit === false) throw new Error("`fetchStateHistory` must be set to `true` to use `history`");
|
|
354
|
+
return branchContext.value.flatHistory;
|
|
355
|
+
});
|
|
356
|
+
const isThreadLoading = computed(() => history.value.isLoading && history.value.data == null);
|
|
357
|
+
const experimentalBranchTree = computed(() => {
|
|
358
|
+
if (historyLimit === false) throw new Error("`fetchStateHistory` must be set to `true` to use `experimental_branchTree`");
|
|
359
|
+
return branchContext.value.branchTree;
|
|
360
|
+
});
|
|
361
|
+
return {
|
|
362
|
+
assistantId: options.assistantId,
|
|
363
|
+
client,
|
|
364
|
+
values,
|
|
365
|
+
error,
|
|
366
|
+
isLoading,
|
|
367
|
+
branch,
|
|
368
|
+
setBranch,
|
|
369
|
+
messages: computed(() => getMessages(streamValues.value ?? historyValues.value)),
|
|
370
|
+
toolCalls,
|
|
371
|
+
getToolCalls,
|
|
372
|
+
interrupt: computed(() => extractInterrupts(streamValues.value, {
|
|
373
|
+
isLoading: isLoading.value,
|
|
374
|
+
threadState: branchContext.value.threadHead,
|
|
375
|
+
error: streamError.value
|
|
376
|
+
})),
|
|
377
|
+
interrupts,
|
|
378
|
+
history: flatHistory,
|
|
379
|
+
isThreadLoading,
|
|
380
|
+
experimental_branchTree: experimentalBranchTree,
|
|
381
|
+
getMessagesMetadata: (message, index) => {
|
|
382
|
+
const streamMetadata = messageManager.get(message.id)?.metadata;
|
|
383
|
+
const historyMetadata = messageMetadata.value?.find((m) => m.messageId === (message.id ?? index));
|
|
384
|
+
if (streamMetadata != null || historyMetadata != null) return {
|
|
385
|
+
...historyMetadata,
|
|
386
|
+
streamMetadata
|
|
387
|
+
};
|
|
388
|
+
},
|
|
389
|
+
submit,
|
|
390
|
+
stop,
|
|
391
|
+
joinStream,
|
|
392
|
+
queue: {
|
|
393
|
+
entries: queueEntries,
|
|
394
|
+
size: queueSize,
|
|
395
|
+
async cancel(id) {
|
|
396
|
+
const tid = threadId.value;
|
|
397
|
+
const removed = pendingRuns.remove(id);
|
|
398
|
+
if (removed && tid) await client.runs.cancel(tid, id);
|
|
399
|
+
return removed;
|
|
400
|
+
},
|
|
401
|
+
async clear() {
|
|
402
|
+
const tid = threadId.value;
|
|
403
|
+
const removed = pendingRuns.removeAll();
|
|
404
|
+
if (tid && removed.length > 0) await Promise.all(removed.map((e) => client.runs.cancel(tid, e.id)));
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
switchThread(newThreadId) {
|
|
408
|
+
if (newThreadId !== (threadId.value ?? null)) {
|
|
409
|
+
const prevThreadId = threadId.value;
|
|
410
|
+
threadId.value = newThreadId ?? void 0;
|
|
411
|
+
stream.clear();
|
|
412
|
+
const removed = pendingRuns.removeAll();
|
|
413
|
+
if (prevThreadId && removed.length > 0) Promise.all(removed.map((e) => client.runs.cancel(prevThreadId, e.id)));
|
|
414
|
+
if (newThreadId != null) options.onThreadId?.(newThreadId);
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
get subagents() {
|
|
418
|
+
return stream.getSubagents();
|
|
419
|
+
},
|
|
420
|
+
get activeSubagents() {
|
|
421
|
+
return stream.getActiveSubagents();
|
|
422
|
+
},
|
|
423
|
+
getSubagent(toolCallId) {
|
|
424
|
+
return stream.getSubagent(toolCallId);
|
|
425
|
+
},
|
|
426
|
+
getSubagentsByType(type) {
|
|
427
|
+
return stream.getSubagentsByType(type);
|
|
428
|
+
},
|
|
429
|
+
getSubagentsByMessage(messageId) {
|
|
430
|
+
return stream.getSubagentsByMessage(messageId);
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
function useStream(options) {
|
|
435
|
+
if ("transport" in options) return useStreamCustom(options);
|
|
436
|
+
return useStreamLGP(options);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
//#endregion
|
|
440
|
+
export { FetchStreamTransport, SubagentManager, calculateDepthFromNamespace, extractParentIdFromNamespace, extractToolCallIdFromNamespace, isSubagentNamespace, useStream };
|
|
441
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import {\n computed,\n onMounted,\n onUnmounted,\n ref,\n shallowRef,\n watch,\n type ComputedRef,\n type Ref,\n} from \"vue\";\nimport type {\n BaseMessage,\n ToolMessage as CoreToolMessage,\n AIMessage as CoreAIMessage,\n} from \"@langchain/core/messages\";\nimport {\n StreamManager,\n MessageTupleManager,\n PendingRunsTracker,\n filterStream,\n unique,\n getBranchContext,\n getMessagesMetadataMap,\n StreamError,\n extractInterrupts,\n FetchStreamTransport,\n toMessageClass,\n type UseStreamThread,\n type GetConfigurableType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetUpdateType,\n type MessageMetadata,\n type AnyStreamOptions,\n type SubmitOptions,\n type EventStreamEvent,\n type RunCallbackMeta,\n type ResolveStreamInterface,\n type ResolveStreamOptions,\n type InferBag,\n type InferStateType,\n type UseStreamCustomOptions,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\n\nimport {\n Client,\n type StreamMode,\n type StreamEvent,\n type Message,\n type Interrupt,\n type BagTemplate,\n type ThreadState,\n type ToolCallWithResult as _ToolCallWithResult,\n type DefaultToolCall,\n} from \"@langchain/langgraph-sdk\";\n\nimport { useStreamCustom } from \"./stream.custom.js\";\n\nexport { FetchStreamTransport };\n\nfunction fetchHistory<StateType extends Record<string, unknown>>(\n client: Client,\n threadId: string,\n options?: { limit?: boolean | number },\n) {\n if (options?.limit === false) {\n return client.threads.getState<StateType>(threadId).then((state) => {\n if (state.checkpoint == null) return [];\n return [state];\n });\n }\n\n const limit = typeof options?.limit === \"number\" ? options.limit : 10;\n return client.threads.getHistory<StateType>(threadId, { limit });\n}\n\nfunction useStreamLGP<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends {\n ConfigurableType?: Record<string, unknown>;\n InterruptType?: unknown;\n CustomEventType?: unknown;\n UpdateType?: unknown;\n } = BagTemplate,\n>(options: AnyStreamOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n\n const runMetadataStorage = (() => {\n if (typeof window === \"undefined\") return null;\n const storage = options.reconnectOnMount;\n if (storage === true) return window.sessionStorage;\n if (typeof storage === \"function\") return storage();\n return null;\n })();\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];\n };\n\n const setMessages = (current: StateType, messages: Message[]): StateType => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return { ...current, [messagesKey]: messages };\n };\n\n const historyLimit =\n typeof options.fetchStateHistory === \"object\" &&\n options.fetchStateHistory != null\n ? (options.fetchStateHistory.limit ?? false)\n : (options.fetchStateHistory ?? false);\n\n const threadId = ref<string | undefined>(undefined);\n\n const client = options.client ?? new Client({ apiUrl: options.apiUrl });\n\n const history = shallowRef<UseStreamThread<StateType>>({\n data: undefined,\n error: undefined,\n isLoading: false,\n mutate: async () => undefined,\n });\n\n async function mutate(\n mutateId?: string,\n ): Promise<ThreadState<StateType>[] | undefined> {\n const tid = mutateId ?? threadId.value;\n if (!tid) return undefined;\n try {\n const data = await fetchHistory<StateType>(client, tid, {\n limit: historyLimit,\n });\n history.value = {\n data,\n error: undefined,\n isLoading: false,\n mutate,\n };\n return data;\n } catch (err) {\n history.value = {\n ...history.value,\n error: err,\n isLoading: false,\n };\n options.onError?.(err, undefined);\n return undefined;\n }\n }\n\n history.value = { ...history.value, mutate };\n\n const branch = ref<string>(\"\");\n const branchContext = computed(() =>\n getBranchContext(branch.value, history.value.data ?? undefined),\n );\n\n const messageManager = new MessageTupleManager();\n const stream = new StreamManager<StateType, Bag>(messageManager, {\n throttle: options.throttle ?? false,\n subagentToolNames: options.subagentToolNames,\n filterSubagentMessages: options.filterSubagentMessages,\n toMessage: toMessageClass,\n });\n\n const pendingRuns = new PendingRunsTracker<\n StateType,\n SubmitOptions<StateType, ConfigurableType>\n >();\n const queueEntries = shallowRef(pendingRuns.entries);\n const queueSize = ref(pendingRuns.size);\n\n const historyValues = computed(\n () =>\n branchContext.value.threadHead?.values ??\n options.initialValues ??\n ({} as StateType),\n );\n\n const historyError = computed(() => {\n const error = branchContext.value.threadHead?.tasks?.at(-1)?.error;\n if (error == null) return undefined;\n try {\n const parsed = JSON.parse(error) as unknown;\n if (StreamError.isStructuredError(parsed)) return new StreamError(parsed);\n return parsed;\n } catch {\n // do nothing\n }\n return error;\n });\n\n const streamValues = shallowRef<StateType | null>(stream.values);\n const streamError = shallowRef<unknown>(stream.error);\n const isLoading = shallowRef(stream.isLoading);\n\n const values = computed(() => streamValues.value ?? historyValues.value);\n const error = computed(\n () => streamError.value ?? historyError.value ?? history.value.error,\n );\n\n const messageMetadata = computed(() =>\n getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: history.value.data,\n getMessages,\n branchContext: branchContext.value,\n }),\n );\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.value = stream.values;\n streamError.value = stream.error;\n isLoading.value = stream.isLoading;\n });\n\n const unsubQueue = pendingRuns.subscribe(() => {\n queueEntries.value = pendingRuns.entries;\n queueSize.value = pendingRuns.size;\n });\n\n onUnmounted(() => {\n unsubscribe();\n unsubQueue();\n });\n\n watch(\n () => {\n const hvMessages = getMessages(historyValues.value);\n return {\n should:\n options.filterSubagentMessages &&\n !isLoading.value &&\n !history.value.isLoading &&\n hvMessages.length > 0,\n len: hvMessages.length,\n };\n },\n ({ should }) => {\n if (should) {\n const hvMessages = getMessages(historyValues.value);\n stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });\n }\n },\n { immediate: true },\n );\n\n function stop() {\n return stream.stop(historyValues.value, {\n onStop: (args) => {\n if (runMetadataStorage && threadId.value) {\n const runId = runMetadataStorage.getItem(\n `lg:stream:${threadId.value}`,\n );\n if (runId) void client.runs.cancel(threadId.value, runId);\n runMetadataStorage.removeItem(`lg:stream:${threadId.value}`);\n }\n\n options.onStop?.(args);\n },\n });\n }\n\n function setBranch(value: string) {\n branch.value = value;\n }\n\n async function joinStream(\n runId: string,\n lastEventId?: string,\n joinOptions?: {\n streamMode?: StreamMode | StreamMode[];\n filter?: (event: {\n id?: string;\n event: StreamEvent;\n data: unknown;\n }) => boolean;\n },\n ) {\n // eslint-disable-next-line no-param-reassign\n lastEventId ??= \"-1\";\n if (!threadId.value) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: threadId.value,\n run_id: runId,\n };\n\n await stream.start(\n async (signal: AbortSignal) => {\n const rawStream = client.runs.joinStream(threadId.value!, runId, {\n signal,\n lastEventId,\n streamMode: joinOptions?.streamMode,\n }) as AsyncGenerator<\n EventStreamEvent<StateType, UpdateType, CustomType>\n >;\n\n return joinOptions?.filter != null\n ? filterStream(rawStream, joinOptions.filter)\n : rawStream;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues.value,\n callbacks: options,\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${threadId.value}`);\n const newHistory = await mutate(threadId.value);\n const lastHead = newHistory?.at(0);\n if (lastHead) options.onFinish?.(lastHead, callbackMeta);\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n },\n );\n }\n\n function submitDirect(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentBranchContext = branchContext.value;\n\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n branch.value =\n checkpointId != null\n ? (currentBranchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\n : \"\";\n\n const includeImplicitBranch =\n historyLimit === true || typeof historyLimit === \"number\";\n\n const shouldRefetch = options.onFinish != null || includeImplicitBranch;\n\n let checkpoint =\n submitOptions?.checkpoint ??\n (includeImplicitBranch\n ? currentBranchContext.threadHead?.checkpoint\n : undefined) ??\n undefined;\n\n if (submitOptions?.checkpoint === null) checkpoint = undefined;\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (checkpoint != null) delete checkpoint.thread_id;\n\n let callbackMeta: RunCallbackMeta | undefined;\n let rejoinKey: `lg:stream:${string}` | undefined;\n let usableThreadId: string | undefined;\n\n return stream.start(\n async (signal) => {\n usableThreadId = threadId.value;\n if (!usableThreadId) {\n const thread = await client.threads.create({\n threadId: submitOptions?.threadId,\n metadata: submitOptions?.metadata,\n });\n\n usableThreadId = thread.thread_id;\n threadId.value = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n const streamMode = unique([\n ...(submitOptions?.streamMode ?? []),\n \"values\" as StreamMode,\n \"messages-tuple\" as StreamMode,\n ]);\n\n if (options.onUpdateEvent && !streamMode.includes(\"updates\"))\n streamMode.push(\"updates\");\n if (options.onCustomEvent && !streamMode.includes(\"custom\"))\n streamMode.push(\"custom\");\n if (options.onCheckpointEvent && !streamMode.includes(\"checkpoints\"))\n streamMode.push(\"checkpoints\");\n if (options.onTaskEvent && !streamMode.includes(\"tasks\"))\n streamMode.push(\"tasks\");\n if (\n \"onDebugEvent\" in options &&\n options.onDebugEvent &&\n !streamMode.includes(\"debug\")\n )\n streamMode.push(\"debug\");\n if (\n \"onLangChainEvent\" in options &&\n options.onLangChainEvent &&\n !streamMode.includes(\"events\")\n )\n streamMode.push(\"events\");\n\n stream.setStreamValues(() => {\n const prev = { ...historyValues.value, ...stream.values };\n\n if (submitOptions?.optimisticValues != null) {\n return {\n ...prev,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(prev)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...prev };\n });\n\n const streamResumable =\n submitOptions?.streamResumable ?? !!runMetadataStorage;\n\n return client.runs.stream(usableThreadId!, options.assistantId, {\n input: values as Record<string, unknown>,\n config: submitOptions?.config,\n context: submitOptions?.context,\n command: submitOptions?.command,\n\n interruptBefore: submitOptions?.interruptBefore,\n interruptAfter: submitOptions?.interruptAfter,\n metadata: submitOptions?.metadata,\n multitaskStrategy: submitOptions?.multitaskStrategy,\n onCompletion: submitOptions?.onCompletion,\n onDisconnect:\n submitOptions?.onDisconnect ??\n (streamResumable ? \"continue\" : \"cancel\"),\n\n signal,\n\n checkpoint,\n streamMode,\n streamSubgraphs: submitOptions?.streamSubgraphs,\n streamResumable,\n durability: submitOptions?.durability,\n onRunCreated(params) {\n callbackMeta = {\n run_id: params.run_id,\n thread_id: params.thread_id ?? usableThreadId!,\n };\n\n if (runMetadataStorage) {\n rejoinKey = `lg:stream:${usableThreadId}`;\n runMetadataStorage.setItem(rejoinKey, callbackMeta.run_id);\n }\n\n options.onCreated?.(callbackMeta);\n },\n }) as AsyncGenerator<\n EventStreamEvent<StateType, UpdateType, CustomType>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: historyValues.value,\n callbacks: options,\n\n async onSuccess() {\n if (rejoinKey) runMetadataStorage?.removeItem(rejoinKey);\n\n if (shouldRefetch && usableThreadId) {\n const newHistory = await mutate(usableThreadId);\n const lastHead = newHistory?.at(0);\n if (lastHead) {\n options.onFinish?.(lastHead, callbackMeta);\n return null;\n }\n }\n return undefined;\n },\n onError: (error) => options.onError?.(error, callbackMeta),\n onFinish: () => {},\n },\n );\n }\n\n const submitting = ref(false);\n\n watch(\n () => ({\n loading: isLoading.value,\n submitting: submitting.value,\n size: pendingRuns.size,\n }),\n ({ loading, submitting: s, size }) => {\n if (!loading && !s && size > 0) {\n const next = pendingRuns.shift();\n if (next) {\n submitting.value = true;\n void joinStream(next.id).finally(() => {\n submitting.value = false;\n });\n }\n }\n },\n );\n\n async function submit(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n if (stream.isLoading || submitting.value) {\n const shouldAbort =\n submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\";\n\n if (shouldAbort) {\n submitting.value = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submitting.value = false;\n }\n return;\n }\n\n const usableThreadId = threadId.value;\n if (usableThreadId) {\n const run = await client.runs.create(\n usableThreadId,\n options.assistantId,\n {\n input: values as Record<string, unknown>,\n config: submitOptions?.config,\n context: submitOptions?.context,\n command: submitOptions?.command,\n interruptBefore: submitOptions?.interruptBefore,\n interruptAfter: submitOptions?.interruptAfter,\n metadata: submitOptions?.metadata,\n multitaskStrategy: \"enqueue\",\n streamResumable: true,\n streamSubgraphs: submitOptions?.streamSubgraphs,\n durability: submitOptions?.durability,\n },\n );\n\n pendingRuns.add({\n id: run.run_id,\n values: values as Partial<StateType> | null | undefined,\n options: submitOptions,\n createdAt: new Date(run.created_at),\n });\n return;\n }\n }\n\n submitting.value = true;\n const result = submitDirect(values, submitOptions);\n void Promise.resolve(result).finally(() => {\n submitting.value = false;\n });\n return result;\n }\n\n // --- Auto-reconnect on mount ---\n let shouldReconnect = !!runMetadataStorage;\n\n onMounted(() => {\n if (shouldReconnect && runMetadataStorage && threadId.value) {\n const runId = runMetadataStorage.getItem(`lg:stream:${threadId.value}`);\n if (runId) {\n shouldReconnect = false;\n void joinStream(runId);\n }\n }\n });\n\n watch(\n () => threadId.value,\n () => {\n shouldReconnect = !!runMetadataStorage;\n },\n );\n\n const toolCalls = computed(() =>\n getToolCallsWithResults(getMessages(values.value)),\n );\n\n function getToolCalls(message: Message) {\n const allToolCalls = getToolCallsWithResults(getMessages(values.value));\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n const interrupts = computed((): Interrupt<InterruptType>[] => {\n const v = values.value;\n if (v != null && \"__interrupt__\" in v && Array.isArray(v.__interrupt__)) {\n const valueInterrupts = v.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n if (isLoading.value) return [];\n\n const allTasks = branchContext.value.threadHead?.tasks ?? [];\n const allInterrupts = allTasks.flatMap((t) => t.interrupts ?? []);\n\n if (allInterrupts.length > 0) {\n return allInterrupts as Interrupt<InterruptType>[];\n }\n\n const next = branchContext.value.threadHead?.next ?? [];\n if (!next.length || error.value != null) return [];\n return [{ when: \"breakpoint\" }];\n });\n\n const flatHistory = computed(() => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\",\n );\n }\n return branchContext.value.flatHistory;\n });\n\n const isThreadLoading = computed(\n () => history.value.isLoading && history.value.data == null,\n );\n\n const experimentalBranchTree = computed(() => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `experimental_branchTree`\",\n );\n }\n return branchContext.value.branchTree;\n });\n\n return {\n assistantId: options.assistantId,\n client,\n\n values,\n error,\n isLoading,\n\n branch,\n setBranch,\n\n messages: computed(() =>\n getMessages(streamValues.value ?? historyValues.value),\n ),\n\n toolCalls,\n getToolCalls,\n\n interrupt: computed(() =>\n extractInterrupts<InterruptType>(streamValues.value, {\n isLoading: isLoading.value,\n threadState: branchContext.value.threadHead,\n error: streamError.value,\n }),\n ),\n\n interrupts,\n history: flatHistory,\n isThreadLoading,\n experimental_branchTree: experimentalBranchTree,\n\n getMessagesMetadata: (\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined => {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = messageMetadata.value?.find(\n (m) => m.messageId === (message.id ?? index),\n );\n\n if (streamMetadata != null || historyMetadata != null) {\n return {\n ...historyMetadata,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n\n return undefined;\n },\n\n submit,\n stop,\n joinStream,\n\n queue: {\n entries: queueEntries,\n size: queueSize,\n async cancel(id: string) {\n const tid = threadId.value;\n const removed = pendingRuns.remove(id);\n if (removed && tid) {\n await client.runs.cancel(tid, id);\n }\n return removed;\n },\n async clear() {\n const tid = threadId.value;\n const removed = pendingRuns.removeAll();\n if (tid && removed.length > 0) {\n await Promise.all(\n removed.map((e) => client.runs.cancel(tid, e.id)),\n );\n }\n },\n },\n\n switchThread(newThreadId: string | null) {\n const current = threadId.value ?? null;\n if (newThreadId !== current) {\n const prevThreadId = threadId.value;\n threadId.value = newThreadId ?? undefined;\n stream.clear();\n\n const removed = pendingRuns.removeAll();\n if (prevThreadId && removed.length > 0) {\n void Promise.all(\n removed.map((e) => client.runs.cancel(prevThreadId, e.id)),\n );\n }\n\n if (newThreadId != null) {\n options.onThreadId?.(newThreadId);\n }\n }\n },\n\n get subagents() {\n return stream.getSubagents();\n },\n get activeSubagents() {\n return stream.getActiveSubagents();\n },\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\n },\n getSubagentsByMessage(messageId: string) {\n return stream.getSubagentsByMessage(messageId);\n },\n };\n}\n\ntype ClassToolCallWithResult<T> =\n T extends _ToolCallWithResult<infer TC, unknown, unknown>\n ? _ToolCallWithResult<TC, CoreToolMessage, CoreAIMessage>\n : T;\n\n/**\n * Maps a stream interface to Vue-reactive types:\n * - `messages` becomes `ComputedRef<BaseMessage[]>`\n * - `getMessagesMetadata` accepts `BaseMessage`\n * - `toolCalls` uses `@langchain/core` message classes, wrapped in `Ref`\n * - `getToolCalls` accepts `CoreAIMessage`, returns class-based tool call results\n * - Functions remain unchanged\n * - All other properties are wrapped in `Ref<T>` to match Vue's reactivity\n */\ntype WithClassMessages<T> = {\n [K in keyof T]: K extends \"messages\"\n ? ComputedRef<BaseMessage[]>\n : K extends \"getMessagesMetadata\"\n ? (\n message: BaseMessage,\n index?: number,\n ) => MessageMetadata<Record<string, unknown>> | undefined\n : K extends \"toolCalls\"\n ? T[K] extends (infer TC)[]\n ? Ref<ClassToolCallWithResult<TC>[]>\n : Ref<T[K]>\n : K extends \"getToolCalls\"\n ? T[K] extends (message: infer _M) => (infer TC)[]\n ? (message: CoreAIMessage) => ClassToolCallWithResult<TC>[]\n : T[K]\n : T[K] extends (...args: infer A) => infer R\n ? (...args: A) => R\n : Ref<T[K]>;\n};\n\nexport function useStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: ResolveStreamOptions<T, InferBag<T, Bag>>,\n): WithClassMessages<ResolveStreamInterface<T, InferBag<T, Bag>>>;\n\nexport function useStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options: UseStreamCustomOptions<InferStateType<T>, InferBag<T, Bag>>,\n): WithClassMessages<ResolveStreamInterface<T, InferBag<T, Bag>>>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useStream(options: any): any {\n if (\"transport\" in options) {\n return useStreamCustom(options);\n }\n return useStreamLGP(options);\n}\n\nexport type {\n BaseStream,\n UseAgentStream,\n UseAgentStreamOptions,\n UseDeepAgentStream,\n UseDeepAgentStreamOptions,\n ResolveStreamInterface,\n ResolveStreamOptions,\n InferStateType,\n InferToolCalls,\n InferSubagentStates,\n InferNodeNames,\n InferBag,\n MessageMetadata,\n UseStreamOptions,\n UseStreamCustomOptions,\n UseStreamTransport,\n UseStreamThread,\n GetToolCallsType,\n AgentTypeConfigLike,\n IsAgentLike,\n ExtractAgentConfig,\n InferAgentToolCalls,\n SubagentToolCall,\n SubagentStatus,\n SubAgentLike,\n CompiledSubAgentLike,\n DeepAgentTypeConfigLike,\n IsDeepAgentLike,\n ExtractDeepAgentConfig,\n ExtractSubAgentMiddleware,\n InferDeepAgentSubagents,\n InferSubagentByName,\n InferSubagentState,\n InferSubagentNames,\n SubagentStateMap,\n DefaultSubagentStates,\n BaseSubagentState,\n QueueEntry,\n QueueInterface,\n} from \"@langchain/langgraph-sdk/ui\";\n\nexport type ToolCallWithResult<ToolCall = DefaultToolCall> =\n _ToolCallWithResult<ToolCall, CoreToolMessage, CoreAIMessage>;\nexport type {\n ToolCallState,\n DefaultToolCall,\n ToolCallFromTool,\n ToolCallsFromTools,\n} from \"@langchain/langgraph-sdk\";\n\nexport {\n SubagentManager,\n extractToolCallIdFromNamespace,\n calculateDepthFromNamespace,\n extractParentIdFromNamespace,\n isSubagentNamespace,\n} from \"@langchain/langgraph-sdk/ui\";\n"],"mappings":";;;;;;;AA6DA,SAAS,aACP,QACA,UACA,SACA;AACA,KAAI,SAAS,UAAU,MACrB,QAAO,OAAO,QAAQ,SAAoB,SAAS,CAAC,MAAM,UAAU;AAClE,MAAI,MAAM,cAAc,KAAM,QAAO,EAAE;AACvC,SAAO,CAAC,MAAM;GACd;CAGJ,MAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AACnE,QAAO,OAAO,QAAQ,WAAsB,UAAU,EAAE,OAAO,CAAC;;AAGlE,SAAS,aAQP,SAA2C;CAM3C,MAAM,4BAA4B;AAChC,MAAI,OAAO,WAAW,YAAa,QAAO;EAC1C,MAAM,UAAU,QAAQ;AACxB,MAAI,YAAY,KAAM,QAAO,OAAO;AACpC,MAAI,OAAO,YAAY,WAAY,QAAO,SAAS;AACnD,SAAO;KACL;CAEJ,MAAM,eAAe,UAAgC;EACnD,MAAM,cAAc,QAAQ,eAAe;AAC3C,SAAO,MAAM,QAAQ,MAAM,aAAa,GAAG,MAAM,eAAe,EAAE;;CAGpE,MAAM,eAAe,SAAoB,aAAmC;EAC1E,MAAM,cAAc,QAAQ,eAAe;AAC3C,SAAO;GAAE,GAAG;IAAU,cAAc;GAAU;;CAGhD,MAAM,eACJ,OAAO,QAAQ,sBAAsB,YACrC,QAAQ,qBAAqB,OACxB,QAAQ,kBAAkB,SAAS,QACnC,QAAQ,qBAAqB;CAEpC,MAAM,WAAW,IAAwB,OAAU;CAEnD,MAAM,SAAS,QAAQ,UAAU,IAAI,OAAO,EAAE,QAAQ,QAAQ,QAAQ,CAAC;CAEvE,MAAM,UAAU,WAAuC;EACrD,MAAM;EACN,OAAO;EACP,WAAW;EACX,QAAQ,YAAY;EACrB,CAAC;CAEF,eAAe,OACb,UAC+C;EAC/C,MAAM,MAAM,YAAY,SAAS;AACjC,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;GACF,MAAM,OAAO,MAAM,aAAwB,QAAQ,KAAK,EACtD,OAAO,cACR,CAAC;AACF,WAAQ,QAAQ;IACd;IACA,OAAO;IACP,WAAW;IACX;IACD;AACD,UAAO;WACA,KAAK;AACZ,WAAQ,QAAQ;IACd,GAAG,QAAQ;IACX,OAAO;IACP,WAAW;IACZ;AACD,WAAQ,UAAU,KAAK,OAAU;AACjC;;;AAIJ,SAAQ,QAAQ;EAAE,GAAG,QAAQ;EAAO;EAAQ;CAE5C,MAAM,SAAS,IAAY,GAAG;CAC9B,MAAM,gBAAgB,eACpB,iBAAiB,OAAO,OAAO,QAAQ,MAAM,QAAQ,OAAU,CAChE;CAED,MAAM,iBAAiB,IAAI,qBAAqB;CAChD,MAAM,SAAS,IAAI,cAA8B,gBAAgB;EAC/D,UAAU,QAAQ,YAAY;EAC9B,mBAAmB,QAAQ;EAC3B,wBAAwB,QAAQ;EAChC,WAAW;EACZ,CAAC;CAEF,MAAM,cAAc,IAAI,oBAGrB;CACH,MAAM,eAAe,WAAW,YAAY,QAAQ;CACpD,MAAM,YAAY,IAAI,YAAY,KAAK;CAEvC,MAAM,gBAAgB,eAElB,cAAc,MAAM,YAAY,UAChC,QAAQ,iBACP,EAAE,CACN;CAED,MAAM,eAAe,eAAe;EAClC,MAAM,QAAQ,cAAc,MAAM,YAAY,OAAO,GAAG,GAAG,EAAE;AAC7D,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI;GACF,MAAM,SAAS,KAAK,MAAM,MAAM;AAChC,OAAI,YAAY,kBAAkB,OAAO,CAAE,QAAO,IAAI,YAAY,OAAO;AACzE,UAAO;UACD;AAGR,SAAO;GACP;CAEF,MAAM,eAAe,WAA6B,OAAO,OAAO;CAChE,MAAM,cAAc,WAAoB,OAAO,MAAM;CACrD,MAAM,YAAY,WAAW,OAAO,UAAU;CAE9C,MAAM,SAAS,eAAe,aAAa,SAAS,cAAc,MAAM;CACxE,MAAM,QAAQ,eACN,YAAY,SAAS,aAAa,SAAS,QAAQ,MAAM,MAChE;CAED,MAAM,kBAAkB,eACtB,uBAAuB;EACrB,eAAe,QAAQ;EACvB,SAAS,QAAQ,MAAM;EACvB;EACA,eAAe,cAAc;EAC9B,CAAC,CACH;CAED,MAAM,cAAc,OAAO,gBAAgB;AACzC,eAAa,QAAQ,OAAO;AAC5B,cAAY,QAAQ,OAAO;AAC3B,YAAU,QAAQ,OAAO;GACzB;CAEF,MAAM,aAAa,YAAY,gBAAgB;AAC7C,eAAa,QAAQ,YAAY;AACjC,YAAU,QAAQ,YAAY;GAC9B;AAEF,mBAAkB;AAChB,eAAa;AACb,cAAY;GACZ;AAEF,aACQ;EACJ,MAAM,aAAa,YAAY,cAAc,MAAM;AACnD,SAAO;GACL,QACE,QAAQ,0BACR,CAAC,UAAU,SACX,CAAC,QAAQ,MAAM,aACf,WAAW,SAAS;GACtB,KAAK,WAAW;GACjB;KAEF,EAAE,aAAa;AACd,MAAI,QAAQ;GACV,MAAM,aAAa,YAAY,cAAc,MAAM;AACnD,UAAO,qBAAqB,YAAY,EAAE,iBAAiB,MAAM,CAAC;;IAGtE,EAAE,WAAW,MAAM,CACpB;CAED,SAAS,OAAO;AACd,SAAO,OAAO,KAAK,cAAc,OAAO,EACtC,SAAS,SAAS;AAChB,OAAI,sBAAsB,SAAS,OAAO;IACxC,MAAM,QAAQ,mBAAmB,QAC/B,aAAa,SAAS,QACvB;AACD,QAAI,MAAO,CAAK,OAAO,KAAK,OAAO,SAAS,OAAO,MAAM;AACzD,uBAAmB,WAAW,aAAa,SAAS,QAAQ;;AAG9D,WAAQ,SAAS,KAAK;KAEzB,CAAC;;CAGJ,SAAS,UAAU,OAAe;AAChC,SAAO,QAAQ;;CAGjB,eAAe,WACb,OACA,aACA,aAQA;AAEA,kBAAgB;AAChB,MAAI,CAAC,SAAS,MAAO;EAErB,MAAM,eAAgC;GACpC,WAAW,SAAS;GACpB,QAAQ;GACT;AAED,QAAM,OAAO,MACX,OAAO,WAAwB;GAC7B,MAAM,YAAY,OAAO,KAAK,WAAW,SAAS,OAAQ,OAAO;IAC/D;IACA;IACA,YAAY,aAAa;IAC1B,CAAC;AAIF,UAAO,aAAa,UAAU,OAC1B,aAAa,WAAW,YAAY,OAAO,GAC3C;KAEN;GACE;GACA;GAEA,eAAe,cAAc;GAC7B,WAAW;GACX,MAAM,YAAY;AAChB,wBAAoB,WAAW,aAAa,SAAS,QAAQ;IAE7D,MAAM,YADa,MAAM,OAAO,SAAS,MAAM,GAClB,GAAG,EAAE;AAClC,QAAI,SAAU,SAAQ,WAAW,UAAU,aAAa;;GAE1D,QAAQ,OAAO;AACb,YAAQ,UAAU,OAAO,aAAa;;GAEzC,CACF;;CAGH,SAAS,aACP,QACA,eACA;EACA,MAAM,uBAAuB,cAAc;EAE3C,MAAM,eAAe,eAAe,YAAY;AAChD,SAAO,QACL,gBAAgB,OACX,qBAAqB,mBAAmB,eAAe,UAAU,KAClE;EAEN,MAAM,wBACJ,iBAAiB,QAAQ,OAAO,iBAAiB;EAEnD,MAAM,gBAAgB,QAAQ,YAAY,QAAQ;EAElD,IAAI,aACF,eAAe,eACd,wBACG,qBAAqB,YAAY,aACjC,WACJ;AAEF,MAAI,eAAe,eAAe,KAAM,cAAa;AAGrD,MAAI,cAAc,KAAM,QAAO,WAAW;EAE1C,IAAI;EACJ,IAAI;EACJ,IAAI;AAEJ,SAAO,OAAO,MACZ,OAAO,WAAW;AAChB,oBAAiB,SAAS;AAC1B,OAAI,CAAC,gBAAgB;AAMnB,sBALe,MAAM,OAAO,QAAQ,OAAO;KACzC,UAAU,eAAe;KACzB,UAAU,eAAe;KAC1B,CAAC,EAEsB;AACxB,aAAS,QAAQ;AACjB,YAAQ,aAAa,eAAe;;GAGtC,MAAM,aAAa,OAAO;IACxB,GAAI,eAAe,cAAc,EAAE;IACnC;IACA;IACD,CAAC;AAEF,OAAI,QAAQ,iBAAiB,CAAC,WAAW,SAAS,UAAU,CAC1D,YAAW,KAAK,UAAU;AAC5B,OAAI,QAAQ,iBAAiB,CAAC,WAAW,SAAS,SAAS,CACzD,YAAW,KAAK,SAAS;AAC3B,OAAI,QAAQ,qBAAqB,CAAC,WAAW,SAAS,cAAc,CAClE,YAAW,KAAK,cAAc;AAChC,OAAI,QAAQ,eAAe,CAAC,WAAW,SAAS,QAAQ,CACtD,YAAW,KAAK,QAAQ;AAC1B,OACE,kBAAkB,WAClB,QAAQ,gBACR,CAAC,WAAW,SAAS,QAAQ,CAE7B,YAAW,KAAK,QAAQ;AAC1B,OACE,sBAAsB,WACtB,QAAQ,oBACR,CAAC,WAAW,SAAS,SAAS,CAE9B,YAAW,KAAK,SAAS;AAE3B,UAAO,sBAAsB;IAC3B,MAAM,OAAO;KAAE,GAAG,cAAc;KAAO,GAAG,OAAO;KAAQ;AAEzD,QAAI,eAAe,oBAAoB,KACrC,QAAO;KACL,GAAG;KACH,GAAI,OAAO,cAAc,qBAAqB,aAC1C,cAAc,iBAAiB,KAAK,GACpC,cAAc;KACnB;AAGH,WAAO,EAAE,GAAG,MAAM;KAClB;GAEF,MAAM,kBACJ,eAAe,mBAAmB,CAAC,CAAC;AAEtC,UAAO,OAAO,KAAK,OAAO,gBAAiB,QAAQ,aAAa;IAC9D,OAAO;IACP,QAAQ,eAAe;IACvB,SAAS,eAAe;IACxB,SAAS,eAAe;IAExB,iBAAiB,eAAe;IAChC,gBAAgB,eAAe;IAC/B,UAAU,eAAe;IACzB,mBAAmB,eAAe;IAClC,cAAc,eAAe;IAC7B,cACE,eAAe,iBACd,kBAAkB,aAAa;IAElC;IAEA;IACA;IACA,iBAAiB,eAAe;IAChC;IACA,YAAY,eAAe;IAC3B,aAAa,QAAQ;AACnB,oBAAe;MACb,QAAQ,OAAO;MACf,WAAW,OAAO,aAAa;MAChC;AAED,SAAI,oBAAoB;AACtB,kBAAY,aAAa;AACzB,yBAAmB,QAAQ,WAAW,aAAa,OAAO;;AAG5D,aAAQ,YAAY,aAAa;;IAEpC,CAAC;KAIJ;GACE;GACA;GAEA,eAAe,cAAc;GAC7B,WAAW;GAEX,MAAM,YAAY;AAChB,QAAI,UAAW,qBAAoB,WAAW,UAAU;AAExD,QAAI,iBAAiB,gBAAgB;KAEnC,MAAM,YADa,MAAM,OAAO,eAAe,GAClB,GAAG,EAAE;AAClC,SAAI,UAAU;AACZ,cAAQ,WAAW,UAAU,aAAa;AAC1C,aAAO;;;;GAKb,UAAU,UAAU,QAAQ,UAAU,OAAO,aAAa;GAC1D,gBAAgB;GACjB,CACF;;CAGH,MAAM,aAAa,IAAI,MAAM;AAE7B,cACS;EACL,SAAS,UAAU;EACnB,YAAY,WAAW;EACvB,MAAM,YAAY;EACnB,IACA,EAAE,SAAS,YAAY,GAAG,WAAW;AACpC,MAAI,CAAC,WAAW,CAAC,KAAK,OAAO,GAAG;GAC9B,MAAM,OAAO,YAAY,OAAO;AAChC,OAAI,MAAM;AACR,eAAW,QAAQ;AACnB,IAAK,WAAW,KAAK,GAAG,CAAC,cAAc;AACrC,gBAAW,QAAQ;MACnB;;;GAIT;CAED,eAAe,OACb,QACA,eACA;AACA,MAAI,OAAO,aAAa,WAAW,OAAO;AAKxC,OAHE,eAAe,sBAAsB,eACrC,eAAe,sBAAsB,YAEtB;AACf,eAAW,QAAQ;AACnB,QAAI;AACF,WAAM,aAAa,QAAQ,cAAc;cACjC;AACR,gBAAW,QAAQ;;AAErB;;GAGF,MAAM,iBAAiB,SAAS;AAChC,OAAI,gBAAgB;IAClB,MAAM,MAAM,MAAM,OAAO,KAAK,OAC5B,gBACA,QAAQ,aACR;KACE,OAAO;KACP,QAAQ,eAAe;KACvB,SAAS,eAAe;KACxB,SAAS,eAAe;KACxB,iBAAiB,eAAe;KAChC,gBAAgB,eAAe;KAC/B,UAAU,eAAe;KACzB,mBAAmB;KACnB,iBAAiB;KACjB,iBAAiB,eAAe;KAChC,YAAY,eAAe;KAC5B,CACF;AAED,gBAAY,IAAI;KACd,IAAI,IAAI;KACA;KACR,SAAS;KACT,WAAW,IAAI,KAAK,IAAI,WAAW;KACpC,CAAC;AACF;;;AAIJ,aAAW,QAAQ;EACnB,MAAM,SAAS,aAAa,QAAQ,cAAc;AAClD,EAAK,QAAQ,QAAQ,OAAO,CAAC,cAAc;AACzC,cAAW,QAAQ;IACnB;AACF,SAAO;;CAIT,IAAI,kBAAkB,CAAC,CAAC;AAExB,iBAAgB;AACd,MAAI,mBAAmB,sBAAsB,SAAS,OAAO;GAC3D,MAAM,QAAQ,mBAAmB,QAAQ,aAAa,SAAS,QAAQ;AACvE,OAAI,OAAO;AACT,sBAAkB;AAClB,IAAK,WAAW,MAAM;;;GAG1B;AAEF,aACQ,SAAS,aACT;AACJ,oBAAkB,CAAC,CAAC;GAEvB;CAED,MAAM,YAAY,eAChB,wBAAwB,YAAY,OAAO,MAAM,CAAC,CACnD;CAED,SAAS,aAAa,SAAkB;AAEtC,SADqB,wBAAwB,YAAY,OAAO,MAAM,CAAC,CACnD,QAAQ,OAAO,GAAG,UAAU,OAAO,QAAQ,GAAG;;CAGpE,MAAM,aAAa,eAA2C;EAC5D,MAAM,IAAI,OAAO;AACjB,MAAI,KAAK,QAAQ,mBAAmB,KAAK,MAAM,QAAQ,EAAE,cAAc,EAAE;GACvE,MAAM,kBAAkB,EAAE;AAC1B,OAAI,gBAAgB,WAAW,EAAG,QAAO,CAAC,EAAE,MAAM,cAAc,CAAC;AACjE,UAAO;;AAGT,MAAI,UAAU,MAAO,QAAO,EAAE;EAG9B,MAAM,iBADW,cAAc,MAAM,YAAY,SAAS,EAAE,EAC7B,SAAS,MAAM,EAAE,cAAc,EAAE,CAAC;AAEjE,MAAI,cAAc,SAAS,EACzB,QAAO;AAIT,MAAI,EADS,cAAc,MAAM,YAAY,QAAQ,EAAE,EAC7C,UAAU,MAAM,SAAS,KAAM,QAAO,EAAE;AAClD,SAAO,CAAC,EAAE,MAAM,cAAc,CAAC;GAC/B;CAEF,MAAM,cAAc,eAAe;AACjC,MAAI,iBAAiB,MACnB,OAAM,IAAI,MACR,6DACD;AAEH,SAAO,cAAc,MAAM;GAC3B;CAEF,MAAM,kBAAkB,eAChB,QAAQ,MAAM,aAAa,QAAQ,MAAM,QAAQ,KACxD;CAED,MAAM,yBAAyB,eAAe;AAC5C,MAAI,iBAAiB,MACnB,OAAM,IAAI,MACR,6EACD;AAEH,SAAO,cAAc,MAAM;GAC3B;AAEF,QAAO;EACL,aAAa,QAAQ;EACrB;EAEA;EACA;EACA;EAEA;EACA;EAEA,UAAU,eACR,YAAY,aAAa,SAAS,cAAc,MAAM,CACvD;EAED;EACA;EAEA,WAAW,eACT,kBAAiC,aAAa,OAAO;GACnD,WAAW,UAAU;GACrB,aAAa,cAAc,MAAM;GACjC,OAAO,YAAY;GACpB,CAAC,CACH;EAED;EACA,SAAS;EACT;EACA,yBAAyB;EAEzB,sBACE,SACA,UAC2C;GAC3C,MAAM,iBAAiB,eAAe,IAAI,QAAQ,GAAG,EAAE;GACvD,MAAM,kBAAkB,gBAAgB,OAAO,MAC5C,MAAM,EAAE,eAAe,QAAQ,MAAM,OACvC;AAED,OAAI,kBAAkB,QAAQ,mBAAmB,KAC/C,QAAO;IACL,GAAG;IACH;IACD;;EAML;EACA;EACA;EAEA,OAAO;GACL,SAAS;GACT,MAAM;GACN,MAAM,OAAO,IAAY;IACvB,MAAM,MAAM,SAAS;IACrB,MAAM,UAAU,YAAY,OAAO,GAAG;AACtC,QAAI,WAAW,IACb,OAAM,OAAO,KAAK,OAAO,KAAK,GAAG;AAEnC,WAAO;;GAET,MAAM,QAAQ;IACZ,MAAM,MAAM,SAAS;IACrB,MAAM,UAAU,YAAY,WAAW;AACvC,QAAI,OAAO,QAAQ,SAAS,EAC1B,OAAM,QAAQ,IACZ,QAAQ,KAAK,MAAM,OAAO,KAAK,OAAO,KAAK,EAAE,GAAG,CAAC,CAClD;;GAGN;EAED,aAAa,aAA4B;AAEvC,OAAI,iBADY,SAAS,SAAS,OACL;IAC3B,MAAM,eAAe,SAAS;AAC9B,aAAS,QAAQ,eAAe;AAChC,WAAO,OAAO;IAEd,MAAM,UAAU,YAAY,WAAW;AACvC,QAAI,gBAAgB,QAAQ,SAAS,EACnC,CAAK,QAAQ,IACX,QAAQ,KAAK,MAAM,OAAO,KAAK,OAAO,cAAc,EAAE,GAAG,CAAC,CAC3D;AAGH,QAAI,eAAe,KACjB,SAAQ,aAAa,YAAY;;;EAKvC,IAAI,YAAY;AACd,UAAO,OAAO,cAAc;;EAE9B,IAAI,kBAAkB;AACpB,UAAO,OAAO,oBAAoB;;EAEpC,YAAY,YAAoB;AAC9B,UAAO,OAAO,YAAY,WAAW;;EAEvC,mBAAmB,MAAc;AAC/B,UAAO,OAAO,mBAAmB,KAAK;;EAExC,sBAAsB,WAAmB;AACvC,UAAO,OAAO,sBAAsB,UAAU;;EAEjD;;AAqDH,SAAgB,UAAU,SAAmB;AAC3C,KAAI,eAAe,QACjB,QAAO,gBAAgB,QAAQ;AAEjC,QAAO,aAAa,QAAQ"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
let vue = require("vue");
|
|
2
|
+
let _langchain_langgraph_sdk_ui = require("@langchain/langgraph-sdk/ui");
|
|
3
|
+
let _langchain_langgraph_sdk_utils = require("@langchain/langgraph-sdk/utils");
|
|
4
|
+
|
|
5
|
+
//#region src/stream.custom.ts
|
|
6
|
+
function useStreamCustom(options) {
|
|
7
|
+
const stream = new _langchain_langgraph_sdk_ui.StreamManager(new _langchain_langgraph_sdk_ui.MessageTupleManager(), {
|
|
8
|
+
throttle: options.throttle ?? false,
|
|
9
|
+
subagentToolNames: options.subagentToolNames,
|
|
10
|
+
filterSubagentMessages: options.filterSubagentMessages,
|
|
11
|
+
toMessage: _langchain_langgraph_sdk_ui.toMessageClass
|
|
12
|
+
});
|
|
13
|
+
const streamValues = (0, vue.shallowRef)(stream.values);
|
|
14
|
+
const streamError = (0, vue.shallowRef)(stream.error);
|
|
15
|
+
const isLoading = (0, vue.shallowRef)(stream.isLoading);
|
|
16
|
+
const unsubscribe = stream.subscribe(() => {
|
|
17
|
+
streamValues.value = stream.values;
|
|
18
|
+
streamError.value = stream.error;
|
|
19
|
+
isLoading.value = stream.isLoading;
|
|
20
|
+
});
|
|
21
|
+
(0, vue.onUnmounted)(() => {
|
|
22
|
+
unsubscribe();
|
|
23
|
+
});
|
|
24
|
+
let threadId = options.threadId ?? null;
|
|
25
|
+
(0, vue.watch)(() => options.threadId, (newId) => {
|
|
26
|
+
const resolved = newId ?? null;
|
|
27
|
+
if (resolved !== threadId) {
|
|
28
|
+
threadId = resolved;
|
|
29
|
+
stream.clear();
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
const getMessages = (value) => {
|
|
33
|
+
const messagesKey = options.messagesKey ?? "messages";
|
|
34
|
+
return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
|
|
35
|
+
};
|
|
36
|
+
const setMessages = (current, messages) => {
|
|
37
|
+
const messagesKey = options.messagesKey ?? "messages";
|
|
38
|
+
return {
|
|
39
|
+
...current,
|
|
40
|
+
[messagesKey]: messages
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
const historyValues = options.initialValues ?? {};
|
|
44
|
+
const historyMessages = getMessages(historyValues);
|
|
45
|
+
options.filterSubagentMessages && !stream.isLoading && historyMessages.length;
|
|
46
|
+
(0, vue.watch)(() => ({
|
|
47
|
+
should: options.filterSubagentMessages && !isLoading.value && getMessages(historyValues).length > 0,
|
|
48
|
+
len: getMessages(historyValues).length
|
|
49
|
+
}), ({ should }) => {
|
|
50
|
+
if (should) stream.reconstructSubagents(getMessages(historyValues), { skipIfPopulated: true });
|
|
51
|
+
}, { immediate: true });
|
|
52
|
+
function switchThread(newThreadId) {
|
|
53
|
+
if (newThreadId !== threadId) {
|
|
54
|
+
threadId = newThreadId;
|
|
55
|
+
stream.clear();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function stop() {
|
|
59
|
+
return stream.stop(historyValues, { onStop: options.onStop });
|
|
60
|
+
}
|
|
61
|
+
async function submitDirect(values, submitOptions) {
|
|
62
|
+
const currentThreadId = options.threadId ?? null;
|
|
63
|
+
if (currentThreadId !== threadId) {
|
|
64
|
+
threadId = currentThreadId;
|
|
65
|
+
stream.clear();
|
|
66
|
+
}
|
|
67
|
+
stream.setStreamValues(() => {
|
|
68
|
+
if (submitOptions?.optimisticValues != null) return {
|
|
69
|
+
...historyValues,
|
|
70
|
+
...typeof submitOptions.optimisticValues === "function" ? submitOptions.optimisticValues(historyValues) : submitOptions.optimisticValues
|
|
71
|
+
};
|
|
72
|
+
return { ...historyValues };
|
|
73
|
+
});
|
|
74
|
+
await stream.start(async (signal) => {
|
|
75
|
+
if (!threadId) {
|
|
76
|
+
threadId = crypto.randomUUID();
|
|
77
|
+
options.onThreadId?.(threadId);
|
|
78
|
+
}
|
|
79
|
+
if (!threadId) throw new Error("Failed to obtain valid thread ID.");
|
|
80
|
+
return options.transport.stream({
|
|
81
|
+
input: values,
|
|
82
|
+
context: submitOptions?.context,
|
|
83
|
+
command: submitOptions?.command,
|
|
84
|
+
signal,
|
|
85
|
+
config: {
|
|
86
|
+
...submitOptions?.config,
|
|
87
|
+
configurable: {
|
|
88
|
+
thread_id: threadId,
|
|
89
|
+
...submitOptions?.config?.configurable
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}, {
|
|
94
|
+
getMessages,
|
|
95
|
+
setMessages,
|
|
96
|
+
initialValues: {},
|
|
97
|
+
callbacks: options,
|
|
98
|
+
onSuccess: () => void 0,
|
|
99
|
+
onError(error) {
|
|
100
|
+
options.onError?.(error, void 0);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async function submit(values, submitOptions) {
|
|
105
|
+
await submitDirect(values, submitOptions);
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
get values() {
|
|
109
|
+
return streamValues.value ?? {};
|
|
110
|
+
},
|
|
111
|
+
error: streamError,
|
|
112
|
+
isLoading,
|
|
113
|
+
stop,
|
|
114
|
+
submit,
|
|
115
|
+
switchThread,
|
|
116
|
+
queue: {
|
|
117
|
+
entries: [],
|
|
118
|
+
size: 0,
|
|
119
|
+
async cancel() {
|
|
120
|
+
return false;
|
|
121
|
+
},
|
|
122
|
+
async clear() {}
|
|
123
|
+
},
|
|
124
|
+
get interrupts() {
|
|
125
|
+
if (streamValues.value != null && "__interrupt__" in streamValues.value && Array.isArray(streamValues.value.__interrupt__)) {
|
|
126
|
+
const valueInterrupts = streamValues.value.__interrupt__;
|
|
127
|
+
if (valueInterrupts.length === 0) return [{ when: "breakpoint" }];
|
|
128
|
+
return valueInterrupts;
|
|
129
|
+
}
|
|
130
|
+
return [];
|
|
131
|
+
},
|
|
132
|
+
get interrupt() {
|
|
133
|
+
return (0, _langchain_langgraph_sdk_ui.extractInterrupts)(streamValues.value);
|
|
134
|
+
},
|
|
135
|
+
get messages() {
|
|
136
|
+
if (!streamValues.value) return [];
|
|
137
|
+
return getMessages(streamValues.value);
|
|
138
|
+
},
|
|
139
|
+
get toolCalls() {
|
|
140
|
+
if (!streamValues.value) return [];
|
|
141
|
+
return (0, _langchain_langgraph_sdk_utils.getToolCallsWithResults)(getMessages(streamValues.value));
|
|
142
|
+
},
|
|
143
|
+
getToolCalls(message) {
|
|
144
|
+
if (!streamValues.value) return [];
|
|
145
|
+
return (0, _langchain_langgraph_sdk_utils.getToolCallsWithResults)(getMessages(streamValues.value)).filter((tc) => tc.aiMessage.id === message.id);
|
|
146
|
+
},
|
|
147
|
+
get subagents() {
|
|
148
|
+
return stream.getSubagents();
|
|
149
|
+
},
|
|
150
|
+
get activeSubagents() {
|
|
151
|
+
return stream.getActiveSubagents();
|
|
152
|
+
},
|
|
153
|
+
getSubagent(toolCallId) {
|
|
154
|
+
return stream.getSubagent(toolCallId);
|
|
155
|
+
},
|
|
156
|
+
getSubagentsByType(type) {
|
|
157
|
+
return stream.getSubagentsByType(type);
|
|
158
|
+
},
|
|
159
|
+
getSubagentsByMessage(messageId) {
|
|
160
|
+
return stream.getSubagentsByMessage(messageId);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
//#endregion
|
|
166
|
+
exports.useStreamCustom = useStreamCustom;
|
|
167
|
+
//# sourceMappingURL=stream.custom.cjs.map
|