@assistant-ui/react-ai-sdk 1.3.26 → 1.3.28

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 (105) hide show
  1. package/dist/frontendTools.d.ts +9 -5
  2. package/dist/frontendTools.d.ts.map +1 -1
  3. package/dist/frontendTools.js +36 -35
  4. package/dist/frontendTools.js.map +1 -1
  5. package/dist/index.d.ts +9 -11
  6. package/dist/index.js +9 -10
  7. package/dist/injectQuoteContext.d.ts +6 -2
  8. package/dist/injectQuoteContext.d.ts.map +1 -1
  9. package/dist/injectQuoteContext.js +46 -53
  10. package/dist/injectQuoteContext.js.map +1 -1
  11. package/dist/modelContentEnvelope.d.ts +12 -10
  12. package/dist/modelContentEnvelope.d.ts.map +1 -1
  13. package/dist/modelContentEnvelope.js +17 -15
  14. package/dist/modelContentEnvelope.js.map +1 -1
  15. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
  16. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
  17. package/dist/packages/assistant-stream/dist/core/AssistantStream.d.ts +1 -0
  18. package/dist/packages/assistant-stream/dist/core/AssistantStreamChunk.d.ts +1 -0
  19. package/dist/packages/assistant-stream/dist/core/accumulators/AssistantMessageStream.d.ts +1 -0
  20. package/dist/packages/assistant-stream/dist/core/accumulators/assistant-message-accumulator.d.ts +1 -0
  21. package/dist/packages/assistant-stream/dist/core/modules/assistant-stream.d.ts +1 -0
  22. package/dist/packages/assistant-stream/dist/core/modules/text.d.ts +1 -0
  23. package/dist/packages/assistant-stream/dist/core/modules/tool-call.d.ts +1 -0
  24. package/dist/packages/assistant-stream/dist/core/serialization/PlainText.d.ts +1 -0
  25. package/dist/packages/assistant-stream/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +1 -0
  26. package/dist/packages/assistant-stream/dist/core/serialization/data-stream/DataStream.d.ts +1 -0
  27. package/dist/packages/assistant-stream/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +1 -0
  28. package/dist/packages/assistant-stream/dist/core/tool/ToolExecutionStream.d.ts +1 -0
  29. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.d.ts +1 -0
  30. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js +50 -0
  31. package/dist/packages/assistant-stream/dist/core/tool/schema-utils.js.map +1 -0
  32. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts +43 -0
  33. package/dist/packages/assistant-stream/dist/core/tool/tool-types.d.ts.map +1 -0
  34. package/dist/packages/assistant-stream/dist/core/tool/toolResultStream.d.ts +1 -0
  35. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +1 -0
  36. package/dist/packages/assistant-stream/dist/core/utils/stream/AssistantTransformStream.d.ts +1 -0
  37. package/dist/packages/assistant-stream/dist/core/utils/types.d.ts +1 -0
  38. package/dist/packages/assistant-stream/dist/index.d.ts +1 -0
  39. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts +6 -0
  40. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -0
  41. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js +6 -0
  42. package/dist/packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -0
  43. package/dist/packages/assistant-stream/dist/resumable/index.d.ts +1 -0
  44. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts +10 -0
  45. package/dist/packages/assistant-stream/dist/utils/json/json-value.d.ts.map +1 -0
  46. package/dist/packages/assistant-stream/dist/utils.d.ts +1 -0
  47. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts +8 -4
  48. package/dist/ui/adapters/aiSDKFormatAdapter.d.ts.map +1 -1
  49. package/dist/ui/adapters/aiSDKFormatAdapter.js +24 -20
  50. package/dist/ui/adapters/aiSDKFormatAdapter.js.map +1 -1
  51. package/dist/ui/getVercelAIMessages.d.ts +7 -3
  52. package/dist/ui/getVercelAIMessages.d.ts.map +1 -1
  53. package/dist/ui/getVercelAIMessages.js +7 -3
  54. package/dist/ui/getVercelAIMessages.js.map +1 -1
  55. package/dist/ui/resumable.d.ts +18 -15
  56. package/dist/ui/resumable.d.ts.map +1 -1
  57. package/dist/ui/resumable.js +21 -20
  58. package/dist/ui/resumable.js.map +1 -1
  59. package/dist/ui/use-chat/AssistantChatTransport.d.ts +17 -14
  60. package/dist/ui/use-chat/AssistantChatTransport.d.ts.map +1 -1
  61. package/dist/ui/use-chat/AssistantChatTransport.js +98 -108
  62. package/dist/ui/use-chat/AssistantChatTransport.js.map +1 -1
  63. package/dist/ui/use-chat/useAISDKRuntime.d.ts +43 -33
  64. package/dist/ui/use-chat/useAISDKRuntime.d.ts.map +1 -1
  65. package/dist/ui/use-chat/useAISDKRuntime.js +184 -204
  66. package/dist/ui/use-chat/useAISDKRuntime.js.map +1 -1
  67. package/dist/ui/use-chat/useChatRuntime.d.ts +19 -12
  68. package/dist/ui/use-chat/useChatRuntime.d.ts.map +1 -1
  69. package/dist/ui/use-chat/useChatRuntime.js +60 -81
  70. package/dist/ui/use-chat/useChatRuntime.js.map +1 -1
  71. package/dist/ui/use-chat/useExternalHistory.d.ts +8 -4
  72. package/dist/ui/use-chat/useExternalHistory.d.ts.map +1 -1
  73. package/dist/ui/use-chat/useExternalHistory.js +178 -200
  74. package/dist/ui/use-chat/useExternalHistory.js.map +1 -1
  75. package/dist/ui/use-chat/useStreamingTiming.d.ts +7 -3
  76. package/dist/ui/use-chat/useStreamingTiming.d.ts.map +1 -1
  77. package/dist/ui/use-chat/useStreamingTiming.js +60 -75
  78. package/dist/ui/use-chat/useStreamingTiming.js.map +1 -1
  79. package/dist/ui/utils/convertMessage.d.ts +29 -20
  80. package/dist/ui/utils/convertMessage.d.ts.map +1 -1
  81. package/dist/ui/utils/convertMessage.js +207 -301
  82. package/dist/ui/utils/convertMessage.js.map +1 -1
  83. package/dist/ui/utils/sliceMessagesUntil.d.ts +6 -2
  84. package/dist/ui/utils/sliceMessagesUntil.d.ts.map +1 -1
  85. package/dist/ui/utils/sliceMessagesUntil.js +10 -10
  86. package/dist/ui/utils/sliceMessagesUntil.js.map +1 -1
  87. package/dist/ui/utils/toCreateMessage.d.ts +7 -3
  88. package/dist/ui/utils/toCreateMessage.d.ts.map +1 -1
  89. package/dist/ui/utils/toCreateMessage.js +34 -38
  90. package/dist/ui/utils/toCreateMessage.js.map +1 -1
  91. package/dist/ui/utils/vercelAttachmentAdapter.d.ts +6 -2
  92. package/dist/ui/utils/vercelAttachmentAdapter.d.ts.map +1 -1
  93. package/dist/ui/utils/vercelAttachmentAdapter.js +37 -35
  94. package/dist/ui/utils/vercelAttachmentAdapter.js.map +1 -1
  95. package/dist/usage.d.ts +15 -12
  96. package/dist/usage.d.ts.map +1 -1
  97. package/dist/usage.js +80 -99
  98. package/dist/usage.js.map +1 -1
  99. package/package.json +11 -11
  100. package/src/ui/use-chat/useAISDKRuntime.test.ts +2 -2
  101. package/src/ui/use-chat/useAISDKRuntime.ts +8 -0
  102. package/src/ui/utils/convertMessage.test.ts +71 -6
  103. package/src/ui/utils/convertMessage.ts +27 -25
  104. package/dist/index.d.ts.map +0 -1
  105. package/dist/index.js.map +0 -1
