@assistant-ui/react-ai-sdk 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +27 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +27 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -5
package/dist/index.d.mts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import * as _assistant_ui_react from '@assistant-ui/react';
|
|
2
|
-
import { ChatModelAdapter, ChatModelRunOptions,
|
|
2
|
+
import { ChatModelAdapter, ChatModelRunOptions, CoreAssistantContentPart, AppendMessage, ReactThreadRuntime, ThreadMessage, Unsubscribe, ModelConfigProvider, INTERNAL, AddToolResultOptions } from '@assistant-ui/react';
|
|
3
3
|
import { LanguageModel, Message } from 'ai';
|
|
4
4
|
import { ReactNode } from 'react';
|
|
5
|
-
import { useChat,
|
|
5
|
+
import { useChat, useAssistant } from 'ai/react';
|
|
6
6
|
|
|
7
7
|
declare class VercelModelAdapter implements ChatModelAdapter {
|
|
8
8
|
private readonly model;
|
|
9
9
|
constructor(model: LanguageModel);
|
|
10
10
|
run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions): Promise<{
|
|
11
|
-
content:
|
|
11
|
+
content: CoreAssistantContentPart[];
|
|
12
12
|
}>;
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -97,7 +97,7 @@ declare class VercelUseChatThreadRuntime implements ReactThreadRuntime {
|
|
|
97
97
|
onVercelUpdated(): void;
|
|
98
98
|
private updateData;
|
|
99
99
|
unstable_synchronizer: () => null;
|
|
100
|
-
addToolResult(toolCallId
|
|
100
|
+
addToolResult({ toolCallId, result }: AddToolResultOptions): void;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
declare const BaseAssistantRuntime$1: typeof INTERNAL.BaseAssistantRuntime;
|
|
@@ -114,7 +114,7 @@ declare class VercelUseChatRuntime extends BaseAssistantRuntime$1<VercelUseChatT
|
|
|
114
114
|
declare const useVercelUseChatRuntime: (chatHelpers: ReturnType<typeof useChat>) => VercelUseChatRuntime;
|
|
115
115
|
|
|
116
116
|
declare class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {
|
|
117
|
-
vercel:
|
|
117
|
+
vercel: ReturnType<typeof useAssistant>;
|
|
118
118
|
private _subscriptions;
|
|
119
119
|
readonly capabilities: Readonly<{
|
|
120
120
|
edit: false;
|
|
@@ -125,7 +125,7 @@ declare class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {
|
|
|
125
125
|
private useVercel;
|
|
126
126
|
messages: readonly ThreadMessage[];
|
|
127
127
|
isRunning: boolean;
|
|
128
|
-
constructor(vercel:
|
|
128
|
+
constructor(vercel: ReturnType<typeof useAssistant>);
|
|
129
129
|
getBranches(): readonly string[];
|
|
130
130
|
switchToBranch(): void;
|
|
131
131
|
append(message: AppendMessage): Promise<void>;
|
|
@@ -141,15 +141,15 @@ declare class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {
|
|
|
141
141
|
declare const BaseAssistantRuntime: typeof INTERNAL.BaseAssistantRuntime;
|
|
142
142
|
declare class VercelUseAssistantRuntime extends BaseAssistantRuntime<VercelUseAssistantThreadRuntime> {
|
|
143
143
|
private readonly _proxyConfigProvider;
|
|
144
|
-
constructor(vercel:
|
|
145
|
-
set vercel(vercel:
|
|
144
|
+
constructor(vercel: ReturnType<typeof useAssistant>);
|
|
145
|
+
set vercel(vercel: ReturnType<typeof useAssistant>);
|
|
146
146
|
onVercelUpdated(): void;
|
|
147
147
|
getModelConfig(): _assistant_ui_react.ModelConfig;
|
|
148
148
|
registerModelConfigProvider(provider: ModelConfigProvider): () => void;
|
|
149
149
|
switchToThread(threadId: string | null): void;
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
declare const useVercelUseAssistantRuntime: (assistantHelpers:
|
|
152
|
+
declare const useVercelUseAssistantRuntime: (assistantHelpers: ReturnType<typeof useAssistant>) => VercelUseAssistantRuntime;
|
|
153
153
|
|
|
154
154
|
declare const getVercelAIMessage: (message: ThreadMessage) => Message[] | undefined;
|
|
155
155
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import * as _assistant_ui_react from '@assistant-ui/react';
|
|
2
|
-
import { ChatModelAdapter, ChatModelRunOptions,
|
|
2
|
+
import { ChatModelAdapter, ChatModelRunOptions, CoreAssistantContentPart, AppendMessage, ReactThreadRuntime, ThreadMessage, Unsubscribe, ModelConfigProvider, INTERNAL, AddToolResultOptions } from '@assistant-ui/react';
|
|
3
3
|
import { LanguageModel, Message } from 'ai';
|
|
4
4
|
import { ReactNode } from 'react';
|
|
5
|
-
import { useChat,
|
|
5
|
+
import { useChat, useAssistant } from 'ai/react';
|
|
6
6
|
|
|
7
7
|
declare class VercelModelAdapter implements ChatModelAdapter {
|
|
8
8
|
private readonly model;
|
|
9
9
|
constructor(model: LanguageModel);
|
|
10
10
|
run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions): Promise<{
|
|
11
|
-
content:
|
|
11
|
+
content: CoreAssistantContentPart[];
|
|
12
12
|
}>;
|
|
13
13
|
}
|
|
14
14
|
|
|
@@ -97,7 +97,7 @@ declare class VercelUseChatThreadRuntime implements ReactThreadRuntime {
|
|
|
97
97
|
onVercelUpdated(): void;
|
|
98
98
|
private updateData;
|
|
99
99
|
unstable_synchronizer: () => null;
|
|
100
|
-
addToolResult(toolCallId
|
|
100
|
+
addToolResult({ toolCallId, result }: AddToolResultOptions): void;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
declare const BaseAssistantRuntime$1: typeof INTERNAL.BaseAssistantRuntime;
|
|
@@ -114,7 +114,7 @@ declare class VercelUseChatRuntime extends BaseAssistantRuntime$1<VercelUseChatT
|
|
|
114
114
|
declare const useVercelUseChatRuntime: (chatHelpers: ReturnType<typeof useChat>) => VercelUseChatRuntime;
|
|
115
115
|
|
|
116
116
|
declare class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {
|
|
117
|
-
vercel:
|
|
117
|
+
vercel: ReturnType<typeof useAssistant>;
|
|
118
118
|
private _subscriptions;
|
|
119
119
|
readonly capabilities: Readonly<{
|
|
120
120
|
edit: false;
|
|
@@ -125,7 +125,7 @@ declare class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {
|
|
|
125
125
|
private useVercel;
|
|
126
126
|
messages: readonly ThreadMessage[];
|
|
127
127
|
isRunning: boolean;
|
|
128
|
-
constructor(vercel:
|
|
128
|
+
constructor(vercel: ReturnType<typeof useAssistant>);
|
|
129
129
|
getBranches(): readonly string[];
|
|
130
130
|
switchToBranch(): void;
|
|
131
131
|
append(message: AppendMessage): Promise<void>;
|
|
@@ -141,15 +141,15 @@ declare class VercelUseAssistantThreadRuntime implements ReactThreadRuntime {
|
|
|
141
141
|
declare const BaseAssistantRuntime: typeof INTERNAL.BaseAssistantRuntime;
|
|
142
142
|
declare class VercelUseAssistantRuntime extends BaseAssistantRuntime<VercelUseAssistantThreadRuntime> {
|
|
143
143
|
private readonly _proxyConfigProvider;
|
|
144
|
-
constructor(vercel:
|
|
145
|
-
set vercel(vercel:
|
|
144
|
+
constructor(vercel: ReturnType<typeof useAssistant>);
|
|
145
|
+
set vercel(vercel: ReturnType<typeof useAssistant>);
|
|
146
146
|
onVercelUpdated(): void;
|
|
147
147
|
getModelConfig(): _assistant_ui_react.ModelConfig;
|
|
148
148
|
registerModelConfigProvider(provider: ModelConfigProvider): () => void;
|
|
149
149
|
switchToThread(threadId: string | null): void;
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
declare const useVercelUseAssistantRuntime: (assistantHelpers:
|
|
152
|
+
declare const useVercelUseAssistantRuntime: (assistantHelpers: ReturnType<typeof useAssistant>) => VercelUseAssistantRuntime;
|
|
153
153
|
|
|
154
154
|
declare const getVercelAIMessage: (message: ThreadMessage) => Message[] | undefined;
|
|
155
155
|
|
package/dist/index.js
CHANGED
|
@@ -34,6 +34,9 @@ var import_ai = require("ai");
|
|
|
34
34
|
|
|
35
35
|
// src/core/convertToCoreMessage.ts
|
|
36
36
|
var convertToCoreMessage = (message) => {
|
|
37
|
+
if (message.role === "system") {
|
|
38
|
+
return [{ role: "system", content: message.content[0].text }];
|
|
39
|
+
}
|
|
37
40
|
const expandedMessages = [
|
|
38
41
|
{
|
|
39
42
|
role: message.role,
|
|
@@ -92,7 +95,8 @@ var VercelModelAdapter = class {
|
|
|
92
95
|
});
|
|
93
96
|
const content = [];
|
|
94
97
|
for await (const aiPart of fullStream) {
|
|
95
|
-
|
|
98
|
+
const partType = aiPart.type;
|
|
99
|
+
switch (partType) {
|
|
96
100
|
case "text-delta": {
|
|
97
101
|
let part = content.at(-1);
|
|
98
102
|
if (!part || part.type !== "text") {
|
|
@@ -117,19 +121,26 @@ var VercelModelAdapter = class {
|
|
|
117
121
|
}
|
|
118
122
|
case "tool-result": {
|
|
119
123
|
const toolCall = content.findIndex(
|
|
124
|
+
// @ts-expect-error
|
|
120
125
|
(c) => c.type === "tool-call" && c.toolCallId === aiPart.toolCallId
|
|
121
126
|
);
|
|
122
127
|
if (toolCall === -1) {
|
|
123
128
|
throw new Error(
|
|
129
|
+
// @ts-expect-error
|
|
124
130
|
`Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`
|
|
125
131
|
);
|
|
126
132
|
}
|
|
127
133
|
content[toolCall] = {
|
|
128
134
|
...content[toolCall],
|
|
135
|
+
// @ts-expect-error
|
|
129
136
|
result: aiPart.result
|
|
130
137
|
};
|
|
131
138
|
break;
|
|
132
139
|
}
|
|
140
|
+
default: {
|
|
141
|
+
const unhandledType = partType;
|
|
142
|
+
throw new Error(`Unknown content part type: ${unhandledType}`);
|
|
143
|
+
}
|
|
133
144
|
}
|
|
134
145
|
onUpdate({ content });
|
|
135
146
|
}
|
|
@@ -178,7 +189,7 @@ var vercelToThreadMessage = (converter, rawMessage) => {
|
|
|
178
189
|
role: message.role,
|
|
179
190
|
content: [{ type: "ui", display: message.display }],
|
|
180
191
|
createdAt: message.createdAt ?? /* @__PURE__ */ new Date(),
|
|
181
|
-
...{ status: "done" },
|
|
192
|
+
...{ status: { type: "done" } },
|
|
182
193
|
[symbolInnerRSCMessage]: rawMessage
|
|
183
194
|
};
|
|
184
195
|
};
|
|
@@ -380,6 +391,12 @@ var vercelToThreadMessage2 = (messages, status) => {
|
|
|
380
391
|
role: "user",
|
|
381
392
|
content: [{ type: "text", text: firstMessage.content }]
|
|
382
393
|
};
|
|
394
|
+
case "system":
|
|
395
|
+
return {
|
|
396
|
+
...common,
|
|
397
|
+
role: "system",
|
|
398
|
+
content: [{ type: "text", text: firstMessage.content }]
|
|
399
|
+
};
|
|
383
400
|
case "data":
|
|
384
401
|
case "assistant": {
|
|
385
402
|
const res = {
|
|
@@ -415,8 +432,9 @@ var vercelToThreadMessage2 = (messages, status) => {
|
|
|
415
432
|
return res;
|
|
416
433
|
}
|
|
417
434
|
default:
|
|
435
|
+
const _unsupported = firstMessage.role;
|
|
418
436
|
throw new Error(
|
|
419
|
-
`
|
|
437
|
+
`You have a message with an unsupported role. The role ${_unsupported} is not supported.`
|
|
420
438
|
);
|
|
421
439
|
}
|
|
422
440
|
};
|
|
@@ -453,8 +471,10 @@ var useVercelAIThreadSync = (vercel, updateData) => {
|
|
|
453
471
|
(0, import_react7.useEffect)(() => {
|
|
454
472
|
const lastMessageId = vercel.messages.at(-1)?.id;
|
|
455
473
|
const convertCallback = (messages2, cache) => {
|
|
456
|
-
const status =
|
|
457
|
-
|
|
474
|
+
const status = {
|
|
475
|
+
type: lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done"
|
|
476
|
+
};
|
|
477
|
+
if (cache && shallowArrayEqual(cache.content, messages2) && (cache.role !== "assistant" || cache.status.type === status.type))
|
|
458
478
|
return cache;
|
|
459
479
|
return vercelToThreadMessage2(messages2, status);
|
|
460
480
|
};
|
|
@@ -582,7 +602,7 @@ var VercelUseChatThreadRuntime = class {
|
|
|
582
602
|
useVercelAIComposerSync(vercel);
|
|
583
603
|
return null;
|
|
584
604
|
};
|
|
585
|
-
addToolResult(toolCallId, result) {
|
|
605
|
+
addToolResult({ toolCallId, result }) {
|
|
586
606
|
this.vercel.addToolResult({ toolCallId, result });
|
|
587
607
|
}
|
|
588
608
|
};
|
|
@@ -703,7 +723,7 @@ var VercelUseAssistantThreadRuntime = class {
|
|
|
703
723
|
vm.push({
|
|
704
724
|
id: "__optimistic__result",
|
|
705
725
|
createdAt: /* @__PURE__ */ new Date(),
|
|
706
|
-
status: "in_progress",
|
|
726
|
+
status: { type: "in_progress" },
|
|
707
727
|
role: "assistant",
|
|
708
728
|
content: [{ type: "text", text: "" }]
|
|
709
729
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/VercelModelAdapter.tsx","../src/core/convertToCoreMessage.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/VercelRSCThreadRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../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/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantThreadRuntime.tsx"],"sourcesContent":["export * from \"./core\";\nexport * from \"./rsc\";\nexport * from \"./ui\";\n","// @ts-nocheck TOOD\n\n\"use client\";\n\nimport type {\n AssistantContentPart,\n TextContentPart,\n} from \"@assistant-ui/react\";\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { type CoreTool, type LanguageModel, streamText } from \"ai\";\nimport { convertToCoreMessage } from \"./convertToCoreMessage\";\n\n// TODO multiple roundtrip support\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n ...(config.system ? { system: config.system } : {}),\n messages: messages.flatMap(convertToCoreMessage),\n ...(config.tools\n ? {\n tools: config.tools as Record<string, CoreTool<any>>,\n }\n : {}),\n });\n\n const content: AssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n switch (aiPart.type) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: aiPart.textDelta };\n content.push(part);\n } else {\n content[content.length - 1] = {\n ...part,\n text: part.text + aiPart.textDelta,\n };\n }\n break;\n }\n\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n toolName: aiPart.toolName,\n toolCallId: aiPart.toolCallId,\n args: aiPart.args,\n });\n break;\n }\n\n case \"tool-result\": {\n const toolCall = content.findIndex(\n (c) => c.type === \"tool-call\" && c.toolCallId === aiPart.toolCallId,\n );\n if (toolCall === -1) {\n throw new Error(\n `Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`,\n );\n }\n\n content[toolCall] = {\n ...(content[toolCall] as ToolCallContentPart),\n result: aiPart.result,\n };\n\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type {\n CoreMessage,\n ImagePart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"ai\";\n\nexport const convertToCoreMessage = (message: ThreadMessage): CoreMessage[] => {\n const expandedMessages: CoreMessage[] = [\n {\n role: message.role,\n content: [],\n },\n ];\n\n const addContent = (\n content: TextPart | ImagePart | ToolCallPart | ToolResultPart,\n ) => {\n const lastMessage = expandedMessages.at(-1);\n if (!lastMessage) throw new Error(\"No last message\");\n\n if (\n (lastMessage.role === \"tool\" && content.type !== \"tool-result\") ||\n (lastMessage.role !== \"tool\" && content.type === \"tool-result\")\n ) {\n expandedMessages.push({\n role: content.type === \"tool-result\" ? \"tool\" : message.role,\n content: [content] as any,\n });\n } else {\n (lastMessage.content as Array<any>).push(content);\n }\n };\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n addContent({ type: \"text\", text: part.text });\n } else if (message.role === \"user\" && part.type === \"image\") {\n addContent({ type: \"image\", image: part.image });\n } else if (message.role === \"assistant\" && part.type === \"tool-call\") {\n // TODO bundle multiple tool calls\n addContent({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n addContent({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n } else throw new Error(`Unknown content part type: ${part.type}`);\n }\n\n return expandedMessages;\n};\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport {\n VercelRSCThreadRuntime,\n ProxyConfigProvider,\n} from \"./VercelRSCThreadRuntime\";\n\nconst { BaseAssistantRuntime } = INTERNAL;\n\nexport class VercelRSCRuntime<\n T extends WeakKey = VercelRSCMessage,\n> extends BaseAssistantRuntime<VercelRSCThreadRuntime<T>> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(adapter: VercelRSCAdapter<T>) {\n super(new VercelRSCThreadRuntime(adapter));\n }\n\n public set adapter(adapter: VercelRSCAdapter<T>) {\n this.thread.adapter = adapter;\n }\n\n public onAdapterUpdated() {\n return this.thread.onAdapterUpdated();\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() {\n throw new Error(\"VercelRSCRuntime does not support switching threads\");\n }\n}\n","\"use client\";\nimport {\n INTERNAL,\n type AppendMessage,\n type ReactThreadRuntime,\n type ThreadMessage,\n type Unsubscribe,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nexport const { ProxyConfigProvider } = INTERNAL;\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\nconst CAPABILITIES = Object.freeze({\n edit: false,\n reload: false,\n cancel: false,\n copy: false,\n});\n\nexport class VercelRSCThreadRuntime<T extends WeakKey = VercelRSCMessage>\n implements ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n public readonly capabilities = CAPABILITIES;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n throw new Error(\"VercelRSCRuntime does not support cancelling runs.\");\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n\n addToolResult() {\n throw new Error(\"VercelRSCRuntime does not support adding tool results\");\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt ?? new Date(),\n ...{ status: \"done\" },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { useChat } from \"@ai-sdk/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 } from \"@assistant-ui/react\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport { useChat } from \"@ai-sdk/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 INTERNAL,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"../getVercelAIMessage\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\nimport { useChat } from \"@ai-sdk/react\";\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 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 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.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime.\",\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: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n addToolResult(toolCallId: string, result: any) {\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 AssistantMessage,\n TextContentPart,\n ThreadMessage,\n ToolCallContentPart,\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: \"in_progress\" | \"done\" | \"error\",\n): VercelAIThreadMessage => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n [symbolInnerAIMessage]: messages,\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n\n case \"data\":\n case \"assistant\": {\n const res: AssistantMessage = {\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 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 throw new Error(\n `123 You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`,\n );\n }\n};\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\" || 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 =\n lastMessageId === messages[0].id && isRunning ? \"in_progress\" : \"done\";\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role === \"user\" || cache.status === status)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseAssistantRuntime } from \"./VercelUseAssistantRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: UseAssistantHelpers,\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, INTERNAL } from \"@assistant-ui/react\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport { UseAssistantHelpers } from \"@ai-sdk/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: UseAssistantHelpers) {\n super(new VercelUseAssistantThreadRuntime(vercel));\n }\n\n public set vercel(vercel: UseAssistantHelpers) {\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 { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { hasUpcomingMessage } from \"./VercelUseAssistantRuntime\";\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nconst CAPABILITIES = Object.freeze({\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<StoreApi<{ vercel: UseAssistantHelpers }>>;\n\n public messages: readonly ThreadMessage[] = [];\n public isRunning = false;\n\n constructor(public vercel: UseAssistantHelpers) {\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.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: \"in_progress\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\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":["import_react","import_react","import_react","convertCallback","import_react","import_react","import_react","import_zustand","import_react","import_react","vercelToThreadMessage","messages","CAPABILITIES","ProxyConfigProvider","BaseAssistantRuntime","import_react","import_react","import_zustand","EMPTY_BRANCHES","CAPABILITIES","hasUpcomingMessage","ProxyConfigProvider","BaseAssistantRuntime","hasUpcomingMessage"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/VercelModelAdapter.tsx","../src/core/convertToCoreMessage.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/VercelRSCThreadRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../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/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantThreadRuntime.tsx"],"sourcesContent":["export * from \"./core\";\nexport * from \"./rsc\";\nexport * from \"./ui\";\n","\"use client\";\n\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { type CoreTool, type LanguageModel, streamText } from \"ai\";\nimport { convertToCoreMessage } from \"./convertToCoreMessage\";\nimport { CoreAssistantContentPart } from \"@assistant-ui/react\";\n\n// TODO multiple roundtrip support\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n ...(config.system ? { system: config.system } : {}),\n messages: messages.flatMap(convertToCoreMessage),\n ...(config.tools\n ? {\n tools: config.tools as Record<string, CoreTool<any>>,\n }\n : {}),\n });\n\n const content: CoreAssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n const partType = aiPart.type;\n switch (partType) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: aiPart.textDelta };\n content.push(part);\n } else {\n content[content.length - 1] = {\n ...part,\n text: part.text + aiPart.textDelta,\n };\n }\n break;\n }\n\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n toolName: aiPart.toolName,\n toolCallId: aiPart.toolCallId,\n args: aiPart.args,\n });\n break;\n }\n\n // @ts-expect-error\n case \"tool-result\": {\n const toolCall = content.findIndex(\n // @ts-expect-error\n (c) => c.type === \"tool-call\" && c.toolCallId === aiPart.toolCallId,\n );\n if (toolCall === -1) {\n throw new Error(\n // @ts-expect-error\n `Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`,\n );\n }\n\n content[toolCall] = {\n ...(content[toolCall] as ToolCallContentPart),\n // @ts-expect-error\n result: aiPart.result,\n };\n\n break;\n }\n\n default: {\n const unhandledType: \"error\" | \"finish\" = partType;\n throw new Error(`Unknown content part type: ${unhandledType}`);\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type {\n CoreMessage,\n ImagePart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"ai\";\n\nexport const convertToCoreMessage = (message: ThreadMessage): CoreMessage[] => {\n if (message.role === \"system\") {\n return [{ role: \"system\", content: message.content[0].text }];\n }\n\n const expandedMessages: CoreMessage[] = [\n {\n role: message.role,\n content: [],\n },\n ];\n\n const addContent = (\n content: TextPart | ImagePart | ToolCallPart | ToolResultPart,\n ) => {\n const lastMessage = expandedMessages.at(-1);\n if (!lastMessage) throw new Error(\"No last message\");\n\n if (\n (lastMessage.role === \"tool\" && content.type !== \"tool-result\") ||\n (lastMessage.role !== \"tool\" && content.type === \"tool-result\")\n ) {\n expandedMessages.push({\n role: content.type === \"tool-result\" ? \"tool\" : message.role,\n content: [content] as any,\n });\n } else {\n (lastMessage.content as Array<any>).push(content);\n }\n };\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n addContent({ type: \"text\", text: part.text });\n } else if (message.role === \"user\" && part.type === \"image\") {\n addContent({ type: \"image\", image: part.image });\n } else if (message.role === \"assistant\" && part.type === \"tool-call\") {\n // TODO bundle multiple tool calls\n addContent({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n addContent({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n } else throw new Error(`Unknown content part type: ${part.type}`);\n }\n\n return expandedMessages;\n};\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport {\n VercelRSCThreadRuntime,\n ProxyConfigProvider,\n} from \"./VercelRSCThreadRuntime\";\n\nconst { BaseAssistantRuntime } = INTERNAL;\n\nexport class VercelRSCRuntime<\n T extends WeakKey = VercelRSCMessage,\n> extends BaseAssistantRuntime<VercelRSCThreadRuntime<T>> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(adapter: VercelRSCAdapter<T>) {\n super(new VercelRSCThreadRuntime(adapter));\n }\n\n public set adapter(adapter: VercelRSCAdapter<T>) {\n this.thread.adapter = adapter;\n }\n\n public onAdapterUpdated() {\n return this.thread.onAdapterUpdated();\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() {\n throw new Error(\"VercelRSCRuntime does not support switching threads\");\n }\n}\n","\"use client\";\nimport {\n INTERNAL,\n type AppendMessage,\n type ReactThreadRuntime,\n type ThreadMessage,\n type Unsubscribe,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nexport const { ProxyConfigProvider } = INTERNAL;\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\nconst CAPABILITIES = Object.freeze({\n edit: false,\n reload: false,\n cancel: false,\n copy: false,\n});\n\nexport class VercelRSCThreadRuntime<T extends WeakKey = VercelRSCMessage>\n implements ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n public readonly capabilities = CAPABILITIES;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n throw new Error(\"VercelRSCRuntime does not support cancelling runs.\");\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n\n addToolResult() {\n throw new Error(\"VercelRSCRuntime does not support adding tool results\");\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt ?? new Date(),\n ...{ status: { type: \"done\" } },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { 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 } from \"@assistant-ui/react\";\nimport { 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 INTERNAL,\n AddToolResultOptions,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"../getVercelAIMessage\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\nimport { useChat } from \"ai/react\";\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 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 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.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime.\",\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: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n 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 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 type:\n lastMessageId === messages[0].id && isRunning\n ? \"in_progress\"\n : \"done\",\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 { 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, INTERNAL } from \"@assistant-ui/react\";\nimport { ModelConfigProvider } 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 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 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.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: \"in_progress\" },\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\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":["import_react","import_react","import_react","convertCallback","import_react","import_react","import_react","import_zustand","import_react","import_react","vercelToThreadMessage","messages","CAPABILITIES","ProxyConfigProvider","BaseAssistantRuntime","import_react","import_react","import_zustand","EMPTY_BRANCHES","CAPABILITIES","hasUpcomingMessage","ProxyConfigProvider","BaseAssistantRuntime","hasUpcomingMessage"]}
|
package/dist/index.mjs
CHANGED
|
@@ -3,6 +3,9 @@ import { streamText } from "ai";
|
|
|
3
3
|
|
|
4
4
|
// src/core/convertToCoreMessage.ts
|
|
5
5
|
var convertToCoreMessage = (message) => {
|
|
6
|
+
if (message.role === "system") {
|
|
7
|
+
return [{ role: "system", content: message.content[0].text }];
|
|
8
|
+
}
|
|
6
9
|
const expandedMessages = [
|
|
7
10
|
{
|
|
8
11
|
role: message.role,
|
|
@@ -61,7 +64,8 @@ var VercelModelAdapter = class {
|
|
|
61
64
|
});
|
|
62
65
|
const content = [];
|
|
63
66
|
for await (const aiPart of fullStream) {
|
|
64
|
-
|
|
67
|
+
const partType = aiPart.type;
|
|
68
|
+
switch (partType) {
|
|
65
69
|
case "text-delta": {
|
|
66
70
|
let part = content.at(-1);
|
|
67
71
|
if (!part || part.type !== "text") {
|
|
@@ -86,19 +90,26 @@ var VercelModelAdapter = class {
|
|
|
86
90
|
}
|
|
87
91
|
case "tool-result": {
|
|
88
92
|
const toolCall = content.findIndex(
|
|
93
|
+
// @ts-expect-error
|
|
89
94
|
(c) => c.type === "tool-call" && c.toolCallId === aiPart.toolCallId
|
|
90
95
|
);
|
|
91
96
|
if (toolCall === -1) {
|
|
92
97
|
throw new Error(
|
|
98
|
+
// @ts-expect-error
|
|
93
99
|
`Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`
|
|
94
100
|
);
|
|
95
101
|
}
|
|
96
102
|
content[toolCall] = {
|
|
97
103
|
...content[toolCall],
|
|
104
|
+
// @ts-expect-error
|
|
98
105
|
result: aiPart.result
|
|
99
106
|
};
|
|
100
107
|
break;
|
|
101
108
|
}
|
|
109
|
+
default: {
|
|
110
|
+
const unhandledType = partType;
|
|
111
|
+
throw new Error(`Unknown content part type: ${unhandledType}`);
|
|
112
|
+
}
|
|
102
113
|
}
|
|
103
114
|
onUpdate({ content });
|
|
104
115
|
}
|
|
@@ -149,7 +160,7 @@ var vercelToThreadMessage = (converter, rawMessage) => {
|
|
|
149
160
|
role: message.role,
|
|
150
161
|
content: [{ type: "ui", display: message.display }],
|
|
151
162
|
createdAt: message.createdAt ?? /* @__PURE__ */ new Date(),
|
|
152
|
-
...{ status: "done" },
|
|
163
|
+
...{ status: { type: "done" } },
|
|
153
164
|
[symbolInnerRSCMessage]: rawMessage
|
|
154
165
|
};
|
|
155
166
|
};
|
|
@@ -353,6 +364,12 @@ var vercelToThreadMessage2 = (messages, status) => {
|
|
|
353
364
|
role: "user",
|
|
354
365
|
content: [{ type: "text", text: firstMessage.content }]
|
|
355
366
|
};
|
|
367
|
+
case "system":
|
|
368
|
+
return {
|
|
369
|
+
...common,
|
|
370
|
+
role: "system",
|
|
371
|
+
content: [{ type: "text", text: firstMessage.content }]
|
|
372
|
+
};
|
|
356
373
|
case "data":
|
|
357
374
|
case "assistant": {
|
|
358
375
|
const res = {
|
|
@@ -388,8 +405,9 @@ var vercelToThreadMessage2 = (messages, status) => {
|
|
|
388
405
|
return res;
|
|
389
406
|
}
|
|
390
407
|
default:
|
|
408
|
+
const _unsupported = firstMessage.role;
|
|
391
409
|
throw new Error(
|
|
392
|
-
`
|
|
410
|
+
`You have a message with an unsupported role. The role ${_unsupported} is not supported.`
|
|
393
411
|
);
|
|
394
412
|
}
|
|
395
413
|
};
|
|
@@ -426,8 +444,10 @@ var useVercelAIThreadSync = (vercel, updateData) => {
|
|
|
426
444
|
useEffect4(() => {
|
|
427
445
|
const lastMessageId = vercel.messages.at(-1)?.id;
|
|
428
446
|
const convertCallback = (messages2, cache) => {
|
|
429
|
-
const status =
|
|
430
|
-
|
|
447
|
+
const status = {
|
|
448
|
+
type: lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done"
|
|
449
|
+
};
|
|
450
|
+
if (cache && shallowArrayEqual(cache.content, messages2) && (cache.role !== "assistant" || cache.status.type === status.type))
|
|
431
451
|
return cache;
|
|
432
452
|
return vercelToThreadMessage2(messages2, status);
|
|
433
453
|
};
|
|
@@ -555,7 +575,7 @@ var VercelUseChatThreadRuntime = class {
|
|
|
555
575
|
useVercelAIComposerSync(vercel);
|
|
556
576
|
return null;
|
|
557
577
|
};
|
|
558
|
-
addToolResult(toolCallId, result) {
|
|
578
|
+
addToolResult({ toolCallId, result }) {
|
|
559
579
|
this.vercel.addToolResult({ toolCallId, result });
|
|
560
580
|
}
|
|
561
581
|
};
|
|
@@ -676,7 +696,7 @@ var VercelUseAssistantThreadRuntime = class {
|
|
|
676
696
|
vm.push({
|
|
677
697
|
id: "__optimistic__result",
|
|
678
698
|
createdAt: /* @__PURE__ */ new Date(),
|
|
679
|
-
status: "in_progress",
|
|
699
|
+
status: { type: "in_progress" },
|
|
680
700
|
role: "assistant",
|
|
681
701
|
content: [{ type: "text", text: "" }]
|
|
682
702
|
});
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/VercelModelAdapter.tsx","../src/core/convertToCoreMessage.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/VercelRSCThreadRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../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/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantThreadRuntime.tsx"],"sourcesContent":["// @ts-nocheck TOOD\n\n\"use client\";\n\nimport type {\n AssistantContentPart,\n TextContentPart,\n} from \"@assistant-ui/react\";\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { type CoreTool, type LanguageModel, streamText } from \"ai\";\nimport { convertToCoreMessage } from \"./convertToCoreMessage\";\n\n// TODO multiple roundtrip support\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n ...(config.system ? { system: config.system } : {}),\n messages: messages.flatMap(convertToCoreMessage),\n ...(config.tools\n ? {\n tools: config.tools as Record<string, CoreTool<any>>,\n }\n : {}),\n });\n\n const content: AssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n switch (aiPart.type) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: aiPart.textDelta };\n content.push(part);\n } else {\n content[content.length - 1] = {\n ...part,\n text: part.text + aiPart.textDelta,\n };\n }\n break;\n }\n\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n toolName: aiPart.toolName,\n toolCallId: aiPart.toolCallId,\n args: aiPart.args,\n });\n break;\n }\n\n case \"tool-result\": {\n const toolCall = content.findIndex(\n (c) => c.type === \"tool-call\" && c.toolCallId === aiPart.toolCallId,\n );\n if (toolCall === -1) {\n throw new Error(\n `Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`,\n );\n }\n\n content[toolCall] = {\n ...(content[toolCall] as ToolCallContentPart),\n result: aiPart.result,\n };\n\n break;\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type {\n CoreMessage,\n ImagePart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"ai\";\n\nexport const convertToCoreMessage = (message: ThreadMessage): CoreMessage[] => {\n const expandedMessages: CoreMessage[] = [\n {\n role: message.role,\n content: [],\n },\n ];\n\n const addContent = (\n content: TextPart | ImagePart | ToolCallPart | ToolResultPart,\n ) => {\n const lastMessage = expandedMessages.at(-1);\n if (!lastMessage) throw new Error(\"No last message\");\n\n if (\n (lastMessage.role === \"tool\" && content.type !== \"tool-result\") ||\n (lastMessage.role !== \"tool\" && content.type === \"tool-result\")\n ) {\n expandedMessages.push({\n role: content.type === \"tool-result\" ? \"tool\" : message.role,\n content: [content] as any,\n });\n } else {\n (lastMessage.content as Array<any>).push(content);\n }\n };\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n addContent({ type: \"text\", text: part.text });\n } else if (message.role === \"user\" && part.type === \"image\") {\n addContent({ type: \"image\", image: part.image });\n } else if (message.role === \"assistant\" && part.type === \"tool-call\") {\n // TODO bundle multiple tool calls\n addContent({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n addContent({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n } else throw new Error(`Unknown content part type: ${part.type}`);\n }\n\n return expandedMessages;\n};\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport {\n VercelRSCThreadRuntime,\n ProxyConfigProvider,\n} from \"./VercelRSCThreadRuntime\";\n\nconst { BaseAssistantRuntime } = INTERNAL;\n\nexport class VercelRSCRuntime<\n T extends WeakKey = VercelRSCMessage,\n> extends BaseAssistantRuntime<VercelRSCThreadRuntime<T>> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(adapter: VercelRSCAdapter<T>) {\n super(new VercelRSCThreadRuntime(adapter));\n }\n\n public set adapter(adapter: VercelRSCAdapter<T>) {\n this.thread.adapter = adapter;\n }\n\n public onAdapterUpdated() {\n return this.thread.onAdapterUpdated();\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() {\n throw new Error(\"VercelRSCRuntime does not support switching threads\");\n }\n}\n","\"use client\";\nimport {\n INTERNAL,\n type AppendMessage,\n type ReactThreadRuntime,\n type ThreadMessage,\n type Unsubscribe,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nexport const { ProxyConfigProvider } = INTERNAL;\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\nconst CAPABILITIES = Object.freeze({\n edit: false,\n reload: false,\n cancel: false,\n copy: false,\n});\n\nexport class VercelRSCThreadRuntime<T extends WeakKey = VercelRSCMessage>\n implements ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n public readonly capabilities = CAPABILITIES;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n throw new Error(\"VercelRSCRuntime does not support cancelling runs.\");\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n\n addToolResult() {\n throw new Error(\"VercelRSCRuntime does not support adding tool results\");\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt ?? new Date(),\n ...{ status: \"done\" },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { useChat } from \"@ai-sdk/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 } from \"@assistant-ui/react\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport { useChat } from \"@ai-sdk/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 INTERNAL,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"../getVercelAIMessage\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\nimport { useChat } from \"@ai-sdk/react\";\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 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 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.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime.\",\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: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n addToolResult(toolCallId: string, result: any) {\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 AssistantMessage,\n TextContentPart,\n ThreadMessage,\n ToolCallContentPart,\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: \"in_progress\" | \"done\" | \"error\",\n): VercelAIThreadMessage => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n [symbolInnerAIMessage]: messages,\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n\n case \"data\":\n case \"assistant\": {\n const res: AssistantMessage = {\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 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 throw new Error(\n `123 You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`,\n );\n }\n};\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\" || 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 =\n lastMessageId === messages[0].id && isRunning ? \"in_progress\" : \"done\";\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role === \"user\" || cache.status === status)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseAssistantRuntime } from \"./VercelUseAssistantRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: UseAssistantHelpers,\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, INTERNAL } from \"@assistant-ui/react\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport { UseAssistantHelpers } from \"@ai-sdk/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: UseAssistantHelpers) {\n super(new VercelUseAssistantThreadRuntime(vercel));\n }\n\n public set vercel(vercel: UseAssistantHelpers) {\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 { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { hasUpcomingMessage } from \"./VercelUseAssistantRuntime\";\n\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\n\nconst CAPABILITIES = Object.freeze({\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<StoreApi<{ vercel: UseAssistantHelpers }>>;\n\n public messages: readonly ThreadMessage[] = [];\n public isRunning = false;\n\n constructor(public vercel: UseAssistantHelpers) {\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.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: \"in_progress\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\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":["useEffect","INTERNAL","convertCallback","INTERNAL","useEffect","useEffect","useInsertionEffect","useState","INTERNAL","INTERNAL","create","useEffect","useEffect","useMemo","vercelToThreadMessage","useMemo","useEffect","messages","INTERNAL","CAPABILITIES","create","ProxyConfigProvider","BaseAssistantRuntime","INTERNAL","useState","useInsertionEffect","useEffect","useEffect","useInsertionEffect","useState","INTERNAL","create","EMPTY_BRANCHES","CAPABILITIES","create","hasUpcomingMessage","ProxyConfigProvider","BaseAssistantRuntime","INTERNAL","hasUpcomingMessage","useState","useInsertionEffect","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/VercelModelAdapter.tsx","../src/core/convertToCoreMessage.ts","../src/rsc/useVercelRSCRuntime.tsx","../src/rsc/VercelRSCRuntime.tsx","../src/rsc/VercelRSCThreadRuntime.tsx","../src/rsc/useVercelRSCSync.tsx","../src/utils/ThreadMessageConverter.ts","../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/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantThreadRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"@assistant-ui/react\";\nimport type { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { type CoreTool, type LanguageModel, streamText } from \"ai\";\nimport { convertToCoreMessage } from \"./convertToCoreMessage\";\nimport { CoreAssistantContentPart } from \"@assistant-ui/react\";\n\n// TODO multiple roundtrip support\nexport class VercelModelAdapter implements ChatModelAdapter {\n constructor(private readonly model: LanguageModel) {}\n\n async run({ messages, abortSignal, config, onUpdate }: ChatModelRunOptions) {\n const { fullStream } = await streamText({\n model: this.model,\n abortSignal,\n ...(config.system ? { system: config.system } : {}),\n messages: messages.flatMap(convertToCoreMessage),\n ...(config.tools\n ? {\n tools: config.tools as Record<string, CoreTool<any>>,\n }\n : {}),\n });\n\n const content: CoreAssistantContentPart[] = [];\n for await (const aiPart of fullStream) {\n const partType = aiPart.type;\n switch (partType) {\n case \"text-delta\": {\n let part = content.at(-1);\n if (!part || part.type !== \"text\") {\n part = { type: \"text\", text: aiPart.textDelta };\n content.push(part);\n } else {\n content[content.length - 1] = {\n ...part,\n text: part.text + aiPart.textDelta,\n };\n }\n break;\n }\n\n case \"tool-call\": {\n content.push({\n type: \"tool-call\",\n toolName: aiPart.toolName,\n toolCallId: aiPart.toolCallId,\n args: aiPart.args,\n });\n break;\n }\n\n // @ts-expect-error\n case \"tool-result\": {\n const toolCall = content.findIndex(\n // @ts-expect-error\n (c) => c.type === \"tool-call\" && c.toolCallId === aiPart.toolCallId,\n );\n if (toolCall === -1) {\n throw new Error(\n // @ts-expect-error\n `Tool call ${aiPart.toolCallId} not found in the content stream. This is likely an internal bug in assistant-ui.`,\n );\n }\n\n content[toolCall] = {\n ...(content[toolCall] as ToolCallContentPart),\n // @ts-expect-error\n result: aiPart.result,\n };\n\n break;\n }\n\n default: {\n const unhandledType: \"error\" | \"finish\" = partType;\n throw new Error(`Unknown content part type: ${unhandledType}`);\n }\n }\n\n onUpdate({ content });\n }\n\n return { content };\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type {\n CoreMessage,\n ImagePart,\n TextPart,\n ToolCallPart,\n ToolResultPart,\n} from \"ai\";\n\nexport const convertToCoreMessage = (message: ThreadMessage): CoreMessage[] => {\n if (message.role === \"system\") {\n return [{ role: \"system\", content: message.content[0].text }];\n }\n\n const expandedMessages: CoreMessage[] = [\n {\n role: message.role,\n content: [],\n },\n ];\n\n const addContent = (\n content: TextPart | ImagePart | ToolCallPart | ToolResultPart,\n ) => {\n const lastMessage = expandedMessages.at(-1);\n if (!lastMessage) throw new Error(\"No last message\");\n\n if (\n (lastMessage.role === \"tool\" && content.type !== \"tool-result\") ||\n (lastMessage.role !== \"tool\" && content.type === \"tool-result\")\n ) {\n expandedMessages.push({\n role: content.type === \"tool-result\" ? \"tool\" : message.role,\n content: [content] as any,\n });\n } else {\n (lastMessage.content as Array<any>).push(content);\n }\n };\n\n for (const part of message.content) {\n if (part.type === \"text\") {\n addContent({ type: \"text\", text: part.text });\n } else if (message.role === \"user\" && part.type === \"image\") {\n addContent({ type: \"image\", image: part.image });\n } else if (message.role === \"assistant\" && part.type === \"tool-call\") {\n // TODO bundle multiple tool calls\n addContent({\n type: \"tool-call\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n addContent({\n type: \"tool-result\",\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n result: part.result,\n });\n } else throw new Error(`Unknown content part type: ${part.type}`);\n }\n\n return expandedMessages;\n};\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport { INTERNAL } from \"@assistant-ui/react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { ModelConfigProvider } from \"@assistant-ui/react\";\nimport {\n VercelRSCThreadRuntime,\n ProxyConfigProvider,\n} from \"./VercelRSCThreadRuntime\";\n\nconst { BaseAssistantRuntime } = INTERNAL;\n\nexport class VercelRSCRuntime<\n T extends WeakKey = VercelRSCMessage,\n> extends BaseAssistantRuntime<VercelRSCThreadRuntime<T>> {\n private readonly _proxyConfigProvider = new ProxyConfigProvider();\n\n constructor(adapter: VercelRSCAdapter<T>) {\n super(new VercelRSCThreadRuntime(adapter));\n }\n\n public set adapter(adapter: VercelRSCAdapter<T>) {\n this.thread.adapter = adapter;\n }\n\n public onAdapterUpdated() {\n return this.thread.onAdapterUpdated();\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() {\n throw new Error(\"VercelRSCRuntime does not support switching threads\");\n }\n}\n","\"use client\";\nimport {\n INTERNAL,\n type AppendMessage,\n type ReactThreadRuntime,\n type ThreadMessage,\n type Unsubscribe,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nexport const { ProxyConfigProvider } = INTERNAL;\nconst EMPTY_BRANCHES: readonly string[] = Object.freeze([]);\nconst CAPABILITIES = Object.freeze({\n edit: false,\n reload: false,\n cancel: false,\n copy: false,\n});\n\nexport class VercelRSCThreadRuntime<T extends WeakKey = VercelRSCMessage>\n implements ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n public readonly capabilities = CAPABILITIES;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n throw new Error(\"VercelRSCRuntime does not support cancelling runs.\");\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n\n addToolResult() {\n throw new Error(\"VercelRSCRuntime does not support adding tool results\");\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt ?? new Date(),\n ...{ status: { type: \"done\" } },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { 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 } from \"@assistant-ui/react\";\nimport { 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 INTERNAL,\n AddToolResultOptions,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"../getVercelAIMessage\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"../utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"../utils/useVercelAIThreadSync\";\nimport { useChat } from \"ai/react\";\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 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 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.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime.\",\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: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n 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 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 type:\n lastMessageId === messages[0].id && isRunning\n ? \"in_progress\"\n : \"done\",\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 { 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, INTERNAL } from \"@assistant-ui/react\";\nimport { ModelConfigProvider } 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 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 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.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: \"in_progress\" },\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\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":["useEffect","INTERNAL","convertCallback","INTERNAL","useEffect","useEffect","useInsertionEffect","useState","INTERNAL","INTERNAL","create","useEffect","useEffect","useMemo","vercelToThreadMessage","useMemo","useEffect","messages","INTERNAL","CAPABILITIES","create","ProxyConfigProvider","BaseAssistantRuntime","INTERNAL","useState","useInsertionEffect","useEffect","useEffect","useInsertionEffect","useState","INTERNAL","create","EMPTY_BRANCHES","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.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -29,8 +29,7 @@
|
|
|
29
29
|
"zustand": "^4.5.4"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
|
-
"@
|
|
33
|
-
"@assistant-ui/react": "^0.3.1",
|
|
32
|
+
"@assistant-ui/react": "^0.4.0",
|
|
34
33
|
"@types/react": "*",
|
|
35
34
|
"ai": "^3.1.x",
|
|
36
35
|
"react": "^18"
|
|
@@ -41,7 +40,7 @@
|
|
|
41
40
|
}
|
|
42
41
|
},
|
|
43
42
|
"devDependencies": {
|
|
44
|
-
"
|
|
43
|
+
"eslint-config-next": "14.2.5",
|
|
45
44
|
"@assistant-ui/tsconfig": "0.0.0"
|
|
46
45
|
},
|
|
47
46
|
"publishConfig": {
|
|
@@ -57,6 +56,6 @@
|
|
|
57
56
|
"url": "https://github.com/Yonom/assistant-ui/issues"
|
|
58
57
|
},
|
|
59
58
|
"scripts": {
|
|
60
|
-
"build": "tsup src/index.ts --format cjs,esm --dts --sourcemap"
|
|
59
|
+
"build": "tsup src/index.ts --format cjs,esm --dts --sourcemap --clean"
|
|
61
60
|
}
|
|
62
61
|
}
|