@assistant-ui/react-langgraph 0.5.4 → 0.5.6
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/dist/LangGraphMessageAccumulator.d.ts +0 -4
- package/dist/LangGraphMessageAccumulator.d.ts.map +1 -1
- package/dist/LangGraphMessageAccumulator.js.map +1 -1
- package/dist/appendLangChainChunk.d.ts.map +1 -1
- package/dist/appendLangChainChunk.js +23 -10
- package/dist/appendLangChainChunk.js.map +1 -1
- package/dist/convertLangChainMessages.d.ts.map +1 -1
- package/dist/convertLangChainMessages.js +2 -1
- package/dist/convertLangChainMessages.js.map +1 -1
- package/dist/types.d.ts +22 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -1
- package/dist/useLangGraphMessages.d.ts +2 -1
- package/dist/useLangGraphMessages.d.ts.map +1 -1
- package/dist/useLangGraphMessages.js +40 -7
- package/dist/useLangGraphMessages.js.map +1 -1
- package/dist/useLangGraphRuntime.d.ts.map +1 -1
- package/dist/useLangGraphRuntime.js +12 -3
- package/dist/useLangGraphRuntime.js.map +1 -1
- package/package.json +13 -7
- package/src/LangGraphMessageAccumulator.ts +0 -11
- package/src/appendLangChainChunk.ts +31 -11
- package/src/convertLangChainMessages.ts +1 -0
- package/src/types.ts +28 -6
- package/src/useLangGraphMessages.test.ts +626 -0
- package/src/useLangGraphMessages.ts +57 -17
- package/src/useLangGraphRuntime.ts +10 -1
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { useState, useCallback, useRef } from "react";
|
|
2
2
|
import { v4 as uuidv4 } from "uuid";
|
|
3
3
|
import { LangGraphMessageAccumulator } from "./LangGraphMessageAccumulator";
|
|
4
|
+
import {
|
|
5
|
+
EventType,
|
|
6
|
+
LangChainMessageTupleEvent,
|
|
7
|
+
LangGraphKnownEventTypes,
|
|
8
|
+
LangChainMessageChunk,
|
|
9
|
+
} from "./types";
|
|
4
10
|
|
|
5
11
|
export type LangGraphCommand = {
|
|
6
12
|
resume: string;
|
|
@@ -12,15 +18,10 @@ export type LangGraphSendMessageConfig = {
|
|
|
12
18
|
};
|
|
13
19
|
|
|
14
20
|
export type LangGraphMessagesEvent<TMessage> = {
|
|
15
|
-
event:
|
|
16
|
-
| "messages"
|
|
17
|
-
| "messages/partial"
|
|
18
|
-
| "messages/complete"
|
|
19
|
-
| "metadata"
|
|
20
|
-
| "updates"
|
|
21
|
-
| string;
|
|
21
|
+
event: EventType;
|
|
22
22
|
data: TMessage[] | any;
|
|
23
23
|
};
|
|
24
|
+
|
|
24
25
|
export type LangGraphStreamCallback<TMessage> = (
|
|
25
26
|
messages: TMessage[],
|
|
26
27
|
config: LangGraphSendMessageConfig & { abortSignal: AbortSignal },
|
|
@@ -40,6 +41,22 @@ const DEFAULT_APPEND_MESSAGE = <TMessage>(
|
|
|
40
41
|
curr: TMessage,
|
|
41
42
|
) => curr;
|
|
42
43
|
|
|
44
|
+
const isLangChainMessageChunk = (
|
|
45
|
+
value: unknown,
|
|
46
|
+
): value is LangChainMessageChunk => {
|
|
47
|
+
if (!value || typeof value !== "object") return false;
|
|
48
|
+
const chunk = value as any;
|
|
49
|
+
return (
|
|
50
|
+
"type" in chunk &&
|
|
51
|
+
chunk.type === "AIMessageChunk" &&
|
|
52
|
+
(chunk.content === undefined ||
|
|
53
|
+
typeof chunk.content === "string" ||
|
|
54
|
+
Array.isArray(chunk.content)) &&
|
|
55
|
+
(chunk.tool_call_chunks === undefined ||
|
|
56
|
+
Array.isArray(chunk.tool_call_chunks))
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
43
60
|
export const useLangGraphMessages = <TMessage extends { id?: string }>({
|
|
44
61
|
stream,
|
|
45
62
|
appendMessage = DEFAULT_APPEND_MESSAGE,
|
|
@@ -56,29 +73,52 @@ export const useLangGraphMessages = <TMessage extends { id?: string }>({
|
|
|
56
73
|
const sendMessage = useCallback(
|
|
57
74
|
async (newMessages: TMessage[], config: LangGraphSendMessageConfig) => {
|
|
58
75
|
// ensure all messages have an ID
|
|
59
|
-
|
|
76
|
+
const newMessagesWithId = newMessages.map((m) =>
|
|
77
|
+
m.id ? m : { ...m, id: uuidv4() },
|
|
78
|
+
);
|
|
60
79
|
|
|
61
80
|
const accumulator = new LangGraphMessageAccumulator({
|
|
62
81
|
initialMessages: messages,
|
|
63
82
|
appendMessage,
|
|
64
83
|
});
|
|
65
|
-
setMessages(accumulator.addMessages(
|
|
84
|
+
setMessages(accumulator.addMessages(newMessagesWithId));
|
|
66
85
|
|
|
67
86
|
const abortController = new AbortController();
|
|
68
87
|
abortControllerRef.current = abortController;
|
|
69
|
-
const response = await stream(
|
|
88
|
+
const response = await stream(newMessagesWithId, {
|
|
70
89
|
...config,
|
|
71
90
|
abortSignal: abortController.signal,
|
|
72
91
|
});
|
|
73
92
|
|
|
74
93
|
for await (const chunk of response) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
94
|
+
switch (chunk.event) {
|
|
95
|
+
case LangGraphKnownEventTypes.MessagesPartial:
|
|
96
|
+
case LangGraphKnownEventTypes.MessagesComplete:
|
|
97
|
+
setMessages(accumulator.addMessages(chunk.data));
|
|
98
|
+
break;
|
|
99
|
+
case LangGraphKnownEventTypes.Updates:
|
|
100
|
+
setInterrupt(chunk.data.__interrupt__?.[0]);
|
|
101
|
+
break;
|
|
102
|
+
case LangGraphKnownEventTypes.Messages: {
|
|
103
|
+
const [messageChunk] = (chunk as LangChainMessageTupleEvent).data;
|
|
104
|
+
if (!isLangChainMessageChunk(messageChunk)) {
|
|
105
|
+
console.warn(
|
|
106
|
+
"Received invalid message chunk format:",
|
|
107
|
+
messageChunk,
|
|
108
|
+
);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
const updatedMessages = accumulator.addMessages([
|
|
112
|
+
messageChunk as unknown as TMessage,
|
|
113
|
+
]);
|
|
114
|
+
setMessages(updatedMessages);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case LangGraphKnownEventTypes.Metadata:
|
|
118
|
+
// currently this is a no-op
|
|
119
|
+
break;
|
|
120
|
+
default:
|
|
121
|
+
console.warn(`The event type ${chunk.event} is not supported.`);
|
|
82
122
|
}
|
|
83
123
|
}
|
|
84
124
|
},
|
|
@@ -232,6 +232,7 @@ export const useLangGraphRuntime = ({
|
|
|
232
232
|
name: t.name,
|
|
233
233
|
tool_call_id: t.id,
|
|
234
234
|
content: JSON.stringify({ cancelled: true }),
|
|
235
|
+
status: "error",
|
|
235
236
|
}) satisfies LangChainMessage & { type: "tool" },
|
|
236
237
|
)
|
|
237
238
|
: [];
|
|
@@ -249,7 +250,13 @@ export const useLangGraphRuntime = ({
|
|
|
249
250
|
},
|
|
250
251
|
);
|
|
251
252
|
},
|
|
252
|
-
onAddToolResult: async ({
|
|
253
|
+
onAddToolResult: async ({
|
|
254
|
+
toolCallId,
|
|
255
|
+
toolName,
|
|
256
|
+
result,
|
|
257
|
+
isError,
|
|
258
|
+
artifact,
|
|
259
|
+
}) => {
|
|
253
260
|
// TODO parallel human in the loop calls
|
|
254
261
|
await handleSendMessage(
|
|
255
262
|
[
|
|
@@ -258,6 +265,8 @@ export const useLangGraphRuntime = ({
|
|
|
258
265
|
name: toolName,
|
|
259
266
|
tool_call_id: toolCallId,
|
|
260
267
|
content: JSON.stringify(result),
|
|
268
|
+
artifact,
|
|
269
|
+
status: isError ? "error" : "success",
|
|
261
270
|
},
|
|
262
271
|
],
|
|
263
272
|
// TODO reuse runconfig here!
|