@assistant-ui/react-ai-sdk 0.10.16 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/frontendTools.js +1 -1
- package/dist/frontendTools.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -5
- package/dist/index.js.map +1 -1
- package/dist/ui/getVercelAIMessages.d.ts +2 -2
- package/dist/ui/getVercelAIMessages.d.ts.map +1 -1
- package/dist/ui/getVercelAIMessages.js.map +1 -1
- package/dist/ui/index.d.ts +1 -4
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +2 -8
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/use-chat/useAISDKRuntime.d.ts +7 -0
- package/dist/ui/use-chat/useAISDKRuntime.d.ts.map +1 -0
- package/dist/ui/use-chat/useAISDKRuntime.js +53 -0
- package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -0
- package/dist/ui/utils/convertMessage.d.ts +5 -5
- package/dist/ui/utils/convertMessage.d.ts.map +1 -1
- package/dist/ui/utils/convertMessage.js +115 -86
- package/dist/ui/utils/convertMessage.js.map +1 -1
- package/dist/ui/utils/sliceMessagesUntil.d.ts +2 -2
- package/dist/ui/utils/sliceMessagesUntil.d.ts.map +1 -1
- package/dist/ui/utils/sliceMessagesUntil.js.map +1 -1
- package/dist/ui/utils/toCreateMessage.d.ts +2 -2
- package/dist/ui/utils/toCreateMessage.d.ts.map +1 -1
- package/dist/ui/utils/toCreateMessage.js +29 -17
- package/dist/ui/utils/toCreateMessage.js.map +1 -1
- package/dist/ui/utils/vercelAttachmentAdapter.js +1 -1
- package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -1
- package/package.json +14 -14
- package/src/frontendTools.ts +1 -1
- package/src/index.ts +0 -5
- package/src/ui/getVercelAIMessages.tsx +2 -2
- package/src/ui/index.ts +1 -4
- package/src/ui/use-chat/{useVercelUseChatRuntime.tsx → useAISDKRuntime.tsx} +13 -39
- package/src/ui/utils/convertMessage.ts +162 -117
- package/src/ui/utils/sliceMessagesUntil.tsx +2 -2
- package/src/ui/utils/toCreateMessage.ts +45 -20
- package/src/ui/utils/vercelAttachmentAdapter.ts +1 -1
- package/dist/converters/fromLanguageModelTools.d.ts +0 -7
- package/dist/converters/fromLanguageModelTools.d.ts.map +0 -1
- package/dist/converters/fromLanguageModelTools.js +0 -16
- package/dist/converters/fromLanguageModelTools.js.map +0 -1
- package/dist/converters/index.d.ts +0 -4
- package/dist/converters/index.d.ts.map +0 -1
- package/dist/converters/index.js +0 -10
- package/dist/converters/index.js.map +0 -1
- package/dist/converters/toLanguageModelMessages.d.ts +0 -9
- package/dist/converters/toLanguageModelMessages.d.ts.map +0 -1
- package/dist/converters/toLanguageModelMessages.js +0 -143
- package/dist/converters/toLanguageModelMessages.js.map +0 -1
- package/dist/converters/toLanguageModelTools.d.ts +0 -7
- package/dist/converters/toLanguageModelTools.d.ts.map +0 -1
- package/dist/converters/toLanguageModelTools.js +0 -15
- package/dist/converters/toLanguageModelTools.js.map +0 -1
- package/dist/dangerous-in-browser/DangerousInBrowserAdapter.d.ts +0 -9
- package/dist/dangerous-in-browser/DangerousInBrowserAdapter.d.ts.map +0 -1
- package/dist/dangerous-in-browser/DangerousInBrowserAdapter.js +0 -38
- package/dist/dangerous-in-browser/DangerousInBrowserAdapter.js.map +0 -1
- package/dist/dangerous-in-browser/createEdgeRuntimeAPI.d.ts +0 -56
- package/dist/dangerous-in-browser/createEdgeRuntimeAPI.d.ts.map +0 -1
- package/dist/dangerous-in-browser/createEdgeRuntimeAPI.js +0 -65
- package/dist/dangerous-in-browser/createEdgeRuntimeAPI.js.map +0 -1
- package/dist/dangerous-in-browser/index.d.ts +0 -2
- package/dist/dangerous-in-browser/index.d.ts.map +0 -1
- package/dist/dangerous-in-browser/index.js +0 -8
- package/dist/dangerous-in-browser/index.js.map +0 -1
- package/dist/dangerous-in-browser/useDangerousInBrowserRuntime.d.ts +0 -5
- package/dist/dangerous-in-browser/useDangerousInBrowserRuntime.d.ts.map +0 -1
- package/dist/dangerous-in-browser/useDangerousInBrowserRuntime.js +0 -21
- package/dist/dangerous-in-browser/useDangerousInBrowserRuntime.js.map +0 -1
- package/dist/rsc/RSCDisplay.d.ts +0 -3
- package/dist/rsc/RSCDisplay.d.ts.map +0 -1
- package/dist/rsc/RSCDisplay.js +0 -26
- package/dist/rsc/RSCDisplay.js.map +0 -1
- package/dist/rsc/VercelRSCAdapter.d.ts +0 -17
- package/dist/rsc/VercelRSCAdapter.d.ts.map +0 -1
- package/dist/rsc/VercelRSCAdapter.js +0 -1
- package/dist/rsc/VercelRSCAdapter.js.map +0 -1
- package/dist/rsc/VercelRSCMessage.d.ts +0 -8
- package/dist/rsc/VercelRSCMessage.d.ts.map +0 -1
- package/dist/rsc/VercelRSCMessage.js +0 -2
- package/dist/rsc/VercelRSCMessage.js.map +0 -1
- package/dist/rsc/index.d.ts +0 -5
- package/dist/rsc/index.d.ts.map +0 -1
- package/dist/rsc/index.js +0 -8
- package/dist/rsc/index.js.map +0 -1
- package/dist/rsc/useVercelRSCRuntime.d.ts +0 -3
- package/dist/rsc/useVercelRSCRuntime.d.ts.map +0 -1
- package/dist/rsc/useVercelRSCRuntime.js +0 -57
- package/dist/rsc/useVercelRSCRuntime.js.map +0 -1
- package/dist/rsc/utils/RSCThreadExtras.d.ts +0 -8
- package/dist/rsc/utils/RSCThreadExtras.d.ts.map +0 -1
- package/dist/rsc/utils/RSCThreadExtras.js +0 -8
- package/dist/rsc/utils/RSCThreadExtras.js.map +0 -1
- package/dist/ui/use-assistant/useVercelUseAssistantRuntime.d.ts +0 -7
- package/dist/ui/use-assistant/useVercelUseAssistantRuntime.d.ts.map +0 -1
- package/dist/ui/use-assistant/useVercelUseAssistantRuntime.js +0 -48
- package/dist/ui/use-assistant/useVercelUseAssistantRuntime.js.map +0 -1
- package/dist/ui/use-chat/useVercelUseChatRuntime.d.ts +0 -8
- package/dist/ui/use-chat/useVercelUseChatRuntime.d.ts.map +0 -1
- package/dist/ui/use-chat/useVercelUseChatRuntime.js +0 -75
- package/dist/ui/use-chat/useVercelUseChatRuntime.js.map +0 -1
- package/dist/ui/utils/useInputSync.d.ts +0 -6
- package/dist/ui/utils/useInputSync.d.ts.map +0 -1
- package/dist/ui/utils/useInputSync.js +0 -18
- package/dist/ui/utils/useInputSync.js.map +0 -1
- package/dist/useChatRuntime.d.ts +0 -16
- package/dist/useChatRuntime.d.ts.map +0 -1
- package/dist/useChatRuntime.js +0 -106
- package/dist/useChatRuntime.js.map +0 -1
- package/dist/useCloudRuntime.d.ts +0 -12
- package/dist/useCloudRuntime.d.ts.map +0 -1
- package/dist/useCloudRuntime.js +0 -15
- package/dist/useCloudRuntime.js.map +0 -1
- package/src/converters/fromLanguageModelTools.ts +0 -19
- package/src/converters/index.ts +0 -3
- package/src/converters/toLanguageModelMessages.ts +0 -185
- package/src/converters/toLanguageModelTools.ts +0 -21
- package/src/dangerous-in-browser/DangerousInBrowserAdapter.ts +0 -41
- package/src/dangerous-in-browser/createEdgeRuntimeAPI.ts +0 -145
- package/src/dangerous-in-browser/index.ts +0 -4
- package/src/dangerous-in-browser/useDangerousInBrowserRuntime.ts +0 -26
- package/src/rsc/RSCDisplay.tsx +0 -23
- package/src/rsc/VercelRSCAdapter.tsx +0 -21
- package/src/rsc/VercelRSCMessage.tsx +0 -9
- package/src/rsc/index.ts +0 -4
- package/src/rsc/useVercelRSCRuntime.tsx +0 -70
- package/src/rsc/utils/RSCThreadExtras.tsx +0 -11
- package/src/ui/use-assistant/useVercelUseAssistantRuntime.tsx +0 -60
- package/src/ui/utils/useInputSync.tsx +0 -26
- package/src/useChatRuntime.ts +0 -157
- package/src/useCloudRuntime.ts +0 -21
package/dist/frontendTools.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/frontendTools.ts"],"sourcesContent":["import { jsonSchema } from \"
|
|
1
|
+
{"version":3,"sources":["../src/frontendTools.ts"],"sourcesContent":["import { jsonSchema } from \"ai\";\nimport type { JSONSchema7 } from \"json-schema\";\n\nexport const frontendTools = (\n tools: Record<string, { description?: string; parameters: JSONSchema7 }>,\n) =>\n Object.fromEntries(\n Object.entries(tools).map(([name, tool]) => [\n name,\n {\n ...(tool.description ? { description: tool.description } : undefined),\n parameters: jsonSchema(tool.parameters),\n },\n ]),\n );\n"],"mappings":";AAAA,SAAS,kBAAkB;AAGpB,IAAM,gBAAgB,CAC3B,UAEA,OAAO;AAAA,EACL,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AAAA,IAC1C;AAAA,IACA;AAAA,MACE,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI;AAAA,MAC3D,YAAY,WAAW,KAAK,UAAU;AAAA,IACxC;AAAA,EACF,CAAC;AACH;","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
export * from "./rsc";
|
|
2
1
|
export * from "./ui";
|
|
3
|
-
export * from "./useChatRuntime";
|
|
4
|
-
export * from "./useCloudRuntime";
|
|
5
|
-
export * from "./converters";
|
|
6
|
-
export * from "./dangerous-in-browser";
|
|
7
2
|
export { frontendTools } from "./frontendTools";
|
|
8
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
|
-
export * from "./rsc/index.js";
|
|
3
2
|
export * from "./ui/index.js";
|
|
4
|
-
export * from "./useChatRuntime.js";
|
|
5
|
-
export * from "./useCloudRuntime.js";
|
|
6
|
-
export * from "./converters/index.js";
|
|
7
|
-
export * from "./dangerous-in-browser/index.js";
|
|
8
3
|
import { frontendTools } from "./frontendTools.js";
|
|
9
4
|
export {
|
|
10
5
|
frontendTools
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./ui\";\nexport { frontendTools } from \"./frontendTools\";\n"],"mappings":";AAAA,cAAc;AACd,SAAS,qBAAqB;","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { type ThreadMessage } from "@assistant-ui/react";
|
|
2
|
-
import type {
|
|
3
|
-
export declare const getVercelAIMessages: (message: ThreadMessage) =>
|
|
2
|
+
import type { UIMessage } from "ai";
|
|
3
|
+
export declare const getVercelAIMessages: (message: ThreadMessage) => UIMessage[];
|
|
4
4
|
//# sourceMappingURL=getVercelAIMessages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getVercelAIMessages.d.ts","sourceRoot":"","sources":["../../src/ui/getVercelAIMessages.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"getVercelAIMessages.d.ts","sourceRoot":"","sources":["../../src/ui/getVercelAIMessages.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,eAAO,MAAM,mBAAmB,GAAI,SAAS,aAAa,KACZ,SAAS,EACtD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/getVercelAIMessages.tsx"],"sourcesContent":["import {\n getExternalStoreMessages,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type {
|
|
1
|
+
{"version":3,"sources":["../../src/ui/getVercelAIMessages.tsx"],"sourcesContent":["import {\n getExternalStoreMessages,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { UIMessage } from \"ai\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessages(message) as UIMessage[];\n};\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAEK;AAGA,IAAM,sBAAsB,CAAC,YAA2B;AAC7D,SAAO,yBAAyB,OAAO;AACzC;","names":[]}
|
package/dist/ui/index.d.ts
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { useVercelUseAssistantRuntime } from "./use-assistant/useVercelUseAssistantRuntime";
|
|
3
|
-
export { getVercelAIMessages } from "./getVercelAIMessages";
|
|
4
|
-
export { AISDKMessageConverter } from "./utils/convertMessage";
|
|
1
|
+
export { useAISDKRuntime } from "./use-chat/useAISDKRuntime";
|
|
5
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/ui/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/ui/index.js
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
// src/ui/index.ts
|
|
2
|
-
import {
|
|
3
|
-
import { useVercelUseAssistantRuntime } from "./use-assistant/useVercelUseAssistantRuntime.js";
|
|
4
|
-
import { getVercelAIMessages } from "./getVercelAIMessages.js";
|
|
5
|
-
import { AISDKMessageConverter } from "./utils/convertMessage.js";
|
|
2
|
+
import { useAISDKRuntime } from "./use-chat/useAISDKRuntime.js";
|
|
6
3
|
export {
|
|
7
|
-
|
|
8
|
-
getVercelAIMessages,
|
|
9
|
-
useVercelUseAssistantRuntime,
|
|
10
|
-
useVercelUseChatRuntime
|
|
4
|
+
useAISDKRuntime
|
|
11
5
|
};
|
|
12
6
|
//# sourceMappingURL=index.js.map
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/index.ts"],"sourcesContent":["export {
|
|
1
|
+
{"version":3,"sources":["../../src/ui/index.ts"],"sourcesContent":["export { useAISDKRuntime } from \"./use-chat/useAISDKRuntime\";\n"],"mappings":";AAAA,SAAS,uBAAuB;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { useChat } from "@ai-sdk/react";
|
|
2
|
+
import { ExternalStoreAdapter } from "@assistant-ui/react";
|
|
3
|
+
export type AISDKRuntimeAdapter = {
|
|
4
|
+
adapters?: Omit<NonNullable<ExternalStoreAdapter["adapters"]>, "attachments"> | undefined;
|
|
5
|
+
};
|
|
6
|
+
export declare const useAISDKRuntime: (chatHelpers: ReturnType<typeof useChat>, adapter?: AISDKRuntimeAdapter) => import("@assistant-ui/react").AssistantRuntime;
|
|
7
|
+
//# sourceMappingURL=useAISDKRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAISDKRuntime.d.ts","sourceRoot":"","sources":["../../../src/ui/use-chat/useAISDKRuntime.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAM7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EACL,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,EAAE,aAAa,CAAC,GAClE,SAAS,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,aAAa,UAAU,CAAC,OAAO,OAAO,CAAC,EACvC,UAAS,mBAAwB,mDA+ClC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/ui/use-chat/useAISDKRuntime.tsx
|
|
4
|
+
import { useExternalStoreRuntime } from "@assistant-ui/react";
|
|
5
|
+
import { sliceMessagesUntil } from "../utils/sliceMessagesUntil.js";
|
|
6
|
+
import { toCreateMessage } from "../utils/toCreateMessage.js";
|
|
7
|
+
import { vercelAttachmentAdapter } from "../utils/vercelAttachmentAdapter.js";
|
|
8
|
+
import { getVercelAIMessages } from "../getVercelAIMessages.js";
|
|
9
|
+
import { AISDKMessageConverter } from "../utils/convertMessage.js";
|
|
10
|
+
var useAISDKRuntime = (chatHelpers, adapter = {}) => {
|
|
11
|
+
const messages = AISDKMessageConverter.useThreadMessages({
|
|
12
|
+
isRunning: chatHelpers.status === "submitted" || chatHelpers.status == "streaming",
|
|
13
|
+
messages: chatHelpers.messages
|
|
14
|
+
});
|
|
15
|
+
const runtime = useExternalStoreRuntime({
|
|
16
|
+
isRunning: chatHelpers.status === "submitted" || chatHelpers.status === "streaming",
|
|
17
|
+
messages,
|
|
18
|
+
setMessages: (messages2) => chatHelpers.setMessages(messages2.map(getVercelAIMessages).flat()),
|
|
19
|
+
onCancel: async () => chatHelpers.stop(),
|
|
20
|
+
onNew: async (message) => {
|
|
21
|
+
await chatHelpers.sendMessage(await toCreateMessage(message));
|
|
22
|
+
},
|
|
23
|
+
onEdit: async (message) => {
|
|
24
|
+
const newMessages = sliceMessagesUntil(
|
|
25
|
+
chatHelpers.messages,
|
|
26
|
+
message.parentId
|
|
27
|
+
);
|
|
28
|
+
chatHelpers.setMessages(newMessages);
|
|
29
|
+
await chatHelpers.sendMessage(await toCreateMessage(message));
|
|
30
|
+
},
|
|
31
|
+
onReload: async (parentId) => {
|
|
32
|
+
const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);
|
|
33
|
+
chatHelpers.setMessages(newMessages);
|
|
34
|
+
await chatHelpers.regenerate();
|
|
35
|
+
},
|
|
36
|
+
onAddToolResult: ({ toolCallId, result }) => {
|
|
37
|
+
chatHelpers.addToolResult({
|
|
38
|
+
tool: toolCallId,
|
|
39
|
+
toolCallId,
|
|
40
|
+
output: result
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
adapters: {
|
|
44
|
+
attachments: vercelAttachmentAdapter,
|
|
45
|
+
...adapter.adapters
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return runtime;
|
|
49
|
+
};
|
|
50
|
+
export {
|
|
51
|
+
useAISDKRuntime
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=useAISDKRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/use-chat/useAISDKRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport type { useChat } from \"@ai-sdk/react\";\nimport { useExternalStoreRuntime } from \"@assistant-ui/react\";\nimport { sliceMessagesUntil } from \"../utils/sliceMessagesUntil\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { getVercelAIMessages } from \"../getVercelAIMessages\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\nimport { AISDKMessageConverter } from \"../utils/convertMessage\";\n\nexport type AISDKRuntimeAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useAISDKRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: AISDKRuntimeAdapter = {},\n) => {\n const messages = AISDKMessageConverter.useThreadMessages({\n isRunning:\n chatHelpers.status === \"submitted\" || chatHelpers.status == \"streaming\",\n messages: chatHelpers.messages,\n });\n\n const runtime = useExternalStoreRuntime({\n isRunning:\n chatHelpers.status === \"submitted\" || chatHelpers.status === \"streaming\",\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.sendMessage(await toCreateMessage(message));\n },\n onEdit: async (message) => {\n const newMessages = sliceMessagesUntil(\n chatHelpers.messages,\n message.parentId,\n );\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.sendMessage(await toCreateMessage(message));\n },\n onReload: async (parentId: string | null) => {\n const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);\n chatHelpers.setMessages(newMessages);\n\n await chatHelpers.regenerate();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({\n tool: toolCallId,\n toolCallId,\n output: result,\n });\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n },\n });\n\n return runtime;\n};\n"],"mappings":";;;AAGA,SAAS,+BAA+B;AACxC,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,2BAA2B;AAEpC,SAAS,6BAA6B;AAQ/B,IAAM,kBAAkB,CAC7B,aACA,UAA+B,CAAC,MAC7B;AACH,QAAM,WAAW,sBAAsB,kBAAkB;AAAA,IACvD,WACE,YAAY,WAAW,eAAe,YAAY,UAAU;AAAA,IAC9D,UAAU,YAAY;AAAA,EACxB,CAAC;AAED,QAAM,UAAU,wBAAwB;AAAA,IACtC,WACE,YAAY,WAAW,eAAe,YAAY,WAAW;AAAA,IAC/D;AAAA,IACA,aAAa,CAACA,cACZ,YAAY,YAAYA,UAAS,IAAI,mBAAmB,EAAE,KAAK,CAAC;AAAA,IAClE,UAAU,YAAY,YAAY,KAAK;AAAA,IACvC,OAAO,OAAO,YAAY;AACxB,YAAM,YAAY,YAAY,MAAM,gBAAgB,OAAO,CAAC;AAAA,IAC9D;AAAA,IACA,QAAQ,OAAO,YAAY;AACzB,YAAM,cAAc;AAAA,QAClB,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AACA,kBAAY,YAAY,WAAW;AAEnC,YAAM,YAAY,YAAY,MAAM,gBAAgB,OAAO,CAAC;AAAA,IAC9D;AAAA,IACA,UAAU,OAAO,aAA4B;AAC3C,YAAM,cAAc,mBAAmB,YAAY,UAAU,QAAQ;AACrE,kBAAY,YAAY,WAAW;AAEnC,YAAM,YAAY,WAAW;AAAA,IAC/B;AAAA,IACA,iBAAiB,CAAC,EAAE,YAAY,OAAO,MAAM;AAC3C,kBAAY,cAAc;AAAA,QACxB,MAAM;AAAA,QACN;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,IACA,UAAU;AAAA,MACR,aAAa;AAAA,MACb,GAAG,QAAQ;AAAA,IACb;AAAA,EACF,CAAC;AAED,SAAO;AACT;","names":["messages"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UIMessage } from "ai";
|
|
2
2
|
export declare const AISDKMessageConverter: {
|
|
3
3
|
useThreadMessages: ({ messages, isRunning, joinStrategy, }: {
|
|
4
|
-
messages:
|
|
4
|
+
messages: UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>[];
|
|
5
5
|
isRunning: boolean;
|
|
6
6
|
joinStrategy?: "concat-content" | "none" | undefined;
|
|
7
7
|
}) => import("@assistant-ui/react").ThreadMessage[];
|
|
8
|
-
toThreadMessages: (messages:
|
|
8
|
+
toThreadMessages: (messages: UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>[]) => import("@assistant-ui/react").ThreadMessage[];
|
|
9
9
|
toOriginalMessages: (input: import("@assistant-ui/react").ThreadState | import("@assistant-ui/react").ThreadMessage | import("@assistant-ui/react").ThreadMessage["content"][number]) => unknown[];
|
|
10
10
|
toOriginalMessage: (input: import("@assistant-ui/react").ThreadState | import("@assistant-ui/react").ThreadMessage | import("@assistant-ui/react").ThreadMessage["content"][number]) => {};
|
|
11
|
-
useOriginalMessage: () =>
|
|
12
|
-
useOriginalMessages: () =>
|
|
11
|
+
useOriginalMessage: () => UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>;
|
|
12
|
+
useOriginalMessages: () => UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>[];
|
|
13
13
|
};
|
|
14
14
|
//# sourceMappingURL=convertMessage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,SAAS,EAAE,MAAM,IAAI,CAAC;AAwJ7C,eAAO,MAAM,qBAAqB;;;;;;;0HAhIhB,sDACF;yHAIM,sDACT;;;CA+KZ,CAAC"}
|
|
@@ -1,122 +1,151 @@
|
|
|
1
1
|
// src/ui/utils/convertMessage.ts
|
|
2
|
+
import { isToolUIPart } from "ai";
|
|
2
3
|
import {
|
|
3
4
|
unstable_createMessageConverter
|
|
4
5
|
} from "@assistant-ui/react";
|
|
5
6
|
var convertParts = (message) => {
|
|
6
|
-
if (message.parts
|
|
7
|
-
return
|
|
8
|
-
const type = part.type;
|
|
9
|
-
switch (type) {
|
|
10
|
-
case "text":
|
|
11
|
-
return {
|
|
12
|
-
type: "text",
|
|
13
|
-
text: part.text
|
|
14
|
-
};
|
|
15
|
-
case "tool-invocation":
|
|
16
|
-
return {
|
|
17
|
-
type: "tool-call",
|
|
18
|
-
toolName: part.toolInvocation.toolName,
|
|
19
|
-
toolCallId: part.toolInvocation.toolCallId,
|
|
20
|
-
argsText: JSON.stringify(part.toolInvocation.args),
|
|
21
|
-
args: part.toolInvocation.args,
|
|
22
|
-
result: part.toolInvocation.state === "result" && part.toolInvocation.result
|
|
23
|
-
};
|
|
24
|
-
case "reasoning":
|
|
25
|
-
return {
|
|
26
|
-
type: "reasoning",
|
|
27
|
-
text: part.reasoning
|
|
28
|
-
};
|
|
29
|
-
case "source":
|
|
30
|
-
return {
|
|
31
|
-
type: "source",
|
|
32
|
-
...part.source
|
|
33
|
-
};
|
|
34
|
-
case "file":
|
|
35
|
-
return {
|
|
36
|
-
type: "file",
|
|
37
|
-
data: part.data,
|
|
38
|
-
mimeType: part.mimeType
|
|
39
|
-
};
|
|
40
|
-
default: {
|
|
41
|
-
const _unsupported = type;
|
|
42
|
-
throw new Error(
|
|
43
|
-
`You have a message with an unsupported part type. The type ${_unsupported} is not supported.`
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
});
|
|
7
|
+
if (!message.parts || message.parts.length === 0) {
|
|
8
|
+
return [];
|
|
48
9
|
}
|
|
49
|
-
return message.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
10
|
+
return message.parts.filter((p) => p.type !== "step-start").map((part) => {
|
|
11
|
+
const type = part.type;
|
|
12
|
+
if (type === "text") {
|
|
13
|
+
return {
|
|
14
|
+
type: "text",
|
|
15
|
+
text: part.text
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (type === "reasoning") {
|
|
19
|
+
return {
|
|
20
|
+
type: "reasoning",
|
|
21
|
+
text: part.text
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (isToolUIPart(part)) {
|
|
25
|
+
const toolName = type.replace("tool-", "");
|
|
26
|
+
const toolCallId = part.toolCallId;
|
|
27
|
+
let args = {};
|
|
28
|
+
let result = void 0;
|
|
29
|
+
let isError = false;
|
|
30
|
+
if (part.state === "input-streaming" || part.state === "input-available") {
|
|
31
|
+
args = part.input || {};
|
|
32
|
+
} else if (part.state === "output-available") {
|
|
33
|
+
args = part.input || {};
|
|
34
|
+
result = part.output;
|
|
35
|
+
} else if (part.state === "output-error") {
|
|
36
|
+
args = part.input || {};
|
|
37
|
+
isError = true;
|
|
38
|
+
result = { error: part.errorText };
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
type: "tool-call",
|
|
42
|
+
toolName,
|
|
43
|
+
toolCallId,
|
|
44
|
+
argsText: JSON.stringify(args),
|
|
45
|
+
args,
|
|
46
|
+
result,
|
|
47
|
+
isError
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (type === "dynamic-tool") {
|
|
51
|
+
const toolName = part.toolName;
|
|
52
|
+
const toolCallId = part.toolCallId;
|
|
53
|
+
let args = {};
|
|
54
|
+
let result = void 0;
|
|
55
|
+
let isError = false;
|
|
56
|
+
if (part.state === "input-streaming" || part.state === "input-available") {
|
|
57
|
+
args = part.input || {};
|
|
58
|
+
} else if (part.state === "output-available") {
|
|
59
|
+
args = part.input || {};
|
|
60
|
+
result = part.output;
|
|
61
|
+
} else if (part.state === "output-error") {
|
|
62
|
+
args = part.input || {};
|
|
63
|
+
isError = true;
|
|
64
|
+
result = { error: part.errorText };
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
type: "tool-call",
|
|
68
|
+
toolName,
|
|
69
|
+
toolCallId,
|
|
70
|
+
argsText: JSON.stringify(args),
|
|
71
|
+
args,
|
|
72
|
+
result,
|
|
73
|
+
isError
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (type === "source-url") {
|
|
77
|
+
return {
|
|
78
|
+
type: "source",
|
|
79
|
+
sourceType: "url",
|
|
80
|
+
id: part.sourceId,
|
|
81
|
+
url: part.url,
|
|
82
|
+
title: part.title || ""
|
|
83
|
+
};
|
|
53
84
|
}
|
|
54
|
-
|
|
85
|
+
if (type === "source-document") {
|
|
86
|
+
console.warn(
|
|
87
|
+
`Source document part type ${type} is not yet supported in conversion`
|
|
88
|
+
);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (type === "file") {
|
|
92
|
+
return {
|
|
93
|
+
type: "file",
|
|
94
|
+
data: part.url,
|
|
95
|
+
mimeType: part.mediaType
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (type.startsWith("data-")) {
|
|
99
|
+
console.warn(
|
|
100
|
+
`Data part type ${type} is not yet supported in conversion`
|
|
101
|
+
);
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
console.warn(`Unsupported message part type: ${type}`);
|
|
105
|
+
return null;
|
|
106
|
+
}).filter(Boolean);
|
|
55
107
|
};
|
|
56
108
|
var AISDKMessageConverter = unstable_createMessageConverter(
|
|
57
109
|
(message) => {
|
|
110
|
+
const createdAt = /* @__PURE__ */ new Date();
|
|
58
111
|
switch (message.role) {
|
|
59
112
|
case "user":
|
|
60
113
|
return {
|
|
61
114
|
role: "user",
|
|
62
115
|
id: message.id,
|
|
63
|
-
createdAt
|
|
116
|
+
createdAt,
|
|
64
117
|
content: convertParts(message),
|
|
65
|
-
attachments: message.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
})
|
|
74
|
-
)
|
|
118
|
+
attachments: message.parts?.filter((p) => p.type === "file").map((part, idx) => ({
|
|
119
|
+
id: idx.toString(),
|
|
120
|
+
type: "file",
|
|
121
|
+
name: part.name ?? part.url ?? "file",
|
|
122
|
+
content: [],
|
|
123
|
+
contentType: part.mediaType ?? part.mimeType ?? "unknown/unknown",
|
|
124
|
+
status: { type: "complete" }
|
|
125
|
+
}))
|
|
75
126
|
};
|
|
76
127
|
case "system":
|
|
77
128
|
return {
|
|
78
129
|
role: "system",
|
|
79
130
|
id: message.id,
|
|
80
|
-
createdAt
|
|
131
|
+
createdAt,
|
|
81
132
|
content: convertParts(message)
|
|
82
133
|
};
|
|
83
134
|
case "assistant":
|
|
84
135
|
return {
|
|
85
136
|
role: "assistant",
|
|
86
137
|
id: message.id,
|
|
87
|
-
createdAt
|
|
138
|
+
createdAt,
|
|
88
139
|
content: convertParts(message),
|
|
89
140
|
metadata: {
|
|
90
141
|
unstable_annotations: message.annotations,
|
|
91
|
-
unstable_data: Array.isArray(message.data) ? message.data : message.data ? [message.data] : void 0
|
|
142
|
+
unstable_data: Array.isArray(message.data) ? message.data : message.data ? [message.data] : void 0,
|
|
143
|
+
custom: {}
|
|
92
144
|
}
|
|
93
145
|
};
|
|
94
|
-
case "data": {
|
|
95
|
-
if (!message.data || !(typeof message.data === "object") || Array.isArray(message.data))
|
|
96
|
-
return [];
|
|
97
|
-
const data = message.data;
|
|
98
|
-
if (data.type === "tool-call") {
|
|
99
|
-
return {
|
|
100
|
-
role: "assistant",
|
|
101
|
-
id: message.id,
|
|
102
|
-
createdAt: message.createdAt,
|
|
103
|
-
content: [data]
|
|
104
|
-
};
|
|
105
|
-
} else if (data.type === "tool-result") {
|
|
106
|
-
return {
|
|
107
|
-
role: "tool",
|
|
108
|
-
id: message.id,
|
|
109
|
-
toolCallId: data.toolCallId,
|
|
110
|
-
result: data.result
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
return [];
|
|
114
|
-
}
|
|
115
146
|
default:
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
`You have a message with an unsupported role. The role ${_unsupported} is not supported.`
|
|
119
|
-
);
|
|
147
|
+
console.warn(`Unsupported message role: ${message.role}`);
|
|
148
|
+
return [];
|
|
120
149
|
}
|
|
121
150
|
}
|
|
122
151
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/utils/convertMessage.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/utils/convertMessage.ts"],"sourcesContent":["import { isToolUIPart, UIMessage } from \"ai\";\nimport {\n unstable_createMessageConverter,\n type ReasoningMessagePart,\n type ToolCallMessagePart,\n type TextMessagePart,\n type SourceMessagePart,\n type FileMessagePart,\n} from \"@assistant-ui/react\";\n\nconst convertParts = (message: UIMessage) => {\n if (!message.parts || message.parts.length === 0) {\n return [];\n }\n\n return message.parts\n .filter((p) => p.type !== \"step-start\")\n .map((part) => {\n const type = part.type;\n\n // Handle text parts\n if (type === \"text\") {\n return {\n type: \"text\",\n text: part.text,\n } satisfies TextMessagePart;\n }\n\n // Handle reasoning parts\n if (type === \"reasoning\") {\n return {\n type: \"reasoning\",\n text: part.text,\n } satisfies ReasoningMessagePart;\n }\n\n // Handle tool-* parts (AI SDK v5 tool calls)\n if (isToolUIPart(part)) {\n const toolName = type.replace(\"tool-\", \"\");\n const toolCallId = part.toolCallId;\n\n // Extract args and result based on state\n let args: any = {};\n let result: any = undefined;\n let isError = false;\n\n if (\n part.state === \"input-streaming\" ||\n part.state === \"input-available\"\n ) {\n args = part.input || {};\n } else if (part.state === \"output-available\") {\n args = part.input || {};\n result = part.output;\n } else if (part.state === \"output-error\") {\n args = part.input || {};\n isError = true;\n result = { error: part.errorText };\n }\n\n return {\n type: \"tool-call\",\n toolName,\n toolCallId,\n argsText: JSON.stringify(args),\n args,\n result,\n isError,\n } satisfies ToolCallMessagePart;\n }\n\n // Handle dynamic-tool parts\n if (type === \"dynamic-tool\") {\n const toolName = part.toolName;\n const toolCallId = part.toolCallId;\n\n // Extract args and result based on state\n let args: any = {};\n let result: any = undefined;\n let isError = false;\n\n if (\n part.state === \"input-streaming\" ||\n part.state === \"input-available\"\n ) {\n args = part.input || {};\n } else if (part.state === \"output-available\") {\n args = part.input || {};\n result = part.output;\n } else if (part.state === \"output-error\") {\n args = part.input || {};\n isError = true;\n result = { error: part.errorText };\n }\n\n return {\n type: \"tool-call\",\n toolName,\n toolCallId,\n argsText: JSON.stringify(args),\n args,\n result,\n isError,\n } satisfies ToolCallMessagePart;\n }\n\n // Handle source-url parts\n if (type === \"source-url\") {\n return {\n type: \"source\",\n sourceType: \"url\",\n id: part.sourceId,\n url: part.url,\n title: part.title || \"\",\n } satisfies SourceMessagePart;\n }\n\n // Handle source-document parts\n if (type === \"source-document\") {\n console.warn(\n `Source document part type ${type} is not yet supported in conversion`,\n );\n return null;\n }\n\n // Handle file parts\n if (type === \"file\") {\n return {\n type: \"file\",\n data: part.url,\n mimeType: part.mediaType,\n } satisfies FileMessagePart;\n }\n\n // Handle data-* parts (AI SDK v5 data parts)\n if (type.startsWith(\"data-\")) {\n // For now, we'll skip data parts as they don't have a direct equivalent\n // in the assistant-ui types. They could be converted to a custom message part\n // or handled differently based on the specific use case.\n console.warn(\n `Data part type ${type} is not yet supported in conversion`,\n );\n return null;\n }\n\n // For unsupported types, we'll skip them instead of throwing\n console.warn(`Unsupported message part type: ${type}`);\n return null;\n })\n .filter(Boolean) as any[];\n};\n\nexport const AISDKMessageConverter = unstable_createMessageConverter(\n (message: UIMessage) => {\n // UIMessage doesn't have createdAt, so we'll use current date or undefined\n const createdAt = new Date();\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt,\n content: convertParts(message),\n attachments: message.parts\n ?.filter((p: any) => p.type === \"file\")\n .map((part: any, idx) => ({\n id: idx.toString(),\n type: \"file\" as const,\n name: part.name ?? part.url ?? \"file\",\n content: [],\n contentType: part.mediaType ?? part.mimeType ?? \"unknown/unknown\",\n status: { type: \"complete\" as const },\n })),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt,\n content: convertParts(message),\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt,\n content: convertParts(message),\n metadata: {\n unstable_annotations: (message as any).annotations,\n unstable_data: Array.isArray((message as any).data)\n ? (message as any).data\n : (message as any).data\n ? [(message as any).data]\n : undefined,\n custom: {},\n },\n };\n\n default:\n console.warn(`Unsupported message role: ${message.role}`);\n return [];\n }\n },\n);\n"],"mappings":"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","names":[]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare const sliceMessagesUntil: (messages:
|
|
1
|
+
import type { UIMessage } from "ai";
|
|
2
|
+
export declare const sliceMessagesUntil: (messages: UIMessage[], messageId: string | null) => UIMessage<unknown, import("ai").UIDataTypes, import("ai").UITools>[];
|
|
3
3
|
//# sourceMappingURL=sliceMessagesUntil.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliceMessagesUntil.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/sliceMessagesUntil.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"sliceMessagesUntil.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/sliceMessagesUntil.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,eAAO,MAAM,kBAAkB,GAC7B,UAAU,SAAS,EAAE,EACrB,WAAW,MAAM,GAAG,IAAI,yEAezB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/utils/sliceMessagesUntil.tsx"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/utils/sliceMessagesUntil.tsx"],"sourcesContent":["import type { UIMessage } from \"ai\";\n\nexport const sliceMessagesUntil = (\n messages: UIMessage[],\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 likely 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"],"mappings":";AAEO,IAAM,qBAAqB,CAChC,UACA,cACG;AACH,MAAI,aAAa,KAAM,QAAO,CAAC;AAE/B,MAAI,aAAa,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS;AAC7D,MAAI,eAAe;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAEF,SAAO,SAAS,aAAa,CAAC,GAAG,SAAS,aAAa;AACrD;AAAA,EACF;AAEA,SAAO,SAAS,MAAM,GAAG,aAAa,CAAC;AACzC;","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { AppendMessage } from "@assistant-ui/react";
|
|
2
|
-
import {
|
|
3
|
-
export declare const toCreateMessage: (message: AppendMessage) => Promise<
|
|
2
|
+
import { CreateUIMessage, UIMessage } from "ai";
|
|
3
|
+
export declare const toCreateMessage: (message: AppendMessage) => Promise<CreateUIMessage<UIMessage>>;
|
|
4
4
|
//# sourceMappingURL=toCreateMessage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toCreateMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/toCreateMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,
|
|
1
|
+
{"version":3,"file":"toCreateMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/toCreateMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,eAAe,EAGf,SAAS,EAGV,MAAM,IAAI,CAAC;AAEZ,eAAO,MAAM,eAAe,GAC1B,SAAS,aAAa,KACrB,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CA8CpC,CAAC"}
|
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
// src/ui/utils/toCreateMessage.ts
|
|
2
2
|
var toCreateMessage = async (message) => {
|
|
3
|
-
const
|
|
4
|
-
const
|
|
3
|
+
const textParts = message.content.filter((part) => part.type === "text").map((t) => t.text).join("\n\n");
|
|
4
|
+
const parts = [
|
|
5
|
+
{
|
|
6
|
+
type: "text",
|
|
7
|
+
text: textParts
|
|
8
|
+
}
|
|
9
|
+
];
|
|
10
|
+
const imageParts = message.content.filter((part) => part.type === "image").map(
|
|
11
|
+
(part) => ({
|
|
12
|
+
type: "file",
|
|
13
|
+
mediaType: "image/png",
|
|
14
|
+
// Default to PNG, could be made more dynamic
|
|
15
|
+
url: part.image
|
|
16
|
+
})
|
|
17
|
+
);
|
|
18
|
+
parts.push(...imageParts);
|
|
19
|
+
const attachmentParts = await Promise.all(
|
|
20
|
+
(message.attachments ?? []).map(async (m) => {
|
|
21
|
+
if (m.file == null) throw new Error("Attachment did not contain a file");
|
|
22
|
+
return {
|
|
23
|
+
type: "file",
|
|
24
|
+
mediaType: m.file.type,
|
|
25
|
+
filename: m.file.name,
|
|
26
|
+
url: await getFileDataURL(m.file)
|
|
27
|
+
};
|
|
28
|
+
})
|
|
29
|
+
);
|
|
30
|
+
parts.push(...attachmentParts);
|
|
5
31
|
return {
|
|
6
32
|
role: message.role,
|
|
7
|
-
|
|
8
|
-
experimental_attachments: [
|
|
9
|
-
...images,
|
|
10
|
-
...await Promise.all(
|
|
11
|
-
(message.attachments ?? []).map(async (m) => {
|
|
12
|
-
if (m.file == null)
|
|
13
|
-
throw new Error("Attachment did not contain a file");
|
|
14
|
-
return {
|
|
15
|
-
contentType: m.file.type,
|
|
16
|
-
name: m.file.name,
|
|
17
|
-
url: await getFileDataURL(m.file)
|
|
18
|
-
};
|
|
19
|
-
})
|
|
20
|
-
)
|
|
21
|
-
]
|
|
33
|
+
parts
|
|
22
34
|
};
|
|
23
35
|
};
|
|
24
36
|
var getFileDataURL = (file) => new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/utils/toCreateMessage.ts"],"sourcesContent":["import { AppendMessage } from \"@assistant-ui/react\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/utils/toCreateMessage.ts"],"sourcesContent":["import { AppendMessage } from \"@assistant-ui/react\";\nimport {\n CreateUIMessage,\n FileUIPart,\n UIDataTypes,\n UIMessage,\n UIMessagePart,\n UITools,\n} from \"ai\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateUIMessage<UIMessage>> => {\n const textParts = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const parts: UIMessagePart<UIDataTypes, UITools>[] = [\n {\n type: \"text\",\n text: textParts,\n },\n ];\n\n // Add image parts\n const imageParts = message.content\n .filter((part) => part.type === \"image\")\n .map(\n (part) =>\n ({\n type: \"file\",\n mediaType: \"image/png\", // Default to PNG, could be made more dynamic\n url: part.image,\n }) satisfies FileUIPart,\n );\n\n parts.push(...imageParts);\n\n // Add attachment parts\n const attachmentParts = await Promise.all(\n (message.attachments ?? []).map(async (m) => {\n if (m.file == null) throw new Error(\"Attachment did not contain a file\");\n return {\n type: \"file\",\n mediaType: m.file.type,\n filename: m.file.name,\n url: await getFileDataURL(m.file),\n } satisfies FileUIPart;\n }),\n );\n\n parts.push(...attachmentParts);\n\n return {\n role: message.role,\n parts,\n };\n};\n\nconst getFileDataURL = (file: File) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = (error) => reject(error);\n\n reader.readAsDataURL(file);\n });\n"],"mappings":";AAUO,IAAM,kBAAkB,OAC7B,YACwC;AACxC,QAAM,YAAY,QAAQ,QACvB,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,MAAM;AAEd,QAAM,QAA+C;AAAA,IACnD;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAGA,QAAM,aAAa,QAAQ,QACxB,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,EACtC;AAAA,IACC,CAAC,UACE;AAAA,MACC,MAAM;AAAA,MACN,WAAW;AAAA;AAAA,MACX,KAAK,KAAK;AAAA,IACZ;AAAA,EACJ;AAEF,QAAM,KAAK,GAAG,UAAU;AAGxB,QAAM,kBAAkB,MAAM,QAAQ;AAAA,KACnC,QAAQ,eAAe,CAAC,GAAG,IAAI,OAAO,MAAM;AAC3C,UAAI,EAAE,QAAQ,KAAM,OAAM,IAAI,MAAM,mCAAmC;AACvE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,EAAE,KAAK;AAAA,QAClB,UAAU,EAAE,KAAK;AAAA,QACjB,KAAK,MAAM,eAAe,EAAE,IAAI;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,KAAK,GAAG,eAAe;AAE7B,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd;AAAA,EACF;AACF;AAEA,IAAM,iBAAiB,CAAC,SACtB,IAAI,QAAgB,CAAC,SAAS,WAAW;AACvC,QAAM,SAAS,IAAI,WAAW;AAE9B,SAAO,SAAS,MAAM,QAAQ,OAAO,MAAgB;AACrD,SAAO,UAAU,CAAC,UAAU,OAAO,KAAK;AAExC,SAAO,cAAc,IAAI;AAC3B,CAAC;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/ui/utils/vercelAttachmentAdapter.ts
|
|
2
|
-
import { generateId } from "
|
|
2
|
+
import { generateId } from "ai";
|
|
3
3
|
var vercelAttachmentAdapter = {
|
|
4
4
|
accept: "image/*, text/plain, text/html, text/markdown, text/csv, text/xml, text/json, text/css",
|
|
5
5
|
async add({ file }) {
|