@assistant-ui/react-ai-sdk 0.5.10 → 0.5.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import * as _assistant_ui_react from '@assistant-ui/react';
|
|
2
|
-
import { AppendMessage, ThreadMessage, ReactThreadRuntime, Unsubscribe, AddToolResultOptions, ModelConfigProvider } from '@assistant-ui/react';
|
|
2
|
+
import { AppendMessage, ThreadMessage, ReactThreadRuntime, Unsubscribe, AddToolResultOptions, ModelConfigProvider, INTERNAL } from '@assistant-ui/react';
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
4
|
import { useChat, useAssistant } from 'ai/react';
|
|
5
|
-
import { BaseAssistantRuntime } from '@assistant-ui/react/internal';
|
|
6
5
|
import { Message } from 'ai';
|
|
7
6
|
|
|
8
7
|
type VercelRSCMessage = {
|
|
@@ -71,7 +70,8 @@ declare class VercelUseChatThreadRuntime implements ReactThreadRuntime {
|
|
|
71
70
|
addToolResult({ toolCallId, result }: AddToolResultOptions): void;
|
|
72
71
|
}
|
|
73
72
|
|
|
74
|
-
declare
|
|
73
|
+
declare const BaseAssistantRuntime$1: typeof INTERNAL.BaseAssistantRuntime;
|
|
74
|
+
declare class VercelUseChatRuntime extends BaseAssistantRuntime$1<VercelUseChatThreadRuntime> {
|
|
75
75
|
private readonly _proxyConfigProvider;
|
|
76
76
|
constructor(vercel: ReturnType<typeof useChat>);
|
|
77
77
|
set vercel(vercel: ReturnType<typeof useChat>);
|
|
@@ -110,6 +110,7 @@ declare class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {
|
|
|
110
110
|
addToolResult(): void;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
+
declare const BaseAssistantRuntime: typeof INTERNAL.BaseAssistantRuntime;
|
|
113
114
|
declare class VercelUseAssistantRuntime extends BaseAssistantRuntime<VercelUseAssistantThreadRuntime> {
|
|
114
115
|
private readonly _proxyConfigProvider;
|
|
115
116
|
constructor(vercel: ReturnType<typeof useAssistant>);
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import * as _assistant_ui_react from '@assistant-ui/react';
|
|
2
|
-
import { AppendMessage, ThreadMessage, ReactThreadRuntime, Unsubscribe, AddToolResultOptions, ModelConfigProvider } from '@assistant-ui/react';
|
|
2
|
+
import { AppendMessage, ThreadMessage, ReactThreadRuntime, Unsubscribe, AddToolResultOptions, ModelConfigProvider, INTERNAL } from '@assistant-ui/react';
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
4
|
import { useChat, useAssistant } from 'ai/react';
|
|
5
|
-
import { BaseAssistantRuntime } from '@assistant-ui/react/internal';
|
|
6
5
|
import { Message } from 'ai';
|
|
7
6
|
|
|
8
7
|
type VercelRSCMessage = {
|
|
@@ -71,7 +70,8 @@ declare class VercelUseChatThreadRuntime implements ReactThreadRuntime {
|
|
|
71
70
|
addToolResult({ toolCallId, result }: AddToolResultOptions): void;
|
|
72
71
|
}
|
|
73
72
|
|
|
74
|
-
declare
|
|
73
|
+
declare const BaseAssistantRuntime$1: typeof INTERNAL.BaseAssistantRuntime;
|
|
74
|
+
declare class VercelUseChatRuntime extends BaseAssistantRuntime$1<VercelUseChatThreadRuntime> {
|
|
75
75
|
private readonly _proxyConfigProvider;
|
|
76
76
|
constructor(vercel: ReturnType<typeof useChat>);
|
|
77
77
|
set vercel(vercel: ReturnType<typeof useChat>);
|
|
@@ -110,6 +110,7 @@ declare class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {
|
|
|
110
110
|
addToolResult(): void;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
+
declare const BaseAssistantRuntime: typeof INTERNAL.BaseAssistantRuntime;
|
|
113
114
|
declare class VercelUseAssistantRuntime extends BaseAssistantRuntime<VercelUseAssistantThreadRuntime> {
|
|
114
115
|
private readonly _proxyConfigProvider;
|
|
115
116
|
constructor(vercel: ReturnType<typeof useAssistant>);
|
package/dist/index.js
CHANGED
|
@@ -67,13 +67,13 @@ var getVercelRSCMessage = (message) => {
|
|
|
67
67
|
};
|
|
68
68
|
|
|
69
69
|
// src/ui/use-chat/useVercelUseChatRuntime.tsx
|
|
70
|
-
var
|
|
70
|
+
var import_react8 = require("react");
|
|
71
71
|
|
|
72
72
|
// src/ui/use-chat/VercelUseChatRuntime.tsx
|
|
73
|
-
var
|
|
73
|
+
var import_react7 = require("@assistant-ui/react");
|
|
74
74
|
|
|
75
75
|
// src/ui/use-chat/VercelUseChatThreadRuntime.tsx
|
|
76
|
-
var
|
|
76
|
+
var import_react6 = require("@assistant-ui/react");
|
|
77
77
|
var import_zustand = require("zustand");
|
|
78
78
|
|
|
79
79
|
// src/ui/getVercelAIMessage.tsx
|
|
@@ -252,6 +252,7 @@ var useVercelAIThreadSync = (vercel, updateData) => {
|
|
|
252
252
|
};
|
|
253
253
|
|
|
254
254
|
// src/ui/use-chat/VercelUseChatThreadRuntime.tsx
|
|
255
|
+
var { MessageRepository } = import_react6.INTERNAL;
|
|
255
256
|
var hasUpcomingMessage = (isRunning, messages) => {
|
|
256
257
|
return isRunning && messages[messages.length - 1]?.role !== "assistant";
|
|
257
258
|
};
|
|
@@ -270,7 +271,7 @@ var VercelUseChatThreadRuntime = class {
|
|
|
270
271
|
}));
|
|
271
272
|
}
|
|
272
273
|
_subscriptions = /* @__PURE__ */ new Set();
|
|
273
|
-
repository = new
|
|
274
|
+
repository = new MessageRepository();
|
|
274
275
|
assistantOptimisticId = null;
|
|
275
276
|
useVercel;
|
|
276
277
|
capabilities = CAPABILITIES;
|
|
@@ -377,8 +378,9 @@ var VercelUseChatThreadRuntime = class {
|
|
|
377
378
|
};
|
|
378
379
|
|
|
379
380
|
// src/ui/use-chat/VercelUseChatRuntime.tsx
|
|
380
|
-
var
|
|
381
|
-
|
|
381
|
+
var { ProxyConfigProvider, BaseAssistantRuntime } = import_react7.INTERNAL;
|
|
382
|
+
var VercelUseChatRuntime = class extends BaseAssistantRuntime {
|
|
383
|
+
_proxyConfigProvider = new ProxyConfigProvider();
|
|
382
384
|
constructor(vercel) {
|
|
383
385
|
super(new VercelUseChatThreadRuntime(vercel));
|
|
384
386
|
}
|
|
@@ -410,21 +412,21 @@ var VercelUseChatRuntime = class extends import_internal2.BaseAssistantRuntime {
|
|
|
410
412
|
|
|
411
413
|
// src/ui/use-chat/useVercelUseChatRuntime.tsx
|
|
412
414
|
var useVercelUseChatRuntime = (chatHelpers) => {
|
|
413
|
-
const [runtime] = (0,
|
|
414
|
-
(0,
|
|
415
|
+
const [runtime] = (0, import_react8.useState)(() => new VercelUseChatRuntime(chatHelpers));
|
|
416
|
+
(0, import_react8.useInsertionEffect)(() => {
|
|
415
417
|
runtime.vercel = chatHelpers;
|
|
416
418
|
});
|
|
417
|
-
(0,
|
|
419
|
+
(0, import_react8.useEffect)(() => {
|
|
418
420
|
runtime.onVercelUpdated();
|
|
419
421
|
});
|
|
420
422
|
return runtime;
|
|
421
423
|
};
|
|
422
424
|
|
|
423
425
|
// src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
|
|
424
|
-
var
|
|
426
|
+
var import_react10 = require("react");
|
|
425
427
|
|
|
426
428
|
// src/ui/use-assistant/VercelUseAssistantRuntime.tsx
|
|
427
|
-
var
|
|
429
|
+
var import_react9 = require("@assistant-ui/react");
|
|
428
430
|
|
|
429
431
|
// src/ui/use-assistant/VercelUseAssistantThreadRuntime.tsx
|
|
430
432
|
var import_zustand2 = require("zustand");
|
|
@@ -520,11 +522,12 @@ var VercelUseAssistantThreadRuntime = class {
|
|
|
520
522
|
};
|
|
521
523
|
|
|
522
524
|
// src/ui/use-assistant/VercelUseAssistantRuntime.tsx
|
|
525
|
+
var { ProxyConfigProvider: ProxyConfigProvider2, BaseAssistantRuntime: BaseAssistantRuntime2 } = import_react9.INTERNAL;
|
|
523
526
|
var hasUpcomingMessage2 = (isRunning, messages) => {
|
|
524
527
|
return isRunning && messages[messages.length - 1]?.role !== "assistant";
|
|
525
528
|
};
|
|
526
|
-
var VercelUseAssistantRuntime = class extends
|
|
527
|
-
_proxyConfigProvider = new
|
|
529
|
+
var VercelUseAssistantRuntime = class extends BaseAssistantRuntime2 {
|
|
530
|
+
_proxyConfigProvider = new ProxyConfigProvider2();
|
|
528
531
|
constructor(vercel) {
|
|
529
532
|
super(new VercelUseAssistantThreadRuntime(vercel));
|
|
530
533
|
}
|
|
@@ -554,13 +557,13 @@ var VercelUseAssistantRuntime = class extends import_internal3.BaseAssistantRunt
|
|
|
554
557
|
|
|
555
558
|
// src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
|
|
556
559
|
var useVercelUseAssistantRuntime = (assistantHelpers) => {
|
|
557
|
-
const [runtime] = (0,
|
|
560
|
+
const [runtime] = (0, import_react10.useState)(
|
|
558
561
|
() => new VercelUseAssistantRuntime(assistantHelpers)
|
|
559
562
|
);
|
|
560
|
-
(0,
|
|
563
|
+
(0, import_react10.useInsertionEffect)(() => {
|
|
561
564
|
runtime.vercel = assistantHelpers;
|
|
562
565
|
});
|
|
563
|
-
(0,
|
|
566
|
+
(0, import_react10.useEffect)(() => {
|
|
564
567
|
runtime.onVercelUpdated();
|
|
565
568
|
});
|
|
566
569
|
return runtime;
|
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/use-chat/useVercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatThreadRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantThreadRuntime.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 onCopy: null,\n convertMessage: (m: T) =>\n vercelToThreadMessage(\n adapter.convertMessage ?? ((m) => m as VercelRSCMessage),\n m,\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 type { useChat } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseChatRuntime } from \"./VercelUseChatRuntime\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const [runtime] = useState(() => new VercelUseChatRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import {\n ProxyConfigProvider,\n BaseAssistantRuntime,\n} from \"@assistant-ui/react/internal\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport { useChat } from \"ai/react\";\nimport { VercelUseChatThreadRuntime } from \"./VercelUseChatThreadRuntime\";\n\nexport class VercelUseChatRuntime extends BaseAssistantRuntime<VercelUseChatThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: ReturnType<typeof useChat>) {\n super(new VercelUseChatThreadRuntime(vercel));\n }\n\n public set vercel(vercel: ReturnType<typeof useChat>) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\n \"VercelAIRuntime does not yet support switching threads.\",\n );\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelUseChatThreadRuntime(this.thread.vercel);\n }\n}\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n AddToolResultOptions,\n} from \"@assistant-ui/react\";\nimport { MessageRepository } from \"@assistant-ui/react/internal\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { useChat } from \"ai/react\";\nimport { getVercelAIMessage } from \"../getVercelAIMessage\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nconst CAPABILITIES = Object.freeze({\n switchToBranch: true,\n edit: true,\n reload: true,\n cancel: true,\n copy: true,\n});\n\nexport class VercelUseChatThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<\n StoreApi<{ vercel: ReturnType<typeof useChat> }>\n >;\n\n public readonly capabilities = CAPABILITIES;\n\n public messages: ThreadMessage[] = [];\n public readonly isDisabled = false;\n public isRunning = false;\n\n constructor(public vercel: ReturnType<typeof useChat>) {\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.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseChatRuntime. This is likely an internal bug in assistant-ui.\",\n );\n\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime. Use the Edge runtime for image support.\",\n );\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 newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await this.vercel.reload();\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: [],\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 addToolResult({ toolCallId, result }: AddToolResultOptions) {\n this.vercel.addToolResult({ toolCallId, result });\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, ComposerState } from \"@assistant-ui/react\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\nimport { StoreApi } from \"zustand\";\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 as unknown as StoreApi<ComposerState>).setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type {\n TextContentPart,\n ThreadMessage,\n ToolCallContentPart,\n MessageStatus,\n ThreadAssistantMessage,\n} from \"@assistant-ui/react\";\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: MessageStatus,\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\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: ThreadAssistantMessage = {\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 status,\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\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\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: MessageStatus =\n lastMessageId === messages[0].id && isRunning\n ? {\n type: \"running\",\n }\n : {\n type: \"complete\",\n reason: \"unknown\",\n };\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role !== \"assistant\" || cache.status.type === status.type)\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 { 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 { useAssistant } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseAssistantRuntime } from \"./VercelUseAssistantRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n) => {\n const [runtime] = useState(\n () => new VercelUseAssistantRuntime(assistantHelpers),\n );\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import { type ThreadMessage, ModelConfigProvider } from \"@assistant-ui/react\";\nimport { useAssistant } from \"ai/react\";\nimport {\n ProxyConfigProvider,\n BaseAssistantRuntime,\n} from \"@assistant-ui/react/internal\";\nimport { VercelUseAssistantThreadRuntime } from \"./VercelUseAssistantThreadRuntime\";\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelUseAssistantRuntime extends BaseAssistantRuntime<VercelUseAssistantThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: ReturnType<typeof useAssistant>) {\n super(new VercelUseAssistantThreadRuntime(vercel));\n }\n\n public set vercel(vercel: ReturnType<typeof useAssistant>) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\"VercelAIRuntime does not yet support switching threads\");\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelUseAssistantThreadRuntime(this.thread.vercel);\n }\n}\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\nimport { useAssistant } from \"ai/react\";\nimport { hasUpcomingMessage } from \"./VercelUseAssistantRuntime\";\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nconst CAPABILITIES = Object.freeze({\n switchToBranch: false,\n edit: false,\n reload: false,\n cancel: false,\n copy: true,\n});\n\nexport class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n\n public readonly capabilities = CAPABILITIES;\n\n private useVercel: UseBoundStore<\n StoreApi<{ vercel: ReturnType<typeof useAssistant> }>\n >;\n\n public messages: readonly ThreadMessage[] = [];\n public readonly isDisabled = false;\n public isRunning = false;\n\n constructor(public vercel: ReturnType<typeof useAssistant>) {\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"VercelUseAssistantRuntime does not support switching branches.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseAssistantRuntime. This is likely an internal bug in assistant-ui.\",\n );\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"VercelUseAssistantRuntime only supports text content.\");\n\n if (message.parentId !== (this.messages.at(-1)?.id ?? null))\n throw new Error(\n \"VercelUseAssistantRuntime does not support editing messages.\",\n );\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(): Promise<void> {\n throw new Error(\"VercelUseAssistantRuntime does not support reloading.\");\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n if (previousMessage?.role === \"user\") {\n this.vercel.setInput(previousMessage.content);\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\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 if (hasUpcomingMessage(isRunning, vm)) {\n vm.push({\n id: \"__optimistic__result\",\n createdAt: new Date(),\n status: { type: \"running\" },\n role: \"assistant\",\n content: [],\n });\n }\n\n this.messages = vm;\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 addToolResult() {\n throw new Error(\n \"VercelUseAssistantRuntime does not support adding tool results.\",\n );\n }\n}\n"],"mappings":"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","names":["m","import_react","import_react","import_internal","import_react","import_react","vercelToThreadMessage","messages","import_react","import_internal","import_zustand","CAPABILITIES","hasUpcomingMessage","hasUpcomingMessage"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatThreadRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantThreadRuntime.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 onCopy: null,\n convertMessage: (m: T) =>\n vercelToThreadMessage(\n adapter.convertMessage ?? ((m) => m as VercelRSCMessage),\n m,\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 type { useChat } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseChatRuntime } from \"./VercelUseChatRuntime\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const [runtime] = useState(() => new VercelUseChatRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import { INTERNAL, ModelConfigProvider } from \"@assistant-ui/react\";\nimport { useChat } from \"ai/react\";\nimport { VercelUseChatThreadRuntime } from \"./VercelUseChatThreadRuntime\";\n\nconst { ProxyConfigProvider, BaseAssistantRuntime } = INTERNAL;\n\nexport class VercelUseChatRuntime extends BaseAssistantRuntime<VercelUseChatThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: ReturnType<typeof useChat>) {\n super(new VercelUseChatThreadRuntime(vercel));\n }\n\n public set vercel(vercel: ReturnType<typeof useChat>) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\n \"VercelAIRuntime does not yet support switching threads.\",\n );\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelUseChatThreadRuntime(this.thread.vercel);\n }\n}\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n AddToolResultOptions,\n INTERNAL,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { useChat } from \"ai/react\";\nimport { getVercelAIMessage } from \"../getVercelAIMessage\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\n\nconst { MessageRepository } = INTERNAL;\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nconst CAPABILITIES = Object.freeze({\n switchToBranch: true,\n edit: true,\n reload: true,\n cancel: true,\n copy: true,\n});\n\nexport class VercelUseChatThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<\n StoreApi<{ vercel: ReturnType<typeof useChat> }>\n >;\n\n public readonly capabilities = CAPABILITIES;\n\n public messages: ThreadMessage[] = [];\n public readonly isDisabled = false;\n public isRunning = false;\n\n constructor(public vercel: ReturnType<typeof useChat>) {\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.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseChatRuntime. This is likely an internal bug in assistant-ui.\",\n );\n\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime. Use the Edge runtime for image support.\",\n );\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 newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await this.vercel.reload();\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: [],\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 addToolResult({ toolCallId, result }: AddToolResultOptions) {\n this.vercel.addToolResult({ toolCallId, result });\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, ComposerState } from \"@assistant-ui/react\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\nimport { StoreApi } from \"zustand\";\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 as unknown as StoreApi<ComposerState>).setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type {\n TextContentPart,\n ThreadMessage,\n ToolCallContentPart,\n MessageStatus,\n ThreadAssistantMessage,\n} from \"@assistant-ui/react\";\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: MessageStatus,\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\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: ThreadAssistantMessage = {\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 status,\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\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\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: MessageStatus =\n lastMessageId === messages[0].id && isRunning\n ? {\n type: \"running\",\n }\n : {\n type: \"complete\",\n reason: \"unknown\",\n };\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role !== \"assistant\" || cache.status.type === status.type)\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 { 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 { useAssistant } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseAssistantRuntime } from \"./VercelUseAssistantRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n) => {\n const [runtime] = useState(\n () => new VercelUseAssistantRuntime(assistantHelpers),\n );\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import {\n type ThreadMessage,\n INTERNAL,\n ModelConfigProvider,\n} from \"@assistant-ui/react\";\nimport { useAssistant } from \"ai/react\";\nimport { VercelUseAssistantThreadRuntime } from \"./VercelUseAssistantThreadRuntime\";\n\nconst { ProxyConfigProvider, BaseAssistantRuntime } = INTERNAL;\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelUseAssistantRuntime extends BaseAssistantRuntime<VercelUseAssistantThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: ReturnType<typeof useAssistant>) {\n super(new VercelUseAssistantThreadRuntime(vercel));\n }\n\n public set vercel(vercel: ReturnType<typeof useAssistant>) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\"VercelAIRuntime does not yet support switching threads\");\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelUseAssistantThreadRuntime(this.thread.vercel);\n }\n}\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\nimport { useAssistant } from \"ai/react\";\nimport { hasUpcomingMessage } from \"./VercelUseAssistantRuntime\";\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nconst CAPABILITIES = Object.freeze({\n switchToBranch: false,\n edit: false,\n reload: false,\n cancel: false,\n copy: true,\n});\n\nexport class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n\n public readonly capabilities = CAPABILITIES;\n\n private useVercel: UseBoundStore<\n StoreApi<{ vercel: ReturnType<typeof useAssistant> }>\n >;\n\n public messages: readonly ThreadMessage[] = [];\n public readonly isDisabled = false;\n public isRunning = false;\n\n constructor(public vercel: ReturnType<typeof useAssistant>) {\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"VercelUseAssistantRuntime does not support switching branches.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseAssistantRuntime. This is likely an internal bug in assistant-ui.\",\n );\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"VercelUseAssistantRuntime only supports text content.\");\n\n if (message.parentId !== (this.messages.at(-1)?.id ?? null))\n throw new Error(\n \"VercelUseAssistantRuntime does not support editing messages.\",\n );\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(): Promise<void> {\n throw new Error(\"VercelUseAssistantRuntime does not support reloading.\");\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n if (previousMessage?.role === \"user\") {\n this.vercel.setInput(previousMessage.content);\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\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 if (hasUpcomingMessage(isRunning, vm)) {\n vm.push({\n id: \"__optimistic__result\",\n createdAt: new Date(),\n status: { type: \"running\" },\n role: \"assistant\",\n content: [],\n });\n }\n\n this.messages = vm;\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 addToolResult() {\n throw new Error(\n \"VercelUseAssistantRuntime does not support adding tool results.\",\n );\n }\n}\n"],"mappings":"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","names":["m","import_react","import_react","import_react","import_react","import_react","import_react","vercelToThreadMessage","messages","import_react","import_react","import_zustand","CAPABILITIES","hasUpcomingMessage","ProxyConfigProvider","BaseAssistantRuntime","hasUpcomingMessage"]}
|
package/dist/index.mjs
CHANGED
|
@@ -44,13 +44,12 @@ var getVercelRSCMessage = (message) => {
|
|
|
44
44
|
import { useEffect as useEffect3, useInsertionEffect, useState } from "react";
|
|
45
45
|
|
|
46
46
|
// src/ui/use-chat/VercelUseChatRuntime.tsx
|
|
47
|
-
import {
|
|
48
|
-
ProxyConfigProvider,
|
|
49
|
-
BaseAssistantRuntime
|
|
50
|
-
} from "@assistant-ui/react/internal";
|
|
47
|
+
import { INTERNAL as INTERNAL2 } from "@assistant-ui/react";
|
|
51
48
|
|
|
52
49
|
// src/ui/use-chat/VercelUseChatThreadRuntime.tsx
|
|
53
|
-
import {
|
|
50
|
+
import {
|
|
51
|
+
INTERNAL
|
|
52
|
+
} from "@assistant-ui/react";
|
|
54
53
|
import { create } from "zustand";
|
|
55
54
|
|
|
56
55
|
// src/ui/getVercelAIMessage.tsx
|
|
@@ -229,6 +228,7 @@ var useVercelAIThreadSync = (vercel, updateData) => {
|
|
|
229
228
|
};
|
|
230
229
|
|
|
231
230
|
// src/ui/use-chat/VercelUseChatThreadRuntime.tsx
|
|
231
|
+
var { MessageRepository } = INTERNAL;
|
|
232
232
|
var hasUpcomingMessage = (isRunning, messages) => {
|
|
233
233
|
return isRunning && messages[messages.length - 1]?.role !== "assistant";
|
|
234
234
|
};
|
|
@@ -354,6 +354,7 @@ var VercelUseChatThreadRuntime = class {
|
|
|
354
354
|
};
|
|
355
355
|
|
|
356
356
|
// src/ui/use-chat/VercelUseChatRuntime.tsx
|
|
357
|
+
var { ProxyConfigProvider, BaseAssistantRuntime } = INTERNAL2;
|
|
357
358
|
var VercelUseChatRuntime = class extends BaseAssistantRuntime {
|
|
358
359
|
_proxyConfigProvider = new ProxyConfigProvider();
|
|
359
360
|
constructor(vercel) {
|
|
@@ -402,9 +403,8 @@ import { useEffect as useEffect4, useInsertionEffect as useInsertionEffect2, use
|
|
|
402
403
|
|
|
403
404
|
// src/ui/use-assistant/VercelUseAssistantRuntime.tsx
|
|
404
405
|
import {
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
} from "@assistant-ui/react/internal";
|
|
406
|
+
INTERNAL as INTERNAL3
|
|
407
|
+
} from "@assistant-ui/react";
|
|
408
408
|
|
|
409
409
|
// src/ui/use-assistant/VercelUseAssistantThreadRuntime.tsx
|
|
410
410
|
import { create as create2 } from "zustand";
|
|
@@ -500,6 +500,7 @@ var VercelUseAssistantThreadRuntime = class {
|
|
|
500
500
|
};
|
|
501
501
|
|
|
502
502
|
// src/ui/use-assistant/VercelUseAssistantRuntime.tsx
|
|
503
|
+
var { ProxyConfigProvider: ProxyConfigProvider2, BaseAssistantRuntime: BaseAssistantRuntime2 } = INTERNAL3;
|
|
503
504
|
var hasUpcomingMessage2 = (isRunning, messages) => {
|
|
504
505
|
return isRunning && messages[messages.length - 1]?.role !== "assistant";
|
|
505
506
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatThreadRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantThreadRuntime.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 onCopy: null,\n convertMessage: (m: T) =>\n vercelToThreadMessage(\n adapter.convertMessage ?? ((m) => m as VercelRSCMessage),\n m,\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 type { useChat } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseChatRuntime } from \"./VercelUseChatRuntime\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const [runtime] = useState(() => new VercelUseChatRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import {\n ProxyConfigProvider,\n BaseAssistantRuntime,\n} from \"@assistant-ui/react/internal\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport { useChat } from \"ai/react\";\nimport { VercelUseChatThreadRuntime } from \"./VercelUseChatThreadRuntime\";\n\nexport class VercelUseChatRuntime extends BaseAssistantRuntime<VercelUseChatThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: ReturnType<typeof useChat>) {\n super(new VercelUseChatThreadRuntime(vercel));\n }\n\n public set vercel(vercel: ReturnType<typeof useChat>) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\n \"VercelAIRuntime does not yet support switching threads.\",\n );\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelUseChatThreadRuntime(this.thread.vercel);\n }\n}\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n AddToolResultOptions,\n} from \"@assistant-ui/react\";\nimport { MessageRepository } from \"@assistant-ui/react/internal\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { useChat } from \"ai/react\";\nimport { getVercelAIMessage } from \"../getVercelAIMessage\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nconst CAPABILITIES = Object.freeze({\n switchToBranch: true,\n edit: true,\n reload: true,\n cancel: true,\n copy: true,\n});\n\nexport class VercelUseChatThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<\n StoreApi<{ vercel: ReturnType<typeof useChat> }>\n >;\n\n public readonly capabilities = CAPABILITIES;\n\n public messages: ThreadMessage[] = [];\n public readonly isDisabled = false;\n public isRunning = false;\n\n constructor(public vercel: ReturnType<typeof useChat>) {\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.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseChatRuntime. This is likely an internal bug in assistant-ui.\",\n );\n\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime. Use the Edge runtime for image support.\",\n );\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 newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await this.vercel.reload();\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: [],\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 addToolResult({ toolCallId, result }: AddToolResultOptions) {\n this.vercel.addToolResult({ toolCallId, result });\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, ComposerState } from \"@assistant-ui/react\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\nimport { StoreApi } from \"zustand\";\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 as unknown as StoreApi<ComposerState>).setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type {\n TextContentPart,\n ThreadMessage,\n ToolCallContentPart,\n MessageStatus,\n ThreadAssistantMessage,\n} from \"@assistant-ui/react\";\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: MessageStatus,\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\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: ThreadAssistantMessage = {\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 status,\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\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\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: MessageStatus =\n lastMessageId === messages[0].id && isRunning\n ? {\n type: \"running\",\n }\n : {\n type: \"complete\",\n reason: \"unknown\",\n };\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role !== \"assistant\" || cache.status.type === status.type)\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 { 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 { useAssistant } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseAssistantRuntime } from \"./VercelUseAssistantRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n) => {\n const [runtime] = useState(\n () => new VercelUseAssistantRuntime(assistantHelpers),\n );\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import { type ThreadMessage, ModelConfigProvider } from \"@assistant-ui/react\";\nimport { useAssistant } from \"ai/react\";\nimport {\n ProxyConfigProvider,\n BaseAssistantRuntime,\n} from \"@assistant-ui/react/internal\";\nimport { VercelUseAssistantThreadRuntime } from \"./VercelUseAssistantThreadRuntime\";\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelUseAssistantRuntime extends BaseAssistantRuntime<VercelUseAssistantThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: ReturnType<typeof useAssistant>) {\n super(new VercelUseAssistantThreadRuntime(vercel));\n }\n\n public set vercel(vercel: ReturnType<typeof useAssistant>) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\"VercelAIRuntime does not yet support switching threads\");\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelUseAssistantThreadRuntime(this.thread.vercel);\n }\n}\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\nimport { useAssistant } from \"ai/react\";\nimport { hasUpcomingMessage } from \"./VercelUseAssistantRuntime\";\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nconst CAPABILITIES = Object.freeze({\n switchToBranch: false,\n edit: false,\n reload: false,\n cancel: false,\n copy: true,\n});\n\nexport class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n\n public readonly capabilities = CAPABILITIES;\n\n private useVercel: UseBoundStore<\n StoreApi<{ vercel: ReturnType<typeof useAssistant> }>\n >;\n\n public messages: readonly ThreadMessage[] = [];\n public readonly isDisabled = false;\n public isRunning = false;\n\n constructor(public vercel: ReturnType<typeof useAssistant>) {\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"VercelUseAssistantRuntime does not support switching branches.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseAssistantRuntime. This is likely an internal bug in assistant-ui.\",\n );\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"VercelUseAssistantRuntime only supports text content.\");\n\n if (message.parentId !== (this.messages.at(-1)?.id ?? null))\n throw new Error(\n \"VercelUseAssistantRuntime does not support editing messages.\",\n );\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(): Promise<void> {\n throw new Error(\"VercelUseAssistantRuntime does not support reloading.\");\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n if (previousMessage?.role === \"user\") {\n this.vercel.setInput(previousMessage.content);\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\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 if (hasUpcomingMessage(isRunning, vm)) {\n vm.push({\n id: \"__optimistic__result\",\n createdAt: new Date(),\n status: { type: \"running\" },\n role: \"assistant\",\n content: [],\n });\n }\n\n this.messages = vm;\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 addToolResult() {\n throw new Error(\n \"VercelUseAssistantRuntime does not support adding tool results.\",\n );\n }\n}\n"],"mappings":"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","names":["m","useEffect","useEffect","vercelToThreadMessage","useEffect","messages","useEffect","useEffect","useInsertionEffect","useState","ProxyConfigProvider","BaseAssistantRuntime","create","CAPABILITIES","create","hasUpcomingMessage","hasUpcomingMessage","BaseAssistantRuntime","ProxyConfigProvider","useState","useInsertionEffect","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatThreadRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantThreadRuntime.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 onCopy: null,\n convertMessage: (m: T) =>\n vercelToThreadMessage(\n adapter.convertMessage ?? ((m) => m as VercelRSCMessage),\n m,\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 type { useChat } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseChatRuntime } from \"./VercelUseChatRuntime\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const [runtime] = useState(() => new VercelUseChatRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import { INTERNAL, ModelConfigProvider } from \"@assistant-ui/react\";\nimport { useChat } from \"ai/react\";\nimport { VercelUseChatThreadRuntime } from \"./VercelUseChatThreadRuntime\";\n\nconst { ProxyConfigProvider, BaseAssistantRuntime } = INTERNAL;\n\nexport class VercelUseChatRuntime extends BaseAssistantRuntime<VercelUseChatThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: ReturnType<typeof useChat>) {\n super(new VercelUseChatThreadRuntime(vercel));\n }\n\n public set vercel(vercel: ReturnType<typeof useChat>) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\n \"VercelAIRuntime does not yet support switching threads.\",\n );\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelUseChatThreadRuntime(this.thread.vercel);\n }\n}\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n AddToolResultOptions,\n INTERNAL,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { useChat } from \"ai/react\";\nimport { getVercelAIMessage } from \"../getVercelAIMessage\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\n\nconst { MessageRepository } = INTERNAL;\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nconst CAPABILITIES = Object.freeze({\n switchToBranch: true,\n edit: true,\n reload: true,\n cancel: true,\n copy: true,\n});\n\nexport class VercelUseChatThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<\n StoreApi<{ vercel: ReturnType<typeof useChat> }>\n >;\n\n public readonly capabilities = CAPABILITIES;\n\n public messages: ThreadMessage[] = [];\n public readonly isDisabled = false;\n public isRunning = false;\n\n constructor(public vercel: ReturnType<typeof useChat>) {\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.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseChatRuntime. This is likely an internal bug in assistant-ui.\",\n );\n\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime. Use the Edge runtime for image support.\",\n );\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 newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await this.vercel.reload();\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: [],\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 addToolResult({ toolCallId, result }: AddToolResultOptions) {\n this.vercel.addToolResult({ toolCallId, result });\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, ComposerState } from \"@assistant-ui/react\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\nimport { StoreApi } from \"zustand\";\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 as unknown as StoreApi<ComposerState>).setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type {\n TextContentPart,\n ThreadMessage,\n ToolCallContentPart,\n MessageStatus,\n ThreadAssistantMessage,\n} from \"@assistant-ui/react\";\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: MessageStatus,\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\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: ThreadAssistantMessage = {\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 status,\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\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\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: MessageStatus =\n lastMessageId === messages[0].id && isRunning\n ? {\n type: \"running\",\n }\n : {\n type: \"complete\",\n reason: \"unknown\",\n };\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role !== \"assistant\" || cache.status.type === status.type)\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 { 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 { useAssistant } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseAssistantRuntime } from \"./VercelUseAssistantRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n) => {\n const [runtime] = useState(\n () => new VercelUseAssistantRuntime(assistantHelpers),\n );\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import {\n type ThreadMessage,\n INTERNAL,\n ModelConfigProvider,\n} from \"@assistant-ui/react\";\nimport { useAssistant } from \"ai/react\";\nimport { VercelUseAssistantThreadRuntime } from \"./VercelUseAssistantThreadRuntime\";\n\nconst { ProxyConfigProvider, BaseAssistantRuntime } = INTERNAL;\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelUseAssistantRuntime extends BaseAssistantRuntime<VercelUseAssistantThreadRuntime> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(vercel: ReturnType<typeof useAssistant>) {\n super(new VercelUseAssistantThreadRuntime(vercel));\n }\n\n public set vercel(vercel: ReturnType<typeof useAssistant>) {\n this.thread.vercel = vercel;\n }\n\n public onVercelUpdated() {\n return this.thread.onVercelUpdated();\n }\n\n public getModelConfig() {\n return this._proxyConfigProvider.getModelConfig();\n }\n\n public registerModelConfigProvider(provider: ModelConfigProvider) {\n return this._proxyConfigProvider.registerModelConfigProvider(provider);\n }\n\n public switchToThread(threadId: string | null) {\n if (threadId) {\n throw new Error(\"VercelAIRuntime does not yet support switching threads\");\n }\n\n // clear the vercel state (otherwise, it will be captured by the MessageRepository)\n this.thread.vercel.messages = [];\n this.thread.vercel.input = \"\";\n this.thread.vercel.setMessages([]);\n this.thread.vercel.setInput(\"\");\n\n this.thread = new VercelUseAssistantThreadRuntime(this.thread.vercel);\n }\n}\n","import {\n type ReactThreadRuntime,\n type Unsubscribe,\n type AppendMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\nimport { useAssistant } from \"ai/react\";\nimport { hasUpcomingMessage } from \"./VercelUseAssistantRuntime\";\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nconst CAPABILITIES = Object.freeze({\n switchToBranch: false,\n edit: false,\n reload: false,\n cancel: false,\n copy: true,\n});\n\nexport class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n\n public readonly capabilities = CAPABILITIES;\n\n private useVercel: UseBoundStore<\n StoreApi<{ vercel: ReturnType<typeof useAssistant> }>\n >;\n\n public messages: readonly ThreadMessage[] = [];\n public readonly isDisabled = false;\n public isRunning = false;\n\n constructor(public vercel: ReturnType<typeof useAssistant>) {\n this.useVercel = create(() => ({\n vercel,\n }));\n }\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"VercelUseAssistantRuntime does not support switching branches.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseAssistantRuntime. This is likely an internal bug in assistant-ui.\",\n );\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"VercelUseAssistantRuntime only supports text content.\");\n\n if (message.parentId !== (this.messages.at(-1)?.id ?? null))\n throw new Error(\n \"VercelUseAssistantRuntime does not support editing messages.\",\n );\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(): Promise<void> {\n throw new Error(\"VercelUseAssistantRuntime does not support reloading.\");\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n if (previousMessage?.role === \"user\") {\n this.vercel.setInput(previousMessage.content);\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\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 if (hasUpcomingMessage(isRunning, vm)) {\n vm.push({\n id: \"__optimistic__result\",\n createdAt: new Date(),\n status: { type: \"running\" },\n role: \"assistant\",\n content: [],\n });\n }\n\n this.messages = vm;\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 addToolResult() {\n throw new Error(\n \"VercelUseAssistantRuntime does not support adding tool results.\",\n );\n }\n}\n"],"mappings":"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","names":["m","useEffect","INTERNAL","useEffect","vercelToThreadMessage","useEffect","messages","INTERNAL","useEffect","useEffect","useInsertionEffect","useState","INTERNAL","create","CAPABILITIES","create","hasUpcomingMessage","ProxyConfigProvider","BaseAssistantRuntime","INTERNAL","hasUpcomingMessage","useState","useInsertionEffect","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@assistant-ui/react-ai-sdk",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.11",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"zustand": "^4.5.4"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
|
-
"@assistant-ui/react": "^0.5.
|
|
31
|
+
"@assistant-ui/react": "^0.5.22",
|
|
32
32
|
"@types/react": "*",
|
|
33
33
|
"ai": "^3.2.x",
|
|
34
34
|
"react": "^18"
|