@langchain/svelte 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,167 +1,30 @@
1
- import { derived, fromStore, get, writable } from "svelte/store";
1
+ import { derived, fromStore, writable } from "svelte/store";
2
2
  import { onDestroy } from "svelte";
3
- import { MessageTupleManager, StreamManager, ensureMessageInstances, extractInterrupts, toMessageClass } from "@langchain/langgraph-sdk/ui";
4
- import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
3
+ import { CustomStreamOrchestrator } from "@langchain/langgraph-sdk/ui";
5
4
  //#region src/stream.custom.ts
6
- function createCustomTransportThreadState(values, threadId) {
7
- return {
8
- values,
9
- next: [],
10
- tasks: [],
11
- metadata: void 0,
12
- created_at: null,
13
- checkpoint: {
14
- thread_id: threadId,
15
- checkpoint_id: null,
16
- checkpoint_ns: "",
17
- checkpoint_map: null
18
- },
19
- parent_checkpoint: null
20
- };
21
- }
22
5
  function useStreamCustom(options) {
23
- const messageManager = new MessageTupleManager();
24
- const stream = new StreamManager(messageManager, {
25
- throttle: options.throttle ?? false,
26
- subagentToolNames: options.subagentToolNames,
27
- filterSubagentMessages: options.filterSubagentMessages,
28
- toMessage: toMessageClass
29
- });
30
- let threadId = options.threadId ?? null;
6
+ const orchestrator = new CustomStreamOrchestrator(options);
7
+ const version = writable(0);
31
8
  const branch = writable("");
32
- const streamValues = writable(stream.values);
33
- const streamError = writable(stream.error);
34
- const isLoading = writable(stream.isLoading);
35
- const subagentVersion = writable(0);
36
- const unsubscribe = stream.subscribe(() => {
37
- streamValues.set(stream.values);
38
- streamError.set(stream.error);
39
- isLoading.set(stream.isLoading);
40
- subagentVersion.update((v) => v + 1);
9
+ const unsubscribe = orchestrator.subscribe(() => {
10
+ version.update((v) => v + 1);
41
11
  });
42
12
  onDestroy(() => {
43
13
  unsubscribe();
14
+ orchestrator.dispose();
44
15
  });
45
- const getMessages = (value) => {
46
- const messagesKey = options.messagesKey ?? "messages";
47
- return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
48
- };
49
- const setMessages = (current, messages) => {
50
- const messagesKey = options.messagesKey ?? "messages";
51
- return {
52
- ...current,
53
- [messagesKey]: messages
54
- };
55
- };
56
- const historyValues = options.initialValues ?? {};
57
- const historyMessages = getMessages(historyValues);
58
- if (options.filterSubagentMessages && !stream.isLoading && historyMessages.length > 0) stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });
59
- function switchThread(newThreadId) {
60
- if (newThreadId !== threadId) {
61
- threadId = newThreadId;
62
- stream.clear();
63
- }
64
- }
65
- function stop() {
66
- return stream.stop(historyValues, { onStop: options.onStop });
67
- }
68
- async function submitDirect(values, submitOptions) {
69
- const currentThreadId = options.threadId ?? null;
70
- if (currentThreadId !== threadId) {
71
- threadId = currentThreadId;
72
- stream.clear();
73
- }
74
- let usableThreadId = threadId ?? submitOptions?.threadId;
75
- stream.setStreamValues(() => {
76
- if (submitOptions?.optimisticValues != null) return {
77
- ...historyValues,
78
- ...typeof submitOptions.optimisticValues === "function" ? submitOptions.optimisticValues(historyValues) : submitOptions.optimisticValues
79
- };
80
- return { ...historyValues };
81
- });
82
- await stream.start(async (signal) => {
83
- if (!usableThreadId) {
84
- usableThreadId = crypto.randomUUID();
85
- threadId = usableThreadId;
86
- options.onThreadId?.(usableThreadId);
87
- }
88
- if (!usableThreadId) throw new Error("Failed to obtain valid thread ID.");
89
- return options.transport.stream({
90
- input: values,
91
- context: submitOptions?.context,
92
- command: submitOptions?.command,
93
- streamSubgraphs: submitOptions?.streamSubgraphs,
94
- signal,
95
- config: {
96
- ...submitOptions?.config,
97
- configurable: {
98
- thread_id: usableThreadId,
99
- ...submitOptions?.config?.configurable
100
- }
101
- }
102
- });
103
- }, {
104
- getMessages,
105
- setMessages,
106
- initialValues: {},
107
- callbacks: options,
108
- onSuccess: () => {
109
- if (!usableThreadId) return void 0;
110
- const finalValues = stream.values ?? historyValues;
111
- options.onFinish?.(createCustomTransportThreadState(finalValues, usableThreadId), void 0);
112
- },
113
- onError(error) {
114
- options.onError?.(error, void 0);
115
- submitOptions?.onError?.(error, void 0);
116
- }
117
- });
118
- }
119
- async function submit(values, submitOptions) {
120
- await submitDirect(values, submitOptions);
121
- }
122
- const valuesStore = derived([streamValues], ([$streamValues]) => $streamValues ?? {});
123
- const messagesStore = derived([streamValues], ([$streamValues]) => {
124
- if (!$streamValues) return [];
125
- return ensureMessageInstances(getMessages($streamValues));
126
- });
127
- const toolCallsStore = derived([streamValues], ([$streamValues]) => {
128
- if (!$streamValues) return [];
129
- return getToolCallsWithResults(getMessages($streamValues));
130
- });
131
- const interruptStore = derived([streamValues], ([$streamValues]) => extractInterrupts($streamValues));
132
- const interruptsStore = derived([streamValues], ([$streamValues]) => {
133
- if ($streamValues != null && "__interrupt__" in $streamValues && Array.isArray($streamValues.__interrupt__)) {
134
- const valueInterrupts = $streamValues.__interrupt__;
135
- if (valueInterrupts.length === 0) return [{ when: "breakpoint" }];
136
- return valueInterrupts;
137
- }
138
- return [];
139
- });
140
- function getToolCalls(message) {
141
- const $streamValues = get(streamValues);
142
- if (!$streamValues) return [];
143
- return getToolCallsWithResults(getMessages($streamValues)).filter((tc) => tc.aiMessage.id === message.id);
144
- }
145
- function setBranch(value) {
146
- branch.set(value);
147
- }
148
- function getMessagesMetadata(message, index) {
149
- const streamMetadata = messageManager.get(message.id)?.metadata;
150
- if (streamMetadata != null) return {
151
- messageId: message.id ?? String(index),
152
- firstSeenState: void 0,
153
- branch: void 0,
154
- branchOptions: void 0,
155
- streamMetadata
156
- };
157
- }
16
+ const valuesStore = derived(version, () => orchestrator.values);
17
+ const messagesStore = derived(version, () => orchestrator.messages);
18
+ const toolCallsStore = derived(version, () => orchestrator.toolCalls);
19
+ const interruptStore = derived(version, () => orchestrator.interrupt);
20
+ const interruptsStore = derived(version, () => orchestrator.interrupts);
21
+ const subagentsStore = derived(version, () => orchestrator.subagents);
22
+ const activeSubagentsStore = derived(version, () => orchestrator.activeSubagents);
158
23
  const emptyEntries = writable([]);
159
24
  const emptySize = writable(0);
160
- const subagentsStore = derived(subagentVersion, () => stream.getSubagents());
161
- const activeSubagentsStore = derived(subagentVersion, () => stream.getActiveSubagents());
162
25
  const valuesRef = fromStore(valuesStore);
163
- const errorRef = fromStore(streamError);
164
- const isLoadingRef = fromStore(isLoading);
26
+ const errorRef = fromStore(derived(version, () => orchestrator.error));
27
+ const isLoadingRef = fromStore(derived(version, () => orchestrator.isLoading));
165
28
  const branchRef = fromStore(branch);
166
29
  const messagesRef = fromStore(messagesStore);
167
30
  const toolCallsRef = fromStore(toolCallsStore);
@@ -181,14 +44,23 @@ function useStreamCustom(options) {
181
44
  get isLoading() {
182
45
  return isLoadingRef.current;
183
46
  },
184
- stop,
185
- submit,
186
- switchThread,
47
+ stop: () => orchestrator.stop(),
48
+ async submit(values, submitOptions) {
49
+ await orchestrator.submit(values, submitOptions);
50
+ },
51
+ switchThread(newThreadId) {
52
+ orchestrator.switchThread(newThreadId);
53
+ },
187
54
  get branch() {
188
55
  return branchRef.current;
189
56
  },
190
- setBranch,
191
- getMessagesMetadata,
57
+ setBranch(value) {
58
+ branch.set(value);
59
+ orchestrator.setBranch(value);
60
+ },
61
+ getMessagesMetadata(message, index) {
62
+ return orchestrator.getMessagesMetadata(message, index);
63
+ },
192
64
  queue: {
193
65
  get entries() {
194
66
  return emptyEntriesRef.current;
@@ -213,7 +85,9 @@ function useStreamCustom(options) {
213
85
  get toolCalls() {
214
86
  return toolCallsRef.current;
215
87
  },
216
- getToolCalls,
88
+ getToolCalls(message) {
89
+ return orchestrator.getToolCalls(message);
90
+ },
217
91
  get subagents() {
218
92
  return subagentsRef.current;
219
93
  },
@@ -221,13 +95,13 @@ function useStreamCustom(options) {
221
95
  return activeSubagentsRef.current;
222
96
  },
223
97
  getSubagent(toolCallId) {
224
- return stream.getSubagent(toolCallId);
98
+ return orchestrator.getSubagent(toolCallId);
225
99
  },
226
100
  getSubagentsByType(type) {
227
- return stream.getSubagentsByType(type);
101
+ return orchestrator.getSubagentsByType(type);
228
102
  },
229
103
  getSubagentsByMessage(messageId) {
230
- return stream.getSubagentsByMessage(messageId);
104
+ return orchestrator.getSubagentsByMessage(messageId);
231
105
  }
232
106
  };
233
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stream.custom.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, get, fromStore } 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 {\n BagTemplate,\n Message,\n Interrupt,\n ThreadState,\n} from \"@langchain/langgraph-sdk\";\n\nfunction createCustomTransportThreadState<\n StateType extends Record<string, unknown>,\n>(values: StateType, threadId: string): ThreadState<StateType> {\n return {\n values,\n next: [],\n tasks: [],\n metadata: undefined,\n created_at: null,\n checkpoint: {\n thread_id: threadId,\n checkpoint_id: null,\n checkpoint_ns: \"\",\n checkpoint_map: null,\n },\n parent_checkpoint: null,\n };\n}\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 ?? submitOptions?.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 streamSubgraphs: submitOptions?.streamSubgraphs,\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: () => {\n if (!usableThreadId) return undefined;\n\n const finalValues = stream.values ?? historyValues;\n options.onFinish?.(\n createCustomTransportThreadState(finalValues, usableThreadId),\n undefined,\n );\n\n return undefined;\n },\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 valuesStore = derived(\n [streamValues],\n ([$streamValues]) => $streamValues ?? ({} as StateType),\n );\n\n const messagesStore = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n return ensureMessageInstances(getMessages($streamValues));\n });\n\n const toolCallsStore = derived([streamValues], ([$streamValues]) => {\n if (!$streamValues) return [];\n const msgs = getMessages($streamValues);\n return getToolCallsWithResults<ToolCallType>(msgs);\n });\n\n const interruptStore = derived([streamValues], ([$streamValues]) =>\n extractInterrupts<InterruptType>($streamValues),\n );\n\n const interruptsStore = 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 const emptyEntries = writable<never[]>([]);\n const emptySize = writable(0);\n\n const subagentsStore = derived(subagentVersion, () => stream.getSubagents());\n const activeSubagentsStore = derived(subagentVersion, () =>\n stream.getActiveSubagents(),\n );\n\n const valuesRef = fromStore(valuesStore);\n const errorRef = fromStore(streamError);\n const isLoadingRef = fromStore(isLoading);\n const branchRef = fromStore(branch);\n const messagesRef = fromStore(messagesStore);\n const toolCallsRef = fromStore(toolCallsStore);\n const interruptRef = fromStore(interruptStore);\n const interruptsRef = fromStore(interruptsStore);\n const subagentsRef = fromStore(subagentsStore);\n const activeSubagentsRef = fromStore(activeSubagentsStore);\n const emptyEntriesRef = fromStore(emptyEntries);\n const emptySizeRef = fromStore(emptySize);\n\n return {\n get values() {\n return valuesRef.current;\n },\n get error() {\n return errorRef.current;\n },\n get isLoading() {\n return isLoadingRef.current;\n },\n\n stop,\n submit,\n switchThread,\n\n get branch() {\n return branchRef.current;\n },\n setBranch,\n getMessagesMetadata,\n\n queue: {\n get entries() {\n return emptyEntriesRef.current;\n },\n get size() {\n return emptySizeRef.current;\n },\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n get interrupt() {\n return interruptRef.current;\n },\n get interrupts() {\n return interruptsRef.current;\n },\n\n get messages() {\n return messagesRef.current;\n },\n get toolCalls() {\n return toolCallsRef.current;\n },\n getToolCalls,\n\n get subagents() {\n return subagentsRef.current;\n },\n get activeSubagents() {\n return activeSubagentsRef.current;\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.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { writable, derived, fromStore } from \"svelte/store\";\nimport { onDestroy } from \"svelte\";\nimport {\n CustomStreamOrchestrator,\n type AnyStreamCustomOptions,\n type CustomSubmitOptions,\n type GetUpdateType,\n type GetInterruptType,\n type GetConfigurableType,\n type MessageMetadata,\n} from \"@langchain/langgraph-sdk/ui\";\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 InterruptType = GetInterruptType<Bag>;\n type ConfigurableType = GetConfigurableType<Bag>;\n const orchestrator = new CustomStreamOrchestrator<StateType, Bag>(options);\n\n const version = writable(0);\n const branch = writable<string>(\"\");\n\n const unsubscribe = orchestrator.subscribe(() => {\n version.update((v) => v + 1);\n });\n\n onDestroy(() => {\n unsubscribe();\n orchestrator.dispose();\n });\n\n const valuesStore = derived(version, () => orchestrator.values);\n\n const messagesStore = derived(version, () => orchestrator.messages);\n\n const toolCallsStore = derived(version, () => orchestrator.toolCalls);\n\n const interruptStore = derived(\n version,\n () => orchestrator.interrupt as Interrupt<InterruptType> | undefined,\n );\n\n const interruptsStore = derived(\n version,\n () => orchestrator.interrupts as Interrupt<InterruptType>[],\n );\n\n const subagentsStore = derived(version, () => orchestrator.subagents);\n const activeSubagentsStore = derived(\n version,\n () => orchestrator.activeSubagents,\n );\n\n const emptyEntries = writable<never[]>([]);\n const emptySize = writable(0);\n\n const valuesRef = fromStore(valuesStore);\n const errorRef = fromStore(derived(version, () => orchestrator.error));\n const isLoadingRef = fromStore(\n derived(version, () => orchestrator.isLoading),\n );\n const branchRef = fromStore(branch);\n const messagesRef = fromStore(messagesStore);\n const toolCallsRef = fromStore(toolCallsStore);\n const interruptRef = fromStore(interruptStore);\n const interruptsRef = fromStore(interruptsStore);\n const subagentsRef = fromStore(subagentsStore);\n const activeSubagentsRef = fromStore(activeSubagentsStore);\n const emptyEntriesRef = fromStore(emptyEntries);\n const emptySizeRef = fromStore(emptySize);\n\n return {\n get values() {\n return valuesRef.current;\n },\n get error() {\n return errorRef.current;\n },\n get isLoading() {\n return isLoadingRef.current;\n },\n\n stop: () => orchestrator.stop(),\n\n async submit(\n values: UpdateType | null | undefined,\n submitOptions?: CustomSubmitOptions<StateType, ConfigurableType>,\n ) {\n await orchestrator.submit(values, submitOptions);\n },\n\n switchThread(newThreadId: string | null) {\n orchestrator.switchThread(newThreadId);\n },\n\n get branch() {\n return branchRef.current;\n },\n setBranch(value: string) {\n branch.set(value);\n orchestrator.setBranch(value);\n },\n\n getMessagesMetadata(\n message: Message,\n index?: number,\n ): MessageMetadata<StateType> | undefined {\n return orchestrator.getMessagesMetadata(message, index);\n },\n\n queue: {\n get entries() {\n return emptyEntriesRef.current;\n },\n get size() {\n return emptySizeRef.current;\n },\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n get interrupt() {\n return interruptRef.current;\n },\n get interrupts() {\n return interruptsRef.current;\n },\n\n get messages() {\n return messagesRef.current;\n },\n get toolCalls() {\n return toolCallsRef.current;\n },\n getToolCalls(message: Message) {\n return orchestrator.getToolCalls(message);\n },\n\n get subagents() {\n return subagentsRef.current;\n },\n get activeSubagents() {\n return activeSubagentsRef.current;\n },\n getSubagent(toolCallId: string) {\n return orchestrator.getSubagent(toolCallId);\n },\n getSubagentsByType(type: string) {\n return orchestrator.getSubagentsByType(type);\n },\n getSubagentsByMessage(messageId: string) {\n return orchestrator.getSubagentsByMessage(messageId);\n },\n };\n}\n"],"mappings":";;;;AAaA,SAAgB,gBAGd,SAAiD;CAIjD,MAAM,eAAe,IAAI,yBAAyC,QAAQ;CAE1E,MAAM,UAAU,SAAS,EAAE;CAC3B,MAAM,SAAS,SAAiB,GAAG;CAEnC,MAAM,cAAc,aAAa,gBAAgB;AAC/C,UAAQ,QAAQ,MAAM,IAAI,EAAE;GAC5B;AAEF,iBAAgB;AACd,eAAa;AACb,eAAa,SAAS;GACtB;CAEF,MAAM,cAAc,QAAQ,eAAe,aAAa,OAAO;CAE/D,MAAM,gBAAgB,QAAQ,eAAe,aAAa,SAAS;CAEnE,MAAM,iBAAiB,QAAQ,eAAe,aAAa,UAAU;CAErE,MAAM,iBAAiB,QACrB,eACM,aAAa,UACpB;CAED,MAAM,kBAAkB,QACtB,eACM,aAAa,WACpB;CAED,MAAM,iBAAiB,QAAQ,eAAe,aAAa,UAAU;CACrE,MAAM,uBAAuB,QAC3B,eACM,aAAa,gBACpB;CAED,MAAM,eAAe,SAAkB,EAAE,CAAC;CAC1C,MAAM,YAAY,SAAS,EAAE;CAE7B,MAAM,YAAY,UAAU,YAAY;CACxC,MAAM,WAAW,UAAU,QAAQ,eAAe,aAAa,MAAM,CAAC;CACtE,MAAM,eAAe,UACnB,QAAQ,eAAe,aAAa,UAAU,CAC/C;CACD,MAAM,YAAY,UAAU,OAAO;CACnC,MAAM,cAAc,UAAU,cAAc;CAC5C,MAAM,eAAe,UAAU,eAAe;CAC9C,MAAM,eAAe,UAAU,eAAe;CAC9C,MAAM,gBAAgB,UAAU,gBAAgB;CAChD,MAAM,eAAe,UAAU,eAAe;CAC9C,MAAM,qBAAqB,UAAU,qBAAqB;CAC1D,MAAM,kBAAkB,UAAU,aAAa;CAC/C,MAAM,eAAe,UAAU,UAAU;AAEzC,QAAO;EACL,IAAI,SAAS;AACX,UAAO,UAAU;;EAEnB,IAAI,QAAQ;AACV,UAAO,SAAS;;EAElB,IAAI,YAAY;AACd,UAAO,aAAa;;EAGtB,YAAY,aAAa,MAAM;EAE/B,MAAM,OACJ,QACA,eACA;AACA,SAAM,aAAa,OAAO,QAAQ,cAAc;;EAGlD,aAAa,aAA4B;AACvC,gBAAa,aAAa,YAAY;;EAGxC,IAAI,SAAS;AACX,UAAO,UAAU;;EAEnB,UAAU,OAAe;AACvB,UAAO,IAAI,MAAM;AACjB,gBAAa,UAAU,MAAM;;EAG/B,oBACE,SACA,OACwC;AACxC,UAAO,aAAa,oBAAoB,SAAS,MAAM;;EAGzD,OAAO;GACL,IAAI,UAAU;AACZ,WAAO,gBAAgB;;GAEzB,IAAI,OAAO;AACT,WAAO,aAAa;;GAEtB,MAAM,SAAS;AACb,WAAO;;GAET,MAAM,QAAQ;GACf;EAED,IAAI,YAAY;AACd,UAAO,aAAa;;EAEtB,IAAI,aAAa;AACf,UAAO,cAAc;;EAGvB,IAAI,WAAW;AACb,UAAO,YAAY;;EAErB,IAAI,YAAY;AACd,UAAO,aAAa;;EAEtB,aAAa,SAAkB;AAC7B,UAAO,aAAa,aAAa,QAAQ;;EAG3C,IAAI,YAAY;AACd,UAAO,aAAa;;EAEtB,IAAI,kBAAkB;AACpB,UAAO,mBAAmB;;EAE5B,YAAY,YAAoB;AAC9B,UAAO,aAAa,YAAY,WAAW;;EAE7C,mBAAmB,MAAc;AAC/B,UAAO,aAAa,mBAAmB,KAAK;;EAE9C,sBAAsB,WAAmB;AACvC,UAAO,aAAa,sBAAsB,UAAU;;EAEvD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/svelte",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Svelte integration for LangGraph & LangChain",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -10,7 +10,7 @@
10
10
  "directory": "libs/sdk-svelte"
11
11
  },
12
12
  "dependencies": {
13
- "@langchain/langgraph-sdk": "^1.7.5"
13
+ "@langchain/langgraph-sdk": "^1.8.1"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@hono/node-server": "^1.19.11",
@@ -37,7 +37,7 @@
37
37
  "vitest-browser-svelte": "^2.0.2",
38
38
  "webdriverio": "^9.25.0",
39
39
  "zod": "^4.3.6",
40
- "@langchain/langgraph": "^1.2.4",
40
+ "@langchain/langgraph": "^1.2.6",
41
41
  "@langchain/langgraph-api": "^1.1.16",
42
42
  "@langchain/langgraph-checkpoint": "^1.0.1"
43
43
  },
package/dist/context.cjs DELETED
@@ -1,86 +0,0 @@
1
- const require_index = require("./index.cjs");
2
- let svelte = require("svelte");
3
- //#region src/context.ts
4
- const STREAM_CONTEXT_KEY = Symbol("langchain-stream");
5
- /**
6
- * Creates a shared `useStream` instance and makes it available to all
7
- * descendant components via Svelte's `setContext`/`getContext`.
8
- *
9
- * Call this in a parent component's `<script>` block. Children access
10
- * the shared stream via `getStream()`.
11
- *
12
- * @example
13
- * ```svelte
14
- * <!-- ChatContainer.svelte -->
15
- * <script lang="ts">
16
- * import { provideStream } from "@langchain/svelte";
17
- *
18
- * provideStream({
19
- * assistantId: "agent",
20
- * apiUrl: "http://localhost:2024",
21
- * });
22
- * <\/script>
23
- *
24
- * <ChatHeader />
25
- * <MessageList />
26
- * <MessageInput />
27
- * ```
28
- *
29
- * @returns The stream instance (same as calling `useStream` directly).
30
- */
31
- function provideStream(options) {
32
- const stream = require_index.useStream(options);
33
- (0, svelte.setContext)(STREAM_CONTEXT_KEY, stream);
34
- return stream;
35
- }
36
- /**
37
- * Retrieves the shared stream instance from the nearest ancestor that
38
- * called `provideStream()`.
39
- *
40
- * Throws if no ancestor has provided a stream.
41
- *
42
- * @example
43
- * ```svelte
44
- * <!-- MessageList.svelte -->
45
- * <script lang="ts">
46
- * import { getStream } from "@langchain/svelte";
47
- *
48
- * const stream = getStream();
49
- * <\/script>
50
- *
51
- * {#each stream.messages as msg (msg.id)}
52
- * <div>{msg.content}</div>
53
- * {/each}
54
- * ```
55
- *
56
- * @example
57
- * ```svelte
58
- * <!-- MessageInput.svelte -->
59
- * <script lang="ts">
60
- * import { getStream } from "@langchain/svelte";
61
- *
62
- * const stream = getStream();
63
- * let input = $state("");
64
- *
65
- * function send() {
66
- * stream.submit({ messages: [{ type: "human", content: input }] });
67
- * input = "";
68
- * }
69
- * <\/script>
70
- *
71
- * <form onsubmit={send}>
72
- * <textarea bind:value={input}></textarea>
73
- * <button disabled={stream.isLoading} type="submit">Send</button>
74
- * </form>
75
- * ```
76
- */
77
- function getStream() {
78
- const context = (0, svelte.getContext)(STREAM_CONTEXT_KEY);
79
- if (context == null) throw new Error("getStream() requires a parent component to call provideStream(). Add provideStream({ assistantId: '...' }) in an ancestor component.");
80
- return context;
81
- }
82
- //#endregion
83
- exports.getStream = getStream;
84
- exports.provideStream = provideStream;
85
-
86
- //# sourceMappingURL=context.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.cjs","names":["useStream"],"sources":["../src/context.ts"],"sourcesContent":["import { setContext, getContext } from \"svelte\";\nimport type { BagTemplate } from \"@langchain/langgraph-sdk\";\nimport type {\n ResolveStreamOptions,\n InferBag,\n InferStateType,\n UseStreamCustomOptions,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { useStream } from \"./index.js\";\n\nconst STREAM_CONTEXT_KEY = Symbol(\"langchain-stream\");\n\n/**\n * Creates a shared `useStream` instance and makes it available to all\n * descendant components via Svelte's `setContext`/`getContext`.\n *\n * Call this in a parent component's `<script>` block. Children access\n * the shared stream via `getStream()`.\n *\n * @example\n * ```svelte\n * <!-- ChatContainer.svelte -->\n * <script lang=\"ts\">\n * import { provideStream } from \"@langchain/svelte\";\n *\n * provideStream({\n * assistantId: \"agent\",\n * apiUrl: \"http://localhost:2024\",\n * });\n * </script>\n *\n * <ChatHeader />\n * <MessageList />\n * <MessageInput />\n * ```\n *\n * @returns The stream instance (same as calling `useStream` directly).\n */\nexport function provideStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options:\n | ResolveStreamOptions<T, InferBag<T, Bag>>\n | UseStreamCustomOptions<InferStateType<T>, InferBag<T, Bag>>,\n): ReturnType<typeof useStream<T, Bag>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const stream = useStream<T, Bag>(options as any);\n setContext(STREAM_CONTEXT_KEY, stream);\n return stream;\n}\n\n/**\n * Retrieves the shared stream instance from the nearest ancestor that\n * called `provideStream()`.\n *\n * Throws if no ancestor has provided a stream.\n *\n * @example\n * ```svelte\n * <!-- MessageList.svelte -->\n * <script lang=\"ts\">\n * import { getStream } from \"@langchain/svelte\";\n *\n * const stream = getStream();\n * </script>\n *\n * {#each stream.messages as msg (msg.id)}\n * <div>{msg.content}</div>\n * {/each}\n * ```\n *\n * @example\n * ```svelte\n * <!-- MessageInput.svelte -->\n * <script lang=\"ts\">\n * import { getStream } from \"@langchain/svelte\";\n *\n * const stream = getStream();\n * let input = $state(\"\");\n *\n * function send() {\n * stream.submit({ messages: [{ type: \"human\", content: input }] });\n * input = \"\";\n * }\n * </script>\n *\n * <form onsubmit={send}>\n * <textarea bind:value={input}></textarea>\n * <button disabled={stream.isLoading} type=\"submit\">Send</button>\n * </form>\n * ```\n */\nexport function getStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(): ReturnType<typeof useStream<T, Bag>> {\n const context = getContext(STREAM_CONTEXT_KEY);\n if (context == null) {\n throw new Error(\n \"getStream() requires a parent component to call provideStream(). \" +\n \"Add provideStream({ assistantId: '...' }) in an ancestor component.\",\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return context as any;\n}\n"],"mappings":";;;AAUA,MAAM,qBAAqB,OAAO,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BrD,SAAgB,cAId,SAGsC;CAEtC,MAAM,SAASA,cAAAA,UAAkB,QAAe;AAChD,EAAA,GAAA,OAAA,YAAW,oBAAoB,OAAO;AACtC,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CT,SAAgB,YAG0B;CACxC,MAAM,WAAA,GAAA,OAAA,YAAqB,mBAAmB;AAC9C,KAAI,WAAW,KACb,OAAM,IAAI,MACR,uIAED;AAGH,QAAO"}
@@ -1,77 +0,0 @@
1
- import { useStream } from "./index.cjs";
2
- import { InferBag, InferStateType, ResolveStreamOptions, UseStreamCustomOptions } from "@langchain/langgraph-sdk/ui";
3
- import { BagTemplate } from "@langchain/langgraph-sdk";
4
-
5
- //#region src/context.d.ts
6
- /**
7
- * Creates a shared `useStream` instance and makes it available to all
8
- * descendant components via Svelte's `setContext`/`getContext`.
9
- *
10
- * Call this in a parent component's `<script>` block. Children access
11
- * the shared stream via `getStream()`.
12
- *
13
- * @example
14
- * ```svelte
15
- * <!-- ChatContainer.svelte -->
16
- * <script lang="ts">
17
- * import { provideStream } from "@langchain/svelte";
18
- *
19
- * provideStream({
20
- * assistantId: "agent",
21
- * apiUrl: "http://localhost:2024",
22
- * });
23
- * </script>
24
- *
25
- * <ChatHeader />
26
- * <MessageList />
27
- * <MessageInput />
28
- * ```
29
- *
30
- * @returns The stream instance (same as calling `useStream` directly).
31
- */
32
- declare function provideStream<T = Record<string, unknown>, Bag extends BagTemplate = BagTemplate>(options: ResolveStreamOptions<T, InferBag<T, Bag>> | UseStreamCustomOptions<InferStateType<T>, InferBag<T, Bag>>): ReturnType<typeof useStream<T, Bag>>;
33
- /**
34
- * Retrieves the shared stream instance from the nearest ancestor that
35
- * called `provideStream()`.
36
- *
37
- * Throws if no ancestor has provided a stream.
38
- *
39
- * @example
40
- * ```svelte
41
- * <!-- MessageList.svelte -->
42
- * <script lang="ts">
43
- * import { getStream } from "@langchain/svelte";
44
- *
45
- * const stream = getStream();
46
- * </script>
47
- *
48
- * {#each stream.messages as msg (msg.id)}
49
- * <div>{msg.content}</div>
50
- * {/each}
51
- * ```
52
- *
53
- * @example
54
- * ```svelte
55
- * <!-- MessageInput.svelte -->
56
- * <script lang="ts">
57
- * import { getStream } from "@langchain/svelte";
58
- *
59
- * const stream = getStream();
60
- * let input = $state("");
61
- *
62
- * function send() {
63
- * stream.submit({ messages: [{ type: "human", content: input }] });
64
- * input = "";
65
- * }
66
- * </script>
67
- *
68
- * <form onsubmit={send}>
69
- * <textarea bind:value={input}></textarea>
70
- * <button disabled={stream.isLoading} type="submit">Send</button>
71
- * </form>
72
- * ```
73
- */
74
- declare function getStream<T = Record<string, unknown>, Bag extends BagTemplate = BagTemplate>(): ReturnType<typeof useStream<T, Bag>>;
75
- //#endregion
76
- export { getStream, provideStream };
77
- //# sourceMappingURL=context.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.cts","names":[],"sources":["../src/context.ts"],"mappings":";;;;;;;AAsCA;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,aAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EACI,oBAAA,CAAqB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA,KACpC,sBAAA,CAAuB,cAAA,CAAe,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,GAAA,KACzD,UAAA,QAAkB,SAAA,CAAU,CAAA,EAAG,GAAA;;;;;;;;;;;;;;;;;;;;;;AAgDlC;;;;;;;;;;;;;;;;;;;;iBAAgB,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAAA,GACvB,UAAA,QAAkB,SAAA,CAAU,CAAA,EAAG,GAAA"}
package/dist/context.d.ts DELETED
@@ -1,77 +0,0 @@
1
- import { useStream } from "./index.js";
2
- import { InferBag, InferStateType, ResolveStreamOptions, UseStreamCustomOptions } from "@langchain/langgraph-sdk/ui";
3
- import { BagTemplate } from "@langchain/langgraph-sdk";
4
-
5
- //#region src/context.d.ts
6
- /**
7
- * Creates a shared `useStream` instance and makes it available to all
8
- * descendant components via Svelte's `setContext`/`getContext`.
9
- *
10
- * Call this in a parent component's `<script>` block. Children access
11
- * the shared stream via `getStream()`.
12
- *
13
- * @example
14
- * ```svelte
15
- * <!-- ChatContainer.svelte -->
16
- * <script lang="ts">
17
- * import { provideStream } from "@langchain/svelte";
18
- *
19
- * provideStream({
20
- * assistantId: "agent",
21
- * apiUrl: "http://localhost:2024",
22
- * });
23
- * </script>
24
- *
25
- * <ChatHeader />
26
- * <MessageList />
27
- * <MessageInput />
28
- * ```
29
- *
30
- * @returns The stream instance (same as calling `useStream` directly).
31
- */
32
- declare function provideStream<T = Record<string, unknown>, Bag extends BagTemplate = BagTemplate>(options: ResolveStreamOptions<T, InferBag<T, Bag>> | UseStreamCustomOptions<InferStateType<T>, InferBag<T, Bag>>): ReturnType<typeof useStream<T, Bag>>;
33
- /**
34
- * Retrieves the shared stream instance from the nearest ancestor that
35
- * called `provideStream()`.
36
- *
37
- * Throws if no ancestor has provided a stream.
38
- *
39
- * @example
40
- * ```svelte
41
- * <!-- MessageList.svelte -->
42
- * <script lang="ts">
43
- * import { getStream } from "@langchain/svelte";
44
- *
45
- * const stream = getStream();
46
- * </script>
47
- *
48
- * {#each stream.messages as msg (msg.id)}
49
- * <div>{msg.content}</div>
50
- * {/each}
51
- * ```
52
- *
53
- * @example
54
- * ```svelte
55
- * <!-- MessageInput.svelte -->
56
- * <script lang="ts">
57
- * import { getStream } from "@langchain/svelte";
58
- *
59
- * const stream = getStream();
60
- * let input = $state("");
61
- *
62
- * function send() {
63
- * stream.submit({ messages: [{ type: "human", content: input }] });
64
- * input = "";
65
- * }
66
- * </script>
67
- *
68
- * <form onsubmit={send}>
69
- * <textarea bind:value={input}></textarea>
70
- * <button disabled={stream.isLoading} type="submit">Send</button>
71
- * </form>
72
- * ```
73
- */
74
- declare function getStream<T = Record<string, unknown>, Bag extends BagTemplate = BagTemplate>(): ReturnType<typeof useStream<T, Bag>>;
75
- //#endregion
76
- export { getStream, provideStream };
77
- //# sourceMappingURL=context.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","names":[],"sources":["../src/context.ts"],"mappings":";;;;;;;AAsCA;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,aAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAE1B,OAAA,EACI,oBAAA,CAAqB,CAAA,EAAG,QAAA,CAAS,CAAA,EAAG,GAAA,KACpC,sBAAA,CAAuB,cAAA,CAAe,CAAA,GAAI,QAAA,CAAS,CAAA,EAAG,GAAA,KACzD,UAAA,QAAkB,SAAA,CAAU,CAAA,EAAG,GAAA;;;;;;;;;;;;;;;;;;;;;;AAgDlC;;;;;;;;;;;;;;;;;;;;iBAAgB,SAAA,KACV,MAAA,+BACQ,WAAA,GAAc,WAAA,CAAA,CAAA,GACvB,UAAA,QAAkB,SAAA,CAAU,CAAA,EAAG,GAAA"}
package/dist/context.js DELETED
@@ -1,85 +0,0 @@
1
- import { useStream } from "./index.js";
2
- import { getContext, setContext } from "svelte";
3
- //#region src/context.ts
4
- const STREAM_CONTEXT_KEY = Symbol("langchain-stream");
5
- /**
6
- * Creates a shared `useStream` instance and makes it available to all
7
- * descendant components via Svelte's `setContext`/`getContext`.
8
- *
9
- * Call this in a parent component's `<script>` block. Children access
10
- * the shared stream via `getStream()`.
11
- *
12
- * @example
13
- * ```svelte
14
- * <!-- ChatContainer.svelte -->
15
- * <script lang="ts">
16
- * import { provideStream } from "@langchain/svelte";
17
- *
18
- * provideStream({
19
- * assistantId: "agent",
20
- * apiUrl: "http://localhost:2024",
21
- * });
22
- * <\/script>
23
- *
24
- * <ChatHeader />
25
- * <MessageList />
26
- * <MessageInput />
27
- * ```
28
- *
29
- * @returns The stream instance (same as calling `useStream` directly).
30
- */
31
- function provideStream(options) {
32
- const stream = useStream(options);
33
- setContext(STREAM_CONTEXT_KEY, stream);
34
- return stream;
35
- }
36
- /**
37
- * Retrieves the shared stream instance from the nearest ancestor that
38
- * called `provideStream()`.
39
- *
40
- * Throws if no ancestor has provided a stream.
41
- *
42
- * @example
43
- * ```svelte
44
- * <!-- MessageList.svelte -->
45
- * <script lang="ts">
46
- * import { getStream } from "@langchain/svelte";
47
- *
48
- * const stream = getStream();
49
- * <\/script>
50
- *
51
- * {#each stream.messages as msg (msg.id)}
52
- * <div>{msg.content}</div>
53
- * {/each}
54
- * ```
55
- *
56
- * @example
57
- * ```svelte
58
- * <!-- MessageInput.svelte -->
59
- * <script lang="ts">
60
- * import { getStream } from "@langchain/svelte";
61
- *
62
- * const stream = getStream();
63
- * let input = $state("");
64
- *
65
- * function send() {
66
- * stream.submit({ messages: [{ type: "human", content: input }] });
67
- * input = "";
68
- * }
69
- * <\/script>
70
- *
71
- * <form onsubmit={send}>
72
- * <textarea bind:value={input}></textarea>
73
- * <button disabled={stream.isLoading} type="submit">Send</button>
74
- * </form>
75
- * ```
76
- */
77
- function getStream() {
78
- const context = getContext(STREAM_CONTEXT_KEY);
79
- if (context == null) throw new Error("getStream() requires a parent component to call provideStream(). Add provideStream({ assistantId: '...' }) in an ancestor component.");
80
- return context;
81
- }
82
- //#endregion
83
- export { getStream, provideStream };
84
-
85
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../src/context.ts"],"sourcesContent":["import { setContext, getContext } from \"svelte\";\nimport type { BagTemplate } from \"@langchain/langgraph-sdk\";\nimport type {\n ResolveStreamOptions,\n InferBag,\n InferStateType,\n UseStreamCustomOptions,\n} from \"@langchain/langgraph-sdk/ui\";\nimport { useStream } from \"./index.js\";\n\nconst STREAM_CONTEXT_KEY = Symbol(\"langchain-stream\");\n\n/**\n * Creates a shared `useStream` instance and makes it available to all\n * descendant components via Svelte's `setContext`/`getContext`.\n *\n * Call this in a parent component's `<script>` block. Children access\n * the shared stream via `getStream()`.\n *\n * @example\n * ```svelte\n * <!-- ChatContainer.svelte -->\n * <script lang=\"ts\">\n * import { provideStream } from \"@langchain/svelte\";\n *\n * provideStream({\n * assistantId: \"agent\",\n * apiUrl: \"http://localhost:2024\",\n * });\n * </script>\n *\n * <ChatHeader />\n * <MessageList />\n * <MessageInput />\n * ```\n *\n * @returns The stream instance (same as calling `useStream` directly).\n */\nexport function provideStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(\n options:\n | ResolveStreamOptions<T, InferBag<T, Bag>>\n | UseStreamCustomOptions<InferStateType<T>, InferBag<T, Bag>>,\n): ReturnType<typeof useStream<T, Bag>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const stream = useStream<T, Bag>(options as any);\n setContext(STREAM_CONTEXT_KEY, stream);\n return stream;\n}\n\n/**\n * Retrieves the shared stream instance from the nearest ancestor that\n * called `provideStream()`.\n *\n * Throws if no ancestor has provided a stream.\n *\n * @example\n * ```svelte\n * <!-- MessageList.svelte -->\n * <script lang=\"ts\">\n * import { getStream } from \"@langchain/svelte\";\n *\n * const stream = getStream();\n * </script>\n *\n * {#each stream.messages as msg (msg.id)}\n * <div>{msg.content}</div>\n * {/each}\n * ```\n *\n * @example\n * ```svelte\n * <!-- MessageInput.svelte -->\n * <script lang=\"ts\">\n * import { getStream } from \"@langchain/svelte\";\n *\n * const stream = getStream();\n * let input = $state(\"\");\n *\n * function send() {\n * stream.submit({ messages: [{ type: \"human\", content: input }] });\n * input = \"\";\n * }\n * </script>\n *\n * <form onsubmit={send}>\n * <textarea bind:value={input}></textarea>\n * <button disabled={stream.isLoading} type=\"submit\">Send</button>\n * </form>\n * ```\n */\nexport function getStream<\n T = Record<string, unknown>,\n Bag extends BagTemplate = BagTemplate,\n>(): ReturnType<typeof useStream<T, Bag>> {\n const context = getContext(STREAM_CONTEXT_KEY);\n if (context == null) {\n throw new Error(\n \"getStream() requires a parent component to call provideStream(). \" +\n \"Add provideStream({ assistantId: '...' }) in an ancestor component.\",\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return context as any;\n}\n"],"mappings":";;;AAUA,MAAM,qBAAqB,OAAO,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BrD,SAAgB,cAId,SAGsC;CAEtC,MAAM,SAAS,UAAkB,QAAe;AAChD,YAAW,oBAAoB,OAAO;AACtC,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CT,SAAgB,YAG0B;CACxC,MAAM,UAAU,WAAW,mBAAmB;AAC9C,KAAI,WAAW,KACb,OAAM,IAAI,MACR,uIAED;AAGH,QAAO"}