@assistant-ui/react-ai-sdk 0.4.1 → 0.5.2
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 +3 -40
- package/dist/index.d.ts +3 -40
- package/dist/index.js +78 -203
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +78 -201
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.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 \"./rsc\";\nexport * from \"./ui\";\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.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelRSCRuntime. This is likely an internal bug in assistant-ui.\",\n );\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.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseChatRuntime. This is likely an internal bug in assistant-ui.\",\n );\n\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime.\",\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 argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ...(typeof message.data === \"object\" &&\n !Array.isArray(message.data) &&\n message.data?.[\"type\"] === \"tool-call\"\n ? [message.data as ToolCallContentPart]\n : []),\n ];\n }),\n status,\n };\n\n for (const message of messages) {\n if (\n typeof message.data === \"object\" &&\n !Array.isArray(message.data) &&\n message.data?.[\"type\"] === \"tool-result\"\n ) {\n const toolCallId = message.data[\"toolCallId\"];\n const toolContent = res.content.find(\n (c) => c.type === \"tool-call\" && c.toolCallId === toolCallId,\n ) as ToolCallContentPart | undefined;\n if (!toolContent) throw new Error(\"Tool call not found\");\n toolContent.result = message.data[\"result\"];\n }\n }\n\n return res;\n }\n\n default:\n const _unsupported: \"function\" | \"tool\" = firstMessage.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\" || message.role === \"data\") {\n currentChunk.push(message);\n } else {\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n currentChunk = [];\n }\n chunks.push([message]);\n }\n }\n\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n }\n\n return chunks;\n};\n\nconst shallowArrayEqual = (a: unknown[], b: unknown[]) => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\ntype UpdateDataCallback = (isRunning: boolean, vm: ThreadMessage[]) => void;\n\nexport const useVercelAIThreadSync = (\n vercel: VercelHelpers,\n updateData: UpdateDataCallback,\n) => {\n const isRunning = getIsRunning(vercel);\n\n const converter = useMemo(() => new ThreadMessageConverter(), []);\n\n useEffect(() => {\n const lastMessageId = vercel.messages.at(-1)?.id;\n const convertCallback: ConverterCallback<Chunk> = (messages, cache) => {\n const status: MessageStatus = {\n 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.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseAssistantRuntime. This is likely an internal bug in assistant-ui.\",\n );\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"VercelUseAssistantRuntime only supports text content.\");\n\n if (message.parentId !== (this.messages.at(-1)?.id ?? null))\n throw new Error(\n \"VercelUseAssistantRuntime does not support editing messages.\",\n );\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(): Promise<void> {\n throw new Error(\"VercelUseAssistantRuntime does not support reloading.\");\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n if (previousMessage?.role === \"user\") {\n this.vercel.setInput(previousMessage.content);\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n if (hasUpcomingMessage(isRunning, vm)) {\n vm.push({\n id: \"__optimistic__result\",\n createdAt: new Date(),\n status: { type: \"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/rsc/useVercelRSCRuntime.tsx","../src/rsc/getVercelRSCMessage.tsx","../src/ui/use-chat/useVercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatRuntime.tsx","../src/ui/use-chat/VercelUseChatThreadRuntime.tsx","../src/ui/getVercelAIMessage.tsx","../src/ui/utils/sliceMessagesUntil.tsx","../src/ui/utils/useVercelAIComposerSync.tsx","../src/ui/utils/useVercelAIThreadSync.tsx","../src/utils/ThreadMessageConverter.ts","../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantRuntime.tsx","../src/ui/use-assistant/VercelUseAssistantThreadRuntime.tsx"],"sourcesContent":["export * from \"./rsc\";\nexport * from \"./ui\";\n","\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { ThreadMessage } from \"@assistant-ui/react\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessage => {\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: \"complete\", reason: \"unknown\" } },\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const eAdapter: ExternalStoreAdapter<any> = {\n messages: adapter.messages,\n onNew: adapter.append,\n onEdit: adapter.edit,\n onReload: adapter.reload,\n convertMessage: (m: T) =>\n vercelToThreadMessage(\n adapter.convertMessage ?? ((m) => m as VercelRSCMessage),\n m,\n ),\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n","import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n","import type { useChat } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseChatRuntime } from \"./VercelUseChatRuntime\";\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n) => {\n const [runtime] = useState(() => new VercelUseChatRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import { INTERNAL } 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.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseChatRuntime. This is likely an internal bug in assistant-ui.\",\n );\n\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\n \"Only text content is supported by VercelUseChatRuntime.\",\n );\n\n const newMessages = sliceMessagesUntil(\n this.vercel.messages,\n message.parentId,\n );\n this.vercel.setMessages(newMessages);\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await this.vercel.reload();\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.vercel.setInput(previousMessage.content);\n this.repository.deleteMessage(previousMessage.id);\n\n messages = this.repository.getMessages();\n }\n\n // resync messages\n setTimeout(() => {\n this.updateVercelMessages(messages);\n }, 0);\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private updateVercelMessages = (messages: ThreadMessage[]) => {\n this.vercel.setMessages(\n messages\n .flatMap(getVercelAIMessage)\n .filter((m): m is Message => m != null),\n );\n };\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n for (let i = 0; i < vm.length; i++) {\n const message = vm[i]!;\n const parent = vm[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, vm)) {\n this.assistantOptimisticId = this.repository.appendOptimisticMessage(\n vm.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n addToolResult({ toolCallId, result }: AddToolResultOptions) {\n this.vercel.addToolResult({ toolCallId, result });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const symbolInnerAIMessage = Symbol(\"innerVercelAIUIMessage\");\n\nexport type VercelAIThreadMessage = ThreadMessage & {\n [symbolInnerAIMessage]?: Message[];\n};\n\nexport const getVercelAIMessage = (message: ThreadMessage) => {\n return (message as VercelAIThreadMessage)[symbolInnerAIMessage];\n};\n","import type { Message } from \"ai\";\n\nexport const sliceMessagesUntil = (\n messages: Message[],\n messageId: string | null,\n) => {\n if (messageId == null) return [];\n\n let messageIdx = messages.findIndex((m) => m.id === messageId);\n if (messageIdx === -1)\n throw new Error(\n \"useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui.\",\n );\n\n while (messages[messageIdx + 1]?.role === \"assistant\") {\n messageIdx++;\n }\n\n return messages.slice(0, messageIdx + 1);\n};\n","import { useThreadContext, ComposerState } from \"@assistant-ui/react\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\nimport { StoreApi } from \"zustand\";\n\n// two way sync between vercel helpers input state and composer text state\nexport const useVercelAIComposerSync = (vercel: VercelHelpers) => {\n const { useComposer } = useThreadContext();\n\n useEffect(() => {\n (useComposer as unknown as StoreApi<ComposerState>).setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type {\n TextContentPart,\n ThreadMessage,\n ToolCallContentPart,\n MessageStatus,\n ThreadAssistantMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../../utils/ThreadMessageConverter\";\nimport {\n type VercelAIThreadMessage,\n symbolInnerAIMessage,\n} from \"../getVercelAIMessage\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\nconst getIsRunning = (vercel: VercelHelpers) => {\n if (\"isLoading\" in vercel) return vercel.isLoading;\n return vercel.status === \"in_progress\";\n};\n\nconst vercelToThreadMessage = (\n messages: Message[],\n status: MessageStatus,\n): VercelAIThreadMessage => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n [symbolInnerAIMessage]: messages,\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n\n case \"system\":\n return {\n ...common,\n role: \"system\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n\n case \"data\":\n case \"assistant\": {\n const res: ThreadAssistantMessage = {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => {\n return [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n toolName: t.toolName,\n toolCallId: t.toolCallId,\n argsText: JSON.stringify(t.args),\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) satisfies ToolCallContentPart,\n ) ?? []),\n ...(typeof message.data === \"object\" &&\n !Array.isArray(message.data) &&\n message.data?.[\"type\"] === \"tool-call\"\n ? [message.data as ToolCallContentPart]\n : []),\n ];\n }),\n status,\n };\n\n for (const message of messages) {\n if (\n typeof message.data === \"object\" &&\n !Array.isArray(message.data) &&\n message.data?.[\"type\"] === \"tool-result\"\n ) {\n const toolCallId = message.data[\"toolCallId\"];\n const toolContent = res.content.find(\n (c) => c.type === \"tool-call\" && c.toolCallId === toolCallId,\n ) as ToolCallContentPart | undefined;\n if (!toolContent) throw new Error(\"Tool call not found\");\n toolContent.result = message.data[\"result\"];\n }\n }\n\n return res;\n }\n\n default:\n const _unsupported: \"function\" | \"tool\" = firstMessage.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n};\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\" || message.role === \"data\") {\n currentChunk.push(message);\n } else {\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n currentChunk = [];\n }\n chunks.push([message]);\n }\n }\n\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n }\n\n return chunks;\n};\n\nconst shallowArrayEqual = (a: unknown[], b: unknown[]) => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\ntype UpdateDataCallback = (isRunning: boolean, vm: ThreadMessage[]) => void;\n\nexport const useVercelAIThreadSync = (\n vercel: VercelHelpers,\n updateData: UpdateDataCallback,\n) => {\n const isRunning = getIsRunning(vercel);\n\n const converter = useMemo(() => new ThreadMessageConverter(), []);\n\n useEffect(() => {\n const lastMessageId = vercel.messages.at(-1)?.id;\n const convertCallback: ConverterCallback<Chunk> = (messages, cache) => {\n const status: MessageStatus =\n lastMessageId === messages[0].id && isRunning\n ? {\n type: \"running\",\n }\n : {\n type: \"complete\",\n reason: \"unknown\",\n };\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role !== \"assistant\" || cache.status.type === status.type)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { useAssistant } from \"ai/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelUseAssistantRuntime } from \"./VercelUseAssistantRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n) => {\n const [runtime] = useState(\n () => new VercelUseAssistantRuntime(assistantHelpers),\n );\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import { type ThreadMessage, 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.role !== \"user\")\n throw new Error(\n \"Only appending user messages are supported in VercelUseAssistantRuntime. This is likely an internal bug in assistant-ui.\",\n );\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"VercelUseAssistantRuntime only supports text content.\");\n\n if (message.parentId !== (this.messages.at(-1)?.id ?? null))\n throw new Error(\n \"VercelUseAssistantRuntime does not support editing messages.\",\n );\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(): Promise<void> {\n throw new Error(\"VercelUseAssistantRuntime does not support reloading.\");\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n if (previousMessage?.role === \"user\") {\n this.vercel.setInput(previousMessage.content);\n }\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n if (hasUpcomingMessage(isRunning, vm)) {\n vm.push({\n id: \"__optimistic__result\",\n createdAt: new Date(),\n status: { type: \"running\" },\n role: \"assistant\",\n content: [],\n });\n }\n\n this.messages = vm;\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n\n addToolResult() {\n throw new Error(\n \"VercelUseAssistantRuntime does not support adding tool results.\",\n );\n }\n}\n"],"mappings":"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","names":["m","import_react","import_react","import_react","import_react","import_react","import_react","vercelToThreadMessage","messages","import_react","import_react","import_zustand","CAPABILITIES","hasUpcomingMessage","ProxyConfigProvider","BaseAssistantRuntime","hasUpcomingMessage"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,39 +1,7 @@
|
|
|
1
1
|
// src/rsc/useVercelRSCRuntime.tsx
|
|
2
|
-
import { useEffect as useEffect2, useInsertionEffect, useState } from "react";
|
|
3
|
-
|
|
4
|
-
// src/rsc/VercelRSCRuntime.tsx
|
|
5
|
-
import { INTERNAL as INTERNAL2 } from "@assistant-ui/react";
|
|
6
|
-
|
|
7
|
-
// src/rsc/VercelRSCThreadRuntime.tsx
|
|
8
2
|
import {
|
|
9
|
-
|
|
3
|
+
useExternalStoreRuntime
|
|
10
4
|
} from "@assistant-ui/react";
|
|
11
|
-
import { create } from "zustand";
|
|
12
|
-
|
|
13
|
-
// src/rsc/useVercelRSCSync.tsx
|
|
14
|
-
import { useEffect, useMemo } from "react";
|
|
15
|
-
|
|
16
|
-
// src/utils/ThreadMessageConverter.ts
|
|
17
|
-
var ThreadMessageConverter = class {
|
|
18
|
-
cache = /* @__PURE__ */ new WeakMap();
|
|
19
|
-
convertMessages(messages, converter, keyMapper = (key) => key) {
|
|
20
|
-
return messages.map((m) => {
|
|
21
|
-
const key = keyMapper(m);
|
|
22
|
-
const cached = this.cache.get(key);
|
|
23
|
-
const newMessage = converter(m, cached);
|
|
24
|
-
this.cache.set(key, newMessage);
|
|
25
|
-
return newMessage;
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
// src/rsc/getVercelRSCMessage.tsx
|
|
31
|
-
var symbolInnerRSCMessage = Symbol("innerVercelRSCMessage");
|
|
32
|
-
var getVercelRSCMessage = (message) => {
|
|
33
|
-
return message[symbolInnerRSCMessage];
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
// src/rsc/useVercelRSCSync.tsx
|
|
37
5
|
var vercelToThreadMessage = (converter, rawMessage) => {
|
|
38
6
|
const message = converter(rawMessage);
|
|
39
7
|
return {
|
|
@@ -41,154 +9,44 @@ var vercelToThreadMessage = (converter, rawMessage) => {
|
|
|
41
9
|
role: message.role,
|
|
42
10
|
content: [{ type: "ui", display: message.display }],
|
|
43
11
|
createdAt: message.createdAt ?? /* @__PURE__ */ new Date(),
|
|
44
|
-
...{ status: { type: "
|
|
45
|
-
[symbolInnerRSCMessage]: rawMessage
|
|
12
|
+
...{ status: { type: "complete", reason: "unknown" } }
|
|
46
13
|
};
|
|
47
14
|
};
|
|
48
|
-
var
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
updateData(converter.convertMessages(adapter.messages, convertCallback));
|
|
59
|
-
}, [updateData, converter, convertCallback, adapter.messages]);
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
// src/rsc/VercelRSCThreadRuntime.tsx
|
|
63
|
-
var { ProxyConfigProvider } = INTERNAL;
|
|
64
|
-
var EMPTY_BRANCHES = Object.freeze([]);
|
|
65
|
-
var CAPABILITIES = Object.freeze({
|
|
66
|
-
edit: false,
|
|
67
|
-
reload: false,
|
|
68
|
-
cancel: false,
|
|
69
|
-
copy: false
|
|
70
|
-
});
|
|
71
|
-
var VercelRSCThreadRuntime = class {
|
|
72
|
-
constructor(adapter) {
|
|
73
|
-
this.adapter = adapter;
|
|
74
|
-
this.useAdapter = create(() => ({
|
|
75
|
-
adapter
|
|
76
|
-
}));
|
|
77
|
-
}
|
|
78
|
-
useAdapter;
|
|
79
|
-
capabilities = CAPABILITIES;
|
|
80
|
-
_subscriptions = /* @__PURE__ */ new Set();
|
|
81
|
-
isRunning = false;
|
|
82
|
-
messages = [];
|
|
83
|
-
withRunning = (callback) => {
|
|
84
|
-
this.isRunning = true;
|
|
85
|
-
return callback.finally(() => {
|
|
86
|
-
this.isRunning = false;
|
|
87
|
-
});
|
|
88
|
-
};
|
|
89
|
-
getBranches() {
|
|
90
|
-
return EMPTY_BRANCHES;
|
|
91
|
-
}
|
|
92
|
-
switchToBranch() {
|
|
93
|
-
throw new Error(
|
|
94
|
-
"Branch switching is not supported by VercelRSCAssistantProvider."
|
|
95
|
-
);
|
|
96
|
-
}
|
|
97
|
-
async append(message) {
|
|
98
|
-
if (message.role !== "user")
|
|
99
|
-
throw new Error(
|
|
100
|
-
"Only appending user messages are supported in VercelRSCRuntime. This is likely an internal bug in assistant-ui."
|
|
101
|
-
);
|
|
102
|
-
if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {
|
|
103
|
-
if (!this.adapter.edit)
|
|
104
|
-
throw new Error(
|
|
105
|
-
"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider."
|
|
106
|
-
);
|
|
107
|
-
await this.withRunning(this.adapter.edit(message));
|
|
108
|
-
} else {
|
|
109
|
-
await this.withRunning(this.adapter.append(message));
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
async startRun(parentId) {
|
|
113
|
-
if (!this.adapter.reload)
|
|
114
|
-
throw new Error(
|
|
115
|
-
"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider."
|
|
116
|
-
);
|
|
117
|
-
await this.withRunning(this.adapter.reload(parentId));
|
|
118
|
-
}
|
|
119
|
-
cancelRun() {
|
|
120
|
-
throw new Error("VercelRSCRuntime does not support cancelling runs.");
|
|
121
|
-
}
|
|
122
|
-
subscribe(callback) {
|
|
123
|
-
this._subscriptions.add(callback);
|
|
124
|
-
return () => this._subscriptions.delete(callback);
|
|
125
|
-
}
|
|
126
|
-
onAdapterUpdated() {
|
|
127
|
-
if (this.useAdapter.getState().adapter !== this.adapter) {
|
|
128
|
-
this.useAdapter.setState({ adapter: this.adapter });
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
updateData = (messages) => {
|
|
132
|
-
this.messages = messages;
|
|
133
|
-
for (const callback of this._subscriptions) callback();
|
|
134
|
-
};
|
|
135
|
-
unstable_synchronizer = () => {
|
|
136
|
-
const { adapter } = this.useAdapter();
|
|
137
|
-
useVercelRSCSync(adapter, this.updateData);
|
|
138
|
-
return null;
|
|
15
|
+
var useVercelRSCRuntime = (adapter) => {
|
|
16
|
+
const eAdapter = {
|
|
17
|
+
messages: adapter.messages,
|
|
18
|
+
onNew: adapter.append,
|
|
19
|
+
onEdit: adapter.edit,
|
|
20
|
+
onReload: adapter.reload,
|
|
21
|
+
convertMessage: (m) => vercelToThreadMessage(
|
|
22
|
+
adapter.convertMessage ?? ((m2) => m2),
|
|
23
|
+
m
|
|
24
|
+
)
|
|
139
25
|
};
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
// src/rsc/VercelRSCRuntime.tsx
|
|
146
|
-
var { BaseAssistantRuntime } = INTERNAL2;
|
|
147
|
-
var VercelRSCRuntime = class extends BaseAssistantRuntime {
|
|
148
|
-
_proxyConfigProvider = new ProxyConfigProvider();
|
|
149
|
-
constructor(adapter) {
|
|
150
|
-
super(new VercelRSCThreadRuntime(adapter));
|
|
151
|
-
}
|
|
152
|
-
set adapter(adapter) {
|
|
153
|
-
this.thread.adapter = adapter;
|
|
154
|
-
}
|
|
155
|
-
onAdapterUpdated() {
|
|
156
|
-
return this.thread.onAdapterUpdated();
|
|
157
|
-
}
|
|
158
|
-
getModelConfig() {
|
|
159
|
-
return this._proxyConfigProvider.getModelConfig();
|
|
160
|
-
}
|
|
161
|
-
registerModelConfigProvider(provider) {
|
|
162
|
-
return this._proxyConfigProvider.registerModelConfigProvider(provider);
|
|
163
|
-
}
|
|
164
|
-
switchToThread() {
|
|
165
|
-
throw new Error("VercelRSCRuntime does not support switching threads");
|
|
166
|
-
}
|
|
26
|
+
const runtime = useExternalStoreRuntime(eAdapter);
|
|
27
|
+
return runtime;
|
|
167
28
|
};
|
|
168
29
|
|
|
169
|
-
// src/rsc/
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
runtime.onAdapterUpdated();
|
|
177
|
-
});
|
|
178
|
-
return runtime;
|
|
30
|
+
// src/rsc/getVercelRSCMessage.tsx
|
|
31
|
+
import {
|
|
32
|
+
getExternalStoreMessage
|
|
33
|
+
} from "@assistant-ui/react";
|
|
34
|
+
var symbolInnerRSCMessage = Symbol("innerVercelRSCMessage");
|
|
35
|
+
var getVercelRSCMessage = (message) => {
|
|
36
|
+
return getExternalStoreMessage(message);
|
|
179
37
|
};
|
|
180
38
|
|
|
181
39
|
// src/ui/use-chat/useVercelUseChatRuntime.tsx
|
|
182
|
-
import { useEffect as
|
|
40
|
+
import { useEffect as useEffect3, useInsertionEffect, useState } from "react";
|
|
183
41
|
|
|
184
42
|
// src/ui/use-chat/VercelUseChatRuntime.tsx
|
|
185
|
-
import { INTERNAL as
|
|
43
|
+
import { INTERNAL as INTERNAL2 } from "@assistant-ui/react";
|
|
186
44
|
|
|
187
45
|
// src/ui/use-chat/VercelUseChatThreadRuntime.tsx
|
|
188
46
|
import {
|
|
189
|
-
INTERNAL
|
|
47
|
+
INTERNAL
|
|
190
48
|
} from "@assistant-ui/react";
|
|
191
|
-
import { create
|
|
49
|
+
import { create } from "zustand";
|
|
192
50
|
|
|
193
51
|
// src/ui/getVercelAIMessage.tsx
|
|
194
52
|
var symbolInnerAIMessage = Symbol("innerVercelAIUIMessage");
|
|
@@ -212,10 +70,10 @@ var sliceMessagesUntil = (messages, messageId) => {
|
|
|
212
70
|
|
|
213
71
|
// src/ui/utils/useVercelAIComposerSync.tsx
|
|
214
72
|
import { useThreadContext } from "@assistant-ui/react";
|
|
215
|
-
import { useEffect
|
|
73
|
+
import { useEffect } from "react";
|
|
216
74
|
var useVercelAIComposerSync = (vercel) => {
|
|
217
75
|
const { useComposer } = useThreadContext();
|
|
218
|
-
|
|
76
|
+
useEffect(() => {
|
|
219
77
|
useComposer.setState({
|
|
220
78
|
value: vercel.input,
|
|
221
79
|
setValue: vercel.setInput
|
|
@@ -224,7 +82,23 @@ var useVercelAIComposerSync = (vercel) => {
|
|
|
224
82
|
};
|
|
225
83
|
|
|
226
84
|
// src/ui/utils/useVercelAIThreadSync.tsx
|
|
227
|
-
import { useEffect as
|
|
85
|
+
import { useEffect as useEffect2, useMemo } from "react";
|
|
86
|
+
|
|
87
|
+
// src/utils/ThreadMessageConverter.ts
|
|
88
|
+
var ThreadMessageConverter = class {
|
|
89
|
+
cache = /* @__PURE__ */ new WeakMap();
|
|
90
|
+
convertMessages(messages, converter, keyMapper = (key) => key) {
|
|
91
|
+
return messages.map((m) => {
|
|
92
|
+
const key = keyMapper(m);
|
|
93
|
+
const cached = this.cache.get(key);
|
|
94
|
+
const newMessage = converter(m, cached);
|
|
95
|
+
this.cache.set(key, newMessage);
|
|
96
|
+
return newMessage;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// src/ui/utils/useVercelAIThreadSync.tsx
|
|
228
102
|
var getIsRunning = (vercel) => {
|
|
229
103
|
if ("isLoading" in vercel) return vercel.isLoading;
|
|
230
104
|
return vercel.status === "in_progress";
|
|
@@ -326,12 +200,15 @@ var shallowArrayEqual = (a, b) => {
|
|
|
326
200
|
};
|
|
327
201
|
var useVercelAIThreadSync = (vercel, updateData) => {
|
|
328
202
|
const isRunning = getIsRunning(vercel);
|
|
329
|
-
const converter =
|
|
330
|
-
|
|
203
|
+
const converter = useMemo(() => new ThreadMessageConverter(), []);
|
|
204
|
+
useEffect2(() => {
|
|
331
205
|
const lastMessageId = vercel.messages.at(-1)?.id;
|
|
332
206
|
const convertCallback = (messages2, cache) => {
|
|
333
|
-
const status = {
|
|
334
|
-
type:
|
|
207
|
+
const status = lastMessageId === messages2[0].id && isRunning ? {
|
|
208
|
+
type: "running"
|
|
209
|
+
} : {
|
|
210
|
+
type: "complete",
|
|
211
|
+
reason: "unknown"
|
|
335
212
|
};
|
|
336
213
|
if (cache && shallowArrayEqual(cache.content, messages2) && (cache.role !== "assistant" || cache.status.type === status.type))
|
|
337
214
|
return cache;
|
|
@@ -347,11 +224,11 @@ var useVercelAIThreadSync = (vercel, updateData) => {
|
|
|
347
224
|
};
|
|
348
225
|
|
|
349
226
|
// src/ui/use-chat/VercelUseChatThreadRuntime.tsx
|
|
350
|
-
var { MessageRepository } =
|
|
227
|
+
var { MessageRepository } = INTERNAL;
|
|
351
228
|
var hasUpcomingMessage = (isRunning, messages) => {
|
|
352
229
|
return isRunning && messages[messages.length - 1]?.role !== "assistant";
|
|
353
230
|
};
|
|
354
|
-
var
|
|
231
|
+
var CAPABILITIES = Object.freeze({
|
|
355
232
|
edit: true,
|
|
356
233
|
reload: true,
|
|
357
234
|
cancel: true,
|
|
@@ -360,7 +237,7 @@ var CAPABILITIES2 = Object.freeze({
|
|
|
360
237
|
var VercelUseChatThreadRuntime = class {
|
|
361
238
|
constructor(vercel) {
|
|
362
239
|
this.vercel = vercel;
|
|
363
|
-
this.useVercel =
|
|
240
|
+
this.useVercel = create(() => ({
|
|
364
241
|
vercel
|
|
365
242
|
}));
|
|
366
243
|
}
|
|
@@ -368,7 +245,7 @@ var VercelUseChatThreadRuntime = class {
|
|
|
368
245
|
repository = new MessageRepository();
|
|
369
246
|
assistantOptimisticId = null;
|
|
370
247
|
useVercel;
|
|
371
|
-
capabilities =
|
|
248
|
+
capabilities = CAPABILITIES;
|
|
372
249
|
messages = [];
|
|
373
250
|
isRunning = false;
|
|
374
251
|
getBranches(messageId) {
|
|
@@ -448,7 +325,7 @@ var VercelUseChatThreadRuntime = class {
|
|
|
448
325
|
vm.at(-1)?.id ?? null,
|
|
449
326
|
{
|
|
450
327
|
role: "assistant",
|
|
451
|
-
content: [
|
|
328
|
+
content: []
|
|
452
329
|
}
|
|
453
330
|
);
|
|
454
331
|
}
|
|
@@ -471,9 +348,9 @@ var VercelUseChatThreadRuntime = class {
|
|
|
471
348
|
};
|
|
472
349
|
|
|
473
350
|
// src/ui/use-chat/VercelUseChatRuntime.tsx
|
|
474
|
-
var { ProxyConfigProvider
|
|
475
|
-
var VercelUseChatRuntime = class extends
|
|
476
|
-
_proxyConfigProvider = new
|
|
351
|
+
var { ProxyConfigProvider, BaseAssistantRuntime } = INTERNAL2;
|
|
352
|
+
var VercelUseChatRuntime = class extends BaseAssistantRuntime {
|
|
353
|
+
_proxyConfigProvider = new ProxyConfigProvider();
|
|
477
354
|
constructor(vercel) {
|
|
478
355
|
super(new VercelUseChatThreadRuntime(vercel));
|
|
479
356
|
}
|
|
@@ -505,26 +382,26 @@ var VercelUseChatRuntime = class extends BaseAssistantRuntime2 {
|
|
|
505
382
|
|
|
506
383
|
// src/ui/use-chat/useVercelUseChatRuntime.tsx
|
|
507
384
|
var useVercelUseChatRuntime = (chatHelpers) => {
|
|
508
|
-
const [runtime] =
|
|
509
|
-
|
|
385
|
+
const [runtime] = useState(() => new VercelUseChatRuntime(chatHelpers));
|
|
386
|
+
useInsertionEffect(() => {
|
|
510
387
|
runtime.vercel = chatHelpers;
|
|
511
388
|
});
|
|
512
|
-
|
|
389
|
+
useEffect3(() => {
|
|
513
390
|
runtime.onVercelUpdated();
|
|
514
391
|
});
|
|
515
392
|
return runtime;
|
|
516
393
|
};
|
|
517
394
|
|
|
518
395
|
// src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
|
|
519
|
-
import { useEffect as
|
|
396
|
+
import { useEffect as useEffect4, useInsertionEffect as useInsertionEffect2, useState as useState2 } from "react";
|
|
520
397
|
|
|
521
398
|
// src/ui/use-assistant/VercelUseAssistantRuntime.tsx
|
|
522
|
-
import { INTERNAL as
|
|
399
|
+
import { INTERNAL as INTERNAL3 } from "@assistant-ui/react";
|
|
523
400
|
|
|
524
401
|
// src/ui/use-assistant/VercelUseAssistantThreadRuntime.tsx
|
|
525
|
-
import { create as
|
|
526
|
-
var
|
|
527
|
-
var
|
|
402
|
+
import { create as create2 } from "zustand";
|
|
403
|
+
var EMPTY_BRANCHES = Object.freeze([]);
|
|
404
|
+
var CAPABILITIES2 = Object.freeze({
|
|
528
405
|
edit: false,
|
|
529
406
|
reload: false,
|
|
530
407
|
cancel: false,
|
|
@@ -533,17 +410,17 @@ var CAPABILITIES3 = Object.freeze({
|
|
|
533
410
|
var VercelUseAssistantThreadRuntime = class {
|
|
534
411
|
constructor(vercel) {
|
|
535
412
|
this.vercel = vercel;
|
|
536
|
-
this.useVercel =
|
|
413
|
+
this.useVercel = create2(() => ({
|
|
537
414
|
vercel
|
|
538
415
|
}));
|
|
539
416
|
}
|
|
540
417
|
_subscriptions = /* @__PURE__ */ new Set();
|
|
541
|
-
capabilities =
|
|
418
|
+
capabilities = CAPABILITIES2;
|
|
542
419
|
useVercel;
|
|
543
420
|
messages = [];
|
|
544
421
|
isRunning = false;
|
|
545
422
|
getBranches() {
|
|
546
|
-
return
|
|
423
|
+
return EMPTY_BRANCHES;
|
|
547
424
|
}
|
|
548
425
|
switchToBranch() {
|
|
549
426
|
throw new Error(
|
|
@@ -590,9 +467,9 @@ var VercelUseAssistantThreadRuntime = class {
|
|
|
590
467
|
vm.push({
|
|
591
468
|
id: "__optimistic__result",
|
|
592
469
|
createdAt: /* @__PURE__ */ new Date(),
|
|
593
|
-
status: { type: "
|
|
470
|
+
status: { type: "running" },
|
|
594
471
|
role: "assistant",
|
|
595
|
-
content: [
|
|
472
|
+
content: []
|
|
596
473
|
});
|
|
597
474
|
}
|
|
598
475
|
this.messages = vm;
|
|
@@ -613,12 +490,12 @@ var VercelUseAssistantThreadRuntime = class {
|
|
|
613
490
|
};
|
|
614
491
|
|
|
615
492
|
// src/ui/use-assistant/VercelUseAssistantRuntime.tsx
|
|
616
|
-
var { ProxyConfigProvider:
|
|
493
|
+
var { ProxyConfigProvider: ProxyConfigProvider2, BaseAssistantRuntime: BaseAssistantRuntime2 } = INTERNAL3;
|
|
617
494
|
var hasUpcomingMessage2 = (isRunning, messages) => {
|
|
618
495
|
return isRunning && messages[messages.length - 1]?.role !== "assistant";
|
|
619
496
|
};
|
|
620
|
-
var VercelUseAssistantRuntime = class extends
|
|
621
|
-
_proxyConfigProvider = new
|
|
497
|
+
var VercelUseAssistantRuntime = class extends BaseAssistantRuntime2 {
|
|
498
|
+
_proxyConfigProvider = new ProxyConfigProvider2();
|
|
622
499
|
constructor(vercel) {
|
|
623
500
|
super(new VercelUseAssistantThreadRuntime(vercel));
|
|
624
501
|
}
|
|
@@ -648,13 +525,13 @@ var VercelUseAssistantRuntime = class extends BaseAssistantRuntime3 {
|
|
|
648
525
|
|
|
649
526
|
// src/ui/use-assistant/useVercelUseAssistantRuntime.tsx
|
|
650
527
|
var useVercelUseAssistantRuntime = (assistantHelpers) => {
|
|
651
|
-
const [runtime] =
|
|
528
|
+
const [runtime] = useState2(
|
|
652
529
|
() => new VercelUseAssistantRuntime(assistantHelpers)
|
|
653
530
|
);
|
|
654
|
-
|
|
531
|
+
useInsertionEffect2(() => {
|
|
655
532
|
runtime.vercel = assistantHelpers;
|
|
656
533
|
});
|
|
657
|
-
|
|
534
|
+
useEffect4(() => {
|
|
658
535
|
runtime.onVercelUpdated();
|
|
659
536
|
});
|
|
660
537
|
return runtime;
|