@assistant-ui/react-ai-sdk 0.10.15 → 0.11.0-alpha.0-alpha
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 +1 -1
- package/dist/frontendTools.js +1 -1
- package/dist/frontendTools.js.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -16
- 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 +16 -12
- package/src/frontendTools.ts +1 -1
- package/src/index.ts +0 -11
- 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/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 -4
- package/dist/useChatRuntime.d.ts.map +0 -1
- package/dist/useChatRuntime.js +0 -12
- 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/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 -13
- package/src/useCloudRuntime.ts +0 -21
package/dist/frontendTools.d.ts
CHANGED
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,7 +1,3 @@
|
|
|
1
|
-
export * from "./rsc";
|
|
2
1
|
export * from "./ui";
|
|
3
|
-
export * from "./useChatRuntime";
|
|
4
|
-
export * from "./useCloudRuntime";
|
|
5
|
-
export { toLanguageModelMessages, toLanguageModelTools, fromLanguageModelMessages, fromLanguageModelTools, useDangerousInBrowserRuntime, } from "@assistant-ui/react-edge";
|
|
6
2
|
export { frontendTools } from "./frontendTools";
|
|
7
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,22 +1,7 @@
|
|
|
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
|
-
import {
|
|
7
|
-
toLanguageModelMessages,
|
|
8
|
-
toLanguageModelTools,
|
|
9
|
-
fromLanguageModelMessages,
|
|
10
|
-
fromLanguageModelTools,
|
|
11
|
-
useDangerousInBrowserRuntime
|
|
12
|
-
} from "@assistant-ui/react-edge";
|
|
13
3
|
import { frontendTools } from "./frontendTools.js";
|
|
14
4
|
export {
|
|
15
|
-
|
|
16
|
-
fromLanguageModelTools,
|
|
17
|
-
frontendTools,
|
|
18
|
-
toLanguageModelMessages,
|
|
19
|
-
toLanguageModelTools,
|
|
20
|
-
useDangerousInBrowserRuntime
|
|
5
|
+
frontendTools
|
|
21
6
|
};
|
|
22
7
|
//# sourceMappingURL=index.js.map
|
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) => {
|