@assistant-ui/react-ai-sdk 1.3.25 → 1.3.27

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.
Files changed (104) hide show
  1. package/dist/frontendTools.d.ts +9 -5
  2. package/dist/frontendTools.d.ts.map +1 -1
  3. package/dist/frontendTools.js +36 -35
  4. package/dist/frontendTools.js.map +1 -1
  5. package/dist/index.d.ts +9 -11
  6. package/dist/index.js +9 -10
  7. package/dist/injectQuoteContext.d.ts +6 -2
  8. package/dist/injectQuoteContext.d.ts.map +1 -1
  9. package/dist/injectQuoteContext.js +46 -53
  10. package/dist/injectQuoteContext.js.map +1 -1
  11. package/dist/modelContentEnvelope.d.ts +12 -10
  12. package/dist/modelContentEnvelope.d.ts.map +1 -1
  13. package/dist/modelContentEnvelope.js +17 -15
  14. package/dist/modelContentEnvelope.js.map +1 -1
  15. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
  16. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
  17. package/dist/packages/assistant-stream/dist/core/AssistantStream.d.ts +1 -0
  18. package/dist/packages/assistant-stream/dist/core/AssistantStreamChunk.d.ts +1 -0
  19. package/dist/packages/assistant-stream/dist/core/accumulators/AssistantMessageStream.d.ts +1 -0
  20. package/dist/packages/assistant-stream/dist/core/accumulators/assistant-message-accumulator.d.ts +1 -0
  21. package/dist/packages/assistant-stream/dist/core/modules/assistant-stream.d.ts +1 -0
  22. package/dist/packages/assistant-stream/dist/core/modules/text.d.ts +1 -0
  23. package/dist/packages/assistant-stream/dist/core/modules/tool-call.d.ts +1 -0
  24. package/dist/packages/assistant-stream/dist/core/serialization/PlainText.d.ts +1 -0
  25. package/dist/packages/assistant-stream/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +1 -0
  26. package/dist/packages/assistant-stream/dist/core/serialization/data-stream/DataStream.d.ts +1 -0
  27. package/dist/packages/assistant-stream/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +1 -0
  28. package/dist/packages/assistant-stream/dist/core/tool/ToolExecutionStream.d.ts +1 -0
  29. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.d.ts +1 -0
  30. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js +50 -0
  31. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js.map +1 -0
  32. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts +43 -0
  33. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts.map +1 -0
  34. package/dist/packages/assistant-stream/dist/core/tool/toolResultStream.d.ts +1 -0
  35. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +1 -0
  36. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantTransformStream.d.ts +1 -0
  37. package/dist/packages/assistant-stream/dist/core/utils/types.d.ts +1 -0
  38. package/dist/packages/assistant-stream/dist/index.d.ts +1 -0
  39. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts +6 -0
  40. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -0
  41. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js +6 -0
  42. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -0
  43. package/dist/packages/assistant-stream/dist/resumable/index.d.ts +1 -0
  44. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts +10 -0
  45. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts.map +1 -0
  46. package/dist/packages/assistant-stream/dist/utils.d.ts +1 -0
  47. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts +8 -4
  48. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts.map +1 -1
  49. package/dist/ui/adapters/aiSDKFormatAdapter.js +24 -20
  50. package/dist/ui/adapters/aiSDKFormatAdapter.js.map +1 -1
  51. package/dist/ui/getVercelAIMessages.d.ts +7 -3
  52. package/dist/ui/getVercelAIMessages.d.ts.map +1 -1
  53. package/dist/ui/getVercelAIMessages.js +7 -3
  54. package/dist/ui/getVercelAIMessages.js.map +1 -1
  55. package/dist/ui/resumable.d.ts +18 -15
  56. package/dist/ui/resumable.d.ts.map +1 -1
  57. package/dist/ui/resumable.js +21 -20
  58. package/dist/ui/resumable.js.map +1 -1
  59. package/dist/ui/use-chat/AssistantChatTransport.d.ts +17 -14
  60. package/dist/ui/use-chat/AssistantChatTransport.d.ts.map +1 -1
  61. package/dist/ui/use-chat/AssistantChatTransport.js +98 -108
  62. package/dist/ui/use-chat/AssistantChatTransport.js.map +1 -1
  63. package/dist/ui/use-chat/useAISDKRuntime.d.ts +43 -33
  64. package/dist/ui/use-chat/useAISDKRuntime.d.ts.map +1 -1
  65. package/dist/ui/use-chat/useAISDKRuntime.js +176 -204
  66. package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -1
  67. package/dist/ui/use-chat/useChatRuntime.d.ts +19 -12
  68. package/dist/ui/use-chat/useChatRuntime.d.ts.map +1 -1
  69. package/dist/ui/use-chat/useChatRuntime.js +60 -81
  70. package/dist/ui/use-chat/useChatRuntime.js.map +1 -1
  71. package/dist/ui/use-chat/useExternalHistory.d.ts +8 -4
  72. package/dist/ui/use-chat/useExternalHistory.d.ts.map +1 -1
  73. package/dist/ui/use-chat/useExternalHistory.js +178 -200
  74. package/dist/ui/use-chat/useExternalHistory.js.map +1 -1
  75. package/dist/ui/use-chat/useStreamingTiming.d.ts +7 -3
  76. package/dist/ui/use-chat/useStreamingTiming.d.ts.map +1 -1
  77. package/dist/ui/use-chat/useStreamingTiming.js +60 -75
  78. package/dist/ui/use-chat/useStreamingTiming.js.map +1 -1
  79. package/dist/ui/utils/convertMessage.d.ts +29 -20
  80. package/dist/ui/utils/convertMessage.d.ts.map +1 -1
  81. package/dist/ui/utils/convertMessage.js +219 -286
  82. package/dist/ui/utils/convertMessage.js.map +1 -1
  83. package/dist/ui/utils/sliceMessagesUntil.d.ts +6 -2
  84. package/dist/ui/utils/sliceMessagesUntil.d.ts.map +1 -1
  85. package/dist/ui/utils/sliceMessagesUntil.js +10 -10
  86. package/dist/ui/utils/sliceMessagesUntil.js.map +1 -1
  87. package/dist/ui/utils/toCreateMessage.d.ts +7 -3
  88. package/dist/ui/utils/toCreateMessage.d.ts.map +1 -1
  89. package/dist/ui/utils/toCreateMessage.js +34 -38
  90. package/dist/ui/utils/toCreateMessage.js.map +1 -1
  91. package/dist/ui/utils/vercelAttachmentAdapter.d.ts +6 -2
  92. package/dist/ui/utils/vercelAttachmentAdapter.d.ts.map +1 -1
  93. package/dist/ui/utils/vercelAttachmentAdapter.js +37 -35
  94. package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -1
  95. package/dist/usage.d.ts +15 -12
  96. package/dist/usage.d.ts.map +1 -1
  97. package/dist/usage.js +80 -99
  98. package/dist/usage.js.map +1 -1
  99. package/package.json +12 -11
  100. package/src/ui/use-chat/useAISDKRuntime.test.ts +2 -2
  101. package/src/ui/utils/convertMessage.test.ts +28 -0
  102. package/src/ui/utils/convertMessage.ts +24 -6
  103. package/dist/index.d.ts.map +0 -1
  104. package/dist/index.js.map +0 -1
