@assistant-ui/react-ai-sdk 1.1.18 → 1.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/frontendTools.js +5 -11
  2. package/dist/frontendTools.js.map +1 -1
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -5
  6. package/dist/index.js.map +1 -1
  7. package/dist/ui/adapters/aiSDKFormatAdapter.js +21 -26
  8. package/dist/ui/adapters/aiSDKFormatAdapter.js.map +1 -1
  9. package/dist/ui/getVercelAIMessages.js +3 -9
  10. package/dist/ui/getVercelAIMessages.js.map +1 -1
  11. package/dist/ui/index.d.ts +4 -4
  12. package/dist/ui/index.d.ts.map +1 -1
  13. package/dist/ui/index.js +3 -9
  14. package/dist/ui/index.js.map +1 -1
  15. package/dist/ui/use-chat/AssistantChatTransport.js +50 -59
  16. package/dist/ui/use-chat/AssistantChatTransport.js.map +1 -1
  17. package/dist/ui/use-chat/useAISDKRuntime.js +129 -148
  18. package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -1
  19. package/dist/ui/use-chat/useChatRuntime.d.ts +1 -1
  20. package/dist/ui/use-chat/useChatRuntime.d.ts.map +1 -1
  21. package/dist/ui/use-chat/useChatRuntime.js +42 -64
  22. package/dist/ui/use-chat/useChatRuntime.js.map +1 -1
  23. package/dist/ui/use-chat/useExternalHistory.js +88 -95
  24. package/dist/ui/use-chat/useExternalHistory.js.map +1 -1
  25. package/dist/ui/utils/convertMessage.d.ts.map +1 -1
  26. package/dist/ui/utils/convertMessage.js +194 -174
  27. package/dist/ui/utils/convertMessage.js.map +1 -1
  28. package/dist/ui/utils/sliceMessagesUntil.js +10 -15
  29. package/dist/ui/utils/sliceMessagesUntil.js.map +1 -1
  30. package/dist/ui/utils/toCreateMessage.js +37 -43
  31. package/dist/ui/utils/toCreateMessage.js.map +1 -1
  32. package/dist/ui/utils/vercelAttachmentAdapter.js +36 -38
  33. package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -1
  34. package/package.json +26 -17
@@ -1,15 +1,9 @@
1
- // src/frontendTools.ts
2
1
  import { jsonSchema } from "ai";
3
- var frontendTools = (tools) => Object.fromEntries(
4
- Object.entries(tools).map(([name, tool]) => [
2
+ export const frontendTools = (tools) => Object.fromEntries(Object.entries(tools).map(([name, tool]) => [
5
3
  name,
6
4
  {
7
- ...tool.description ? { description: tool.description } : void 0,
8
- inputSchema: jsonSchema(tool.parameters)
9
- }
10
- ])
11
- );
12
- export {
13
- frontendTools
14
- };
5
+ ...(tool.description ? { description: tool.description } : undefined),
6
+ inputSchema: jsonSchema(tool.parameters),
7
+ },
8
+ ]));
15
9
  //# sourceMappingURL=frontendTools.js.map
