@assistant-ui/react-langgraph 0.0.3 → 0.0.4
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/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +26 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +26 -23
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -34,22 +34,22 @@ type LangChainEvent = {
|
|
|
34
34
|
|
|
35
35
|
declare const useLangGraphRuntime: ({ threadId, stream, }: {
|
|
36
36
|
threadId?: string | undefined;
|
|
37
|
-
stream: (
|
|
37
|
+
stream: (messages: LangChainMessage[]) => Promise<AsyncGenerator<{
|
|
38
38
|
event: string;
|
|
39
39
|
data: any;
|
|
40
40
|
}>>;
|
|
41
41
|
}) => ExternalStoreRuntime;
|
|
42
42
|
|
|
43
43
|
declare const useLangGraphMessages: <TMessage>({ stream, }: {
|
|
44
|
-
stream: (
|
|
44
|
+
stream: (messages: TMessage[]) => Promise<AsyncGenerator<{
|
|
45
45
|
event: string;
|
|
46
46
|
data: any;
|
|
47
47
|
}>>;
|
|
48
48
|
}) => {
|
|
49
49
|
messages: TMessage[];
|
|
50
|
-
sendMessage: (
|
|
50
|
+
sendMessage: (messages: TMessage[]) => Promise<void>;
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
declare const convertLangchainMessages: useExternalMessageConverter.Callback<LangChainMessage>;
|
|
54
54
|
|
|
55
|
-
export { type LangChainEvent, type LangChainMessage, type LangChainToolCall, type LangChainToolCallChunk, convertLangchainMessages,
|
|
55
|
+
export { type LangChainEvent, type LangChainMessage, type LangChainToolCall, type LangChainToolCallChunk, convertLangchainMessages, useLangGraphMessages, useLangGraphRuntime };
|
package/dist/index.d.ts
CHANGED
|
@@ -34,22 +34,22 @@ type LangChainEvent = {
|
|
|
34
34
|
|
|
35
35
|
declare const useLangGraphRuntime: ({ threadId, stream, }: {
|
|
36
36
|
threadId?: string | undefined;
|
|
37
|
-
stream: (
|
|
37
|
+
stream: (messages: LangChainMessage[]) => Promise<AsyncGenerator<{
|
|
38
38
|
event: string;
|
|
39
39
|
data: any;
|
|
40
40
|
}>>;
|
|
41
41
|
}) => ExternalStoreRuntime;
|
|
42
42
|
|
|
43
43
|
declare const useLangGraphMessages: <TMessage>({ stream, }: {
|
|
44
|
-
stream: (
|
|
44
|
+
stream: (messages: TMessage[]) => Promise<AsyncGenerator<{
|
|
45
45
|
event: string;
|
|
46
46
|
data: any;
|
|
47
47
|
}>>;
|
|
48
48
|
}) => {
|
|
49
49
|
messages: TMessage[];
|
|
50
|
-
sendMessage: (
|
|
50
|
+
sendMessage: (messages: TMessage[]) => Promise<void>;
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
declare const convertLangchainMessages: useExternalMessageConverter.Callback<LangChainMessage>;
|
|
54
54
|
|
|
55
|
-
export { type LangChainEvent, type LangChainMessage, type LangChainToolCall, type LangChainToolCallChunk, convertLangchainMessages,
|
|
55
|
+
export { type LangChainEvent, type LangChainMessage, type LangChainToolCall, type LangChainToolCallChunk, convertLangchainMessages, useLangGraphMessages, useLangGraphRuntime };
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var src_exports = {};
|
|
22
22
|
__export(src_exports, {
|
|
23
23
|
convertLangchainMessages: () => convertLangchainMessages,
|
|
24
|
-
useLangChainLangGraphRuntime: () => useLangGraphRuntime,
|
|
25
24
|
useLangGraphMessages: () => useLangGraphMessages,
|
|
26
25
|
useLangGraphRuntime: () => useLangGraphRuntime
|
|
27
26
|
});
|
|
@@ -83,23 +82,23 @@ var useLangGraphMessages = ({
|
|
|
83
82
|
}) => {
|
|
84
83
|
const [messages, setMessages] = (0, import_react.useState)([]);
|
|
85
84
|
const sendMessage = (0, import_react.useCallback)(
|
|
86
|
-
async (
|
|
87
|
-
if (
|
|
88
|
-
setMessages((currentMessages) => [...currentMessages,
|
|
85
|
+
async (messages2) => {
|
|
86
|
+
if (messages2.length > 0) {
|
|
87
|
+
setMessages((currentMessages) => [...currentMessages, ...messages2]);
|
|
89
88
|
}
|
|
90
|
-
const response = await stream(
|
|
89
|
+
const response = await stream(messages2);
|
|
91
90
|
const completeMessages = [];
|
|
92
91
|
let partialMessages = /* @__PURE__ */ new Map();
|
|
93
92
|
for await (const chunk of response) {
|
|
94
93
|
if (chunk.event === "messages/partial") {
|
|
95
|
-
for (const
|
|
96
|
-
if (!
|
|
97
|
-
partialMessages.set(
|
|
94
|
+
for (const message of chunk.data) {
|
|
95
|
+
if (!message.id) throw new Error("Partial message missing id");
|
|
96
|
+
partialMessages.set(message.id, message);
|
|
98
97
|
}
|
|
99
98
|
} else if (chunk.event === "messages/complete") {
|
|
100
|
-
for (const
|
|
101
|
-
if (!
|
|
102
|
-
partialMessages.delete(
|
|
99
|
+
for (const message of chunk.data) {
|
|
100
|
+
if (!message.id) continue;
|
|
101
|
+
partialMessages.delete(message.id);
|
|
103
102
|
}
|
|
104
103
|
completeMessages.push(...chunk.data);
|
|
105
104
|
} else {
|
|
@@ -125,10 +124,10 @@ var useLangGraphRuntime = ({
|
|
|
125
124
|
stream
|
|
126
125
|
});
|
|
127
126
|
const [isRunning, setIsRunning] = (0, import_react2.useState)(false);
|
|
128
|
-
const handleSendMessage = async (
|
|
127
|
+
const handleSendMessage = async (messages2) => {
|
|
129
128
|
try {
|
|
130
129
|
setIsRunning(true);
|
|
131
|
-
await sendMessage(
|
|
130
|
+
await sendMessage(messages2);
|
|
132
131
|
} catch (error) {
|
|
133
132
|
console.error("Error streaming messages:", error);
|
|
134
133
|
} finally {
|
|
@@ -147,25 +146,28 @@ var useLangGraphRuntime = ({
|
|
|
147
146
|
onNew: (msg) => {
|
|
148
147
|
if (msg.content.length !== 1 || msg.content[0]?.type !== "text")
|
|
149
148
|
throw new Error("Only text messages are supported");
|
|
150
|
-
return handleSendMessage(
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
149
|
+
return handleSendMessage([
|
|
150
|
+
{
|
|
151
|
+
type: "human",
|
|
152
|
+
content: msg.content[0].text
|
|
153
|
+
}
|
|
154
|
+
]);
|
|
154
155
|
},
|
|
155
156
|
onAddToolResult: async ({ toolCallId, toolName, result }) => {
|
|
156
|
-
await handleSendMessage(
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
157
|
+
await handleSendMessage([
|
|
158
|
+
{
|
|
159
|
+
type: "tool",
|
|
160
|
+
name: toolName,
|
|
161
|
+
tool_call_id: toolCallId,
|
|
162
|
+
content: JSON.stringify(result)
|
|
163
|
+
}
|
|
164
|
+
]);
|
|
162
165
|
}
|
|
163
166
|
});
|
|
164
167
|
};
|
|
165
168
|
// Annotate the CommonJS export names for ESM import in node:
|
|
166
169
|
0 && (module.exports = {
|
|
167
170
|
convertLangchainMessages,
|
|
168
|
-
useLangChainLangGraphRuntime,
|
|
169
171
|
useLangGraphMessages,
|
|
170
172
|
useLangGraphRuntime
|
|
171
173
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/useLangGraphRuntime.ts","../src/convertLangchainMessages.ts","../src/useLangGraphMessages.ts"],"sourcesContent":["export { useLangGraphRuntime } from \"./useLangGraphRuntime\";\n\nexport { useLangGraphMessages } from \"./useLangGraphMessages\";\nexport { convertLangchainMessages } from \"./convertLangchainMessages\";\nexport type {\n LangChainMessage,\n LangChainEvent,\n LangChainToolCall,\n LangChainToolCallChunk,\n} from \"./types\";\n
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/useLangGraphRuntime.ts","../src/convertLangchainMessages.ts","../src/useLangGraphMessages.ts"],"sourcesContent":["export { useLangGraphRuntime } from \"./useLangGraphRuntime\";\n\nexport { useLangGraphMessages } from \"./useLangGraphMessages\";\nexport { convertLangchainMessages } from \"./convertLangchainMessages\";\nexport type {\n LangChainMessage,\n LangChainEvent,\n LangChainToolCall,\n LangChainToolCallChunk,\n} from \"./types\";\n","import { useState } from \"react\";\nimport { LangChainMessage } from \"./types\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertLangchainMessages } from \"./convertLangchainMessages\";\nimport { useLangGraphMessages } from \"./useLangGraphMessages\";\nimport { ExternalStoreRuntime } from \"@assistant-ui/react\";\n\nexport const useLangGraphRuntime = ({\n threadId,\n stream,\n}: {\n threadId?: string | undefined;\n stream: (messages: LangChainMessage[]) => Promise<\n AsyncGenerator<{\n event: string;\n data: any;\n }>\n >;\n}): ExternalStoreRuntime => {\n const { messages, sendMessage } = useLangGraphMessages({\n stream,\n });\n\n const [isRunning, setIsRunning] = useState(false);\n const handleSendMessage = async (messages: LangChainMessage[]) => {\n try {\n setIsRunning(true);\n await sendMessage(messages);\n } catch (error) {\n console.error(\"Error streaming messages:\", error);\n } finally {\n setIsRunning(false);\n }\n };\n\n const threadMessages = useExternalMessageConverter({\n callback: convertLangchainMessages,\n messages,\n isRunning,\n });\n\n return useExternalStoreRuntime({\n threadId,\n isRunning,\n messages: threadMessages,\n onNew: (msg) => {\n if (msg.content.length !== 1 || msg.content[0]?.type !== \"text\")\n throw new Error(\"Only text messages are supported\");\n return handleSendMessage([\n {\n type: \"human\",\n content: msg.content[0].text,\n },\n ]);\n },\n onAddToolResult: async ({ toolCallId, toolName, result }) => {\n await handleSendMessage([\n {\n type: \"tool\",\n name: toolName,\n tool_call_id: toolCallId,\n content: JSON.stringify(result),\n },\n ]);\n },\n });\n};\n","\"use client\";\n\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { LangChainMessage } from \"./types\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\n\nexport const convertLangchainMessages: useExternalMessageConverter.Callback<\n LangChainMessage\n> = (message) => {\n switch (message.type) {\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"human\":\n return {\n role: \"user\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"ai\":\n return {\n role: \"assistant\",\n id: message.id,\n content: [\n {\n type: \"text\",\n text: message.content,\n },\n ...(message.tool_calls?.map(\n (chunk): ToolCallContentPart => ({\n type: \"tool-call\",\n toolCallId: chunk.id,\n toolName: chunk.name,\n args: chunk.args,\n argsText:\n message.tool_call_chunks?.find((c) => c.id === chunk.id)\n ?.args ?? JSON.stringify(chunk.args),\n }),\n ) ?? []),\n ],\n };\n case \"tool\":\n return {\n role: \"tool\",\n toolName: message.name,\n toolCallId: message.tool_call_id,\n result: message.content,\n };\n }\n};\n","import { useState, useCallback } from \"react\";\n\nexport const useLangGraphMessages = <TMessage>({\n stream,\n}: {\n stream: (messages: TMessage[]) => Promise<\n AsyncGenerator<{\n event: string;\n data: any;\n }>\n >;\n}) => {\n const [messages, setMessages] = useState<TMessage[]>([]);\n\n const sendMessage = useCallback(\n async (messages: TMessage[]) => {\n if (messages.length > 0) {\n setMessages((currentMessages) => [...currentMessages, ...messages]);\n }\n\n const response = await stream(messages);\n\n const completeMessages: TMessage[] = [];\n let partialMessages: Map<string, TMessage> = new Map();\n for await (const chunk of response) {\n if (chunk.event === \"messages/partial\") {\n for (const message of chunk.data) {\n if (!message.id) throw new Error(\"Partial message missing id\");\n\n partialMessages.set(message.id, message);\n }\n } else if (chunk.event === \"messages/complete\") {\n for (const message of chunk.data) {\n if (!message.id) continue;\n partialMessages.delete(message.id);\n }\n\n completeMessages.push(...chunk.data);\n } else {\n continue;\n }\n\n setMessages([...completeMessages, ...partialMessages.values()]);\n }\n if (partialMessages.size > 0) {\n throw new Error(\"A partial message was not marked as complete\");\n }\n },\n [stream],\n );\n\n return { messages, sendMessage };\n};\n"],"mappings":"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","names":["import_react","messages","messages"]}
|
package/dist/index.mjs
CHANGED
|
@@ -57,23 +57,23 @@ var useLangGraphMessages = ({
|
|
|
57
57
|
}) => {
|
|
58
58
|
const [messages, setMessages] = useState([]);
|
|
59
59
|
const sendMessage = useCallback(
|
|
60
|
-
async (
|
|
61
|
-
if (
|
|
62
|
-
setMessages((currentMessages) => [...currentMessages,
|
|
60
|
+
async (messages2) => {
|
|
61
|
+
if (messages2.length > 0) {
|
|
62
|
+
setMessages((currentMessages) => [...currentMessages, ...messages2]);
|
|
63
63
|
}
|
|
64
|
-
const response = await stream(
|
|
64
|
+
const response = await stream(messages2);
|
|
65
65
|
const completeMessages = [];
|
|
66
66
|
let partialMessages = /* @__PURE__ */ new Map();
|
|
67
67
|
for await (const chunk of response) {
|
|
68
68
|
if (chunk.event === "messages/partial") {
|
|
69
|
-
for (const
|
|
70
|
-
if (!
|
|
71
|
-
partialMessages.set(
|
|
69
|
+
for (const message of chunk.data) {
|
|
70
|
+
if (!message.id) throw new Error("Partial message missing id");
|
|
71
|
+
partialMessages.set(message.id, message);
|
|
72
72
|
}
|
|
73
73
|
} else if (chunk.event === "messages/complete") {
|
|
74
|
-
for (const
|
|
75
|
-
if (!
|
|
76
|
-
partialMessages.delete(
|
|
74
|
+
for (const message of chunk.data) {
|
|
75
|
+
if (!message.id) continue;
|
|
76
|
+
partialMessages.delete(message.id);
|
|
77
77
|
}
|
|
78
78
|
completeMessages.push(...chunk.data);
|
|
79
79
|
} else {
|
|
@@ -99,10 +99,10 @@ var useLangGraphRuntime = ({
|
|
|
99
99
|
stream
|
|
100
100
|
});
|
|
101
101
|
const [isRunning, setIsRunning] = useState2(false);
|
|
102
|
-
const handleSendMessage = async (
|
|
102
|
+
const handleSendMessage = async (messages2) => {
|
|
103
103
|
try {
|
|
104
104
|
setIsRunning(true);
|
|
105
|
-
await sendMessage(
|
|
105
|
+
await sendMessage(messages2);
|
|
106
106
|
} catch (error) {
|
|
107
107
|
console.error("Error streaming messages:", error);
|
|
108
108
|
} finally {
|
|
@@ -121,24 +121,27 @@ var useLangGraphRuntime = ({
|
|
|
121
121
|
onNew: (msg) => {
|
|
122
122
|
if (msg.content.length !== 1 || msg.content[0]?.type !== "text")
|
|
123
123
|
throw new Error("Only text messages are supported");
|
|
124
|
-
return handleSendMessage(
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
return handleSendMessage([
|
|
125
|
+
{
|
|
126
|
+
type: "human",
|
|
127
|
+
content: msg.content[0].text
|
|
128
|
+
}
|
|
129
|
+
]);
|
|
128
130
|
},
|
|
129
131
|
onAddToolResult: async ({ toolCallId, toolName, result }) => {
|
|
130
|
-
await handleSendMessage(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
132
|
+
await handleSendMessage([
|
|
133
|
+
{
|
|
134
|
+
type: "tool",
|
|
135
|
+
name: toolName,
|
|
136
|
+
tool_call_id: toolCallId,
|
|
137
|
+
content: JSON.stringify(result)
|
|
138
|
+
}
|
|
139
|
+
]);
|
|
136
140
|
}
|
|
137
141
|
});
|
|
138
142
|
};
|
|
139
143
|
export {
|
|
140
144
|
convertLangchainMessages,
|
|
141
|
-
useLangGraphRuntime as useLangChainLangGraphRuntime,
|
|
142
145
|
useLangGraphMessages,
|
|
143
146
|
useLangGraphRuntime
|
|
144
147
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useLangGraphRuntime.ts","../src/convertLangchainMessages.ts","../src/useLangGraphMessages.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { LangChainMessage } from \"./types\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertLangchainMessages } from \"./convertLangchainMessages\";\nimport { useLangGraphMessages } from \"./useLangGraphMessages\";\nimport { ExternalStoreRuntime } from \"@assistant-ui/react\";\n\nexport const useLangGraphRuntime = ({\n threadId,\n stream,\n}: {\n threadId?: string | undefined;\n stream: (
|
|
1
|
+
{"version":3,"sources":["../src/useLangGraphRuntime.ts","../src/convertLangchainMessages.ts","../src/useLangGraphMessages.ts"],"sourcesContent":["import { useState } from \"react\";\nimport { LangChainMessage } from \"./types\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertLangchainMessages } from \"./convertLangchainMessages\";\nimport { useLangGraphMessages } from \"./useLangGraphMessages\";\nimport { ExternalStoreRuntime } from \"@assistant-ui/react\";\n\nexport const useLangGraphRuntime = ({\n threadId,\n stream,\n}: {\n threadId?: string | undefined;\n stream: (messages: LangChainMessage[]) => Promise<\n AsyncGenerator<{\n event: string;\n data: any;\n }>\n >;\n}): ExternalStoreRuntime => {\n const { messages, sendMessage } = useLangGraphMessages({\n stream,\n });\n\n const [isRunning, setIsRunning] = useState(false);\n const handleSendMessage = async (messages: LangChainMessage[]) => {\n try {\n setIsRunning(true);\n await sendMessage(messages);\n } catch (error) {\n console.error(\"Error streaming messages:\", error);\n } finally {\n setIsRunning(false);\n }\n };\n\n const threadMessages = useExternalMessageConverter({\n callback: convertLangchainMessages,\n messages,\n isRunning,\n });\n\n return useExternalStoreRuntime({\n threadId,\n isRunning,\n messages: threadMessages,\n onNew: (msg) => {\n if (msg.content.length !== 1 || msg.content[0]?.type !== \"text\")\n throw new Error(\"Only text messages are supported\");\n return handleSendMessage([\n {\n type: \"human\",\n content: msg.content[0].text,\n },\n ]);\n },\n onAddToolResult: async ({ toolCallId, toolName, result }) => {\n await handleSendMessage([\n {\n type: \"tool\",\n name: toolName,\n tool_call_id: toolCallId,\n content: JSON.stringify(result),\n },\n ]);\n },\n });\n};\n","\"use client\";\n\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { LangChainMessage } from \"./types\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\n\nexport const convertLangchainMessages: useExternalMessageConverter.Callback<\n LangChainMessage\n> = (message) => {\n switch (message.type) {\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"human\":\n return {\n role: \"user\",\n id: message.id,\n content: [{ type: \"text\", text: message.content }],\n };\n case \"ai\":\n return {\n role: \"assistant\",\n id: message.id,\n content: [\n {\n type: \"text\",\n text: message.content,\n },\n ...(message.tool_calls?.map(\n (chunk): ToolCallContentPart => ({\n type: \"tool-call\",\n toolCallId: chunk.id,\n toolName: chunk.name,\n args: chunk.args,\n argsText:\n message.tool_call_chunks?.find((c) => c.id === chunk.id)\n ?.args ?? JSON.stringify(chunk.args),\n }),\n ) ?? []),\n ],\n };\n case \"tool\":\n return {\n role: \"tool\",\n toolName: message.name,\n toolCallId: message.tool_call_id,\n result: message.content,\n };\n }\n};\n","import { useState, useCallback } from \"react\";\n\nexport const useLangGraphMessages = <TMessage>({\n stream,\n}: {\n stream: (messages: TMessage[]) => Promise<\n AsyncGenerator<{\n event: string;\n data: any;\n }>\n >;\n}) => {\n const [messages, setMessages] = useState<TMessage[]>([]);\n\n const sendMessage = useCallback(\n async (messages: TMessage[]) => {\n if (messages.length > 0) {\n setMessages((currentMessages) => [...currentMessages, ...messages]);\n }\n\n const response = await stream(messages);\n\n const completeMessages: TMessage[] = [];\n let partialMessages: Map<string, TMessage> = new Map();\n for await (const chunk of response) {\n if (chunk.event === \"messages/partial\") {\n for (const message of chunk.data) {\n if (!message.id) throw new Error(\"Partial message missing id\");\n\n partialMessages.set(message.id, message);\n }\n } else if (chunk.event === \"messages/complete\") {\n for (const message of chunk.data) {\n if (!message.id) continue;\n partialMessages.delete(message.id);\n }\n\n completeMessages.push(...chunk.data);\n } else {\n continue;\n }\n\n setMessages([...completeMessages, ...partialMessages.values()]);\n }\n if (partialMessages.size > 0) {\n throw new Error(\"A partial message was not marked as complete\");\n }\n },\n [stream],\n );\n\n return { messages, sendMessage };\n};\n"],"mappings":"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","names":["useState","messages","useState","messages"]}
|