@@ -1,215 +1,187 @@
1
1
  "use client";
2
- import { useState, useMemo, useRef } from "react";
3
- import { isToolUIPart, generateId } from "ai";
4
- import { useExternalStoreRuntime, useRuntimeAdapters, useToolInvocations, } from "@assistant-ui/core/react";
5
- import { getExternalStoreMessages } from "@assistant-ui/core";
2
+ import { wrapModelContentEnvelope } from "../../modelContentEnvelope.js";
6
3
  import { sliceMessagesUntil } from "../utils/sliceMessagesUntil.js";
7
4
  import { toCreateMessage } from "../utils/toCreateMessage.js";
8
5
  import { vercelAttachmentAdapter } from "../utils/vercelAttachmentAdapter.js";
9
6
  import { getVercelAIMessages } from "../getVercelAIMessages.js";
10
7
  import { AISDKMessageConverter } from "../utils/convertMessage.js";
11
- import { wrapModelContentEnvelope } from "../../modelContentEnvelope.js";
12
- import { aiSDKV6FormatAdapter, } from "../adapters/aiSDKFormatAdapter.js";
13
- import { useExternalHistory, toExportedMessageRepository, } from "./useExternalHistory.js";
8
+ import { aiSDKV6FormatAdapter } from "../adapters/aiSDKFormatAdapter.js";
9
+ import { toExportedMessageRepository, useExternalHistory } from "./useExternalHistory.js";
14
10
  import { useStreamingTiming } from "./useStreamingTiming.js";
11
+ import { generateId, isToolUIPart } from "ai";
12
+ import { useMemo, useRef, useState } from "react";
13
+ import { useExternalStoreRuntime, useRuntimeAdapters, useToolInvocations } from "@assistant-ui/core/react";
14
+ import { getExternalStoreMessages } from "@assistant-ui/core";
15
+ //#region src/ui/use-chat/useAISDKRuntime.ts
15
16
  const toUIMessage = (createMessage, fallbackRole) => ({
16
- ...createMessage,
17
- id: createMessage.id ?? generateId(),
18
- role: createMessage.role ?? fallbackRole,
17
+ ...createMessage,
18
+ id: createMessage.id ?? generateId(),
19
+ role: createMessage.role ?? fallbackRole
19
20
  });
