@assistant-ui/react-ai-sdk 0.6.4 → 0.6.5
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.js +80 -108
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +84 -106
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -69,111 +69,77 @@ var getVercelRSCMessage = (message) => {
|
|
|
69
69
|
return (0, import_react2.getExternalStoreMessage)(message);
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
-
// src/ui/utils/useCachedChunkedMessages.ts
|
|
73
|
-
var import_react3 = require("react");
|
|
74
|
-
var hasItems = (messages) => messages.length > 0;
|
|
75
|
-
var chunkedMessages = (messages) => {
|
|
76
|
-
const chunks = [];
|
|
77
|
-
let currentChunk = [];
|
|
78
|
-
for (const message of messages) {
|
|
79
|
-
if (message.role === "assistant" || message.role === "data") {
|
|
80
|
-
currentChunk.push(message);
|
|
81
|
-
} else {
|
|
82
|
-
if (hasItems(currentChunk)) {
|
|
83
|
-
chunks.push(currentChunk);
|
|
84
|
-
currentChunk = [];
|
|
85
|
-
}
|
|
86
|
-
chunks.push([message]);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
if (hasItems(currentChunk)) {
|
|
90
|
-
chunks.push(currentChunk);
|
|
91
|
-
}
|
|
92
|
-
return chunks;
|
|
93
|
-
};
|
|
94
|
-
var shallowArrayEqual = (a, b) => {
|
|
95
|
-
if (a.length !== b.length) return false;
|
|
96
|
-
for (let i = 0; i < a.length; i++) {
|
|
97
|
-
if (a[i] !== b[i]) return false;
|
|
98
|
-
}
|
|
99
|
-
return true;
|
|
100
|
-
};
|
|
101
|
-
var useCachedChunkedMessages = (messages) => {
|
|
102
|
-
const cache = (0, import_react3.useMemo)(() => /* @__PURE__ */ new WeakMap(), []);
|
|
103
|
-
return (0, import_react3.useMemo)(() => {
|
|
104
|
-
return chunkedMessages(messages).map((m) => {
|
|
105
|
-
const key = m[0];
|
|
106
|
-
if (!key) return m;
|
|
107
|
-
const cached = cache.get(key);
|
|
108
|
-
if (cached && shallowArrayEqual(cached, m)) return cached;
|
|
109
|
-
cache.set(key, m);
|
|
110
|
-
return m;
|
|
111
|
-
});
|
|
112
|
-
}, [messages, cache]);
|
|
113
|
-
};
|
|
114
|
-
|
|
115
72
|
// src/ui/utils/convertMessage.ts
|
|
116
|
-
var convertMessage = (
|
|
117
|
-
|
|
118
|
-
if (!firstMessage) throw new Error("No messages found");
|
|
119
|
-
const common = {
|
|
120
|
-
id: firstMessage.id,
|
|
121
|
-
createdAt: firstMessage.createdAt ?? /* @__PURE__ */ new Date()
|
|
122
|
-
};
|
|
123
|
-
switch (firstMessage.role) {
|
|
73
|
+
var convertMessage = (message) => {
|
|
74
|
+
switch (message.role) {
|
|
124
75
|
case "user":
|
|
125
|
-
if (messages.length > 1) {
|
|
126
|
-
throw new Error(
|
|
127
|
-
"Multiple user messages found. This is likely an internal bug in assistant-ui."
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
76
|
return {
|
|
131
|
-
...common,
|
|
132
77
|
role: "user",
|
|
133
|
-
|
|
78
|
+
id: message.id,
|
|
79
|
+
createdAt: message.createdAt,
|
|
80
|
+
content: message.content,
|
|
81
|
+
attachments: message.experimental_attachments?.map(
|
|
82
|
+
(attachment, idx) => ({
|
|
83
|
+
id: idx.toString(),
|
|
84
|
+
type: "file",
|
|
85
|
+
name: attachment.name ?? attachment.url,
|
|
86
|
+
content: []
|
|
87
|
+
})
|
|
88
|
+
)
|
|
134
89
|
};
|
|
135
90
|
case "system":
|
|
136
91
|
return {
|
|
137
|
-
...common,
|
|
138
92
|
role: "system",
|
|
139
|
-
|
|
93
|
+
id: message.id,
|
|
94
|
+
createdAt: message.createdAt,
|
|
95
|
+
content: message.content
|
|
140
96
|
};
|
|
141
|
-
case "
|
|
142
|
-
|
|
143
|
-
const res = {
|
|
144
|
-
...common,
|
|
97
|
+
case "assistant":
|
|
98
|
+
return {
|
|
145
99
|
role: "assistant",
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
100
|
+
id: message.id,
|
|
101
|
+
createdAt: message.createdAt,
|
|
102
|
+
content: [
|
|
103
|
+
...message.content ? [
|
|
104
|
+
{
|
|
105
|
+
type: "text",
|
|
106
|
+
text: message.content
|
|
107
|
+
}
|
|
108
|
+
] : [],
|
|
109
|
+
...message.toolInvocations?.map(
|
|
110
|
+
(t) => ({
|
|
111
|
+
type: "tool-call",
|
|
112
|
+
toolName: t.toolName,
|
|
113
|
+
toolCallId: t.toolCallId,
|
|
114
|
+
argsText: JSON.stringify(t.args),
|
|
115
|
+
args: t.args,
|
|
116
|
+
result: "result" in t ? t.result : void 0
|
|
117
|
+
})
|
|
118
|
+
) ?? []
|
|
119
|
+
]
|
|
162
120
|
};
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
121
|
+
case "data": {
|
|
122
|
+
if (!message.data || !(typeof message.data === "object") || Array.isArray(message.data))
|
|
123
|
+
return [];
|
|
124
|
+
const data = message.data;
|
|
125
|
+
if (data.type === "tool-call") {
|
|
126
|
+
return {
|
|
127
|
+
role: "assistant",
|
|
128
|
+
id: message.id,
|
|
129
|
+
createdAt: message.createdAt,
|
|
130
|
+
content: [data]
|
|
131
|
+
};
|
|
132
|
+
} else if (data.type === "tool-result") {
|
|
133
|
+
return {
|
|
134
|
+
role: "tool",
|
|
135
|
+
toolCallId: data.toolCallId,
|
|
136
|
+
result: data.result
|
|
137
|
+
};
|
|
172
138
|
}
|
|
173
|
-
return
|
|
139
|
+
return [];
|
|
174
140
|
}
|
|
175
141
|
default:
|
|
176
|
-
const _unsupported =
|
|
142
|
+
const _unsupported = message.role;
|
|
177
143
|
throw new Error(
|
|
178
144
|
`You have a message with an unsupported role. The role ${_unsupported} is not supported.`
|
|
179
145
|
);
|
|
@@ -184,18 +150,18 @@ var convertMessage = (messages) => {
|
|
|
184
150
|
var import_react6 = require("@assistant-ui/react");
|
|
185
151
|
|
|
186
152
|
// src/ui/utils/useInputSync.tsx
|
|
187
|
-
var
|
|
188
|
-
var
|
|
153
|
+
var import_react3 = require("react");
|
|
154
|
+
var import_react4 = require("@assistant-ui/react");
|
|
189
155
|
var useInputSync = (helpers, runtime) => {
|
|
190
|
-
const helpersRef = (0,
|
|
191
|
-
(0,
|
|
156
|
+
const helpersRef = (0, import_react3.useRef)(helpers);
|
|
157
|
+
(0, import_react3.useEffect)(() => {
|
|
192
158
|
helpersRef.current = helpers;
|
|
193
159
|
if (runtime.thread.composer.text !== helpers.input) {
|
|
194
160
|
runtime.thread.composer.setText(helpers.input);
|
|
195
161
|
}
|
|
196
162
|
}, [helpers, runtime]);
|
|
197
|
-
(0,
|
|
198
|
-
return (0,
|
|
163
|
+
(0, import_react3.useEffect)(() => {
|
|
164
|
+
return (0, import_react4.subscribeToMainThread)(runtime, () => {
|
|
199
165
|
if (runtime.thread.composer.text !== helpersRef.current.input) {
|
|
200
166
|
helpersRef.current.setInput(runtime.thread.composer.text);
|
|
201
167
|
}
|
|
@@ -270,13 +236,23 @@ var vercelAttachmentAdapter = {
|
|
|
270
236
|
}
|
|
271
237
|
};
|
|
272
238
|
|
|
239
|
+
// src/ui/getVercelAIMessages.tsx
|
|
240
|
+
var import_react5 = require("@assistant-ui/react");
|
|
241
|
+
var getVercelAIMessages = (message) => {
|
|
242
|
+
return (0, import_react5.getExternalStoreMessage)(message);
|
|
243
|
+
};
|
|
244
|
+
|
|
273
245
|
// src/ui/use-chat/useVercelUseChatRuntime.tsx
|
|
274
246
|
var useVercelUseChatRuntime = (chatHelpers) => {
|
|
275
|
-
const messages =
|
|
247
|
+
const messages = (0, import_react6.useExternalMessageConverter)({
|
|
248
|
+
callback: convertMessage,
|
|
249
|
+
isRunning: chatHelpers.isLoading,
|
|
250
|
+
messages: chatHelpers.messages
|
|
251
|
+
});
|
|
276
252
|
const runtime = (0, import_react6.useExternalStoreRuntime)({
|
|
277
253
|
isRunning: chatHelpers.isLoading,
|
|
278
254
|
messages,
|
|
279
|
-
setMessages: (messages2) => chatHelpers.setMessages(messages2.flat()),
|
|
255
|
+
setMessages: (messages2) => chatHelpers.setMessages(messages2.map(getVercelAIMessages).flat()),
|
|
280
256
|
onCancel: async () => chatHelpers.stop(),
|
|
281
257
|
onNew: async (message) => {
|
|
282
258
|
await chatHelpers.append(await toCreateMessage(message));
|
|
@@ -303,7 +279,6 @@ var useVercelUseChatRuntime = (chatHelpers) => {
|
|
|
303
279
|
chatHelpers.setMessages([]);
|
|
304
280
|
chatHelpers.setInput("");
|
|
305
281
|
},
|
|
306
|
-
convertMessage,
|
|
307
282
|
adapters: {
|
|
308
283
|
attachments: vercelAttachmentAdapter
|
|
309
284
|
}
|
|
@@ -315,7 +290,11 @@ var useVercelUseChatRuntime = (chatHelpers) => {
|
|
|
315
290
|
// src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
|
|
316
291
|
var import_react7 = require("@assistant-ui/react");
|
|
317
292
|
var useVercelUseAssistantRuntime = (assistantHelpers) => {
|
|
318
|
-
const messages =
|
|
293
|
+
const messages = (0, import_react7.useExternalMessageConverter)({
|
|
294
|
+
callback: convertMessage,
|
|
295
|
+
isRunning: assistantHelpers.status === "in_progress",
|
|
296
|
+
messages: assistantHelpers.messages
|
|
297
|
+
});
|
|
319
298
|
const runtime = (0, import_react7.useExternalStoreRuntime)({
|
|
320
299
|
isRunning: assistantHelpers.status === "in_progress",
|
|
321
300
|
messages,
|
|
@@ -329,7 +308,6 @@ var useVercelUseAssistantRuntime = (assistantHelpers) => {
|
|
|
329
308
|
assistantHelpers.setMessages([]);
|
|
330
309
|
assistantHelpers.setInput("");
|
|
331
310
|
},
|
|
332
|
-
convertMessage,
|
|
333
311
|
adapters: {
|
|
334
312
|
attachments: vercelAttachmentAdapter
|
|
335
313
|
}
|
|
@@ -337,12 +315,6 @@ var useVercelUseAssistantRuntime = (assistantHelpers) => {
|
|
|
337
315
|
useInputSync(assistantHelpers, runtime);
|
|
338
316
|
return runtime;
|
|
339
317
|
};
|
|
340
|
-
|
|
341
|
-
// src/ui/getVercelAIMessages.tsx
|
|
342
|
-
var import_react8 = require("@assistant-ui/react");
|
|
343
|
-
var getVercelAIMessages = (message) => {
|
|
344
|
-
return (0, import_react8.getExternalStoreMessage)(message);
|
|
345
|
-
};
|
|
346
318
|
// Annotate the CommonJS export names for ESM import in node:
|
|
347
319
|
0 && (module.exports = {
|
|
348
320
|
getVercelAIMessage,
|
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/useCachedChunkedMessages.ts","../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/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/getVercelAIMessages.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 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\";\nimport { useMemo } from \"react\";\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\" || message.role === \"data\") {\n currentChunk.push(message);\n } else {\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n currentChunk = [];\n }\n chunks.push([message]);\n }\n }\n\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n }\n\n return chunks;\n};\n\nconst shallowArrayEqual = (a: unknown[], b: unknown[]) => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\nexport const useCachedChunkedMessages = (messages: Message[]) => {\n const cache = useMemo(() => new WeakMap<Message, Message[]>(), []);\n\n return useMemo(() => {\n return chunkedMessages(messages).map((m) => {\n const key = m[0];\n if (!key) return m;\n\n const cached = cache.get(key);\n if (cached && shallowArrayEqual(cached, m)) return cached;\n cache.set(key, m);\n return m;\n });\n }, [messages, cache]);\n};\n","import { Message } from \"ai\";\nimport { ThreadMessageLike } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\n\nexport const convertMessage = (messages: Message[]): ThreadMessageLike => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n\n case \"system\":\n return {\n ...common,\n role: \"system\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n\n case \"data\":\n case \"assistant\": {\n const res: ThreadMessageLike & { content: any[] } = {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => {\n return [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\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 ...(typeof message.data === \"object\" &&\n !Array.isArray(message.data) &&\n message.data?.[\"type\"] === \"tool-call\"\n ? [message.data as ToolCallContentPart]\n : []),\n ];\n }),\n };\n\n for (const message of messages) {\n if (\n typeof message.data === \"object\" &&\n !Array.isArray(message.data) &&\n message.data?.[\"type\"] === \"tool-result\"\n ) {\n const toolCallId = message.data[\"toolCallId\"];\n const toolContent = res.content.find(\n (c) => c.type === \"tool-call\" && c.toolCallId === toolCallId,\n ) as ToolCallContentPart | undefined;\n if (!toolContent) throw new Error(\"Tool call not found\");\n toolContent.result = message.data[\"result\"];\n }\n }\n\n return res;\n }\n\n default:\n const _unsupported: \"function\" | \"tool\" = firstMessage.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/react\";\nimport { useCachedChunkedMessages } from \"../utils/useCachedChunkedMessages\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useExternalStoreRuntime } from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const messages = useCachedChunkedMessages(chatHelpers.messages);\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) => chatHelpers.setMessages(messages.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 onNewThread: () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n },\n convertMessage,\n adapters: {\n attachments: vercelAttachmentAdapter,\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useRef, useEffect } from \"react\";\nimport {\n ExternalStoreRuntime,\n subscribeToMainThread,\n} from \"@assistant-ui/react\";\nimport { useAssistant, useChat } from \"ai/react\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: ExternalStoreRuntime,\n) => {\n // sync input from vercel to assistant-ui\n const helpersRef = useRef(helpers);\n useEffect(() => {\n helpersRef.current = helpers;\n if (runtime.thread.composer.text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n useEffect(() => {\n return subscribeToMainThread(runtime, () => {\n if (runtime.thread.composer.text !== helpersRef.current.input) {\n helpersRef.current.setInput(runtime.thread.composer.text);\n }\n });\n }, [runtime]);\n};\n","import type { Message } from \"ai\";\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\";\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\";\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 content: [],\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import type { useAssistant } from \"ai/react\";\nimport { useExternalStoreRuntime } from \"@assistant-ui/react\";\nimport { useCachedChunkedMessages } from \"../utils/useCachedChunkedMessages\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n) => {\n const messages = useCachedChunkedMessages(assistantHelpers.messages);\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 onNewThread: () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n },\n convertMessage,\n adapters: {\n attachments: vercelAttachmentAdapter,\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n"],"mappings":"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","names":["m","import_react","import_react","import_react","import_react","messages","import_react","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 ?? 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 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\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { MessageAttachment } from \"../../../../react/src/context/stores/Attachment\";\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 }) satisfies MessageAttachment,\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/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\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\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 onNewThread: () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useRef, useEffect } from \"react\";\nimport {\n ExternalStoreRuntime,\n subscribeToMainThread,\n} from \"@assistant-ui/react\";\nimport { useAssistant, useChat } from \"ai/react\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: ExternalStoreRuntime,\n) => {\n // sync input from vercel to assistant-ui\n const helpersRef = useRef(helpers);\n useEffect(() => {\n helpersRef.current = helpers;\n if (runtime.thread.composer.text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n useEffect(() => {\n return subscribeToMainThread(runtime, () => {\n if (runtime.thread.composer.text !== helpersRef.current.input) {\n helpersRef.current.setInput(runtime.thread.composer.text);\n }\n });\n }, [runtime]);\n};\n","import type { Message } from \"ai\";\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\";\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\";\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 content: [],\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\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\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"ai/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\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\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 onNewThread: () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\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
|
@@ -42,111 +42,77 @@ var getVercelRSCMessage = (message) => {
|
|
|
42
42
|
return getExternalStoreMessage(message);
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
-
// src/ui/utils/useCachedChunkedMessages.ts
|
|
46
|
-
import { useMemo } from "react";
|
|
47
|
-
var hasItems = (messages) => messages.length > 0;
|
|
48
|
-
var chunkedMessages = (messages) => {
|
|
49
|
-
const chunks = [];
|
|
50
|
-
let currentChunk = [];
|
|
51
|
-
for (const message of messages) {
|
|
52
|
-
if (message.role === "assistant" || message.role === "data") {
|
|
53
|
-
currentChunk.push(message);
|
|
54
|
-
} else {
|
|
55
|
-
if (hasItems(currentChunk)) {
|
|
56
|
-
chunks.push(currentChunk);
|
|
57
|
-
currentChunk = [];
|
|
58
|
-
}
|
|
59
|
-
chunks.push([message]);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if (hasItems(currentChunk)) {
|
|
63
|
-
chunks.push(currentChunk);
|
|
64
|
-
}
|
|
65
|
-
return chunks;
|
|
66
|
-
};
|
|
67
|
-
var shallowArrayEqual = (a, b) => {
|
|
68
|
-
if (a.length !== b.length) return false;
|
|
69
|
-
for (let i = 0; i < a.length; i++) {
|
|
70
|
-
if (a[i] !== b[i]) return false;
|
|
71
|
-
}
|
|
72
|
-
return true;
|
|
73
|
-
};
|
|
74
|
-
var useCachedChunkedMessages = (messages) => {
|
|
75
|
-
const cache = useMemo(() => /* @__PURE__ */ new WeakMap(), []);
|
|
76
|
-
return useMemo(() => {
|
|
77
|
-
return chunkedMessages(messages).map((m) => {
|
|
78
|
-
const key = m[0];
|
|
79
|
-
if (!key) return m;
|
|
80
|
-
const cached = cache.get(key);
|
|
81
|
-
if (cached && shallowArrayEqual(cached, m)) return cached;
|
|
82
|
-
cache.set(key, m);
|
|
83
|
-
return m;
|
|
84
|
-
});
|
|
85
|
-
}, [messages, cache]);
|
|
86
|
-
};
|
|
87
|
-
|
|
88
45
|
// src/ui/utils/convertMessage.ts
|
|
89
|
-
var convertMessage = (
|
|
90
|
-
|
|
91
|
-
if (!firstMessage) throw new Error("No messages found");
|
|
92
|
-
const common = {
|
|
93
|
-
id: firstMessage.id,
|
|
94
|
-
createdAt: firstMessage.createdAt ?? /* @__PURE__ */ new Date()
|
|
95
|
-
};
|
|
96
|
-
switch (firstMessage.role) {
|
|
46
|
+
var convertMessage = (message) => {
|
|
47
|
+
switch (message.role) {
|
|
97
48
|
case "user":
|
|
98
|
-
if (messages.length > 1) {
|
|
99
|
-
throw new Error(
|
|
100
|
-
"Multiple user messages found. This is likely an internal bug in assistant-ui."
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
49
|
return {
|
|
104
|
-
...common,
|
|
105
50
|
role: "user",
|
|
106
|
-
|
|
51
|
+
id: message.id,
|
|
52
|
+
createdAt: message.createdAt,
|
|
53
|
+
content: message.content,
|
|
54
|
+
attachments: message.experimental_attachments?.map(
|
|
55
|
+
(attachment, idx) => ({
|
|
56
|
+
id: idx.toString(),
|
|
57
|
+
type: "file",
|
|
58
|
+
name: attachment.name ?? attachment.url,
|
|
59
|
+
content: []
|
|
60
|
+
})
|
|
61
|
+
)
|
|
107
62
|
};
|
|
108
63
|
case "system":
|
|
109
64
|
return {
|
|
110
|
-
...common,
|
|
111
65
|
role: "system",
|
|
112
|
-
|
|
66
|
+
id: message.id,
|
|
67
|
+
createdAt: message.createdAt,
|
|
68
|
+
content: message.content
|
|
113
69
|
};
|
|
114
|
-
case "
|
|
115
|
-
|
|
116
|
-
const res = {
|
|
117
|
-
...common,
|
|
70
|
+
case "assistant":
|
|
71
|
+
return {
|
|
118
72
|
role: "assistant",
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
73
|
+
id: message.id,
|
|
74
|
+
createdAt: message.createdAt,
|
|
75
|
+
content: [
|
|
76
|
+
...message.content ? [
|
|
77
|
+
{
|
|
78
|
+
type: "text",
|
|
79
|
+
text: message.content
|
|
80
|
+
}
|
|
81
|
+
] : [],
|
|
82
|
+
...message.toolInvocations?.map(
|
|
83
|
+
(t) => ({
|
|
84
|
+
type: "tool-call",
|
|
85
|
+
toolName: t.toolName,
|
|
86
|
+
toolCallId: t.toolCallId,
|
|
87
|
+
argsText: JSON.stringify(t.args),
|
|
88
|
+
args: t.args,
|
|
89
|
+
result: "result" in t ? t.result : void 0
|
|
90
|
+
})
|
|
91
|
+
) ?? []
|
|
92
|
+
]
|
|
135
93
|
};
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
94
|
+
case "data": {
|
|
95
|
+
if (!message.data || !(typeof message.data === "object") || Array.isArray(message.data))
|
|
96
|
+
return [];
|
|
97
|
+
const data = message.data;
|
|
98
|
+
if (data.type === "tool-call") {
|
|
99
|
+
return {
|
|
100
|
+
role: "assistant",
|
|
101
|
+
id: message.id,
|
|
102
|
+
createdAt: message.createdAt,
|
|
103
|
+
content: [data]
|
|
104
|
+
};
|
|
105
|
+
} else if (data.type === "tool-result") {
|
|
106
|
+
return {
|
|
107
|
+
role: "tool",
|
|
108
|
+
toolCallId: data.toolCallId,
|
|
109
|
+
result: data.result
|
|
110
|
+
};
|
|
145
111
|
}
|
|
146
|
-
return
|
|
112
|
+
return [];
|
|
147
113
|
}
|
|
148
114
|
default:
|
|
149
|
-
const _unsupported =
|
|
115
|
+
const _unsupported = message.role;
|
|
150
116
|
throw new Error(
|
|
151
117
|
`You have a message with an unsupported role. The role ${_unsupported} is not supported.`
|
|
152
118
|
);
|
|
@@ -154,7 +120,10 @@ var convertMessage = (messages) => {
|
|
|
154
120
|
};
|
|
155
121
|
|
|
156
122
|
// src/ui/use-chat/useVercelUseChatRuntime.tsx
|
|
157
|
-
import {
|
|
123
|
+
import {
|
|
124
|
+
useExternalMessageConverter,
|
|
125
|
+
useExternalStoreRuntime as useExternalStoreRuntime2
|
|
126
|
+
} from "@assistant-ui/react";
|
|
158
127
|
|
|
159
128
|
// src/ui/utils/useInputSync.tsx
|
|
160
129
|
import { useRef, useEffect } from "react";
|
|
@@ -245,13 +214,25 @@ var vercelAttachmentAdapter = {
|
|
|
245
214
|
}
|
|
246
215
|
};
|
|
247
216
|
|
|
217
|
+
// src/ui/getVercelAIMessages.tsx
|
|
218
|
+
import {
|
|
219
|
+
getExternalStoreMessage as getExternalStoreMessage2
|
|
220
|
+
} from "@assistant-ui/react";
|
|
221
|
+
var getVercelAIMessages = (message) => {
|
|
222
|
+
return getExternalStoreMessage2(message);
|
|
223
|
+
};
|
|
224
|
+
|
|
248
225
|
// src/ui/use-chat/useVercelUseChatRuntime.tsx
|
|
249
226
|
var useVercelUseChatRuntime = (chatHelpers) => {
|
|
250
|
-
const messages =
|
|
227
|
+
const messages = useExternalMessageConverter({
|
|
228
|
+
callback: convertMessage,
|
|
229
|
+
isRunning: chatHelpers.isLoading,
|
|
230
|
+
messages: chatHelpers.messages
|
|
231
|
+
});
|
|
251
232
|
const runtime = useExternalStoreRuntime2({
|
|
252
233
|
isRunning: chatHelpers.isLoading,
|
|
253
234
|
messages,
|
|
254
|
-
setMessages: (messages2) => chatHelpers.setMessages(messages2.flat()),
|
|
235
|
+
setMessages: (messages2) => chatHelpers.setMessages(messages2.map(getVercelAIMessages).flat()),
|
|
255
236
|
onCancel: async () => chatHelpers.stop(),
|
|
256
237
|
onNew: async (message) => {
|
|
257
238
|
await chatHelpers.append(await toCreateMessage(message));
|
|
@@ -278,7 +259,6 @@ var useVercelUseChatRuntime = (chatHelpers) => {
|
|
|
278
259
|
chatHelpers.setMessages([]);
|
|
279
260
|
chatHelpers.setInput("");
|
|
280
261
|
},
|
|
281
|
-
convertMessage,
|
|
282
262
|
adapters: {
|
|
283
263
|
attachments: vercelAttachmentAdapter
|
|
284
264
|
}
|
|
@@ -288,9 +268,16 @@ var useVercelUseChatRuntime = (chatHelpers) => {
|
|
|
288
268
|
};
|
|
289
269
|
|
|
290
270
|
// src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
|
|
291
|
-
import {
|
|
271
|
+
import {
|
|
272
|
+
useExternalMessageConverter as useExternalMessageConverter2,
|
|
273
|
+
useExternalStoreRuntime as useExternalStoreRuntime3
|
|
274
|
+
} from "@assistant-ui/react";
|
|
292
275
|
var useVercelUseAssistantRuntime = (assistantHelpers) => {
|
|
293
|
-
const messages =
|
|
276
|
+
const messages = useExternalMessageConverter2({
|
|
277
|
+
callback: convertMessage,
|
|
278
|
+
isRunning: assistantHelpers.status === "in_progress",
|
|
279
|
+
messages: assistantHelpers.messages
|
|
280
|
+
});
|
|
294
281
|
const runtime = useExternalStoreRuntime3({
|
|
295
282
|
isRunning: assistantHelpers.status === "in_progress",
|
|
296
283
|
messages,
|
|
@@ -304,7 +291,6 @@ var useVercelUseAssistantRuntime = (assistantHelpers) => {
|
|
|
304
291
|
assistantHelpers.setMessages([]);
|
|
305
292
|
assistantHelpers.setInput("");
|
|
306
293
|
},
|
|
307
|
-
convertMessage,
|
|
308
294
|
adapters: {
|
|
309
295
|
attachments: vercelAttachmentAdapter
|
|
310
296
|
}
|
|
@@ -312,14 +298,6 @@ var useVercelUseAssistantRuntime = (assistantHelpers) => {
|
|
|
312
298
|
useInputSync(assistantHelpers, runtime);
|
|
313
299
|
return runtime;
|
|
314
300
|
};
|
|
315
|
-
|
|
316
|
-
// src/ui/getVercelAIMessages.tsx
|
|
317
|
-
import {
|
|
318
|
-
getExternalStoreMessage as getExternalStoreMessage2
|
|
319
|
-
} from "@assistant-ui/react";
|
|
320
|
-
var getVercelAIMessages = (message) => {
|
|
321
|
-
return getExternalStoreMessage2(message);
|
|
322
|
-
};
|
|
323
301
|
export {
|
|
324
302
|
getVercelAIMessages as getVercelAIMessage,
|
|
325
303
|
getVercelAIMessages,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/ui/utils/useCachedChunkedMessages.ts","../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/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/getVercelAIMessages.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 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\";\nimport { useMemo } from \"react\";\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\" || message.role === \"data\") {\n currentChunk.push(message);\n } else {\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n currentChunk = [];\n }\n chunks.push([message]);\n }\n }\n\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n }\n\n return chunks;\n};\n\nconst shallowArrayEqual = (a: unknown[], b: unknown[]) => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\nexport const useCachedChunkedMessages = (messages: Message[]) => {\n const cache = useMemo(() => new WeakMap<Message, Message[]>(), []);\n\n return useMemo(() => {\n return chunkedMessages(messages).map((m) => {\n const key = m[0];\n if (!key) return m;\n\n const cached = cache.get(key);\n if (cached && shallowArrayEqual(cached, m)) return cached;\n cache.set(key, m);\n return m;\n });\n }, [messages, cache]);\n};\n","import { Message } from \"ai\";\nimport { ThreadMessageLike } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\n\nexport const convertMessage = (messages: Message[]): ThreadMessageLike => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n\n case \"system\":\n return {\n ...common,\n role: \"system\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n\n case \"data\":\n case \"assistant\": {\n const res: ThreadMessageLike & { content: any[] } = {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => {\n return [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\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 ...(typeof message.data === \"object\" &&\n !Array.isArray(message.data) &&\n message.data?.[\"type\"] === \"tool-call\"\n ? [message.data as ToolCallContentPart]\n : []),\n ];\n }),\n };\n\n for (const message of messages) {\n if (\n typeof message.data === \"object\" &&\n !Array.isArray(message.data) &&\n message.data?.[\"type\"] === \"tool-result\"\n ) {\n const toolCallId = message.data[\"toolCallId\"];\n const toolContent = res.content.find(\n (c) => c.type === \"tool-call\" && c.toolCallId === toolCallId,\n ) as ToolCallContentPart | undefined;\n if (!toolContent) throw new Error(\"Tool call not found\");\n toolContent.result = message.data[\"result\"];\n }\n }\n\n return res;\n }\n\n default:\n const _unsupported: \"function\" | \"tool\" = firstMessage.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/react\";\nimport { useCachedChunkedMessages } from \"../utils/useCachedChunkedMessages\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useExternalStoreRuntime } from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const messages = useCachedChunkedMessages(chatHelpers.messages);\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) => chatHelpers.setMessages(messages.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 onNewThread: () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n },\n convertMessage,\n adapters: {\n attachments: vercelAttachmentAdapter,\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useRef, useEffect } from \"react\";\nimport {\n ExternalStoreRuntime,\n subscribeToMainThread,\n} from \"@assistant-ui/react\";\nimport { useAssistant, useChat } from \"ai/react\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: ExternalStoreRuntime,\n) => {\n // sync input from vercel to assistant-ui\n const helpersRef = useRef(helpers);\n useEffect(() => {\n helpersRef.current = helpers;\n if (runtime.thread.composer.text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n useEffect(() => {\n return subscribeToMainThread(runtime, () => {\n if (runtime.thread.composer.text !== helpersRef.current.input) {\n helpersRef.current.setInput(runtime.thread.composer.text);\n }\n });\n }, [runtime]);\n};\n","import type { Message } from \"ai\";\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\";\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\";\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 content: [],\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\n content: [],\n };\n },\n async remove() {\n // noop\n },\n};\n","import type { useAssistant } from \"ai/react\";\nimport { useExternalStoreRuntime } from \"@assistant-ui/react\";\nimport { useCachedChunkedMessages } from \"../utils/useCachedChunkedMessages\";\nimport { convertMessage } from \"../utils/convertMessage\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n) => {\n const messages = useCachedChunkedMessages(assistantHelpers.messages);\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 onNewThread: () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n },\n convertMessage,\n adapters: {\n attachments: vercelAttachmentAdapter,\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n"],"mappings":"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","names":["m","useExternalStoreRuntime","useExternalStoreRuntime","messages","useExternalStoreRuntime","useExternalStoreRuntime","getExternalStoreMessage"]}
|
|
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 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\";\nimport { useExternalMessageConverter } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { MessageAttachment } from \"../../../../react/src/context/stores/Attachment\";\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 }) satisfies MessageAttachment,\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/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\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\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 onNewThread: () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n","import { useRef, useEffect } from \"react\";\nimport {\n ExternalStoreRuntime,\n subscribeToMainThread,\n} from \"@assistant-ui/react\";\nimport { useAssistant, useChat } from \"ai/react\";\n\ntype VercelHelpers =\n | ReturnType<typeof useChat>\n | ReturnType<typeof useAssistant>;\n\nexport const useInputSync = (\n helpers: VercelHelpers,\n runtime: ExternalStoreRuntime,\n) => {\n // sync input from vercel to assistant-ui\n const helpersRef = useRef(helpers);\n useEffect(() => {\n helpersRef.current = helpers;\n if (runtime.thread.composer.text !== helpers.input) {\n runtime.thread.composer.setText(helpers.input);\n }\n }, [helpers, runtime]);\n\n // sync input from assistant-ui to vercel\n useEffect(() => {\n return subscribeToMainThread(runtime, () => {\n if (runtime.thread.composer.text !== helpersRef.current.input) {\n helpersRef.current.setInput(runtime.thread.composer.text);\n }\n });\n }, [runtime]);\n};\n","import type { Message } from \"ai\";\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\";\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\";\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 content: [],\n };\n },\n async send(attachment) {\n // noop\n return {\n ...attachment,\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\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n","import type { useAssistant } from \"ai/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\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\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 onNewThread: () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-ai-sdk",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"zustand": "^4.5.5"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
|
-
"@assistant-ui/react": "^0.5.
|
|
31
|
+
"@assistant-ui/react": "^0.5.53",
|
|
32
32
|
"@types/react": "*",
|
|
33
33
|
"ai": "^3.2.x",
|
|
34
34
|
"react": "^18"
|