@@ -1,116 +1,106 @@
1
- import { DefaultChatTransport, } from "ai";
2
- import { toToolsJSONSchema } from "assistant-stream";
3
- import { RESUMABLE_STREAM_ID_HEADER, } from "../resumable.js";
4
- const FINISH_MARKER = '"type":"finish"';
1
+ import { toToolsJSONSchema } from "../../packages/assistant-stream/dist/core/tool/schema-utils.js";
2
+ import { RESUMABLE_STREAM_ID_HEADER } from "../../packages/assistant-stream/dist/resumable/createResumableAssistantStreamResponse.js";
3
+ import { DefaultChatTransport } from "ai";
4
+ //#region src/ui/use-chat/AssistantChatTransport.ts
5
+ const FINISH_MARKER = "\"type\":\"finish\"";
5
6
  const FINISH_BUFFER_LIMIT = 4096;
6
- const FINISH_BUFFER_TAIL = 1024;
7
- export class AssistantChatTransport extends DefaultChatTransport {
8
- runtime;
9
- getThreadListItem;
10
- resumable;
11
- constructor(initOptions) {
12
- const { resumable, ...rest } = initOptions ?? {};
13
- const userFetch = rest.fetch;
14
- const userPrepareReconnect = rest.prepareReconnectToStreamRequest;
15
- super({
16
- ...rest,
17
- ...(resumable && {
18
- fetch: wrapFetchWithResumable(resumable, userFetch),
19
- prepareReconnectToStreamRequest: wrapPrepareReconnect(resumable, userPrepareReconnect),
20
- }),
21
- prepareSendMessagesRequest: async (options) => {
22
- const context = this.runtime?.thread.getModelContext();
23
- const threadListItem = this.getThreadListItem?.() ?? this.runtime?.threads.mainItem;
24
- const id = (await threadListItem?.initialize())?.remoteId ?? options.id;
25
- const optionsEx = {
26
- ...options,
27
- body: {
28
- callSettings: context?.callSettings,
29
- system: context?.system,
30
- config: context?.config,
31
- tools: toToolsJSONSchema(context?.tools ?? {}),
32
- ...options?.body,
33
- },
34
- };
35
- const preparedRequest = await rest.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
- this.resumable = resumable;
50
- }
51
- setRuntime(runtime) {
52
- this.runtime = runtime;
53
- }
54
- getResumableAdapter() {
55
- return this.resumable;
56
- }
57
- __internal_setGetThreadListItem(getter) {
58
- this.getThreadListItem = getter;
59
- }
60
- }
7
+ var AssistantChatTransport = class extends DefaultChatTransport {
8
+ runtime;
9
+ getThreadListItem;
10
+ resumable;
11
+ constructor(initOptions) {
12
+ const { resumable, ...rest } = initOptions ?? {};
13
+ const userFetch = rest.fetch;
14
+ const userPrepareReconnect = rest.prepareReconnectToStreamRequest;
15
+ super({
16
+ ...rest,
17
+ ...resumable && {
18
+ fetch: wrapFetchWithResumable(resumable, userFetch),
19
+ prepareReconnectToStreamRequest: wrapPrepareReconnect(resumable, userPrepareReconnect)
20
+ },
21
+ prepareSendMessagesRequest: async (options) => {
22
+ const context = this.runtime?.thread.getModelContext();
23
+ const id = (await (this.getThreadListItem?.() ?? this.runtime?.threads.mainItem)?.initialize())?.remoteId ?? options.id;
24
+ const optionsEx = {
25
+ ...options,
26
+ body: {
27
+ callSettings: context?.callSettings,
28
+ system: context?.system,
29
+ config: context?.config,
30
+ tools: toToolsJSONSchema(context?.tools ?? {}),
31
+ ...options?.body
32
+ }
33
+ };
34
+ const preparedRequest = await rest.prepareSendMessagesRequest?.(optionsEx);
35
+ return {
36
+ ...preparedRequest,
37
+ body: preparedRequest?.body ?? {
38
+ ...optionsEx.body,
39
+ id,
40
+ messages: options.messages,
41
+ trigger: options.trigger,
42
+ messageId: options.messageId,
43
+ metadata: options.requestMetadata
44
+ }
45
+ };
46
+ }
47
+ });
48
+ this.resumable = resumable;
49
+ }
50
+ setRuntime(runtime) {
51
+ this.runtime = runtime;
52
+ }
53
+ getResumableAdapter() {
54
+ return this.resumable;
55
+ }
56
+ __internal_setGetThreadListItem(getter) {
57
+ this.getThreadListItem = getter;
58
+ }
59
+ };
61
60
  function wrapFetchWithResumable(resumable, userFetch) {
62
- const baseFetch = userFetch
63
- ? (input, init) => userFetch(input, init)
64
- : globalThis.fetch.bind(globalThis);
65
- return async (input, init) => {
66
- const res = await baseFetch(input, init);
67
- const id = res.headers.get(RESUMABLE_STREAM_ID_HEADER);
68
- if (id)
69
- resumable.storage.setStreamId(id);
70
- if (!res.body)
71
- return res;
72
- const detectFinish = resumable.isFinishEvent ?? defaultIsFinishEvent;
73
- // a single decoder is required so multi-byte sequences split across
74
- // chunks buffer via stream: true rather than getting dropped.
75
- const decoder = new TextDecoder();
76
- let accumulator = "";
77
- const tap = new TransformStream({
78
- transform(chunk, controller) {
79
- controller.enqueue(chunk);
80
- accumulator += decoder.decode(chunk, { stream: true });
81
- if (detectFinish(chunk, accumulator)) {
82
- resumable.storage.clear();
83
- accumulator = "";
84
- }
85
- else if (accumulator.length > FINISH_BUFFER_LIMIT) {
86
- accumulator = accumulator.slice(-FINISH_BUFFER_TAIL);
87
- }
88
- },
89
- });
90
- return new Response(res.body.pipeThrough(tap), {
91
- status: res.status,
92
- statusText: res.statusText,
93
- headers: res.headers,
94
- });
95
- };
61
+ const baseFetch = userFetch ? (input, init) => userFetch(input, init) : globalThis.fetch.bind(globalThis);
62
+ return async (input, init) => {
63
+ const res = await baseFetch(input, init);
64
+ const id = res.headers.get(RESUMABLE_STREAM_ID_HEADER);
65
+ if (id) resumable.storage.setStreamId(id);
66
+ if (!res.body) return res;
67
+ const detectFinish = resumable.isFinishEvent ?? defaultIsFinishEvent;
68
+ const decoder = new TextDecoder();
69
+ let accumulator = "";
70
+ const tap = new TransformStream({ transform(chunk, controller) {
71
+ controller.enqueue(chunk);
72
+ accumulator += decoder.decode(chunk, { stream: true });
73
+ if (detectFinish(chunk, accumulator)) {
74
+ resumable.storage.clear();
75
+ accumulator = "";
76
+ } else if (accumulator.length > FINISH_BUFFER_LIMIT) accumulator = accumulator.slice(-1024);
77
+ } });
78
+ return new Response(res.body.pipeThrough(tap), {
79
+ status: res.status,
80
+ statusText: res.statusText,
81
+ headers: res.headers
82
+ });
83
+ };
96
84
  }
97
85
  function defaultIsFinishEvent(_chunk, accumulator) {
98
- return accumulator.includes(FINISH_MARKER);
86
+ return accumulator.includes(FINISH_MARKER);
99
87
  }
100
88
  function wrapPrepareReconnect(resumable, userPrepareReconnect) {
101
- return async (options) => {
102
- const streamId = resumable.storage.getStreamId();
103
- if (!streamId) {
104
- throw new Error("AssistantChatTransport: no resumable stream id available; nothing to resume");
105
- }
106
- const api = typeof resumable.resumeApi === "function"
107
- ? resumable.resumeApi(streamId)
108
- : resumable.resumeApi;
109
- const userPrepared = await userPrepareReconnect?.({ ...options, api });
110
- return {
111
- ...userPrepared,
112
- api: userPrepared?.api ?? api,
113
- };
114
- };
89
+ return async (options) => {
90
+ const streamId = resumable.storage.getStreamId();
91
+ if (!streamId) throw new Error("AssistantChatTransport: no resumable stream id available; nothing to resume");
92
+ const api = typeof resumable.resumeApi === "function" ? resumable.resumeApi(streamId) : resumable.resumeApi;
93
+ const userPrepared = await userPrepareReconnect?.({
94
+ ...options,
95
+ api
96
+ });
97
+ return {
98
+ ...userPrepared,
99
+ api: userPrepared?.api ?? api
100
+ };
101
+ };
115
102
  }
103
+ //#endregion
104
+ export { AssistantChatTransport };
105
+
116
106
  //# sourceMappingURL=AssistantChatTransport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChatTransport.js","sourceRoot":"","sources":["../../../src/ui/use-chat/AssistantChatTransport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AssistantChatTransport.js","names":[],"sources":["../../../src/ui/use-chat/AssistantChatTransport.ts"],"sourcesContent":["import type {\n AssistantRuntime,\n ThreadListItemRuntime,\n} from \"@assistant-ui/core\";\nimport {\n DefaultChatTransport,\n type HttpChatTransportInitOptions,\n type UIMessage,\n} from \"ai\";\nimport { toToolsJSONSchema } from \"assistant-stream\";\nimport {\n RESUMABLE_STREAM_ID_HEADER,\n type AssistantChatResumableOptions,\n} from \"../resumable\";\n\ntype InitializableThreadListItem = Pick<ThreadListItemRuntime, \"initialize\">;\n\nconst FINISH_MARKER = '\"type\":\"finish\"';\nconst FINISH_BUFFER_LIMIT = 4096;\nconst FINISH_BUFFER_TAIL = 1024;\n\nexport type AssistantChatTransportInitOptions<UI_MESSAGE extends UIMessage> =\n HttpChatTransportInitOptions<UI_MESSAGE> & {\n resumable?: AssistantChatResumableOptions;\n };\n\nexport class AssistantChatTransport<\n UI_MESSAGE extends UIMessage,\n> extends DefaultChatTransport<UI_MESSAGE> {\n private runtime: AssistantRuntime | undefined;\n private getThreadListItem:\n | (() => InitializableThreadListItem | undefined)\n | undefined;\n private readonly resumable: AssistantChatResumableOptions | undefined;\n\n constructor(initOptions?: AssistantChatTransportInitOptions<UI_MESSAGE>) {\n const { resumable, ...rest } = initOptions ?? {};\n const userFetch = rest.fetch;\n const userPrepareReconnect = rest.prepareReconnectToStreamRequest;\n\n super({\n ...rest,\n ...(resumable && {\n fetch: wrapFetchWithResumable(resumable, userFetch),\n prepareReconnectToStreamRequest: wrapPrepareReconnect(\n resumable,\n userPrepareReconnect,\n ),\n }),\n prepareSendMessagesRequest: async (options) => {\n const context = this.runtime?.thread.getModelContext();\n const threadListItem =\n this.getThreadListItem?.() ?? this.runtime?.threads.mainItem;\n const id = (await threadListItem?.initialize())?.remoteId ?? options.id;\n\n const optionsEx = {\n ...options,\n body: {\n callSettings: context?.callSettings,\n system: context?.system,\n config: context?.config,\n tools: toToolsJSONSchema(context?.tools ?? {}),\n ...options?.body,\n },\n };\n const preparedRequest =\n await rest.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 this.resumable = resumable;\n }\n\n setRuntime(runtime: AssistantRuntime) {\n this.runtime = runtime;\n }\n\n getResumableAdapter(): AssistantChatResumableOptions | undefined {\n return this.resumable;\n }\n\n __internal_setGetThreadListItem(\n getter: () => InitializableThreadListItem | undefined,\n ) {\n this.getThreadListItem = getter;\n }\n}\n\nfunction wrapFetchWithResumable(\n resumable: AssistantChatResumableOptions,\n userFetch: HttpChatTransportInitOptions<UIMessage>[\"fetch\"],\n): NonNullable<HttpChatTransportInitOptions<UIMessage>[\"fetch\"]> {\n const baseFetch: typeof globalThis.fetch = userFetch\n ? (input, init) => userFetch(input as RequestInfo | URL, init)\n : globalThis.fetch.bind(globalThis);\n\n return async (input, init) => {\n const res = await baseFetch(input, init);\n const id = res.headers.get(RESUMABLE_STREAM_ID_HEADER);\n if (id) resumable.storage.setStreamId(id);\n if (!res.body) return res;\n\n const detectFinish = resumable.isFinishEvent ?? defaultIsFinishEvent;\n // a single decoder is required so multi-byte sequences split across\n // chunks buffer via stream: true rather than getting dropped.\n const decoder = new TextDecoder();\n let accumulator = \"\";\n const tap = new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n controller.enqueue(chunk);\n accumulator += decoder.decode(chunk, { stream: true });\n if (detectFinish(chunk, accumulator)) {\n resumable.storage.clear();\n accumulator = \"\";\n } else if (accumulator.length > FINISH_BUFFER_LIMIT) {\n accumulator = accumulator.slice(-FINISH_BUFFER_TAIL);\n }\n },\n });\n\n return new Response(res.body.pipeThrough(tap), {\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n });\n };\n}\n\nfunction defaultIsFinishEvent(_chunk: Uint8Array, accumulator: string) {\n return accumulator.includes(FINISH_MARKER);\n}\n\nfunction wrapPrepareReconnect(\n resumable: AssistantChatResumableOptions,\n userPrepareReconnect: HttpChatTransportInitOptions<UIMessage>[\"prepareReconnectToStreamRequest\"],\n): NonNullable<\n HttpChatTransportInitOptions<UIMessage>[\"prepareReconnectToStreamRequest\"]\n> {\n return async (options) => {\n const streamId = resumable.storage.getStreamId();\n if (!streamId) {\n throw new Error(\n \"AssistantChatTransport: no resumable stream id available; nothing to resume\",\n );\n }\n const api =\n typeof resumable.resumeApi === \"function\"\n ? resumable.resumeApi(streamId)\n : resumable.resumeApi;\n const userPrepared = await userPrepareReconnect?.({ ...options, api });\n return {\n ...userPrepared,\n api: userPrepared?.api ?? api,\n };\n };\n}\n"],"mappings":";;;;AAiBA,MAAM,gBAAgB;AACtB,MAAM,sBAAsB;AAQ5B,IAAa,yBAAb,cAEU,qBAAiC;CACzC;CACA;CAGA;CAEA,YAAY,aAA6D;EACvE,MAAM,EAAE,WAAW,GAAG,SAAS,eAAe,CAAC;EAC/C,MAAM,YAAY,KAAK;EACvB,MAAM,uBAAuB,KAAK;EAElC,MAAM;GACJ,GAAG;GACH,GAAI,aAAa;IACf,OAAO,uBAAuB,WAAW,SAAS;IAClD,iCAAiC,qBAC/B,WACA,oBACF;GACF;GACA,4BAA4B,OAAO,YAAY;IAC7C,MAAM,UAAU,KAAK,SAAS,OAAO,gBAAgB;IAGrD,MAAM,MAAM,OADV,KAAK,oBAAoB,KAAK,KAAK,SAAS,QAAQ,WACpB,WAAW,IAAI,YAAY,QAAQ;IAErE,MAAM,YAAY;KAChB,GAAG;KACH,MAAM;MACJ,cAAc,SAAS;MACvB,QAAQ,SAAS;MACjB,QAAQ,SAAS;MACjB,OAAO,kBAAkB,SAAS,SAAS,CAAC,CAAC;MAC7C,GAAG,SAAS;KACd;IACF;IACA,MAAM,kBACJ,MAAM,KAAK,6BAA6B,SAAS;IAEnD,OAAO;KACL,GAAG;KACH,MAAM,iBAAiB,QAAQ;MAC7B,GAAG,UAAU;MACb;MACA,UAAU,QAAQ;MAClB,SAAS,QAAQ;MACjB,WAAW,QAAQ;MACnB,UAAU,QAAQ;KACpB;IACF;GACF;EACF,CAAC;EAED,KAAK,YAAY;CACnB;CAEA,WAAW,SAA2B;EACpC,KAAK,UAAU;CACjB;CAEA,sBAAiE;EAC/D,OAAO,KAAK;CACd;CAEA,gCACE,QACA;EACA,KAAK,oBAAoB;CAC3B;AACF;AAEA,SAAS,uBACP,WACA,WAC+D;CAC/D,MAAM,YAAqC,aACtC,OAAO,SAAS,UAAU,OAA4B,IAAI,IAC3D,WAAW,MAAM,KAAK,UAAU;CAEpC,OAAO,OAAO,OAAO,SAAS;EAC5B,MAAM,MAAM,MAAM,UAAU,OAAO,IAAI;EACvC,MAAM,KAAK,IAAI,QAAQ,IAAI,0BAA0B;EACrD,IAAI,IAAI,UAAU,QAAQ,YAAY,EAAE;EACxC,IAAI,CAAC,IAAI,MAAM,OAAO;EAEtB,MAAM,eAAe,UAAU,iBAAiB;EAGhD,MAAM,UAAU,IAAI,YAAY;EAChC,IAAI,cAAc;EAClB,MAAM,MAAM,IAAI,gBAAwC,EACtD,UAAU,OAAO,YAAY;GAC3B,WAAW,QAAQ,KAAK;GACxB,eAAe,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;GACrD,IAAI,aAAa,OAAO,WAAW,GAAG;IACpC,UAAU,QAAQ,MAAM;IACxB,cAAc;GAChB,OAAO,IAAI,YAAY,SAAS,qBAC9B,cAAc,YAAY,MAAM,KAAmB;EAEvD,EACF,CAAC;EAED,OAAO,IAAI,SAAS,IAAI,KAAK,YAAY,GAAG,GAAG;GAC7C,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB,SAAS,IAAI;EACf,CAAC;CACH;AACF;AAEA,SAAS,qBAAqB,QAAoB,aAAqB;CACrE,OAAO,YAAY,SAAS,aAAa;AAC3C;AAEA,SAAS,qBACP,WACA,sBAGA;CACA,OAAO,OAAO,YAAY;EACxB,MAAM,WAAW,UAAU,QAAQ,YAAY;EAC/C,IAAI,CAAC,UACH,MAAM,IAAI,MACR,6EACF;EAEF,MAAM,MACJ,OAAO,UAAU,cAAc,aAC3B,UAAU,UAAU,QAAQ,IAC5B,UAAU;EAChB,MAAM,eAAe,MAAM,uBAAuB;GAAE,GAAG;GAAS;EAAI,CAAC;EACrE,OAAO;GACL,GAAG;GACH,KAAK,cAAc,OAAO;EAC5B;CACF;AACF"}
@@ -1,35 +1,45 @@
1
- import type { UIMessage, useChat, CreateUIMessage } from "@ai-sdk/react";
2
- import type { ExternalStoreAdapter, ThreadHistoryAdapter, AssistantRuntime, ThreadSuggestion, AppendMessage } from "@assistant-ui/core";
3
- export type CustomToCreateMessageFunction = <UI_MESSAGE extends UIMessage = UIMessage>(message: AppendMessage) => CreateUIMessage<UI_MESSAGE>;
4
- export type AISDKRuntimeAdapter = {
5
- adapters?: (NonNullable<ExternalStoreAdapter["adapters"]> & {
6
- history?: ThreadHistoryAdapter | undefined;
7
- }) | undefined;
8
- toCreateMessage?: CustomToCreateMessageFunction;
9
- /**
10
- * Whether to automatically cancel pending interactive tool calls when the user sends a new message.
11
- *
12
- * When enabled (default), the pending tool calls will be marked as failed with an error message
13
- * indicating the user cancelled the tool call by sending a new message.
14
- *
15
- * @default true
16
- */
17
- cancelPendingToolCallsOnSend?: boolean | undefined;
18
- /**
19
- * Called when `runtime.thread.resumeRun(config)` is invoked.
20
- *
21
- * When omitted, `resumeRun` throws `"Runtime does not support resuming runs."`.
22
- * Provide this to bridge resume invocations into a custom replay channel
23
- * (for example, an SSE reconnect endpoint keyed by turn id).
24
- */
25
- onResume?: ExternalStoreAdapter["onResume"];
26
- /**
27
- * Follow up suggestions to surface on the thread. Use this to drive
28
- * dynamic suggestions from application state, tool results, or backend
29
- * responses; flows into `thread.suggestions` and is rendered by
30
- * components that read it (such as the shadcn `ThreadFollowupSuggestions`).
31
- */
32
- suggestions?: readonly ThreadSuggestion[] | undefined;
1
+ import { AppendMessage, AssistantRuntime, ExternalStoreAdapter, ThreadHistoryAdapter, ThreadSuggestion } from "@assistant-ui/core";
2
+ import { CreateUIMessage, UIMessage, useChat } from "@ai-sdk/react";
3
+
4
+ //#region src/ui/use-chat/useAISDKRuntime.d.ts
5
+ type CustomToCreateMessageFunction = <UI_MESSAGE extends UIMessage = UIMessage>(message: AppendMessage) => CreateUIMessage<UI_MESSAGE>;
6
+ type AISDKRuntimeAdapter = {
7
+ adapters?: (NonNullable<ExternalStoreAdapter["adapters"]> & {
8
+ history?: ThreadHistoryAdapter | undefined;
9
+ }) | undefined;
10
+ toCreateMessage?: CustomToCreateMessageFunction;
11
+ /**
12
+ * Whether to automatically cancel pending interactive tool calls when the user sends a new message.
13
+ *
14
+ * When enabled (default), the pending tool calls will be marked as failed with an error message
15
+ * indicating the user cancelled the tool call by sending a new message.
16
+ *
17
+ * @default true
18
+ */
19
+ cancelPendingToolCallsOnSend?: boolean | undefined;
20
+ /**
21
+ * Called when `runtime.thread.resumeRun(config)` is invoked.
22
+ *
23
+ * When omitted, `resumeRun` throws `"Runtime does not support resuming runs."`.
24
+ * Provide this to bridge resume invocations into a custom replay channel
25
+ * (for example, an SSE reconnect endpoint keyed by turn id).
26
+ */
27
+ onResume?: ExternalStoreAdapter["onResume"];
28
+ /**
29
+ * Follow up suggestions to surface on the thread. Use this to drive
30
+ * dynamic suggestions from application state, tool results, or backend
31
+ * responses; flows into `thread.suggestions` and is rendered by
32
+ * components that read it (such as the shadcn `ThreadFollowupSuggestions`).
33
+ */
34
+ suggestions?: readonly ThreadSuggestion[] | undefined;
33
35
  };
34
- export declare const useAISDKRuntime: <UI_MESSAGE extends UIMessage = UIMessage>(chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>, { adapters, toCreateMessage: customToCreateMessage, cancelPendingToolCallsOnSend, onResume, suggestions, }?: AISDKRuntimeAdapter) => AssistantRuntime;
36
+ declare const useAISDKRuntime: <UI_MESSAGE extends UIMessage = UIMessage>(chatHelpers: ReturnType<typeof useChat<UI_MESSAGE>>, {
37
+ adapters,
38
+ toCreateMessage: customToCreateMessage,
39
+ cancelPendingToolCallsOnSend,
40
+ onResume,
41
+ suggestions
42
+ }?: AISDKRuntimeAdapter) => AssistantRuntime;
43
+ //#endregion
44
+ export { AISDKRuntimeAdapter, CustomToCreateMessageFunction, useAISDKRuntime };
35
45
  //# sourceMappingURL=useAISDKRuntime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAISDKRuntime.d.ts","sourceRoot":"","sources":["../../../src/ui/use-chat/useAISDKRuntime.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQzE,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAEhB,gBAAgB,EAIhB,aAAa,EAGd,MAAM,oBAAoB,CAAC;AAmB5B,MAAM,MAAM,6BAA6B,GAAG,CAC1C,UAAU,SAAS,SAAS,GAAG,SAAS,EAExC,OAAO,EAAE,aAAa,KACnB,eAAe,CAAC,UAAU,CAAC,CAAC;AAYjC,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EACL,CAAC,WAAW,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,GAAG;QAC/C,OAAO,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;KAC5C,CAAC,GACF,SAAS,CAAC;IACd,eAAe,CAAC,EAAE,6BAA6B,CAAC;IAChD;;;;;;;OAOG;IACH,4BAA4B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnD;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC5C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,gBAAgB,EAAE,GAAG,SAAS,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,SAAS,SAAS,GAAG,SAAS,EACtE,aAAa,UAAU,CAAC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC,EACnD,6GAMG,mBAAwB,qBAwQ5B,CAAC"}
1
+ {"version":3,"file":"useAISDKRuntime.d.ts","names":[],"sources":["../../../src/ui/use-chat/useAISDKRuntime.ts"],"mappings":";;;;KA0CY,6BAAA,uBACS,SAAA,GAAY,SAAA,EAE/B,OAAA,EAAS,aAAA,KACN,eAAA,CAAgB,UAAA;AAAA,KAYT,mBAAA;EACV,QAAA,IACK,WAAA,CAAY,oBAAA;IACX,OAAA,GAAU,oBAAA;EAAA;EAGhB,eAAA,GAAkB,6BAAA;EArBa;;;;;;;;EA8B/B,4BAAA;EA5BS;;;;;AACoB;AAY/B;EAuBE,QAAA,GAAW,oBAAA;;;;;;;EAOX,WAAA,YAAuB,gBAAA;AAAA;AAAA,cAGZ,eAAA,sBAAsC,SAAA,GAAY,SAAA,EAC7D,WAAA,EAAa,UAAA,QAAkB,OAAA,CAAQ,UAAA;EACvC,QAAA;EAAA,eAAA,EAAA,qBAAA;EAAA,4BAAA;EAAA,QAAA;EAAA;AAAA,IAMG,mBAAA,KAAwB,gBAAA"}