20
- export const useAISDKRuntime = (chatHelpers, { adapters, toCreateMessage: customToCreateMessage, cancelPendingToolCallsOnSend = true, onResume, suggestions, } = {}) => {
21
- const contextAdapters = useRuntimeAdapters();
22
- const [toolStatuses, setToolStatuses] = useState({});
23
- const toolArgsKeyOrderCacheRef = useRef(new Map());
24
- const toolLastInputCacheRef = useRef(new Map());
25
- const mcpAppMetadataCacheRef = useRef(new Map());
26
- const lastRunConfigRef = useRef(undefined);
27
- const hasExecutingTools = Object.values(toolStatuses).some((s) => s?.type === "executing");
28
- const isRunning = chatHelpers.status === "submitted" ||
29
- chatHelpers.status === "streaming" ||
30
- hasExecutingTools;
31
- const messageTiming = useStreamingTiming(chatHelpers.messages, isRunning);
32
- const messages = AISDKMessageConverter.useThreadMessages({
33
- isRunning,
34
- messages: chatHelpers.messages,
35
- metadata: useMemo(() => ({
36
- toolStatuses,
37
- messageTiming,
38
- toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,
39
- toolLastInputCache: toolLastInputCacheRef.current,
40
- mcpAppMetadataCache: mcpAppMetadataCacheRef.current,
41
- ...(chatHelpers.error && { error: chatHelpers.error.message }),
42
- }), [toolStatuses, messageTiming, chatHelpers.error]),
43
- });
44
- const [runtimeRef] = useState(() => ({
45
- get current() {
46
- return runtime;
47
- },
48
- }));
49
- const toolInvocations = useToolInvocations({
50
- state: {
51
- messages,
52
- isRunning,
53
- },
54
- getTools: () => runtimeRef.current.thread.getModelContext().tools,
55
- onResult: (command) => {
56
- if (command.type === "add-tool-result") {
57
- const output = command.modelContent !== undefined
58
- ? wrapModelContentEnvelope(command.result, command.modelContent)
59
- : command.result;
60
- chatHelpers.addToolResult({
61
- tool: command.toolName,
62
- toolCallId: command.toolCallId,
63
- output,
64
- options: { metadata: lastRunConfigRef.current },
65
- });
66
- }
67
- },
68
- setToolStatuses,
69
- });
70
- const isLoading = useExternalHistory(runtimeRef, adapters?.history ?? contextAdapters?.history, AISDKMessageConverter.toThreadMessages, aiSDKV6FormatAdapter, (messages) => {
71
- chatHelpers.setMessages(messages);
72
- });
73
- const completePendingToolCalls = async () => {
74
- if (!cancelPendingToolCallsOnSend)
75
- return;
76
- await toolInvocations.abort();
77
- // Mark any tool without a result as cancelled (uses setMessages to avoid triggering sendAutomaticallyWhen)
78
- chatHelpers.setMessages((messages) => {
79
- const lastMessage = messages.at(-1);
80
- if (lastMessage?.role !== "assistant")
81
- return messages;
82
- let hasChanges = false;
83
- const parts = lastMessage.parts?.map((part) => {
84
- if (!isToolUIPart(part))
85
- return part;
86
- if (part.state === "output-available" || part.state === "output-error")
87
- return part;
88
- hasChanges = true;
89
- return {
90
- ...part,
91
- state: "output-error",
92
- errorText: "User cancelled tool call by sending a new message.",
93
- };
94
- });
95
- if (!hasChanges)
96
- return messages;
97
- return [...messages.slice(0, -1), { ...lastMessage, parts }];
98
- });
99
- };
100
- const runtime = useExternalStoreRuntime({
101
- isRunning,
102
- messages,
103
- setMessages: (messages) => chatHelpers.setMessages(messages
104
- .map((getVercelAIMessages))
105
- .filter(Boolean)
106
- .flat()),
107
- onImport: (messages) => chatHelpers.setMessages(messages
108
- .map((getVercelAIMessages))
109
- .filter(Boolean)
110
- .flat()),
111
- onExportExternalState: () => {
112
- const exported = runtimeRef.current.thread.export();
113
- const expandedMessages = [];
114
- const lastInnerIdMap = new Map();
115
- for (const item of exported.messages) {
116
- const innerMessages = getExternalStoreMessages(item.message);
117
- let parentId = item.parentId != null
118
- ? (lastInnerIdMap.get(item.parentId) ?? item.parentId)
119
- : null;
120
- for (const innerMessage of innerMessages) {
121
- expandedMessages.push({ parentId, message: innerMessage });
122
- parentId = aiSDKV6FormatAdapter.getId(innerMessage);
123
- }
124
- if (innerMessages.length > 0) {
125
- lastInnerIdMap.set(item.message.id, aiSDKV6FormatAdapter.getId(innerMessages[innerMessages.length - 1]));
126
- }
127
- }
128
- const result = {
129
- messages: expandedMessages,
130
- };
131
- if (exported.headId != null) {
132
- result.headId = lastInnerIdMap.get(exported.headId) ?? exported.headId;
133
- }
134
- return result;
135
- },
136
- onLoadExternalState: (repo) => {
137
- // Convert MessageFormatRepository to ExportedMessageRepository
138
- const exportedRepo = toExportedMessageRepository(AISDKMessageConverter.toThreadMessages, repo);
139
- // Import into the thread's MessageRepository
140
- runtimeRef.current.thread.import(exportedRepo);
141
- },
142
- onCancel: async () => {
143
- chatHelpers.stop();
144
- await toolInvocations.abort();
145
- },
146
- onNew: async (message) => {
147
- const createMessage = (customToCreateMessage ?? toCreateMessage)(message);
148
- if (!(message.startRun ?? message.role === "user")) {
149
- chatHelpers.setMessages((current) => [
150
- ...current,
151
- toUIMessage(createMessage, message.role),
152
- ]);
153
- return;
154
- }
155
- lastRunConfigRef.current = message.runConfig;
156
- await completePendingToolCalls();
157
- await chatHelpers.sendMessage(createMessage, {
158
- metadata: message.runConfig,
159
- });
160
- },
161
- onEdit: async (message) => {
162
- const createMessage = (customToCreateMessage ?? toCreateMessage)(message);
163
- if (!(message.startRun ?? message.role === "user")) {
164
- chatHelpers.setMessages((current) => [
165
- ...sliceMessagesUntil(current, message.parentId),
166
- toUIMessage(createMessage, message.role),
167
- ]);
168
- return;
169
- }
170
- lastRunConfigRef.current = message.runConfig;
171
- chatHelpers.setMessages((current) => sliceMessagesUntil(current, message.parentId));
172
- await chatHelpers.sendMessage(createMessage, {
173
- metadata: message.runConfig,
174
- });
175
- },
176
- onReload: async (parentId, config) => {
177
- lastRunConfigRef.current = config.runConfig;
178
- const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);
179
- chatHelpers.setMessages(newMessages);
180
- await chatHelpers.regenerate({ metadata: config.runConfig });
181
- },
182
- onAddToolResult: ({ toolCallId, result, isError }) => {
183
- const options = { metadata: lastRunConfigRef.current };
184
- if (isError) {
185
- chatHelpers.addToolOutput({
186
- state: "output-error",
187
- tool: toolCallId,
188
- toolCallId,
189
- errorText: typeof result === "string" ? result : JSON.stringify(result),
190
- options,
191
- });
192
- }
193
- else {
194
- chatHelpers.addToolOutput({
195
- state: "output-available",
196
- tool: toolCallId,
197
- toolCallId,
198
- output: result,
199
- options,
200
- });
201
- }
202
- },
203
- onResumeToolCall: (options) => toolInvocations.resume(options.toolCallId, options.payload),
204
- ...(onResume && { onResume }),
205
- ...(suggestions && { suggestions }),
206
- adapters: {
207
- attachments: vercelAttachmentAdapter,
208
- ...contextAdapters,
209
- ...adapters,
210
- },
211
- isLoading,
212
- });
213
- return runtime;
21
+ const useAISDKRuntime = (chatHelpers, { adapters, toCreateMessage: customToCreateMessage, cancelPendingToolCallsOnSend = true, onResume, suggestions } = {}) => {
22
+ const contextAdapters = useRuntimeAdapters();
23
+ const [toolStatuses, setToolStatuses] = useState({});
24
+ const toolArgsKeyOrderCacheRef = useRef(/* @__PURE__ */ new Map());
25
+ const toolLastInputCacheRef = useRef(/* @__PURE__ */ new Map());
26
+ const mcpAppMetadataCacheRef = useRef(/* @__PURE__ */ new Map());
27
+ const lastRunConfigRef = useRef(void 0);
28
+ const hasExecutingTools = Object.values(toolStatuses).some((s) => s?.type === "executing");
29
+ const isRunning = chatHelpers.status === "submitted" || chatHelpers.status === "streaming" || hasExecutingTools;
30
+ const messageTiming = useStreamingTiming(chatHelpers.messages, isRunning);
31
+ const messages = AISDKMessageConverter.useThreadMessages({
32
+ isRunning,
33
+ messages: chatHelpers.messages,
34
+ metadata: useMemo(() => ({
35
+ toolStatuses,
36
+ messageTiming,
37
+ toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,
38
+ toolLastInputCache: toolLastInputCacheRef.current,
39
+ mcpAppMetadataCache: mcpAppMetadataCacheRef.current,
40
+ ...chatHelpers.error && { error: chatHelpers.error.message }
41
+ }), [
42
+ toolStatuses,
43
+ messageTiming,
44
+ chatHelpers.error
45
+ ])
46
+ });
47
+ const [runtimeRef] = useState(() => ({ get current() {
48
+ return runtime;
49
+ } }));
50
+ const toolInvocations = useToolInvocations({
51
+ state: {
52
+ messages,
53
+ isRunning
54
+ },
55
+ getTools: () => runtimeRef.current.thread.getModelContext().tools,
56
+ onResult: (command) => {
57
+ if (command.type === "add-tool-result") {
58
+ const output = command.modelContent !== void 0 ? wrapModelContentEnvelope(command.result, command.modelContent) : command.result;
59
+ chatHelpers.addToolResult({
60
+ tool: command.toolName,
61
+ toolCallId: command.toolCallId,
62
+ output,
63
+ options: { metadata: lastRunConfigRef.current }
64
+ });
65
+ }
66
+ },
67
+ setToolStatuses
68
+ });
69
+ const isLoading = useExternalHistory(runtimeRef, adapters?.history ?? contextAdapters?.history, AISDKMessageConverter.toThreadMessages, aiSDKV6FormatAdapter, (messages) => {
70
+ chatHelpers.setMessages(messages);
71
+ });
72
+ const completePendingToolCalls = async () => {
73
+ if (!cancelPendingToolCallsOnSend) return;
74
+ await toolInvocations.abort();
75
+ chatHelpers.setMessages((messages) => {
76
+ const lastMessage = messages.at(-1);
77
+ if (lastMessage?.role !== "assistant") return messages;
78
+ let hasChanges = false;
79
+ const parts = lastMessage.parts?.map((part) => {
80
+ if (!isToolUIPart(part)) return part;
81
+ if (part.state === "output-available" || part.state === "output-error") return part;
82
+ hasChanges = true;
83
+ return {
84
+ ...part,
85
+ state: "output-error",
86
+ errorText: "User cancelled tool call by sending a new message."
87
+ };
88
+ });
89
+ if (!hasChanges) return messages;
90
+ return [...messages.slice(0, -1), {
91
+ ...lastMessage,
92
+ parts
93
+ }];
94
+ });
95
+ };
96
+ const runtime = useExternalStoreRuntime({
97
+ isRunning,
98
+ messages,
99
+ setMessages: (messages) => chatHelpers.setMessages(messages.map(getVercelAIMessages).filter(Boolean).flat()),
100
+ onImport: (messages) => chatHelpers.setMessages(messages.map(getVercelAIMessages).filter(Boolean).flat()),
101
+ onExportExternalState: () => {
102
+ const exported = runtimeRef.current.thread.export();
103
+ const expandedMessages = [];
104
+ const lastInnerIdMap = /* @__PURE__ */ new Map();
105
+ for (const item of exported.messages) {
106
+ const innerMessages = getExternalStoreMessages(item.message);
107
+ let parentId = item.parentId != null ? lastInnerIdMap.get(item.parentId) ?? item.parentId : null;
108
+ for (const innerMessage of innerMessages) {
109
+ expandedMessages.push({
110
+ parentId,
111
+ message: innerMessage
112
+ });
113
+ parentId = aiSDKV6FormatAdapter.getId(innerMessage);
114
+ }
115
+ if (innerMessages.length > 0) lastInnerIdMap.set(item.message.id, aiSDKV6FormatAdapter.getId(innerMessages[innerMessages.length - 1]));
116
+ }
117
+ const result = { messages: expandedMessages };
118
+ if (exported.headId != null) result.headId = lastInnerIdMap.get(exported.headId) ?? exported.headId;
119
+ return result;
120
+ },
121
+ onLoadExternalState: (repo) => {
122
+ const exportedRepo = toExportedMessageRepository(AISDKMessageConverter.toThreadMessages, repo);
123
+ runtimeRef.current.thread.import(exportedRepo);
124
+ },
125
+ onCancel: async () => {
126
+ chatHelpers.stop();
127
+ await toolInvocations.abort();
128
+ },
129
+ onNew: async (message) => {
130
+ const createMessage = (customToCreateMessage ?? toCreateMessage)(message);
131
+ if (!(message.startRun ?? message.role === "user")) {
132
+ chatHelpers.setMessages((current) => [...current, toUIMessage(createMessage, message.role)]);
133
+ return;
134
+ }
135
+ lastRunConfigRef.current = message.runConfig;
136
+ await completePendingToolCalls();
137
+ await chatHelpers.sendMessage(createMessage, { metadata: message.runConfig });
138
+ },
139
+ onEdit: async (message) => {
140
+ const createMessage = (customToCreateMessage ?? toCreateMessage)(message);
141
+ if (!(message.startRun ?? message.role === "user")) {
142
+ chatHelpers.setMessages((current) => [...sliceMessagesUntil(current, message.parentId), toUIMessage(createMessage, message.role)]);
143
+ return;
144
+ }
145
+ lastRunConfigRef.current = message.runConfig;
146
+ chatHelpers.setMessages((current) => sliceMessagesUntil(current, message.parentId));
147
+ await chatHelpers.sendMessage(createMessage, { metadata: message.runConfig });
148
+ },
149
+ onReload: async (parentId, config) => {
150
+ lastRunConfigRef.current = config.runConfig;
151
+ const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);
152
+ chatHelpers.setMessages(newMessages);
153
+ await chatHelpers.regenerate({ metadata: config.runConfig });
154
+ },
155
+ onAddToolResult: ({ toolCallId, result, isError }) => {
156
+ const options = { metadata: lastRunConfigRef.current };
157
+ if (isError) chatHelpers.addToolOutput({
158
+ state: "output-error",
159
+ tool: toolCallId,
160
+ toolCallId,
161
+ errorText: typeof result === "string" ? result : JSON.stringify(result),
162
+ options
163
+ });
164
+ else chatHelpers.addToolOutput({
165
+ state: "output-available",
166
+ tool: toolCallId,
167
+ toolCallId,
168
+ output: result,
169
+ options
170
+ });
171
+ },
172
+ onResumeToolCall: (options) => toolInvocations.resume(options.toolCallId, options.payload),
173
+ ...onResume && { onResume },
174
+ ...suggestions && { suggestions },
175
+ adapters: {
176
+ attachments: vercelAttachmentAdapter,
177
+ ...contextAdapters,
178
+ ...adapters
179
+ },
180
+ isLoading
181
+ });
182
+ return runtime;
214
183
  };
