@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.
- package/dist/frontendTools.d.ts +9 -5
- package/dist/frontendTools.d.ts.map +1 -1
- package/dist/frontendTools.js +36 -35
- package/dist/frontendTools.js.map +1 -1
- package/dist/index.d.ts +9 -11
- package/dist/index.js +9 -10
- package/dist/injectQuoteContext.d.ts +6 -2
- package/dist/injectQuoteContext.d.ts.map +1 -1
- package/dist/injectQuoteContext.js +46 -53
- package/dist/injectQuoteContext.js.map +1 -1
- package/dist/modelContentEnvelope.d.ts +12 -10
- package/dist/modelContentEnvelope.d.ts.map +1 -1
- package/dist/modelContentEnvelope.js +17 -15
- package/dist/modelContentEnvelope.js.map +1 -1
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
- package/dist/packages/assistant-stream/dist/core/AssistantStream.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/AssistantStreamChunk.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/accumulators/AssistantMessageStream.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/accumulators/assistant-message-accumulator.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/modules/assistant-stream.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/modules/text.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/modules/tool-call.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/serialization/PlainText.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/serialization/data-stream/DataStream.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/tool/ToolExecutionStream.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/tool/schema-utils.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js +50 -0
- package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js.map +1 -0
- package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts +43 -0
- package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts.map +1 -0
- package/dist/packages/assistant-stream/dist/core/tool/toolResultStream.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantTransformStream.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/core/utils/types.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/index.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts +6 -0
- package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -0
- package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js +6 -0
- package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -0
- package/dist/packages/assistant-stream/dist/resumable/index.d.ts +1 -0
- package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts +10 -0
- package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts.map +1 -0
- package/dist/packages/assistant-stream/dist/utils.d.ts +1 -0
- package/dist/ui/adapters/aiSDKFormatAdapter.d.ts +8 -4
- package/dist/ui/adapters/aiSDKFormatAdapter.d.ts.map +1 -1
- package/dist/ui/adapters/aiSDKFormatAdapter.js +24 -20
- package/dist/ui/adapters/aiSDKFormatAdapter.js.map +1 -1
- package/dist/ui/getVercelAIMessages.d.ts +7 -3
- package/dist/ui/getVercelAIMessages.d.ts.map +1 -1
- package/dist/ui/getVercelAIMessages.js +7 -3
- package/dist/ui/getVercelAIMessages.js.map +1 -1
- package/dist/ui/resumable.d.ts +18 -15
- package/dist/ui/resumable.d.ts.map +1 -1
- package/dist/ui/resumable.js +21 -20
- package/dist/ui/resumable.js.map +1 -1
- package/dist/ui/use-chat/AssistantChatTransport.d.ts +17 -14
- package/dist/ui/use-chat/AssistantChatTransport.d.ts.map +1 -1
- package/dist/ui/use-chat/AssistantChatTransport.js +98 -108
- package/dist/ui/use-chat/AssistantChatTransport.js.map +1 -1
- package/dist/ui/use-chat/useAISDKRuntime.d.ts +43 -33
- package/dist/ui/use-chat/useAISDKRuntime.d.ts.map +1 -1
- package/dist/ui/use-chat/useAISDKRuntime.js +176 -204
- package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -1
- package/dist/ui/use-chat/useChatRuntime.d.ts +19 -12
- package/dist/ui/use-chat/useChatRuntime.d.ts.map +1 -1
- package/dist/ui/use-chat/useChatRuntime.js +60 -81
- package/dist/ui/use-chat/useChatRuntime.js.map +1 -1
- package/dist/ui/use-chat/useExternalHistory.d.ts +8 -4
- package/dist/ui/use-chat/useExternalHistory.d.ts.map +1 -1
- package/dist/ui/use-chat/useExternalHistory.js +178 -200
- package/dist/ui/use-chat/useExternalHistory.js.map +1 -1
- package/dist/ui/use-chat/useStreamingTiming.d.ts +7 -3
- package/dist/ui/use-chat/useStreamingTiming.d.ts.map +1 -1
- package/dist/ui/use-chat/useStreamingTiming.js +60 -75
- package/dist/ui/use-chat/useStreamingTiming.js.map +1 -1
- package/dist/ui/utils/convertMessage.d.ts +29 -20
- package/dist/ui/utils/convertMessage.d.ts.map +1 -1
- package/dist/ui/utils/convertMessage.js +219 -286
- package/dist/ui/utils/convertMessage.js.map +1 -1
- package/dist/ui/utils/sliceMessagesUntil.d.ts +6 -2
- package/dist/ui/utils/sliceMessagesUntil.d.ts.map +1 -1
- package/dist/ui/utils/sliceMessagesUntil.js +10 -10
- package/dist/ui/utils/sliceMessagesUntil.js.map +1 -1
- package/dist/ui/utils/toCreateMessage.d.ts +7 -3
- package/dist/ui/utils/toCreateMessage.d.ts.map +1 -1
- package/dist/ui/utils/toCreateMessage.js +34 -38
- package/dist/ui/utils/toCreateMessage.js.map +1 -1
- package/dist/ui/utils/vercelAttachmentAdapter.d.ts +6 -2
- package/dist/ui/utils/vercelAttachmentAdapter.d.ts.map +1 -1
- package/dist/ui/utils/vercelAttachmentAdapter.js +37 -35
- package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -1
- package/dist/usage.d.ts +15 -12
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +80 -99
- package/dist/usage.js.map +1 -1
- package/package.json +12 -11
- package/src/ui/use-chat/useAISDKRuntime.test.ts +2 -2
- package/src/ui/utils/convertMessage.test.ts +28 -0
- package/src/ui/utils/convertMessage.ts +24 -6
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -1,215 +1,187 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
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 {
|
|
12
|
-
import {
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
...createMessage,
|
|
18
|
+
id: createMessage.id ?? generateId(),
|
|
19
|
+
role: createMessage.role ?? fallbackRole
|
|
19
20
|
});
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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 {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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","
|
|
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"}
|