@@ -1 +1 @@
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 inputSchema: 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,aAAa,WAAW,KAAK,UAAU;AAAA,IACzC;AAAA,EACF,CAAC;AACH;","names":[]}
1
+ {"version":3,"file":"frontendTools.js","sourceRoot":"","sources":["../src/frontendTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGhC,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAwE,EACxE,EAAE,CACF,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC1C,IAAI;IACJ;QACE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;KACzC;CACF,CAAC,CACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export * from "./ui";
2
- export { frontendTools } from "./frontendTools";
1
+ export * from "./ui/index.js";
2
+ export { frontendTools } from "./frontendTools.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8BAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,2BAAwB"}
package/dist/index.js CHANGED
@@ -1,7 +1,3 @@
1
- // src/index.ts
2
1
  export * from "./ui/index.js";
3
- import { frontendTools } from "./frontendTools.js";
4
- export {
5
- frontendTools
6
- };
2
+ export { frontendTools } from "./frontendTools.js";
7
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./ui\";\nexport { frontendTools } from \"./frontendTools\";\n"],"mappings":";AAAA,cAAc;AACd,SAAS,qBAAqB;","names":[]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8BAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,2BAAwB"}
@@ -1,28 +1,23 @@
1
- // src/ui/adapters/aiSDKFormatAdapter.ts
2
- var aiSDKV5FormatAdapter = {
3
- format: "ai-sdk/v5",
4
- encode({
5
- message: { id, parts, ...message }
6
- }) {
7
- return {
8
- ...message,
9
- parts: parts.filter((part) => part.type !== "file")
10
- };
11
- },
12
- decode(stored) {
13
- return {
14
- parentId: stored.parent_id,
15
- message: {
16
- id: stored.id,
17
- ...stored.content
18
- }
19
- };
20
- },
21
- getId(message) {
22
- return message.id;
23
- }
24
- };
25
- export {
26
- aiSDKV5FormatAdapter
1
+ export const aiSDKV5FormatAdapter = {
2
+ format: "ai-sdk/v5",
3
+ encode({ message: { id, parts, ...message }, }) {
4
+ // Filter out FileContentParts until they are supported
5
+ return {
6
+ ...message,
7
+ parts: parts.filter((part) => part.type !== "file"),
8
+ };
9
+ },
10
+ decode(stored) {
11
+ return {
12
+ parentId: stored.parent_id,
13
+ message: {
14
+ id: stored.id,
15
+ ...stored.content,
16
+ },
17
+ };
18
+ },
19
+ getId(message) {
20
+ return message.id;
21
+ },
27
22
  };
28
23
  //# sourceMappingURL=aiSDKFormatAdapter.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/adapters/aiSDKFormatAdapter.ts"],"sourcesContent":["import { UIMessage } from \"ai\";\nimport {\n MessageFormatAdapter,\n MessageFormatItem,\n MessageStorageEntry,\n} from \"@assistant-ui/react\";\n\n// Storage format for AI SDK messages - just the UIMessage\nexport type AISDKStorageFormat = Omit<UIMessage, \"id\">;\n\nexport const aiSDKV5FormatAdapter: MessageFormatAdapter<\n UIMessage,\n AISDKStorageFormat\n> = {\n format: \"ai-sdk/v5\",\n\n encode({\n message: { id, parts, ...message },\n }: MessageFormatItem<UIMessage>): AISDKStorageFormat {\n // Filter out FileContentParts until they are supported\n return {\n ...message,\n parts: parts.filter((part) => part.type !== \"file\"),\n };\n },\n\n decode(\n stored: MessageStorageEntry<AISDKStorageFormat>,\n ): MessageFormatItem<UIMessage> {\n return {\n parentId: stored.parent_id,\n message: {\n id: stored.id,\n ...stored.content,\n },\n };\n },\n\n getId(message: UIMessage): string {\n return message.id;\n },\n};\n"],"mappings":";AAUO,IAAM,uBAGT;AAAA,EACF,QAAQ;AAAA,EAER,OAAO;AAAA,IACL,SAAS,EAAE,IAAI,OAAO,GAAG,QAAQ;AAAA,EACnC,GAAqD;AAEnD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,OACE,QAC8B;AAC9B,WAAO;AAAA,MACL,UAAU,OAAO;AAAA,MACjB,SAAS;AAAA,QACP,IAAI,OAAO;AAAA,QACX,GAAG,OAAO;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAA4B;AAChC,WAAO,QAAQ;AAAA,EACjB;AACF;","names":[]}
1
+ {"version":3,"file":"aiSDKFormatAdapter.js","sourceRoot":"","sources":["../../../src/ui/adapters/aiSDKFormatAdapter.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,oBAAoB,GAG7B;IACF,MAAM,EAAE,WAAW;IAEnB,MAAM,CAAC,EACL,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GACL;QAC7B,uDAAuD;QACvD,OAAO;YACL,GAAG,OAAO;YACV,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;SACpD,CAAC;IACJ,CAAC;IAED,MAAM,CACJ,MAA+C;QAE/C,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,SAAS;YAC1B,OAAO,EAAE;gBACP,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,GAAG,MAAM,CAAC,OAAO;aAClB;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAkB;QACtB,OAAO,OAAO,CAAC,EAAE,CAAC;IACpB,CAAC;CACF,CAAC"}
@@ -1,11 +1,5 @@
1
- // src/ui/getVercelAIMessages.tsx
2
- import {
3
- getExternalStoreMessages
4
- } from "@assistant-ui/react";
5
- var getVercelAIMessages = (message) => {
6
- return getExternalStoreMessages(message);
7
- };
8
- export {
9
- getVercelAIMessages
1
+ import { getExternalStoreMessages, } from "@assistant-ui/react";
2
+ export const getVercelAIMessages = (message) => {
3
+ return getExternalStoreMessages(message);
10
4
  };
11
5
  //# sourceMappingURL=getVercelAIMessages.js.map
@@ -1 +1 @@
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 = <UI_MESSAGE extends UIMessage = UIMessage>(\n message: ThreadMessage,\n) => {\n return getExternalStoreMessages(message) as UI_MESSAGE[];\n};\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OAEK;AAGA,IAAM,sBAAsB,CACjC,YACG;AACH,SAAO,yBAAyB,OAAO;AACzC;","names":[]}
1
+ {"version":3,"file":"getVercelAIMessages.js","sourceRoot":"","sources":["../../src/ui/getVercelAIMessages.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GAEzB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAsB,EACtB,EAAE;IACF,OAAO,wBAAwB,CAAC,OAAO,CAAiB,CAAC;AAC3D,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
- export { useAISDKRuntime } from "./use-chat/useAISDKRuntime";
2
- export { useChatRuntime } from "./use-chat/useChatRuntime";
3
- export type { UseChatRuntimeOptions } from "./use-chat/useChatRuntime";
4
- export { AssistantChatTransport } from "./use-chat/AssistantChatTransport";
1
+ export { useAISDKRuntime } from "./use-chat/useAISDKRuntime.js";
2
+ export { useChatRuntime } from "./use-chat/useChatRuntime.js";
3
+ export type { UseChatRuntimeOptions } from "./use-chat/useChatRuntime.js";
4
+ export { AssistantChatTransport } from "./use-chat/AssistantChatTransport.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,sCAAmC;AAC7D,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAC3D,YAAY,EAAE,qBAAqB,EAAE,qCAAkC;AACvE,OAAO,EAAE,sBAAsB,EAAE,6CAA0C"}
package/dist/ui/index.js CHANGED
@@ -1,10 +1,4 @@
1
- // src/ui/index.ts
2
- import { useAISDKRuntime } from "./use-chat/useAISDKRuntime.js";
3
- import { useChatRuntime } from "./use-chat/useChatRuntime.js";
4
- import { AssistantChatTransport } from "./use-chat/AssistantChatTransport.js";
5
- export {
6
- AssistantChatTransport,
7
- useAISDKRuntime,
8
- useChatRuntime
9
- };
1
+ export { useAISDKRuntime } from "./use-chat/useAISDKRuntime.js";
2
+ export { useChatRuntime } from "./use-chat/useChatRuntime.js";
3
+ export { AssistantChatTransport } from "./use-chat/AssistantChatTransport.js";
10
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/ui/index.ts"],"sourcesContent":["export { useAISDKRuntime } from \"./use-chat/useAISDKRuntime\";\nexport { useChatRuntime } from \"./use-chat/useChatRuntime\";\nexport type { UseChatRuntimeOptions } from \"./use-chat/useChatRuntime\";\nexport { AssistantChatTransport } from \"./use-chat/AssistantChatTransport\";\n"],"mappings":";AAAA,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAE/B,SAAS,8BAA8B;","names":[]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,sCAAmC;AAC7D,OAAO,EAAE,cAAc,EAAE,qCAAkC;AAE3D,OAAO,EAAE,sBAAsB,EAAE,6CAA0C"}
@@ -1,63 +1,54 @@
1
- // src/ui/use-chat/AssistantChatTransport.tsx
2
- import {
3
- DefaultChatTransport
4
- } from "ai";
1
+ import { DefaultChatTransport, } from "ai";
5
2
  import z from "zod";
6
- var toAISDKTools = (tools) => {
7
- return Object.fromEntries(
8
- Object.entries(tools).map(([name, tool]) => [
9
- name,
10
- {
11
- ...tool.description ? { description: tool.description } : void 0,
12
- parameters: tool.parameters instanceof z.ZodType ? z.toJSONSchema(tool.parameters) : tool.parameters
13
- }
14
- ])
15
- );
3
+ const toAISDKTools = (tools) => {
4
+ return Object.fromEntries(Object.entries(tools).map(([name, tool]) => [
5
+ name,
6
+ {
7
+ ...(tool.description ? { description: tool.description } : undefined),
8
+ parameters: (tool.parameters instanceof z.ZodType
9
+ ? z.toJSONSchema(tool.parameters)
10
+ : tool.parameters),
11
+ },
12
+ ]));
16
13
  };
17
- var getEnabledTools = (tools) => {
18
- return Object.fromEntries(
19
- Object.entries(tools).filter(
20
- ([, tool]) => !tool.disabled && tool.type !== "backend"
21
- )
22
- );
23
- };
24
- var AssistantChatTransport = class extends DefaultChatTransport {
25
- runtime;
26
- constructor(initOptions) {
27
- super({
28
- ...initOptions,
29
- prepareSendMessagesRequest: async (options) => {
30
- const context = this.runtime?.thread.getModelContext();
31
- const id = (await this.runtime?.threads.mainItem.initialize())?.remoteId ?? options.id;
32
- const optionsEx = {
33
- ...options,
34
- body: {
35
- callSettings: context?.callSettings,
36
- system: context?.system,
37
- tools: toAISDKTools(getEnabledTools(context?.tools ?? {})),
38
- ...options?.body
39
- }
40
- };
41
- const preparedRequest = await initOptions?.prepareSendMessagesRequest?.(optionsEx);
42
- return {
43
- ...preparedRequest,
44
- body: preparedRequest?.body ?? {
45
- ...optionsEx.body,
46
- id,
47
- messages: options.messages,
48
- trigger: options.trigger,
49
- messageId: options.messageId,
50
- metadata: options.requestMetadata
51
- }
52
- };
53
- }
54
- });
55
- }
56
- setRuntime(runtime) {
57
- this.runtime = runtime;
58
- }
59
- };
60
- export {
61
- AssistantChatTransport
14
+ const getEnabledTools = (tools) => {
15
+ return Object.fromEntries(Object.entries(tools).filter(([, tool]) => !tool.disabled && tool.type !== "backend"));
62
16
  };
17
+ export class AssistantChatTransport extends DefaultChatTransport {
18
+ runtime;
19
+ constructor(initOptions) {
20
+ super({
21
+ ...initOptions,
22
+ prepareSendMessagesRequest: async (options) => {
23
+ const context = this.runtime?.thread.getModelContext();
24
+ const id = (await this.runtime?.threads.mainItem.initialize())?.remoteId ??
25
+ options.id;
26
+ const optionsEx = {
27
+ ...options,
28
+ body: {
29
+ callSettings: context?.callSettings,
30
+ system: context?.system,
31
+ tools: toAISDKTools(getEnabledTools(context?.tools ?? {})),
32
+ ...options?.body,
33
+ },
34
+ };
35
+ const preparedRequest = await initOptions?.prepareSendMessagesRequest?.(optionsEx);
36
+ return {
37
+ ...preparedRequest,
38
+ body: preparedRequest?.body ?? {
39
+ ...optionsEx.body,
40
+ id,
41
+ messages: options.messages,
42
+ trigger: options.trigger,
43
+ messageId: options.messageId,
44
+ metadata: options.requestMetadata,
45
+ },
46
+ };
47
+ },
48
+ });
49
+ }
50
+ setRuntime(runtime) {
51
+ this.runtime = runtime;
52
+ }
53
+ }
63
54
  //# sourceMappingURL=AssistantChatTransport.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/ui/use-chat/AssistantChatTransport.tsx"],"sourcesContent":["import { AssistantRuntime, Tool } from \"@assistant-ui/react\";\nimport {\n DefaultChatTransport,\n HttpChatTransportInitOptions,\n JSONSchema7,\n UIMessage,\n} from \"ai\";\nimport z from \"zod\";\n\nconst toAISDKTools = (tools: Record<string, Tool>) => {\n return Object.fromEntries(\n Object.entries(tools).map(([name, tool]) => [\n name,\n {\n ...(tool.description ? { description: tool.description } : undefined),\n parameters: (tool.parameters instanceof z.ZodType\n ? z.toJSONSchema(tool.parameters)\n : tool.parameters) as JSONSchema7,\n },\n ]),\n );\n};\n\nconst getEnabledTools = (tools: Record<string, Tool>) => {\n return Object.fromEntries(\n Object.entries(tools).filter(\n ([, tool]) => !tool.disabled && tool.type !== \"backend\",\n ),\n );\n};\n\nexport class AssistantChatTransport<\n UI_MESSAGE extends UIMessage,\n> extends DefaultChatTransport<UI_MESSAGE> {\n private runtime: AssistantRuntime | undefined;\n constructor(initOptions?: HttpChatTransportInitOptions<UI_MESSAGE>) {\n super({\n ...initOptions,\n prepareSendMessagesRequest: async (options) => {\n const context = this.runtime?.thread.getModelContext();\n const id =\n (await this.runtime?.threads.mainItem.initialize())?.remoteId ??\n options.id;\n\n const optionsEx = {\n ...options,\n body: {\n callSettings: context?.callSettings,\n system: context?.system,\n tools: toAISDKTools(getEnabledTools(context?.tools ?? {})),\n ...options?.body,\n },\n };\n const preparedRequest =\n await initOptions?.prepareSendMessagesRequest?.(optionsEx);\n\n return {\n ...preparedRequest,\n body: preparedRequest?.body ?? {\n ...optionsEx.body,\n id,\n messages: options.messages,\n trigger: options.trigger,\n messageId: options.messageId,\n metadata: options.requestMetadata,\n },\n };\n },\n });\n }\n\n setRuntime(runtime: AssistantRuntime) {\n this.runtime = runtime;\n }\n}\n"],"mappings":";AACA;AAAA,EACE;AAAA,OAIK;AACP,OAAO,OAAO;AAEd,IAAM,eAAe,CAAC,UAAgC;AACpD,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AAAA,MAC1C;AAAA,MACA;AAAA,QACE,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI;AAAA,QAC3D,YAAa,KAAK,sBAAsB,EAAE,UACtC,EAAE,aAAa,KAAK,UAAU,IAC9B,KAAK;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,IAAM,kBAAkB,CAAC,UAAgC;AACvD,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE;AAAA,MACpB,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,YAAY,KAAK,SAAS;AAAA,IAChD;AAAA,EACF;AACF;AAEO,IAAM,yBAAN,cAEG,qBAAiC;AAAA,EACjC;AAAA,EACR,YAAY,aAAwD;AAClE,UAAM;AAAA,MACJ,GAAG;AAAA,MACH,4BAA4B,OAAO,YAAY;AAC7C,cAAM,UAAU,KAAK,SAAS,OAAO,gBAAgB;AACrD,cAAM,MACH,MAAM,KAAK,SAAS,QAAQ,SAAS,WAAW,IAAI,YACrD,QAAQ;AAEV,cAAM,YAAY;AAAA,UAChB,GAAG;AAAA,UACH,MAAM;AAAA,YACJ,cAAc,SAAS;AAAA,YACvB,QAAQ,SAAS;AAAA,YACjB,OAAO,aAAa,gBAAgB,SAAS,SAAS,CAAC,CAAC,CAAC;AAAA,YACzD,GAAG,SAAS;AAAA,UACd;AAAA,QACF;AACA,cAAM,kBACJ,MAAM,aAAa,6BAA6B,SAAS;AAE3D,eAAO;AAAA,UACL,GAAG;AAAA,UACH,MAAM,iBAAiB,QAAQ;AAAA,YAC7B,GAAG,UAAU;AAAA,YACb;AAAA,YACA,UAAU,QAAQ;AAAA,YAClB,SAAS,QAAQ;AAAA,YACjB,WAAW,QAAQ;AAAA,YACnB,UAAU,QAAQ;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,SAA2B;AACpC,SAAK,UAAU;AAAA,EACjB;AACF;","names":[]}
1
+ {"version":3,"file":"AssistantChatTransport.js","sourceRoot":"","sources":["../../../src/ui/use-chat/AssistantChatTransport.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,GAIrB,MAAM,IAAI,CAAC;AACZ,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,YAAY,GAAG,CAAC,KAA2B,EAAE,EAAE;IACnD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI;QACJ;YACE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YACrE,UAAU,EAAE,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,CAAC,OAAO;gBAC/C,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;gBACjC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAgB;SACpC;KACF,CAAC,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAA2B,EAAE,EAAE;IACtD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CACxD,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,OAAO,sBAEX,SAAQ,oBAAgC;IAChC,OAAO,CAA+B;IAC9C,YAAY,WAAsD;QAChE,KAAK,CAAC;YACJ,GAAG,WAAW;YACd,0BAA0B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC;gBACvD,MAAM,EAAE,GACN,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,EAAE,QAAQ;oBAC7D,OAAO,CAAC,EAAE,CAAC;gBAEb,MAAM,SAAS,GAAG;oBAChB,GAAG,OAAO;oBACV,IAAI,EAAE;wBACJ,YAAY,EAAE,OAAO,EAAE,YAAY;wBACnC,MAAM,EAAE,OAAO,EAAE,MAAM;wBACvB,KAAK,EAAE,YAAY,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;wBAC1D,GAAG,OAAO,EAAE,IAAI;qBACjB;iBACF,CAAC;gBACF,MAAM,eAAe,GACnB,MAAM,WAAW,EAAE,0BAA0B,EAAE,CAAC,SAAS,CAAC,CAAC;gBAE7D,OAAO;oBACL,GAAG,eAAe;oBAClB,IAAI,EAAE,eAAe,EAAE,IAAI,IAAI;wBAC7B,GAAG,SAAS,CAAC,IAAI;wBACjB,EAAE;wBACF,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,QAAQ,EAAE,OAAO,CAAC,eAAe;qBAClC;iBACF,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,OAAyB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF"}
@@ -1,161 +1,142 @@
1
1
  "use client";
2
-
3
- // src/ui/use-chat/useAISDKRuntime.tsx
4
2
  import { useState, useMemo } from "react";
5
3
  import { isToolUIPart } from "ai";
6
- import {
7
- useExternalStoreRuntime,
8
- useRuntimeAdapters,
9
- INTERNAL
10
- } from "@assistant-ui/react";
4
+ import { useExternalStoreRuntime, useRuntimeAdapters, INTERNAL, } from "@assistant-ui/react";
11
5
  import { sliceMessagesUntil } from "../utils/sliceMessagesUntil.js";
12
6
  import { toCreateMessage } from "../utils/toCreateMessage.js";
13
7
  import { vercelAttachmentAdapter } from "../utils/vercelAttachmentAdapter.js";
14
8
  import { getVercelAIMessages } from "../getVercelAIMessages.js";
15
9
  import { AISDKMessageConverter } from "../utils/convertMessage.js";
16
- import {
17
- aiSDKV5FormatAdapter
18
- } from "../adapters/aiSDKFormatAdapter.js";
10
+ import { aiSDKV5FormatAdapter, } from "../adapters/aiSDKFormatAdapter.js";
19
11
  import { useExternalHistory } from "./useExternalHistory.js";
20
- var useAISDKRuntime = (chatHelpers, {
21
- adapters,
22
- toCreateMessage: customToCreateMessage,
23
- cancelPendingToolCallsOnSend = true
24
- } = {}) => {
25
- const contextAdapters = useRuntimeAdapters();
26
- const [toolStatuses, setToolStatuses] = useState({});
27
- const hasExecutingTools = Object.values(toolStatuses).some(
28
- (s) => s?.type === "executing"
29
- );
30
- const isRunning = chatHelpers.status === "submitted" || chatHelpers.status === "streaming" || hasExecutingTools;
31
- const messages = AISDKMessageConverter.useThreadMessages({
32
- isRunning,
33
- messages: chatHelpers.messages,
34
- metadata: useMemo(
35
- () => ({
36
- toolStatuses,
37
- ...chatHelpers.error && { error: chatHelpers.error.message }
38
- }),
39
- [toolStatuses, chatHelpers.error]
40
- )
41
- });
42
- const [runtimeRef] = useState(() => ({
43
- get current() {
44
- return runtime;
45
- }
46
- }));
47
- const toolInvocations = INTERNAL.useToolInvocations({
48
- state: {
49
- messages,
50
- isRunning
51
- },
52
- getTools: () => runtimeRef.current.thread.getModelContext().tools,
53
- onResult: (command) => {
54
- if (command.type === "add-tool-result") {
55
- chatHelpers.addToolResult({
56
- tool: command.toolName,
57
- toolCallId: command.toolCallId,
58
- output: command.result
59
- });
60
- }
61
- },
62
- setToolStatuses
63
- });
64
- const isLoading = useExternalHistory(
65
- runtimeRef,
66
- adapters?.history ?? contextAdapters?.history,
67
- AISDKMessageConverter.toThreadMessages,
68
- aiSDKV5FormatAdapter,
69
- (messages2) => {
70
- chatHelpers.setMessages(messages2);
71
- }
72
- );
73
- const completePendingToolCalls = async () => {
74
- if (!cancelPendingToolCallsOnSend) return;
75
- await toolInvocations.abort();
76
- chatHelpers.setMessages((messages2) => {
77
- const lastMessage = messages2.at(-1);
78
- if (lastMessage?.role !== "assistant") return messages2;
79
- let hasChanges = false;
80
- const parts = lastMessage.parts?.map((part) => {
81
- if (!isToolUIPart(part)) return part;
82
- if (part.state === "output-available" || part.state === "output-error")
83
- return part;
84
- hasChanges = true;
85
- return {
86
- ...part,
87
- state: "output-error",
88
- errorText: "User cancelled tool call by sending a new message."
89
- };
90
- });
91
- if (!hasChanges) return messages2;
92
- return [...messages2.slice(0, -1), { ...lastMessage, parts }];
12
+ export const useAISDKRuntime = (chatHelpers, { adapters, toCreateMessage: customToCreateMessage, cancelPendingToolCallsOnSend = true, } = {}) => {
13
+ const contextAdapters = useRuntimeAdapters();
14
+ const [toolStatuses, setToolStatuses] = useState({});
15
+ const hasExecutingTools = Object.values(toolStatuses).some((s) => s?.type === "executing");
16
+ const isRunning = chatHelpers.status === "submitted" ||
17
+ chatHelpers.status === "streaming" ||
18
+ hasExecutingTools;
19
+ const messages = AISDKMessageConverter.useThreadMessages({
20
+ isRunning,
21
+ messages: chatHelpers.messages,
22
+ metadata: useMemo(() => ({
23
+ toolStatuses,
24
+ ...(chatHelpers.error && { error: chatHelpers.error.message }),
25
+ }), [toolStatuses, chatHelpers.error]),
93
26
  });
94
- };
95
- const runtime = useExternalStoreRuntime({
96
- isRunning,
97
- messages,
98
- setMessages: (messages2) => chatHelpers.setMessages(
99
- messages2.map(getVercelAIMessages).filter(Boolean).flat()
100
- ),
101
- onImport: (messages2) => chatHelpers.setMessages(
102
- messages2.map(getVercelAIMessages).filter(Boolean).flat()
103
- ),
104
- onCancel: async () => {
105
- chatHelpers.stop();
106
- await toolInvocations.abort();
107
- },
108
- onNew: async (message) => {
109
- await completePendingToolCalls();
110
- const createMessage = (customToCreateMessage ?? toCreateMessage)(message);
111
- await chatHelpers.sendMessage(createMessage, {
112
- metadata: message.runConfig
113
- });
114
- },
115
- onEdit: async (message) => {
116
- const newMessages = sliceMessagesUntil(
117
- chatHelpers.messages,
118
- message.parentId
119
- );
120
- chatHelpers.setMessages(newMessages);
121
- const createMessage = (customToCreateMessage ?? toCreateMessage)(message);
122
- await chatHelpers.sendMessage(createMessage, {
123
- metadata: message.runConfig
124
- });
125
- },
126
- onReload: async (parentId, config) => {
127
- const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);
128
- chatHelpers.setMessages(newMessages);
129
- await chatHelpers.regenerate({ metadata: config.runConfig });
130
- },
131
- onAddToolResult: ({ toolCallId, result, isError }) => {
132
- if (isError) {
133
- chatHelpers.addToolOutput({
134
- state: "output-error",
135
- tool: toolCallId,
136
- toolCallId,
137
- errorText: typeof result === "string" ? result : JSON.stringify(result)
138
- });
139
- } else {
140
- chatHelpers.addToolOutput({
141
- state: "output-available",
142
- tool: toolCallId,
143
- toolCallId,
144
- output: result
27
+ const [runtimeRef] = useState(() => ({
28
+ get current() {
29
+ return runtime;
30
+ },
31
+ }));
32
+ const toolInvocations = INTERNAL.useToolInvocations({
33
+ state: {
34
+ messages,
35
+ isRunning,
36
+ },
37
+ getTools: () => runtimeRef.current.thread.getModelContext().tools,
38
+ onResult: (command) => {
39
+ if (command.type === "add-tool-result") {
40
+ chatHelpers.addToolResult({
41
+ tool: command.toolName,
42
+ toolCallId: command.toolCallId,
43
+ output: command.result,
44
+ });
45
+ }
46
+ },
47
+ setToolStatuses,
48
+ });
49
+ const isLoading = useExternalHistory(runtimeRef, adapters?.history ?? contextAdapters?.history, AISDKMessageConverter.toThreadMessages, aiSDKV5FormatAdapter, (messages) => {
50
+ chatHelpers.setMessages(messages);
51
+ });
52
+ const completePendingToolCalls = async () => {
53
+ if (!cancelPendingToolCallsOnSend)
54
+ return;
55
+ await toolInvocations.abort();
56
+ // Mark any tool without a result as cancelled (uses setMessages to avoid triggering sendAutomaticallyWhen)
57
+ chatHelpers.setMessages((messages) => {
58
+ const lastMessage = messages.at(-1);
59
+ if (lastMessage?.role !== "assistant")
60
+ return messages;
61
+ let hasChanges = false;
62
+ const parts = lastMessage.parts?.map((part) => {
63
+ if (!isToolUIPart(part))
64
+ return part;
65
+ if (part.state === "output-available" || part.state === "output-error")
66
+ return part;
67
+ hasChanges = true;
68
+ return {
69
+ ...part,
70
+ state: "output-error",
71
+ errorText: "User cancelled tool call by sending a new message.",
72
+ };
73
+ });
74
+ if (!hasChanges)
75
+ return messages;
76
+ return [...messages.slice(0, -1), { ...lastMessage, parts }];
145
77
  });
146
- }
147
- },
148
- onResumeToolCall: (options) => toolInvocations.resume(options.toolCallId, options.payload),
149
- adapters: {
150
- attachments: vercelAttachmentAdapter,
151
- ...contextAdapters,
152
- ...adapters
153
- },
154
- isLoading
155
- });
156
- return runtime;
157
- };
158
- export {
159
- useAISDKRuntime
78
+ };
79
+ const runtime = useExternalStoreRuntime({
80
+ isRunning,
81
+ messages,
82
+ setMessages: (messages) => chatHelpers.setMessages(messages
83
+ .map((getVercelAIMessages))
84
+ .filter(Boolean)
85
+ .flat()),
86
+ onImport: (messages) => chatHelpers.setMessages(messages
87
+ .map((getVercelAIMessages))
88
+ .filter(Boolean)
89
+ .flat()),
90
+ onCancel: async () => {
91
+ chatHelpers.stop();
92
+ await toolInvocations.abort();
93
+ },
94
+ onNew: async (message) => {
95
+ await completePendingToolCalls();
96
+ const createMessage = (customToCreateMessage ?? toCreateMessage)(message);
97
+ await chatHelpers.sendMessage(createMessage, {
98
+ metadata: message.runConfig,
99
+ });
100
+ },
101
+ onEdit: async (message) => {
102
+ const newMessages = sliceMessagesUntil(chatHelpers.messages, message.parentId);
103
+ chatHelpers.setMessages(newMessages);
104
+ const createMessage = (customToCreateMessage ?? toCreateMessage)(message);
105
+ await chatHelpers.sendMessage(createMessage, {
106
+ metadata: message.runConfig,
107
+ });
108
+ },
109
+ onReload: async (parentId, config) => {
110
+ const newMessages = sliceMessagesUntil(chatHelpers.messages, parentId);
111
+ chatHelpers.setMessages(newMessages);
112
+ await chatHelpers.regenerate({ metadata: config.runConfig });
113
+ },
114
+ onAddToolResult: ({ toolCallId, result, isError }) => {
115
+ if (isError) {
116
+ chatHelpers.addToolOutput({
117
+ state: "output-error",
118
+ tool: toolCallId,
119
+ toolCallId,
120
+ errorText: typeof result === "string" ? result : JSON.stringify(result),
121
+ });
122
+ }
123
+ else {
124
+ chatHelpers.addToolOutput({
125
+ state: "output-available",
126
+ tool: toolCallId,
127
+ toolCallId,
128
+ output: result,
129
+ });
130
+ }
131
+ },
132
+ onResumeToolCall: (options) => toolInvocations.resume(options.toolCallId, options.payload),
133
+ adapters: {
134
+ attachments: vercelAttachmentAdapter,
135
+ ...contextAdapters,
136
+ ...adapters,
137
+ },
138
+ isLoading,
139
+ });
140
+ return runtime;
160
141
  };
161
142
  //# sourceMappingURL=useAISDKRuntime.js.map