184
+ //#endregion
185
+ export { useAISDKRuntime };
186
+
215
187
  //# sourceMappingURL=useAISDKRuntime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAISDKRuntime.js","sourceRoot":"","sources":["../../../src/ui/use-chat/useAISDKRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAISDKRuntime.js","names":[],"sources":["../../../src/ui/use-chat/useAISDKRuntime.ts"],"sourcesContent":["\"use client\";\n\nimport { useState, useMemo, useRef } from \"react\";\nimport type { UIMessage, useChat, CreateUIMessage } from \"@ai-sdk/react\";\nimport { isToolUIPart, generateId } from \"ai\";\nimport {\n useExternalStoreRuntime,\n useRuntimeAdapters,\n useToolInvocations,\n type ToolExecutionStatus,\n} from \"@assistant-ui/core/react\";\nimport type {\n ExternalStoreAdapter,\n ThreadHistoryAdapter,\n AssistantRuntime,\n ThreadMessage,\n ThreadSuggestion,\n MessageFormatAdapter,\n MessageFormatItem,\n MessageFormatRepository,\n AppendMessage,\n RunConfig,\n McpAppMetadata,\n} from \"@assistant-ui/core\";\nimport { getExternalStoreMessages } from \"@assistant-ui/core\";\nimport type { ReadonlyJSONObject } from \"assistant-stream/utils\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { AISDKMessageConverter } from \"../utils/convertMessage\";\nimport { wrapModelContentEnvelope } from \"../../modelContentEnvelope\";\nimport {\n type AISDKStorageFormat,\n aiSDKV6FormatAdapter,\n} from \"../adapters/aiSDKFormatAdapter\";\nimport {\n useExternalHistory,\n toExportedMessageRepository,\n} from \"./useExternalHistory\";\nimport { useStreamingTiming } from \"./useStreamingTiming\";\n\nexport type CustomToCreateMessageFunction = <\n UI_MESSAGE extends UIMessage = UIMessage,\n>(\n message: AppendMessage,\n) => CreateUIMessage<UI_MESSAGE>;\n\nconst toUIMessage = <UI_MESSAGE extends UIMessage>(\n createMessage: CreateUIMessage<UI_MESSAGE>,\n fallbackRole: UI_MESSAGE[\"role\"],\n): UI_MESSAGE =>\n ({\n ...createMessage,\n id: createMessage.id ?? generateId(),\n role: createMessage.role ?? fallbackRole,\n }) as UI_MESSAGE;\n\nexport type AISDKRuntimeAdapter = {\n adapters?:\n | (NonNullable<ExternalStoreAdapter[\"adapters\"]> & {\n history?: ThreadHistoryAdapter | undefined;\n })\n | undefined;\n toCreateMessage?: CustomToCreateMessageFunction;\n /**\n * Whether to automatically cancel pending interactive tool calls when the user sends a new message.\n *\n * When enabled (default), the pending tool calls will be marked as failed with an error message\n * indicating the user cancelled the tool call by sending a new message.\n *\n * @default true\n */\n cancelPendingToolCallsOnSend?: boolean | undefined;\n /**\n * Called when `runtime.thread.resumeRun(config)` is invoked.\n *\n * When omitted, `resumeRun` throws `\"Runtime does not support resuming runs.\"`.\n * Provide this to bridge resume invocations into a custom replay channel\n * (for example, an SSE reconnect endpoint keyed by turn id).\n */\n onResume?: ExternalStoreAdapter[\"onResume\"];\n /**\n * Follow up suggestions to surface on the thread. Use this to drive\n * dynamic suggestions from application state, tool results, or backend\n * responses; flows into `thread.suggestions` and is rendered by\n * components that read it (such as the shadcn `ThreadFollowupSuggestions`).\n */\n suggestions?: readonly ThreadSuggestion[] | undefined;\n};\n\nexport const useAISDKRuntime = <UI_MESSAGE extends UIMessage = UIMessage>(\n chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>,\n {\n adapters,\n toCreateMessage: customToCreateMessage,\n cancelPendingToolCallsOnSend = true,\n onResume,\n suggestions,\n }: AISDKRuntimeAdapter = {},\n) => {\n const contextAdapters = useRuntimeAdapters();\n const [toolStatuses, setToolStatuses] = useState<\n Record<string, ToolExecutionStatus>\n >({});\n const toolArgsKeyOrderCacheRef = useRef<Map<string, Map<string, string[]>>>(\n new Map(),\n );\n const toolLastInputCacheRef = useRef<Map<string, ReadonlyJSONObject>>(\n new Map(),\n );\n const mcpAppMetadataCacheRef = useRef<Map<string, McpAppMetadata>>(new Map());\n const lastRunConfigRef = useRef<RunConfig | undefined>(undefined);\n\n const hasExecutingTools = Object.values(toolStatuses).some(\n (s) => s?.type === \"executing\",\n );\n const isRunning =\n chatHelpers.status === \"submitted\" ||\n chatHelpers.status === \"streaming\" ||\n hasExecutingTools;\n\n const messageTiming = useStreamingTiming(chatHelpers.messages, isRunning);\n\n const messages = AISDKMessageConverter.useThreadMessages({\n isRunning,\n messages: chatHelpers.messages,\n metadata: useMemo(\n () => ({\n toolStatuses,\n messageTiming,\n toolArgsKeyOrderCache: toolArgsKeyOrderCacheRef.current,\n toolLastInputCache: toolLastInputCacheRef.current,\n mcpAppMetadataCache: mcpAppMetadataCacheRef.current,\n ...(chatHelpers.error && { error: chatHelpers.error.message }),\n }),\n [toolStatuses, messageTiming, chatHelpers.error],\n ),\n });\n\n const [runtimeRef] = useState(() => ({\n get current(): AssistantRuntime {\n return runtime;\n },\n }));\n\n const toolInvocations = useToolInvocations({\n state: {\n messages,\n isRunning,\n },\n getTools: () => runtimeRef.current.thread.getModelContext().tools,\n onResult: (command) => {\n if (command.type === \"add-tool-result\") {\n const output =\n command.modelContent !== undefined\n ? wrapModelContentEnvelope(command.result, command.modelContent)\n : command.result;\n chatHelpers.addToolResult({\n tool: command.toolName,\n toolCallId: command.toolCallId,\n output,\n options: { metadata: lastRunConfigRef.current },\n });\n }\n },\n setToolStatuses,\n });\n\n const isLoading = useExternalHistory(\n runtimeRef,\n adapters?.history ?? contextAdapters?.history,\n AISDKMessageConverter.toThreadMessages as (\n messages: UI_MESSAGE[],\n ) => ThreadMessage[],\n aiSDKV6FormatAdapter as MessageFormatAdapter<\n UI_MESSAGE,\n AISDKStorageFormat\n >,\n (messages) => {\n chatHelpers.setMessages(messages);\n },\n );\n\n const completePendingToolCalls = async () => {\n if (!cancelPendingToolCallsOnSend) return;\n\n await toolInvocations.abort();\n\n // Mark any tool without a result as cancelled (uses setMessages to avoid triggering sendAutomaticallyWhen)\n chatHelpers.setMessages((messages) => {\n const lastMessage = messages.at(-1);\n if (lastMessage?.role !== \"assistant\") return messages;\n\n let hasChanges = false;\n const parts = lastMessage.parts?.map((part) => {\n if (!isToolUIPart(part)) return part;\n if (part.state === \"output-available\" || part.state === \"output-error\")\n return part;\n\n hasChanges = true;\n return {\n ...part,\n state: \"output-error\" as const,\n errorText: \"User cancelled tool call by sending a new message.\",\n };\n });\n\n if (!hasChanges) return messages;\n return [...messages.slice(0, -1), { ...lastMessage, parts }];\n });\n };\n\n const runtime = useExternalStoreRuntime({\n isRunning,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onImport: (messages) =>\n chatHelpers.setMessages(\n messages\n .map(getVercelAIMessages<UI_MESSAGE>)\n .filter(Boolean)\n .flat(),\n ),\n onExportExternalState: (): MessageFormatRepository<UI_MESSAGE> => {\n const exported = runtimeRef.current.thread.export();\n\n const expandedMessages: MessageFormatItem<UI_MESSAGE>[] = [];\n const lastInnerIdMap = new Map<string, string>();\n\n for (const item of exported.messages) {\n const innerMessages = getExternalStoreMessages<UI_MESSAGE>(\n item.message,\n );\n let parentId =\n item.parentId != null\n ? (lastInnerIdMap.get(item.parentId) ?? item.parentId)\n : null;\n for (const innerMessage of innerMessages) {\n expandedMessages.push({ parentId, message: innerMessage });\n parentId = aiSDKV6FormatAdapter.getId(innerMessage as UIMessage);\n }\n if (innerMessages.length > 0) {\n lastInnerIdMap.set(\n item.message.id,\n aiSDKV6FormatAdapter.getId(\n innerMessages[innerMessages.length - 1]! as UIMessage,\n ),\n );\n }\n }\n\n const result: MessageFormatRepository<UI_MESSAGE> = {\n messages: expandedMessages,\n };\n\n if (exported.headId != null) {\n result.headId = lastInnerIdMap.get(exported.headId) ?? exported.headId;\n }\n\n return result;\n },\n onLoadExternalState: (repo: MessageFormatRepository<UI_MESSAGE>) => {\n // Convert MessageFormatRepository to ExportedMessageRepository\n const exportedRepo = toExportedMessageRepository(\n AISDKMessageConverter.toThreadMessages,\n repo,\n );\n\n // Import into the thread's MessageRepository\n runtimeRef.current.thread.import(exportedRepo);\n },\n onCancel: async () => {\n chatHelpers.stop();\n await toolInvocations.abort();\n },\n onNew: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...current,\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n await completePendingToolCalls();\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onEdit: async (message) => {\n const createMessage = (\n customToCreateMessage ?? toCreateMessage\n )<UI_MESSAGE>(message);\n\n if (!(message.startRun ?? message.role === \"user\")) {\n chatHelpers.setMessages((current) => [\n ...sliceMessagesUntil(current, message.parentId),\n toUIMessage<UI_MESSAGE>(createMessage, message.role),\n ]);\n return;\n }\n\n lastRunConfigRef.current = message.runConfig;\n chatHelpers.setMessages((current) =>\n sliceMessagesUntil(current, message.parentId),\n );\n await chatHelpers.sendMessage(createMessage, {\n metadata: message.runConfig,\n });\n },\n onReload: async (parentId: string | null, config) => {\n lastRunConfigRef.current = config.runConfig;\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.regenerate({ metadata: config.runConfig });\n },\n onAddToolResult: ({ toolCallId, result, isError }) => {\n const options = { metadata: lastRunConfigRef.current };\n if (isError) {\n chatHelpers.addToolOutput({\n state: \"output-error\",\n tool: toolCallId,\n toolCallId,\n errorText:\n typeof result === \"string\" ? result : JSON.stringify(result),\n options,\n });\n } else {\n chatHelpers.addToolOutput({\n state: \"output-available\",\n tool: toolCallId,\n toolCallId,\n output: result,\n options,\n });\n }\n },\n onResumeToolCall: (options) =>\n toolInvocations.resume(options.toolCallId, options.payload),\n ...(onResume && { onResume }),\n ...(suggestions && { suggestions }),\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...contextAdapters,\n ...adapters,\n },\n isLoading,\n });\n\n return runtime;\n};\n"],"mappings":"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"}
