@ai-sdk/svelte 1.1.23 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +5 -3
  3. package/dist/chat-context.svelte.d.ts +14 -0
  4. package/dist/chat-context.svelte.d.ts.map +1 -0
  5. package/dist/chat-context.svelte.js +13 -0
  6. package/dist/chat.svelte.d.ts +75 -0
  7. package/dist/chat.svelte.d.ts.map +1 -0
  8. package/dist/chat.svelte.js +244 -0
  9. package/dist/completion-context.svelte.d.ts +15 -0
  10. package/dist/completion-context.svelte.d.ts.map +1 -0
  11. package/dist/completion-context.svelte.js +14 -0
  12. package/dist/completion.svelte.d.ts +37 -0
  13. package/dist/completion.svelte.d.ts.map +1 -0
  14. package/dist/completion.svelte.js +111 -0
  15. package/dist/context-provider.d.ts +2 -0
  16. package/dist/context-provider.d.ts.map +1 -0
  17. package/dist/context-provider.js +11 -0
  18. package/dist/index.d.ts +5 -166
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +4 -551
  21. package/dist/structured-object-context.svelte.d.ts +12 -0
  22. package/dist/structured-object-context.svelte.d.ts.map +1 -0
  23. package/dist/structured-object-context.svelte.js +12 -0
  24. package/dist/structured-object.svelte.d.ts +73 -0
  25. package/dist/structured-object.svelte.d.ts.map +1 -0
  26. package/dist/structured-object.svelte.js +123 -0
  27. package/dist/tests/chat-synchronization.svelte +12 -0
  28. package/dist/tests/chat-synchronization.svelte.d.ts +11 -0
  29. package/dist/tests/chat-synchronization.svelte.d.ts.map +1 -0
  30. package/dist/tests/completion-synchronization.svelte +12 -0
  31. package/dist/tests/completion-synchronization.svelte.d.ts +11 -0
  32. package/dist/tests/completion-synchronization.svelte.d.ts.map +1 -0
  33. package/dist/tests/structured-object-synchronization.svelte +22 -0
  34. package/dist/tests/structured-object-synchronization.svelte.d.ts +28 -0
  35. package/dist/tests/structured-object-synchronization.svelte.d.ts.map +1 -0
  36. package/dist/utils.svelte.d.ts +17 -0
  37. package/dist/utils.svelte.d.ts.map +1 -0
  38. package/dist/utils.svelte.js +50 -0
  39. package/package.json +56 -35
  40. package/src/chat-context.svelte.ts +23 -0
  41. package/src/chat.svelte.ts +341 -0
  42. package/src/completion-context.svelte.ts +24 -0
  43. package/src/completion.svelte.ts +133 -0
  44. package/src/context-provider.ts +20 -0
  45. package/src/index.ts +16 -0
  46. package/src/structured-object-context.svelte.ts +27 -0
  47. package/src/structured-object.svelte.ts +222 -0
  48. package/src/tests/chat-synchronization.svelte +12 -0
  49. package/src/tests/completion-synchronization.svelte +12 -0
  50. package/src/tests/structured-object-synchronization.svelte +22 -0
  51. package/src/utils.svelte.ts +66 -0
  52. package/dist/index.d.mts +0 -166
  53. package/dist/index.js.map +0 -1
  54. package/dist/index.mjs +0 -532
  55. package/dist/index.mjs.map +0 -1
