@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 CHANGED
@@ -1,14 +1,14 @@
1
1
  import * as _assistant_ui_react from '@assistant-ui/react';
2
- import { ChatModelAdapter, ChatModelRunOptions, AssistantContentPart, AppendMessage, ReactThreadRuntime, ThreadMessage, Unsubscribe, ModelConfigProvider, INTERNAL } from '@assistant-ui/react';
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, UseAssistantHelpers } from '@ai-sdk/react';
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: AssistantContentPart[];
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: string, result: any): void;
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: UseAssistantHelpers;
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: UseAssistantHelpers);
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: UseAssistantHelpers);
145
- set vercel(vercel: UseAssistantHelpers);
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: UseAssistantHelpers) => VercelUseAssistantRuntime;
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, AssistantContentPart, AppendMessage, ReactThreadRuntime, ThreadMessage, Unsubscribe, ModelConfigProvider, INTERNAL } from '@assistant-ui/react';
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, UseAssistantHelpers } from '@ai-sdk/react';
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: AssistantContentPart[];
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: string, result: any): void;
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: UseAssistantHelpers;
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: UseAssistantHelpers);
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: UseAssistantHelpers);
145
- set vercel(vercel: UseAssistantHelpers);
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: UseAssistantHelpers) => VercelUseAssistantRuntime;
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
- switch (aiPart.type) {
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
- `123 You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`
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 = lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done";
457
- if (cache && shallowArrayEqual(cache.content, messages2) && (cache.role === "user" || cache.status === status))
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
- switch (aiPart.type) {
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
- `123 You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`
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 = lastMessageId === messages2[0].id && isRunning ? "in_progress" : "done";
430
- if (cache && shallowArrayEqual(cache.content, messages2) && (cache.role === "user" || cache.status === status))
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
  });
@@ -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.1",
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
- "@ai-sdk/react": "^0.0.x",
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
- "@types/node": "^20.14.9",
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
  }