@assistant-ui/react-langgraph 0.4.5 → 0.5.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/dist/LangGraphMessageAccumulator.js +36 -0
- package/dist/LangGraphMessageAccumulator.js.map +1 -0
- package/dist/appendLangChainChunk.js +44 -0
- package/dist/appendLangChainChunk.js.map +1 -0
- package/dist/convertLangChainMessages.js +71 -0
- package/dist/convertLangChainMessages.js.map +1 -0
- package/dist/index.js +16 -415
- package/dist/index.js.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/useLangGraphMessages.js +53 -0
- package/dist/useLangGraphMessages.js.map +1 -0
- package/dist/useLangGraphRuntime.js +195 -0
- package/dist/useLangGraphRuntime.js.map +1 -0
- package/package.json +15 -16
- package/dist/index.d.mts +0 -150
- package/dist/index.d.ts +0 -150
- package/dist/index.mjs +0 -394
- package/dist/index.mjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/useLangGraphRuntime.ts","../src/convertLangChainMessages.ts","../src/useLangGraphMessages.ts","../src/LangGraphMessageAccumulator.ts","../src/appendLangChainChunk.ts"],"sourcesContent":["export {\n useLangGraphRuntime,\n useLangGraphSend,\n useLangGraphSendCommand,\n useLangGraphInterruptState,\n} from \"./useLangGraphRuntime\";\n\nexport {\n useLangGraphMessages,\n type LangGraphInterruptState,\n type LangGraphCommand,\n type LangGraphSendMessageConfig,\n type LangGraphStreamCallback,\n} from \"./useLangGraphMessages\";\nexport { convertLangChainMessages } from \"./convertLangChainMessages\";\n\n/**\n * @deprecated Use `convertLangChainMessages` instead.\n */\nexport { convertLangChainMessages as convertLangchainMessages } from \"./convertLangChainMessages\";\n\nexport type {\n LangChainMessage,\n LangChainEvent,\n LangChainToolCall,\n LangChainToolCallChunk,\n} from \"./types\";\n\nexport { LangGraphMessageAccumulator } from \"./LangGraphMessageAccumulator\";\nexport { appendLangChainChunk } from \"./appendLangChainChunk\";\n","import { useEffect, useRef, useState } from \"react\";\nimport { LangChainMessage, LangChainToolCall } from \"./types\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n useThread,\n useThreadListItemRuntime,\n} from \"@assistant-ui/react\";\nimport { convertLangChainMessages } from \"./convertLangChainMessages\";\nimport {\n LangGraphCommand,\n LangGraphInterruptState,\n LangGraphSendMessageConfig,\n LangGraphStreamCallback,\n useLangGraphMessages,\n} from \"./useLangGraphMessages\";\nimport { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { AppendMessage } from \"@assistant-ui/react\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\nimport { FeedbackAdapter } from \"@assistant-ui/react\";\nimport { SpeechSynthesisAdapter } from \"@assistant-ui/react\";\nimport { appendLangChainChunk } from \"./appendLangChainChunk\";\n\nconst getPendingToolCalls = (messages: LangChainMessage[]) => {\n const pendingToolCalls = new Map<string, LangChainToolCall>();\n for (const message of messages) {\n if (message.type === \"ai\") {\n for (const toolCall of message.tool_calls ?? []) {\n pendingToolCalls.set(toolCall.id, toolCall);\n }\n }\n if (message.type === \"tool\") {\n pendingToolCalls.delete(message.tool_call_id);\n }\n }\n\n return [...pendingToolCalls.values()];\n};\n\nconst getMessageContent = (msg: AppendMessage) => {\n const allContent = [\n ...msg.content,\n ...(msg.attachments?.flatMap((a) => a.content) ?? []),\n ];\n const content = allContent.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\" as const, text: part.text };\n case \"image\":\n return { type: \"image_url\" as const, image_url: { url: part.image } };\n\n case \"tool-call\":\n throw new Error(\"Tool call appends are not supported.\");\n\n default:\n const _exhaustiveCheck: \"reasoning\" | \"source\" | \"file\" | \"audio\" =\n type;\n throw new Error(\n `Unsupported append content part type: ${_exhaustiveCheck}`,\n );\n }\n });\n\n if (content.length === 1 && content[0]?.type === \"text\") {\n return content[0].text ?? \"\";\n }\n\n return content;\n};\n\nconst symbolLangGraphRuntimeExtras = Symbol(\"langgraph-runtime-extras\");\ntype LangGraphRuntimeExtras = {\n [symbolLangGraphRuntimeExtras]: true;\n send: (\n messages: LangChainMessage[],\n config: LangGraphSendMessageConfig,\n ) => Promise<void>;\n interrupt: LangGraphInterruptState | undefined;\n};\n\nconst asLangGraphRuntimeExtras = (extras: unknown): LangGraphRuntimeExtras => {\n if (\n typeof extras !== \"object\" ||\n extras == null ||\n !(symbolLangGraphRuntimeExtras in extras)\n )\n throw new Error(\n \"This method can only be called when you are using useLangGraphRuntime\",\n );\n\n return extras as LangGraphRuntimeExtras;\n};\n\nexport const useLangGraphInterruptState = () => {\n const { interrupt } = useThread((t) => asLangGraphRuntimeExtras(t.extras));\n return interrupt;\n};\n\nexport const useLangGraphSend = () => {\n const { send } = useThread((t) => asLangGraphRuntimeExtras(t.extras));\n return send;\n};\n\nexport const useLangGraphSendCommand = () => {\n const send = useLangGraphSend();\n return (command: LangGraphCommand) => send([], { command });\n};\n\nexport const useLangGraphRuntime = ({\n autoCancelPendingToolCalls,\n adapters: { attachments, feedback, speech } = {},\n unstable_allowCancellation,\n stream,\n threadId,\n onSwitchToNewThread,\n onSwitchToThread,\n}: {\n /**\n * @deprecated For thread management use `useCloudThreadListRuntime` instead. This option will be removed in a future version.\n */\n threadId?: string | undefined;\n autoCancelPendingToolCalls?: boolean | undefined;\n unstable_allowCancellation?: boolean | undefined;\n stream: LangGraphStreamCallback<LangChainMessage>;\n /**\n * @deprecated For thread management use `useCloudThreadListRuntime` instead. This option will be removed in a future version.\n */\n onSwitchToNewThread?: () => Promise<void> | void;\n onSwitchToThread?: (threadId: string) => Promise<{\n messages: LangChainMessage[];\n interrupts?: LangGraphInterruptState[];\n }>;\n adapters?:\n | {\n attachments?: AttachmentAdapter;\n speech?: SpeechSynthesisAdapter;\n feedback?: FeedbackAdapter;\n }\n | undefined;\n}) => {\n const {\n interrupt,\n setInterrupt,\n messages,\n sendMessage,\n cancel,\n setMessages,\n } = useLangGraphMessages({\n appendMessage: appendLangChainChunk,\n stream,\n });\n\n const [isRunning, setIsRunning] = useState(false);\n const handleSendMessage = async (\n messages: LangChainMessage[],\n config: LangGraphSendMessageConfig,\n ) => {\n try {\n setIsRunning(true);\n await sendMessage(messages, config);\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 const switchToThread = !onSwitchToThread\n ? undefined\n : async (externalId: string) => {\n const { messages, interrupts } = await onSwitchToThread(externalId);\n setMessages(messages);\n setInterrupt(interrupts?.[0]);\n };\n\n const threadList: NonNullable<\n ExternalStoreAdapter[\"adapters\"]\n >[\"threadList\"] = {\n threadId,\n onSwitchToNewThread: !onSwitchToNewThread\n ? undefined\n : async () => {\n await onSwitchToNewThread();\n setMessages([]);\n },\n onSwitchToThread: switchToThread,\n };\n\n const loadingRef = useRef(false);\n const threadListItemRuntime = useThreadListItemRuntime({ optional: true });\n useEffect(() => {\n if (!threadListItemRuntime || !switchToThread || loadingRef.current) return;\n\n const externalId = threadListItemRuntime.getState().externalId;\n if (externalId) {\n loadingRef.current = true;\n switchToThread(externalId).finally(() => {\n loadingRef.current = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return useExternalStoreRuntime({\n isRunning,\n messages: threadMessages,\n adapters: {\n attachments,\n feedback,\n speech,\n threadList,\n },\n extras: {\n [symbolLangGraphRuntimeExtras]: true,\n interrupt,\n send: handleSendMessage,\n } satisfies LangGraphRuntimeExtras,\n onNew: (msg) => {\n const cancellations =\n autoCancelPendingToolCalls !== false\n ? getPendingToolCalls(messages).map(\n (t) =>\n ({\n type: \"tool\",\n name: t.name,\n tool_call_id: t.id,\n content: JSON.stringify({ cancelled: true }),\n }) satisfies LangChainMessage & { type: \"tool\" },\n )\n : [];\n\n return handleSendMessage(\n [\n ...cancellations,\n {\n type: \"human\",\n content: getMessageContent(msg),\n },\n ],\n {\n runConfig: msg.runConfig,\n },\n );\n },\n onAddToolResult: async ({ toolCallId, toolName, result }) => {\n // TODO parallel human in the loop calls\n await handleSendMessage(\n [\n {\n type: \"tool\",\n name: toolName,\n tool_call_id: toolCallId,\n content: JSON.stringify(result),\n },\n ],\n // TODO reuse runconfig here!\n {},\n );\n },\n onCancel: unstable_allowCancellation\n ? async () => {\n cancel();\n }\n : undefined,\n });\n};\n","\"use client\";\n\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { LangChainMessage } from \"./types\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { ThreadUserMessage } from \"@assistant-ui/react\";\n\nconst contentToParts = (content: LangChainMessage[\"content\"]) => {\n if (typeof content === \"string\")\n return [{ type: \"text\" as const, text: content }];\n return content\n .map((part): ThreadUserMessage[\"content\"][number] | null => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\", text: part.text };\n case \"image_url\":\n if (typeof part.image_url === \"string\") {\n return { type: \"image\", image: part.image_url };\n } else {\n return {\n type: \"image\",\n image: part.image_url.url,\n };\n }\n\n case \"tool_use\":\n return null;\n default:\n const _exhaustiveCheck: never = type;\n throw new Error(`Unknown content part type: ${_exhaustiveCheck}`);\n }\n })\n .filter((a) => a !== null);\n};\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: contentToParts(message.content),\n };\n case \"ai\":\n return {\n role: \"assistant\",\n id: message.id,\n content: [\n ...contentToParts(message.content),\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 artifact: message.artifact,\n };\n }\n};\n","import { useState, useCallback, useRef } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { LangGraphMessageAccumulator } from \"./LangGraphMessageAccumulator\";\n\nexport type LangGraphCommand = {\n resume: string;\n};\n\nexport type LangGraphSendMessageConfig = {\n command?: LangGraphCommand;\n runConfig?: unknown;\n};\n\ntype LangGraphMessagesEvent<TMessage> = {\n event:\n | \"messages\"\n | \"messages/partial\"\n | \"messages/complete\"\n | \"metadata\"\n | \"updates\"\n | string;\n data: TMessage[] | any;\n};\nexport type LangGraphStreamCallback<TMessage> = (\n messages: TMessage[],\n config: LangGraphSendMessageConfig & { abortSignal: AbortSignal },\n) =>\n | Promise<AsyncGenerator<LangGraphMessagesEvent<TMessage>>>\n | AsyncGenerator<LangGraphMessagesEvent<TMessage>>;\n\nexport type LangGraphInterruptState = {\n value?: any;\n resumable?: boolean;\n when: string;\n ns?: string[];\n};\n\nconst DEFAULT_APPEND_MESSAGE = <TMessage>(\n _: TMessage | undefined,\n curr: TMessage,\n) => curr;\n\nexport const useLangGraphMessages = <TMessage extends { id?: string }>({\n stream,\n appendMessage = DEFAULT_APPEND_MESSAGE,\n}: {\n stream: LangGraphStreamCallback<TMessage>;\n appendMessage?: (prev: TMessage | undefined, curr: TMessage) => TMessage;\n}) => {\n const [interrupt, setInterrupt] = useState<\n LangGraphInterruptState | undefined\n >();\n const [messages, setMessages] = useState<TMessage[]>([]);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const sendMessage = useCallback(\n async (newMessages: TMessage[], config: LangGraphSendMessageConfig) => {\n // ensure all messages have an ID\n newMessages = newMessages.map((m) => (m.id ? m : { ...m, id: uuidv4() }));\n\n const accumulator = new LangGraphMessageAccumulator({\n initialMessages: messages,\n appendMessage,\n });\n setMessages(accumulator.addMessages(newMessages));\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n const response = await stream(newMessages, {\n ...config,\n abortSignal: abortController.signal,\n });\n\n for await (const chunk of response) {\n if (\n chunk.event === \"messages/partial\" ||\n chunk.event === \"messages/complete\"\n ) {\n setMessages(accumulator.addMessages(chunk.data));\n } else if (chunk.event === \"updates\") {\n setInterrupt(chunk.data.__interrupt__?.[0]);\n }\n }\n },\n [messages, stream, appendMessage],\n );\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, [abortControllerRef]);\n\n return {\n interrupt,\n messages,\n sendMessage,\n cancel,\n setInterrupt,\n setMessages,\n };\n};\n","import { v4 as uuidv4 } from \"uuid\";\n\nexport type LangGraphMessagesEvent<TMessage> = {\n event:\n | \"messages\"\n | \"messages/partial\"\n | \"messages/complete\"\n | \"metadata\"\n | \"updates\"\n | string;\n data: TMessage[] | any;\n};\n\nexport type LangGraphStateAccumulatorConfig<TMessage> = {\n initialMessages?: TMessage[];\n appendMessage?: (prev: TMessage | undefined, curr: TMessage) => TMessage;\n};\n\nexport class LangGraphMessageAccumulator<TMessage extends { id?: string }> {\n private messagesMap = new Map<string, TMessage>();\n private appendMessage: (\n prev: TMessage | undefined,\n curr: TMessage,\n ) => TMessage;\n\n constructor({\n initialMessages = [],\n appendMessage = ((_: TMessage | undefined, curr: TMessage) => curr) as (\n prev: TMessage | undefined,\n curr: TMessage,\n ) => TMessage,\n }: LangGraphStateAccumulatorConfig<TMessage> = {}) {\n this.appendMessage = appendMessage;\n this.addMessages(initialMessages);\n }\n\n private ensureMessageId(message: TMessage): TMessage {\n return message.id ? message : { ...message, id: uuidv4() };\n }\n\n public addMessages(newMessages: TMessage[]) {\n if (newMessages.length === 0) return this.getMessages();\n\n for (const message of newMessages.map(this.ensureMessageId)) {\n const previous = message.id\n ? this.messagesMap.get(message.id)\n : undefined;\n this.messagesMap.set(\n message.id ?? uuidv4(),\n this.appendMessage(previous, message),\n );\n }\n return this.getMessages();\n }\n\n public getMessages(): TMessage[] {\n return [...this.messagesMap.values()];\n }\n\n public clear() {\n this.messagesMap.clear();\n }\n}\n","import { LangChainMessage, LangChainMessageChunk } from \"./types\";\nimport { parsePartialJsonObject } from \"assistant-stream/utils\";\n\nexport const appendLangChainChunk = (\n prev: LangChainMessage | undefined,\n curr: LangChainMessage | LangChainMessageChunk,\n): LangChainMessage => {\n if (curr.type !== \"AIMessageChunk\") {\n return curr;\n }\n\n if (!prev || prev.type !== \"ai\") {\n return {\n ...curr,\n type: curr.type.replace(\"MessageChunk\", \"\").toLowerCase(),\n } as LangChainMessage;\n }\n\n const newContent =\n typeof prev.content === \"string\"\n ? [{ type: \"text\" as const, text: prev.content }]\n : [...prev.content];\n\n for (const chunk of curr.content) {\n if (chunk.type === \"text\") {\n const existing = newContent[chunk.index] ?? { type: \"text\", text: \"\" };\n if (existing.type !== \"text\") throw new Error(\"\");\n newContent[chunk.index] = {\n ...existing,\n ...chunk,\n text: existing.text + chunk.text,\n };\n }\n }\n\n const newToolCalls = [...(prev.tool_calls ?? [])];\n for (const chunk of curr.tool_call_chunks) {\n const existing = newToolCalls[chunk.index - 1] ?? { argsText: \"\" };\n const newArgsText = existing.argsText + chunk.args;\n newToolCalls[chunk.index - 1] = {\n ...chunk,\n ...existing,\n argsText: newArgsText,\n args:\n parsePartialJsonObject(newArgsText) ??\n (\"args\" in existing ? existing.args : {}),\n };\n }\n\n return {\n ...prev,\n content: newContent,\n tool_calls: newToolCalls,\n };\n};\n"],"mappings":"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","names":["import_react","import_uuid","uuidv4","uuidv4","messages"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\n useLangGraphRuntime,\n useLangGraphSend,\n useLangGraphSendCommand,\n useLangGraphInterruptState,\n} from \"./useLangGraphRuntime\";\n\nexport {\n useLangGraphMessages,\n type LangGraphInterruptState,\n type LangGraphCommand,\n type LangGraphSendMessageConfig,\n type LangGraphStreamCallback,\n} from \"./useLangGraphMessages\";\nexport { convertLangChainMessages } from \"./convertLangChainMessages\";\n\n/**\n * @deprecated Use `convertLangChainMessages` instead.\n */\nexport { convertLangChainMessages as convertLangchainMessages } from \"./convertLangChainMessages\";\n\nexport type {\n LangChainMessage,\n LangChainEvent,\n LangChainToolCall,\n LangChainToolCallChunk,\n} from \"./types\";\n\nexport { LangGraphMessageAccumulator } from \"./LangGraphMessageAccumulator\";\nexport { appendLangChainChunk } from \"./appendLangChainChunk\";\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,OAKK;AACP,SAAS,gCAAgC;AAKzC,SAAqC,4BAA5BA,iCAA4D;AASrE,SAAS,mCAAmC;AAC5C,SAAS,4BAA4B;","names":["convertLangChainMessages"]}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { useState, useCallback, useRef } from "react";
|
|
2
|
+
import { v4 as uuidv4 } from "uuid";
|
|
3
|
+
import { LangGraphMessageAccumulator } from "./LangGraphMessageAccumulator";
|
|
4
|
+
const DEFAULT_APPEND_MESSAGE = (_, curr) => curr;
|
|
5
|
+
const useLangGraphMessages = ({
|
|
6
|
+
stream,
|
|
7
|
+
appendMessage = DEFAULT_APPEND_MESSAGE
|
|
8
|
+
}) => {
|
|
9
|
+
const [interrupt, setInterrupt] = useState();
|
|
10
|
+
const [messages, setMessages] = useState([]);
|
|
11
|
+
const abortControllerRef = useRef(null);
|
|
12
|
+
const sendMessage = useCallback(
|
|
13
|
+
async (newMessages, config) => {
|
|
14
|
+
newMessages = newMessages.map((m) => m.id ? m : { ...m, id: uuidv4() });
|
|
15
|
+
const accumulator = new LangGraphMessageAccumulator({
|
|
16
|
+
initialMessages: messages,
|
|
17
|
+
appendMessage
|
|
18
|
+
});
|
|
19
|
+
setMessages(accumulator.addMessages(newMessages));
|
|
20
|
+
const abortController = new AbortController();
|
|
21
|
+
abortControllerRef.current = abortController;
|
|
22
|
+
const response = await stream(newMessages, {
|
|
23
|
+
...config,
|
|
24
|
+
abortSignal: abortController.signal
|
|
25
|
+
});
|
|
26
|
+
for await (const chunk of response) {
|
|
27
|
+
if (chunk.event === "messages/partial" || chunk.event === "messages/complete") {
|
|
28
|
+
setMessages(accumulator.addMessages(chunk.data));
|
|
29
|
+
} else if (chunk.event === "updates") {
|
|
30
|
+
setInterrupt(chunk.data.__interrupt__?.[0]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
[messages, stream, appendMessage]
|
|
35
|
+
);
|
|
36
|
+
const cancel = useCallback(() => {
|
|
37
|
+
if (abortControllerRef.current) {
|
|
38
|
+
abortControllerRef.current.abort();
|
|
39
|
+
}
|
|
40
|
+
}, [abortControllerRef]);
|
|
41
|
+
return {
|
|
42
|
+
interrupt,
|
|
43
|
+
messages,
|
|
44
|
+
sendMessage,
|
|
45
|
+
cancel,
|
|
46
|
+
setInterrupt,
|
|
47
|
+
setMessages
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
export {
|
|
51
|
+
useLangGraphMessages
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=useLangGraphMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/useLangGraphMessages.ts"],"sourcesContent":["import { useState, useCallback, useRef } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { LangGraphMessageAccumulator } from \"./LangGraphMessageAccumulator\";\n\nexport type LangGraphCommand = {\n resume: string;\n};\n\nexport type LangGraphSendMessageConfig = {\n command?: LangGraphCommand;\n runConfig?: unknown;\n};\n\ntype LangGraphMessagesEvent<TMessage> = {\n event:\n | \"messages\"\n | \"messages/partial\"\n | \"messages/complete\"\n | \"metadata\"\n | \"updates\"\n | string;\n data: TMessage[] | any;\n};\nexport type LangGraphStreamCallback<TMessage> = (\n messages: TMessage[],\n config: LangGraphSendMessageConfig & { abortSignal: AbortSignal },\n) =>\n | Promise<AsyncGenerator<LangGraphMessagesEvent<TMessage>>>\n | AsyncGenerator<LangGraphMessagesEvent<TMessage>>;\n\nexport type LangGraphInterruptState = {\n value?: any;\n resumable?: boolean;\n when: string;\n ns?: string[];\n};\n\nconst DEFAULT_APPEND_MESSAGE = <TMessage>(\n _: TMessage | undefined,\n curr: TMessage,\n) => curr;\n\nexport const useLangGraphMessages = <TMessage extends { id?: string }>({\n stream,\n appendMessage = DEFAULT_APPEND_MESSAGE,\n}: {\n stream: LangGraphStreamCallback<TMessage>;\n appendMessage?: (prev: TMessage | undefined, curr: TMessage) => TMessage;\n}) => {\n const [interrupt, setInterrupt] = useState<\n LangGraphInterruptState | undefined\n >();\n const [messages, setMessages] = useState<TMessage[]>([]);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const sendMessage = useCallback(\n async (newMessages: TMessage[], config: LangGraphSendMessageConfig) => {\n // ensure all messages have an ID\n newMessages = newMessages.map((m) => (m.id ? m : { ...m, id: uuidv4() }));\n\n const accumulator = new LangGraphMessageAccumulator({\n initialMessages: messages,\n appendMessage,\n });\n setMessages(accumulator.addMessages(newMessages));\n\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n const response = await stream(newMessages, {\n ...config,\n abortSignal: abortController.signal,\n });\n\n for await (const chunk of response) {\n if (\n chunk.event === \"messages/partial\" ||\n chunk.event === \"messages/complete\"\n ) {\n setMessages(accumulator.addMessages(chunk.data));\n } else if (chunk.event === \"updates\") {\n setInterrupt(chunk.data.__interrupt__?.[0]);\n }\n }\n },\n [messages, stream, appendMessage],\n );\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n }, [abortControllerRef]);\n\n return {\n interrupt,\n messages,\n sendMessage,\n cancel,\n setInterrupt,\n setMessages,\n };\n};\n"],"mappings":"AAAA,SAAS,UAAU,aAAa,cAAc;AAC9C,SAAS,MAAM,cAAc;AAC7B,SAAS,mCAAmC;AAmC5C,MAAM,yBAAyB,CAC7B,GACA,SACG;AAEE,MAAM,uBAAuB,CAAmC;AAAA,EACrE;AAAA,EACA,gBAAgB;AAClB,MAGM;AACJ,QAAM,CAAC,WAAW,YAAY,IAAI,SAEhC;AACF,QAAM,CAAC,UAAU,WAAW,IAAI,SAAqB,CAAC,CAAC;AACvD,QAAM,qBAAqB,OAA+B,IAAI;AAE9D,QAAM,cAAc;AAAA,IAClB,OAAO,aAAyB,WAAuC;AAErE,oBAAc,YAAY,IAAI,CAAC,MAAO,EAAE,KAAK,IAAI,EAAE,GAAG,GAAG,IAAI,OAAO,EAAE,CAAE;AAExE,YAAM,cAAc,IAAI,4BAA4B;AAAA,QAClD,iBAAiB;AAAA,QACjB;AAAA,MACF,CAAC;AACD,kBAAY,YAAY,YAAY,WAAW,CAAC;AAEhD,YAAM,kBAAkB,IAAI,gBAAgB;AAC5C,yBAAmB,UAAU;AAC7B,YAAM,WAAW,MAAM,OAAO,aAAa;AAAA,QACzC,GAAG;AAAA,QACH,aAAa,gBAAgB;AAAA,MAC/B,CAAC;AAED,uBAAiB,SAAS,UAAU;AAClC,YACE,MAAM,UAAU,sBAChB,MAAM,UAAU,qBAChB;AACA,sBAAY,YAAY,YAAY,MAAM,IAAI,CAAC;AAAA,QACjD,WAAW,MAAM,UAAU,WAAW;AACpC,uBAAa,MAAM,KAAK,gBAAgB,CAAC,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,UAAU,QAAQ,aAAa;AAAA,EAClC;AAEA,QAAM,SAAS,YAAY,MAAM;AAC/B,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,MAAM;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,kBAAkB,CAAC;AAEvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
import {
|
|
3
|
+
useExternalMessageConverter,
|
|
4
|
+
useExternalStoreRuntime,
|
|
5
|
+
useThread,
|
|
6
|
+
useThreadListItemRuntime
|
|
7
|
+
} from "@assistant-ui/react";
|
|
8
|
+
import { convertLangChainMessages } from "./convertLangChainMessages";
|
|
9
|
+
import {
|
|
10
|
+
useLangGraphMessages
|
|
11
|
+
} from "./useLangGraphMessages";
|
|
12
|
+
import { appendLangChainChunk } from "./appendLangChainChunk";
|
|
13
|
+
const getPendingToolCalls = (messages) => {
|
|
14
|
+
const pendingToolCalls = /* @__PURE__ */ new Map();
|
|
15
|
+
for (const message of messages) {
|
|
16
|
+
if (message.type === "ai") {
|
|
17
|
+
for (const toolCall of message.tool_calls ?? []) {
|
|
18
|
+
pendingToolCalls.set(toolCall.id, toolCall);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (message.type === "tool") {
|
|
22
|
+
pendingToolCalls.delete(message.tool_call_id);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return [...pendingToolCalls.values()];
|
|
26
|
+
};
|
|
27
|
+
const getMessageContent = (msg) => {
|
|
28
|
+
const allContent = [
|
|
29
|
+
...msg.content,
|
|
30
|
+
...msg.attachments?.flatMap((a) => a.content) ?? []
|
|
31
|
+
];
|
|
32
|
+
const content = allContent.map((part) => {
|
|
33
|
+
const type = part.type;
|
|
34
|
+
switch (type) {
|
|
35
|
+
case "text":
|
|
36
|
+
return { type: "text", text: part.text };
|
|
37
|
+
case "image":
|
|
38
|
+
return { type: "image_url", image_url: { url: part.image } };
|
|
39
|
+
case "tool-call":
|
|
40
|
+
throw new Error("Tool call appends are not supported.");
|
|
41
|
+
default:
|
|
42
|
+
const _exhaustiveCheck = type;
|
|
43
|
+
throw new Error(
|
|
44
|
+
`Unsupported append content part type: ${_exhaustiveCheck}`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
if (content.length === 1 && content[0]?.type === "text") {
|
|
49
|
+
return content[0].text ?? "";
|
|
50
|
+
}
|
|
51
|
+
return content;
|
|
52
|
+
};
|
|
53
|
+
const symbolLangGraphRuntimeExtras = Symbol("langgraph-runtime-extras");
|
|
54
|
+
const asLangGraphRuntimeExtras = (extras) => {
|
|
55
|
+
if (typeof extras !== "object" || extras == null || !(symbolLangGraphRuntimeExtras in extras))
|
|
56
|
+
throw new Error(
|
|
57
|
+
"This method can only be called when you are using useLangGraphRuntime"
|
|
58
|
+
);
|
|
59
|
+
return extras;
|
|
60
|
+
};
|
|
61
|
+
const useLangGraphInterruptState = () => {
|
|
62
|
+
const { interrupt } = useThread((t) => asLangGraphRuntimeExtras(t.extras));
|
|
63
|
+
return interrupt;
|
|
64
|
+
};
|
|
65
|
+
const useLangGraphSend = () => {
|
|
66
|
+
const { send } = useThread((t) => asLangGraphRuntimeExtras(t.extras));
|
|
67
|
+
return send;
|
|
68
|
+
};
|
|
69
|
+
const useLangGraphSendCommand = () => {
|
|
70
|
+
const send = useLangGraphSend();
|
|
71
|
+
return (command) => send([], { command });
|
|
72
|
+
};
|
|
73
|
+
const useLangGraphRuntime = ({
|
|
74
|
+
autoCancelPendingToolCalls,
|
|
75
|
+
adapters: { attachments, feedback, speech } = {},
|
|
76
|
+
unstable_allowCancellation,
|
|
77
|
+
stream,
|
|
78
|
+
threadId,
|
|
79
|
+
onSwitchToNewThread,
|
|
80
|
+
onSwitchToThread
|
|
81
|
+
}) => {
|
|
82
|
+
const {
|
|
83
|
+
interrupt,
|
|
84
|
+
setInterrupt,
|
|
85
|
+
messages,
|
|
86
|
+
sendMessage,
|
|
87
|
+
cancel,
|
|
88
|
+
setMessages
|
|
89
|
+
} = useLangGraphMessages({
|
|
90
|
+
appendMessage: appendLangChainChunk,
|
|
91
|
+
stream
|
|
92
|
+
});
|
|
93
|
+
const [isRunning, setIsRunning] = useState(false);
|
|
94
|
+
const handleSendMessage = async (messages2, config) => {
|
|
95
|
+
try {
|
|
96
|
+
setIsRunning(true);
|
|
97
|
+
await sendMessage(messages2, config);
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.error("Error streaming messages:", error);
|
|
100
|
+
} finally {
|
|
101
|
+
setIsRunning(false);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const threadMessages = useExternalMessageConverter({
|
|
105
|
+
callback: convertLangChainMessages,
|
|
106
|
+
messages,
|
|
107
|
+
isRunning
|
|
108
|
+
});
|
|
109
|
+
const switchToThread = !onSwitchToThread ? void 0 : async (externalId) => {
|
|
110
|
+
const { messages: messages2, interrupts } = await onSwitchToThread(externalId);
|
|
111
|
+
setMessages(messages2);
|
|
112
|
+
setInterrupt(interrupts?.[0]);
|
|
113
|
+
};
|
|
114
|
+
const threadList = {
|
|
115
|
+
threadId,
|
|
116
|
+
onSwitchToNewThread: !onSwitchToNewThread ? void 0 : async () => {
|
|
117
|
+
await onSwitchToNewThread();
|
|
118
|
+
setMessages([]);
|
|
119
|
+
},
|
|
120
|
+
onSwitchToThread: switchToThread
|
|
121
|
+
};
|
|
122
|
+
const loadingRef = useRef(false);
|
|
123
|
+
const threadListItemRuntime = useThreadListItemRuntime({ optional: true });
|
|
124
|
+
useEffect(() => {
|
|
125
|
+
if (!threadListItemRuntime || !switchToThread || loadingRef.current) return;
|
|
126
|
+
const externalId = threadListItemRuntime.getState().externalId;
|
|
127
|
+
if (externalId) {
|
|
128
|
+
loadingRef.current = true;
|
|
129
|
+
switchToThread(externalId).finally(() => {
|
|
130
|
+
loadingRef.current = false;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}, []);
|
|
134
|
+
return useExternalStoreRuntime({
|
|
135
|
+
isRunning,
|
|
136
|
+
messages: threadMessages,
|
|
137
|
+
adapters: {
|
|
138
|
+
attachments,
|
|
139
|
+
feedback,
|
|
140
|
+
speech,
|
|
141
|
+
threadList
|
|
142
|
+
},
|
|
143
|
+
extras: {
|
|
144
|
+
[symbolLangGraphRuntimeExtras]: true,
|
|
145
|
+
interrupt,
|
|
146
|
+
send: handleSendMessage
|
|
147
|
+
},
|
|
148
|
+
onNew: (msg) => {
|
|
149
|
+
const cancellations = autoCancelPendingToolCalls !== false ? getPendingToolCalls(messages).map(
|
|
150
|
+
(t) => ({
|
|
151
|
+
type: "tool",
|
|
152
|
+
name: t.name,
|
|
153
|
+
tool_call_id: t.id,
|
|
154
|
+
content: JSON.stringify({ cancelled: true })
|
|
155
|
+
})
|
|
156
|
+
) : [];
|
|
157
|
+
return handleSendMessage(
|
|
158
|
+
[
|
|
159
|
+
...cancellations,
|
|
160
|
+
{
|
|
161
|
+
type: "human",
|
|
162
|
+
content: getMessageContent(msg)
|
|
163
|
+
}
|
|
164
|
+
],
|
|
165
|
+
{
|
|
166
|
+
runConfig: msg.runConfig
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
},
|
|
170
|
+
onAddToolResult: async ({ toolCallId, toolName, result }) => {
|
|
171
|
+
await handleSendMessage(
|
|
172
|
+
[
|
|
173
|
+
{
|
|
174
|
+
type: "tool",
|
|
175
|
+
name: toolName,
|
|
176
|
+
tool_call_id: toolCallId,
|
|
177
|
+
content: JSON.stringify(result)
|
|
178
|
+
}
|
|
179
|
+
],
|
|
180
|
+
// TODO reuse runconfig here!
|
|
181
|
+
{}
|
|
182
|
+
);
|
|
183
|
+
},
|
|
184
|
+
onCancel: unstable_allowCancellation ? async () => {
|
|
185
|
+
cancel();
|
|
186
|
+
} : void 0
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
export {
|
|
190
|
+
useLangGraphInterruptState,
|
|
191
|
+
useLangGraphRuntime,
|
|
192
|
+
useLangGraphSend,
|
|
193
|
+
useLangGraphSendCommand
|
|
194
|
+
};
|
|
195
|
+
//# sourceMappingURL=useLangGraphRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/useLangGraphRuntime.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { LangChainMessage, LangChainToolCall } from \"./types\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n useThread,\n useThreadListItemRuntime,\n} from \"@assistant-ui/react\";\nimport { convertLangChainMessages } from \"./convertLangChainMessages\";\nimport {\n LangGraphCommand,\n LangGraphInterruptState,\n LangGraphSendMessageConfig,\n LangGraphStreamCallback,\n useLangGraphMessages,\n} from \"./useLangGraphMessages\";\nimport { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { AppendMessage } from \"@assistant-ui/react\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\nimport { FeedbackAdapter } from \"@assistant-ui/react\";\nimport { SpeechSynthesisAdapter } from \"@assistant-ui/react\";\nimport { appendLangChainChunk } from \"./appendLangChainChunk\";\n\nconst getPendingToolCalls = (messages: LangChainMessage[]) => {\n const pendingToolCalls = new Map<string, LangChainToolCall>();\n for (const message of messages) {\n if (message.type === \"ai\") {\n for (const toolCall of message.tool_calls ?? []) {\n pendingToolCalls.set(toolCall.id, toolCall);\n }\n }\n if (message.type === \"tool\") {\n pendingToolCalls.delete(message.tool_call_id);\n }\n }\n\n return [...pendingToolCalls.values()];\n};\n\nconst getMessageContent = (msg: AppendMessage) => {\n const allContent = [\n ...msg.content,\n ...(msg.attachments?.flatMap((a) => a.content) ?? []),\n ];\n const content = allContent.map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return { type: \"text\" as const, text: part.text };\n case \"image\":\n return { type: \"image_url\" as const, image_url: { url: part.image } };\n\n case \"tool-call\":\n throw new Error(\"Tool call appends are not supported.\");\n\n default:\n const _exhaustiveCheck: \"reasoning\" | \"source\" | \"file\" | \"audio\" =\n type;\n throw new Error(\n `Unsupported append content part type: ${_exhaustiveCheck}`,\n );\n }\n });\n\n if (content.length === 1 && content[0]?.type === \"text\") {\n return content[0].text ?? \"\";\n }\n\n return content;\n};\n\nconst symbolLangGraphRuntimeExtras = Symbol(\"langgraph-runtime-extras\");\ntype LangGraphRuntimeExtras = {\n [symbolLangGraphRuntimeExtras]: true;\n send: (\n messages: LangChainMessage[],\n config: LangGraphSendMessageConfig,\n ) => Promise<void>;\n interrupt: LangGraphInterruptState | undefined;\n};\n\nconst asLangGraphRuntimeExtras = (extras: unknown): LangGraphRuntimeExtras => {\n if (\n typeof extras !== \"object\" ||\n extras == null ||\n !(symbolLangGraphRuntimeExtras in extras)\n )\n throw new Error(\n \"This method can only be called when you are using useLangGraphRuntime\",\n );\n\n return extras as LangGraphRuntimeExtras;\n};\n\nexport const useLangGraphInterruptState = () => {\n const { interrupt } = useThread((t) => asLangGraphRuntimeExtras(t.extras));\n return interrupt;\n};\n\nexport const useLangGraphSend = () => {\n const { send } = useThread((t) => asLangGraphRuntimeExtras(t.extras));\n return send;\n};\n\nexport const useLangGraphSendCommand = () => {\n const send = useLangGraphSend();\n return (command: LangGraphCommand) => send([], { command });\n};\n\nexport const useLangGraphRuntime = ({\n autoCancelPendingToolCalls,\n adapters: { attachments, feedback, speech } = {},\n unstable_allowCancellation,\n stream,\n threadId,\n onSwitchToNewThread,\n onSwitchToThread,\n}: {\n /**\n * @deprecated For thread management use `useCloudThreadListRuntime` instead. This option will be removed in a future version.\n */\n threadId?: string | undefined;\n autoCancelPendingToolCalls?: boolean | undefined;\n unstable_allowCancellation?: boolean | undefined;\n stream: LangGraphStreamCallback<LangChainMessage>;\n /**\n * @deprecated For thread management use `useCloudThreadListRuntime` instead. This option will be removed in a future version.\n */\n onSwitchToNewThread?: () => Promise<void> | void;\n onSwitchToThread?: (threadId: string) => Promise<{\n messages: LangChainMessage[];\n interrupts?: LangGraphInterruptState[];\n }>;\n adapters?:\n | {\n attachments?: AttachmentAdapter;\n speech?: SpeechSynthesisAdapter;\n feedback?: FeedbackAdapter;\n }\n | undefined;\n}) => {\n const {\n interrupt,\n setInterrupt,\n messages,\n sendMessage,\n cancel,\n setMessages,\n } = useLangGraphMessages({\n appendMessage: appendLangChainChunk,\n stream,\n });\n\n const [isRunning, setIsRunning] = useState(false);\n const handleSendMessage = async (\n messages: LangChainMessage[],\n config: LangGraphSendMessageConfig,\n ) => {\n try {\n setIsRunning(true);\n await sendMessage(messages, config);\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 const switchToThread = !onSwitchToThread\n ? undefined\n : async (externalId: string) => {\n const { messages, interrupts } = await onSwitchToThread(externalId);\n setMessages(messages);\n setInterrupt(interrupts?.[0]);\n };\n\n const threadList: NonNullable<\n ExternalStoreAdapter[\"adapters\"]\n >[\"threadList\"] = {\n threadId,\n onSwitchToNewThread: !onSwitchToNewThread\n ? undefined\n : async () => {\n await onSwitchToNewThread();\n setMessages([]);\n },\n onSwitchToThread: switchToThread,\n };\n\n const loadingRef = useRef(false);\n const threadListItemRuntime = useThreadListItemRuntime({ optional: true });\n useEffect(() => {\n if (!threadListItemRuntime || !switchToThread || loadingRef.current) return;\n\n const externalId = threadListItemRuntime.getState().externalId;\n if (externalId) {\n loadingRef.current = true;\n switchToThread(externalId).finally(() => {\n loadingRef.current = false;\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return useExternalStoreRuntime({\n isRunning,\n messages: threadMessages,\n adapters: {\n attachments,\n feedback,\n speech,\n threadList,\n },\n extras: {\n [symbolLangGraphRuntimeExtras]: true,\n interrupt,\n send: handleSendMessage,\n } satisfies LangGraphRuntimeExtras,\n onNew: (msg) => {\n const cancellations =\n autoCancelPendingToolCalls !== false\n ? getPendingToolCalls(messages).map(\n (t) =>\n ({\n type: \"tool\",\n name: t.name,\n tool_call_id: t.id,\n content: JSON.stringify({ cancelled: true }),\n }) satisfies LangChainMessage & { type: \"tool\" },\n )\n : [];\n\n return handleSendMessage(\n [\n ...cancellations,\n {\n type: \"human\",\n content: getMessageContent(msg),\n },\n ],\n {\n runConfig: msg.runConfig,\n },\n );\n },\n onAddToolResult: async ({ toolCallId, toolName, result }) => {\n // TODO parallel human in the loop calls\n await handleSendMessage(\n [\n {\n type: \"tool\",\n name: toolName,\n tool_call_id: toolCallId,\n content: JSON.stringify(result),\n },\n ],\n // TODO reuse runconfig here!\n {},\n );\n },\n onCancel: unstable_allowCancellation\n ? async () => {\n cancel();\n }\n : undefined,\n });\n};\n"],"mappings":"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","names":["messages"]}
|
package/package.json
CHANGED
|
@@ -1,22 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-langgraph",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"exports": {
|
|
6
7
|
".": {
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
"default": "./dist/index.mjs"
|
|
10
|
-
},
|
|
11
|
-
"require": {
|
|
12
|
-
"types": "./dist/index.d.ts",
|
|
13
|
-
"default": "./dist/index.js"
|
|
14
|
-
}
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"default": "./dist/index.js"
|
|
15
10
|
}
|
|
16
11
|
},
|
|
17
|
-
"source": "./src/index.ts",
|
|
18
12
|
"main": "./dist/index.js",
|
|
19
|
-
"module": "./dist/index.mjs",
|
|
20
13
|
"types": "./dist/index.d.ts",
|
|
21
14
|
"files": [
|
|
22
15
|
"dist",
|
|
@@ -24,13 +17,14 @@
|
|
|
24
17
|
],
|
|
25
18
|
"sideEffects": false,
|
|
26
19
|
"dependencies": {
|
|
27
|
-
"assistant-stream": "^0.
|
|
20
|
+
"assistant-stream": "^0.2.0",
|
|
28
21
|
"uuid": "^11.1.0",
|
|
29
22
|
"zod": "^3.24.3"
|
|
30
23
|
},
|
|
31
24
|
"peerDependencies": {
|
|
32
|
-
"@assistant-ui/react": "^0.
|
|
25
|
+
"@assistant-ui/react": "^0.10.0",
|
|
33
26
|
"@types/react": "*",
|
|
27
|
+
"assistant-stream": "^0.2.0",
|
|
34
28
|
"react": "^18 || ^19 || ^19.0.0-rc"
|
|
35
29
|
},
|
|
36
30
|
"peerDependenciesMeta": {
|
|
@@ -39,9 +33,14 @@
|
|
|
39
33
|
}
|
|
40
34
|
},
|
|
41
35
|
"devDependencies": {
|
|
36
|
+
"@types/node": "^22.14.1",
|
|
37
|
+
"@types/react": "^19.1.0",
|
|
38
|
+
"@types/uuid": "^9.0.8",
|
|
39
|
+
"eslint": "^9",
|
|
42
40
|
"eslint-config-next": "15.3.1",
|
|
43
|
-
"
|
|
44
|
-
"
|
|
41
|
+
"react": "^19.1.0",
|
|
42
|
+
"tsx": "^4.19.3",
|
|
43
|
+
"@assistant-ui/tsbuildutils": "0.0.1",
|
|
45
44
|
"@assistant-ui/tsconfig": "0.0.0"
|
|
46
45
|
},
|
|
47
46
|
"publishConfig": {
|
|
@@ -57,6 +56,6 @@
|
|
|
57
56
|
"url": "https://github.com/assistant-ui/assistant-ui/issues"
|
|
58
57
|
},
|
|
59
58
|
"scripts": {
|
|
60
|
-
"build": "
|
|
59
|
+
"build": "tsx scripts/build.mts"
|
|
61
60
|
}
|
|
62
61
|
}
|
package/dist/index.d.mts
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import * as _assistant_ui_react_internal from '@assistant-ui/react/internal';
|
|
2
|
-
import { ReadonlyJSONObject } from 'assistant-stream/utils';
|
|
3
|
-
import * as react from 'react';
|
|
4
|
-
import { AttachmentAdapter, SpeechSynthesisAdapter, FeedbackAdapter, useExternalMessageConverter } from '@assistant-ui/react';
|
|
5
|
-
|
|
6
|
-
type LangChainToolCallChunk = {
|
|
7
|
-
index: number;
|
|
8
|
-
id: string;
|
|
9
|
-
name: string;
|
|
10
|
-
args: string;
|
|
11
|
-
};
|
|
12
|
-
type LangChainToolCall = {
|
|
13
|
-
id: string;
|
|
14
|
-
name: string;
|
|
15
|
-
argsText: string;
|
|
16
|
-
args: ReadonlyJSONObject;
|
|
17
|
-
};
|
|
18
|
-
type MessageContentText = {
|
|
19
|
-
type: "text";
|
|
20
|
-
text: string;
|
|
21
|
-
};
|
|
22
|
-
type MessageContentImageUrl = {
|
|
23
|
-
type: "image_url";
|
|
24
|
-
image_url: string | {
|
|
25
|
-
url: string;
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
type MessageContentToolUse = {
|
|
29
|
-
type: "tool_use";
|
|
30
|
-
};
|
|
31
|
-
type UserMessageContentComplex = MessageContentText | MessageContentImageUrl;
|
|
32
|
-
type AssistantMessageContentComplex = MessageContentText | MessageContentToolUse;
|
|
33
|
-
type UserMessageContent = string | UserMessageContentComplex[];
|
|
34
|
-
type AssistantMessageContent = string | AssistantMessageContentComplex[];
|
|
35
|
-
type LangChainMessage = {
|
|
36
|
-
id?: string;
|
|
37
|
-
type: "system";
|
|
38
|
-
content: string;
|
|
39
|
-
} | {
|
|
40
|
-
id?: string;
|
|
41
|
-
type: "human";
|
|
42
|
-
content: UserMessageContent;
|
|
43
|
-
} | {
|
|
44
|
-
id?: string;
|
|
45
|
-
type: "tool";
|
|
46
|
-
content: string;
|
|
47
|
-
tool_call_id: string;
|
|
48
|
-
name: string;
|
|
49
|
-
artifact?: any;
|
|
50
|
-
} | {
|
|
51
|
-
id?: string;
|
|
52
|
-
type: "ai";
|
|
53
|
-
content: AssistantMessageContent;
|
|
54
|
-
tool_call_chunks?: LangChainToolCallChunk[];
|
|
55
|
-
tool_calls?: LangChainToolCall[];
|
|
56
|
-
};
|
|
57
|
-
type LangChainMessageChunk = {
|
|
58
|
-
id: string;
|
|
59
|
-
type: "AIMessageChunk";
|
|
60
|
-
content: (AssistantMessageContentComplex & {
|
|
61
|
-
index: number;
|
|
62
|
-
})[];
|
|
63
|
-
tool_call_chunks: LangChainToolCallChunk[];
|
|
64
|
-
};
|
|
65
|
-
type LangChainEvent = {
|
|
66
|
-
event: "messages/partial" | "messages/complete";
|
|
67
|
-
data: LangChainMessage[];
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
type LangGraphCommand = {
|
|
71
|
-
resume: string;
|
|
72
|
-
};
|
|
73
|
-
type LangGraphSendMessageConfig = {
|
|
74
|
-
command?: LangGraphCommand;
|
|
75
|
-
runConfig?: unknown;
|
|
76
|
-
};
|
|
77
|
-
type LangGraphMessagesEvent<TMessage> = {
|
|
78
|
-
event: "messages" | "messages/partial" | "messages/complete" | "metadata" | "updates" | string;
|
|
79
|
-
data: TMessage[] | any;
|
|
80
|
-
};
|
|
81
|
-
type LangGraphStreamCallback<TMessage> = (messages: TMessage[], config: LangGraphSendMessageConfig & {
|
|
82
|
-
abortSignal: AbortSignal;
|
|
83
|
-
}) => Promise<AsyncGenerator<LangGraphMessagesEvent<TMessage>>> | AsyncGenerator<LangGraphMessagesEvent<TMessage>>;
|
|
84
|
-
type LangGraphInterruptState = {
|
|
85
|
-
value?: any;
|
|
86
|
-
resumable?: boolean;
|
|
87
|
-
when: string;
|
|
88
|
-
ns?: string[];
|
|
89
|
-
};
|
|
90
|
-
declare const useLangGraphMessages: <TMessage extends {
|
|
91
|
-
id?: string;
|
|
92
|
-
}>({ stream, appendMessage, }: {
|
|
93
|
-
stream: LangGraphStreamCallback<TMessage>;
|
|
94
|
-
appendMessage?: (prev: TMessage | undefined, curr: TMessage) => TMessage;
|
|
95
|
-
}) => {
|
|
96
|
-
interrupt: LangGraphInterruptState | undefined;
|
|
97
|
-
messages: TMessage[];
|
|
98
|
-
sendMessage: (newMessages: TMessage[], config: LangGraphSendMessageConfig) => Promise<void>;
|
|
99
|
-
cancel: () => void;
|
|
100
|
-
setInterrupt: react.Dispatch<react.SetStateAction<LangGraphInterruptState | undefined>>;
|
|
101
|
-
setMessages: react.Dispatch<react.SetStateAction<TMessage[]>>;
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
declare const useLangGraphInterruptState: () => LangGraphInterruptState | undefined;
|
|
105
|
-
declare const useLangGraphSend: () => (messages: LangChainMessage[], config: LangGraphSendMessageConfig) => Promise<void>;
|
|
106
|
-
declare const useLangGraphSendCommand: () => (command: LangGraphCommand) => Promise<void>;
|
|
107
|
-
declare const useLangGraphRuntime: ({ autoCancelPendingToolCalls, adapters: { attachments, feedback, speech }, unstable_allowCancellation, stream, threadId, onSwitchToNewThread, onSwitchToThread, }: {
|
|
108
|
-
/**
|
|
109
|
-
* @deprecated For thread management use `useCloudThreadListRuntime` instead. This option will be removed in a future version.
|
|
110
|
-
*/
|
|
111
|
-
threadId?: string | undefined;
|
|
112
|
-
autoCancelPendingToolCalls?: boolean | undefined;
|
|
113
|
-
unstable_allowCancellation?: boolean | undefined;
|
|
114
|
-
stream: LangGraphStreamCallback<LangChainMessage>;
|
|
115
|
-
/**
|
|
116
|
-
* @deprecated For thread management use `useCloudThreadListRuntime` instead. This option will be removed in a future version.
|
|
117
|
-
*/
|
|
118
|
-
onSwitchToNewThread?: () => Promise<void> | void;
|
|
119
|
-
onSwitchToThread?: (threadId: string) => Promise<{
|
|
120
|
-
messages: LangChainMessage[];
|
|
121
|
-
interrupts?: LangGraphInterruptState[];
|
|
122
|
-
}>;
|
|
123
|
-
adapters?: {
|
|
124
|
-
attachments?: AttachmentAdapter;
|
|
125
|
-
speech?: SpeechSynthesisAdapter;
|
|
126
|
-
feedback?: FeedbackAdapter;
|
|
127
|
-
} | undefined;
|
|
128
|
-
}) => _assistant_ui_react_internal.AssistantRuntimeImpl;
|
|
129
|
-
|
|
130
|
-
declare const convertLangChainMessages: useExternalMessageConverter.Callback<LangChainMessage>;
|
|
131
|
-
|
|
132
|
-
type LangGraphStateAccumulatorConfig<TMessage> = {
|
|
133
|
-
initialMessages?: TMessage[];
|
|
134
|
-
appendMessage?: (prev: TMessage | undefined, curr: TMessage) => TMessage;
|
|
135
|
-
};
|
|
136
|
-
declare class LangGraphMessageAccumulator<TMessage extends {
|
|
137
|
-
id?: string;
|
|
138
|
-
}> {
|
|
139
|
-
private messagesMap;
|
|
140
|
-
private appendMessage;
|
|
141
|
-
constructor({ initialMessages, appendMessage, }?: LangGraphStateAccumulatorConfig<TMessage>);
|
|
142
|
-
private ensureMessageId;
|
|
143
|
-
addMessages(newMessages: TMessage[]): TMessage[];
|
|
144
|
-
getMessages(): TMessage[];
|
|
145
|
-
clear(): void;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
declare const appendLangChainChunk: (prev: LangChainMessage | undefined, curr: LangChainMessage | LangChainMessageChunk) => LangChainMessage;
|
|
149
|
-
|
|
150
|
-
export { type LangChainEvent, type LangChainMessage, type LangChainToolCall, type LangChainToolCallChunk, type LangGraphCommand, type LangGraphInterruptState, LangGraphMessageAccumulator, type LangGraphSendMessageConfig, type LangGraphStreamCallback, appendLangChainChunk, convertLangChainMessages, convertLangChainMessages as convertLangchainMessages, useLangGraphInterruptState, useLangGraphMessages, useLangGraphRuntime, useLangGraphSend, useLangGraphSendCommand };
|