@@ -1,14 +1,21 @@
1
- import { type UIMessage } from "@ai-sdk/react";
2
- import type { AssistantCloud } from "assistant-cloud";
3
- import type { AssistantRuntime } from "@assistant-ui/core";
4
- import { type AISDKRuntimeAdapter, type CustomToCreateMessageFunction } from "./useAISDKRuntime.js";
5
- import type { ChatInit } from "ai";
6
- export type UseChatRuntimeOptions<UI_MESSAGE extends UIMessage = UIMessage> = ChatInit<UI_MESSAGE> & {
7
- cloud?: AssistantCloud | undefined;
8
- adapters?: AISDKRuntimeAdapter["adapters"] | undefined;
9
- toCreateMessage?: CustomToCreateMessageFunction;
10
- onResume?: AISDKRuntimeAdapter["onResume"];
11
- suggestions?: AISDKRuntimeAdapter["suggestions"];
1
+ import { AISDKRuntimeAdapter, CustomToCreateMessageFunction } from "./useAISDKRuntime.js";
2
+ import { ChatInit } from "ai";
3
+ import { AssistantRuntime } from "@assistant-ui/core";
4
+ import { UIMessage as UIMessage$1 } from "@ai-sdk/react";
5
+ import { AssistantCloud } from "assistant-cloud";
6
+
7
+ //#region src/ui/use-chat/useChatRuntime.d.ts
8
+ type UseChatRuntimeOptions<UI_MESSAGE extends UIMessage$1 = UIMessage$1> = ChatInit<UI_MESSAGE> & {
9
+ cloud?: AssistantCloud | undefined;
10
+ adapters?: AISDKRuntimeAdapter["adapters"] | undefined;
11
+ toCreateMessage?: CustomToCreateMessageFunction;
12
+ onResume?: AISDKRuntimeAdapter["onResume"];
13
+ suggestions?: AISDKRuntimeAdapter["suggestions"];
12
14
  };
13
- export declare const useChatRuntime: <UI_MESSAGE extends UIMessage = UIMessage>({ cloud, ...options }?: UseChatRuntimeOptions<UI_MESSAGE>) => AssistantRuntime;
15
+ declare const useChatRuntime: <UI_MESSAGE extends UIMessage$1 = UIMessage$1>({
16
+ cloud,
17
+ ...options
18
+ }?: UseChatRuntimeOptions<UI_MESSAGE>) => AssistantRuntime;
19
+ //#endregion
20
+ export { UseChatRuntimeOptions, useChatRuntime };
14
21
  //# sourceMappingURL=useChatRuntime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useChatRuntime.d.ts","sourceRoot":"","sources":["../../../src/ui/use-chat/useChatRuntime.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAM3D,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,EACnC,6BAA0B;AAC3B,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,IAAI,CAAC;AAKlD,MAAM,MAAM,qBAAqB,CAAC,UAAU,SAAS,SAAS,GAAG,SAAS,IACxE,QAAQ,CAAC,UAAU,CAAC,GAAG;IACrB,KAAK,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;IACvD,eAAe,CAAC,EAAE,6BAA6B,CAAC;IAChD,QAAQ,CAAC,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;CAClD,CAAC;AAyGJ,eAAO,MAAM,cAAc,GAAI,UAAU,SAAS,SAAS,GAAG,SAAS,EAAE,wBAGtE,qBAAqB,CAAC,UAAU,CAAM,KAAG,gBAU3C,CAAC"}
1
+ {"version":3,"file":"useChatRuntime.d.ts","names":[],"sources":["../../../src/ui/use-chat/useChatRuntime.ts"],"mappings":";;;;;;;KAoBY,qBAAA,oBAAyC,WAAA,GAAY,WAAA,IAC/D,QAAA,CAAS,UAAA;EACP,KAAA,GAAQ,cAAA;EACR,QAAA,GAAW,mBAAA;EACX,eAAA,GAAkB,6BAAA;EAClB,QAAA,GAAW,mBAAA;EACX,WAAA,GAAc,mBAAA;AAAA;AAAA,cA0GL,cAAA,sBAAqC,WAAA,GAAY,WAAA;EAAW,KAAA;EAAA,GAAA;AAAA,IAGtE,qBAAA,CAAsB,UAAA,MAAmB,gBAAA"}