@assistant-ui/react-ai-sdk 0.9.7 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +5 -56
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -441
- package/dist/index.js.map +1 -1
- package/dist/rsc/RSCDisplay.d.ts +3 -0
- package/dist/rsc/RSCDisplay.d.ts.map +1 -0
- package/dist/rsc/RSCDisplay.js +24 -0
- package/dist/rsc/RSCDisplay.js.map +1 -0
- package/dist/rsc/VercelRSCAdapter.d.ts +18 -0
- package/dist/rsc/VercelRSCAdapter.d.ts.map +1 -0
- package/dist/rsc/VercelRSCAdapter.js +2 -0
- package/dist/rsc/VercelRSCAdapter.js.map +1 -0
- package/dist/rsc/VercelRSCMessage.d.ts +8 -0
- package/dist/rsc/VercelRSCMessage.d.ts.map +1 -0
- package/dist/rsc/VercelRSCMessage.js +2 -0
- package/dist/rsc/VercelRSCMessage.js.map +1 -0
- package/dist/rsc/getVercelRSCMessage.d.ts +7 -0
- package/dist/rsc/getVercelRSCMessage.d.ts.map +1 -0
- package/dist/rsc/getVercelRSCMessage.js +10 -0
- package/dist/rsc/getVercelRSCMessage.js.map +1 -0
- package/dist/rsc/index.d.ts +6 -0
- package/dist/rsc/index.d.ts.map +1 -0
- package/dist/rsc/index.js +9 -0
- package/dist/rsc/index.js.map +1 -0
- package/dist/rsc/useVercelRSCRuntime.d.ts +3 -0
- package/dist/rsc/useVercelRSCRuntime.d.ts.map +1 -0
- package/dist/rsc/useVercelRSCRuntime.js +55 -0
- package/dist/rsc/useVercelRSCRuntime.js.map +1 -0
- package/dist/rsc/utils/RSCThreadExtras.d.ts +8 -0
- package/dist/rsc/utils/RSCThreadExtras.d.ts.map +1 -0
- package/dist/rsc/utils/RSCThreadExtras.js +6 -0
- package/dist/rsc/utils/RSCThreadExtras.js.map +1 -0
- package/dist/ui/getVercelAIMessages.d.ts +4 -0
- package/dist/ui/getVercelAIMessages.d.ts.map +1 -0
- package/dist/ui/getVercelAIMessages.js +10 -0
- package/dist/ui/getVercelAIMessages.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +11 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/use-assistant/useVercelUseAssistantRuntime.d.ts +7 -0
- package/dist/ui/use-assistant/useVercelUseAssistantRuntime.d.ts.map +1 -0
- package/dist/ui/use-assistant/useVercelUseAssistantRuntime.js +45 -0
- package/dist/ui/use-assistant/useVercelUseAssistantRuntime.js.map +1 -0
- package/dist/ui/use-chat/useVercelUseChatRuntime.d.ts +8 -0
- package/dist/ui/use-chat/useVercelUseChatRuntime.d.ts.map +1 -0
- package/dist/ui/use-chat/useVercelUseChatRuntime.js +72 -0
- package/dist/ui/use-chat/useVercelUseChatRuntime.js.map +1 -0
- package/dist/ui/utils/convertMessage.d.ts +14 -0
- package/dist/ui/utils/convertMessage.d.ts.map +1 -0
- package/dist/ui/utils/convertMessage.js +117 -0
- package/dist/ui/utils/convertMessage.js.map +1 -0
- package/dist/ui/utils/sliceMessagesUntil.d.ts +3 -0
- package/dist/ui/utils/sliceMessagesUntil.d.ts.map +1 -0
- package/dist/ui/utils/sliceMessagesUntil.js +16 -0
- package/dist/ui/utils/sliceMessagesUntil.js.map +1 -0
- package/dist/ui/utils/toCreateMessage.d.ts +4 -0
- package/dist/ui/utils/toCreateMessage.d.ts.map +1 -0
- package/dist/ui/utils/toCreateMessage.js +32 -0
- package/dist/ui/utils/toCreateMessage.js.map +1 -0
- package/dist/ui/utils/useInputSync.d.ts +6 -0
- package/dist/ui/utils/useInputSync.d.ts.map +1 -0
- package/dist/ui/utils/useInputSync.js +15 -0
- package/dist/ui/utils/useInputSync.js.map +1 -0
- package/dist/ui/utils/vercelAttachmentAdapter.d.ts +3 -0
- package/dist/ui/utils/vercelAttachmentAdapter.d.ts.map +1 -0
- package/dist/ui/utils/vercelAttachmentAdapter.js +28 -0
- package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -0
- package/dist/useChatRuntime.d.ts +5 -0
- package/dist/useChatRuntime.d.ts.map +1 -0
- package/dist/useChatRuntime.js +11 -0
- package/dist/useChatRuntime.js.map +1 -0
- package/package.json +15 -18
- package/src/index.ts +11 -0
- package/src/rsc/RSCDisplay.tsx +23 -0
- package/src/rsc/VercelRSCAdapter.tsx +23 -0
- package/src/rsc/VercelRSCMessage.tsx +9 -0
- package/src/rsc/getVercelRSCMessage.tsx +12 -0
- package/src/rsc/index.ts +5 -0
- package/src/rsc/useVercelRSCRuntime.tsx +70 -0
- package/src/rsc/utils/RSCThreadExtras.tsx +11 -0
- package/src/ui/getVercelAIMessages.tsx +9 -0
- package/src/ui/index.ts +4 -0
- package/src/ui/use-assistant/useVercelUseAssistantRuntime.tsx +58 -0
- package/src/ui/use-chat/useVercelUseChatRuntime.tsx +91 -0
- package/src/ui/utils/convertMessage.ts +158 -0
- package/src/ui/utils/sliceMessagesUntil.tsx +20 -0
- package/src/ui/utils/toCreateMessage.ts +44 -0
- package/src/ui/utils/useInputSync.tsx +24 -0
- package/src/ui/utils/vercelAttachmentAdapter.ts +29 -0
- package/src/useChatRuntime.ts +10 -0
- package/dist/index.d.mts +0 -56
- package/dist/index.mjs +0 -431
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VercelRSCMessage.d.ts","sourceRoot":"","sources":["../../src/rsc/VercelRSCMessage.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type ThreadMessage } from "@assistant-ui/react";
|
|
2
|
+
/**
|
|
3
|
+
* @deprecated Use `getExternalStoreMessage` instead. This method was specific to Vercel RSC
|
|
4
|
+
* implementation and has been replaced by a more generic external store message handler.
|
|
5
|
+
*/
|
|
6
|
+
export declare const getVercelRSCMessage: (message: ThreadMessage) => unknown;
|
|
7
|
+
//# sourceMappingURL=getVercelRSCMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getVercelRSCMessage.d.ts","sourceRoot":"","sources":["../../src/rsc/getVercelRSCMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,aAAa,YAEzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/rsc/getVercelRSCMessage.tsx"],"sourcesContent":["import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\n\n/**\n * @deprecated Use `getExternalStoreMessage` instead. This method was specific to Vercel RSC\n * implementation and has been replaced by a more generic external store message handler.\n */\nexport const getVercelRSCMessage = (message: ThreadMessage) => {\n return getExternalStoreMessage(message);\n};\n"],"mappings":"AAAA;AAAA,EACE;AAAA,OAEK;AAMA,MAAM,sBAAsB,CAAC,YAA2B;AAC7D,SAAO,wBAAwB,OAAO;AACxC;","names":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { useVercelRSCRuntime } from "./useVercelRSCRuntime";
|
|
2
|
+
export { getVercelRSCMessage } from "./getVercelRSCMessage";
|
|
3
|
+
export type { VercelRSCAdapter } from "./VercelRSCAdapter";
|
|
4
|
+
export type { VercelRSCMessage } from "./VercelRSCMessage";
|
|
5
|
+
export { RSCDisplay } from "./RSCDisplay";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rsc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useVercelRSCRuntime } from "./useVercelRSCRuntime";
|
|
2
|
+
import { getVercelRSCMessage } from "./getVercelRSCMessage";
|
|
3
|
+
import { RSCDisplay } from "./RSCDisplay";
|
|
4
|
+
export {
|
|
5
|
+
RSCDisplay,
|
|
6
|
+
getVercelRSCMessage,
|
|
7
|
+
useVercelRSCRuntime
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/rsc/index.ts"],"sourcesContent":["export { useVercelRSCRuntime } from \"./useVercelRSCRuntime\";\nexport { getVercelRSCMessage } from \"./getVercelRSCMessage\";\nexport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nexport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nexport { RSCDisplay } from \"./RSCDisplay\";\n"],"mappings":"AAAA,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AAGpC,SAAS,kBAAkB;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVercelRSCRuntime.d.ts","sourceRoot":"","sources":["../../src/rsc/useVercelRSCRuntime.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAyB3D,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,OAAO,EACnD,SAAS,gBAAgB,CAAC,CAAC,CAAC,mDAyC7B,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
useExternalMessageConverter,
|
|
4
|
+
useExternalStoreRuntime
|
|
5
|
+
} from "@assistant-ui/react";
|
|
6
|
+
import { useCallback, useMemo } from "react";
|
|
7
|
+
import { symbolInternalRSCExtras } from "./utils/RSCThreadExtras";
|
|
8
|
+
const vercelToThreadMessage = (converter, rawMessage) => {
|
|
9
|
+
const message = converter(rawMessage);
|
|
10
|
+
return {
|
|
11
|
+
id: message.id,
|
|
12
|
+
role: message.role,
|
|
13
|
+
content: [{ type: "text", text: "[Developer: Please set up RSCDisplay]" }],
|
|
14
|
+
createdAt: message.createdAt
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
const useVercelRSCRuntime = (adapter) => {
|
|
18
|
+
const onNew = adapter.onNew;
|
|
19
|
+
if (!onNew)
|
|
20
|
+
throw new Error("You must pass a onNew function to useVercelRSCRuntime");
|
|
21
|
+
const convertFn = useMemo(() => {
|
|
22
|
+
return adapter.convertMessage?.bind(adapter) ?? ((m) => m);
|
|
23
|
+
}, [adapter.convertMessage, adapter]);
|
|
24
|
+
const callback = useCallback(
|
|
25
|
+
(m) => {
|
|
26
|
+
return vercelToThreadMessage(convertFn, m);
|
|
27
|
+
},
|
|
28
|
+
[convertFn]
|
|
29
|
+
);
|
|
30
|
+
const messages = useExternalMessageConverter({
|
|
31
|
+
callback,
|
|
32
|
+
isRunning: adapter.isRunning ?? false,
|
|
33
|
+
messages: adapter.messages
|
|
34
|
+
});
|
|
35
|
+
const eAdapter = {
|
|
36
|
+
isRunning: adapter.isRunning,
|
|
37
|
+
messages,
|
|
38
|
+
onNew,
|
|
39
|
+
onEdit: adapter.onEdit,
|
|
40
|
+
onReload: adapter.onReload,
|
|
41
|
+
adapters: adapter.adapters,
|
|
42
|
+
unstable_capabilities: {
|
|
43
|
+
copy: false
|
|
44
|
+
},
|
|
45
|
+
extras: {
|
|
46
|
+
[symbolInternalRSCExtras]: { convertFn }
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const runtime = useExternalStoreRuntime(eAdapter);
|
|
50
|
+
return runtime;
|
|
51
|
+
};
|
|
52
|
+
export {
|
|
53
|
+
useVercelRSCRuntime
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=useVercelRSCRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/rsc/useVercelRSCRuntime.tsx"],"sourcesContent":["\"use client\";\n\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport {\n ExternalStoreAdapter,\n ThreadMessageLike,\n useExternalMessageConverter,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useCallback, useMemo } from \"react\";\nimport { symbolInternalRSCExtras } from \"./utils/RSCThreadExtras\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): ThreadMessageLike => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"text\", text: \"[Developer: Please set up RSCDisplay]\" }],\n createdAt: message.createdAt,\n };\n};\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const onNew = adapter.onNew;\n if (!onNew)\n throw new Error(\"You must pass a onNew function to useVercelRSCRuntime\");\n\n const convertFn = useMemo(() => {\n return (\n adapter.convertMessage?.bind(adapter) ?? ((m: T) => m as VercelRSCMessage)\n );\n }, [adapter.convertMessage, adapter]);\n const callback = useCallback(\n (m: T) => {\n return vercelToThreadMessage(convertFn, m);\n },\n [convertFn],\n );\n\n const messages = useExternalMessageConverter({\n callback,\n isRunning: adapter.isRunning ?? false,\n messages: adapter.messages,\n });\n\n const eAdapter: ExternalStoreAdapter = {\n isRunning: adapter.isRunning,\n messages,\n onNew,\n onEdit: adapter.onEdit,\n onReload: adapter.onReload,\n adapters: adapter.adapters,\n unstable_capabilities: {\n copy: false,\n },\n extras: {\n [symbolInternalRSCExtras]: { convertFn },\n },\n };\n\n const runtime = useExternalStoreRuntime(eAdapter);\n return runtime;\n};\n"],"mappings":";AAGA;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,aAAa,eAAe;AACrC,SAAS,+BAA+B;AAExC,MAAM,wBAAwB,CAC5B,WACA,eACsB;AACtB,QAAM,UAAU,UAAU,UAAU;AAEpC,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,wCAAwC,CAAC;AAAA,IACzE,WAAW,QAAQ;AAAA,EACrB;AACF;AAEO,MAAM,sBAAsB,CACjC,YACG;AACH,QAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,uDAAuD;AAEzE,QAAM,YAAY,QAAQ,MAAM;AAC9B,WACE,QAAQ,gBAAgB,KAAK,OAAO,MAAM,CAAC,MAAS;AAAA,EAExD,GAAG,CAAC,QAAQ,gBAAgB,OAAO,CAAC;AACpC,QAAM,WAAW;AAAA,IACf,CAAC,MAAS;AACR,aAAO,sBAAsB,WAAW,CAAC;AAAA,IAC3C;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,WAAW,4BAA4B;AAAA,IAC3C;AAAA,IACA,WAAW,QAAQ,aAAa;AAAA,IAChC,UAAU,QAAQ;AAAA,EACpB,CAAC;AAED,QAAM,WAAiC;AAAA,IACrC,WAAW,QAAQ;AAAA,IACnB;AAAA,IACA;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ;AAAA,IAClB,uBAAuB;AAAA,MACrB,MAAM;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,MACN,CAAC,uBAAuB,GAAG,EAAE,UAAU;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,UAAU,wBAAwB,QAAQ;AAChD,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { VercelRSCMessage } from "../VercelRSCMessage";
|
|
2
|
+
export declare const symbolInternalRSCExtras: unique symbol;
|
|
3
|
+
export type RSCThreadExtras = {
|
|
4
|
+
[symbolInternalRSCExtras]?: {
|
|
5
|
+
convertFn: (message: any) => VercelRSCMessage;
|
|
6
|
+
};
|
|
7
|
+
} | undefined;
|
|
8
|
+
//# sourceMappingURL=RSCThreadExtras.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RSCThreadExtras.d.ts","sourceRoot":"","sources":["../../../src/rsc/utils/RSCThreadExtras.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,eAAO,MAAM,uBAAuB,eAAgC,CAAC;AACrE,MAAM,MAAM,eAAe,GACvB;IACE,CAAC,uBAAuB,CAAC,CAAC,EAAE;QAC1B,SAAS,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,gBAAgB,CAAC;KAC/C,CAAC;CACH,GACD,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/rsc/utils/RSCThreadExtras.tsx"],"sourcesContent":["\"use client\";\nimport { VercelRSCMessage } from \"../VercelRSCMessage\";\n\nexport const symbolInternalRSCExtras = Symbol(\"internal-rsc-extras\");\nexport type RSCThreadExtras =\n | {\n [symbolInternalRSCExtras]?: {\n convertFn: (message: any) => VercelRSCMessage;\n };\n }\n | undefined;\n"],"mappings":";AAGO,MAAM,0BAA0B,OAAO,qBAAqB;","names":[]}
|
|
@@ -0,0 +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,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,eAAO,MAAM,mBAAmB,GAAI,SAAS,aAAa,KACb,OAAO,EACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/getVercelAIMessages.tsx"],"sourcesContent":["import {\n getExternalStoreMessage,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const getVercelAIMessages = (message: ThreadMessage) => {\n return getExternalStoreMessage(message) as Message[];\n};\n"],"mappings":"AAAA;AAAA,EACE;AAAA,OAEK;AAGA,MAAM,sBAAsB,CAAC,YAA2B;AAC7D,SAAO,wBAAwB,OAAO;AACxC;","names":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { useVercelUseChatRuntime } from "./use-chat/useVercelUseChatRuntime";
|
|
2
|
+
export { useVercelUseAssistantRuntime } from "./use-assistant/useVercelUseAssistantRuntime";
|
|
3
|
+
export { getVercelAIMessages } from "./getVercelAIMessages";
|
|
4
|
+
export { AISDKMessageConverter } from "./utils/convertMessage";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,8CAA8C,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useVercelUseChatRuntime } from "./use-chat/useVercelUseChatRuntime";
|
|
2
|
+
import { useVercelUseAssistantRuntime } from "./use-assistant/useVercelUseAssistantRuntime";
|
|
3
|
+
import { getVercelAIMessages } from "./getVercelAIMessages";
|
|
4
|
+
import { AISDKMessageConverter } from "./utils/convertMessage";
|
|
5
|
+
export {
|
|
6
|
+
AISDKMessageConverter,
|
|
7
|
+
getVercelAIMessages,
|
|
8
|
+
useVercelUseAssistantRuntime,
|
|
9
|
+
useVercelUseChatRuntime
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/index.ts"],"sourcesContent":["export { useVercelUseChatRuntime } from \"./use-chat/useVercelUseChatRuntime\";\nexport { useVercelUseAssistantRuntime } from \"./use-assistant/useVercelUseAssistantRuntime\";\nexport { getVercelAIMessages } from \"./getVercelAIMessages\";\nexport { AISDKMessageConverter } from \"./utils/convertMessage\";\n"],"mappings":"AAAA,SAAS,+BAA+B;AACxC,SAAS,oCAAoC;AAC7C,SAAS,2BAA2B;AACpC,SAAS,6BAA6B;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { useAssistant } from "@ai-sdk/react";
|
|
2
|
+
import { ExternalStoreAdapter } from "@assistant-ui/react";
|
|
3
|
+
export type VercelUseChatAdapter = {
|
|
4
|
+
adapters?: Omit<NonNullable<ExternalStoreAdapter["adapters"]>, "attachments"> | undefined;
|
|
5
|
+
};
|
|
6
|
+
export declare const useVercelUseAssistantRuntime: (assistantHelpers: ReturnType<typeof useAssistant>, adapter?: VercelUseChatAdapter) => import("@assistant-ui/react").AssistantRuntime;
|
|
7
|
+
//# sourceMappingURL=useVercelUseAssistantRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVercelUseAssistantRuntime.d.ts","sourceRoot":"","sources":["../../../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAKlD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EACL,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,EAAE,aAAa,CAAC,GAClE,SAAS,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,kBAAkB,UAAU,CAAC,OAAO,YAAY,CAAC,EACjD,UAAS,oBAAyB,mDAyCnC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useExternalStoreRuntime } from "@assistant-ui/react";
|
|
2
|
+
import { useInputSync } from "../utils/useInputSync";
|
|
3
|
+
import { toCreateMessage } from "../utils/toCreateMessage";
|
|
4
|
+
import { vercelAttachmentAdapter } from "../utils/vercelAttachmentAdapter";
|
|
5
|
+
import { AISDKMessageConverter } from "../utils/convertMessage";
|
|
6
|
+
const useVercelUseAssistantRuntime = (assistantHelpers, adapter = {}) => {
|
|
7
|
+
const messages = AISDKMessageConverter.useThreadMessages({
|
|
8
|
+
messages: assistantHelpers.messages,
|
|
9
|
+
isRunning: assistantHelpers.status === "in_progress"
|
|
10
|
+
});
|
|
11
|
+
const runtime = useExternalStoreRuntime({
|
|
12
|
+
isRunning: assistantHelpers.status === "in_progress",
|
|
13
|
+
messages,
|
|
14
|
+
onCancel: async () => assistantHelpers.stop(),
|
|
15
|
+
onNew: async (message) => {
|
|
16
|
+
await assistantHelpers.append(await toCreateMessage(message));
|
|
17
|
+
},
|
|
18
|
+
adapters: {
|
|
19
|
+
attachments: vercelAttachmentAdapter,
|
|
20
|
+
...adapter.adapters,
|
|
21
|
+
threadList: new Proxy(adapter.adapters?.threadList ?? {}, {
|
|
22
|
+
get(target, prop, receiver) {
|
|
23
|
+
if (prop === "onSwitchToNewThread") {
|
|
24
|
+
return () => {
|
|
25
|
+
assistantHelpers.messages = [];
|
|
26
|
+
assistantHelpers.input = "";
|
|
27
|
+
assistantHelpers.setMessages([]);
|
|
28
|
+
assistantHelpers.setInput("");
|
|
29
|
+
if (typeof target.onSwitchToNewThread === "function") {
|
|
30
|
+
return target.onSwitchToNewThread.call(target);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return Reflect.get(target, prop, receiver);
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
useInputSync(assistantHelpers, runtime);
|
|
40
|
+
return runtime;
|
|
41
|
+
};
|
|
42
|
+
export {
|
|
43
|
+
useVercelUseAssistantRuntime
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=useVercelUseAssistantRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/use-assistant/useVercelUseAssistantRuntime.tsx"],"sourcesContent":["import type { useAssistant } from \"@ai-sdk/react\";\nimport { useExternalStoreRuntime } from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\nimport { toCreateMessage } from \"../utils/toCreateMessage\";\nimport { vercelAttachmentAdapter } from \"../utils/vercelAttachmentAdapter\";\nimport { ExternalStoreAdapter } from \"@assistant-ui/react\";\nimport { AISDKMessageConverter } from \"../utils/convertMessage\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n};\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: ReturnType<typeof useAssistant>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = AISDKMessageConverter.useThreadMessages({\n messages: assistantHelpers.messages,\n isRunning: assistantHelpers.status === \"in_progress\",\n });\n\n const runtime = useExternalStoreRuntime({\n isRunning: assistantHelpers.status === \"in_progress\",\n messages,\n onCancel: async () => assistantHelpers.stop(),\n onNew: async (message) => {\n await assistantHelpers.append(await toCreateMessage(message));\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n assistantHelpers.messages = [];\n assistantHelpers.input = \"\";\n assistantHelpers.setMessages([]);\n assistantHelpers.setInput(\"\");\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(assistantHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":"AACA,SAAS,+BAA+B;AACxC,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AAExC,SAAS,6BAA6B;AAQ/B,MAAM,+BAA+B,CAC1C,kBACA,UAAgC,CAAC,MAC9B;AACH,QAAM,WAAW,sBAAsB,kBAAkB;AAAA,IACvD,UAAU,iBAAiB;AAAA,IAC3B,WAAW,iBAAiB,WAAW;AAAA,EACzC,CAAC;AAED,QAAM,UAAU,wBAAwB;AAAA,IACtC,WAAW,iBAAiB,WAAW;AAAA,IACvC;AAAA,IACA,UAAU,YAAY,iBAAiB,KAAK;AAAA,IAC5C,OAAO,OAAO,YAAY;AACxB,YAAM,iBAAiB,OAAO,MAAM,gBAAgB,OAAO,CAAC;AAAA,IAC9D;AAAA,IACA,UAAU;AAAA,MACR,aAAa;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,YAAY,IAAI,MAAM,QAAQ,UAAU,cAAc,CAAC,GAAG;AAAA,QACxD,IAAI,QAAQ,MAAM,UAAU;AAC1B,cAAI,SAAS,uBAAuB;AAClC,mBAAO,MAAM;AACX,+BAAiB,WAAW,CAAC;AAC7B,+BAAiB,QAAQ;AACzB,+BAAiB,YAAY,CAAC,CAAC;AAC/B,+BAAiB,SAAS,EAAE;AAE5B,kBAAI,OAAO,OAAO,wBAAwB,YAAY;AACpD,uBAAO,OAAO,oBAAoB,KAAK,MAAM;AAAA,cAC/C;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,eAAa,kBAAkB,OAAO;AAEtC,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { useChat } from "@ai-sdk/react";
|
|
2
|
+
import { ExternalStoreAdapter } from "@assistant-ui/react";
|
|
3
|
+
export type VercelUseChatAdapter = {
|
|
4
|
+
adapters?: Omit<NonNullable<ExternalStoreAdapter["adapters"]>, "attachments"> | undefined;
|
|
5
|
+
unstable_joinStrategy?: "concat-content" | "none";
|
|
6
|
+
};
|
|
7
|
+
export declare const useVercelUseChatRuntime: (chatHelpers: ReturnType<typeof useChat>, adapter?: VercelUseChatAdapter) => import("@assistant-ui/react").AssistantRuntime;
|
|
8
|
+
//# sourceMappingURL=useVercelUseChatRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVercelUseChatRuntime.d.ts","sourceRoot":"","sources":["../../../src/ui/use-chat/useVercelUseChatRuntime.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAO7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAK3D,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EACL,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,EAAE,aAAa,CAAC,GAClE,SAAS,CAAC;IACd,qBAAqB,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,aAAa,UAAU,CAAC,OAAO,OAAO,CAAC,EACvC,UAAS,oBAAyB,mDAqEnC,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { useExternalStoreRuntime } from "@assistant-ui/react";
|
|
2
|
+
import { useInputSync } from "../utils/useInputSync";
|
|
3
|
+
import { sliceMessagesUntil } from "../utils/sliceMessagesUntil";
|
|
4
|
+
import { toCreateMessage } from "../utils/toCreateMessage";
|
|
5
|
+
import { vercelAttachmentAdapter } from "../utils/vercelAttachmentAdapter";
|
|
6
|
+
import { getVercelAIMessages } from "../getVercelAIMessages";
|
|
7
|
+
import { useState } from "react";
|
|
8
|
+
import { generateId } from "@ai-sdk/ui-utils";
|
|
9
|
+
import { AISDKMessageConverter } from "../utils/convertMessage";
|
|
10
|
+
const useVercelUseChatRuntime = (chatHelpers, adapter = {}) => {
|
|
11
|
+
const messages = AISDKMessageConverter.useThreadMessages({
|
|
12
|
+
isRunning: chatHelpers.status === "submitted" || chatHelpers.status == "streaming",
|
|
13
|
+
messages: chatHelpers.messages,
|
|
14
|
+
joinStrategy: adapter.unstable_joinStrategy
|
|
15
|
+
});
|
|
16
|
+
const [threadId, setThreadId] = useState(generateId());
|
|
17
|
+
const runtime = useExternalStoreRuntime({
|
|
18
|
+
isRunning: chatHelpers.isLoading,
|
|
19
|
+
messages,
|
|
20
|
+
setMessages: (messages2) => chatHelpers.setMessages(messages2.map(getVercelAIMessages).flat()),
|
|
21
|
+
onCancel: async () => chatHelpers.stop(),
|
|
22
|
+
onNew: async (message) => {
|
|
23
|
+
await chatHelpers.append(await toCreateMessage(message));
|
|
24
|
+
},
|
|
25
|
+
onEdit: async (message) => {
|
|
26
|
+
const newMessages = sliceMessagesUntil(
|
|
27
|
+
chatHelpers.messages,
|
|
28
|
+
message.parentId
|
|
29
|
+
);
|
|
30
|
+
chatHelpers.setMessages(newMessages);
|
|
31
|
+
await chatHelpers.append(await toCreateMessage(message));
|
|
32
|
+
},
|
|
33
|
+
onReload: async (parentId) => {
|
|
34
|
+
const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);
|
|
35
|
+
chatHelpers.setMessages(newMessages);
|
|
36
|
+
await chatHelpers.reload();
|
|
37
|
+
},
|
|
38
|
+
onAddToolResult: ({ toolCallId, result }) => {
|
|
39
|
+
chatHelpers.addToolResult({ toolCallId, result });
|
|
40
|
+
},
|
|
41
|
+
adapters: {
|
|
42
|
+
attachments: vercelAttachmentAdapter,
|
|
43
|
+
...adapter.adapters,
|
|
44
|
+
threadList: new Proxy(adapter.adapters?.threadList ?? {}, {
|
|
45
|
+
get(target, prop, receiver) {
|
|
46
|
+
if (prop === "threadId") {
|
|
47
|
+
return target.threadId ?? threadId;
|
|
48
|
+
}
|
|
49
|
+
if (prop === "onSwitchToNewThread") {
|
|
50
|
+
return () => {
|
|
51
|
+
chatHelpers.messages = [];
|
|
52
|
+
chatHelpers.input = "";
|
|
53
|
+
chatHelpers.setMessages([]);
|
|
54
|
+
chatHelpers.setInput("");
|
|
55
|
+
setThreadId(generateId());
|
|
56
|
+
if (typeof target.onSwitchToNewThread === "function") {
|
|
57
|
+
return target.onSwitchToNewThread.call(target);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return Reflect.get(target, prop, receiver);
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
useInputSync(chatHelpers, runtime);
|
|
67
|
+
return runtime;
|
|
68
|
+
};
|
|
69
|
+
export {
|
|
70
|
+
useVercelUseChatRuntime
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=useVercelUseChatRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/use-chat/useVercelUseChatRuntime.tsx"],"sourcesContent":["import type { useChat } from \"@ai-sdk/react\";\nimport { useExternalStoreRuntime } from \"@assistant-ui/react\";\nimport { useInputSync } from \"../utils/useInputSync\";\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 { useState } from \"react\";\nimport { generateId } from \"@ai-sdk/ui-utils\";\nimport { AISDKMessageConverter } from \"../utils/convertMessage\";\n\nexport type VercelUseChatAdapter = {\n adapters?:\n | Omit<NonNullable<ExternalStoreAdapter[\"adapters\"]>, \"attachments\">\n | undefined;\n unstable_joinStrategy?: \"concat-content\" | \"none\";\n};\n\nexport const useVercelUseChatRuntime = (\n chatHelpers: ReturnType<typeof useChat>,\n adapter: VercelUseChatAdapter = {},\n) => {\n const messages = AISDKMessageConverter.useThreadMessages({\n isRunning:\n chatHelpers.status === \"submitted\" || chatHelpers.status == \"streaming\",\n messages: chatHelpers.messages,\n joinStrategy: adapter.unstable_joinStrategy,\n });\n\n const [threadId, setThreadId] = useState<string>(generateId());\n\n const runtime = useExternalStoreRuntime({\n isRunning: chatHelpers.isLoading,\n messages,\n setMessages: (messages) =>\n chatHelpers.setMessages(messages.map(getVercelAIMessages).flat()),\n onCancel: async () => chatHelpers.stop(),\n onNew: async (message) => {\n await chatHelpers.append(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.append(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.reload();\n },\n onAddToolResult: ({ toolCallId, result }) => {\n chatHelpers.addToolResult({ toolCallId, result });\n },\n adapters: {\n attachments: vercelAttachmentAdapter,\n ...adapter.adapters,\n threadList: new Proxy(adapter.adapters?.threadList ?? {}, {\n get(target, prop, receiver) {\n if (prop === \"threadId\") {\n return target.threadId ?? threadId;\n }\n if (prop === \"onSwitchToNewThread\") {\n return () => {\n chatHelpers.messages = [];\n chatHelpers.input = \"\";\n chatHelpers.setMessages([]);\n chatHelpers.setInput(\"\");\n setThreadId(generateId());\n\n if (typeof target.onSwitchToNewThread === \"function\") {\n return target.onSwitchToNewThread.call(target);\n }\n };\n }\n\n return Reflect.get(target, prop, receiver);\n },\n }),\n },\n });\n\n useInputSync(chatHelpers, runtime);\n\n return runtime;\n};\n"],"mappings":"AACA,SAAS,+BAA+B;AACxC,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,2BAA2B;AAEpC,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,6BAA6B;AAS/B,MAAM,0BAA0B,CACrC,aACA,UAAgC,CAAC,MAC9B;AACH,QAAM,WAAW,sBAAsB,kBAAkB;AAAA,IACvD,WACE,YAAY,WAAW,eAAe,YAAY,UAAU;AAAA,IAC9D,UAAU,YAAY;AAAA,IACtB,cAAc,QAAQ;AAAA,EACxB,CAAC;AAED,QAAM,CAAC,UAAU,WAAW,IAAI,SAAiB,WAAW,CAAC;AAE7D,QAAM,UAAU,wBAAwB;AAAA,IACtC,WAAW,YAAY;AAAA,IACvB;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,OAAO,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACzD;AAAA,IACA,QAAQ,OAAO,YAAY;AACzB,YAAM,cAAc;AAAA,QAClB,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AACA,kBAAY,YAAY,WAAW;AAEnC,YAAM,YAAY,OAAO,MAAM,gBAAgB,OAAO,CAAC;AAAA,IACzD;AAAA,IACA,UAAU,OAAO,aAA4B;AAC3C,YAAM,cAAc,mBAAmB,YAAY,UAAU,QAAQ;AACrE,kBAAY,YAAY,WAAW;AAEnC,YAAM,YAAY,OAAO;AAAA,IAC3B;AAAA,IACA,iBAAiB,CAAC,EAAE,YAAY,OAAO,MAAM;AAC3C,kBAAY,cAAc,EAAE,YAAY,OAAO,CAAC;AAAA,IAClD;AAAA,IACA,UAAU;AAAA,MACR,aAAa;AAAA,MACb,GAAG,QAAQ;AAAA,MACX,YAAY,IAAI,MAAM,QAAQ,UAAU,cAAc,CAAC,GAAG;AAAA,QACxD,IAAI,QAAQ,MAAM,UAAU;AAC1B,cAAI,SAAS,YAAY;AACvB,mBAAO,OAAO,YAAY;AAAA,UAC5B;AACA,cAAI,SAAS,uBAAuB;AAClC,mBAAO,MAAM;AACX,0BAAY,WAAW,CAAC;AACxB,0BAAY,QAAQ;AACpB,0BAAY,YAAY,CAAC,CAAC;AAC1B,0BAAY,SAAS,EAAE;AACvB,0BAAY,WAAW,CAAC;AAExB,kBAAI,OAAO,OAAO,wBAAwB,YAAY;AACpD,uBAAO,OAAO,oBAAoB,KAAK,MAAM;AAAA,cAC/C;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,eAAa,aAAa,OAAO;AAEjC,SAAO;AACT;","names":["messages"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Message } from "@ai-sdk/ui-utils";
|
|
2
|
+
export declare const AISDKMessageConverter: {
|
|
3
|
+
useThreadMessages: ({ messages, isRunning, joinStrategy, }: {
|
|
4
|
+
messages: Message[];
|
|
5
|
+
isRunning: boolean;
|
|
6
|
+
joinStrategy?: "concat-content" | "none" | undefined;
|
|
7
|
+
}) => import("@assistant-ui/react").ThreadMessage[];
|
|
8
|
+
toThreadMessages: (messages: Message[]) => import("@assistant-ui/react").ThreadMessage[];
|
|
9
|
+
toOriginalMessages: (input: import("@assistant-ui/react").ThreadState | import("@assistant-ui/react").ThreadMessage | import("@assistant-ui/react").ThreadMessage["content"][number]) => unknown[];
|
|
10
|
+
toOriginalMessage: (input: import("@assistant-ui/react").ThreadState | import("@assistant-ui/react").ThreadMessage | import("@assistant-ui/react").ThreadMessage["content"][number]) => {};
|
|
11
|
+
useOriginalMessage: () => Message;
|
|
12
|
+
useOriginalMessages: () => Message[];
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=convertMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convertMessage.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/convertMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAS3C,eAAO,MAAM,qBAAqB;;;;;;;0HAI1B,sDACI;yHAGF,sDAAqB;;;CA4I9B,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { unstable_createMessageConverter } from "@assistant-ui/react";
|
|
2
|
+
const AISDKMessageConverter = unstable_createMessageConverter(
|
|
3
|
+
(message) => {
|
|
4
|
+
switch (message.role) {
|
|
5
|
+
case "user":
|
|
6
|
+
return {
|
|
7
|
+
role: "user",
|
|
8
|
+
id: message.id,
|
|
9
|
+
createdAt: message.createdAt,
|
|
10
|
+
content: message.content,
|
|
11
|
+
attachments: message.experimental_attachments?.map(
|
|
12
|
+
(attachment, idx) => ({
|
|
13
|
+
id: idx.toString(),
|
|
14
|
+
type: "file",
|
|
15
|
+
name: attachment.name ?? attachment.url,
|
|
16
|
+
content: [],
|
|
17
|
+
contentType: attachment.contentType ?? "unknown/unknown",
|
|
18
|
+
status: { type: "complete" }
|
|
19
|
+
})
|
|
20
|
+
)
|
|
21
|
+
};
|
|
22
|
+
case "system":
|
|
23
|
+
return {
|
|
24
|
+
role: "system",
|
|
25
|
+
id: message.id,
|
|
26
|
+
createdAt: message.createdAt,
|
|
27
|
+
content: message.content
|
|
28
|
+
};
|
|
29
|
+
case "assistant":
|
|
30
|
+
return {
|
|
31
|
+
role: "assistant",
|
|
32
|
+
id: message.id,
|
|
33
|
+
createdAt: message.createdAt,
|
|
34
|
+
content: message.parts?.filter((p) => p.type !== "step-start").map((part) => {
|
|
35
|
+
const type = part.type;
|
|
36
|
+
switch (type) {
|
|
37
|
+
case "text":
|
|
38
|
+
return {
|
|
39
|
+
type: "text",
|
|
40
|
+
text: part.text
|
|
41
|
+
};
|
|
42
|
+
case "tool-invocation":
|
|
43
|
+
return {
|
|
44
|
+
type: "tool-call",
|
|
45
|
+
toolName: part.toolInvocation.toolName,
|
|
46
|
+
toolCallId: part.toolInvocation.toolCallId,
|
|
47
|
+
argsText: JSON.stringify(part.toolInvocation.args),
|
|
48
|
+
args: part.toolInvocation.args,
|
|
49
|
+
result: part.toolInvocation.state === "result" && part.toolInvocation.result
|
|
50
|
+
};
|
|
51
|
+
case "reasoning":
|
|
52
|
+
return {
|
|
53
|
+
type: "reasoning",
|
|
54
|
+
text: part.reasoning
|
|
55
|
+
};
|
|
56
|
+
case "source":
|
|
57
|
+
return {
|
|
58
|
+
type: "source",
|
|
59
|
+
...part.source
|
|
60
|
+
};
|
|
61
|
+
case "file":
|
|
62
|
+
return {
|
|
63
|
+
type: "file",
|
|
64
|
+
data: part.data,
|
|
65
|
+
mimeType: part.mimeType
|
|
66
|
+
};
|
|
67
|
+
default: {
|
|
68
|
+
const _unsupported2 = type;
|
|
69
|
+
throw new Error(
|
|
70
|
+
`You have a message with an unsupported part type. The type ${_unsupported2} is not supported.`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}) ?? (message.content ? [
|
|
75
|
+
{
|
|
76
|
+
type: "text",
|
|
77
|
+
text: message.content
|
|
78
|
+
}
|
|
79
|
+
] : []),
|
|
80
|
+
metadata: {
|
|
81
|
+
unstable_annotations: message.annotations,
|
|
82
|
+
unstable_data: Array.isArray(message.data) ? message.data : message.data ? [message.data] : void 0
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
case "data": {
|
|
86
|
+
if (!message.data || !(typeof message.data === "object") || Array.isArray(message.data))
|
|
87
|
+
return [];
|
|
88
|
+
const data = message.data;
|
|
89
|
+
if (data.type === "tool-call") {
|
|
90
|
+
return {
|
|
91
|
+
role: "assistant",
|
|
92
|
+
id: message.id,
|
|
93
|
+
createdAt: message.createdAt,
|
|
94
|
+
content: [data]
|
|
95
|
+
};
|
|
96
|
+
} else if (data.type === "tool-result") {
|
|
97
|
+
return {
|
|
98
|
+
role: "tool",
|
|
99
|
+
id: message.id,
|
|
100
|
+
toolCallId: data.toolCallId,
|
|
101
|
+
result: data.result
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
default:
|
|
107
|
+
const _unsupported = message.role;
|
|
108
|
+
throw new Error(
|
|
109
|
+
`You have a message with an unsupported role. The role ${_unsupported} is not supported.`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
export {
|
|
115
|
+
AISDKMessageConverter
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=convertMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/utils/convertMessage.ts"],"sourcesContent":["import { Message } from \"@ai-sdk/ui-utils\";\nimport { unstable_createMessageConverter } from \"@assistant-ui/react\";\nimport { SourceContentPart } from \"@assistant-ui/react\";\nimport { FileContentPart } from \"@assistant-ui/react\";\nimport { ReasoningContentPart } from \"@assistant-ui/react\";\nimport { ToolCallContentPart } from \"@assistant-ui/react\";\nimport { TextContentPart } from \"@assistant-ui/react\";\nimport { CompleteAttachment } from \"@assistant-ui/react\";\n\nexport const AISDKMessageConverter = unstable_createMessageConverter(\n (message: Message) => {\n switch (message.role) {\n case \"user\":\n return {\n role: \"user\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n\n attachments: message.experimental_attachments?.map(\n (attachment, idx) =>\n ({\n id: idx.toString(),\n type: \"file\",\n name: attachment.name ?? attachment.url,\n content: [],\n contentType: attachment.contentType ?? \"unknown/unknown\",\n status: { type: \"complete\" },\n }) satisfies CompleteAttachment,\n ),\n };\n\n case \"system\":\n return {\n role: \"system\",\n id: message.id,\n createdAt: message.createdAt,\n content: message.content,\n };\n\n case \"assistant\":\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content:\n message.parts\n ?.filter((p) => p.type !== \"step-start\")\n .map((part) => {\n const type = part.type;\n switch (type) {\n case \"text\":\n return {\n type: \"text\",\n text: part.text,\n } satisfies TextContentPart;\n case \"tool-invocation\":\n return {\n type: \"tool-call\",\n toolName: part.toolInvocation.toolName,\n toolCallId: part.toolInvocation.toolCallId,\n argsText: JSON.stringify(part.toolInvocation.args),\n args: part.toolInvocation.args,\n result:\n part.toolInvocation.state === \"result\" &&\n part.toolInvocation.result,\n } satisfies ToolCallContentPart;\n case \"reasoning\":\n return {\n type: \"reasoning\",\n text: part.reasoning,\n } satisfies ReasoningContentPart;\n\n case \"source\":\n return {\n type: \"source\",\n ...part.source,\n } satisfies SourceContentPart;\n\n case \"file\":\n return {\n type: \"file\",\n data: part.data,\n mimeType: part.mimeType,\n } satisfies FileContentPart;\n\n default: {\n const _unsupported: never = type;\n throw new Error(\n `You have a message with an unsupported part type. The type ${_unsupported} is not supported.`,\n );\n }\n }\n }) ??\n (message.content\n ? [\n {\n type: \"text\",\n text: message.content,\n } satisfies TextContentPart,\n ]\n : []),\n metadata: {\n unstable_annotations: message.annotations,\n unstable_data: Array.isArray(message.data)\n ? message.data\n : message.data\n ? [message.data]\n : undefined,\n },\n };\n\n case \"data\": {\n type MaybeSupportedDataMessage =\n | { type?: \"unsafe_other\" }\n | ToolCallContentPart\n | {\n type: \"tool-result\";\n toolCallId: string;\n result: any;\n };\n\n if (\n !message.data ||\n !(typeof message.data === \"object\") ||\n Array.isArray(message.data)\n )\n return [];\n\n const data = message.data as MaybeSupportedDataMessage;\n\n if (data.type === \"tool-call\") {\n return {\n role: \"assistant\",\n id: message.id,\n createdAt: message.createdAt,\n content: [data],\n };\n } else if (data.type === \"tool-result\") {\n return {\n role: \"tool\",\n id: message.id,\n toolCallId: data.toolCallId,\n result: data.result,\n };\n }\n return [];\n }\n\n default:\n // TODO handle tool and function messages\n const _unsupported: \"function\" | \"tool\" = message.role;\n throw new Error(\n `You have a message with an unsupported role. The role ${_unsupported} is not supported.`,\n );\n }\n },\n);\n"],"mappings":"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","names":["_unsupported"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sliceMessagesUntil.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/sliceMessagesUntil.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,eAAO,MAAM,kBAAkB,GAC7B,UAAU,OAAO,EAAE,EACnB,WAAW,MAAM,GAAG,IAAI,cAezB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const sliceMessagesUntil = (messages, messageId) => {
|
|
2
|
+
if (messageId == null) return [];
|
|
3
|
+
let messageIdx = messages.findIndex((m) => m.id === messageId);
|
|
4
|
+
if (messageIdx === -1)
|
|
5
|
+
throw new Error(
|
|
6
|
+
"useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui."
|
|
7
|
+
);
|
|
8
|
+
while (messages[messageIdx + 1]?.role === "assistant") {
|
|
9
|
+
messageIdx++;
|
|
10
|
+
}
|
|
11
|
+
return messages.slice(0, messageIdx + 1);
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
sliceMessagesUntil
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=sliceMessagesUntil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/utils/sliceMessagesUntil.tsx"],"sourcesContent":["import type { Message } from \"@ai-sdk/ui-utils\";\n\nexport const sliceMessagesUntil = (\n messages: Message[],\n messageId: string | null,\n) => {\n if (messageId == null) return [];\n\n let messageIdx = messages.findIndex((m) => m.id === messageId);\n if (messageIdx === -1)\n throw new Error(\n \"useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui.\",\n );\n\n while (messages[messageIdx + 1]?.role === \"assistant\") {\n messageIdx++;\n }\n\n return messages.slice(0, messageIdx + 1);\n};\n"],"mappings":"AAEO,MAAM,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":[]}
|
|
@@ -0,0 +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,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,eAAO,MAAM,eAAe,GAC1B,SAAS,aAAa,KACrB,OAAO,CAAC,aAAa,CA4BvB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const toCreateMessage = async (message) => {
|
|
2
|
+
const content = message.content.filter((part) => part.type === "text").map((t) => t.text).join("\n\n");
|
|
3
|
+
const images = message.content.filter((part) => part.type === "image").map((part) => ({ url: part.image }));
|
|
4
|
+
return {
|
|
5
|
+
role: message.role,
|
|
6
|
+
content,
|
|
7
|
+
experimental_attachments: [
|
|
8
|
+
...images,
|
|
9
|
+
...await Promise.all(
|
|
10
|
+
(message.attachments ?? []).map(async (m) => {
|
|
11
|
+
if (m.file == null)
|
|
12
|
+
throw new Error("Attachment did not contain a file");
|
|
13
|
+
return {
|
|
14
|
+
contentType: m.file.type,
|
|
15
|
+
name: m.file.name,
|
|
16
|
+
url: await getFileDataURL(m.file)
|
|
17
|
+
};
|
|
18
|
+
})
|
|
19
|
+
)
|
|
20
|
+
]
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
const getFileDataURL = (file) => new Promise((resolve, reject) => {
|
|
24
|
+
const reader = new FileReader();
|
|
25
|
+
reader.onload = () => resolve(reader.result);
|
|
26
|
+
reader.onerror = (error) => reject(error);
|
|
27
|
+
reader.readAsDataURL(file);
|
|
28
|
+
});
|
|
29
|
+
export {
|
|
30
|
+
toCreateMessage
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=toCreateMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/utils/toCreateMessage.ts"],"sourcesContent":["import { AppendMessage } from \"@assistant-ui/react\";\nimport { CreateMessage } from \"@ai-sdk/ui-utils\";\n\nexport const toCreateMessage = async (\n message: AppendMessage,\n): Promise<CreateMessage> => {\n const content = message.content\n .filter((part) => part.type === \"text\")\n .map((t) => t.text)\n .join(\"\\n\\n\");\n\n const images = message.content\n .filter((part) => part.type === \"image\")\n .map((part) => ({ url: part.image }));\n\n return {\n role: message.role,\n content,\n experimental_attachments: [\n ...images,\n ...(await Promise.all(\n (message.attachments ?? []).map(async (m) => {\n if (m.file == null)\n throw new Error(\"Attachment did not contain a file\");\n return {\n contentType: m.file.type,\n name: m.file.name,\n url: await getFileDataURL(m.file),\n };\n }),\n )),\n ],\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":"AAGO,MAAM,kBAAkB,OAC7B,YAC2B;AAC3B,QAAM,UAAU,QAAQ,QACrB,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,EACrC,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,MAAM;AAEd,QAAM,SAAS,QAAQ,QACpB,OAAO,CAAC,SAAS,KAAK,SAAS,OAAO,EACtC,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,MAAM,EAAE;AAEtC,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd;AAAA,IACA,0BAA0B;AAAA,MACxB,GAAG;AAAA,MACH,GAAI,MAAM,QAAQ;AAAA,SACf,QAAQ,eAAe,CAAC,GAAG,IAAI,OAAO,MAAM;AAC3C,cAAI,EAAE,QAAQ;AACZ,kBAAM,IAAI,MAAM,mCAAmC;AACrD,iBAAO;AAAA,YACL,aAAa,EAAE,KAAK;AAAA,YACpB,MAAM,EAAE,KAAK;AAAA,YACb,KAAK,MAAM,eAAe,EAAE,IAAI;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAEA,MAAM,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":[]}
|