@langchain/vue 0.1.2 → 0.2.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 +122 -19
- package/dist/context.cjs +112 -0
- package/dist/context.cjs.map +1 -0
- package/dist/context.d.cts +112 -0
- package/dist/context.d.cts.map +1 -0
- package/dist/context.d.ts +112 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +109 -0
- package/dist/context.js.map +1 -0
- package/dist/index.cjs +78 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -7
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +77 -23
- package/dist/index.js.map +1 -1
- package/dist/stream.custom.cjs +34 -11
- package/dist/stream.custom.cjs.map +1 -1
- package/dist/stream.custom.js +35 -12
- package/dist/stream.custom.js.map +1 -1
- package/dist/types.d.cts +28 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +6 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.custom.cjs","names":["MessageTupleManager","StreamManager","toMessageClass"],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { onScopeDispose, ref, shallowRef, watch } from \"vue\";\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 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\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 streamValues = shallowRef<StateType | null>(stream.values);\n const streamError = shallowRef<unknown>(stream.error);\n const isLoading = shallowRef(stream.isLoading);\n\n const subagentVersion = shallowRef(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.value = stream.values;\n streamError.value = stream.error;\n isLoading.value = stream.isLoading;\n subagentVersion.value += 1;\n });\n\n const branch = ref<string>(\"\");\n\n let threadId: string | null = options.threadId ?? null;\n\n watch(\n () => options.threadId,\n (newId) => {\n const resolved = newId ?? null;\n if (resolved !== threadId) {\n threadId = resolved;\n stream.clear();\n }\n },\n { flush: \"sync\" },\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 onScopeDispose(() => {\n unsubscribe();\n void stream.stop(historyValues, { onStop: options.onStop });\n });\n\n const historyMessages = getMessages(historyValues);\n // @ts-expect-error used in watch callback below\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n watch(\n () => ({\n should:\n options.filterSubagentMessages &&\n !isLoading.value &&\n getMessages(historyValues).length > 0,\n len: getMessages(historyValues).length,\n }),\n ({ should }) => {\n if (should) {\n stream.reconstructSubagents(getMessages(historyValues), {\n skipIfPopulated: true,\n });\n }\n },\n { immediate: 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 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 (!threadId) {\n threadId = crypto.randomUUID();\n options.onThreadId?.(threadId);\n }\n\n if (!threadId) {\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: threadId,\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 function setBranch(value: string) {\n branch.value = 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 get values() {\n return streamValues.value ?? ({} as StateType);\n },\n\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: [],\n size: 0,\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n streamValues.value != null &&\n \"__interrupt__\" in streamValues.value &&\n Array.isArray(streamValues.value.__interrupt__)\n ) {\n const valueInterrupts = streamValues.value.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n return extractInterrupts<InterruptType>(streamValues.value);\n },\n\n get messages() {\n if (!streamValues.value) return [];\n return ensureMessageInstances(getMessages(streamValues.value));\n },\n\n get toolCalls() {\n if (!streamValues.value) return [];\n return getToolCallsWithResults(getMessages(streamValues.value));\n },\n\n getToolCalls(message: Message) {\n if (!streamValues.value) return [];\n const allToolCalls = getToolCallsWithResults(\n getMessages(streamValues.value),\n );\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n get subagents() {\n void subagentVersion.value;\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n void subagentVersion.value;\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\n },\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 { onScopeDispose, ref, shallowRef, toValue, watch } from \"vue\";\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 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\";\nimport type { VueReactiveOptions } from \"./types.js\";\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: VueReactiveOptions<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\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 streamValues = shallowRef<StateType | null>(stream.values);\n const streamError = shallowRef<unknown>(stream.error);\n const isLoading = shallowRef(stream.isLoading);\n\n const subagentVersion = shallowRef(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.value = stream.values;\n streamError.value = stream.error;\n isLoading.value = stream.isLoading;\n subagentVersion.value += 1;\n });\n\n const branch = ref<string>(\"\");\n\n let threadId: string | null = toValue(options.threadId) ?? null;\n\n watch(\n () => toValue(options.threadId),\n (newId) => {\n const resolved = newId ?? null;\n if (resolved !== threadId) {\n threadId = resolved;\n stream.clear();\n }\n },\n { flush: \"sync\" },\n );\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = toValue(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 = toValue(options.messagesKey) ?? \"messages\";\n return { ...current, [messagesKey]: messages };\n };\n\n const historyValues = options.initialValues ?? ({} as StateType);\n\n onScopeDispose(() => {\n unsubscribe();\n void stream.stop(historyValues, { onStop: options.onStop });\n });\n\n const historyMessages = getMessages(historyValues);\n // @ts-expect-error used in watch callback below\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n watch(\n () => ({\n should:\n options.filterSubagentMessages &&\n !isLoading.value &&\n getMessages(historyValues).length > 0,\n len: getMessages(historyValues).length,\n }),\n ({ should }) => {\n if (should) {\n stream.reconstructSubagents(getMessages(historyValues), {\n skipIfPopulated: true,\n });\n }\n },\n { immediate: 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 = toValue(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 function setBranch(value: string) {\n branch.value = 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 get values() {\n return streamValues.value ?? ({} as StateType);\n },\n\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: [],\n size: 0,\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n streamValues.value != null &&\n \"__interrupt__\" in streamValues.value &&\n Array.isArray(streamValues.value.__interrupt__)\n ) {\n const valueInterrupts = streamValues.value.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n return extractInterrupts<InterruptType>(streamValues.value);\n },\n\n get messages() {\n if (!streamValues.value) return [];\n return ensureMessageInstances(getMessages(streamValues.value));\n },\n\n get toolCalls() {\n if (!streamValues.value) return [];\n return getToolCallsWithResults(getMessages(streamValues.value));\n },\n\n getToolCalls(message: Message) {\n if (!streamValues.value) return [];\n const allToolCalls = getToolCallsWithResults(\n getMessages(streamValues.value),\n );\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n get subagents() {\n void subagentVersion.value;\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n void subagentVersion.value;\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\n },\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,7 +1,23 @@
|
|
|
1
|
-
import { onScopeDispose, ref, shallowRef, watch } from "vue";
|
|
1
|
+
import { onScopeDispose, ref, shallowRef, toValue, watch } from "vue";
|
|
2
2
|
import { MessageTupleManager, StreamManager, ensureMessageInstances, extractInterrupts, toMessageClass } from "@langchain/langgraph-sdk/ui";
|
|
3
3
|
import { getToolCallsWithResults } from "@langchain/langgraph-sdk/utils";
|
|
4
4
|
//#region src/stream.custom.ts
|
|
5
|
+
function createCustomTransportThreadState(values, threadId) {
|
|
6
|
+
return {
|
|
7
|
+
values,
|
|
8
|
+
next: [],
|
|
9
|
+
tasks: [],
|
|
10
|
+
metadata: void 0,
|
|
11
|
+
created_at: null,
|
|
12
|
+
checkpoint: {
|
|
13
|
+
thread_id: threadId,
|
|
14
|
+
checkpoint_id: null,
|
|
15
|
+
checkpoint_ns: "",
|
|
16
|
+
checkpoint_map: null
|
|
17
|
+
},
|
|
18
|
+
parent_checkpoint: null
|
|
19
|
+
};
|
|
20
|
+
}
|
|
5
21
|
function useStreamCustom(options) {
|
|
6
22
|
const messageManager = new MessageTupleManager();
|
|
7
23
|
const stream = new StreamManager(messageManager, {
|
|
@@ -21,8 +37,8 @@ function useStreamCustom(options) {
|
|
|
21
37
|
subagentVersion.value += 1;
|
|
22
38
|
});
|
|
23
39
|
const branch = ref("");
|
|
24
|
-
let threadId = options.threadId ?? null;
|
|
25
|
-
watch(() => options.threadId, (newId) => {
|
|
40
|
+
let threadId = toValue(options.threadId) ?? null;
|
|
41
|
+
watch(() => toValue(options.threadId), (newId) => {
|
|
26
42
|
const resolved = newId ?? null;
|
|
27
43
|
if (resolved !== threadId) {
|
|
28
44
|
threadId = resolved;
|
|
@@ -30,11 +46,11 @@ function useStreamCustom(options) {
|
|
|
30
46
|
}
|
|
31
47
|
}, { flush: "sync" });
|
|
32
48
|
const getMessages = (value) => {
|
|
33
|
-
const messagesKey = options.messagesKey ?? "messages";
|
|
49
|
+
const messagesKey = toValue(options.messagesKey) ?? "messages";
|
|
34
50
|
return Array.isArray(value[messagesKey]) ? value[messagesKey] : [];
|
|
35
51
|
};
|
|
36
52
|
const setMessages = (current, messages) => {
|
|
37
|
-
const messagesKey = options.messagesKey ?? "messages";
|
|
53
|
+
const messagesKey = toValue(options.messagesKey) ?? "messages";
|
|
38
54
|
return {
|
|
39
55
|
...current,
|
|
40
56
|
[messagesKey]: messages
|
|
@@ -63,11 +79,12 @@ function useStreamCustom(options) {
|
|
|
63
79
|
return stream.stop(historyValues, { onStop: options.onStop });
|
|
64
80
|
}
|
|
65
81
|
async function submitDirect(values, submitOptions) {
|
|
66
|
-
const currentThreadId = options.threadId ?? null;
|
|
82
|
+
const currentThreadId = toValue(options.threadId) ?? null;
|
|
67
83
|
if (currentThreadId !== threadId) {
|
|
68
84
|
threadId = currentThreadId;
|
|
69
85
|
stream.clear();
|
|
70
86
|
}
|
|
87
|
+
let usableThreadId = threadId ?? submitOptions?.threadId;
|
|
71
88
|
stream.setStreamValues(() => {
|
|
72
89
|
if (submitOptions?.optimisticValues != null) return {
|
|
73
90
|
...historyValues,
|
|
@@ -76,20 +93,22 @@ function useStreamCustom(options) {
|
|
|
76
93
|
return { ...historyValues };
|
|
77
94
|
});
|
|
78
95
|
await stream.start(async (signal) => {
|
|
79
|
-
if (!
|
|
80
|
-
|
|
81
|
-
|
|
96
|
+
if (!usableThreadId) {
|
|
97
|
+
usableThreadId = crypto.randomUUID();
|
|
98
|
+
threadId = usableThreadId;
|
|
99
|
+
options.onThreadId?.(usableThreadId);
|
|
82
100
|
}
|
|
83
|
-
if (!
|
|
101
|
+
if (!usableThreadId) throw new Error("Failed to obtain valid thread ID.");
|
|
84
102
|
return options.transport.stream({
|
|
85
103
|
input: values,
|
|
86
104
|
context: submitOptions?.context,
|
|
87
105
|
command: submitOptions?.command,
|
|
106
|
+
streamSubgraphs: submitOptions?.streamSubgraphs,
|
|
88
107
|
signal,
|
|
89
108
|
config: {
|
|
90
109
|
...submitOptions?.config,
|
|
91
110
|
configurable: {
|
|
92
|
-
thread_id:
|
|
111
|
+
thread_id: usableThreadId,
|
|
93
112
|
...submitOptions?.config?.configurable
|
|
94
113
|
}
|
|
95
114
|
}
|
|
@@ -99,7 +118,11 @@ function useStreamCustom(options) {
|
|
|
99
118
|
setMessages,
|
|
100
119
|
initialValues: {},
|
|
101
120
|
callbacks: options,
|
|
102
|
-
onSuccess: () =>
|
|
121
|
+
onSuccess: () => {
|
|
122
|
+
if (!usableThreadId) return void 0;
|
|
123
|
+
const finalValues = stream.values ?? historyValues;
|
|
124
|
+
options.onFinish?.(createCustomTransportThreadState(finalValues, usableThreadId), void 0);
|
|
125
|
+
},
|
|
103
126
|
onError(error) {
|
|
104
127
|
options.onError?.(error, void 0);
|
|
105
128
|
submitOptions?.onError?.(error, void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.custom.js","names":[],"sources":["../src/stream.custom.ts"],"sourcesContent":["import { onScopeDispose, ref, shallowRef, watch } from \"vue\";\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 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\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 streamValues = shallowRef<StateType | null>(stream.values);\n const streamError = shallowRef<unknown>(stream.error);\n const isLoading = shallowRef(stream.isLoading);\n\n const subagentVersion = shallowRef(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.value = stream.values;\n streamError.value = stream.error;\n isLoading.value = stream.isLoading;\n subagentVersion.value += 1;\n });\n\n const branch = ref<string>(\"\");\n\n let threadId: string | null = options.threadId ?? null;\n\n watch(\n () => options.threadId,\n (newId) => {\n const resolved = newId ?? null;\n if (resolved !== threadId) {\n threadId = resolved;\n stream.clear();\n }\n },\n { flush: \"sync\" },\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 onScopeDispose(() => {\n unsubscribe();\n void stream.stop(historyValues, { onStop: options.onStop });\n });\n\n const historyMessages = getMessages(historyValues);\n // @ts-expect-error used in watch callback below\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n watch(\n () => ({\n should:\n options.filterSubagentMessages &&\n !isLoading.value &&\n getMessages(historyValues).length > 0,\n len: getMessages(historyValues).length,\n }),\n ({ should }) => {\n if (should) {\n stream.reconstructSubagents(getMessages(historyValues), {\n skipIfPopulated: true,\n });\n }\n },\n { immediate: 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 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 (!threadId) {\n threadId = crypto.randomUUID();\n options.onThreadId?.(threadId);\n }\n\n if (!threadId) {\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: threadId,\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 function setBranch(value: string) {\n branch.value = 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 get values() {\n return streamValues.value ?? ({} as StateType);\n },\n\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: [],\n size: 0,\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n streamValues.value != null &&\n \"__interrupt__\" in streamValues.value &&\n Array.isArray(streamValues.value.__interrupt__)\n ) {\n const valueInterrupts = streamValues.value.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n return extractInterrupts<InterruptType>(streamValues.value);\n },\n\n get messages() {\n if (!streamValues.value) return [];\n return ensureMessageInstances(getMessages(streamValues.value));\n },\n\n get toolCalls() {\n if (!streamValues.value) return [];\n return getToolCallsWithResults(getMessages(streamValues.value));\n },\n\n getToolCalls(message: Message) {\n if (!streamValues.value) return [];\n const allToolCalls = getToolCallsWithResults(\n getMessages(streamValues.value),\n );\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n get subagents() {\n void subagentVersion.value;\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n void subagentVersion.value;\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\n },\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 { onScopeDispose, ref, shallowRef, toValue, watch } from \"vue\";\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 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\";\nimport type { VueReactiveOptions } from \"./types.js\";\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: VueReactiveOptions<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\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 streamValues = shallowRef<StateType | null>(stream.values);\n const streamError = shallowRef<unknown>(stream.error);\n const isLoading = shallowRef(stream.isLoading);\n\n const subagentVersion = shallowRef(0);\n\n const unsubscribe = stream.subscribe(() => {\n streamValues.value = stream.values;\n streamError.value = stream.error;\n isLoading.value = stream.isLoading;\n subagentVersion.value += 1;\n });\n\n const branch = ref<string>(\"\");\n\n let threadId: string | null = toValue(options.threadId) ?? null;\n\n watch(\n () => toValue(options.threadId),\n (newId) => {\n const resolved = newId ?? null;\n if (resolved !== threadId) {\n threadId = resolved;\n stream.clear();\n }\n },\n { flush: \"sync\" },\n );\n\n const getMessages = (value: StateType): Message[] => {\n const messagesKey = toValue(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 = toValue(options.messagesKey) ?? \"messages\";\n return { ...current, [messagesKey]: messages };\n };\n\n const historyValues = options.initialValues ?? ({} as StateType);\n\n onScopeDispose(() => {\n unsubscribe();\n void stream.stop(historyValues, { onStop: options.onStop });\n });\n\n const historyMessages = getMessages(historyValues);\n // @ts-expect-error used in watch callback below\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const shouldReconstructSubagents =\n options.filterSubagentMessages &&\n !stream.isLoading &&\n historyMessages.length > 0;\n\n watch(\n () => ({\n should:\n options.filterSubagentMessages &&\n !isLoading.value &&\n getMessages(historyValues).length > 0,\n len: getMessages(historyValues).length,\n }),\n ({ should }) => {\n if (should) {\n stream.reconstructSubagents(getMessages(historyValues), {\n skipIfPopulated: true,\n });\n }\n },\n { immediate: 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 = toValue(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 function setBranch(value: string) {\n branch.value = 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 get values() {\n return streamValues.value ?? ({} as StateType);\n },\n\n error: streamError,\n isLoading,\n\n stop,\n submit,\n switchThread,\n\n branch,\n setBranch,\n getMessagesMetadata,\n\n queue: {\n entries: [],\n size: 0,\n async cancel() {\n return false;\n },\n async clear() {},\n },\n\n get interrupts(): Interrupt<InterruptType>[] {\n if (\n streamValues.value != null &&\n \"__interrupt__\" in streamValues.value &&\n Array.isArray(streamValues.value.__interrupt__)\n ) {\n const valueInterrupts = streamValues.value.__interrupt__;\n if (valueInterrupts.length === 0) return [{ when: \"breakpoint\" }];\n return valueInterrupts;\n }\n\n return [];\n },\n\n get interrupt(): Interrupt<InterruptType> | undefined {\n return extractInterrupts<InterruptType>(streamValues.value);\n },\n\n get messages() {\n if (!streamValues.value) return [];\n return ensureMessageInstances(getMessages(streamValues.value));\n },\n\n get toolCalls() {\n if (!streamValues.value) return [];\n return getToolCallsWithResults(getMessages(streamValues.value));\n },\n\n getToolCalls(message: Message) {\n if (!streamValues.value) return [];\n const allToolCalls = getToolCallsWithResults(\n getMessages(streamValues.value),\n );\n return allToolCalls.filter((tc) => tc.aiMessage.id === message.id);\n },\n\n get subagents() {\n void subagentVersion.value;\n return stream.getSubagents();\n },\n\n get activeSubagents() {\n void subagentVersion.value;\n return stream.getActiveSubagents();\n },\n\n getSubagent(toolCallId: string) {\n return stream.getSubagent(toolCallId);\n },\n\n getSubagentsByType(type: string) {\n return stream.getSubagentsByType(type);\n },\n\n getSubagentsByMessage(messageId: string) {\n return stream.getSubagentsByMessage(messageId);\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/types.d.cts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { MaybeRefOrGetter } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/types.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Option keys that support Vue reactive values via MaybeRefOrGetter.
|
|
6
|
+
*/
|
|
7
|
+
type ReactiveOptionKeys = "assistantId" | "apiUrl" | "apiKey" | "callerOptions" | "defaultHeaders" | "client" | "threadId" | "messagesKey";
|
|
8
|
+
/**
|
|
9
|
+
* Wraps specific option keys to accept MaybeRefOrGetter for Vue reactivity.
|
|
10
|
+
* Allows options like assistantId, apiUrl, threadId, etc. to be passed as
|
|
11
|
+
* plain values, Vue refs, or getter functions.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const assistantId = ref("agent");
|
|
16
|
+
* const apiUrl = computed(() => getApiUrl());
|
|
17
|
+
*
|
|
18
|
+
* useStream({
|
|
19
|
+
* assistantId, // Ref<string>
|
|
20
|
+
* apiUrl, // ComputedRef<string>
|
|
21
|
+
* threadId: null, // plain value (still works)
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
type VueReactiveOptions<T> = { [K in keyof T]: K extends ReactiveOptionKeys ? MaybeRefOrGetter<T[K]> : T[K] };
|
|
26
|
+
//#endregion
|
|
27
|
+
export { VueReactiveOptions };
|
|
28
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;AAA4C;KAKvC,kBAAA;;;;AA2BL;;;;;;;;;;;;;;KAAY,kBAAA,oBACE,CAAA,GAAI,CAAA,SAAU,kBAAA,GAAqB,gBAAA,CAAiB,CAAA,CAAE,CAAA,KAAM,CAAA,CAAE,CAAA"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { MaybeRefOrGetter } from "vue";
|
|
2
|
+
|
|
3
|
+
//#region src/types.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Option keys that support Vue reactive values via MaybeRefOrGetter.
|
|
6
|
+
*/
|
|
7
|
+
type ReactiveOptionKeys = "assistantId" | "apiUrl" | "apiKey" | "callerOptions" | "defaultHeaders" | "client" | "threadId" | "messagesKey";
|
|
8
|
+
/**
|
|
9
|
+
* Wraps specific option keys to accept MaybeRefOrGetter for Vue reactivity.
|
|
10
|
+
* Allows options like assistantId, apiUrl, threadId, etc. to be passed as
|
|
11
|
+
* plain values, Vue refs, or getter functions.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const assistantId = ref("agent");
|
|
16
|
+
* const apiUrl = computed(() => getApiUrl());
|
|
17
|
+
*
|
|
18
|
+
* useStream({
|
|
19
|
+
* assistantId, // Ref<string>
|
|
20
|
+
* apiUrl, // ComputedRef<string>
|
|
21
|
+
* threadId: null, // plain value (still works)
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
type VueReactiveOptions<T> = { [K in keyof T]: K extends ReactiveOptionKeys ? MaybeRefOrGetter<T[K]> : T[K] };
|
|
26
|
+
//#endregion
|
|
27
|
+
export { VueReactiveOptions };
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;AAA4C;KAKvC,kBAAA;;;;AA2BL;;;;;;;;;;;;;;KAAY,kBAAA,oBACE,CAAA,GAAI,CAAA,SAAU,kBAAA,GAAqB,gBAAA,CAAiB,CAAA,CAAE,CAAA,KAAM,CAAA,CAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/vue",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Vue integration for LangGraph & LangChain",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,13 +10,11 @@
|
|
|
10
10
|
"directory": "libs/sdk-vue"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@langchain/langgraph-sdk": "^1.7.
|
|
13
|
+
"@langchain/langgraph-sdk": "^1.7.5"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"@hono/node-server": "^1.19.11",
|
|
17
17
|
"@langchain/core": "^1.1.31",
|
|
18
|
-
"@langchain/scripts": "^0.1.4",
|
|
19
|
-
"@tsconfig/recommended": "^1.0.13",
|
|
20
18
|
"@types/node": "^25.4.0",
|
|
21
19
|
"@typescript-eslint/eslint-plugin": "^6.12.0",
|
|
22
20
|
"@typescript-eslint/parser": "^6.12.0",
|
|
@@ -24,7 +22,7 @@
|
|
|
24
22
|
"@vitejs/plugin-vue-jsx": "^5.1.4",
|
|
25
23
|
"@vitest/browser": "^4.0.18",
|
|
26
24
|
"@vitest/browser-webdriverio": "^4.0.18",
|
|
27
|
-
"deepagents": "^1.8.
|
|
25
|
+
"deepagents": "^1.8.3",
|
|
28
26
|
"eslint": "^8.33.0",
|
|
29
27
|
"eslint-config-airbnb-base": "^15.0.0",
|
|
30
28
|
"eslint-config-prettier": "^8.6.0",
|
|
@@ -40,9 +38,9 @@
|
|
|
40
38
|
"vue": "^3.5.30",
|
|
41
39
|
"webdriverio": "^9.25.0",
|
|
42
40
|
"zod": "^4.3.6",
|
|
43
|
-
"@langchain/langgraph": "1.2.
|
|
44
|
-
"@langchain/langgraph-api": "1.1.
|
|
45
|
-
"@langchain/langgraph-checkpoint": "1.0.
|
|
41
|
+
"@langchain/langgraph": "1.2.4",
|
|
42
|
+
"@langchain/langgraph-api": "1.1.16",
|
|
43
|
+
"@langchain/langgraph-checkpoint": "1.0.1"
|
|
46
44
|
},
|
|
47
45
|
"peerDependencies": {
|
|
48
46
|
"@langchain/core": "^1.1.27",
|