@langchain/svelte 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +258 -0
- package/dist/index.cjs +491 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +24 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +459 -0
- package/dist/index.js.map +1 -0
- package/dist/stream.custom.cjs +160 -0
- package/dist/stream.custom.cjs.map +1 -0
- package/dist/stream.custom.js +160 -0
- package/dist/stream.custom.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
let svelte_store = require("svelte/store");
|
|
2
|
+
let svelte = require("svelte");
|
|
3
|
+
let _langchain_langgraph_sdk_ui = require("@langchain/langgraph-sdk/ui");
|
|
4
|
+
let _langchain_langgraph_sdk_utils = require("@langchain/langgraph-sdk/utils");
|
|
5
|
+
|
|
6
|
+
//#region src/stream.custom.ts
|
|
7
|
+
function useStreamCustom(options) {
|
|
8
|
+
const stream = new _langchain_langgraph_sdk_ui.StreamManager(new _langchain_langgraph_sdk_ui.MessageTupleManager(), {
|
|
9
|
+
throttle: options.throttle ?? false,
|
|
10
|
+
subagentToolNames: options.subagentToolNames,
|
|
11
|
+
filterSubagentMessages: options.filterSubagentMessages,
|
|
12
|
+
toMessage: _langchain_langgraph_sdk_ui.toMessageClass
|
|
13
|
+
});
|
|
14
|
+
let threadId = options.threadId ?? null;
|
|
15
|
+
const streamValues = (0, svelte_store.writable)(stream.values);
|
|
16
|
+
const streamError = (0, svelte_store.writable)(stream.error);
|
|
17
|
+
const isLoading = (0, svelte_store.writable)(stream.isLoading);
|
|
18
|
+
const unsubscribe = stream.subscribe(() => {
|
|
19
|
+
streamValues.set(stream.values);
|
|
20
|
+
streamError.set(stream.error);
|
|
21
|
+
isLoading.set(stream.isLoading);
|
|
22
|
+
});
|
|
23
|
+
(0, svelte.onDestroy)(() => {
|
|
24
|
+
unsubscribe();
|
|
25
|
+
});
|
|
26
|
+
const getMessages = (value) => {
|
|
27
|
+
const messagesKey = options.messagesKey ?? "messages";
|
|
28
|
+
return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
|
|
29
|
+
};
|
|
30
|
+
const setMessages = (current, messages) => {
|
|
31
|
+
const messagesKey = options.messagesKey ?? "messages";
|
|
32
|
+
return {
|
|
33
|
+
...current,
|
|
34
|
+
[messagesKey]: messages
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
const historyValues = options.initialValues ?? {};
|
|
38
|
+
const historyMessages = getMessages(historyValues);
|
|
39
|
+
if (options.filterSubagentMessages && !stream.isLoading && historyMessages.length > 0) stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });
|
|
40
|
+
function switchThread(newThreadId) {
|
|
41
|
+
if (newThreadId !== threadId) {
|
|
42
|
+
threadId = newThreadId;
|
|
43
|
+
stream.clear();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function stop() {
|
|
47
|
+
return stream.stop(historyValues, { onStop: options.onStop });
|
|
48
|
+
}
|
|
49
|
+
async function submitDirect(values, submitOptions) {
|
|
50
|
+
const currentThreadId = options.threadId ?? null;
|
|
51
|
+
if (currentThreadId !== threadId) {
|
|
52
|
+
threadId = currentThreadId;
|
|
53
|
+
stream.clear();
|
|
54
|
+
}
|
|
55
|
+
let usableThreadId = threadId;
|
|
56
|
+
stream.setStreamValues(() => {
|
|
57
|
+
if (submitOptions?.optimisticValues != null) return {
|
|
58
|
+
...historyValues,
|
|
59
|
+
...typeof submitOptions.optimisticValues === "function" ? submitOptions.optimisticValues(historyValues) : submitOptions.optimisticValues
|
|
60
|
+
};
|
|
61
|
+
return { ...historyValues };
|
|
62
|
+
});
|
|
63
|
+
await stream.start(async (signal) => {
|
|
64
|
+
if (!usableThreadId) {
|
|
65
|
+
usableThreadId = crypto.randomUUID();
|
|
66
|
+
threadId = usableThreadId;
|
|
67
|
+
options.onThreadId?.(usableThreadId);
|
|
68
|
+
}
|
|
69
|
+
if (!usableThreadId) throw new Error("Failed to obtain valid thread ID.");
|
|
70
|
+
return options.transport.stream({
|
|
71
|
+
input: values,
|
|
72
|
+
context: submitOptions?.context,
|
|
73
|
+
command: submitOptions?.command,
|
|
74
|
+
signal,
|
|
75
|
+
config: {
|
|
76
|
+
...submitOptions?.config,
|
|
77
|
+
configurable: {
|
|
78
|
+
thread_id: usableThreadId,
|
|
79
|
+
...submitOptions?.config?.configurable
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}, {
|
|
84
|
+
getMessages,
|
|
85
|
+
setMessages,
|
|
86
|
+
initialValues: {},
|
|
87
|
+
callbacks: options,
|
|
88
|
+
onSuccess: () => void 0,
|
|
89
|
+
onError(error) {
|
|
90
|
+
options.onError?.(error, void 0);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async function submit(values, submitOptions) {
|
|
95
|
+
await submitDirect(values, submitOptions);
|
|
96
|
+
}
|
|
97
|
+
const values = (0, svelte_store.derived)([streamValues], ([$streamValues]) => $streamValues ?? {});
|
|
98
|
+
const messages = (0, svelte_store.derived)([streamValues], ([$streamValues]) => {
|
|
99
|
+
if (!$streamValues) return [];
|
|
100
|
+
return getMessages($streamValues);
|
|
101
|
+
});
|
|
102
|
+
const toolCalls = (0, svelte_store.derived)([streamValues], ([$streamValues]) => {
|
|
103
|
+
if (!$streamValues) return [];
|
|
104
|
+
return (0, _langchain_langgraph_sdk_utils.getToolCallsWithResults)(getMessages($streamValues));
|
|
105
|
+
});
|
|
106
|
+
const interrupt = (0, svelte_store.derived)([streamValues], ([$streamValues]) => (0, _langchain_langgraph_sdk_ui.extractInterrupts)($streamValues));
|
|
107
|
+
const interrupts = (0, svelte_store.derived)([streamValues], ([$streamValues]) => {
|
|
108
|
+
if ($streamValues != null && "__interrupt__" in $streamValues && Array.isArray($streamValues.__interrupt__)) {
|
|
109
|
+
const valueInterrupts = $streamValues.__interrupt__;
|
|
110
|
+
if (valueInterrupts.length === 0) return [{ when: "breakpoint" }];
|
|
111
|
+
return valueInterrupts;
|
|
112
|
+
}
|
|
113
|
+
return [];
|
|
114
|
+
});
|
|
115
|
+
function getToolCalls(message) {
|
|
116
|
+
const $streamValues = (0, svelte_store.get)(streamValues);
|
|
117
|
+
if (!$streamValues) return [];
|
|
118
|
+
return (0, _langchain_langgraph_sdk_utils.getToolCallsWithResults)(getMessages($streamValues)).filter((tc) => tc.aiMessage.id === message.id);
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
values,
|
|
122
|
+
error: streamError,
|
|
123
|
+
isLoading,
|
|
124
|
+
stop,
|
|
125
|
+
submit,
|
|
126
|
+
switchThread,
|
|
127
|
+
queue: {
|
|
128
|
+
entries: (0, svelte_store.writable)([]),
|
|
129
|
+
size: (0, svelte_store.writable)(0),
|
|
130
|
+
async cancel() {
|
|
131
|
+
return false;
|
|
132
|
+
},
|
|
133
|
+
async clear() {}
|
|
134
|
+
},
|
|
135
|
+
interrupt,
|
|
136
|
+
interrupts,
|
|
137
|
+
messages,
|
|
138
|
+
toolCalls,
|
|
139
|
+
getToolCalls,
|
|
140
|
+
get subagents() {
|
|
141
|
+
return stream.getSubagents();
|
|
142
|
+
},
|
|
143
|
+
get activeSubagents() {
|
|
144
|
+
return stream.getActiveSubagents();
|
|
145
|
+
},
|
|
146
|
+
getSubagent(toolCallId) {
|
|
147
|
+
return stream.getSubagent(toolCallId);
|
|
148
|
+
},
|
|
149
|
+
getSubagentsByType(type) {
|
|
150
|
+
return stream.getSubagentsByType(type);
|
|
151
|
+
},
|
|
152
|
+
getSubagentsByMessage(messageId) {
|
|
153
|
+
return stream.getSubagentsByMessage(messageId);
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
//#endregion
|
|
159
|
+
exports.useStreamCustom = useStreamCustom;
|
|
160
|
+
//# sourceMappingURL=stream.custom.cjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { derived, get, writable } from "svelte/store";
|
|
2
|
+
import { onDestroy } from "svelte";
|
|
3
|
+
import { MessageTupleManager, StreamManager, extractInterrupts, toMessageClass } from "@langchain/langgraph-sdk/ui";
|
|
4
|
+
import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
|
|
5
|
+
|
|
6
|
+
//#region src/stream.custom.ts
|
|
7
|
+
function useStreamCustom(options) {
|
|
8
|
+
const stream = new StreamManager(new MessageTupleManager(), {
|
|
9
|
+
throttle: options.throttle ?? false,
|
|
10
|
+
subagentToolNames: options.subagentToolNames,
|
|
11
|
+
filterSubagentMessages: options.filterSubagentMessages,
|
|
12
|
+
toMessage: toMessageClass
|
|
13
|
+
});
|
|
14
|
+
let threadId = options.threadId ?? null;
|
|
15
|
+
const streamValues = writable(stream.values);
|
|
16
|
+
const streamError = writable(stream.error);
|
|
17
|
+
const isLoading = writable(stream.isLoading);
|
|
18
|
+
const unsubscribe = stream.subscribe(() => {
|
|
19
|
+
streamValues.set(stream.values);
|
|
20
|
+
streamError.set(stream.error);
|
|
21
|
+
isLoading.set(stream.isLoading);
|
|
22
|
+
});
|
|
23
|
+
onDestroy(() => {
|
|
24
|
+
unsubscribe();
|
|
25
|
+
});
|
|
26
|
+
const getMessages = (value) => {
|
|
27
|
+
const messagesKey = options.messagesKey ?? "messages";
|
|
28
|
+
return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
|
|
29
|
+
};
|
|
30
|
+
const setMessages = (current, messages) => {
|
|
31
|
+
const messagesKey = options.messagesKey ?? "messages";
|
|
32
|
+
return {
|
|
33
|
+
...current,
|
|
34
|
+
[messagesKey]: messages
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
const historyValues = options.initialValues ?? {};
|
|
38
|
+
const historyMessages = getMessages(historyValues);
|
|
39
|
+
if (options.filterSubagentMessages && !stream.isLoading && historyMessages.length > 0) stream.reconstructSubagents(historyMessages, { skipIfPopulated: true });
|
|
40
|
+
function switchThread(newThreadId) {
|
|
41
|
+
if (newThreadId !== threadId) {
|
|
42
|
+
threadId = newThreadId;
|
|
43
|
+
stream.clear();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function stop() {
|
|
47
|
+
return stream.stop(historyValues, { onStop: options.onStop });
|
|
48
|
+
}
|
|
49
|
+
async function submitDirect(values, submitOptions) {
|
|
50
|
+
const currentThreadId = options.threadId ?? null;
|
|
51
|
+
if (currentThreadId !== threadId) {
|
|
52
|
+
threadId = currentThreadId;
|
|
53
|
+
stream.clear();
|
|
54
|
+
}
|
|
55
|
+
let usableThreadId = threadId;
|
|
56
|
+
stream.setStreamValues(() => {
|
|
57
|
+
if (submitOptions?.optimisticValues != null) return {
|
|
58
|
+
...historyValues,
|
|
59
|
+
...typeof submitOptions.optimisticValues === "function" ? submitOptions.optimisticValues(historyValues) : submitOptions.optimisticValues
|
|
60
|
+
};
|
|
61
|
+
return { ...historyValues };
|
|
62
|
+
});
|
|
63
|
+
await stream.start(async (signal) => {
|
|
64
|
+
if (!usableThreadId) {
|
|
65
|
+
usableThreadId = crypto.randomUUID();
|
|
66
|
+
threadId = usableThreadId;
|
|
67
|
+
options.onThreadId?.(usableThreadId);
|
|
68
|
+
}
|
|
69
|
+
if (!usableThreadId) throw new Error("Failed to obtain valid thread ID.");
|
|
70
|
+
return options.transport.stream({
|
|
71
|
+
input: values,
|
|
72
|
+
context: submitOptions?.context,
|
|
73
|
+
command: submitOptions?.command,
|
|
74
|
+
signal,
|
|
75
|
+
config: {
|
|
76
|
+
...submitOptions?.config,
|
|
77
|
+
configurable: {
|
|
78
|
+
thread_id: usableThreadId,
|
|
79
|
+
...submitOptions?.config?.configurable
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}, {
|
|
84
|
+
getMessages,
|
|
85
|
+
setMessages,
|
|
86
|
+
initialValues: {},
|
|
87
|
+
callbacks: options,
|
|
88
|
+
onSuccess: () => void 0,
|
|
89
|
+
onError(error) {
|
|
90
|
+
options.onError?.(error, void 0);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
async function submit(values, submitOptions) {
|
|
95
|
+
await submitDirect(values, submitOptions);
|
|
96
|
+
}
|
|
97
|
+
const values = derived([streamValues], ([$streamValues]) => $streamValues ?? {});
|
|
98
|
+
const messages = derived([streamValues], ([$streamValues]) => {
|
|
99
|
+
if (!$streamValues) return [];
|
|
100
|
+
return getMessages($streamValues);
|
|
101
|
+
});
|
|
102
|
+
const toolCalls = derived([streamValues], ([$streamValues]) => {
|
|
103
|
+
if (!$streamValues) return [];
|
|
104
|
+
return getToolCallsWithResults(getMessages($streamValues));
|
|
105
|
+
});
|
|
106
|
+
const interrupt = derived([streamValues], ([$streamValues]) => extractInterrupts($streamValues));
|
|
107
|
+
const interrupts = derived([streamValues], ([$streamValues]) => {
|
|
108
|
+
if ($streamValues != null && "__interrupt__" in $streamValues && Array.isArray($streamValues.__interrupt__)) {
|
|
109
|
+
const valueInterrupts = $streamValues.__interrupt__;
|
|
110
|
+
if (valueInterrupts.length === 0) return [{ when: "breakpoint" }];
|
|
111
|
+
return valueInterrupts;
|
|
112
|
+
}
|
|
113
|
+
return [];
|
|
114
|
+
});
|
|
115
|
+
function getToolCalls(message) {
|
|
116
|
+
const $streamValues = get(streamValues);
|
|
117
|
+
if (!$streamValues) return [];
|
|
118
|
+
return getToolCallsWithResults(getMessages($streamValues)).filter((tc) => tc.aiMessage.id === message.id);
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
values,
|
|
122
|
+
error: streamError,
|
|
123
|
+
isLoading,
|
|
124
|
+
stop,
|
|
125
|
+
submit,
|
|
126
|
+
switchThread,
|
|
127
|
+
queue: {
|
|
128
|
+
entries: writable([]),
|
|
129
|
+
size: writable(0),
|
|
130
|
+
async cancel() {
|
|
131
|
+
return false;
|
|
132
|
+
},
|
|
133
|
+
async clear() {}
|
|
134
|
+
},
|
|
135
|
+
interrupt,
|
|
136
|
+
interrupts,
|
|
137
|
+
messages,
|
|
138
|
+
toolCalls,
|
|
139
|
+
getToolCalls,
|
|
140
|
+
get subagents() {
|
|
141
|
+
return stream.getSubagents();
|
|
142
|
+
},
|
|
143
|
+
get activeSubagents() {
|
|
144
|
+
return stream.getActiveSubagents();
|
|
145
|
+
},
|
|
146
|
+
getSubagent(toolCallId) {
|
|
147
|
+
return stream.getSubagent(toolCallId);
|
|
148
|
+
},
|
|
149
|
+
getSubagentsByType(type) {
|
|
150
|
+
return stream.getSubagentsByType(type);
|
|
151
|
+
},
|
|
152
|
+
getSubagentsByMessage(messageId) {
|
|
153
|
+
return stream.getSubagentsByMessage(messageId);
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
//#endregion
|
|
159
|
+
export { useStreamCustom };
|
|
160
|
+
//# sourceMappingURL=stream.custom.js.map
|
|
@@ -0,0 +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":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@langchain/svelte",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Svelte integration for LangGraph & LangChain",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"@langchain/langgraph-sdk": "^1.6.5"
|
|
9
|
+
},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"@hono/node-server": "^1.14.1",
|
|
12
|
+
"@langchain/core": "^1.1.27",
|
|
13
|
+
"@langchain/scripts": "^0.1.4",
|
|
14
|
+
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
|
15
|
+
"@tsconfig/recommended": "^1.0.2",
|
|
16
|
+
"@types/node": "^18.15.11",
|
|
17
|
+
"@types/uuid": "^9.0.1",
|
|
18
|
+
"@typescript-eslint/eslint-plugin": "^6.12.0",
|
|
19
|
+
"@typescript-eslint/parser": "^6.12.0",
|
|
20
|
+
"@vitest/browser": "^3.2.4",
|
|
21
|
+
"deepagents": "^1.8.0",
|
|
22
|
+
"eslint": "^8.33.0",
|
|
23
|
+
"eslint-config-airbnb-base": "^15.0.0",
|
|
24
|
+
"eslint-config-prettier": "^8.6.0",
|
|
25
|
+
"eslint-plugin-import": "^2.29.1",
|
|
26
|
+
"eslint-plugin-no-instanceof": "^1.0.1",
|
|
27
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
28
|
+
"hono": "^4.7.10",
|
|
29
|
+
"langchain": "^1.2.25",
|
|
30
|
+
"prettier": "^3.8.1",
|
|
31
|
+
"svelte": "^5.43.6",
|
|
32
|
+
"typescript": "^4.9.5 || ^5.4.5",
|
|
33
|
+
"vitest": "^3.2.4",
|
|
34
|
+
"vitest-browser-svelte": "^1.1.0",
|
|
35
|
+
"webdriverio": "^9.15.0",
|
|
36
|
+
"zod": "^4.3.6",
|
|
37
|
+
"@langchain/langgraph-checkpoint": "^1.0.0",
|
|
38
|
+
"@langchain/langgraph-api": "^1.1.14",
|
|
39
|
+
"@langchain/langgraph": "^1.2.0"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@langchain/core": "^1.1.27",
|
|
43
|
+
"svelte": "^4.0.0 || ^5.0.0"
|
|
44
|
+
},
|
|
45
|
+
"main": "./dist/index.js",
|
|
46
|
+
"types": "./dist/index.d.ts",
|
|
47
|
+
"exports": {
|
|
48
|
+
".": {
|
|
49
|
+
"input": "./src/index.ts",
|
|
50
|
+
"typedoc": "./src/index.ts",
|
|
51
|
+
"import": {
|
|
52
|
+
"types": "./dist/index.d.ts",
|
|
53
|
+
"default": "./dist/index.js"
|
|
54
|
+
},
|
|
55
|
+
"require": {
|
|
56
|
+
"types": "./dist/index.d.cts",
|
|
57
|
+
"default": "./dist/index.cjs"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"./package.json": "./package.json"
|
|
61
|
+
},
|
|
62
|
+
"files": [
|
|
63
|
+
"dist/"
|
|
64
|
+
],
|
|
65
|
+
"scripts": {
|
|
66
|
+
"clean": "rm -rf dist/ dist-cjs/",
|
|
67
|
+
"build": "pnpm turbo build:internal --filter=@langchain/svelte",
|
|
68
|
+
"build:internal": "pnpm --filter @langchain/build compile @langchain/svelte",
|
|
69
|
+
"prepublish": "pnpm build",
|
|
70
|
+
"format:check": "prettier --check src",
|
|
71
|
+
"format": "prettier --write src",
|
|
72
|
+
"lint:eslint": "NODE_OPTIONS=--max-old-space-size=4096 eslint --cache --ext .ts,.js,.jsx,.tsx src/",
|
|
73
|
+
"lint": "pnpm lint:eslint",
|
|
74
|
+
"lint:fix": "pnpm lint:eslint --fix",
|
|
75
|
+
"test": "vitest run"
|
|
76
|
+
}
|
|
77
|
+
}
|