@langchain/svelte 0.0.1 → 0.1.0
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 +56 -6
- package/dist/index.cjs +45 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -12
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +26 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -32
- package/dist/index.js.map +1 -1
- package/dist/stream.custom.cjs +25 -8
- package/dist/stream.custom.cjs.map +1 -1
- package/dist/stream.custom.js +26 -9
- package/dist/stream.custom.js.map +1 -1
- package/package.json +23 -22
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useStreamCustom } from "./stream.custom.js";
|
|
2
2
|
import { derived, get, writable } from "svelte/store";
|
|
3
3
|
import { onDestroy, onMount } from "svelte";
|
|
4
|
-
import { FetchStreamTransport, MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, SubagentManager, calculateDepthFromNamespace, extractInterrupts, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterStream, getBranchContext, getMessagesMetadataMap, isSubagentNamespace, toMessageClass } from "@langchain/langgraph-sdk/ui";
|
|
4
|
+
import { FetchStreamTransport, MessageTupleManager, PendingRunsTracker, StreamError, StreamManager, SubagentManager, calculateDepthFromNamespace, ensureMessageInstances, extractInterrupts, extractParentIdFromNamespace, extractToolCallIdFromNamespace, filterStream, getBranchContext, getMessagesMetadataMap, isSubagentNamespace, toMessageClass } from "@langchain/langgraph-sdk/ui";
|
|
5
5
|
import { Client } from "@langchain/langgraph-sdk";
|
|
6
6
|
import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
|
|
7
7
|
|
|
@@ -39,6 +39,7 @@ function useStreamLGP(options) {
|
|
|
39
39
|
};
|
|
40
40
|
const historyLimit = typeof options.fetchStateHistory === "object" && options.fetchStateHistory != null ? options.fetchStateHistory.limit ?? false : options.fetchStateHistory ?? false;
|
|
41
41
|
const threadId = writable(void 0);
|
|
42
|
+
let threadIdPromise = null;
|
|
42
43
|
const client = options.client ?? new Client({ apiUrl: options.apiUrl });
|
|
43
44
|
const history = writable({
|
|
44
45
|
data: void 0,
|
|
@@ -110,10 +111,12 @@ function useStreamLGP(options) {
|
|
|
110
111
|
getMessages,
|
|
111
112
|
branchContext: $branchContext
|
|
112
113
|
}));
|
|
114
|
+
const subagentVersion = writable(0);
|
|
113
115
|
const unsubscribe = stream.subscribe(() => {
|
|
114
116
|
streamValues.set(stream.values);
|
|
115
117
|
streamError.set(stream.error);
|
|
116
118
|
isLoading.set(stream.isLoading);
|
|
119
|
+
subagentVersion.update((v) => v + 1);
|
|
117
120
|
});
|
|
118
121
|
const unsubQueue = pendingRuns.subscribe(() => {
|
|
119
122
|
queueEntries.set(pendingRuns.entries);
|
|
@@ -163,16 +166,19 @@ function useStreamLGP(options) {
|
|
|
163
166
|
return stream.start(async (signal) => {
|
|
164
167
|
usableThreadId = get(threadId);
|
|
165
168
|
if (!usableThreadId) {
|
|
166
|
-
|
|
169
|
+
const threadPromise = client.threads.create({
|
|
167
170
|
threadId: submitOptions?.threadId,
|
|
168
171
|
metadata: submitOptions?.metadata
|
|
169
|
-
})
|
|
172
|
+
});
|
|
173
|
+
threadIdPromise = threadPromise.then((t) => t.thread_id);
|
|
174
|
+
usableThreadId = (await threadPromise).thread_id;
|
|
170
175
|
threadId.set(usableThreadId);
|
|
171
176
|
options.onThreadId?.(usableThreadId);
|
|
172
177
|
}
|
|
173
178
|
const streamMode = [
|
|
174
179
|
"values",
|
|
175
180
|
"messages-tuple",
|
|
181
|
+
"updates",
|
|
176
182
|
...submitOptions?.streamMode ?? []
|
|
177
183
|
];
|
|
178
184
|
if (options.onUpdateEvent && !streamMode.includes("updates")) streamMode.push("updates");
|
|
@@ -239,21 +245,26 @@ function useStreamLGP(options) {
|
|
|
239
245
|
},
|
|
240
246
|
onError(error) {
|
|
241
247
|
options.onError?.(error, callbackMeta);
|
|
248
|
+
submitOptions?.onError?.(error, callbackMeta);
|
|
242
249
|
},
|
|
243
250
|
onFinish: () => {}
|
|
244
251
|
});
|
|
245
252
|
}
|
|
246
253
|
let submitting = false;
|
|
247
|
-
|
|
248
|
-
if (
|
|
254
|
+
function drainQueue() {
|
|
255
|
+
if (!get(isLoading) && !submitting && pendingRuns.size > 0) {
|
|
249
256
|
const next = pendingRuns.shift();
|
|
250
257
|
if (next) {
|
|
251
258
|
submitting = true;
|
|
252
259
|
joinStream(next.id).finally(() => {
|
|
253
260
|
submitting = false;
|
|
261
|
+
drainQueue();
|
|
254
262
|
});
|
|
255
263
|
}
|
|
256
264
|
}
|
|
265
|
+
}
|
|
266
|
+
isLoading.subscribe(() => {
|
|
267
|
+
drainQueue();
|
|
257
268
|
});
|
|
258
269
|
async function submit(values, submitOptions) {
|
|
259
270
|
if (stream.isLoading || submitting) {
|
|
@@ -266,27 +277,33 @@ function useStreamLGP(options) {
|
|
|
266
277
|
}
|
|
267
278
|
return;
|
|
268
279
|
}
|
|
269
|
-
|
|
280
|
+
let usableThreadId = get(threadId);
|
|
281
|
+
if (!usableThreadId && threadIdPromise) usableThreadId = await threadIdPromise;
|
|
270
282
|
if (usableThreadId) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
283
|
+
try {
|
|
284
|
+
const run = await client.runs.create(usableThreadId, options.assistantId, {
|
|
285
|
+
input: values,
|
|
286
|
+
config: submitOptions?.config,
|
|
287
|
+
context: submitOptions?.context,
|
|
288
|
+
command: submitOptions?.command,
|
|
289
|
+
interruptBefore: submitOptions?.interruptBefore,
|
|
290
|
+
interruptAfter: submitOptions?.interruptAfter,
|
|
291
|
+
metadata: submitOptions?.metadata,
|
|
292
|
+
multitaskStrategy: "enqueue",
|
|
293
|
+
streamResumable: true,
|
|
294
|
+
streamSubgraphs: submitOptions?.streamSubgraphs,
|
|
295
|
+
durability: submitOptions?.durability
|
|
296
|
+
});
|
|
297
|
+
pendingRuns.add({
|
|
298
|
+
id: run.run_id,
|
|
299
|
+
values,
|
|
300
|
+
options: submitOptions,
|
|
301
|
+
createdAt: new Date(run.created_at)
|
|
302
|
+
});
|
|
303
|
+
} catch (error) {
|
|
304
|
+
options.onError?.(error, void 0);
|
|
305
|
+
submitOptions?.onError?.(error, void 0);
|
|
306
|
+
}
|
|
290
307
|
return;
|
|
291
308
|
}
|
|
292
309
|
}
|
|
@@ -294,6 +311,7 @@ function useStreamLGP(options) {
|
|
|
294
311
|
const result = submitDirect(values, submitOptions);
|
|
295
312
|
Promise.resolve(result).finally(() => {
|
|
296
313
|
submitting = false;
|
|
314
|
+
drainQueue();
|
|
297
315
|
});
|
|
298
316
|
return result;
|
|
299
317
|
}
|
|
@@ -339,7 +357,7 @@ function useStreamLGP(options) {
|
|
|
339
357
|
}
|
|
340
358
|
}
|
|
341
359
|
});
|
|
342
|
-
const messages = derived([streamValues, historyValues], ([$streamValues, $historyValues]) => getMessages($streamValues ?? $historyValues));
|
|
360
|
+
const messages = derived([streamValues, historyValues], ([$streamValues, $historyValues]) => ensureMessageInstances(getMessages($streamValues ?? $historyValues)));
|
|
343
361
|
const interrupt = derived([
|
|
344
362
|
streamValues,
|
|
345
363
|
streamError,
|
|
@@ -436,12 +454,8 @@ function useStreamLGP(options) {
|
|
|
436
454
|
if (newThreadId != null) options.onThreadId?.(newThreadId);
|
|
437
455
|
}
|
|
438
456
|
},
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
},
|
|
442
|
-
get activeSubagents() {
|
|
443
|
-
return stream.getActiveSubagents();
|
|
444
|
-
},
|
|
457
|
+
subagents: derived(subagentVersion, () => stream.getSubagents()),
|
|
458
|
+
activeSubagents: derived(subagentVersion, () => stream.getActiveSubagents()),
|
|
445
459
|
getSubagent(toolCallId) {
|
|
446
460
|
return stream.getSubagent(toolCallId);
|
|
447
461
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy, onMount } from \"svelte\";\n\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 getBranchContext,\n getMessagesMetadataMap,\n StreamError,\n extractInterrupts,\n filterStream,\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 {\n Client,\n type BagTemplate,\n type StreamMode,\n type StreamEvent,\n type Message,\n type ThreadState,\n type ToolCallWithResult as _ToolCallWithResult,\n type DefaultToolCall,\n} from \"@langchain/langgraph-sdk\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\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\ntype ClassToolCallWithResult<T> =\n T extends _ToolCallWithResult<infer TC, unknown, unknown>\n ? _ToolCallWithResult<TC, CoreToolMessage, CoreAIMessage>\n : T;\n\ntype WithClassMessages<T> = Omit<\n T,\n \"messages\" | \"getMessagesMetadata\" | \"toolCalls\" | \"getToolCalls\"\n> & {\n messages: BaseMessage[];\n getMessagesMetadata: (\n message: BaseMessage,\n index?: number,\n ) => MessageMetadata<Record<string, unknown>> | undefined;\n} & (\"toolCalls\" extends keyof T\n ? {\n toolCalls: T extends { toolCalls: (infer TC)[] }\n ? ClassToolCallWithResult<TC>[]\n : never;\n }\n : unknown) &\n (\"getToolCalls\" extends keyof T\n ? {\n getToolCalls: T extends {\n getToolCalls: (message: infer _M) => (infer TC)[];\n }\n ? (message: CoreAIMessage) => ClassToolCallWithResult<TC>[]\n : never;\n }\n : unknown);\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\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 = writable<string | undefined>(undefined);\n\n const client = options.client ?? new Client({ apiUrl: options.apiUrl });\n\n const history = writable<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 ?? get(threadId);\n if (!tid) return undefined;\n try {\n const data = await fetchHistory<StateType>(client, tid, {\n limit: historyLimit,\n });\n history.set({\n data,\n error: undefined,\n isLoading: false,\n mutate,\n });\n return data;\n } catch (err) {\n history.update((prev) => ({\n ...prev,\n error: err,\n isLoading: false,\n }));\n options.onError?.(err, undefined);\n return undefined;\n }\n }\n\n history.update((prev) => ({ ...prev, mutate }));\n\n const branch = writable<string>(\"\");\n const branchContext = derived([branch, history], ([$branch, $history]) =>\n getBranchContext($branch, $history.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\n const historyValues = derived(\n [branchContext],\n ([$branchContext]) =>\n $branchContext.threadHead?.values ??\n options.initialValues ??\n ({} as StateType),\n );\n\n const historyError = derived([branchContext], ([$branchContext]) => {\n const error = $branchContext.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 = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const queueEntries = writable(pendingRuns.entries);\n const queueSize = writable(pendingRuns.size);\n\n const values = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) => $streamValues ?? $historyValues,\n );\n\n const error = derived(\n [streamError, historyError, history],\n ([$streamError, $historyError, $history]) =>\n $streamError ?? $historyError ?? $history.error,\n );\n\n const messageMetadata = derived(\n [history, branchContext],\n ([$history, $branchContext]) =>\n getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: $history.data,\n getMessages,\n branchContext: $branchContext,\n }),\n );\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n });\n\n const unsubQueue = pendingRuns.subscribe(() => {\n queueEntries.set(pendingRuns.entries);\n queueSize.set(pendingRuns.size);\n });\n\n const shouldReconstructSubagents = derived(\n [isLoading, history],\n ([$isLoading, $history]) => {\n if (!options.filterSubagentMessages) return false;\n if ($isLoading || $history.isLoading) return false;\n const hvMessages = getMessages(get(historyValues));\n return hvMessages.length > 0;\n },\n );\n\n const unsubReconstruct = shouldReconstructSubagents.subscribe(($should) => {\n if ($should) {\n const hvMessages = getMessages(get(historyValues));\n stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });\n }\n });\n\n onDestroy(() => {\n unsubscribe();\n unsubReconstruct();\n unsubQueue();\n });\n\n function stop() {\n return stream.stop(get(historyValues), {\n onStop: (args) => {\n const tid = get(threadId);\n if (runMetadataStorage && tid) {\n const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);\n if (runId) void client.runs.cancel(tid, runId);\n runMetadataStorage.removeItem(`lg:stream:${tid}`);\n }\n\n options.onStop?.(args);\n },\n });\n }\n\n function setBranch(value: string) {\n branch.set(value);\n }\n\n function submitDirect(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentBranchContext = get(branchContext);\n\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n branch.set(\n checkpointId != null\n ? (currentBranchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\n : \"\",\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 = get(threadId);\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.set(usableThreadId);\n options.onThreadId?.(usableThreadId);\n }\n\n const streamMode: StreamMode[] = [\n \"values\",\n \"messages-tuple\",\n ...(submitOptions?.streamMode ?? []),\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 = { ...get(historyValues), ...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: get(historyValues),\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) {\n options.onError?.(error, callbackMeta);\n },\n onFinish: () => {},\n },\n );\n }\n\n let submitting = false;\n\n isLoading.subscribe(($isLoading) => {\n if (!$isLoading && !submitting && pendingRuns.size > 0) {\n const next = pendingRuns.shift();\n if (next) {\n submitting = true;\n void joinStream(next.id).finally(() => {\n submitting = false;\n });\n }\n }\n });\n\n async function submit(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n if (stream.isLoading || submitting) {\n const shouldAbort =\n submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\";\n\n if (shouldAbort) {\n submitting = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submitting = false;\n }\n return;\n }\n\n const usableThreadId = get(threadId);\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 = true;\n const result = submitDirect(values, submitOptions);\n void Promise.resolve(result).finally(() => {\n submitting = false;\n });\n return result;\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 const tid = get(threadId);\n if (!tid) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: tid,\n run_id: runId,\n };\n\n await stream.start(\n async (signal: AbortSignal) => {\n const rawStream = client.runs.joinStream(tid, 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: get(historyValues),\n callbacks: options,\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${tid}`);\n const newHistory = await mutate(tid);\n const lastHead = newHistory?.at(0);\n if (lastHead) options.onFinish?.(lastHead, callbackMeta);\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n onFinish: () => {},\n },\n );\n }\n\n let shouldReconnect = !!runMetadataStorage;\n\n onMount(() => {\n const tid = get(threadId);\n if (shouldReconnect && runMetadataStorage && tid) {\n const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);\n if (runId) {\n shouldReconnect = false;\n void joinStream(runId);\n }\n }\n });\n\n const messages = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) =>\n getMessages($streamValues ?? $historyValues),\n );\n\n const interrupt = derived(\n [streamValues, streamError, branchContext, isLoading],\n ([$streamValues, $streamError, $branchContext, $isLoading]) => {\n return extractInterrupts<InterruptType>($streamValues, {\n isLoading: $isLoading,\n threadState: $branchContext.threadHead,\n error: $streamError,\n });\n },\n );\n\n const interrupts = derived(\n [streamValues, streamError, branchContext, isLoading],\n ([$streamValues, $streamError, $branchContext, $isLoading]) => {\n const vals = $streamValues ?? get(historyValues);\n if (\n vals != null &&\n \"__interrupt__\" in vals &&\n Array.isArray(vals.__interrupt__)\n ) {\n const valueInterrupts = vals.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n if ($isLoading) return [];\n\n const allTasks = $branchContext.threadHead?.tasks ?? [];\n const allInterrupts = allTasks.flatMap((t) => t.interrupts ?? []);\n if (allInterrupts.length > 0) return allInterrupts;\n\n const next = $branchContext.threadHead?.next ?? [];\n if (!next.length || $streamError != null) return [];\n return [{ when: \"breakpoint\" }];\n },\n );\n\n const toolCalls = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) =>\n getToolCallsWithResults(getMessages($streamValues ?? $historyValues)),\n );\n\n function getToolCalls(message: Message) {\n const currentValues = get(streamValues) ?? get(historyValues);\n const allToolCalls = getToolCallsWithResults(getMessages(currentValues));\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n const historyList = derived([branchContext], ([$branchContext]) => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\",\n );\n }\n return $branchContext.flatHistory;\n });\n\n const isThreadLoading = derived(\n [history],\n ([$history]) => $history.isLoading && $history.data == null,\n );\n\n const experimentalBranchTree = derived(\n [branchContext],\n ([$branchContext]) => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `experimental_branchTree`\",\n );\n }\n return $branchContext.branchTree;\n },\n );\n\n function getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = get(messageMetadata)?.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 return {\n assistantId: options.assistantId,\n client,\n\n values,\n error,\n isLoading,\n isThreadLoading,\n\n branch,\n setBranch,\n\n messages,\n toolCalls,\n getToolCalls,\n\n interrupt,\n interrupts,\n\n history: historyList,\n experimental_branchTree: experimentalBranchTree,\n\n getMessagesMetadata,\n\n submit,\n stop,\n joinStream,\n\n queue: {\n entries: queueEntries,\n size: queueSize,\n async cancel(id: string) {\n const tid = get(threadId);\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 = get(threadId);\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 = get(threadId) ?? null;\n if (newThreadId !== current) {\n const prevThreadId = get(threadId);\n threadId.set(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\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":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport type { Readable } from \"svelte/store\";\nimport { onDestroy, onMount } from \"svelte\";\n\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 getBranchContext,\n getMessagesMetadataMap,\n StreamError,\n extractInterrupts,\n filterStream,\n FetchStreamTransport,\n toMessageClass,\n ensureMessageInstances,\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 AcceptBaseMessages,\n type UseStreamCustomOptions,\n type SubagentStreamInterface,\n} from \"@langchain/langgraph-sdk/ui\";\nimport {\n Client,\n type BagTemplate,\n type StreamMode,\n type StreamEvent,\n type Message,\n type ThreadState,\n type ToolCallWithResult as _ToolCallWithResult,\n type DefaultToolCall,\n} from \"@langchain/langgraph-sdk\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\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\ntype ClassToolCallWithResult<T> =\n T extends _ToolCallWithResult<infer TC, unknown, unknown>\n ? _ToolCallWithResult<TC, CoreToolMessage, CoreAIMessage>\n : T;\n\nexport type ClassSubagentStreamInterface<\n StateType = Record<string, unknown>,\n ToolCall = DefaultToolCall,\n SubagentName extends string = string,\n> = Omit<\n SubagentStreamInterface<StateType, ToolCall, SubagentName>,\n \"messages\"\n> & {\n messages: BaseMessage[];\n};\n\n/**\n * Maps a stream interface to Svelte-reactive types:\n * - `messages` becomes `Readable<BaseMessage[]>`\n * - `getMessagesMetadata` accepts `BaseMessage`\n * - `toolCalls` uses `@langchain/core` message classes, wrapped in `Readable`\n * - `getToolCalls` accepts `CoreAIMessage`, returns class-based tool call results\n * - `queue` properties are individually mapped (stores → `Readable`, functions unchanged)\n * - `client`, `assistantId`, `subagents`, `activeSubagents` remain unwrapped\n * - Functions remain unchanged\n * - All other properties are wrapped in `Readable<T>` to match Svelte's store system\n */\ntype WithClassMessages<T> = {\n [K in keyof T as K extends\n | \"getSubagent\"\n | \"getSubagentsByType\"\n | \"getSubagentsByMessage\"\n ? never\n : K]: K extends \"messages\"\n ? Readable<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 ? Readable<ClassToolCallWithResult<TC>[]>\n : Readable<T[K]>\n : K extends \"getToolCalls\"\n ? T[K] extends (message: infer _M) => (infer TC)[]\n ? (message: CoreAIMessage) => ClassToolCallWithResult<TC>[]\n : T[K]\n : K extends \"queue\"\n ? {\n [QK in keyof T[K]]: T[K][QK] extends (\n ...args: infer A\n ) => infer R\n ? (...args: A) => R\n : Readable<T[K][QK]>;\n }\n : K extends \"client\" | \"assistantId\"\n ? T[K]\n : K extends \"subagents\"\n ? T[K] extends Map<\n string,\n SubagentStreamInterface<infer S, infer TC, infer N>\n >\n ? Map<string, ClassSubagentStreamInterface<S, TC, N>>\n : T[K]\n : K extends \"activeSubagents\"\n ? T[K] extends SubagentStreamInterface<\n infer S,\n infer TC,\n infer N\n >[]\n ? ClassSubagentStreamInterface<S, TC, N>[]\n : T[K]\n : K extends \"submit\"\n ? T[K] extends (\n values: infer V,\n options?: infer O,\n ) => infer Ret\n ? (\n values:\n | AcceptBaseMessages<Exclude<V, null | undefined>>\n | null\n | undefined,\n options?: O,\n ) => Ret\n : T[K]\n : T[K] extends (...args: infer A) => infer R\n ? (...args: A) => R\n : Readable<T[K]>;\n} & (\"subagents\" extends keyof T\n ? {\n getSubagent: T extends {\n getSubagent: (\n id: string,\n ) => SubagentStreamInterface<infer S, infer TC, infer N> | undefined;\n }\n ? (\n toolCallId: string,\n ) => ClassSubagentStreamInterface<S, TC, N> | undefined\n : never;\n getSubagentsByType: T extends {\n getSubagentsByType: (\n type: string,\n ) => SubagentStreamInterface<infer S, infer TC, infer N>[];\n }\n ? (type: string) => ClassSubagentStreamInterface<S, TC, N>[]\n : never;\n getSubagentsByMessage: T extends {\n getSubagentsByMessage: (\n id: string,\n ) => SubagentStreamInterface<infer S, infer TC, infer N>[];\n }\n ? (messageId: string) => ClassSubagentStreamInterface<S, TC, N>[]\n : never;\n }\n : unknown);\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\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 = writable<string | undefined>(undefined);\n let threadIdPromise: Promise<string> | null = null;\n\n const client = options.client ?? new Client({ apiUrl: options.apiUrl });\n\n const history = writable<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 ?? get(threadId);\n if (!tid) return undefined;\n try {\n const data = await fetchHistory<StateType>(client, tid, {\n limit: historyLimit,\n });\n history.set({\n data,\n error: undefined,\n isLoading: false,\n mutate,\n });\n return data;\n } catch (err) {\n history.update((prev) => ({\n ...prev,\n error: err,\n isLoading: false,\n }));\n options.onError?.(err, undefined);\n return undefined;\n }\n }\n\n history.update((prev) => ({ ...prev, mutate }));\n\n const branch = writable<string>(\"\");\n const branchContext = derived([branch, history], ([$branch, $history]) =>\n getBranchContext($branch, $history.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\n const historyValues = derived(\n [branchContext],\n ([$branchContext]) =>\n $branchContext.threadHead?.values ??\n options.initialValues ??\n ({} as StateType),\n );\n\n const historyError = derived([branchContext], ([$branchContext]) => {\n const error = $branchContext.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 = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const queueEntries = writable(pendingRuns.entries);\n const queueSize = writable(pendingRuns.size);\n\n const values = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) => $streamValues ?? $historyValues,\n );\n\n const error = derived(\n [streamError, historyError, history],\n ([$streamError, $historyError, $history]) =>\n $streamError ?? $historyError ?? $history.error,\n );\n\n const messageMetadata = derived(\n [history, branchContext],\n ([$history, $branchContext]) =>\n getMessagesMetadataMap({\n initialValues: options.initialValues,\n history: $history.data,\n getMessages,\n branchContext: $branchContext,\n }),\n );\n\n const subagentVersion = writable(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n subagentVersion.update((v) => v + 1);\n });\n\n const unsubQueue = pendingRuns.subscribe(() => {\n queueEntries.set(pendingRuns.entries);\n queueSize.set(pendingRuns.size);\n });\n\n const shouldReconstructSubagents = derived(\n [isLoading, history],\n ([$isLoading, $history]) => {\n if (!options.filterSubagentMessages) return false;\n if ($isLoading || $history.isLoading) return false;\n const hvMessages = getMessages(get(historyValues));\n return hvMessages.length > 0;\n },\n );\n\n const unsubReconstruct = shouldReconstructSubagents.subscribe(($should) => {\n if ($should) {\n const hvMessages = getMessages(get(historyValues));\n stream.reconstructSubagents(hvMessages, { skipIfPopulated: true });\n }\n });\n\n onDestroy(() => {\n unsubscribe();\n unsubReconstruct();\n unsubQueue();\n });\n\n function stop() {\n return stream.stop(get(historyValues), {\n onStop: (args) => {\n const tid = get(threadId);\n if (runMetadataStorage && tid) {\n const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);\n if (runId) void client.runs.cancel(tid, runId);\n runMetadataStorage.removeItem(`lg:stream:${tid}`);\n }\n\n options.onStop?.(args);\n },\n });\n }\n\n function setBranch(value: string) {\n branch.set(value);\n }\n\n function submitDirect(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentBranchContext = get(branchContext);\n\n const checkpointId = submitOptions?.checkpoint?.checkpoint_id;\n branch.set(\n checkpointId != null\n ? (currentBranchContext.branchByCheckpoint[checkpointId]?.branch ?? \"\")\n : \"\",\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 = get(threadId);\n if (!usableThreadId) {\n const threadPromise = client.threads.create({\n threadId: submitOptions?.threadId,\n metadata: submitOptions?.metadata,\n });\n\n threadIdPromise = threadPromise.then((t) => t.thread_id);\n\n const thread = await threadPromise;\n\n usableThreadId = thread.thread_id;\n threadId.set(usableThreadId);\n options.onThreadId?.(usableThreadId);\n }\n\n const streamMode: StreamMode[] = [\n \"values\",\n \"messages-tuple\",\n \"updates\",\n ...(submitOptions?.streamMode ?? []),\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 = { ...get(historyValues), ...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: get(historyValues),\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) {\n options.onError?.(error, callbackMeta);\n submitOptions?.onError?.(error, callbackMeta);\n },\n onFinish: () => {},\n },\n );\n }\n\n let submitting = false;\n\n function drainQueue() {\n if (!get(isLoading) && !submitting && pendingRuns.size > 0) {\n const next = pendingRuns.shift();\n if (next) {\n submitting = true;\n void joinStream(next.id).finally(() => {\n submitting = false;\n drainQueue();\n });\n }\n }\n }\n\n isLoading.subscribe(() => {\n drainQueue();\n });\n\n async function submit(\n values: StateType,\n submitOptions?: SubmitOptions<StateType, ConfigurableType>,\n ) {\n if (stream.isLoading || submitting) {\n const shouldAbort =\n submitOptions?.multitaskStrategy === \"interrupt\" ||\n submitOptions?.multitaskStrategy === \"rollback\";\n\n if (shouldAbort) {\n submitting = true;\n try {\n await submitDirect(values, submitOptions);\n } finally {\n submitting = false;\n }\n return;\n }\n\n let usableThreadId: string | undefined = get(threadId);\n if (!usableThreadId && threadIdPromise) {\n usableThreadId = await threadIdPromise;\n }\n if (usableThreadId) {\n try {\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 } catch (error) {\n options.onError?.(error, undefined);\n submitOptions?.onError?.(error, undefined);\n }\n return;\n }\n }\n\n submitting = true;\n const result = submitDirect(values, submitOptions);\n void Promise.resolve(result).finally(() => {\n submitting = false;\n drainQueue();\n });\n return result;\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 const tid = get(threadId);\n if (!tid) return;\n\n const callbackMeta: RunCallbackMeta = {\n thread_id: tid,\n run_id: runId,\n };\n\n await stream.start(\n async (signal: AbortSignal) => {\n const rawStream = client.runs.joinStream(tid, 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: get(historyValues),\n callbacks: options,\n async onSuccess() {\n runMetadataStorage?.removeItem(`lg:stream:${tid}`);\n const newHistory = await mutate(tid);\n const lastHead = newHistory?.at(0);\n if (lastHead) options.onFinish?.(lastHead, callbackMeta);\n },\n onError(error) {\n options.onError?.(error, callbackMeta);\n },\n onFinish: () => {},\n },\n );\n }\n\n let shouldReconnect = !!runMetadataStorage;\n\n onMount(() => {\n const tid = get(threadId);\n if (shouldReconnect && runMetadataStorage && tid) {\n const runId = runMetadataStorage.getItem(`lg:stream:${tid}`);\n if (runId) {\n shouldReconnect = false;\n void joinStream(runId);\n }\n }\n });\n\n const messages = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) =>\n ensureMessageInstances(getMessages($streamValues ?? $historyValues)),\n );\n\n const interrupt = derived(\n [streamValues, streamError, branchContext, isLoading],\n ([$streamValues, $streamError, $branchContext, $isLoading]) => {\n return extractInterrupts<InterruptType>($streamValues, {\n isLoading: $isLoading,\n threadState: $branchContext.threadHead,\n error: $streamError,\n });\n },\n );\n\n const interrupts = derived(\n [streamValues, streamError, branchContext, isLoading],\n ([$streamValues, $streamError, $branchContext, $isLoading]) => {\n const vals = $streamValues ?? get(historyValues);\n if (\n vals != null &&\n \"__interrupt__\" in vals &&\n Array.isArray(vals.__interrupt__)\n ) {\n const valueInterrupts = vals.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n if ($isLoading) return [];\n\n const allTasks = $branchContext.threadHead?.tasks ?? [];\n const allInterrupts = allTasks.flatMap((t) => t.interrupts ?? []);\n if (allInterrupts.length > 0) return allInterrupts;\n\n const next = $branchContext.threadHead?.next ?? [];\n if (!next.length || $streamError != null) return [];\n return [{ when: \"breakpoint\" }];\n },\n );\n\n const toolCalls = derived(\n [streamValues, historyValues],\n ([$streamValues, $historyValues]) =>\n getToolCallsWithResults(getMessages($streamValues ?? $historyValues)),\n );\n\n function getToolCalls(message: Message) {\n const currentValues = get(streamValues) ?? get(historyValues);\n const allToolCalls = getToolCallsWithResults(getMessages(currentValues));\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n const historyList = derived([branchContext], ([$branchContext]) => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `history`\",\n );\n }\n return $branchContext.flatHistory;\n });\n\n const isThreadLoading = derived(\n [history],\n ([$history]) => $history.isLoading && $history.data == null,\n );\n\n const experimentalBranchTree = derived(\n [branchContext],\n ([$branchContext]) => {\n if (historyLimit === false) {\n throw new Error(\n \"`fetchStateHistory` must be set to `true` to use `experimental_branchTree`\",\n );\n }\n return $branchContext.branchTree;\n },\n );\n\n function getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n const historyMetadata = get(messageMetadata)?.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 return {\n assistantId: options.assistantId,\n client,\n\n values,\n error,\n isLoading,\n isThreadLoading,\n\n branch,\n setBranch,\n\n messages,\n toolCalls,\n getToolCalls,\n\n interrupt,\n interrupts,\n\n history: historyList,\n experimental_branchTree: experimentalBranchTree,\n\n getMessagesMetadata,\n\n submit,\n stop,\n joinStream,\n\n queue: {\n entries: queueEntries,\n size: queueSize,\n async cancel(id: string) {\n const tid = get(threadId);\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 = get(threadId);\n const removed = pendingRuns.removeAll();\n if (tid && removed.length > 0) {\n await Promise.all(removed.map((e) => client.runs.cancel(tid!, e.id)));\n }\n },\n },\n\n switchThread(newThreadId: string | null) {\n const current = get(threadId) ?? null;\n if (newThreadId !== current) {\n const prevThreadId = get(threadId);\n threadId.set(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 subagents: derived(subagentVersion, () => stream.getSubagents()),\n activeSubagents: derived(subagentVersion, () =>\n 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\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 SubagentApi,\n SubagentStream,\n SubagentStreamInterface,\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":"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"}
|
package/dist/stream.custom.cjs
CHANGED
|
@@ -5,20 +5,24 @@ let _langchain_langgraph_sdk_utils = require("@langchain/langgraph-sdk/utils");
|
|
|
5
5
|
|
|
6
6
|
//#region src/stream.custom.ts
|
|
7
7
|
function useStreamCustom(options) {
|
|
8
|
-
const
|
|
8
|
+
const messageManager = new _langchain_langgraph_sdk_ui.MessageTupleManager();
|
|
9
|
+
const stream = new _langchain_langgraph_sdk_ui.StreamManager(messageManager, {
|
|
9
10
|
throttle: options.throttle ?? false,
|
|
10
11
|
subagentToolNames: options.subagentToolNames,
|
|
11
12
|
filterSubagentMessages: options.filterSubagentMessages,
|
|
12
13
|
toMessage: _langchain_langgraph_sdk_ui.toMessageClass
|
|
13
14
|
});
|
|
14
15
|
let threadId = options.threadId ?? null;
|
|
16
|
+
const branch = (0, svelte_store.writable)("");
|
|
15
17
|
const streamValues = (0, svelte_store.writable)(stream.values);
|
|
16
18
|
const streamError = (0, svelte_store.writable)(stream.error);
|
|
17
19
|
const isLoading = (0, svelte_store.writable)(stream.isLoading);
|
|
20
|
+
const subagentVersion = (0, svelte_store.writable)(0);
|
|
18
21
|
const unsubscribe = stream.subscribe(() => {
|
|
19
22
|
streamValues.set(stream.values);
|
|
20
23
|
streamError.set(stream.error);
|
|
21
24
|
isLoading.set(stream.isLoading);
|
|
25
|
+
subagentVersion.update((v) => v + 1);
|
|
22
26
|
});
|
|
23
27
|
(0, svelte.onDestroy)(() => {
|
|
24
28
|
unsubscribe();
|
|
@@ -88,6 +92,7 @@ function useStreamCustom(options) {
|
|
|
88
92
|
onSuccess: () => void 0,
|
|
89
93
|
onError(error) {
|
|
90
94
|
options.onError?.(error, void 0);
|
|
95
|
+
submitOptions?.onError?.(error, void 0);
|
|
91
96
|
}
|
|
92
97
|
});
|
|
93
98
|
}
|
|
@@ -97,7 +102,7 @@ function useStreamCustom(options) {
|
|
|
97
102
|
const values = (0, svelte_store.derived)([streamValues], ([$streamValues]) => $streamValues ?? {});
|
|
98
103
|
const messages = (0, svelte_store.derived)([streamValues], ([$streamValues]) => {
|
|
99
104
|
if (!$streamValues) return [];
|
|
100
|
-
return getMessages($streamValues);
|
|
105
|
+
return (0, _langchain_langgraph_sdk_ui.ensureMessageInstances)(getMessages($streamValues));
|
|
101
106
|
});
|
|
102
107
|
const toolCalls = (0, svelte_store.derived)([streamValues], ([$streamValues]) => {
|
|
103
108
|
if (!$streamValues) return [];
|
|
@@ -117,6 +122,19 @@ function useStreamCustom(options) {
|
|
|
117
122
|
if (!$streamValues) return [];
|
|
118
123
|
return (0, _langchain_langgraph_sdk_utils.getToolCallsWithResults)(getMessages($streamValues)).filter((tc) => tc.aiMessage.id === message.id);
|
|
119
124
|
}
|
|
125
|
+
function setBranch(value) {
|
|
126
|
+
branch.set(value);
|
|
127
|
+
}
|
|
128
|
+
function getMessagesMetadata(message, index) {
|
|
129
|
+
const streamMetadata = messageManager.get(message.id)?.metadata;
|
|
130
|
+
if (streamMetadata != null) return {
|
|
131
|
+
messageId: message.id ?? String(index),
|
|
132
|
+
firstSeenState: void 0,
|
|
133
|
+
branch: void 0,
|
|
134
|
+
branchOptions: void 0,
|
|
135
|
+
streamMetadata
|
|
136
|
+
};
|
|
137
|
+
}
|
|
120
138
|
return {
|
|
121
139
|
values,
|
|
122
140
|
error: streamError,
|
|
@@ -124,6 +142,9 @@ function useStreamCustom(options) {
|
|
|
124
142
|
stop,
|
|
125
143
|
submit,
|
|
126
144
|
switchThread,
|
|
145
|
+
branch,
|
|
146
|
+
setBranch,
|
|
147
|
+
getMessagesMetadata,
|
|
127
148
|
queue: {
|
|
128
149
|
entries: (0, svelte_store.writable)([]),
|
|
129
150
|
size: (0, svelte_store.writable)(0),
|
|
@@ -137,12 +158,8 @@ function useStreamCustom(options) {
|
|
|
137
158
|
messages,
|
|
138
159
|
toolCalls,
|
|
139
160
|
getToolCalls,
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
},
|
|
143
|
-
get activeSubagents() {
|
|
144
|
-
return stream.getActiveSubagents();
|
|
145
|
-
},
|
|
161
|
+
subagents: (0, svelte_store.derived)(subagentVersion, () => stream.getSubagents()),
|
|
162
|
+
activeSubagents: (0, svelte_store.derived)(subagentVersion, () => stream.getActiveSubagents()),
|
|
146
163
|
getSubagent(toolCallId) {
|
|
147
164
|
return stream.getSubagent(toolCallId);
|
|
148
165
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.custom.cjs","names":["StreamManager","MessageTupleManager","toMessageClass"],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n type EventStreamEvent,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\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 let threadId: string | null = options.threadId ?? null;\n\n const streamValues = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n });\n\n onDestroy(() => {\n unsubscribe();\n });\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey])\n ? (value[messagesKey] as Message[])\n : [];\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 historyValues = options.initialValues ?? ({} as StateType);\n\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n if (shouldReconstructSubagents) {\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n\n function switchThread(newThreadId: string | null) {\n if (newThreadId !== threadId) {\n threadId = newThreadId;\n stream.clear();\n }\n }\n\n function stop() {\n return stream.stop(historyValues, { onStop: options.onStop });\n }\n\n async function submitDirect(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentThreadId = options.threadId ?? null;\n if (currentThreadId !== threadId) {\n threadId = currentThreadId;\n stream.clear();\n }\n\n let usableThreadId = threadId;\n\n stream.setStreamValues(() => {\n if (submitOptions?.optimisticValues != null) {\n return {\n ...historyValues,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(historyValues)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...historyValues };\n });\n\n await stream.start(\n async (signal: AbortSignal) => {\n if (!usableThreadId) {\n usableThreadId = crypto.randomUUID();\n threadId = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n return options.transport.stream({\n input: values,\n context: submitOptions?.context,\n command: submitOptions?.command,\n signal,\n config: {\n ...submitOptions?.config,\n configurable: {\n thread_id: usableThreadId,\n ...submitOptions?.config?.configurable,\n } as unknown as GetConfigurableType<Bag>,\n },\n }) as Promise<\n AsyncGenerator<EventStreamEvent<StateType, UpdateType, CustomType>>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: {} as StateType,\n callbacks: options,\n\n onSuccess: () => undefined,\n onError(error) {\n options.onError?.(error, undefined);\n },\n },\n );\n }\n\n async function submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await submitDirect(values, submitOptions);\n }\n\n const values = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messages = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [] as Message<ToolCallType>[];\n return getMessages($streamValues) as Message<ToolCallType>[];\n });\n\n const toolCalls = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interrupt = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interrupts = derived(\n [streamValues],\n ([$streamValues]): Interrupt<InterruptType>[] => {\n if (\n $streamValues != null &&\n \"__interrupt__\" in $streamValues &&\n Array.isArray($streamValues.__interrupt__)\n ) {\n const valueInterrupts = $streamValues.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n );\n\n function getToolCalls(message: Message) {\n const $streamValues = get(streamValues);\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n return {\n values,\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n queue: {\n entries: writable([]),\n size: writable(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupt,\n interrupts,\n\n messages,\n toolCalls,\n getToolCalls,\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.custom.cjs","names":["MessageTupleManager","StreamManager","toMessageClass"],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n ensureMessageInstances,\n type EventStreamEvent,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n type MessageMetadata,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\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 let threadId: string | null = options.threadId ?? null;\n\n const branch = writable<string>(\"\");\n\n const streamValues = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const subagentVersion = writable(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n subagentVersion.update((v) => v + 1);\n });\n\n onDestroy(() => {\n unsubscribe();\n });\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey])\n ? (value[messagesKey] as Message[])\n : [];\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 historyValues = options.initialValues ?? ({} as StateType);\n\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n if (shouldReconstructSubagents) {\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n\n function switchThread(newThreadId: string | null) {\n if (newThreadId !== threadId) {\n threadId = newThreadId;\n stream.clear();\n }\n }\n\n function stop() {\n return stream.stop(historyValues, { onStop: options.onStop });\n }\n\n async function submitDirect(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentThreadId = options.threadId ?? null;\n if (currentThreadId !== threadId) {\n threadId = currentThreadId;\n stream.clear();\n }\n\n let usableThreadId = threadId;\n\n stream.setStreamValues(() => {\n if (submitOptions?.optimisticValues != null) {\n return {\n ...historyValues,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(historyValues)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...historyValues };\n });\n\n await stream.start(\n async (signal: AbortSignal) => {\n if (!usableThreadId) {\n usableThreadId = crypto.randomUUID();\n threadId = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n return options.transport.stream({\n input: values,\n context: submitOptions?.context,\n command: submitOptions?.command,\n signal,\n config: {\n ...submitOptions?.config,\n configurable: {\n thread_id: usableThreadId,\n ...submitOptions?.config?.configurable,\n } as unknown as GetConfigurableType<Bag>,\n },\n }) as Promise<\n AsyncGenerator<EventStreamEvent<StateType, UpdateType, CustomType>>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: {} as StateType,\n callbacks: options,\n\n onSuccess: () => undefined,\n onError(error) {\n options.onError?.(error, undefined);\n submitOptions?.onError?.(error, undefined);\n },\n },\n );\n }\n\n async function submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await submitDirect(values, submitOptions);\n }\n\n const values = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messages = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n return ensureMessageInstances(getMessages($streamValues));\n });\n\n const toolCalls = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interrupt = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interrupts = derived(\n [streamValues],\n ([$streamValues]): Interrupt<InterruptType>[] => {\n if (\n $streamValues != null &&\n \"__interrupt__\" in $streamValues &&\n Array.isArray($streamValues.__interrupt__)\n ) {\n const valueInterrupts = $streamValues.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n );\n\n function getToolCalls(message: Message) {\n const $streamValues = get(streamValues);\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n function setBranch(value: string) {\n branch.set(value);\n }\n\n function getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n if (streamMetadata != null) {\n return {\n messageId: message.id ?? String(index),\n firstSeenState: undefined,\n branch: undefined,\n branchOptions: undefined,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n return undefined;\n }\n\n return {\n values,\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: writable([]),\n size: writable(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupt,\n interrupts,\n\n messages,\n toolCalls,\n getToolCalls,\n\n subagents: derived(subagentVersion, () => stream.getSubagents()),\n\n activeSubagents: derived(subagentVersion, () =>\n 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"],"mappings":"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"}
|
package/dist/stream.custom.js
CHANGED
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
import { derived, get, writable } from "svelte/store";
|
|
2
2
|
import { onDestroy } from "svelte";
|
|
3
|
-
import { MessageTupleManager, StreamManager, extractInterrupts, toMessageClass } from "@langchain/langgraph-sdk/ui";
|
|
3
|
+
import { MessageTupleManager, StreamManager, ensureMessageInstances, extractInterrupts, toMessageClass } from "@langchain/langgraph-sdk/ui";
|
|
4
4
|
import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
|
|
5
5
|
|
|
6
6
|
//#region src/stream.custom.ts
|
|
7
7
|
function useStreamCustom(options) {
|
|
8
|
-
const
|
|
8
|
+
const messageManager = new MessageTupleManager();
|
|
9
|
+
const stream = new StreamManager(messageManager, {
|
|
9
10
|
throttle: options.throttle ?? false,
|
|
10
11
|
subagentToolNames: options.subagentToolNames,
|
|
11
12
|
filterSubagentMessages: options.filterSubagentMessages,
|
|
12
13
|
toMessage: toMessageClass
|
|
13
14
|
});
|
|
14
15
|
let threadId = options.threadId ?? null;
|
|
16
|
+
const branch = writable("");
|
|
15
17
|
const streamValues = writable(stream.values);
|
|
16
18
|
const streamError = writable(stream.error);
|
|
17
19
|
const isLoading = writable(stream.isLoading);
|
|
20
|
+
const subagentVersion = writable(0);
|
|
18
21
|
const unsubscribe = stream.subscribe(() => {
|
|
19
22
|
streamValues.set(stream.values);
|
|
20
23
|
streamError.set(stream.error);
|
|
21
24
|
isLoading.set(stream.isLoading);
|
|
25
|
+
subagentVersion.update((v) => v + 1);
|
|
22
26
|
});
|
|
23
27
|
onDestroy(() => {
|
|
24
28
|
unsubscribe();
|
|
@@ -88,6 +92,7 @@ function useStreamCustom(options) {
|
|
|
88
92
|
onSuccess: () => void 0,
|
|
89
93
|
onError(error) {
|
|
90
94
|
options.onError?.(error, void 0);
|
|
95
|
+
submitOptions?.onError?.(error, void 0);
|
|
91
96
|
}
|
|
92
97
|
});
|
|
93
98
|
}
|
|
@@ -97,7 +102,7 @@ function useStreamCustom(options) {
|
|
|
97
102
|
const values = derived([streamValues], ([$streamValues]) => $streamValues ?? {});
|
|
98
103
|
const messages = derived([streamValues], ([$streamValues]) => {
|
|
99
104
|
if (!$streamValues) return [];
|
|
100
|
-
return getMessages($streamValues);
|
|
105
|
+
return ensureMessageInstances(getMessages($streamValues));
|
|
101
106
|
});
|
|
102
107
|
const toolCalls = derived([streamValues], ([$streamValues]) => {
|
|
103
108
|
if (!$streamValues) return [];
|
|
@@ -117,6 +122,19 @@ function useStreamCustom(options) {
|
|
|
117
122
|
if (!$streamValues) return [];
|
|
118
123
|
return getToolCallsWithResults(getMessages($streamValues)).filter((tc) => tc.aiMessage.id === message.id);
|
|
119
124
|
}
|
|
125
|
+
function setBranch(value) {
|
|
126
|
+
branch.set(value);
|
|
127
|
+
}
|
|
128
|
+
function getMessagesMetadata(message, index) {
|
|
129
|
+
const streamMetadata = messageManager.get(message.id)?.metadata;
|
|
130
|
+
if (streamMetadata != null) return {
|
|
131
|
+
messageId: message.id ?? String(index),
|
|
132
|
+
firstSeenState: void 0,
|
|
133
|
+
branch: void 0,
|
|
134
|
+
branchOptions: void 0,
|
|
135
|
+
streamMetadata
|
|
136
|
+
};
|
|
137
|
+
}
|
|
120
138
|
return {
|
|
121
139
|
values,
|
|
122
140
|
error: streamError,
|
|
@@ -124,6 +142,9 @@ function useStreamCustom(options) {
|
|
|
124
142
|
stop,
|
|
125
143
|
submit,
|
|
126
144
|
switchThread,
|
|
145
|
+
branch,
|
|
146
|
+
setBranch,
|
|
147
|
+
getMessagesMetadata,
|
|
127
148
|
queue: {
|
|
128
149
|
entries: writable([]),
|
|
129
150
|
size: writable(0),
|
|
@@ -137,12 +158,8 @@ function useStreamCustom(options) {
|
|
|
137
158
|
messages,
|
|
138
159
|
toolCalls,
|
|
139
160
|
getToolCalls,
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
},
|
|
143
|
-
get activeSubagents() {
|
|
144
|
-
return stream.getActiveSubagents();
|
|
145
|
-
},
|
|
161
|
+
subagents: derived(subagentVersion, () => stream.getSubagents()),
|
|
162
|
+
activeSubagents: derived(subagentVersion, () => stream.getActiveSubagents()),
|
|
146
163
|
getSubagent(toolCallId) {
|
|
147
164
|
return stream.getSubagent(toolCallId);
|
|
148
165
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.custom.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n type EventStreamEvent,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\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 let threadId: string | null = options.threadId ?? null;\n\n const streamValues = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n });\n\n onDestroy(() => {\n unsubscribe();\n });\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey])\n ? (value[messagesKey] as Message[])\n : [];\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 historyValues = options.initialValues ?? ({} as StateType);\n\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n if (shouldReconstructSubagents) {\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n\n function switchThread(newThreadId: string | null) {\n if (newThreadId !== threadId) {\n threadId = newThreadId;\n stream.clear();\n }\n }\n\n function stop() {\n return stream.stop(historyValues, { onStop: options.onStop });\n }\n\n async function submitDirect(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentThreadId = options.threadId ?? null;\n if (currentThreadId !== threadId) {\n threadId = currentThreadId;\n stream.clear();\n }\n\n let usableThreadId = threadId;\n\n stream.setStreamValues(() => {\n if (submitOptions?.optimisticValues != null) {\n return {\n ...historyValues,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(historyValues)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...historyValues };\n });\n\n await stream.start(\n async (signal: AbortSignal) => {\n if (!usableThreadId) {\n usableThreadId = crypto.randomUUID();\n threadId = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n return options.transport.stream({\n input: values,\n context: submitOptions?.context,\n command: submitOptions?.command,\n signal,\n config: {\n ...submitOptions?.config,\n configurable: {\n thread_id: usableThreadId,\n ...submitOptions?.config?.configurable,\n } as unknown as GetConfigurableType<Bag>,\n },\n }) as Promise<\n AsyncGenerator<EventStreamEvent<StateType, UpdateType, CustomType>>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: {} as StateType,\n callbacks: options,\n\n onSuccess: () => undefined,\n onError(error) {\n options.onError?.(error, undefined);\n },\n },\n );\n }\n\n async function submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await submitDirect(values, submitOptions);\n }\n\n const values = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messages = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [] as Message<ToolCallType>[];\n return getMessages($streamValues) as Message<ToolCallType>[];\n });\n\n const toolCalls = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interrupt = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interrupts = derived(\n [streamValues],\n ([$streamValues]): Interrupt<InterruptType>[] => {\n if (\n $streamValues != null &&\n \"__interrupt__\" in $streamValues &&\n Array.isArray($streamValues.__interrupt__)\n ) {\n const valueInterrupts = $streamValues.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n );\n\n function getToolCalls(message: Message) {\n const $streamValues = get(streamValues);\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n return {\n values,\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n queue: {\n entries: writable([]),\n size: writable(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupt,\n interrupts,\n\n messages,\n toolCalls,\n getToolCalls,\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"],"mappings":";;;;;;AAmBA,SAAgB,gBAGd,SAAiD;CAQjD,MAAM,SAAS,IAAI,cADI,IAAI,qBAAqB,EACiB;EAC/D,UAAU,QAAQ,YAAY;EAC9B,mBAAmB,QAAQ;EAC3B,wBAAwB,QAAQ;EAChC,WAAW;EACZ,CAAC;CAEF,IAAI,WAA0B,QAAQ,YAAY;CAElD,MAAM,eAAe,SAA2B,OAAO,OAAO;CAC9D,MAAM,cAAc,SAAkB,OAAO,MAAM;CACnD,MAAM,YAAY,SAAS,OAAO,UAAU;CAE5C,MAAM,cAAc,OAAO,gBAAgB;AACzC,eAAa,IAAI,OAAO,OAAO;AAC/B,cAAY,IAAI,OAAO,MAAM;AAC7B,YAAU,IAAI,OAAO,UAAU;GAC/B;AAEF,iBAAgB;AACd,eAAa;GACb;CAEF,MAAM,eAAe,UAAgC;EACnD,MAAM,cAAc,QAAQ,eAAe;AAC3C,SAAO,MAAM,QAAQ,MAAM,aAAa,GACnC,MAAM,eACP,EAAE;;CAGR,MAAM,eAAe,SAAoB,aAAmC;EAC1E,MAAM,cAAc,QAAQ,eAAe;AAC3C,SAAO;GAAE,GAAG;IAAU,cAAc;GAAU;;CAGhD,MAAM,gBAAgB,QAAQ,iBAAkB,EAAE;CAElD,MAAM,kBAAkB,YAAY,cAAc;AAMlD,KAJE,QAAQ,0BACR,CAAC,OAAO,aACR,gBAAgB,SAAS,EAGzB,QAAO,qBAAqB,iBAAiB,EAAE,iBAAiB,MAAM,CAAC;CAGzE,SAAS,aAAa,aAA4B;AAChD,MAAI,gBAAgB,UAAU;AAC5B,cAAW;AACX,UAAO,OAAO;;;CAIlB,SAAS,OAAO;AACd,SAAO,OAAO,KAAK,eAAe,EAAE,QAAQ,QAAQ,QAAQ,CAAC;;CAG/D,eAAe,aACb,QACA,eACA;EACA,MAAM,kBAAkB,QAAQ,YAAY;AAC5C,MAAI,oBAAoB,UAAU;AAChC,cAAW;AACX,UAAO,OAAO;;EAGhB,IAAI,iBAAiB;AAErB,SAAO,sBAAsB;AAC3B,OAAI,eAAe,oBAAoB,KACrC,QAAO;IACL,GAAG;IACH,GAAI,OAAO,cAAc,qBAAqB,aAC1C,cAAc,iBAAiB,cAAc,GAC7C,cAAc;IACnB;AAGH,UAAO,EAAE,GAAG,eAAe;IAC3B;AAEF,QAAM,OAAO,MACX,OAAO,WAAwB;AAC7B,OAAI,CAAC,gBAAgB;AACnB,qBAAiB,OAAO,YAAY;AACpC,eAAW;AACX,YAAQ,aAAa,eAAe;;AAGtC,OAAI,CAAC,eACH,OAAM,IAAI,MAAM,oCAAoC;AAGtD,UAAO,QAAQ,UAAU,OAAO;IAC9B,OAAO;IACP,SAAS,eAAe;IACxB,SAAS,eAAe;IACxB;IACA,QAAQ;KACN,GAAG,eAAe;KAClB,cAAc;MACZ,WAAW;MACX,GAAG,eAAe,QAAQ;MAC3B;KACF;IACF,CAAC;KAIJ;GACE;GACA;GAEA,eAAe,EAAE;GACjB,WAAW;GAEX,iBAAiB;GACjB,QAAQ,OAAO;AACb,YAAQ,UAAU,OAAO,OAAU;;GAEtC,CACF;;CAGH,eAAe,OACb,QACA,eACA;AACA,QAAM,aAAa,QAAQ,cAAc;;CAG3C,MAAM,SAAS,QACb,CAAC,aAAa,GACb,CAAC,mBAAmB,iBAAkB,EAAE,CAC1C;CAED,MAAM,WAAW,QAAQ,CAAC,aAAa,GAAG,CAAC,mBAAmB;AAC5D,MAAI,CAAC,cAAe,QAAO,EAAE;AAC7B,SAAO,YAAY,cAAc;GACjC;CAEF,MAAM,YAAY,QAAQ,CAAC,aAAa,GAAG,CAAC,mBAAmB;AAC7D,MAAI,CAAC,cAAe,QAAO,EAAE;AAE7B,SAAO,wBADM,YAAY,cAAc,CACW;GAClD;CAEF,MAAM,YAAY,QAAQ,CAAC,aAAa,GAAG,CAAC,mBAC1C,kBAAiC,cAAc,CAChD;CAED,MAAM,aAAa,QACjB,CAAC,aAAa,GACb,CAAC,mBAA+C;AAC/C,MACE,iBAAiB,QACjB,mBAAmB,iBACnB,MAAM,QAAQ,cAAc,cAAc,EAC1C;GACA,MAAM,kBAAkB,cAAc;AACtC,OAAI,gBAAgB,WAAW,EAAG,QAAO,CAAC,EAAE,MAAM,cAAc,CAAC;AACjE,UAAO;;AAGT,SAAO,EAAE;GAEZ;CAED,SAAS,aAAa,SAAkB;EACtC,MAAM,gBAAgB,IAAI,aAAa;AACvC,MAAI,CAAC,cAAe,QAAO,EAAE;AAG7B,SADqB,wBADR,YAAY,cAAc,CACyB,CAC5C,QAAQ,OAAO,GAAG,UAAU,OAAO,QAAQ,GAAG;;AAGpE,QAAO;EACL;EACA,OAAO;EACP;EAEA;EACA;EACA;EAEA,OAAO;GACL,SAAS,SAAS,EAAE,CAAC;GACrB,MAAM,SAAS,EAAE;GACjB,MAAM,SAAS;AACb,WAAO;;GAET,MAAM,QAAQ;GACf;EAED;EACA;EAEA;EACA;EACA;EAEA,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"}
|
|
1
|
+
{"version":3,"file":"stream.custom.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n StreamManager,\n MessageTupleManager,\n extractInterrupts,\n toMessageClass,\n ensureMessageInstances,\n type EventStreamEvent,\n type GetUpdateType,\n type GetCustomEventType,\n type GetInterruptType,\n type GetConfigurableType,\n type GetToolCallsType,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n type MessageMetadata,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { getToolCallsWithResults } from \"@langchain/langgraph-sdk/utils\";\nimport type { BagTemplate, Message, Interrupt } from \"@langchain/langgraph-sdk\";\n\nexport function useStreamCustom<\n StateType extends Record<string, unknown> = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(options: AnyStreamCustomOptions<StateType, Bag>) {\n type UpdateType = GetUpdateType<Bag, StateType>;\n type CustomType = GetCustomEventType<Bag>;\n type InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n type ToolCallType = GetToolCallsType<StateType>;\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 let threadId: string | null = options.threadId ?? null;\n\n const branch = writable<string>(\"\");\n\n const streamValues = writable<StateType | null>(stream.values);\n const streamError = writable<unknown>(stream.error);\n const isLoading = writable(stream.isLoading);\n\n const subagentVersion = writable(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.set(stream.values);\n streamError.set(stream.error);\n isLoading.set(stream.isLoading);\n subagentVersion.update((v) => v + 1);\n });\n\n onDestroy(() => {\n unsubscribe();\n });\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = options.messagesKey ?? \"messages\";\n return Array.isArray(value[messagesKey])\n ? (value[messagesKey] as Message[])\n : [];\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 historyValues = options.initialValues ?? ({} as StateType);\n\n const historyMessages = getMessages(historyValues);\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n if (shouldReconstructSubagents) {\n stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });\n }\n\n function switchThread(newThreadId: string | null) {\n if (newThreadId !== threadId) {\n threadId = newThreadId;\n stream.clear();\n }\n }\n\n function stop() {\n return stream.stop(historyValues, { onStop: options.onStop });\n }\n\n async function submitDirect(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n const currentThreadId = options.threadId ?? null;\n if (currentThreadId !== threadId) {\n threadId = currentThreadId;\n stream.clear();\n }\n\n let usableThreadId = threadId;\n\n stream.setStreamValues(() => {\n if (submitOptions?.optimisticValues != null) {\n return {\n ...historyValues,\n ...(typeof submitOptions.optimisticValues === \"function\"\n ? submitOptions.optimisticValues(historyValues)\n : submitOptions.optimisticValues),\n };\n }\n\n return { ...historyValues };\n });\n\n await stream.start(\n async (signal: AbortSignal) => {\n if (!usableThreadId) {\n usableThreadId = crypto.randomUUID();\n threadId = usableThreadId;\n options.onThreadId?.(usableThreadId);\n }\n\n if (!usableThreadId) {\n throw new Error(\"Failed to obtain valid thread ID.\");\n }\n\n return options.transport.stream({\n input: values,\n context: submitOptions?.context,\n command: submitOptions?.command,\n signal,\n config: {\n ...submitOptions?.config,\n configurable: {\n thread_id: usableThreadId,\n ...submitOptions?.config?.configurable,\n } as unknown as GetConfigurableType<Bag>,\n },\n }) as Promise<\n AsyncGenerator<EventStreamEvent<StateType, UpdateType, CustomType>>\n >;\n },\n {\n getMessages,\n setMessages,\n\n initialValues: {} as StateType,\n callbacks: options,\n\n onSuccess: () => undefined,\n onError(error) {\n options.onError?.(error, undefined);\n submitOptions?.onError?.(error, undefined);\n },\n },\n );\n }\n\n async function submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await submitDirect(values, submitOptions);\n }\n\n const values = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messages = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n return ensureMessageInstances(getMessages($streamValues));\n });\n\n const toolCalls = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interrupt = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interrupts = derived(\n [streamValues],\n ([$streamValues]): Interrupt<InterruptType>[] => {\n if (\n $streamValues != null &&\n \"__interrupt__\" in $streamValues &&\n Array.isArray($streamValues.__interrupt__)\n ) {\n const valueInterrupts = $streamValues.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n );\n\n function getToolCalls(message: Message) {\n const $streamValues = get(streamValues);\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n const allToolCalls = getToolCallsWithResults<ToolCallType>(msgs);\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n }\n\n function setBranch(value: string) {\n branch.set(value);\n }\n\n function getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n const streamMetadata = messageManager.get(message.id)?.metadata;\n if (streamMetadata != null) {\n return {\n messageId: message.id ?? String(index),\n firstSeenState: undefined,\n branch: undefined,\n branchOptions: undefined,\n streamMetadata,\n } as MessageMetadata<StateType>;\n }\n return undefined;\n }\n\n return {\n values,\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: writable([]),\n size: writable(0),\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n interrupt,\n interrupts,\n\n messages,\n toolCalls,\n getToolCalls,\n\n subagents: derived(subagentVersion, () => stream.getSubagents()),\n\n activeSubagents: derived(subagentVersion, () =>\n 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"],"mappings":"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"}
|