package/dist/index.mjs DELETED
@@ -1,532 +0,0 @@
1
- // src/use-chat.ts
2
- import {
3
- callChatApi,
4
- extractMaxToolInvocationStep,
5
- fillMessageParts,
6
- generateId as generateIdFunc,
7
- getMessageParts,
8
- isAssistantMessageWithCompletedToolCalls,
9
- prepareAttachmentsForRequest,
10
- shouldResubmitMessages,
11
- updateToolCallResult
12
- } from "@ai-sdk/ui-utils";
13
- import { derived, get, writable } from "svelte/store";
14
- var store = writable({});
15
- function useChat({
16
- api = "/api/chat",
17
- id,
18
- initialMessages = [],
19
- initialInput = "",
20
- sendExtraMessageFields,
21
- streamProtocol = "data",
22
- onResponse,
23
- onFinish,
24
- onError,
25
- onToolCall,
26
- credentials,
27
- headers,
28
- body,
29
- generateId: generateId2 = generateIdFunc,
30
- fetch: fetch2,
31
- keepLastMessageOnError = true,
32
- maxSteps = 1
33
- } = {}) {
34
- const chatId = id != null ? id : generateId2();
35
- const key = `${api}|${chatId}`;
36
- const messages = derived(
37
- [store],
38
- ([$store]) => {
39
- var _a;
40
- return (_a = $store[key]) != null ? _a : fillMessageParts(initialMessages);
41
- }
42
- );
43
- const streamData = writable(void 0);
44
- const status = writable(
45
- "ready"
46
- );
47
- const mutate = (data) => {
48
- store.update((value) => {
49
- value[key] = data;
50
- return value;
51
- });
52
- };
53
- let abortController = null;
54
- const extraMetadata = {
55
- credentials,
56
- headers,
57
- body
58
- };
59
- const error = writable(void 0);
60
- async function triggerRequest(chatRequest) {
61
- var _a;
62
- status.set("submitted");
63
- error.set(void 0);
64
- const messagesSnapshot = get(messages);
65
- const messageCount = messagesSnapshot.length;
66
- const maxStep = extractMaxToolInvocationStep(
67
- (_a = chatRequest.messages[chatRequest.messages.length - 1]) == null ? void 0 : _a.toolInvocations
68
- );
69
- try {
70
- abortController = new AbortController();
71
- const chatMessages = fillMessageParts(chatRequest.messages);
72
- mutate(chatMessages);
73
- const existingData = get(streamData);
74
- const previousMessages = get(messages);
75
- const constructedMessagesPayload = sendExtraMessageFields ? chatMessages : chatMessages.map(
76
- ({
77
- role,
78
- content,
79
- experimental_attachments,
80
- data,
81
- annotations,
82
- toolInvocations,
83
- parts
84
- }) => ({
85
- role,
86
- content,
87
- ...experimental_attachments !== void 0 && {
88
- experimental_attachments
89
- },
90
- ...data !== void 0 && { data },
91
- ...annotations !== void 0 && { annotations },
92
- ...toolInvocations !== void 0 && { toolInvocations },
93
- ...parts !== void 0 && { parts }
94
- })
95
- );
96
- await callChatApi({
97
- api,
98
- body: {
99
- id: chatId,
100
- messages: constructedMessagesPayload,
101
- data: chatRequest.data,
102
- ...extraMetadata.body,
103
- ...chatRequest.body
104
- },
105
- streamProtocol,
106
- credentials: extraMetadata.credentials,
107
- headers: {
108
- ...extraMetadata.headers,
109
- ...chatRequest.headers
110
- },
111
- abortController: () => abortController,
112
- restoreMessagesOnFailure() {
113
- if (!keepLastMessageOnError) {
114
- mutate(previousMessages);
115
- }
116
- },
117
- onResponse,
118
- onUpdate({ message, data, replaceLastMessage }) {
119
- status.set("streaming");
120
- mutate([
121
- ...replaceLastMessage ? chatMessages.slice(0, chatMessages.length - 1) : chatMessages,
122
- message
123
- ]);
124
- if (data == null ? void 0 : data.length) {
125
- streamData.set([...existingData != null ? existingData : [], ...data]);
126
- }
127
- },
128
- onFinish,
129
- generateId: generateId2,
130
- onToolCall,
131
- fetch: fetch2,
132
- lastMessage: chatMessages[chatMessages.length - 1]
133
- });
134
- status.set("ready");
135
- } catch (err) {
136
- if (err.name === "AbortError") {
137
- abortController = null;
138
- status.set("ready");
139
- return null;
140
- }
141
- if (onError && err instanceof Error) {
142
- onError(err);
143
- }
144
- error.set(err);
145
- status.set("error");
146
- } finally {
147
- abortController = null;
148
- }
149
- const newMessagesSnapshot = get(messages);
150
- if (shouldResubmitMessages({
151
- originalMaxToolInvocationStep: maxStep,
152
- originalMessageCount: messageCount,
153
- maxSteps,
154
- messages: newMessagesSnapshot
155
- })) {
156
- await triggerRequest({ messages: newMessagesSnapshot });
157
- }
158
- }
159
- const append = async (message, { data, headers: headers2, body: body2, experimental_attachments } = {}) => {
160
- var _a, _b;
161
- const attachmentsForRequest = await prepareAttachmentsForRequest(
162
- experimental_attachments
163
- );
164
- return triggerRequest({
165
- messages: get(messages).concat({
166
- ...message,
167
- id: (_a = message.id) != null ? _a : generateId2(),
168
- createdAt: (_b = message.createdAt) != null ? _b : /* @__PURE__ */ new Date(),
169
- experimental_attachments: attachmentsForRequest.length > 0 ? attachmentsForRequest : void 0,
170
- parts: getMessageParts(message)
171
- }),
172
- headers: headers2,
173
- body: body2,
174
- data
175
- });
176
- };
177
- const reload = async ({
178
- data,
179
- headers: headers2,
180
- body: body2
181
- } = {}) => {
182
- const messagesSnapshot = get(messages);
183
- if (messagesSnapshot.length === 0) {
184
- return null;
185
- }
186
- const lastMessage = messagesSnapshot.at(-1);
187
- return triggerRequest({
188
- messages: (lastMessage == null ? void 0 : lastMessage.role) === "assistant" ? messagesSnapshot.slice(0, -1) : messagesSnapshot,
189
- headers: headers2,
190
- body: body2,
191
- data
192
- });
193
- };
194
- const stop = () => {
195
- if (abortController) {
196
- abortController.abort();
197
- abortController = null;
198
- }
199
- };
200
- const setMessages = (messagesArg) => {
201
- if (typeof messagesArg === "function") {
202
- messagesArg = messagesArg(get(messages));
203
- }
204
- mutate(fillMessageParts(messagesArg));
205
- };
206
- const setData = (dataArg) => {
207
- if (typeof dataArg === "function") {
208
- dataArg = dataArg(get(streamData));
209
- }
210
- streamData.set(dataArg);
211
- };
212
- const input = writable(initialInput);
213
- const handleSubmit = async (event, options = {}) => {
214
- var _a;
215
- (_a = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a.call(event);
216
- const inputValue = get(input);
217
- if (!inputValue && !options.allowEmptySubmit)
218
- return;
219
- const attachmentsForRequest = await prepareAttachmentsForRequest(
220
- options.experimental_attachments
221
- );
222
- triggerRequest({
223
- messages: get(messages).concat({
224
- id: generateId2(),
225
- content: inputValue,
226
- role: "user",
227
- createdAt: /* @__PURE__ */ new Date(),
228
- experimental_attachments: attachmentsForRequest.length > 0 ? attachmentsForRequest : void 0,
229
- parts: [{ type: "text", text: inputValue }]
230
- }),
231
- body: options.body,
232
- headers: options.headers,
233
- data: options.data
234
- });
235
- input.set("");
236
- };
237
- const addToolResult = ({
238
- toolCallId,
239
- result
240
- }) => {
241
- var _a;
242
- const messagesSnapshot = (_a = get(messages)) != null ? _a : [];
243
- updateToolCallResult({
244
- messages: messagesSnapshot,
245
- toolCallId,
246
- toolResult: result
247
- });
248
- mutate(messagesSnapshot);
249
- const lastMessage = messagesSnapshot[messagesSnapshot.length - 1];
250
- if (isAssistantMessageWithCompletedToolCalls(lastMessage)) {
251
- triggerRequest({ messages: messagesSnapshot });
252
- }
253
- };
254
- return {
255
- id: chatId,
256
- messages,
257
- error,
258
- append,
259
- reload,
260
- stop,
261
- setMessages,
262
- input,
263
- handleSubmit,
264
- isLoading: derived(
265
- status,
266
- ($status) => $status === "submitted" || $status === "streaming"
267
- ),
268
- status,
269
- data: streamData,
270
- setData,
271
- addToolResult
272
- };
273
- }
274
-
275
- // src/use-completion.ts
276
- import { callCompletionApi } from "@ai-sdk/ui-utils";
277
- import { derived as derived2, get as get2, writable as writable2 } from "svelte/store";
278
- var uniqueId = 0;
279
- var store2 = writable2({});
280
- function useCompletion({
281
- api = "/api/completion",
282
- id,
283
- initialCompletion = "",
284
- initialInput = "",
285
- credentials,
286
- headers,
287
- body,
288
- streamProtocol = "data",
289
- onResponse,
290
- onFinish,
291
- onError,
292
- fetch: fetch2
293
- } = {}) {
294
- const completionId = id || `completion-${uniqueId++}`;
295
- const key = `${api}|${completionId}`;
296
- const data = derived2([store2], ([$store]) => {
297
- var _a;
298
- return (_a = $store[key]) != null ? _a : initialCompletion;
299
- });
300
- const streamData = writable2(void 0);
301
- const loading = writable2(false);
302
- const mutate = (data2) => {
303
- store2.update((value) => {
304
- value[key] = data2;
305
- return value;
306
- });
307
- };
308
- const completion = data;
309
- const error = writable2(void 0);
310
- let abortController = null;
311
- const complete = async (prompt, options) => {
312
- const existingData = get2(streamData);
313
- return callCompletionApi({
314
- api,
315
- prompt,
316
- credentials,
317
- headers: {
318
- ...headers,
319
- ...options == null ? void 0 : options.headers
320
- },
321
- body: {
322
- ...body,
323
- ...options == null ? void 0 : options.body
324
- },
325
- streamProtocol,
326
- setCompletion: mutate,
327
- setLoading: (loadingState) => loading.set(loadingState),
328
- setError: (err) => error.set(err),
329
- setAbortController: (controller) => {
330
- abortController = controller;
331
- },
332
- onResponse,
333
- onFinish,
334
- onError,
335
- onData(data2) {
336
- streamData.set([...existingData || [], ...data2 || []]);
337
- },
338
- fetch: fetch2
339
- });
340
- };
341
- const stop = () => {
342
- if (abortController) {
343
- abortController.abort();
344
- abortController = null;
345
- }
346
- };
347
- const setCompletion = (completion2) => {
348
- mutate(completion2);
349
- };
350
- const input = writable2(initialInput);
351
- const handleSubmit = (event) => {
352
- var _a;
353
- (_a = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a.call(event);
354
- const inputValue = get2(input);
355
- return inputValue ? complete(inputValue) : void 0;
356
- };
357
- return {
358
- completion,
359
- complete,
360
- error,
361
- stop,
362
- setCompletion,
363
- input,
364
- handleSubmit,
365
- isLoading: loading,
366
- data: streamData
367
- };
368
- }
369
-
370
- // src/use-assistant.ts
371
- import { isAbortError } from "@ai-sdk/provider-utils";
372
- import { generateId, processAssistantStream } from "@ai-sdk/ui-utils";
373
- import { get as get3, writable as writable3 } from "svelte/store";
374
- var getOriginalFetch = () => fetch;
375
- var uniqueId2 = 0;
376
- var store3 = {};
377
- function useAssistant({
378
- api,
379
- threadId: threadIdParam,
380
- credentials,
381
- headers,
382
- body,
383
- onError,
384
- fetch: fetch2
385
- }) {
386
- const threadIdStore = writable3(threadIdParam);
387
- const key = `${api}|${threadIdParam != null ? threadIdParam : `completion-${uniqueId2++}`}`;
388
- const messages = writable3(store3[key] || []);
389
- const input = writable3("");
390
- const status = writable3("awaiting_message");
391
- const error = writable3(void 0);
392
- let abortController = null;
393
- const mutateMessages = (newMessages) => {
394
- store3[key] = newMessages;
395
- messages.set(newMessages);
396
- };
397
- async function append(message, requestOptions) {
398
- var _a, _b, _c, _d;
399
- status.set("in_progress");
400
- abortController = new AbortController();
401
- mutateMessages([
402
- ...get3(messages),
403
- { ...message, id: (_a = message.id) != null ? _a : generateId() }
404
- ]);
405
- input.set("");
406
- try {
407
- const actualFetch = fetch2 != null ? fetch2 : getOriginalFetch();
408
- const response = await actualFetch(api, {
409
- method: "POST",
410
- credentials,
411
- signal: abortController.signal,
412
- headers: { "Content-Type": "application/json", ...headers },
413
- body: JSON.stringify({
414
- ...body,
415
- // always use user-provided threadId when available:
416
- threadId: (_b = threadIdParam != null ? threadIdParam : get3(threadIdStore)) != null ? _b : null,
417
- message: message.content,
418
- // optional request data:
419
- data: requestOptions == null ? void 0 : requestOptions.data
420
- })
421
- });
422
- if (!response.ok) {
423
- throw new Error(
424
- (_c = await response.text()) != null ? _c : "Failed to fetch the assistant response."
425
- );
426
- }
427
- if (response.body == null) {
428
- throw new Error("The response body is empty.");
429
- }
430
- await processAssistantStream({
431
- stream: response.body,
432
- onAssistantMessagePart(value) {
433
- mutateMessages([
434
- ...get3(messages),
435
- {
436
- id: value.id,
437
- role: value.role,
438
- content: value.content[0].text.value,
439
- parts: []
440
- }
441
- ]);
442
- },
443
- onTextPart(value) {
444
- mutateMessages(
445
- get3(messages).map((msg, index, array) => {
446
- if (index === array.length - 1) {
447
- return { ...msg, content: msg.content + value };
448
- }
449
- return msg;
450
- })
451
- );
452
- },
453
- onAssistantControlDataPart(value) {
454
- threadIdStore.set(value.threadId);
455
- mutateMessages(
456
- get3(messages).map((msg, index, array) => {
457
- if (index === array.length - 1) {
458
- return { ...msg, id: value.messageId };
459
- }
460
- return msg;
461
- })
462
- );
463
- },
464
- onDataMessagePart(value) {
465
- var _a2;
466
- mutateMessages([
467
- ...get3(messages),
468
- {
469
- id: (_a2 = value.id) != null ? _a2 : generateId(),
470
- role: "data",
471
- content: "",
472
- data: value.data,
473
- parts: []
474
- }
475
- ]);
476
- },
477
- onErrorPart(value) {
478
- error.set(new Error(value));
479
- }
480
- });
481
- } catch (err) {
482
- if (isAbortError(error) && ((_d = abortController == null ? void 0 : abortController.signal) == null ? void 0 : _d.aborted)) {
483
- abortController = null;
484
- return;
485
- }
486
- if (onError && err instanceof Error) {
487
- onError(err);
488
- }
489
- error.set(err);
490
- } finally {
491
- abortController = null;
492
- status.set("awaiting_message");
493
- }
494
- }
495
- function setMessages(messages2) {
496
- mutateMessages(messages2);
497
- }
498
- function stop() {
499
- if (abortController) {
500
- abortController.abort();
501
- abortController = null;
502
- }
503
- }
504
- async function submitMessage(event, requestOptions) {
505
- var _a;
506
- (_a = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a.call(event);
507
- const inputValue = get3(input);
508
- if (!inputValue)
509
- return;
510
- await append(
511
- { role: "user", content: inputValue, parts: [] },
512
- requestOptions
513
- );
514
- }
515
- return {
516
- messages,
517
- error,
518
- threadId: threadIdStore,
519
- input,
520
- append,
521
- submitMessage,
522
- status,
523
- setMessages,
524
- stop
525
- };
526
- }
527
- export {
528
- useAssistant,
529
- useChat,
530
- useCompletion
531
- };
532
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/use-chat.ts","../src/use-completion.ts","../src/use-assistant.ts"],"sourcesContent":["import type {\n ChatRequest,\n ChatRequestOptions,\n CreateMessage,\n JSONValue,\n Message,\n UseChatOptions as SharedUseChatOptions,\n UIMessage,\n} from '@ai-sdk/ui-utils';\nimport {\n callChatApi,\n extractMaxToolInvocationStep,\n fillMessageParts,\n generateId as generateIdFunc,\n getMessageParts,\n isAssistantMessageWithCompletedToolCalls,\n prepareAttachmentsForRequest,\n shouldResubmitMessages,\n updateToolCallResult,\n} from '@ai-sdk/ui-utils';\nimport { Readable, Writable, derived, get, writable } from 'svelte/store';\nexport type { CreateMessage, Message };\n\nexport type UseChatOptions = SharedUseChatOptions & {\n /**\nMaximum number of sequential LLM calls (steps), e.g. when you use tool calls. Must be at least 1.\n\nA maximum number is required to prevent infinite loops in the case of misconfigured tools.\n\nBy default, it's set to 1, which means that only a single LLM call is made.\n */\n maxSteps?: number;\n};\n\nexport type UseChatHelpers = {\n /** Current messages in the chat */\n messages: Readable<UIMessage[]>;\n /** The error object of the API request */\n error: Readable<undefined | Error>;\n /**\n * Append a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n * @param message The message to append\n * @param chatRequestOptions Additional options to pass to the API call\n */\n append: (\n message: Message | CreateMessage,\n chatRequestOptions?: ChatRequestOptions,\n ) => Promise<string | null | undefined>;\n /**\n * Reload the last AI chat response for the given chat history. If the last\n * message isn't from the assistant, it will request the API to generate a\n * new response.\n */\n reload: (\n chatRequestOptions?: ChatRequestOptions,\n ) => Promise<string | null | undefined>;\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n stop: () => void;\n /**\n * Update the `messages` state locally. This is useful when you want to\n * edit the messages on the client, and then trigger the `reload` method\n * manually to regenerate the AI response.\n */\n setMessages: (\n messages: Message[] | ((messages: Message[]) => Message[]),\n ) => void;\n\n /** The current value of the input */\n input: Writable<string>;\n /** Form submission handler to automatically reset input and append a user message */\n handleSubmit: (\n event?: { preventDefault?: () => void },\n chatRequestOptions?: ChatRequestOptions,\n ) => void;\n metadata?: Object;\n\n /**\n * Whether the API request is in progress\n *\n * @deprecated use `status` instead\n */\n isLoading: Readable<boolean | undefined>;\n\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n status: Readable<'submitted' | 'streaming' | 'ready' | 'error'>;\n\n /** Additional data added on the server via StreamData */\n data: Readable<JSONValue[] | undefined>;\n /** Set the data of the chat. You can use this to transform or clear the chat data. */\n setData: (\n data:\n | JSONValue[]\n | undefined\n | ((data: JSONValue[] | undefined) => JSONValue[] | undefined),\n ) => void;\n\n /** The id of the chat */\n id: string;\n};\n\nconst store = writable<Record<string, UIMessage[] | undefined>>({});\n\nexport function useChat({\n api = '/api/chat',\n id,\n initialMessages = [],\n initialInput = '',\n sendExtraMessageFields,\n streamProtocol = 'data',\n onResponse,\n onFinish,\n onError,\n onToolCall,\n credentials,\n headers,\n body,\n generateId = generateIdFunc,\n fetch,\n keepLastMessageOnError = true,\n maxSteps = 1,\n}: UseChatOptions = {}): UseChatHelpers & {\n addToolResult: ({\n toolCallId,\n result,\n }: {\n toolCallId: string;\n result: any;\n }) => void;\n} {\n // Generate a unique id for the chat if not provided.\n const chatId = id ?? generateId();\n\n const key = `${api}|${chatId}`;\n const messages = derived(\n [store],\n ([$store]) => $store[key] ?? fillMessageParts(initialMessages),\n );\n\n const streamData = writable<JSONValue[] | undefined>(undefined);\n\n const status = writable<'submitted' | 'streaming' | 'ready' | 'error'>(\n 'ready',\n );\n\n const mutate = (data: UIMessage[]) => {\n store.update(value => {\n value[key] = data;\n return value;\n });\n };\n\n // Abort controller to cancel the current API call.\n let abortController: AbortController | null = null;\n\n const extraMetadata = {\n credentials,\n headers,\n body,\n };\n\n const error = writable<undefined | Error>(undefined);\n\n // Actual mutation hook to send messages to the API endpoint and update the\n // chat state.\n async function triggerRequest(chatRequest: ChatRequest) {\n status.set('submitted');\n error.set(undefined);\n\n const messagesSnapshot = get(messages);\n const messageCount = messagesSnapshot.length;\n const maxStep = extractMaxToolInvocationStep(\n chatRequest.messages[chatRequest.messages.length - 1]?.toolInvocations,\n );\n\n try {\n abortController = new AbortController();\n\n // Do an optimistic update to the chat state to show the updated messages\n // immediately.\n const chatMessages = fillMessageParts(chatRequest.messages);\n\n mutate(chatMessages);\n\n const existingData = get(streamData);\n const previousMessages = get(messages);\n\n const constructedMessagesPayload = sendExtraMessageFields\n ? chatMessages\n : chatMessages.map(\n ({\n role,\n content,\n experimental_attachments,\n data,\n annotations,\n toolInvocations,\n parts,\n }) => ({\n role,\n content,\n ...(experimental_attachments !== undefined && {\n experimental_attachments,\n }),\n ...(data !== undefined && { data }),\n ...(annotations !== undefined && { annotations }),\n ...(toolInvocations !== undefined && { toolInvocations }),\n ...(parts !== undefined && { parts }),\n }),\n );\n\n await callChatApi({\n api,\n body: {\n id: chatId,\n messages: constructedMessagesPayload,\n data: chatRequest.data,\n ...extraMetadata.body,\n ...chatRequest.body,\n },\n streamProtocol,\n credentials: extraMetadata.credentials,\n headers: {\n ...extraMetadata.headers,\n ...chatRequest.headers,\n },\n abortController: () => abortController,\n restoreMessagesOnFailure() {\n if (!keepLastMessageOnError) {\n mutate(previousMessages);\n }\n },\n onResponse,\n onUpdate({ message, data, replaceLastMessage }) {\n status.set('streaming');\n\n mutate([\n ...(replaceLastMessage\n ? chatMessages.slice(0, chatMessages.length - 1)\n : chatMessages),\n message,\n ]);\n if (data?.length) {\n streamData.set([...(existingData ?? []), ...data]);\n }\n },\n onFinish,\n generateId,\n onToolCall,\n fetch,\n lastMessage: chatMessages[chatMessages.length - 1],\n });\n\n status.set('ready');\n } catch (err) {\n // Ignore abort errors as they are expected.\n if ((err as any).name === 'AbortError') {\n abortController = null;\n status.set('ready');\n return null;\n }\n\n if (onError && err instanceof Error) {\n onError(err);\n }\n\n error.set(err as Error);\n status.set('error');\n } finally {\n abortController = null;\n }\n\n // auto-submit when all tool calls in the last assistant message have results:\n const newMessagesSnapshot = get(messages);\n if (\n shouldResubmitMessages({\n originalMaxToolInvocationStep: maxStep,\n originalMessageCount: messageCount,\n maxSteps,\n messages: newMessagesSnapshot,\n })\n ) {\n await triggerRequest({ messages: newMessagesSnapshot });\n }\n }\n\n const append: UseChatHelpers['append'] = async (\n message: Message | CreateMessage,\n { data, headers, body, experimental_attachments }: ChatRequestOptions = {},\n ) => {\n const attachmentsForRequest = await prepareAttachmentsForRequest(\n experimental_attachments,\n );\n\n return triggerRequest({\n messages: get(messages).concat({\n ...message,\n id: message.id ?? generateId(),\n createdAt: message.createdAt ?? new Date(),\n experimental_attachments:\n attachmentsForRequest.length > 0 ? attachmentsForRequest : undefined,\n parts: getMessageParts(message),\n }),\n headers,\n body,\n data,\n });\n };\n\n const reload: UseChatHelpers['reload'] = async ({\n data,\n headers,\n body,\n }: ChatRequestOptions = {}) => {\n const messagesSnapshot = get(messages);\n if (messagesSnapshot.length === 0) {\n return null;\n }\n\n // Remove last assistant message and retry last user message.\n const lastMessage = messagesSnapshot.at(-1);\n return triggerRequest({\n messages:\n lastMessage?.role === 'assistant'\n ? messagesSnapshot.slice(0, -1)\n : messagesSnapshot,\n headers,\n body,\n data,\n });\n };\n\n const stop = () => {\n if (abortController) {\n abortController.abort();\n abortController = null;\n }\n };\n\n const setMessages = (\n messagesArg: Message[] | ((messages: Message[]) => Message[]),\n ) => {\n if (typeof messagesArg === 'function') {\n messagesArg = messagesArg(get(messages));\n }\n\n mutate(fillMessageParts(messagesArg));\n };\n\n const setData = (\n dataArg:\n | JSONValue[]\n | undefined\n | ((data: JSONValue[] | undefined) => JSONValue[] | undefined),\n ) => {\n if (typeof dataArg === 'function') {\n dataArg = dataArg(get(streamData));\n }\n\n streamData.set(dataArg);\n };\n\n const input = writable(initialInput);\n\n const handleSubmit = async (\n event?: { preventDefault?: () => void },\n options: ChatRequestOptions = {},\n ) => {\n event?.preventDefault?.();\n const inputValue = get(input);\n\n if (!inputValue && !options.allowEmptySubmit) return;\n\n const attachmentsForRequest = await prepareAttachmentsForRequest(\n options.experimental_attachments,\n );\n\n triggerRequest({\n messages: get(messages).concat({\n id: generateId(),\n content: inputValue,\n role: 'user',\n createdAt: new Date(),\n experimental_attachments:\n attachmentsForRequest.length > 0 ? attachmentsForRequest : undefined,\n parts: [{ type: 'text', text: inputValue }],\n }),\n body: options.body,\n headers: options.headers,\n data: options.data,\n });\n\n input.set('');\n };\n\n const addToolResult = ({\n toolCallId,\n result,\n }: {\n toolCallId: string;\n result: any;\n }) => {\n const messagesSnapshot = get(messages) ?? [];\n\n updateToolCallResult({\n messages: messagesSnapshot,\n toolCallId,\n toolResult: result,\n });\n\n mutate(messagesSnapshot);\n\n // auto-submit when all tool calls in the last assistant message have results:\n const lastMessage = messagesSnapshot[messagesSnapshot.length - 1];\n\n if (isAssistantMessageWithCompletedToolCalls(lastMessage)) {\n triggerRequest({ messages: messagesSnapshot });\n }\n };\n\n return {\n id: chatId,\n messages,\n error,\n append,\n reload,\n stop,\n setMessages,\n input,\n handleSubmit,\n isLoading: derived(\n status,\n $status => $status === 'submitted' || $status === 'streaming',\n ),\n status,\n data: streamData,\n setData,\n addToolResult,\n };\n}\n","import type {\n JSONValue,\n RequestOptions,\n UseCompletionOptions,\n} from '@ai-sdk/ui-utils';\nimport { callCompletionApi } from '@ai-sdk/ui-utils';\nimport { Readable, Writable, derived, get, writable } from 'svelte/store';\n\nexport type { UseCompletionOptions };\n\nexport type UseCompletionHelpers = {\n /** The current completion result */\n completion: Readable<string>;\n /** The error object of the API request */\n error: Readable<undefined | Error>;\n /**\n * Send a new prompt to the API endpoint and update the completion state.\n */\n complete: (\n prompt: string,\n options?: RequestOptions,\n ) => Promise<string | null | undefined>;\n /**\n * Abort the current API request but keep the generated tokens.\n */\n stop: () => void;\n /**\n * Update the `completion` state locally.\n */\n setCompletion: (completion: string) => void;\n /** The current value of the input */\n input: Writable<string>;\n /**\n * Form submission handler to automatically reset input and append a user message\n * @example\n * ```jsx\n * <form onSubmit={handleSubmit}>\n * <input onChange={handleInputChange} value={input} />\n * </form>\n * ```\n */\n handleSubmit: (event?: { preventDefault?: () => void }) => void;\n /** Whether the API request is in progress */\n isLoading: Readable<boolean | undefined>;\n\n /** Additional data added on the server via StreamData */\n data: Readable<JSONValue[] | undefined>;\n};\n\nlet uniqueId = 0;\n\nconst store = writable<Record<string, string>>({});\n\nexport function useCompletion({\n api = '/api/completion',\n id,\n initialCompletion = '',\n initialInput = '',\n credentials,\n headers,\n body,\n streamProtocol = 'data',\n onResponse,\n onFinish,\n onError,\n fetch,\n}: UseCompletionOptions = {}): UseCompletionHelpers {\n // Generate an unique id for the completion if not provided.\n const completionId = id || `completion-${uniqueId++}`;\n\n const key = `${api}|${completionId}`;\n const data = derived([store], ([$store]) => $store[key] ?? initialCompletion);\n\n const streamData = writable<JSONValue[] | undefined>(undefined);\n\n const loading = writable<boolean>(false);\n\n const mutate = (data: string) => {\n store.update(value => {\n value[key] = data;\n return value;\n });\n };\n\n // Because of the `fallbackData` option, the `data` will never be `undefined`.\n const completion = data;\n\n const error = writable<undefined | Error>(undefined);\n\n let abortController: AbortController | null = null;\n\n const complete: UseCompletionHelpers['complete'] = async (\n prompt: string,\n options?: RequestOptions,\n ) => {\n const existingData = get(streamData);\n return callCompletionApi({\n api,\n prompt,\n credentials,\n headers: {\n ...headers,\n ...options?.headers,\n },\n body: {\n ...body,\n ...options?.body,\n },\n streamProtocol,\n setCompletion: mutate,\n setLoading: loadingState => loading.set(loadingState),\n setError: err => error.set(err),\n setAbortController: controller => {\n abortController = controller;\n },\n onResponse,\n onFinish,\n onError,\n onData(data) {\n streamData.set([...(existingData || []), ...(data || [])]);\n },\n fetch,\n });\n };\n\n const stop = () => {\n if (abortController) {\n abortController.abort();\n abortController = null;\n }\n };\n\n const setCompletion = (completion: string) => {\n mutate(completion);\n };\n\n const input = writable(initialInput);\n\n const handleSubmit = (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n\n const inputValue = get(input);\n return inputValue ? complete(inputValue) : undefined;\n };\n\n return {\n completion,\n complete,\n error,\n stop,\n setCompletion,\n input,\n handleSubmit,\n isLoading: loading,\n data: streamData,\n };\n}\n","import { isAbortError } from '@ai-sdk/provider-utils';\nimport type {\n AssistantStatus,\n CreateMessage,\n Message,\n UseAssistantOptions,\n} from '@ai-sdk/ui-utils';\nimport { generateId, processAssistantStream } from '@ai-sdk/ui-utils';\nimport { Readable, Writable, get, writable } from 'svelte/store';\n\n// use function to allow for mocking in tests:\nconst getOriginalFetch = () => fetch;\n\nlet uniqueId = 0;\n\nconst store: Record<string, any> = {};\n\nexport type UseAssistantHelpers = {\n /**\n * The current array of chat messages.\n */\n messages: Readable<Message[]>;\n\n /**\n * Update the message store with a new array of messages.\n */\n setMessages: (messages: Message[]) => void;\n\n /**\n * The current thread ID.\n */\n threadId: Readable<string | undefined>;\n\n /**\n * The current value of the input field.\n */\n input: Writable<string>;\n\n /**\n * Append a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n * @param message The message to append\n * @param requestOptions Additional options to pass to the API call\n */\n append: (\n message: Message | CreateMessage,\n requestOptions?: { data?: Record<string, string> },\n ) => Promise<void>;\n\n /**\nAbort the current request immediately, keep the generated tokens if any.\n */\n stop: () => void;\n\n /**\n * Form submission handler that automatically resets the input field and appends a user message.\n */\n submitMessage: (\n event?: { preventDefault?: () => void },\n requestOptions?: { data?: Record<string, string> },\n ) => Promise<void>;\n\n /**\n * The current status of the assistant. This can be used to show a loading indicator.\n */\n status: Readable<AssistantStatus>;\n\n /**\n * The error thrown during the assistant message processing, if any.\n */\n error: Readable<undefined | Error>;\n};\n\nexport function useAssistant({\n api,\n threadId: threadIdParam,\n credentials,\n headers,\n body,\n onError,\n fetch,\n}: UseAssistantOptions): UseAssistantHelpers {\n // Generate a unique thread ID\n const threadIdStore = writable<string | undefined>(threadIdParam);\n\n // Initialize message, input, status, and error stores\n const key = `${api}|${threadIdParam ?? `completion-${uniqueId++}`}`;\n const messages = writable<Message[]>(store[key] || []);\n const input = writable('');\n const status = writable<AssistantStatus>('awaiting_message');\n const error = writable<undefined | Error>(undefined);\n\n // To manage aborting the current fetch request\n let abortController: AbortController | null = null;\n\n // Update the message store\n const mutateMessages = (newMessages: Message[]) => {\n store[key] = newMessages;\n messages.set(newMessages);\n };\n\n // Function to handle API calls and state management\n async function append(\n message: Message | CreateMessage,\n requestOptions?: { data?: Record<string, string> },\n ) {\n status.set('in_progress');\n abortController = new AbortController(); // Initialize a new AbortController\n\n // Add the new message to the existing array\n mutateMessages([\n ...get(messages),\n { ...message, id: message.id ?? generateId() },\n ]);\n\n input.set('');\n\n try {\n const actualFetch = fetch ?? getOriginalFetch();\n const response = await actualFetch(api, {\n method: 'POST',\n credentials,\n signal: abortController.signal,\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({\n ...body,\n // always use user-provided threadId when available:\n threadId: threadIdParam ?? get(threadIdStore) ?? null,\n message: message.content,\n\n // optional request data:\n data: requestOptions?.data,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the assistant response.',\n );\n }\n\n if (response.body == null) {\n throw new Error('The response body is empty.');\n }\n\n await processAssistantStream({\n stream: response.body,\n onAssistantMessagePart(value) {\n mutateMessages([\n ...get(messages),\n {\n id: value.id,\n role: value.role,\n content: value.content[0].text.value,\n parts: [],\n },\n ]);\n },\n onTextPart(value) {\n // text delta - add to last message:\n mutateMessages(\n get(messages).map((msg, index, array) => {\n if (index === array.length - 1) {\n return { ...msg, content: msg.content + value };\n }\n return msg;\n }),\n );\n },\n onAssistantControlDataPart(value) {\n threadIdStore.set(value.threadId);\n\n mutateMessages(\n get(messages).map((msg, index, array) => {\n if (index === array.length - 1) {\n return { ...msg, id: value.messageId };\n }\n return msg;\n }),\n );\n },\n onDataMessagePart(value) {\n mutateMessages([\n ...get(messages),\n {\n id: value.id ?? generateId(),\n role: 'data',\n content: '',\n data: value.data,\n parts: [],\n },\n ]);\n },\n onErrorPart(value) {\n error.set(new Error(value));\n },\n });\n } catch (err) {\n // Ignore abort errors as they are expected when the user cancels the request:\n if (isAbortError(error) && abortController?.signal?.aborted) {\n abortController = null;\n return;\n }\n\n if (onError && err instanceof Error) {\n onError(err);\n }\n\n error.set(err as Error);\n } finally {\n abortController = null;\n status.set('awaiting_message');\n }\n }\n\n function setMessages(messages: Message[]) {\n mutateMessages(messages);\n }\n\n function stop() {\n if (abortController) {\n abortController.abort();\n abortController = null;\n }\n }\n\n // Function to handle form submission\n async function submitMessage(\n event?: { preventDefault?: () => void },\n requestOptions?: { data?: Record<string, string> },\n ) {\n event?.preventDefault?.();\n const inputValue = get(input);\n if (!inputValue) return;\n\n await append(\n { role: 'user', content: inputValue, parts: [] },\n requestOptions,\n );\n }\n\n return {\n messages,\n error,\n threadId: threadIdStore,\n input,\n append,\n submitMessage,\n status,\n setMessages,\n stop,\n };\n}\n"],"mappings":"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","names":["generateId","fetch","headers","body","derived","get","writable","store","fetch","data","completion","get","writable","uniqueId","store","fetch","_a","messages"]}