@assistant-ui/react-ai-sdk 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react-ai-sdk",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  ".": {
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "peerDependencies": {
32
32
  "@ai-sdk/react": "^0.0.x",
33
- "@assistant-ui/react": "^0.1",
33
+ "@assistant-ui/react": "^0.1.3",
34
34
  "@types/react": "*",
35
35
  "ai": "^3.1.x",
36
36
  "react": "^18"
@@ -42,11 +42,12 @@
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "^20.14.2",
45
- "@assistant-ui/react": "0.1.2",
46
- "@assistant-ui/tsconfig": "0.0.0"
45
+ "@assistant-ui/tsconfig": "0.0.0",
46
+ "@assistant-ui/react": "0.1.3"
47
47
  },
48
48
  "publishConfig": {
49
- "access": "public"
49
+ "access": "public",
50
+ "provenance": true
50
51
  },
51
52
  "homepage": "https://assistant-ui.com/",
52
53
  "repository": {
package/dist/index.d.mts DELETED
@@ -1,87 +0,0 @@
1
- import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe, INTERNAL } from '@assistant-ui/react';
2
- import { LanguageModel, Message } from 'ai';
3
- import { ReactNode } from 'react';
4
- import { UseChatHelpers, UseAssistantHelpers } from '@ai-sdk/react';
5
-
6
- declare class VercelModelAdapter implements ChatModelAdapter {
7
- private readonly model;
8
- constructor(model: LanguageModel);
9
- run({ messages, abortSignal, onUpdate }: ChatModelRunOptions): Promise<{
10
- content: AssistantContentPart[];
11
- }>;
12
- }
13
-
14
- type VercelRSCMessage = {
15
- id: string;
16
- role: "user" | "assistant";
17
- display: ReactNode;
18
- createdAt?: Date;
19
- };
20
-
21
- type RSCMessageConverter<T> = {
22
- convertMessage: (message: T) => VercelRSCMessage;
23
- };
24
- type VercelRSCAdapterBase<T> = {
25
- messages: T[];
26
- append: (message: AppendMessage) => Promise<void>;
27
- edit?: (message: AppendMessage) => Promise<void>;
28
- reload?: (parentId: string | null) => Promise<void>;
29
- convertMessage?: (message: T) => VercelRSCMessage;
30
- };
31
- type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
32
-
33
- declare const ProxyConfigProvider$1: typeof INTERNAL.ProxyConfigProvider;
34
- declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider$1 implements AssistantRuntime, ReactThreadRuntime {
35
- adapter: VercelRSCAdapter<T>;
36
- private useAdapter;
37
- private _subscriptions;
38
- isRunning: boolean;
39
- messages: ThreadMessage[];
40
- constructor(adapter: VercelRSCAdapter<T>);
41
- private withRunning;
42
- getBranches(): readonly string[];
43
- switchToBranch(): void;
44
- append(message: AppendMessage): Promise<void>;
45
- startRun(parentId: string | null): Promise<void>;
46
- cancelRun(): void;
47
- subscribe(callback: () => void): Unsubscribe;
48
- onAdapterUpdated(): void;
49
- private updateData;
50
- unstable_synchronizer: () => null;
51
- }
52
-
53
- declare const useVercelRSCRuntime: <T extends WeakKey>(adapter: VercelRSCAdapter<T>) => VercelRSCRuntime<T>;
54
-
55
- declare const getVercelRSCMessage: <T>(message: ThreadMessage) => T | undefined;
56
-
57
- type VercelHelpers = UseChatHelpers | UseAssistantHelpers;
58
-
59
- declare const ProxyConfigProvider: typeof INTERNAL.ProxyConfigProvider;
60
- declare class VercelAIRuntime extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
61
- vercel: VercelHelpers;
62
- private _subscriptions;
63
- private repository;
64
- private assistantOptimisticId;
65
- private useVercel;
66
- messages: ThreadMessage[];
67
- isRunning: boolean;
68
- constructor(vercel: VercelHelpers);
69
- getBranches(messageId: string): string[];
70
- switchToBranch(branchId: string): void;
71
- append(message: AppendMessage): Promise<void>;
72
- startRun(parentId: string | null): Promise<void>;
73
- cancelRun(): void;
74
- subscribe(callback: () => void): Unsubscribe;
75
- private updateVercelMessages;
76
- onVercelUpdated(): void;
77
- private updateData;
78
- unstable_synchronizer: () => null;
79
- }
80
-
81
- declare const useVercelUseChatRuntime: (chatHelpers: UseChatHelpers) => VercelAIRuntime;
82
-
83
- declare const useVercelUseAssistantRuntime: (assistantHelpers: UseAssistantHelpers) => VercelAIRuntime;
84
-
85
- declare const getVercelAIMessage: (message: ThreadMessage) => Message[] | undefined;
86
-
87
- export { type VercelRSCAdapter, type VercelRSCMessage, getVercelAIMessage, getVercelRSCMessage, VercelModelAdapter as unstable_VercelModelAdapter, useVercelRSCRuntime, useVercelUseAssistantRuntime, useVercelUseChatRuntime };
package/dist/index.d.ts DELETED
@@ -1,87 +0,0 @@
1
- import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, AssistantRuntime, ReactThreadRuntime, ThreadMessage, Unsubscribe, INTERNAL } from '@assistant-ui/react';
2
- import { LanguageModel, Message } from 'ai';
3
- import { ReactNode } from 'react';
4
- import { UseChatHelpers, UseAssistantHelpers } from '@ai-sdk/react';
5
-
6
- declare class VercelModelAdapter implements ChatModelAdapter {
7
- private readonly model;
8
- constructor(model: LanguageModel);
9
- run({ messages, abortSignal, onUpdate }: ChatModelRunOptions): Promise<{
10
- content: AssistantContentPart[];
11
- }>;
12
- }
13
-
14
- type VercelRSCMessage = {
15
- id: string;
16
- role: "user" | "assistant";
17
- display: ReactNode;
18
- createdAt?: Date;
19
- };
20
-
21
- type RSCMessageConverter<T> = {
22
- convertMessage: (message: T) => VercelRSCMessage;
23
- };
24
- type VercelRSCAdapterBase<T> = {
25
- messages: T[];
26
- append: (message: AppendMessage) => Promise<void>;
27
- edit?: (message: AppendMessage) => Promise<void>;
28
- reload?: (parentId: string | null) => Promise<void>;
29
- convertMessage?: (message: T) => VercelRSCMessage;
30
- };
31
- type VercelRSCAdapter<T = VercelRSCMessage> = VercelRSCAdapterBase<T> & (T extends VercelRSCMessage ? object : RSCMessageConverter<T>);
32
-
33
- declare const ProxyConfigProvider$1: typeof INTERNAL.ProxyConfigProvider;
34
- declare class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage> extends ProxyConfigProvider$1 implements AssistantRuntime, ReactThreadRuntime {
35
- adapter: VercelRSCAdapter<T>;
36
- private useAdapter;
37
- private _subscriptions;
38
- isRunning: boolean;
39
- messages: ThreadMessage[];
40
- constructor(adapter: VercelRSCAdapter<T>);
41
- private withRunning;
42
- getBranches(): readonly string[];
43
- switchToBranch(): void;
44
- append(message: AppendMessage): Promise<void>;
45
- startRun(parentId: string | null): Promise<void>;
46
- cancelRun(): void;
47
- subscribe(callback: () => void): Unsubscribe;
48
- onAdapterUpdated(): void;
49
- private updateData;
50
- unstable_synchronizer: () => null;
51
- }
52
-
53
- declare const useVercelRSCRuntime: <T extends WeakKey>(adapter: VercelRSCAdapter<T>) => VercelRSCRuntime<T>;
54
-
55
- declare const getVercelRSCMessage: <T>(message: ThreadMessage) => T | undefined;
56
-
57
- type VercelHelpers = UseChatHelpers | UseAssistantHelpers;
58
-
59
- declare const ProxyConfigProvider: typeof INTERNAL.ProxyConfigProvider;
60
- declare class VercelAIRuntime extends ProxyConfigProvider implements AssistantRuntime, ReactThreadRuntime {
61
- vercel: VercelHelpers;
62
- private _subscriptions;
63
- private repository;
64
- private assistantOptimisticId;
65
- private useVercel;
66
- messages: ThreadMessage[];
67
- isRunning: boolean;
68
- constructor(vercel: VercelHelpers);
69
- getBranches(messageId: string): string[];
70
- switchToBranch(branchId: string): void;
71
- append(message: AppendMessage): Promise<void>;
72
- startRun(parentId: string | null): Promise<void>;
73
- cancelRun(): void;
74
- subscribe(callback: () => void): Unsubscribe;
75
- private updateVercelMessages;
76
- onVercelUpdated(): void;
77
- private updateData;
78
- unstable_synchronizer: () => null;
79
- }
80
-
81
- declare const useVercelUseChatRuntime: (chatHelpers: UseChatHelpers) => VercelAIRuntime;
82
-
83
- declare const useVercelUseAssistantRuntime: (assistantHelpers: UseAssistantHelpers) => VercelAIRuntime;
84
-
85
- declare const getVercelAIMessage: (message: ThreadMessage) => Message[] | undefined;
86
-
87
- export { type VercelRSCAdapter, type VercelRSCMessage, getVercelAIMessage, getVercelRSCMessage, VercelModelAdapter as unstable_VercelModelAdapter, useVercelRSCRuntime, useVercelUseAssistantRuntime, useVercelUseChatRuntime };
package/dist/index.js DELETED
@@ -1,499 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
23
- getVercelAIMessage: () => getVercelAIMessage,
24
- getVercelRSCMessage: () => getVercelRSCMessage,
25
- unstable_VercelModelAdapter: () => VercelModelAdapter,
26
- useVercelRSCRuntime: () => useVercelRSCRuntime,
27
- useVercelUseAssistantRuntime: () => useVercelUseAssistantRuntime,
28
- useVercelUseChatRuntime: () => useVercelUseChatRuntime
29
- });
30
- module.exports = __toCommonJS(src_exports);
31
-
32
- // src/core/VercelModelAdapter.tsx
33
- var import_ai = require("ai");
34
- var VercelModelAdapter = class {
35
- constructor(model) {
36
- this.model = model;
37
- }
38
- async run({ messages, abortSignal, onUpdate }) {
39
- const { fullStream } = await (0, import_ai.streamText)({
40
- model: this.model,
41
- abortSignal,
42
- messages: messages.map((m) => ({
43
- role: m.role,
44
- content: m.content.filter((c) => c.type !== "ui")
45
- }))
46
- });
47
- const content = [];
48
- for await (const aiPart of fullStream) {
49
- switch (aiPart.type) {
50
- case "text-delta": {
51
- let part = content.at(-1);
52
- if (!part || part.type !== "text") {
53
- part = { type: "text", text: "" };
54
- content.push(part);
55
- }
56
- part.text += aiPart.textDelta;
57
- break;
58
- }
59
- case "tool-call": {
60
- content.push({
61
- type: "tool-call",
62
- name: aiPart.toolName,
63
- args: aiPart.args
64
- });
65
- break;
66
- }
67
- }
68
- onUpdate({ content });
69
- }
70
- return { content };
71
- }
72
- };
73
-
74
- // src/rsc/useVercelRSCRuntime.tsx
75
- var import_react3 = require("react");
76
-
77
- // src/rsc/VercelRSCRuntime.tsx
78
- var import_react2 = require("@assistant-ui/react");
79
- var import_zustand = require("zustand");
80
-
81
- // src/rsc/useVercelRSCSync.tsx
82
- var import_react = require("react");
83
-
84
- // src/utils/ThreadMessageConverter.ts
85
- var ThreadMessageConverter = class {
86
- cache = /* @__PURE__ */ new WeakMap();
87
- convertMessages(messages, converter, keyMapper = (key) => key) {
88
- return messages.map((m) => {
89
- const key = keyMapper(m);
90
- const cached = this.cache.get(key);
91
- const newMessage = converter(m, cached);
92
- this.cache.set(key, newMessage);
93
- return newMessage;
94
- });
95
- }
96
- };
97
-
98
- // src/rsc/getVercelRSCMessage.tsx
99
- var symbolInnerRSCMessage = Symbol("innerVercelRSCMessage");
100
- var getVercelRSCMessage = (message) => {
101
- return message[symbolInnerRSCMessage];
102
- };
103
-
104
- // src/rsc/useVercelRSCSync.tsx
105
- var vercelToThreadMessage = (converter, rawMessage) => {
106
- const message = converter(rawMessage);
107
- return {
108
- id: message.id,
109
- role: message.role,
110
- content: [{ type: "ui", display: message.display }],
111
- createdAt: message.createdAt ?? /* @__PURE__ */ new Date(),
112
- ...{ status: "done" },
113
- [symbolInnerRSCMessage]: rawMessage
114
- };
115
- };
116
- var useVercelRSCSync = (adapter, updateData) => {
117
- const [converter, convertCallback] = (0, import_react.useMemo)(() => {
118
- const rscConverter = adapter.convertMessage ?? ((m) => m);
119
- const convertCallback2 = (m, cache) => {
120
- if (cache) return cache;
121
- return vercelToThreadMessage(rscConverter, m);
122
- };
123
- return [new ThreadMessageConverter(), convertCallback2];
124
- }, [adapter.convertMessage]);
125
- (0, import_react.useEffect)(() => {
126
- updateData(converter.convertMessages(adapter.messages, convertCallback));
127
- }, [updateData, converter, convertCallback, adapter.messages]);
128
- };
129
-
130
- // src/rsc/VercelRSCRuntime.tsx
131
- var { ProxyConfigProvider } = import_react2.INTERNAL;
132
- var EMPTY_BRANCHES = Object.freeze([]);
133
- var VercelRSCRuntime = class extends ProxyConfigProvider {
134
- constructor(adapter) {
135
- super();
136
- this.adapter = adapter;
137
- this.useAdapter = (0, import_zustand.create)(() => ({
138
- adapter
139
- }));
140
- }
141
- useAdapter;
142
- _subscriptions = /* @__PURE__ */ new Set();
143
- isRunning = false;
144
- messages = [];
145
- withRunning = (callback) => {
146
- this.isRunning = true;
147
- return callback.finally(() => {
148
- this.isRunning = false;
149
- });
150
- };
151
- getBranches() {
152
- return EMPTY_BRANCHES;
153
- }
154
- switchToBranch() {
155
- throw new Error(
156
- "Branch switching is not supported by VercelRSCAssistantProvider."
157
- );
158
- }
159
- async append(message) {
160
- if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {
161
- if (!this.adapter.edit)
162
- throw new Error(
163
- "Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider."
164
- );
165
- await this.withRunning(this.adapter.edit(message));
166
- } else {
167
- await this.withRunning(this.adapter.append(message));
168
- }
169
- }
170
- async startRun(parentId) {
171
- if (!this.adapter.reload)
172
- throw new Error(
173
- "Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider."
174
- );
175
- await this.withRunning(this.adapter.reload(parentId));
176
- }
177
- cancelRun() {
178
- if (process.env["NODE_ENV"] === "development") {
179
- console.warn(
180
- "Run cancellation is not supported by VercelRSCAssistantProvider."
181
- );
182
- }
183
- }
184
- subscribe(callback) {
185
- this._subscriptions.add(callback);
186
- return () => this._subscriptions.delete(callback);
187
- }
188
- onAdapterUpdated() {
189
- if (this.useAdapter.getState().adapter !== this.adapter) {
190
- this.useAdapter.setState({ adapter: this.adapter });
191
- }
192
- }
193
- updateData = (messages) => {
194
- this.messages = messages;
195
- for (const callback of this._subscriptions) callback();
196
- };
197
- unstable_synchronizer = () => {
198
- const { adapter } = this.useAdapter();
199
- useVercelRSCSync(adapter, this.updateData);
200
- return null;
201
- };
202
- };
203
-
204
- // src/rsc/useVercelRSCRuntime.tsx
205
- var useVercelRSCRuntime = (adapter) => {
206
- const [runtime] = (0, import_react3.useState)(() => new VercelRSCRuntime(adapter));
207
- (0, import_react3.useInsertionEffect)(() => {
208
- runtime.adapter = adapter;
209
- });
210
- (0, import_react3.useEffect)(() => {
211
- runtime.onAdapterUpdated();
212
- });
213
- return runtime;
214
- };
215
-
216
- // src/ui/use-chat/useVercelUseChatRuntime.tsx
217
- var import_react7 = require("react");
218
-
219
- // src/ui/VercelAIRuntime.tsx
220
- var import_react6 = require("@assistant-ui/react");
221
- var import_zustand2 = require("zustand");
222
-
223
- // src/ui/getVercelAIMessage.tsx
224
- var symbolInnerAIMessage = Symbol("innerVercelAIUIMessage");
225
- var getVercelAIMessage = (message) => {
226
- return message[symbolInnerAIMessage];
227
- };
228
-
229
- // src/ui/utils/sliceMessagesUntil.tsx
230
- var sliceMessagesUntil = (messages, messageId) => {
231
- if (messageId == null) return [];
232
- let messageIdx = messages.findIndex((m) => m.id === messageId);
233
- if (messageIdx === -1)
234
- throw new Error(
235
- "useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui."
236
- );
237
- while (messages[messageIdx + 1]?.role === "assistant") {
238
- messageIdx++;
239
- }
240
- return messages.slice(0, messageIdx + 1);
241
- };
242
-
243
- // src/ui/utils/useVercelAIComposerSync.tsx
244
- var import_experimental = require("@assistant-ui/react/experimental");
245
- var import_react4 = require("react");
246
- var useVercelAIComposerSync = (vercel) => {
247
- const { useComposer } = (0, import_experimental.useThreadContext)();
248
- (0, import_react4.useEffect)(() => {
249
- useComposer.setState({
250
- value: vercel.input,
251
- setValue: vercel.setInput
252
- });
253
- }, [useComposer, vercel.input, vercel.setInput]);
254
- };
255
-
256
- // src/ui/utils/useVercelAIThreadSync.tsx
257
- var import_react5 = require("react");
258
- var getIsRunning = (vercel) => {
259
- if ("isLoading" in vercel) return vercel.isLoading;
260
- return vercel.status === "in_progress";
261
- };
262
- var vercelToThreadMessage2 = (messages, status) => {
263
- const firstMessage = messages[0];
264
- if (!firstMessage) throw new Error("No messages found");
265
- const common = {
266
- id: firstMessage.id,
267
- createdAt: firstMessage.createdAt ?? /* @__PURE__ */ new Date(),
268
- [symbolInnerAIMessage]: messages
269
- };
270
- switch (firstMessage.role) {
271
- case "user":
272
- if (messages.length > 1) {
273
- throw new Error(
274
- "Multiple user messages found. This is likely an internal bug in assistant-ui."
275
- );
276
- }
277
- return {
278
- ...common,
279
- role: "user",
280
- content: [{ type: "text", text: firstMessage.content }]
281
- };
282
- case "assistant":
283
- return {
284
- ...common,
285
- role: "assistant",
286
- content: messages.flatMap((message) => [
287
- ...message.content ? [{ type: "text", text: message.content }] : [],
288
- ...message.toolInvocations?.map(
289
- (t) => ({
290
- type: "tool-call",
291
- name: t.toolName,
292
- args: t.args,
293
- result: "result" in t ? t.result : void 0
294
- })
295
- ) ?? []
296
- ]),
297
- status
298
- };
299
- default:
300
- throw new Error(
301
- `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`
302
- );
303
- }
304
- };
305
- var hasItems = (messages) => messages.length > 0;
306
- var chunkedMessages = (messages) => {
307
- const chunks = [];
308
- let currentChunk = [];
309
- for (const message of messages) {
310
- if (message.role === "assistant") {
311
- currentChunk.push(message);
312
- } else {
313
- if (hasItems(currentChunk)) {
314
- chunks.push(currentChunk);
315
- currentChunk = [];
316
- }
317
- chunks.push([message]);
318
- }
319
- }
320
- if (hasItems(currentChunk)) {
321
- chunks.push(currentChunk);
322
- }
323
- return chunks;
324
- };
325
- var shallowArrayEqual = (a, b) => {
326
- if (a.length !== b.length) return false;
327
- for (let i = 0; i < a.length; i++) {
328
- if (a[i] !== b[i]) return false;
329
- }
330
- return true;
331
- };
332
- var useVercelAIThreadSync = (vercel, updateData) => {
333
- const isRunning = getIsRunning(vercel);
334
- const converter = (0, import_react5.useMemo)(() => new ThreadMessageConverter(), []);
335
- (0, import_react5.useEffect)(() => {
336
- const lastMessageId = vercel.messages.at(-1)?.id;
337
- const convertCallback = (messages2, cache) => {
338
- const status = lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done";
339
- if (cache && shallowArrayEqual(cache.content, messages2) && (cache.role === "user" || cache.status === status))
340
- return cache;
341
- return vercelToThreadMessage2(messages2, status);
342
- };
343
- const messages = converter.convertMessages(
344
- chunkedMessages(vercel.messages),
345
- convertCallback,
346
- (m) => m[0]
347
- );
348
- updateData(isRunning, messages);
349
- }, [updateData, isRunning, vercel.messages, converter]);
350
- };
351
-
352
- // src/ui/VercelAIRuntime.tsx
353
- var { ProxyConfigProvider: ProxyConfigProvider2, MessageRepository } = import_react6.INTERNAL;
354
- var hasUpcomingMessage = (isRunning, messages) => {
355
- return isRunning && messages[messages.length - 1]?.role !== "assistant";
356
- };
357
- var VercelAIRuntime = class extends ProxyConfigProvider2 {
358
- constructor(vercel) {
359
- super();
360
- this.vercel = vercel;
361
- this.useVercel = (0, import_zustand2.create)(() => ({
362
- vercel
363
- }));
364
- }
365
- _subscriptions = /* @__PURE__ */ new Set();
366
- repository = new MessageRepository();
367
- assistantOptimisticId = null;
368
- useVercel;
369
- messages = [];
370
- isRunning = false;
371
- getBranches(messageId) {
372
- return this.repository.getBranches(messageId);
373
- }
374
- switchToBranch(branchId) {
375
- this.repository.switchToBranch(branchId);
376
- this.updateVercelMessages(this.repository.getMessages());
377
- }
378
- async append(message) {
379
- if (message.content.length !== 1 || message.content[0]?.type !== "text")
380
- throw new Error("Only text content is supported by Vercel AI SDK.");
381
- const newMessages = sliceMessagesUntil(
382
- this.vercel.messages,
383
- message.parentId
384
- );
385
- this.vercel.setMessages(newMessages);
386
- await this.vercel.append({
387
- role: "user",
388
- content: message.content[0].text
389
- });
390
- }
391
- async startRun(parentId) {
392
- const reloadMaybe = "reload" in this.vercel ? this.vercel.reload : void 0;
393
- if (!reloadMaybe)
394
- throw new Error(
395
- "Reload is not supported by Vercel AI SDK's useAssistant."
396
- );
397
- const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);
398
- this.vercel.setMessages(newMessages);
399
- await reloadMaybe();
400
- }
401
- cancelRun() {
402
- const previousMessage = this.vercel.messages.at(-1);
403
- this.vercel.stop();
404
- if (this.assistantOptimisticId) {
405
- this.repository.deleteMessage(this.assistantOptimisticId);
406
- this.assistantOptimisticId = null;
407
- }
408
- let messages = this.repository.getMessages();
409
- if (previousMessage?.role === "user" && previousMessage.id === messages.at(-1)?.id) {
410
- this.vercel.setInput(previousMessage.content);
411
- this.repository.deleteMessage(previousMessage.id);
412
- messages = this.repository.getMessages();
413
- }
414
- setTimeout(() => {
415
- this.updateVercelMessages(messages);
416
- }, 0);
417
- }
418
- subscribe(callback) {
419
- this._subscriptions.add(callback);
420
- return () => this._subscriptions.delete(callback);
421
- }
422
- updateVercelMessages = (messages) => {
423
- this.vercel.setMessages(
424
- messages.flatMap(getVercelAIMessage).filter((m) => m != null)
425
- );
426
- };
427
- onVercelUpdated() {
428
- if (this.useVercel.getState().vercel !== this.vercel) {
429
- this.useVercel.setState({ vercel: this.vercel });
430
- }
431
- }
432
- updateData = (isRunning, vm) => {
433
- for (let i = 0; i < vm.length; i++) {
434
- const message = vm[i];
435
- const parent = vm[i - 1];
436
- this.repository.addOrUpdateMessage(parent?.id ?? null, message);
437
- }
438
- if (this.assistantOptimisticId) {
439
- this.repository.deleteMessage(this.assistantOptimisticId);
440
- this.assistantOptimisticId = null;
441
- }
442
- if (hasUpcomingMessage(isRunning, vm)) {
443
- this.assistantOptimisticId = this.repository.appendOptimisticMessage(
444
- vm.at(-1)?.id ?? null,
445
- {
446
- role: "assistant",
447
- content: [{ type: "text", text: "" }]
448
- }
449
- );
450
- }
451
- this.repository.resetHead(
452
- this.assistantOptimisticId ?? vm.at(-1)?.id ?? null
453
- );
454
- this.messages = this.repository.getMessages();
455
- this.isRunning = isRunning;
456
- for (const callback of this._subscriptions) callback();
457
- };
458
- unstable_synchronizer = () => {
459
- const { vercel } = this.useVercel();
460
- useVercelAIThreadSync(vercel, this.updateData);
461
- useVercelAIComposerSync(vercel);
462
- return null;
463
- };
464
- };
465
-
466
- // src/ui/use-chat/useVercelUseChatRuntime.tsx
467
- var useVercelUseChatRuntime = (chatHelpers) => {
468
- const [runtime] = (0, import_react7.useState)(() => new VercelAIRuntime(chatHelpers));
469
- (0, import_react7.useInsertionEffect)(() => {
470
- runtime.vercel = chatHelpers;
471
- });
472
- (0, import_react7.useEffect)(() => {
473
- runtime.onVercelUpdated();
474
- });
475
- return runtime;
476
- };
477
-
478
- // src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
479
- var import_react8 = require("react");
480
- var useVercelUseAssistantRuntime = (assistantHelpers) => {
481
- const [runtime] = (0, import_react8.useState)(() => new VercelAIRuntime(assistantHelpers));
482
- (0, import_react8.useInsertionEffect)(() => {
483
- runtime.vercel = assistantHelpers;
484
- });
485
- (0, import_react8.useEffect)(() => {
486
- runtime.onVercelUpdated();
487
- });
488
- return runtime;
489
- };
490
- // Annotate the CommonJS export names for ESM import in node:
491
- 0 && (module.exports = {
492
- getVercelAIMessage,
493
- getVercelRSCMessage,
494
- unstable_VercelModelAdapter,
495
- useVercelRSCRuntime,
496
- useVercelUseAssistantRuntime,
497
- useVercelUseChatRuntime
498
- });
499
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/VercelModelAdapter.tsx","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/VercelAIRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["export * from \"./core\";\nexport * from \"./rsc\";\nexport * from \"./ui\";\n","\"use client\";\n\nimport type {\n AssistantContentPart,\n TextContentPart,\n} from \"@assistant-ui/react\";\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport { type LanguageModel, streamText } from \"ai\";\n\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content.filter((c): c is TextContentPart => c.type !== \"ui\"),\n })),\n });\n\n const content: AssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n switch (aiPart.type) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: \"\" };\n content.push(part);\n }\n part.text += aiPart.textDelta;\n break;\n }\n // TODO tool results\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n name: aiPart.toolName,\n args: aiPart.args,\n });\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport type {\n AssistantRuntime,\n ReactThreadRuntime,\n Unsubscribe,\n} from \"@assistant-ui/react\";\n\nimport type { AppendMessage, ThreadMessage } from \"@assistant-ui/react\";\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nconst { ProxyConfigProvider } = INTERNAL;\n\nconst EMPTY_BRANCHES: readonly never[] = Object.freeze([]);\n\nexport class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage>\n extends ProxyConfigProvider\n implements AssistantRuntime, ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n super();\n\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n // in dev mode, log a warning\n if (process.env[\"NODE_ENV\"] === \"development\") {\n console.warn(\n \"Run cancellation is not supported by VercelRSCAssistantProvider.\",\n );\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\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 ?? new Date(),\n ...{ status: \"done\" },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { UseChatHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseChatRuntime = (chatHelpers: UseChatHelpers) => {\n const [runtime] = useState(() => new VercelAIRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import type {\n AssistantRuntime,\n ReactThreadRuntime,\n Unsubscribe,\n} from \"@assistant-ui/react\";\nimport type { AppendMessage, ThreadMessage } from \"@assistant-ui/react\";\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"./getVercelAIMessage\";\nimport type { VercelHelpers } from \"./utils/VercelHelpers\";\nimport { sliceMessagesUntil } from \"./utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"./utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"./utils/useVercelAIThreadSync\";\n\nconst { ProxyConfigProvider, MessageRepository } = INTERNAL;\n\nconst hasUpcomingMessage = (isRunning: boolean, messages: ThreadMessage[]) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelAIRuntime\n extends ProxyConfigProvider\n implements AssistantRuntime, ReactThreadRuntime\n{\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<StoreApi<{ vercel: VercelHelpers }>>;\n\n public messages: ThreadMessage[] = [];\n public isRunning = false;\n\n constructor(public vercel: VercelHelpers) {\n super();\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(messageId: string): string[] {\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this.updateVercelMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"Only text content is supported by Vercel AI SDK.\");\n\n const newMessages = sliceMessagesUntil(\n this.vercel.messages,\n message.parentId,\n );\n this.vercel.setMessages(newMessages);\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const reloadMaybe =\n \"reload\" in this.vercel ? this.vercel.reload : undefined;\n if (!reloadMaybe)\n throw new Error(\n \"Reload is not supported by Vercel AI SDK's useAssistant.\",\n );\n\n const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await reloadMaybe();\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.vercel.setInput(previousMessage.content);\n this.repository.deleteMessage(previousMessage.id);\n\n messages = this.repository.getMessages();\n }\n\n // resync messages\n setTimeout(() => {\n this.updateVercelMessages(messages);\n }, 0);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private updateVercelMessages = (messages: ThreadMessage[]) => {\n this.vercel.setMessages(\n messages\n .flatMap(getVercelAIMessage)\n .filter((m): m is Message => m != null),\n );\n };\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n for (let i = 0; i < vm.length; i++) {\n const message = vm[i]!;\n const parent = vm[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, vm)) {\n this.assistantOptimisticId = this.repository.appendOptimisticMessage(\n vm.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const symbolInnerAIMessage = Symbol(\"innerVercelAIUIMessage\");\n\nexport type VercelAIThreadMessage = ThreadMessage & {\n [symbolInnerAIMessage]?: Message[];\n};\n\nexport const getVercelAIMessage = (message: ThreadMessage) => {\n return (message as VercelAIThreadMessage)[symbolInnerAIMessage];\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 { useThreadContext } from \"@assistant-ui/react/experimental\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\n// two way sync between vercel helpers input state and composer text state\nexport const useVercelAIComposerSync = (vercel: VercelHelpers) => {\n const { useComposer } = useThreadContext();\n\n useEffect(() => {\n useComposer.setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type { TextContentPart, ThreadMessage } from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react/experimental\";\nimport type { Message } from \"ai\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../../utils/ThreadMessageConverter\";\nimport {\n type VercelAIThreadMessage,\n symbolInnerAIMessage,\n} from \"../getVercelAIMessage\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\nconst getIsRunning = (vercel: VercelHelpers) => {\n if (\"isLoading\" in vercel) return vercel.isLoading;\n return vercel.status === \"in_progress\";\n};\n\nconst vercelToThreadMessage = (\n messages: Message[],\n status: \"in_progress\" | \"done\" | \"error\",\n): VercelAIThreadMessage => {\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 [symbolInnerAIMessage]: messages,\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 case \"assistant\":\n return {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n name: t.toolName,\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) as ToolCallContentPart,\n ) ?? []),\n ]),\n status,\n };\n default:\n throw new Error(\n `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`,\n );\n }\n};\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\") {\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\ntype UpdateDataCallback = (isRunning: boolean, vm: ThreadMessage[]) => void;\n\nexport const useVercelAIThreadSync = (\n vercel: VercelHelpers,\n updateData: UpdateDataCallback,\n) => {\n const isRunning = getIsRunning(vercel);\n\n const converter = useMemo(() => new ThreadMessageConverter(), []);\n\n useEffect(() => {\n const lastMessageId = vercel.messages.at(-1)?.id;\n const convertCallback: ConverterCallback<Chunk> = (messages, cache) => {\n const status =\n lastMessageId === messages[0].id && isRunning ? \"in_progress\" : \"done\";\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role === \"user\" || cache.status === status)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: UseAssistantHelpers,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(assistantHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n"],"mappings":"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","names":["import_react","import_react","convertCallback","import_react","import_react","import_zustand","import_react","import_react","vercelToThreadMessage","messages","ProxyConfigProvider","import_react"]}
package/dist/index.mjs DELETED
@@ -1,467 +0,0 @@
1
- // src/core/VercelModelAdapter.tsx
2
- import { streamText } from "ai";
3
- var VercelModelAdapter = class {
4
- constructor(model) {
5
- this.model = model;
6
- }
7
- async run({ messages, abortSignal, onUpdate }) {
8
- const { fullStream } = await streamText({
9
- model: this.model,
10
- abortSignal,
11
- messages: messages.map((m) => ({
12
- role: m.role,
13
- content: m.content.filter((c) => c.type !== "ui")
14
- }))
15
- });
16
- const content = [];
17
- for await (const aiPart of fullStream) {
18
- switch (aiPart.type) {
19
- case "text-delta": {
20
- let part = content.at(-1);
21
- if (!part || part.type !== "text") {
22
- part = { type: "text", text: "" };
23
- content.push(part);
24
- }
25
- part.text += aiPart.textDelta;
26
- break;
27
- }
28
- case "tool-call": {
29
- content.push({
30
- type: "tool-call",
31
- name: aiPart.toolName,
32
- args: aiPart.args
33
- });
34
- break;
35
- }
36
- }
37
- onUpdate({ content });
38
- }
39
- return { content };
40
- }
41
- };
42
-
43
- // src/rsc/useVercelRSCRuntime.tsx
44
- import { useEffect as useEffect2, useInsertionEffect, useState } from "react";
45
-
46
- // src/rsc/VercelRSCRuntime.tsx
47
- import { INTERNAL } from "@assistant-ui/react";
48
- import { create } from "zustand";
49
-
50
- // src/rsc/useVercelRSCSync.tsx
51
- import { useEffect, useMemo } from "react";
52
-
53
- // src/utils/ThreadMessageConverter.ts
54
- var ThreadMessageConverter = class {
55
- cache = /* @__PURE__ */ new WeakMap();
56
- convertMessages(messages, converter, keyMapper = (key) => key) {
57
- return messages.map((m) => {
58
- const key = keyMapper(m);
59
- const cached = this.cache.get(key);
60
- const newMessage = converter(m, cached);
61
- this.cache.set(key, newMessage);
62
- return newMessage;
63
- });
64
- }
65
- };
66
-
67
- // src/rsc/getVercelRSCMessage.tsx
68
- var symbolInnerRSCMessage = Symbol("innerVercelRSCMessage");
69
- var getVercelRSCMessage = (message) => {
70
- return message[symbolInnerRSCMessage];
71
- };
72
-
73
- // src/rsc/useVercelRSCSync.tsx
74
- var vercelToThreadMessage = (converter, rawMessage) => {
75
- const message = converter(rawMessage);
76
- return {
77
- id: message.id,
78
- role: message.role,
79
- content: [{ type: "ui", display: message.display }],
80
- createdAt: message.createdAt ?? /* @__PURE__ */ new Date(),
81
- ...{ status: "done" },
82
- [symbolInnerRSCMessage]: rawMessage
83
- };
84
- };
85
- var useVercelRSCSync = (adapter, updateData) => {
86
- const [converter, convertCallback] = useMemo(() => {
87
- const rscConverter = adapter.convertMessage ?? ((m) => m);
88
- const convertCallback2 = (m, cache) => {
89
- if (cache) return cache;
90
- return vercelToThreadMessage(rscConverter, m);
91
- };
92
- return [new ThreadMessageConverter(), convertCallback2];
93
- }, [adapter.convertMessage]);
94
- useEffect(() => {
95
- updateData(converter.convertMessages(adapter.messages, convertCallback));
96
- }, [updateData, converter, convertCallback, adapter.messages]);
97
- };
98
-
99
- // src/rsc/VercelRSCRuntime.tsx
100
- var { ProxyConfigProvider } = INTERNAL;
101
- var EMPTY_BRANCHES = Object.freeze([]);
102
- var VercelRSCRuntime = class extends ProxyConfigProvider {
103
- constructor(adapter) {
104
- super();
105
- this.adapter = adapter;
106
- this.useAdapter = create(() => ({
107
- adapter
108
- }));
109
- }
110
- useAdapter;
111
- _subscriptions = /* @__PURE__ */ new Set();
112
- isRunning = false;
113
- messages = [];
114
- withRunning = (callback) => {
115
- this.isRunning = true;
116
- return callback.finally(() => {
117
- this.isRunning = false;
118
- });
119
- };
120
- getBranches() {
121
- return EMPTY_BRANCHES;
122
- }
123
- switchToBranch() {
124
- throw new Error(
125
- "Branch switching is not supported by VercelRSCAssistantProvider."
126
- );
127
- }
128
- async append(message) {
129
- if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {
130
- if (!this.adapter.edit)
131
- throw new Error(
132
- "Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider."
133
- );
134
- await this.withRunning(this.adapter.edit(message));
135
- } else {
136
- await this.withRunning(this.adapter.append(message));
137
- }
138
- }
139
- async startRun(parentId) {
140
- if (!this.adapter.reload)
141
- throw new Error(
142
- "Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider."
143
- );
144
- await this.withRunning(this.adapter.reload(parentId));
145
- }
146
- cancelRun() {
147
- if (process.env["NODE_ENV"] === "development") {
148
- console.warn(
149
- "Run cancellation is not supported by VercelRSCAssistantProvider."
150
- );
151
- }
152
- }
153
- subscribe(callback) {
154
- this._subscriptions.add(callback);
155
- return () => this._subscriptions.delete(callback);
156
- }
157
- onAdapterUpdated() {
158
- if (this.useAdapter.getState().adapter !== this.adapter) {
159
- this.useAdapter.setState({ adapter: this.adapter });
160
- }
161
- }
162
- updateData = (messages) => {
163
- this.messages = messages;
164
- for (const callback of this._subscriptions) callback();
165
- };
166
- unstable_synchronizer = () => {
167
- const { adapter } = this.useAdapter();
168
- useVercelRSCSync(adapter, this.updateData);
169
- return null;
170
- };
171
- };
172
-
173
- // src/rsc/useVercelRSCRuntime.tsx
174
- var useVercelRSCRuntime = (adapter) => {
175
- const [runtime] = useState(() => new VercelRSCRuntime(adapter));
176
- useInsertionEffect(() => {
177
- runtime.adapter = adapter;
178
- });
179
- useEffect2(() => {
180
- runtime.onAdapterUpdated();
181
- });
182
- return runtime;
183
- };
184
-
185
- // src/ui/use-chat/useVercelUseChatRuntime.tsx
186
- import { useEffect as useEffect5, useInsertionEffect as useInsertionEffect2, useState as useState2 } from "react";
187
-
188
- // src/ui/VercelAIRuntime.tsx
189
- import { INTERNAL as INTERNAL2 } from "@assistant-ui/react";
190
- import { create as create2 } from "zustand";
191
-
192
- // src/ui/getVercelAIMessage.tsx
193
- var symbolInnerAIMessage = Symbol("innerVercelAIUIMessage");
194
- var getVercelAIMessage = (message) => {
195
- return message[symbolInnerAIMessage];
196
- };
197
-
198
- // src/ui/utils/sliceMessagesUntil.tsx
199
- var sliceMessagesUntil = (messages, messageId) => {
200
- if (messageId == null) return [];
201
- let messageIdx = messages.findIndex((m) => m.id === messageId);
202
- if (messageIdx === -1)
203
- throw new Error(
204
- "useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui."
205
- );
206
- while (messages[messageIdx + 1]?.role === "assistant") {
207
- messageIdx++;
208
- }
209
- return messages.slice(0, messageIdx + 1);
210
- };
211
-
212
- // src/ui/utils/useVercelAIComposerSync.tsx
213
- import { useThreadContext } from "@assistant-ui/react/experimental";
214
- import { useEffect as useEffect3 } from "react";
215
- var useVercelAIComposerSync = (vercel) => {
216
- const { useComposer } = useThreadContext();
217
- useEffect3(() => {
218
- useComposer.setState({
219
- value: vercel.input,
220
- setValue: vercel.setInput
221
- });
222
- }, [useComposer, vercel.input, vercel.setInput]);
223
- };
224
-
225
- // src/ui/utils/useVercelAIThreadSync.tsx
226
- import { useEffect as useEffect4, useMemo as useMemo2 } from "react";
227
- var getIsRunning = (vercel) => {
228
- if ("isLoading" in vercel) return vercel.isLoading;
229
- return vercel.status === "in_progress";
230
- };
231
- var vercelToThreadMessage2 = (messages, status) => {
232
- const firstMessage = messages[0];
233
- if (!firstMessage) throw new Error("No messages found");
234
- const common = {
235
- id: firstMessage.id,
236
- createdAt: firstMessage.createdAt ?? /* @__PURE__ */ new Date(),
237
- [symbolInnerAIMessage]: messages
238
- };
239
- switch (firstMessage.role) {
240
- case "user":
241
- if (messages.length > 1) {
242
- throw new Error(
243
- "Multiple user messages found. This is likely an internal bug in assistant-ui."
244
- );
245
- }
246
- return {
247
- ...common,
248
- role: "user",
249
- content: [{ type: "text", text: firstMessage.content }]
250
- };
251
- case "assistant":
252
- return {
253
- ...common,
254
- role: "assistant",
255
- content: messages.flatMap((message) => [
256
- ...message.content ? [{ type: "text", text: message.content }] : [],
257
- ...message.toolInvocations?.map(
258
- (t) => ({
259
- type: "tool-call",
260
- name: t.toolName,
261
- args: t.args,
262
- result: "result" in t ? t.result : void 0
263
- })
264
- ) ?? []
265
- ]),
266
- status
267
- };
268
- default:
269
- throw new Error(
270
- `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`
271
- );
272
- }
273
- };
274
- var hasItems = (messages) => messages.length > 0;
275
- var chunkedMessages = (messages) => {
276
- const chunks = [];
277
- let currentChunk = [];
278
- for (const message of messages) {
279
- if (message.role === "assistant") {
280
- currentChunk.push(message);
281
- } else {
282
- if (hasItems(currentChunk)) {
283
- chunks.push(currentChunk);
284
- currentChunk = [];
285
- }
286
- chunks.push([message]);
287
- }
288
- }
289
- if (hasItems(currentChunk)) {
290
- chunks.push(currentChunk);
291
- }
292
- return chunks;
293
- };
294
- var shallowArrayEqual = (a, b) => {
295
- if (a.length !== b.length) return false;
296
- for (let i = 0; i < a.length; i++) {
297
- if (a[i] !== b[i]) return false;
298
- }
299
- return true;
300
- };
301
- var useVercelAIThreadSync = (vercel, updateData) => {
302
- const isRunning = getIsRunning(vercel);
303
- const converter = useMemo2(() => new ThreadMessageConverter(), []);
304
- useEffect4(() => {
305
- const lastMessageId = vercel.messages.at(-1)?.id;
306
- const convertCallback = (messages2, cache) => {
307
- const status = lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done";
308
- if (cache && shallowArrayEqual(cache.content, messages2) && (cache.role === "user" || cache.status === status))
309
- return cache;
310
- return vercelToThreadMessage2(messages2, status);
311
- };
312
- const messages = converter.convertMessages(
313
- chunkedMessages(vercel.messages),
314
- convertCallback,
315
- (m) => m[0]
316
- );
317
- updateData(isRunning, messages);
318
- }, [updateData, isRunning, vercel.messages, converter]);
319
- };
320
-
321
- // src/ui/VercelAIRuntime.tsx
322
- var { ProxyConfigProvider: ProxyConfigProvider2, MessageRepository } = INTERNAL2;
323
- var hasUpcomingMessage = (isRunning, messages) => {
324
- return isRunning && messages[messages.length - 1]?.role !== "assistant";
325
- };
326
- var VercelAIRuntime = class extends ProxyConfigProvider2 {
327
- constructor(vercel) {
328
- super();
329
- this.vercel = vercel;
330
- this.useVercel = create2(() => ({
331
- vercel
332
- }));
333
- }
334
- _subscriptions = /* @__PURE__ */ new Set();
335
- repository = new MessageRepository();
336
- assistantOptimisticId = null;
337
- useVercel;
338
- messages = [];
339
- isRunning = false;
340
- getBranches(messageId) {
341
- return this.repository.getBranches(messageId);
342
- }
343
- switchToBranch(branchId) {
344
- this.repository.switchToBranch(branchId);
345
- this.updateVercelMessages(this.repository.getMessages());
346
- }
347
- async append(message) {
348
- if (message.content.length !== 1 || message.content[0]?.type !== "text")
349
- throw new Error("Only text content is supported by Vercel AI SDK.");
350
- const newMessages = sliceMessagesUntil(
351
- this.vercel.messages,
352
- message.parentId
353
- );
354
- this.vercel.setMessages(newMessages);
355
- await this.vercel.append({
356
- role: "user",
357
- content: message.content[0].text
358
- });
359
- }
360
- async startRun(parentId) {
361
- const reloadMaybe = "reload" in this.vercel ? this.vercel.reload : void 0;
362
- if (!reloadMaybe)
363
- throw new Error(
364
- "Reload is not supported by Vercel AI SDK's useAssistant."
365
- );
366
- const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);
367
- this.vercel.setMessages(newMessages);
368
- await reloadMaybe();
369
- }
370
- cancelRun() {
371
- const previousMessage = this.vercel.messages.at(-1);
372
- this.vercel.stop();
373
- if (this.assistantOptimisticId) {
374
- this.repository.deleteMessage(this.assistantOptimisticId);
375
- this.assistantOptimisticId = null;
376
- }
377
- let messages = this.repository.getMessages();
378
- if (previousMessage?.role === "user" && previousMessage.id === messages.at(-1)?.id) {
379
- this.vercel.setInput(previousMessage.content);
380
- this.repository.deleteMessage(previousMessage.id);
381
- messages = this.repository.getMessages();
382
- }
383
- setTimeout(() => {
384
- this.updateVercelMessages(messages);
385
- }, 0);
386
- }
387
- subscribe(callback) {
388
- this._subscriptions.add(callback);
389
- return () => this._subscriptions.delete(callback);
390
- }
391
- updateVercelMessages = (messages) => {
392
- this.vercel.setMessages(
393
- messages.flatMap(getVercelAIMessage).filter((m) => m != null)
394
- );
395
- };
396
- onVercelUpdated() {
397
- if (this.useVercel.getState().vercel !== this.vercel) {
398
- this.useVercel.setState({ vercel: this.vercel });
399
- }
400
- }
401
- updateData = (isRunning, vm) => {
402
- for (let i = 0; i < vm.length; i++) {
403
- const message = vm[i];
404
- const parent = vm[i - 1];
405
- this.repository.addOrUpdateMessage(parent?.id ?? null, message);
406
- }
407
- if (this.assistantOptimisticId) {
408
- this.repository.deleteMessage(this.assistantOptimisticId);
409
- this.assistantOptimisticId = null;
410
- }
411
- if (hasUpcomingMessage(isRunning, vm)) {
412
- this.assistantOptimisticId = this.repository.appendOptimisticMessage(
413
- vm.at(-1)?.id ?? null,
414
- {
415
- role: "assistant",
416
- content: [{ type: "text", text: "" }]
417
- }
418
- );
419
- }
420
- this.repository.resetHead(
421
- this.assistantOptimisticId ?? vm.at(-1)?.id ?? null
422
- );
423
- this.messages = this.repository.getMessages();
424
- this.isRunning = isRunning;
425
- for (const callback of this._subscriptions) callback();
426
- };
427
- unstable_synchronizer = () => {
428
- const { vercel } = this.useVercel();
429
- useVercelAIThreadSync(vercel, this.updateData);
430
- useVercelAIComposerSync(vercel);
431
- return null;
432
- };
433
- };
434
-
435
- // src/ui/use-chat/useVercelUseChatRuntime.tsx
436
- var useVercelUseChatRuntime = (chatHelpers) => {
437
- const [runtime] = useState2(() => new VercelAIRuntime(chatHelpers));
438
- useInsertionEffect2(() => {
439
- runtime.vercel = chatHelpers;
440
- });
441
- useEffect5(() => {
442
- runtime.onVercelUpdated();
443
- });
444
- return runtime;
445
- };
446
-
447
- // src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
448
- import { useEffect as useEffect6, useInsertionEffect as useInsertionEffect3, useState as useState3 } from "react";
449
- var useVercelUseAssistantRuntime = (assistantHelpers) => {
450
- const [runtime] = useState3(() => new VercelAIRuntime(assistantHelpers));
451
- useInsertionEffect3(() => {
452
- runtime.vercel = assistantHelpers;
453
- });
454
- useEffect6(() => {
455
- runtime.onVercelUpdated();
456
- });
457
- return runtime;
458
- };
459
- export {
460
- getVercelAIMessage,
461
- getVercelRSCMessage,
462
- VercelModelAdapter as unstable_VercelModelAdapter,
463
- useVercelRSCRuntime,
464
- useVercelUseAssistantRuntime,
465
- useVercelUseChatRuntime
466
- };
467
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/VercelModelAdapter.tsx","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/VercelAIRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n AssistantContentPart,\n TextContentPart,\n} from \"@assistant-ui/react\";\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport { type LanguageModel, streamText } from \"ai\";\n\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content.filter((c): c is TextContentPart => c.type !== \"ui\"),\n })),\n });\n\n const content: AssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n switch (aiPart.type) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: \"\" };\n content.push(part);\n }\n part.text += aiPart.textDelta;\n break;\n }\n // TODO tool results\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n name: aiPart.toolName,\n args: aiPart.args,\n });\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport type {\n AssistantRuntime,\n ReactThreadRuntime,\n Unsubscribe,\n} from \"@assistant-ui/react\";\n\nimport type { AppendMessage, ThreadMessage } from \"@assistant-ui/react\";\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nconst { ProxyConfigProvider } = INTERNAL;\n\nconst EMPTY_BRANCHES: readonly never[] = Object.freeze([]);\n\nexport class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage>\n extends ProxyConfigProvider\n implements AssistantRuntime, ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n super();\n\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n // in dev mode, log a warning\n if (process.env[\"NODE_ENV\"] === \"development\") {\n console.warn(\n \"Run cancellation is not supported by VercelRSCAssistantProvider.\",\n );\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\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 ?? new Date(),\n ...{ status: \"done\" },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { UseChatHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseChatRuntime = (chatHelpers: UseChatHelpers) => {\n const [runtime] = useState(() => new VercelAIRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import type {\n AssistantRuntime,\n ReactThreadRuntime,\n Unsubscribe,\n} from \"@assistant-ui/react\";\nimport type { AppendMessage, ThreadMessage } from \"@assistant-ui/react\";\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"./getVercelAIMessage\";\nimport type { VercelHelpers } from \"./utils/VercelHelpers\";\nimport { sliceMessagesUntil } from \"./utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"./utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"./utils/useVercelAIThreadSync\";\n\nconst { ProxyConfigProvider, MessageRepository } = INTERNAL;\n\nconst hasUpcomingMessage = (isRunning: boolean, messages: ThreadMessage[]) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelAIRuntime\n extends ProxyConfigProvider\n implements AssistantRuntime, ReactThreadRuntime\n{\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<StoreApi<{ vercel: VercelHelpers }>>;\n\n public messages: ThreadMessage[] = [];\n public isRunning = false;\n\n constructor(public vercel: VercelHelpers) {\n super();\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(messageId: string): string[] {\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this.updateVercelMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"Only text content is supported by Vercel AI SDK.\");\n\n const newMessages = sliceMessagesUntil(\n this.vercel.messages,\n message.parentId,\n );\n this.vercel.setMessages(newMessages);\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const reloadMaybe =\n \"reload\" in this.vercel ? this.vercel.reload : undefined;\n if (!reloadMaybe)\n throw new Error(\n \"Reload is not supported by Vercel AI SDK's useAssistant.\",\n );\n\n const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await reloadMaybe();\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.vercel.setInput(previousMessage.content);\n this.repository.deleteMessage(previousMessage.id);\n\n messages = this.repository.getMessages();\n }\n\n // resync messages\n setTimeout(() => {\n this.updateVercelMessages(messages);\n }, 0);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private updateVercelMessages = (messages: ThreadMessage[]) => {\n this.vercel.setMessages(\n messages\n .flatMap(getVercelAIMessage)\n .filter((m): m is Message => m != null),\n );\n };\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n for (let i = 0; i < vm.length; i++) {\n const message = vm[i]!;\n const parent = vm[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, vm)) {\n this.assistantOptimisticId = this.repository.appendOptimisticMessage(\n vm.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const symbolInnerAIMessage = Symbol(\"innerVercelAIUIMessage\");\n\nexport type VercelAIThreadMessage = ThreadMessage & {\n [symbolInnerAIMessage]?: Message[];\n};\n\nexport const getVercelAIMessage = (message: ThreadMessage) => {\n return (message as VercelAIThreadMessage)[symbolInnerAIMessage];\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 { useThreadContext } from \"@assistant-ui/react/experimental\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\n// two way sync between vercel helpers input state and composer text state\nexport const useVercelAIComposerSync = (vercel: VercelHelpers) => {\n const { useComposer } = useThreadContext();\n\n useEffect(() => {\n useComposer.setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type { TextContentPart, ThreadMessage } from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react/experimental\";\nimport type { Message } from \"ai\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../../utils/ThreadMessageConverter\";\nimport {\n type VercelAIThreadMessage,\n symbolInnerAIMessage,\n} from \"../getVercelAIMessage\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\nconst getIsRunning = (vercel: VercelHelpers) => {\n if (\"isLoading\" in vercel) return vercel.isLoading;\n return vercel.status === \"in_progress\";\n};\n\nconst vercelToThreadMessage = (\n messages: Message[],\n status: \"in_progress\" | \"done\" | \"error\",\n): VercelAIThreadMessage => {\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 [symbolInnerAIMessage]: messages,\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 case \"assistant\":\n return {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n name: t.toolName,\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) as ToolCallContentPart,\n ) ?? []),\n ]),\n status,\n };\n default:\n throw new Error(\n `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`,\n );\n }\n};\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\") {\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\ntype UpdateDataCallback = (isRunning: boolean, vm: ThreadMessage[]) => void;\n\nexport const useVercelAIThreadSync = (\n vercel: VercelHelpers,\n updateData: UpdateDataCallback,\n) => {\n const isRunning = getIsRunning(vercel);\n\n const converter = useMemo(() => new ThreadMessageConverter(), []);\n\n useEffect(() => {\n const lastMessageId = vercel.messages.at(-1)?.id;\n const convertCallback: ConverterCallback<Chunk> = (messages, cache) => {\n const status =\n lastMessageId === messages[0].id && isRunning ? \"in_progress\" : \"done\";\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role === \"user\" || cache.status === status)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: UseAssistantHelpers,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(assistantHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n"],"mappings":"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","names":["useEffect","convertCallback","useEffect","useEffect","useInsertionEffect","useState","INTERNAL","create","useEffect","useEffect","useMemo","vercelToThreadMessage","useMemo","useEffect","messages","ProxyConfigProvider","INTERNAL","create","useState","useInsertionEffect","useEffect","useEffect","useInsertionEffect","useState","useState","useInsertionEffect","useEffect"]}