@assistant-ui/react-ai-sdk 0.6.18 → 0.7.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/index.d.mts +3 -15
- package/dist/index.d.ts +3 -15
- package/dist/index.js +40 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +40 -19
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.d.mts
CHANGED
|
@@ -22,18 +22,6 @@ type VercelRSCAdapterBase<T> = {
|
|
|
22
22
|
onReload?: ((parentId: string | null) => Promise<void>) | undefined;
|
|
23
23
|
convertMessage?: ((message: T) => VercelRSCMessage) | undefined;
|
|
24
24
|
adapters?: ExternalStoreAdapter["adapters"] | undefined;
|
|
25
|
-
/**
|
|
26
|
-
* @deprecated Use `onNew` instead. This will be removed in 0.6.0.
|
|
27
|
-
*/
|
|
28
|
-
append?: (message: AppendMessage) => Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* @deprecated Use `onEdit` instead. This will be removed in 0.6.0.
|
|
31
|
-
*/
|
|
32
|
-
edit?: ((message: AppendMessage) => Promise<void>) | undefined;
|
|
33
|
-
/**
|
|
34
|
-
* @deprecated Use `onReload` instead. This will be removed in 0.6.0.
|
|
35
|
-
*/
|
|
36
|
-
reload?: ((parentId: string | null) => Promise<void>) | undefined;
|
|
37
25
|
};
|
|
38
26
|
type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
|
|
39
27
|
|
|
@@ -42,15 +30,15 @@ declare const useVercelRSCRuntime: <T extends WeakKey>(adapter: VercelRSCAdapter
|
|
|
42
30
|
declare const getVercelRSCMessage: (message: ThreadMessage) => unknown;
|
|
43
31
|
|
|
44
32
|
type VercelUseChatAdapter$1 = {
|
|
45
|
-
adapters?: Omit<ExternalStoreAdapter["adapters"]
|
|
33
|
+
adapters?: Omit<NonNullable<ExternalStoreAdapter["adapters"]>, "attachments"> | undefined;
|
|
46
34
|
};
|
|
47
35
|
declare const useVercelUseChatRuntime: (chatHelpers: ReturnType<typeof useChat>, adapter?: VercelUseChatAdapter$1) => _assistant_ui_react.AssistantRuntime;
|
|
48
36
|
|
|
49
37
|
type VercelUseChatAdapter = {
|
|
50
|
-
adapters?: Omit<ExternalStoreAdapter["adapters"]
|
|
38
|
+
adapters?: Omit<NonNullable<ExternalStoreAdapter["adapters"]>, "attachments"> | undefined;
|
|
51
39
|
};
|
|
52
40
|
declare const useVercelUseAssistantRuntime: (assistantHelpers: ReturnType<typeof useAssistant>, adapter?: VercelUseChatAdapter) => _assistant_ui_react.AssistantRuntime;
|
|
53
41
|
|
|
54
42
|
declare const getVercelAIMessages: (message: ThreadMessage) => Message[];
|
|
55
43
|
|
|
56
|
-
export { type VercelRSCAdapter, type VercelRSCMessage, getVercelAIMessages
|
|
44
|
+
export { type VercelRSCAdapter, type VercelRSCMessage, getVercelAIMessages, getVercelRSCMessage, useVercelRSCRuntime, useVercelUseAssistantRuntime, useVercelUseChatRuntime };
|
package/dist/index.d.ts
CHANGED
|
@@ -22,18 +22,6 @@ type VercelRSCAdapterBase<T> = {
|
|
|
22
22
|
onReload?: ((parentId: string | null) => Promise<void>) | undefined;
|
|
23
23
|
convertMessage?: ((message: T) => VercelRSCMessage) | undefined;
|
|
24
24
|
adapters?: ExternalStoreAdapter["adapters"] | undefined;
|
|
25
|
-
/**
|
|
26
|
-
* @deprecated Use `onNew` instead. This will be removed in 0.6.0.
|
|
27
|
-
*/
|
|
28
|
-
append?: (message: AppendMessage) => Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* @deprecated Use `onEdit` instead. This will be removed in 0.6.0.
|
|
31
|
-
*/
|
|
32
|
-
edit?: ((message: AppendMessage) => Promise<void>) | undefined;
|
|
33
|
-
/**
|
|
34
|
-
* @deprecated Use `onReload` instead. This will be removed in 0.6.0.
|
|
35
|
-
*/
|
|
36
|
-
reload?: ((parentId: string | null) => Promise<void>) | undefined;
|
|
37
25
|
};
|
|
38
26
|
type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
|
|
39
27
|
|
|
@@ -42,15 +30,15 @@ declare const useVercelRSCRuntime: <T extends WeakKey>(adapter: VercelRSCAdapter
|
|
|
42
30
|
declare const getVercelRSCMessage: (message: ThreadMessage) => unknown;
|
|
43
31
|
|
|
44
32
|
type VercelUseChatAdapter$1 = {
|
|
45
|
-
adapters?: Omit<ExternalStoreAdapter["adapters"]
|
|
33
|
+
adapters?: Omit<NonNullable<ExternalStoreAdapter["adapters"]>, "attachments"> | undefined;
|
|
46
34
|
};
|
|
47
35
|
declare const useVercelUseChatRuntime: (chatHelpers: ReturnType<typeof useChat>, adapter?: VercelUseChatAdapter$1) => _assistant_ui_react.AssistantRuntime;
|
|
48
36
|
|
|
49
37
|
type VercelUseChatAdapter = {
|
|
50
|
-
adapters?: Omit<ExternalStoreAdapter["adapters"]
|
|
38
|
+
adapters?: Omit<NonNullable<ExternalStoreAdapter["adapters"]>, "attachments"> | undefined;
|
|
51
39
|
};
|
|
52
40
|
declare const useVercelUseAssistantRuntime: (assistantHelpers: ReturnType<typeof useAssistant>, adapter?: VercelUseChatAdapter) => _assistant_ui_react.AssistantRuntime;
|
|
53
41
|
|
|
54
42
|
declare const getVercelAIMessages: (message: ThreadMessage) => Message[];
|
|
55
43
|
|
|
56
|
-
export { type VercelRSCAdapter, type VercelRSCMessage, getVercelAIMessages
|
|
44
|
+
export { type VercelRSCAdapter, type VercelRSCMessage, getVercelAIMessages, getVercelRSCMessage, useVercelRSCRuntime, useVercelUseAssistantRuntime, useVercelUseChatRuntime };
|
package/dist/index.js
CHANGED
|
@@ -20,7 +20,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var src_exports = {};
|
|
22
22
|
__export(src_exports, {
|
|
23
|
-
getVercelAIMessage: () => getVercelAIMessages,
|
|
24
23
|
getVercelAIMessages: () => getVercelAIMessages,
|
|
25
24
|
getVercelRSCMessage: () => getVercelRSCMessage,
|
|
26
25
|
useVercelRSCRuntime: () => useVercelRSCRuntime,
|
|
@@ -41,15 +40,15 @@ var vercelToThreadMessage = (converter, rawMessage) => {
|
|
|
41
40
|
};
|
|
42
41
|
};
|
|
43
42
|
var useVercelRSCRuntime = (adapter) => {
|
|
44
|
-
const onNew = adapter.onNew
|
|
43
|
+
const onNew = adapter.onNew;
|
|
45
44
|
if (!onNew)
|
|
46
45
|
throw new Error("You must pass a onNew function to useVercelRSCRuntime");
|
|
47
46
|
const eAdapter = {
|
|
48
47
|
isRunning: adapter.isRunning,
|
|
49
48
|
messages: adapter.messages,
|
|
50
49
|
onNew,
|
|
51
|
-
onEdit: adapter.onEdit
|
|
52
|
-
onReload: adapter.onReload
|
|
50
|
+
onEdit: adapter.onEdit,
|
|
51
|
+
onReload: adapter.onReload,
|
|
53
52
|
convertMessage: (m) => vercelToThreadMessage(
|
|
54
53
|
adapter.convertMessage ?? ((m2) => m2),
|
|
55
54
|
m
|
|
@@ -85,6 +84,7 @@ var convertMessage = (message) => {
|
|
|
85
84
|
type: "file",
|
|
86
85
|
name: attachment.name ?? attachment.url,
|
|
87
86
|
content: [],
|
|
87
|
+
contentType: attachment.contentType ?? "unknown/unknown",
|
|
88
88
|
status: { type: "complete" }
|
|
89
89
|
})
|
|
90
90
|
)
|
|
@@ -134,6 +134,7 @@ var convertMessage = (message) => {
|
|
|
134
134
|
} else if (data.type === "tool-result") {
|
|
135
135
|
return {
|
|
136
136
|
role: "tool",
|
|
137
|
+
id: message.id,
|
|
137
138
|
toolCallId: data.toolCallId,
|
|
138
139
|
result: data.result
|
|
139
140
|
};
|
|
@@ -194,7 +195,7 @@ var toCreateMessage = async (message) => {
|
|
|
194
195
|
experimental_attachments: [
|
|
195
196
|
...images,
|
|
196
197
|
...await Promise.all(
|
|
197
|
-
|
|
198
|
+
message.attachments.map(async (m) => {
|
|
198
199
|
if (m.file == null)
|
|
199
200
|
throw new Error("Attachment did not contain a file");
|
|
200
201
|
return {
|
|
@@ -277,15 +278,25 @@ var useVercelUseChatRuntime = (chatHelpers, adapter = {}) => {
|
|
|
277
278
|
onAddToolResult: ({ toolCallId, result }) => {
|
|
278
279
|
chatHelpers.addToolResult({ toolCallId, result });
|
|
279
280
|
},
|
|
280
|
-
onSwitchToNewThread: () => {
|
|
281
|
-
chatHelpers.messages = [];
|
|
282
|
-
chatHelpers.input = "";
|
|
283
|
-
chatHelpers.setMessages([]);
|
|
284
|
-
chatHelpers.setInput("");
|
|
285
|
-
},
|
|
286
281
|
adapters: {
|
|
287
282
|
attachments: vercelAttachmentAdapter,
|
|
288
|
-
...adapter.adapters
|
|
283
|
+
...adapter.adapters,
|
|
284
|
+
threadList: new Proxy(adapter.adapters?.threadList ?? {}, {
|
|
285
|
+
get(target, prop, receiver) {
|
|
286
|
+
if (prop === "onSwitchToNewThread") {
|
|
287
|
+
return () => {
|
|
288
|
+
chatHelpers.messages = [];
|
|
289
|
+
chatHelpers.input = "";
|
|
290
|
+
chatHelpers.setMessages([]);
|
|
291
|
+
chatHelpers.setInput("");
|
|
292
|
+
if (typeof target.onSwitchToNewThread === "function") {
|
|
293
|
+
return target.onSwitchToNewThread.call(target);
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
return Reflect.get(target, prop, receiver);
|
|
298
|
+
}
|
|
299
|
+
})
|
|
289
300
|
}
|
|
290
301
|
});
|
|
291
302
|
useInputSync(chatHelpers, runtime);
|
|
@@ -307,15 +318,25 @@ var useVercelUseAssistantRuntime = (assistantHelpers, adapter = {}) => {
|
|
|
307
318
|
onNew: async (message) => {
|
|
308
319
|
await assistantHelpers.append(await toCreateMessage(message));
|
|
309
320
|
},
|
|
310
|
-
onSwitchToNewThread: () => {
|
|
311
|
-
assistantHelpers.messages = [];
|
|
312
|
-
assistantHelpers.input = "";
|
|
313
|
-
assistantHelpers.setMessages([]);
|
|
314
|
-
assistantHelpers.setInput("");
|
|
315
|
-
},
|
|
316
321
|
adapters: {
|
|
317
322
|
attachments: vercelAttachmentAdapter,
|
|
318
|
-
...adapter.adapters
|
|
323
|
+
...adapter.adapters,
|
|
324
|
+
threadList: new Proxy(adapter.adapters?.threadList ?? {}, {
|
|
325
|
+
get(target, prop, receiver) {
|
|
326
|
+
if (prop === "onSwitchToNewThread") {
|
|
327
|
+
return () => {
|
|
328
|
+
assistantHelpers.messages = [];
|
|
329
|
+
assistantHelpers.input = "";
|
|
330
|
+
assistantHelpers.setMessages([]);
|
|
331
|
+
assistantHelpers.setInput("");
|
|
332
|
+
if (typeof target.onSwitchToNewThread === "function") {
|
|
333
|
+
return target.onSwitchToNewThread.call(target);
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
return Reflect.get(target, prop, receiver);
|
|
338
|
+
}
|
|
339
|
+
})
|
|
319
340
|
}
|
|
320
341
|
});
|
|
321
342
|
useInputSync(assistantHelpers, runtime);
|
|
@@ -323,7 +344,6 @@ var useVercelUseAssistantRuntime = (assistantHelpers, adapter = {}) => {
|
|
|
323
344
|
};
|
|
324
345
|
// Annotate the CommonJS export names for ESM import in node:
|
|
325
346
|
0 && (module.exports = {
|
|
326
|
-
getVercelAIMessage,
|
|
327
347
|
getVercelAIMessages,
|
|
328
348
|
getVercelRSCMessage,
|
|
329
349
|
useVercelRSCRuntime,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/ui/utils/convertMessage.ts","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/utils/useInputSync.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/toCreateMessage.ts","../src/ui/utils/vercelAttachmentAdapter.ts","../src/ui/getVercelAIMessages.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["export * from \"./rsc\";\nexport * from \"./ui\";\n","\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessageLike => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt,\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const onNew = adapter.onNew ?? adapter.append;\n if (!onNew)\n throw new Error(\"You must pass a onNew function to useVercelRSCRuntime\");\n const eAdapter: ExternalStoreAdapter<any> = {\n isRunning: adapter.isRunning,\n messages: adapter.messages,\n onNew,\n onEdit: adapter.onEdit ?? adapter.edit,\n onReload: adapter.onReload ?? adapter.reload,\n convertMessage: (m: T) =>\n vercelToThreadMessage(\n adapter.convertMessage ?? ((m) => m as VercelRSCMessage),\n m,\n ),\n adapters: adapter.adapters,\n unstable_capabilities: {\n copy: false,\n },\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n","import { Message } from \"@ai-sdk/ui-utils\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { CompleteAttachment } from \"@assistant-ui/react\";\n\nexport const convertMessage: useExternalMessageConverter.Callback<Message> = (\n message,\n) => {\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n\n attachments: message.experimental_attachments?.map(\n (attachment, idx) =>\n ({\n id: idx.toString(),\n type: \"file\",\n name: attachment.name ?? attachment.url,\n content: [],\n status: { type: \"complete\" },\n }) satisfies CompleteAttachment,\n ),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [\n ...(message.content\n ? [\n {\n type: \"text\",\n text: message.content,\n } satisfies TextContentPart,\n ]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ],\n };\n\n case \"data\": {\n type MaybeSupportedDataMessage =\n | { type?: \"unsafe_other\" }\n | ToolCallContentPart\n | {\n type: \"tool-result\";\n toolCallId: string;\n result: any;\n };\n\n if (\n !message.data ||\n !(typeof message.data === \"object\") ||\n Array.isArray(message.data)\n )\n return [];\n\n const data = message.data as MaybeSupportedDataMessage;\n\n if (data.type === \"tool-call\") {\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [data],\n };\n } else if (data.type === \"tool-result\") {\n return {\n role: \"tool\",\n toolCallId: data.toolCallId,\n result: data.result,\n };\n }\n return [];\n }\n\n default:\n // TODO handle tool and function messages\n const _unsupported: \"function\" | \"tool\" = message.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?: Omit<ExternalStoreAdapter[\"adapters\"], \"attachments\"> | undefined;\n};\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: chatHelpers.isLoading,\n messages: chatHelpers.messages,\n });\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.append(await toCreateMessage(message));\n },\n onEdit: async (message) => {\n const newMessages = sliceMessagesUntil(\n chatHelpers.messages,\n message.parentId,\n );\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.append(await toCreateMessage(message));\n },\n onReload: async (parentId: string | null) => {\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.reload();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({ toolCallId, result });\n },\n onSwitchToNewThread: () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useEffect } from \"react\";\nimport { useAssistant, useChat } from \"@ai-sdk/react\";\nimport { AssistantRuntime } from \"@assistant-ui/react\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: AssistantRuntime,\n) => {\n // sync input from vercel to assistant-ui\n useEffect(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n const handleThreadUpdate = useCallbackRef(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n helpers.setInput(runtime.thread.composer.getState().text);\n }\n });\n\n useEffect(() => {\n return runtime.thread.subscribe(handleThreadUpdate);\n }, [runtime, handleThreadUpdate]);\n};\n","import type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const sliceMessagesUntil = (\n messages: Message[],\n messageId: string | null,\n) => {\n if (messageId == null) return [];\n\n let messageIdx = messages.findIndex((m) => m.id === messageId);\n if (messageIdx === -1)\n throw new Error(\n \"useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui.\",\n );\n\n while (messages[messageIdx + 1]?.role === \"assistant\") {\n messageIdx++;\n }\n\n return messages.slice(0, messageIdx + 1);\n};\n","import { AppendMessage } from \"@assistant-ui/react\";\nimport { CreateMessage } from \"@ai-sdk/ui-utils\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateMessage> => {\n const content = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const images = message.content\n .filter((part) => part.type === \"image\")\n .map((part) => ({ url: part.image }));\n\n return {\n role: message.role,\n content,\n experimental_attachments: [\n ...images,\n ...(await Promise.all(\n (message.attachments ?? []).map(async (m) => {\n if (m.file == null)\n throw new Error(\"Attachment did not contain a file\");\n return {\n contentType: m.file.type,\n name: m.file.name,\n url: await getFileDataURL(m.file),\n };\n }),\n )),\n ],\n };\n};\n\nconst getFileDataURL = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n\n reader.readAsDataURL(file);\n });\n","import { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport const vercelAttachmentAdapter: AttachmentAdapter = {\n accept:\n \"image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css\",\n async add({ file }) {\n return {\n id: generateId(),\n type: \"file\",\n name: file.name,\n file,\n contentType: file.type,\n content: [],\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"@ai-sdk/react\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?: Omit<ExternalStoreAdapter[\"adapters\"], \"attachments\"> | undefined;\n};\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: assistantHelpers.status === \"in_progress\",\n messages: assistantHelpers.messages,\n });\n const runtime = useExternalStoreRuntime({\n isRunning: assistantHelpers.status === \"in_progress\",\n messages,\n onCancel: async () => assistantHelpers.stop(),\n onNew: async (message) => {\n await assistantHelpers.append(await toCreateMessage(message));\n },\n onSwitchToNewThread: () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":"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","names":["m","import_react","import_react","import_react","import_react","messages","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/ui/utils/convertMessage.ts","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/utils/useInputSync.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/toCreateMessage.ts","../src/ui/utils/vercelAttachmentAdapter.ts","../src/ui/getVercelAIMessages.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["export * from \"./rsc\";\nexport * from \"./ui\";\n","\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessageLike => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt,\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const onNew = adapter.onNew;\n if (!onNew)\n throw new Error(\"You must pass a onNew function to useVercelRSCRuntime\");\n const eAdapter: ExternalStoreAdapter<any> = {\n isRunning: adapter.isRunning,\n messages: adapter.messages,\n onNew,\n onEdit: adapter.onEdit,\n onReload: adapter.onReload,\n convertMessage: (m: T) =>\n vercelToThreadMessage(\n adapter.convertMessage ?? ((m) => m as VercelRSCMessage),\n m,\n ),\n adapters: adapter.adapters,\n unstable_capabilities: {\n copy: false,\n },\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n","import { Message } from \"@ai-sdk/ui-utils\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { CompleteAttachment } from \"@assistant-ui/react\";\n\nexport const convertMessage: useExternalMessageConverter.Callback<Message> = (\n message,\n) => {\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n\n attachments: message.experimental_attachments?.map(\n (attachment, idx) =>\n ({\n id: idx.toString(),\n type: \"file\",\n name: attachment.name ?? attachment.url,\n content: [],\n contentType: attachment.contentType ?? \"unknown/unknown\",\n status: { type: \"complete\" },\n }) satisfies CompleteAttachment,\n ),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [\n ...(message.content\n ? [\n {\n type: \"text\",\n text: message.content,\n } satisfies TextContentPart,\n ]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ],\n };\n\n case \"data\": {\n type MaybeSupportedDataMessage =\n | { type?: \"unsafe_other\" }\n | ToolCallContentPart\n | {\n type: \"tool-result\";\n toolCallId: string;\n result: any;\n };\n\n if (\n !message.data ||\n !(typeof message.data === \"object\") ||\n Array.isArray(message.data)\n )\n return [];\n\n const data = message.data as MaybeSupportedDataMessage;\n\n if (data.type === \"tool-call\") {\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [data],\n };\n } else if (data.type === \"tool-result\") {\n return {\n role: \"tool\",\n id: message.id,\n toolCallId: data.toolCallId,\n result: data.result,\n };\n }\n return [];\n }\n\n default:\n // TODO handle tool and function messages\n const _unsupported: \"function\" | \"tool\" = message.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: chatHelpers.isLoading,\n messages: chatHelpers.messages,\n });\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.append(await toCreateMessage(message));\n },\n onEdit: async (message) => {\n const newMessages = sliceMessagesUntil(\n chatHelpers.messages,\n message.parentId,\n );\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.append(await toCreateMessage(message));\n },\n onReload: async (parentId: string | null) => {\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.reload();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({ toolCallId, result });\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useEffect } from \"react\";\nimport { useAssistant, useChat } from \"@ai-sdk/react\";\nimport { AssistantRuntime } from \"@assistant-ui/react\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: AssistantRuntime,\n) => {\n // sync input from vercel to assistant-ui\n useEffect(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n const handleThreadUpdate = useCallbackRef(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n helpers.setInput(runtime.thread.composer.getState().text);\n }\n });\n\n useEffect(() => {\n return runtime.thread.subscribe(handleThreadUpdate);\n }, [runtime, handleThreadUpdate]);\n};\n","import type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const sliceMessagesUntil = (\n messages: Message[],\n messageId: string | null,\n) => {\n if (messageId == null) return [];\n\n let messageIdx = messages.findIndex((m) => m.id === messageId);\n if (messageIdx === -1)\n throw new Error(\n \"useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui.\",\n );\n\n while (messages[messageIdx + 1]?.role === \"assistant\") {\n messageIdx++;\n }\n\n return messages.slice(0, messageIdx + 1);\n};\n","import { AppendMessage } from \"@assistant-ui/react\";\nimport { CreateMessage } from \"@ai-sdk/ui-utils\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateMessage> => {\n const content = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const images = message.content\n .filter((part) => part.type === \"image\")\n .map((part) => ({ url: part.image }));\n\n return {\n role: message.role,\n content,\n experimental_attachments: [\n ...images,\n ...(await Promise.all(\n message.attachments.map(async (m) => {\n if (m.file == null)\n throw new Error(\"Attachment did not contain a file\");\n return {\n contentType: m.file.type,\n name: m.file.name,\n url: await getFileDataURL(m.file),\n };\n }),\n )),\n ],\n };\n};\n\nconst getFileDataURL = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n\n reader.readAsDataURL(file);\n });\n","import { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport const vercelAttachmentAdapter: AttachmentAdapter = {\n accept:\n \"image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css\",\n async add({ file }) {\n return {\n id: generateId(),\n type: \"file\",\n name: file.name,\n file,\n contentType: file.type,\n content: [],\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"@ai-sdk/react\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: assistantHelpers.status === \"in_progress\",\n messages: assistantHelpers.messages,\n });\n const runtime = useExternalStoreRuntime({\n isRunning: assistantHelpers.status === \"in_progress\",\n messages,\n onCancel: async () => assistantHelpers.stop(),\n onNew: async (message) => {\n await assistantHelpers.append(await toCreateMessage(message));\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":"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","names":["m","import_react","import_react","import_react","import_react","messages","import_react"]}
|
package/dist/index.mjs
CHANGED
|
@@ -12,15 +12,15 @@ var vercelToThreadMessage = (converter, rawMessage) => {
|
|
|
12
12
|
};
|
|
13
13
|
};
|
|
14
14
|
var useVercelRSCRuntime = (adapter) => {
|
|
15
|
-
const onNew = adapter.onNew
|
|
15
|
+
const onNew = adapter.onNew;
|
|
16
16
|
if (!onNew)
|
|
17
17
|
throw new Error("You must pass a onNew function to useVercelRSCRuntime");
|
|
18
18
|
const eAdapter = {
|
|
19
19
|
isRunning: adapter.isRunning,
|
|
20
20
|
messages: adapter.messages,
|
|
21
21
|
onNew,
|
|
22
|
-
onEdit: adapter.onEdit
|
|
23
|
-
onReload: adapter.onReload
|
|
22
|
+
onEdit: adapter.onEdit,
|
|
23
|
+
onReload: adapter.onReload,
|
|
24
24
|
convertMessage: (m) => vercelToThreadMessage(
|
|
25
25
|
adapter.convertMessage ?? ((m2) => m2),
|
|
26
26
|
m
|
|
@@ -58,6 +58,7 @@ var convertMessage = (message) => {
|
|
|
58
58
|
type: "file",
|
|
59
59
|
name: attachment.name ?? attachment.url,
|
|
60
60
|
content: [],
|
|
61
|
+
contentType: attachment.contentType ?? "unknown/unknown",
|
|
61
62
|
status: { type: "complete" }
|
|
62
63
|
})
|
|
63
64
|
)
|
|
@@ -107,6 +108,7 @@ var convertMessage = (message) => {
|
|
|
107
108
|
} else if (data.type === "tool-result") {
|
|
108
109
|
return {
|
|
109
110
|
role: "tool",
|
|
111
|
+
id: message.id,
|
|
110
112
|
toolCallId: data.toolCallId,
|
|
111
113
|
result: data.result
|
|
112
114
|
};
|
|
@@ -170,7 +172,7 @@ var toCreateMessage = async (message) => {
|
|
|
170
172
|
experimental_attachments: [
|
|
171
173
|
...images,
|
|
172
174
|
...await Promise.all(
|
|
173
|
-
|
|
175
|
+
message.attachments.map(async (m) => {
|
|
174
176
|
if (m.file == null)
|
|
175
177
|
throw new Error("Attachment did not contain a file");
|
|
176
178
|
return {
|
|
@@ -255,15 +257,25 @@ var useVercelUseChatRuntime = (chatHelpers, adapter = {}) => {
|
|
|
255
257
|
onAddToolResult: ({ toolCallId, result }) => {
|
|
256
258
|
chatHelpers.addToolResult({ toolCallId, result });
|
|
257
259
|
},
|
|
258
|
-
onSwitchToNewThread: () => {
|
|
259
|
-
chatHelpers.messages = [];
|
|
260
|
-
chatHelpers.input = "";
|
|
261
|
-
chatHelpers.setMessages([]);
|
|
262
|
-
chatHelpers.setInput("");
|
|
263
|
-
},
|
|
264
260
|
adapters: {
|
|
265
261
|
attachments: vercelAttachmentAdapter,
|
|
266
|
-
...adapter.adapters
|
|
262
|
+
...adapter.adapters,
|
|
263
|
+
threadList: new Proxy(adapter.adapters?.threadList ?? {}, {
|
|
264
|
+
get(target, prop, receiver) {
|
|
265
|
+
if (prop === "onSwitchToNewThread") {
|
|
266
|
+
return () => {
|
|
267
|
+
chatHelpers.messages = [];
|
|
268
|
+
chatHelpers.input = "";
|
|
269
|
+
chatHelpers.setMessages([]);
|
|
270
|
+
chatHelpers.setInput("");
|
|
271
|
+
if (typeof target.onSwitchToNewThread === "function") {
|
|
272
|
+
return target.onSwitchToNewThread.call(target);
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
return Reflect.get(target, prop, receiver);
|
|
277
|
+
}
|
|
278
|
+
})
|
|
267
279
|
}
|
|
268
280
|
});
|
|
269
281
|
useInputSync(chatHelpers, runtime);
|
|
@@ -288,22 +300,31 @@ var useVercelUseAssistantRuntime = (assistantHelpers, adapter = {}) => {
|
|
|
288
300
|
onNew: async (message) => {
|
|
289
301
|
await assistantHelpers.append(await toCreateMessage(message));
|
|
290
302
|
},
|
|
291
|
-
onSwitchToNewThread: () => {
|
|
292
|
-
assistantHelpers.messages = [];
|
|
293
|
-
assistantHelpers.input = "";
|
|
294
|
-
assistantHelpers.setMessages([]);
|
|
295
|
-
assistantHelpers.setInput("");
|
|
296
|
-
},
|
|
297
303
|
adapters: {
|
|
298
304
|
attachments: vercelAttachmentAdapter,
|
|
299
|
-
...adapter.adapters
|
|
305
|
+
...adapter.adapters,
|
|
306
|
+
threadList: new Proxy(adapter.adapters?.threadList ?? {}, {
|
|
307
|
+
get(target, prop, receiver) {
|
|
308
|
+
if (prop === "onSwitchToNewThread") {
|
|
309
|
+
return () => {
|
|
310
|
+
assistantHelpers.messages = [];
|
|
311
|
+
assistantHelpers.input = "";
|
|
312
|
+
assistantHelpers.setMessages([]);
|
|
313
|
+
assistantHelpers.setInput("");
|
|
314
|
+
if (typeof target.onSwitchToNewThread === "function") {
|
|
315
|
+
return target.onSwitchToNewThread.call(target);
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
return Reflect.get(target, prop, receiver);
|
|
320
|
+
}
|
|
321
|
+
})
|
|
300
322
|
}
|
|
301
323
|
});
|
|
302
324
|
useInputSync(assistantHelpers, runtime);
|
|
303
325
|
return runtime;
|
|
304
326
|
};
|
|
305
327
|
export {
|
|
306
|
-
getVercelAIMessages as getVercelAIMessage,
|
|
307
328
|
getVercelAIMessages,
|
|
308
329
|
getVercelRSCMessage,
|
|
309
330
|
useVercelRSCRuntime,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/ui/utils/convertMessage.ts","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/utils/useInputSync.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/toCreateMessage.ts","../src/ui/utils/vercelAttachmentAdapter.ts","../src/ui/getVercelAIMessages.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessageLike => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt,\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const onNew = adapter.onNew ?? adapter.append;\n if (!onNew)\n throw new Error(\"You must pass a onNew function to useVercelRSCRuntime\");\n const eAdapter: ExternalStoreAdapter<any> = {\n isRunning: adapter.isRunning,\n messages: adapter.messages,\n onNew,\n onEdit: adapter.onEdit ?? adapter.edit,\n onReload: adapter.onReload ?? adapter.reload,\n convertMessage: (m: T) =>\n vercelToThreadMessage(\n adapter.convertMessage ?? ((m) => m as VercelRSCMessage),\n m,\n ),\n adapters: adapter.adapters,\n unstable_capabilities: {\n copy: false,\n },\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n","import { Message } from \"@ai-sdk/ui-utils\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { CompleteAttachment } from \"@assistant-ui/react\";\n\nexport const convertMessage: useExternalMessageConverter.Callback<Message> = (\n message,\n) => {\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n\n attachments: message.experimental_attachments?.map(\n (attachment, idx) =>\n ({\n id: idx.toString(),\n type: \"file\",\n name: attachment.name ?? attachment.url,\n content: [],\n status: { type: \"complete\" },\n }) satisfies CompleteAttachment,\n ),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [\n ...(message.content\n ? [\n {\n type: \"text\",\n text: message.content,\n } satisfies TextContentPart,\n ]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ],\n };\n\n case \"data\": {\n type MaybeSupportedDataMessage =\n | { type?: \"unsafe_other\" }\n | ToolCallContentPart\n | {\n type: \"tool-result\";\n toolCallId: string;\n result: any;\n };\n\n if (\n !message.data ||\n !(typeof message.data === \"object\") ||\n Array.isArray(message.data)\n )\n return [];\n\n const data = message.data as MaybeSupportedDataMessage;\n\n if (data.type === \"tool-call\") {\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [data],\n };\n } else if (data.type === \"tool-result\") {\n return {\n role: \"tool\",\n toolCallId: data.toolCallId,\n result: data.result,\n };\n }\n return [];\n }\n\n default:\n // TODO handle tool and function messages\n const _unsupported: \"function\" | \"tool\" = message.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?: Omit<ExternalStoreAdapter[\"adapters\"], \"attachments\"> | undefined;\n};\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: chatHelpers.isLoading,\n messages: chatHelpers.messages,\n });\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.append(await toCreateMessage(message));\n },\n onEdit: async (message) => {\n const newMessages = sliceMessagesUntil(\n chatHelpers.messages,\n message.parentId,\n );\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.append(await toCreateMessage(message));\n },\n onReload: async (parentId: string | null) => {\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.reload();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({ toolCallId, result });\n },\n onSwitchToNewThread: () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useEffect } from \"react\";\nimport { useAssistant, useChat } from \"@ai-sdk/react\";\nimport { AssistantRuntime } from \"@assistant-ui/react\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: AssistantRuntime,\n) => {\n // sync input from vercel to assistant-ui\n useEffect(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n const handleThreadUpdate = useCallbackRef(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n helpers.setInput(runtime.thread.composer.getState().text);\n }\n });\n\n useEffect(() => {\n return runtime.thread.subscribe(handleThreadUpdate);\n }, [runtime, handleThreadUpdate]);\n};\n","import type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const sliceMessagesUntil = (\n messages: Message[],\n messageId: string | null,\n) => {\n if (messageId == null) return [];\n\n let messageIdx = messages.findIndex((m) => m.id === messageId);\n if (messageIdx === -1)\n throw new Error(\n \"useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui.\",\n );\n\n while (messages[messageIdx + 1]?.role === \"assistant\") {\n messageIdx++;\n }\n\n return messages.slice(0, messageIdx + 1);\n};\n","import { AppendMessage } from \"@assistant-ui/react\";\nimport { CreateMessage } from \"@ai-sdk/ui-utils\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateMessage> => {\n const content = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const images = message.content\n .filter((part) => part.type === \"image\")\n .map((part) => ({ url: part.image }));\n\n return {\n role: message.role,\n content,\n experimental_attachments: [\n ...images,\n ...(await Promise.all(\n (message.attachments ?? []).map(async (m) => {\n if (m.file == null)\n throw new Error(\"Attachment did not contain a file\");\n return {\n contentType: m.file.type,\n name: m.file.name,\n url: await getFileDataURL(m.file),\n };\n }),\n )),\n ],\n };\n};\n\nconst getFileDataURL = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n\n reader.readAsDataURL(file);\n });\n","import { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport const vercelAttachmentAdapter: AttachmentAdapter = {\n accept:\n \"image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css\",\n async add({ file }) {\n return {\n id: generateId(),\n type: \"file\",\n name: file.name,\n file,\n contentType: file.type,\n content: [],\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"@ai-sdk/react\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?: Omit<ExternalStoreAdapter[\"adapters\"], \"attachments\"> | undefined;\n};\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: assistantHelpers.status === \"in_progress\",\n messages: assistantHelpers.messages,\n });\n const runtime = useExternalStoreRuntime({\n isRunning: assistantHelpers.status === \"in_progress\",\n messages,\n onCancel: async () => assistantHelpers.stop(),\n onNew: async (message) => {\n await assistantHelpers.append(await toCreateMessage(message));\n },\n onSwitchToNewThread: () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":"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","names":["m","useExternalStoreRuntime","getExternalStoreMessage","useExternalStoreRuntime","messages","useExternalMessageConverter","useExternalStoreRuntime","useExternalMessageConverter","useExternalStoreRuntime"]}
|
|
1
|
+
{"version":3,"sources":["../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/ui/utils/convertMessage.ts","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/utils/useInputSync.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/toCreateMessage.ts","../src/ui/utils/vercelAttachmentAdapter.ts","../src/ui/getVercelAIMessages.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessageLike => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt,\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const onNew = adapter.onNew;\n if (!onNew)\n throw new Error(\"You must pass a onNew function to useVercelRSCRuntime\");\n const eAdapter: ExternalStoreAdapter<any> = {\n isRunning: adapter.isRunning,\n messages: adapter.messages,\n onNew,\n onEdit: adapter.onEdit,\n onReload: adapter.onReload,\n convertMessage: (m: T) =>\n vercelToThreadMessage(\n adapter.convertMessage ?? ((m) => m as VercelRSCMessage),\n m,\n ),\n adapters: adapter.adapters,\n unstable_capabilities: {\n copy: false,\n },\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n","import { Message } from \"@ai-sdk/ui-utils\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { CompleteAttachment } from \"@assistant-ui/react\";\n\nexport const convertMessage: useExternalMessageConverter.Callback<Message> = (\n message,\n) => {\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n\n attachments: message.experimental_attachments?.map(\n (attachment, idx) =>\n ({\n id: idx.toString(),\n type: \"file\",\n name: attachment.name ?? attachment.url,\n content: [],\n contentType: attachment.contentType ?? \"unknown/unknown\",\n status: { type: \"complete\" },\n }) satisfies CompleteAttachment,\n ),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [\n ...(message.content\n ? [\n {\n type: \"text\",\n text: message.content,\n } satisfies TextContentPart,\n ]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ],\n };\n\n case \"data\": {\n type MaybeSupportedDataMessage =\n | { type?: \"unsafe_other\" }\n | ToolCallContentPart\n | {\n type: \"tool-result\";\n toolCallId: string;\n result: any;\n };\n\n if (\n !message.data ||\n !(typeof message.data === \"object\") ||\n Array.isArray(message.data)\n )\n return [];\n\n const data = message.data as MaybeSupportedDataMessage;\n\n if (data.type === \"tool-call\") {\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [data],\n };\n } else if (data.type === \"tool-result\") {\n return {\n role: \"tool\",\n id: message.id,\n toolCallId: data.toolCallId,\n result: data.result,\n };\n }\n return [];\n }\n\n default:\n // TODO handle tool and function messages\n const _unsupported: \"function\" | \"tool\" = message.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n","import type { useChat } from \"@ai-sdk/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: chatHelpers.isLoading,\n messages: chatHelpers.messages,\n });\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.append(await toCreateMessage(message));\n },\n onEdit: async (message) => {\n const newMessages = sliceMessagesUntil(\n chatHelpers.messages,\n message.parentId,\n );\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.append(await toCreateMessage(message));\n },\n onReload: async (parentId: string | null) => {\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.reload();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({ toolCallId, result });\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useEffect } from \"react\";\nimport { useAssistant, useChat } from \"@ai-sdk/react\";\nimport { AssistantRuntime } from \"@assistant-ui/react\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: AssistantRuntime,\n) => {\n // sync input from vercel to assistant-ui\n useEffect(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n const handleThreadUpdate = useCallbackRef(() => {\n if (runtime.thread.composer.getState().text !== helpers.input) {\n helpers.setInput(runtime.thread.composer.getState().text);\n }\n });\n\n useEffect(() => {\n return runtime.thread.subscribe(handleThreadUpdate);\n }, [runtime, handleThreadUpdate]);\n};\n","import type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const sliceMessagesUntil = (\n messages: Message[],\n messageId: string | null,\n) => {\n if (messageId == null) return [];\n\n let messageIdx = messages.findIndex((m) => m.id === messageId);\n if (messageIdx === -1)\n throw new Error(\n \"useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui.\",\n );\n\n while (messages[messageIdx + 1]?.role === \"assistant\") {\n messageIdx++;\n }\n\n return messages.slice(0, messageIdx + 1);\n};\n","import { AppendMessage } from \"@assistant-ui/react\";\nimport { CreateMessage } from \"@ai-sdk/ui-utils\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateMessage> => {\n const content = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const images = message.content\n .filter((part) => part.type === \"image\")\n .map((part) => ({ url: part.image }));\n\n return {\n role: message.role,\n content,\n experimental_attachments: [\n ...images,\n ...(await Promise.all(\n message.attachments.map(async (m) => {\n if (m.file == null)\n throw new Error(\"Attachment did not contain a file\");\n return {\n contentType: m.file.type,\n name: m.file.name,\n url: await getFileDataURL(m.file),\n };\n }),\n )),\n ],\n };\n};\n\nconst getFileDataURL = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n\n reader.readAsDataURL(file);\n });\n","import { AttachmentAdapter } from \"@assistant-ui/react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\n\nexport const vercelAttachmentAdapter: AttachmentAdapter = {\n accept:\n \"image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css\",\n async add({ file }) {\n return {\n id: generateId(),\n type: \"file\",\n name: file.name,\n file,\n contentType: file.type,\n content: [],\n status: { type: \"requires-action\", reason: \"composer-send\" },\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n status: { type: \"complete\" },\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"@ai-sdk/react\";\nimport {\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = useExternalMessageConverter({\n callback: convertMessage,\n isRunning: assistantHelpers.status === \"in_progress\",\n messages: assistantHelpers.messages,\n });\n const runtime = useExternalStoreRuntime({\n isRunning: assistantHelpers.status === \"in_progress\",\n messages,\n onCancel: async () => assistantHelpers.stop(),\n onNew: async (message) => {\n await assistantHelpers.append(await toCreateMessage(message));\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":";AAGA;AAAA,EAGE;AAAA,OACK;AAGP,IAAM,wBAAwB,CAC5B,WACA,eACsB;AACtB,QAAM,UAAU,UAAU,UAAU;AAEpC,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd,SAAS,CAAC,EAAE,MAAM,MAAM,SAAS,QAAQ,QAAQ,CAAC;AAAA,IAClD,WAAW,QAAQ;AAAA,EACrB;AACF;AAEO,IAAM,sBAAsB,CACjC,YACG;AACH,QAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,uDAAuD;AACzE,QAAM,WAAsC;AAAA,IAC1C,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,gBAAgB,CAAC,MACf;AAAA,MACE,QAAQ,mBAAmB,CAACA,OAAMA;AAAA,MAClC;AAAA,IACF;AAAA,IACF,UAAU,QAAQ;AAAA,IAClB,uBAAuB;AAAA,MACrB,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,UAAU,wBAAwB,QAAQ;AAChD,SAAO;AACT;;;ACjDA;AAAA,EACE;AAAA,OAEK;AAEA,IAAM,wBAAwB,OAAO,uBAAuB;AAE5D,IAAM,sBAAsB,CAAC,YAA2B;AAC7D,SAAO,wBAAwB,OAAO;AACxC;;;ACHO,IAAM,iBAAgE,CAC3E,YACG;AACH,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,WAAW,QAAQ;AAAA,QACnB,SAAS,QAAQ;AAAA,QAEjB,aAAa,QAAQ,0BAA0B;AAAA,UAC7C,CAAC,YAAY,SACV;AAAA,YACC,IAAI,IAAI,SAAS;AAAA,YACjB,MAAM;AAAA,YACN,MAAM,WAAW,QAAQ,WAAW;AAAA,YACpC,SAAS,CAAC;AAAA,YACV,aAAa,WAAW,eAAe;AAAA,YACvC,QAAQ,EAAE,MAAM,WAAW;AAAA,UAC7B;AAAA,QACJ;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,WAAW,QAAQ;AAAA,QACnB,SAAS,QAAQ;AAAA,MACnB;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,WAAW,QAAQ;AAAA,QACnB,SAAS;AAAA,UACP,GAAI,QAAQ,UACR;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,MAAM,QAAQ;AAAA,YAChB;AAAA,UACF,IACA,CAAC;AAAA,UACL,GAAI,QAAQ,iBAAiB;AAAA,YAC3B,CAAC,OACE;AAAA,cACC,MAAM;AAAA,cACN,UAAU,EAAE;AAAA,cACZ,YAAY,EAAE;AAAA,cACd,UAAU,KAAK,UAAU,EAAE,IAAI;AAAA,cAC/B,MAAM,EAAE;AAAA,cACR,QAAQ,YAAY,IAAI,EAAE,SAAS;AAAA,YACrC;AAAA,UACJ,KAAK,CAAC;AAAA,QACR;AAAA,MACF;AAAA,IAEF,KAAK,QAAQ;AAUX,UACE,CAAC,QAAQ,QACT,EAAE,OAAO,QAAQ,SAAS,aAC1B,MAAM,QAAQ,QAAQ,IAAI;AAE1B,eAAO,CAAC;AAEV,YAAM,OAAO,QAAQ;AAErB,UAAI,KAAK,SAAS,aAAa;AAC7B,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,QAAQ;AAAA,UACZ,WAAW,QAAQ;AAAA,UACnB,SAAS,CAAC,IAAI;AAAA,QAChB;AAAA,MACF,WAAW,KAAK,SAAS,eAAe;AACtC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,QAAQ;AAAA,UACZ,YAAY,KAAK;AAAA,UACjB,QAAQ,KAAK;AAAA,QACf;AAAA,MACF;AACA,aAAO,CAAC;AAAA,IACV;AAAA,IAEA;AAEE,YAAM,eAAoC,QAAQ;AAClD,YAAM,IAAI;AAAA,QACR,yDAAyD,YAAY;AAAA,MACvE;AAAA,EACJ;AACF;;;AC5GA;AAAA,EACE;AAAA,EACA,2BAAAC;AAAA,OACK;;;ACLP,SAAS,iBAAiB;AAG1B,SAAS,sBAAsB;AAMxB,IAAM,eAAe,CAC1B,SACA,YACG;AAEH,YAAU,MAAM;AACd,QAAI,QAAQ,OAAO,SAAS,SAAS,EAAE,SAAS,QAAQ,OAAO;AAC7D,cAAQ,OAAO,SAAS,QAAQ,QAAQ,KAAK;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,CAAC;AAGrB,QAAM,qBAAqB,eAAe,MAAM;AAC9C,QAAI,QAAQ,OAAO,SAAS,SAAS,EAAE,SAAS,QAAQ,OAAO;AAC7D,cAAQ,SAAS,QAAQ,OAAO,SAAS,SAAS,EAAE,IAAI;AAAA,IAC1D;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,WAAO,QAAQ,OAAO,UAAU,kBAAkB;AAAA,EACpD,GAAG,CAAC,SAAS,kBAAkB,CAAC;AAClC;;;AC5BO,IAAM,qBAAqB,CAChC,UACA,cACG;AACH,MAAI,aAAa,KAAM,QAAO,CAAC;AAE/B,MAAI,aAAa,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS;AAC7D,MAAI,eAAe;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAEF,SAAO,SAAS,aAAa,CAAC,GAAG,SAAS,aAAa;AACrD;AAAA,EACF;AAEA,SAAO,SAAS,MAAM,GAAG,aAAa,CAAC;AACzC;;;AChBO,IAAM,kBAAkB,OAC7B,YAC2B;AAC3B,QAAM,UAAU,QAAQ,QACrB,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,MAAM;AAEd,QAAM,SAAS,QAAQ,QACpB,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,EACtC,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,MAAM,EAAE;AAEtC,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd;AAAA,IACA,0BAA0B;AAAA,MACxB,GAAG;AAAA,MACH,GAAI,MAAM,QAAQ;AAAA,QAChB,QAAQ,YAAY,IAAI,OAAO,MAAM;AACnC,cAAI,EAAE,QAAQ;AACZ,kBAAM,IAAI,MAAM,mCAAmC;AACrD,iBAAO;AAAA,YACL,aAAa,EAAE,KAAK;AAAA,YACpB,MAAM,EAAE,KAAK;AAAA,YACb,KAAK,MAAM,eAAe,EAAE,IAAI;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,iBAAiB,CAAC,SACtB,IAAI,QAAgB,CAAC,SAAS,WAAW;AACvC,QAAM,SAAS,IAAI,WAAW;AAE9B,SAAO,SAAS,MAAM,QAAQ,OAAO,MAAgB;AACrD,SAAO,UAAU,CAAC,UAAU,OAAO,KAAK;AAExC,SAAO,cAAc,IAAI;AAC3B,CAAC;;;AC1CH,SAAS,kBAAkB;AAEpB,IAAM,0BAA6C;AAAA,EACxD,QACE;AAAA,EACF,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,WAAO;AAAA,MACL,IAAI,WAAW;AAAA,MACf,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,SAAS,CAAC;AAAA,MACV,QAAQ,EAAE,MAAM,mBAAmB,QAAQ,gBAAgB;AAAA,IAC7D;AAAA,EACF;AAAA,EACA,MAAM,KAAK,YAAY;AAErB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,EAAE,MAAM,WAAW;AAAA,MAC3B,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,SAAS;AAAA,EAEf;AACF;;;AC5BA;AAAA,EACE,2BAAAC;AAAA,OAEK;AAGA,IAAM,sBAAsB,CAAC,YAA2B;AAC7D,SAAOA,yBAAwB,OAAO;AACxC;;;ALWO,IAAM,0BAA0B,CACrC,aACA,UAAgC,CAAC,MAC9B;AACH,QAAM,WAAW,4BAA4B;AAAA,IAC3C,UAAU;AAAA,IACV,WAAW,YAAY;AAAA,IACvB,UAAU,YAAY;AAAA,EACxB,CAAC;AAED,QAAM,UAAUC,yBAAwB;AAAA,IACtC,WAAW,YAAY;AAAA,IACvB;AAAA,IACA,aAAa,CAACC,cACZ,YAAY,YAAYA,UAAS,IAAI,mBAAmB,EAAE,KAAK,CAAC;AAAA,IAClE,UAAU,YAAY,YAAY,KAAK;AAAA,IACvC,OAAO,OAAO,YAAY;AACxB,YAAM,YAAY,OAAO,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACzD;AAAA,IACA,QAAQ,OAAO,YAAY;AACzB,YAAM,cAAc;AAAA,QAClB,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AACA,kBAAY,YAAY,WAAW;AAEnC,YAAM,YAAY,OAAO,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACzD;AAAA,IACA,UAAU,OAAO,aAA4B;AAC3C,YAAM,cAAc,mBAAmB,YAAY,UAAU,QAAQ;AACrE,kBAAY,YAAY,WAAW;AAEnC,YAAM,YAAY,OAAO;AAAA,IAC3B;AAAA,IACA,iBAAiB,CAAC,EAAE,YAAY,OAAO,MAAM;AAC3C,kBAAY,cAAc,EAAE,YAAY,OAAO,CAAC;AAAA,IAClD;AAAA,IACA,UAAU;AAAA,MACR,aAAa;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,YAAY,IAAI,MAAM,QAAQ,UAAU,cAAc,CAAC,GAAG;AAAA,QACxD,IAAI,QAAQ,MAAM,UAAU;AAC1B,cAAI,SAAS,uBAAuB;AAClC,mBAAO,MAAM;AACX,0BAAY,WAAW,CAAC;AACxB,0BAAY,QAAQ;AACpB,0BAAY,YAAY,CAAC,CAAC;AAC1B,0BAAY,SAAS,EAAE;AAEvB,kBAAI,OAAO,OAAO,wBAAwB,YAAY;AACpD,uBAAO,OAAO,oBAAoB,KAAK,MAAM;AAAA,cAC/C;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,eAAa,aAAa,OAAO;AAEjC,SAAO;AACT;;;AMlFA;AAAA,EACE,+BAAAC;AAAA,EACA,2BAAAC;AAAA,OACK;AAaA,IAAM,+BAA+B,CAC1C,kBACA,UAAgC,CAAC,MAC9B;AACH,QAAM,WAAWC,6BAA4B;AAAA,IAC3C,UAAU;AAAA,IACV,WAAW,iBAAiB,WAAW;AAAA,IACvC,UAAU,iBAAiB;AAAA,EAC7B,CAAC;AACD,QAAM,UAAUC,yBAAwB;AAAA,IACtC,WAAW,iBAAiB,WAAW;AAAA,IACvC;AAAA,IACA,UAAU,YAAY,iBAAiB,KAAK;AAAA,IAC5C,OAAO,OAAO,YAAY;AACxB,YAAM,iBAAiB,OAAO,MAAM,gBAAgB,OAAO,CAAC;AAAA,IAC9D;AAAA,IACA,UAAU;AAAA,MACR,aAAa;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,YAAY,IAAI,MAAM,QAAQ,UAAU,cAAc,CAAC,GAAG;AAAA,QACxD,IAAI,QAAQ,MAAM,UAAU;AAC1B,cAAI,SAAS,uBAAuB;AAClC,mBAAO,MAAM;AACX,+BAAiB,WAAW,CAAC;AAC7B,+BAAiB,QAAQ;AACzB,+BAAiB,YAAY,CAAC,CAAC;AAC/B,+BAAiB,SAAS,EAAE;AAE5B,kBAAI,OAAO,OAAO,wBAAwB,YAAY;AACpD,uBAAO,OAAO,oBAAoB,KAAK,MAAM;AAAA,cAC/C;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,eAAa,kBAAkB,OAAO;AAEtC,SAAO;AACT;","names":["m","useExternalStoreRuntime","getExternalStoreMessage","useExternalStoreRuntime","messages","useExternalMessageConverter","useExternalStoreRuntime","useExternalMessageConverter","useExternalStoreRuntime"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-ai-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -28,10 +28,10 @@
|
|
|
28
28
|
"@ai-sdk/ui-utils": "*",
|
|
29
29
|
"@radix-ui/react-use-callback-ref": "^1.1.0",
|
|
30
30
|
"zod": "^3.23.8",
|
|
31
|
-
"zustand": "^5.0.
|
|
31
|
+
"zustand": "^5.0.1"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
34
|
-
"@assistant-ui/react": "^0.
|
|
34
|
+
"@assistant-ui/react": "^0.7.0",
|
|
35
35
|
"@types/react": "*",
|
|
36
36
|
"react": "^18 || ^19 || ^19.0.0-rc"
|
|
37
37
|
},
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"eslint-config-next": "15.0.
|
|
44
|
+
"eslint-config-next": "15.0.2",
|
|
45
45
|
"tsup": "8.3.5",
|
|
46
|
-
"@assistant-ui/react": "0.
|
|
46
|
+
"@assistant-ui/react": "0.7.0",
|
|
47
47
|
"@assistant-ui/tsconfig": "0.0.0"
|
|
48
48
|
},
|
|
49
49
|
"publishConfig": {
|