@ai-sdk/svelte 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,544 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ useAssistant: () => useAssistant,
24
+ useChat: () => useChat,
25
+ useCompletion: () => useCompletion
26
+ });
27
+ module.exports = __toCommonJS(src_exports);
28
+
29
+ // src/use-chat.ts
30
+ var import_ui_utils = require("@ai-sdk/ui-utils");
31
+ var import_sswr = require("sswr");
32
+ var import_store = require("svelte/store");
33
+ var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, existingData, extraMetadata, previousMessages, abortControllerRef, generateId2, streamMode, onFinish, onResponse, sendExtraMessageFields) => {
34
+ var _a, _b;
35
+ mutate(chatRequest.messages);
36
+ const constructedMessagesPayload = sendExtraMessageFields ? chatRequest.messages : chatRequest.messages.map(
37
+ ({
38
+ role,
39
+ content,
40
+ name,
41
+ data,
42
+ annotations,
43
+ function_call,
44
+ tool_calls,
45
+ tool_call_id
46
+ }) => ({
47
+ role,
48
+ content,
49
+ ...name !== void 0 && { name },
50
+ ...data !== void 0 && { data },
51
+ ...annotations !== void 0 && { annotations },
52
+ // outdated function/tool call handling (TODO deprecate):
53
+ tool_call_id,
54
+ ...function_call !== void 0 && { function_call },
55
+ ...tool_calls !== void 0 && { tool_calls }
56
+ })
57
+ );
58
+ return await (0, import_ui_utils.callChatApi)({
59
+ api,
60
+ messages: constructedMessagesPayload,
61
+ body: {
62
+ ...extraMetadata.body,
63
+ ...(_a = chatRequest.options) == null ? void 0 : _a.body,
64
+ ...chatRequest.functions !== void 0 && {
65
+ functions: chatRequest.functions
66
+ },
67
+ ...chatRequest.function_call !== void 0 && {
68
+ function_call: chatRequest.function_call
69
+ },
70
+ ...chatRequest.tools !== void 0 && {
71
+ tools: chatRequest.tools
72
+ },
73
+ ...chatRequest.tool_choice !== void 0 && {
74
+ tool_choice: chatRequest.tool_choice
75
+ }
76
+ },
77
+ streamMode,
78
+ credentials: extraMetadata.credentials,
79
+ headers: {
80
+ ...extraMetadata.headers,
81
+ ...(_b = chatRequest.options) == null ? void 0 : _b.headers
82
+ },
83
+ abortController: () => abortControllerRef,
84
+ restoreMessagesOnFailure() {
85
+ mutate(previousMessages);
86
+ },
87
+ onResponse,
88
+ onUpdate(merged, data) {
89
+ mutate([...chatRequest.messages, ...merged]);
90
+ mutateStreamData([...existingData || [], ...data || []]);
91
+ },
92
+ onFinish,
93
+ generateId: generateId2
94
+ });
95
+ };
96
+ var uniqueId = 0;
97
+ var store = {};
98
+ function useChat({
99
+ api = "/api/chat",
100
+ id,
101
+ initialMessages = [],
102
+ initialInput = "",
103
+ sendExtraMessageFields,
104
+ experimental_onFunctionCall,
105
+ experimental_onToolCall,
106
+ streamMode,
107
+ onResponse,
108
+ onFinish,
109
+ onError,
110
+ credentials,
111
+ headers,
112
+ body,
113
+ generateId: generateId2 = import_ui_utils.generateId
114
+ } = {}) {
115
+ const chatId = id || `chat-${uniqueId++}`;
116
+ const key = `${api}|${chatId}`;
117
+ const {
118
+ data,
119
+ mutate: originalMutate,
120
+ isLoading: isSWRLoading
121
+ } = (0, import_sswr.useSWR)(key, {
122
+ fetcher: () => store[key] || initialMessages,
123
+ fallbackData: initialMessages
124
+ });
125
+ const streamData = (0, import_store.writable)(void 0);
126
+ const loading = (0, import_store.writable)(false);
127
+ data.set(initialMessages);
128
+ const mutate = (data2) => {
129
+ store[key] = data2;
130
+ return originalMutate(data2);
131
+ };
132
+ const messages = data;
133
+ let abortController = null;
134
+ const extraMetadata = {
135
+ credentials,
136
+ headers,
137
+ body
138
+ };
139
+ const error = (0, import_store.writable)(void 0);
140
+ async function triggerRequest(chatRequest) {
141
+ try {
142
+ error.set(void 0);
143
+ loading.set(true);
144
+ abortController = new AbortController();
145
+ await (0, import_ui_utils.processChatStream)({
146
+ getStreamedResponse: () => getStreamedResponse(
147
+ api,
148
+ chatRequest,
149
+ mutate,
150
+ (data2) => {
151
+ streamData.set(data2);
152
+ },
153
+ (0, import_store.get)(streamData),
154
+ extraMetadata,
155
+ (0, import_store.get)(messages),
156
+ abortController,
157
+ generateId2,
158
+ streamMode,
159
+ onFinish,
160
+ onResponse,
161
+ sendExtraMessageFields
162
+ ),
163
+ experimental_onFunctionCall,
164
+ experimental_onToolCall,
165
+ updateChatRequest: (chatRequestParam) => {
166
+ chatRequest = chatRequestParam;
167
+ },
168
+ getCurrentMessages: () => (0, import_store.get)(messages)
169
+ });
170
+ abortController = null;
171
+ return null;
172
+ } catch (err) {
173
+ if (err.name === "AbortError") {
174
+ abortController = null;
175
+ return null;
176
+ }
177
+ if (onError && err instanceof Error) {
178
+ onError(err);
179
+ }
180
+ error.set(err);
181
+ } finally {
182
+ loading.set(false);
183
+ }
184
+ }
185
+ const append = async (message, {
186
+ options,
187
+ functions,
188
+ function_call,
189
+ tools,
190
+ tool_choice,
191
+ data: data2
192
+ } = {}) => {
193
+ if (!message.id) {
194
+ message.id = generateId2();
195
+ }
196
+ const chatRequest = {
197
+ messages: (0, import_store.get)(messages).concat(message),
198
+ options,
199
+ data: data2,
200
+ ...functions !== void 0 && { functions },
201
+ ...function_call !== void 0 && { function_call },
202
+ ...tools !== void 0 && { tools },
203
+ ...tool_choice !== void 0 && { tool_choice }
204
+ };
205
+ return triggerRequest(chatRequest);
206
+ };
207
+ const reload = async ({
208
+ options,
209
+ functions,
210
+ function_call,
211
+ tools,
212
+ tool_choice
213
+ } = {}) => {
214
+ const messagesSnapshot = (0, import_store.get)(messages);
215
+ if (messagesSnapshot.length === 0)
216
+ return null;
217
+ const lastMessage = messagesSnapshot.at(-1);
218
+ if ((lastMessage == null ? void 0 : lastMessage.role) === "assistant") {
219
+ const chatRequest2 = {
220
+ messages: messagesSnapshot.slice(0, -1),
221
+ options,
222
+ ...functions !== void 0 && { functions },
223
+ ...function_call !== void 0 && { function_call },
224
+ ...tools !== void 0 && { tools },
225
+ ...tool_choice !== void 0 && { tool_choice }
226
+ };
227
+ return triggerRequest(chatRequest2);
228
+ }
229
+ const chatRequest = {
230
+ messages: messagesSnapshot,
231
+ options,
232
+ ...functions !== void 0 && { functions },
233
+ ...function_call !== void 0 && { function_call },
234
+ ...tools !== void 0 && { tools },
235
+ ...tool_choice !== void 0 && { tool_choice }
236
+ };
237
+ return triggerRequest(chatRequest);
238
+ };
239
+ const stop = () => {
240
+ if (abortController) {
241
+ abortController.abort();
242
+ abortController = null;
243
+ }
244
+ };
245
+ const setMessages = (messages2) => {
246
+ mutate(messages2);
247
+ };
248
+ const input = (0, import_store.writable)(initialInput);
249
+ const handleSubmit = (e, options = {}) => {
250
+ e.preventDefault();
251
+ const inputValue = (0, import_store.get)(input);
252
+ if (!inputValue)
253
+ return;
254
+ append(
255
+ {
256
+ content: inputValue,
257
+ role: "user",
258
+ createdAt: /* @__PURE__ */ new Date()
259
+ },
260
+ options
261
+ );
262
+ input.set("");
263
+ };
264
+ const isLoading = (0, import_store.derived)(
265
+ [isSWRLoading, loading],
266
+ ([$isSWRLoading, $loading]) => {
267
+ return $isSWRLoading || $loading;
268
+ }
269
+ );
270
+ return {
271
+ messages,
272
+ error,
273
+ append,
274
+ reload,
275
+ stop,
276
+ setMessages,
277
+ input,
278
+ handleSubmit,
279
+ isLoading,
280
+ data: streamData
281
+ };
282
+ }
283
+
284
+ // src/use-completion.ts
285
+ var import_ui_utils2 = require("@ai-sdk/ui-utils");
286
+ var import_sswr2 = require("sswr");
287
+ var import_store2 = require("svelte/store");
288
+ var uniqueId2 = 0;
289
+ var store2 = {};
290
+ function useCompletion({
291
+ api = "/api/completion",
292
+ id,
293
+ initialCompletion = "",
294
+ initialInput = "",
295
+ credentials,
296
+ headers,
297
+ body,
298
+ streamMode,
299
+ onResponse,
300
+ onFinish,
301
+ onError
302
+ } = {}) {
303
+ const completionId = id || `completion-${uniqueId2++}`;
304
+ const key = `${api}|${completionId}`;
305
+ const {
306
+ data,
307
+ mutate: originalMutate,
308
+ isLoading: isSWRLoading
309
+ } = (0, import_sswr2.useSWR)(key, {
310
+ fetcher: () => store2[key] || initialCompletion,
311
+ fallbackData: initialCompletion
312
+ });
313
+ const streamData = (0, import_store2.writable)(void 0);
314
+ const loading = (0, import_store2.writable)(false);
315
+ data.set(initialCompletion);
316
+ const mutate = (data2) => {
317
+ store2[key] = data2;
318
+ return originalMutate(data2);
319
+ };
320
+ const completion = data;
321
+ const error = (0, import_store2.writable)(void 0);
322
+ let abortController = null;
323
+ const complete = async (prompt, options) => {
324
+ const existingData = (0, import_store2.get)(streamData);
325
+ return (0, import_ui_utils2.callCompletionApi)({
326
+ api,
327
+ prompt,
328
+ credentials,
329
+ headers: {
330
+ ...headers,
331
+ ...options == null ? void 0 : options.headers
332
+ },
333
+ body: {
334
+ ...body,
335
+ ...options == null ? void 0 : options.body
336
+ },
337
+ streamMode,
338
+ setCompletion: mutate,
339
+ setLoading: (loadingState) => loading.set(loadingState),
340
+ setError: (err) => error.set(err),
341
+ setAbortController: (controller) => {
342
+ abortController = controller;
343
+ },
344
+ onResponse,
345
+ onFinish,
346
+ onError,
347
+ onData(data2) {
348
+ streamData.set([...existingData || [], ...data2 || []]);
349
+ }
350
+ });
351
+ };
352
+ const stop = () => {
353
+ if (abortController) {
354
+ abortController.abort();
355
+ abortController = null;
356
+ }
357
+ };
358
+ const setCompletion = (completion2) => {
359
+ mutate(completion2);
360
+ };
361
+ const input = (0, import_store2.writable)(initialInput);
362
+ const handleSubmit = (e) => {
363
+ e.preventDefault();
364
+ const inputValue = (0, import_store2.get)(input);
365
+ if (!inputValue)
366
+ return;
367
+ return complete(inputValue);
368
+ };
369
+ const isLoading = (0, import_store2.derived)(
370
+ [isSWRLoading, loading],
371
+ ([$isSWRLoading, $loading]) => {
372
+ return $isSWRLoading || $loading;
373
+ }
374
+ );
375
+ return {
376
+ completion,
377
+ complete,
378
+ error,
379
+ stop,
380
+ setCompletion,
381
+ input,
382
+ handleSubmit,
383
+ isLoading,
384
+ data: streamData
385
+ };
386
+ }
387
+
388
+ // src/use-assistant.ts
389
+ var import_provider_utils = require("@ai-sdk/provider-utils");
390
+ var import_ui_utils3 = require("@ai-sdk/ui-utils");
391
+ var import_store3 = require("svelte/store");
392
+ var uniqueId3 = 0;
393
+ var store3 = {};
394
+ function useAssistant({
395
+ api,
396
+ threadId: threadIdParam,
397
+ credentials,
398
+ headers,
399
+ body,
400
+ onError
401
+ }) {
402
+ const threadIdStore = (0, import_store3.writable)(threadIdParam);
403
+ const key = `${api}|${threadIdParam != null ? threadIdParam : `completion-${uniqueId3++}`}`;
404
+ const messages = (0, import_store3.writable)(store3[key] || []);
405
+ const input = (0, import_store3.writable)("");
406
+ const status = (0, import_store3.writable)("awaiting_message");
407
+ const error = (0, import_store3.writable)(void 0);
408
+ let abortController = null;
409
+ const mutateMessages = (newMessages) => {
410
+ store3[key] = newMessages;
411
+ messages.set(newMessages);
412
+ };
413
+ async function append(message, requestOptions) {
414
+ var _a, _b, _c, _d;
415
+ status.set("in_progress");
416
+ abortController = new AbortController();
417
+ mutateMessages([
418
+ ...(0, import_store3.get)(messages),
419
+ { ...message, id: (_a = message.id) != null ? _a : (0, import_ui_utils3.generateId)() }
420
+ ]);
421
+ input.set("");
422
+ try {
423
+ const result = await fetch(api, {
424
+ method: "POST",
425
+ credentials,
426
+ signal: abortController.signal,
427
+ headers: { "Content-Type": "application/json", ...headers },
428
+ body: JSON.stringify({
429
+ ...body,
430
+ // always use user-provided threadId when available:
431
+ threadId: (_b = threadIdParam != null ? threadIdParam : (0, import_store3.get)(threadIdStore)) != null ? _b : null,
432
+ message: message.content,
433
+ // optional request data:
434
+ data: requestOptions == null ? void 0 : requestOptions.data
435
+ })
436
+ });
437
+ if (result.body == null) {
438
+ throw new Error("The response body is empty.");
439
+ }
440
+ for await (const { type, value } of (0, import_ui_utils3.readDataStream)(
441
+ result.body.getReader()
442
+ )) {
443
+ switch (type) {
444
+ case "assistant_message": {
445
+ mutateMessages([
446
+ ...(0, import_store3.get)(messages),
447
+ {
448
+ id: value.id,
449
+ role: value.role,
450
+ content: value.content[0].text.value
451
+ }
452
+ ]);
453
+ break;
454
+ }
455
+ case "text": {
456
+ mutateMessages(
457
+ (0, import_store3.get)(messages).map((msg, index, array) => {
458
+ if (index === array.length - 1) {
459
+ return { ...msg, content: msg.content + value };
460
+ }
461
+ return msg;
462
+ })
463
+ );
464
+ break;
465
+ }
466
+ case "data_message": {
467
+ mutateMessages([
468
+ ...(0, import_store3.get)(messages),
469
+ {
470
+ id: (_c = value.id) != null ? _c : (0, import_ui_utils3.generateId)(),
471
+ role: "data",
472
+ content: "",
473
+ data: value.data
474
+ }
475
+ ]);
476
+ break;
477
+ }
478
+ case "assistant_control_data": {
479
+ threadIdStore.set(value.threadId);
480
+ mutateMessages(
481
+ (0, import_store3.get)(messages).map((msg, index, array) => {
482
+ if (index === array.length - 1) {
483
+ return { ...msg, id: value.messageId };
484
+ }
485
+ return msg;
486
+ })
487
+ );
488
+ break;
489
+ }
490
+ case "error": {
491
+ error.set(new Error(value));
492
+ break;
493
+ }
494
+ }
495
+ }
496
+ } catch (err) {
497
+ if ((0, import_provider_utils.isAbortError)(error) && ((_d = abortController == null ? void 0 : abortController.signal) == null ? void 0 : _d.aborted)) {
498
+ abortController = null;
499
+ return;
500
+ }
501
+ if (onError && err instanceof Error) {
502
+ onError(err);
503
+ }
504
+ error.set(err);
505
+ } finally {
506
+ abortController = null;
507
+ status.set("awaiting_message");
508
+ }
509
+ }
510
+ function setMessages(messages2) {
511
+ mutateMessages(messages2);
512
+ }
513
+ function stop() {
514
+ if (abortController) {
515
+ abortController.abort();
516
+ abortController = null;
517
+ }
518
+ }
519
+ async function submitMessage(e, requestOptions) {
520
+ e.preventDefault();
521
+ const inputValue = (0, import_store3.get)(input);
522
+ if (!inputValue)
523
+ return;
524
+ await append({ role: "user", content: inputValue }, requestOptions);
525
+ }
526
+ return {
527
+ messages,
528
+ error,
529
+ threadId: threadIdStore,
530
+ input,
531
+ append,
532
+ submitMessage,
533
+ status,
534
+ setMessages,
535
+ stop
536
+ };
537
+ }
538
+ // Annotate the CommonJS export names for ESM import in node:
539
+ 0 && (module.exports = {
540
+ useAssistant,
541
+ useChat,
542
+ useCompletion
543
+ });
544
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/use-chat.ts","../src/use-completion.ts","../src/use-assistant.ts"],"sourcesContent":["export * from './use-chat';\nexport * from './use-completion';\nexport * from './use-assistant';\n","import type {\n ChatRequest,\n ChatRequestOptions,\n CreateMessage,\n IdGenerator,\n JSONValue,\n Message,\n UseChatOptions,\n} from '@ai-sdk/ui-utils';\nimport {\n callChatApi,\n generateId as generateIdFunc,\n processChatStream,\n} from '@ai-sdk/ui-utils';\nimport { useSWR } from 'sswr';\nimport { Readable, Writable, derived, get, writable } from 'svelte/store';\nexport type { CreateMessage, Message, UseChatOptions };\n\nexport type UseChatHelpers = {\n /** Current messages in the chat */\n messages: Readable<Message[]>;\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: (messages: Message[]) => void;\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: (e: any, chatRequestOptions?: ChatRequestOptions) => void;\n metadata?: Object;\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};\nconst getStreamedResponse = async (\n api: string,\n chatRequest: ChatRequest,\n mutate: (messages: Message[]) => void,\n mutateStreamData: (data: JSONValue[] | undefined) => void,\n existingData: JSONValue[] | undefined,\n extraMetadata: {\n credentials?: RequestCredentials;\n headers?: Record<string, string> | Headers;\n body?: any;\n },\n previousMessages: Message[],\n abortControllerRef: AbortController | null,\n generateId: IdGenerator,\n streamMode?: 'stream-data' | 'text',\n onFinish?: (message: Message) => void,\n onResponse?: (response: Response) => void | Promise<void>,\n sendExtraMessageFields?: boolean,\n) => {\n // Do an optimistic update to the chat state to show the updated messages\n // immediately.\n mutate(chatRequest.messages);\n\n const constructedMessagesPayload = sendExtraMessageFields\n ? chatRequest.messages\n : chatRequest.messages.map(\n ({\n role,\n content,\n name,\n data,\n annotations,\n function_call,\n tool_calls,\n tool_call_id,\n }) => ({\n role,\n content,\n ...(name !== undefined && { name }),\n ...(data !== undefined && { data }),\n ...(annotations !== undefined && { annotations }),\n // outdated function/tool call handling (TODO deprecate):\n tool_call_id,\n ...(function_call !== undefined && { function_call }),\n ...(tool_calls !== undefined && { tool_calls }),\n }),\n );\n\n return await callChatApi({\n api,\n messages: constructedMessagesPayload,\n body: {\n ...extraMetadata.body,\n ...chatRequest.options?.body,\n ...(chatRequest.functions !== undefined && {\n functions: chatRequest.functions,\n }),\n ...(chatRequest.function_call !== undefined && {\n function_call: chatRequest.function_call,\n }),\n ...(chatRequest.tools !== undefined && {\n tools: chatRequest.tools,\n }),\n ...(chatRequest.tool_choice !== undefined && {\n tool_choice: chatRequest.tool_choice,\n }),\n },\n streamMode,\n credentials: extraMetadata.credentials,\n headers: {\n ...extraMetadata.headers,\n ...chatRequest.options?.headers,\n },\n abortController: () => abortControllerRef,\n restoreMessagesOnFailure() {\n mutate(previousMessages);\n },\n onResponse,\n onUpdate(merged, data) {\n mutate([...chatRequest.messages, ...merged]);\n mutateStreamData([...(existingData || []), ...(data || [])]);\n },\n onFinish,\n generateId,\n });\n};\n\nlet uniqueId = 0;\n\nconst store: Record<string, Message[] | undefined> = {};\n\nexport function useChat({\n api = '/api/chat',\n id,\n initialMessages = [],\n initialInput = '',\n sendExtraMessageFields,\n experimental_onFunctionCall,\n experimental_onToolCall,\n streamMode,\n onResponse,\n onFinish,\n onError,\n credentials,\n headers,\n body,\n generateId = generateIdFunc,\n}: UseChatOptions = {}): UseChatHelpers {\n // Generate a unique id for the chat if not provided.\n const chatId = id || `chat-${uniqueId++}`;\n\n const key = `${api}|${chatId}`;\n const {\n data,\n mutate: originalMutate,\n isLoading: isSWRLoading,\n } = useSWR<Message[]>(key, {\n fetcher: () => store[key] || initialMessages,\n fallbackData: initialMessages,\n });\n\n const streamData = writable<JSONValue[] | undefined>(undefined);\n\n const loading = writable<boolean>(false);\n\n // Force the `data` to be `initialMessages` if it's `undefined`.\n data.set(initialMessages);\n\n const mutate = (data: Message[]) => {\n store[key] = data;\n return originalMutate(data);\n };\n\n // Because of the `fallbackData` option, the `data` will never be `undefined`.\n const messages = data as Writable<Message[]>;\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 try {\n error.set(undefined);\n loading.set(true);\n abortController = new AbortController();\n\n await processChatStream({\n getStreamedResponse: () =>\n getStreamedResponse(\n api,\n chatRequest,\n mutate,\n data => {\n streamData.set(data);\n },\n get(streamData),\n extraMetadata,\n get(messages),\n abortController,\n generateId,\n streamMode,\n onFinish,\n onResponse,\n sendExtraMessageFields,\n ),\n experimental_onFunctionCall,\n experimental_onToolCall,\n updateChatRequest: chatRequestParam => {\n chatRequest = chatRequestParam;\n },\n getCurrentMessages: () => get(messages),\n });\n\n abortController = null;\n\n return null;\n } catch (err) {\n // Ignore abort errors as they are expected.\n if ((err as any).name === 'AbortError') {\n abortController = null;\n return null;\n }\n\n if (onError && err instanceof Error) {\n onError(err);\n }\n\n error.set(err as Error);\n } finally {\n loading.set(false);\n }\n }\n\n const append: UseChatHelpers['append'] = async (\n message: Message | CreateMessage,\n {\n options,\n functions,\n function_call,\n tools,\n tool_choice,\n data,\n }: ChatRequestOptions = {},\n ) => {\n if (!message.id) {\n message.id = generateId();\n }\n\n const chatRequest: ChatRequest = {\n messages: get(messages).concat(message as Message),\n options,\n data,\n ...(functions !== undefined && { functions }),\n ...(function_call !== undefined && { function_call }),\n ...(tools !== undefined && { tools }),\n ...(tool_choice !== undefined && { tool_choice }),\n };\n return triggerRequest(chatRequest);\n };\n\n const reload: UseChatHelpers['reload'] = async ({\n options,\n functions,\n function_call,\n tools,\n tool_choice,\n }: ChatRequestOptions = {}) => {\n const messagesSnapshot = get(messages);\n if (messagesSnapshot.length === 0) return null;\n\n // Remove last assistant message and retry last user message.\n const lastMessage = messagesSnapshot.at(-1);\n if (lastMessage?.role === 'assistant') {\n const chatRequest: ChatRequest = {\n messages: messagesSnapshot.slice(0, -1),\n options,\n ...(functions !== undefined && { functions }),\n ...(function_call !== undefined && { function_call }),\n ...(tools !== undefined && { tools }),\n ...(tool_choice !== undefined && { tool_choice }),\n };\n\n return triggerRequest(chatRequest);\n }\n const chatRequest: ChatRequest = {\n messages: messagesSnapshot,\n options,\n ...(functions !== undefined && { functions }),\n ...(function_call !== undefined && { function_call }),\n ...(tools !== undefined && { tools }),\n ...(tool_choice !== undefined && { tool_choice }),\n };\n\n return triggerRequest(chatRequest);\n };\n\n const stop = () => {\n if (abortController) {\n abortController.abort();\n abortController = null;\n }\n };\n\n const setMessages = (messages: Message[]) => {\n mutate(messages);\n };\n\n const input = writable(initialInput);\n\n const handleSubmit = (e: any, options: ChatRequestOptions = {}) => {\n e.preventDefault();\n const inputValue = get(input);\n if (!inputValue) return;\n\n append(\n {\n content: inputValue,\n role: 'user',\n createdAt: new Date(),\n },\n options,\n );\n input.set('');\n };\n\n const isLoading = derived(\n [isSWRLoading, loading],\n ([$isSWRLoading, $loading]) => {\n return $isSWRLoading || $loading;\n },\n );\n\n return {\n messages,\n error,\n append,\n reload,\n stop,\n setMessages,\n input,\n handleSubmit,\n isLoading,\n data: streamData,\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 { useSWR } from 'sswr';\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: (e: any) => 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: Record<string, any> = {};\n\nexport function useCompletion({\n api = '/api/completion',\n id,\n initialCompletion = '',\n initialInput = '',\n credentials,\n headers,\n body,\n streamMode,\n onResponse,\n onFinish,\n onError,\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 {\n data,\n mutate: originalMutate,\n isLoading: isSWRLoading,\n } = useSWR<string>(key, {\n fetcher: () => store[key] || initialCompletion,\n fallbackData: initialCompletion,\n });\n\n const streamData = writable<JSONValue[] | undefined>(undefined);\n\n const loading = writable<boolean>(false);\n\n // Force the `data` to be `initialCompletion` if it's `undefined`.\n data.set(initialCompletion);\n\n const mutate = (data: string) => {\n store[key] = data;\n return originalMutate(data);\n };\n\n // Because of the `fallbackData` option, the `data` will never be `undefined`.\n const completion = data as Writable<string>;\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 streamMode,\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 });\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 = (e: any) => {\n e.preventDefault();\n const inputValue = get(input);\n if (!inputValue) return;\n return complete(inputValue);\n };\n\n const isLoading = derived(\n [isSWRLoading, loading],\n ([$isSWRLoading, $loading]) => {\n return $isSWRLoading || $loading;\n },\n );\n\n return {\n completion,\n complete,\n error,\n stop,\n setCompletion,\n input,\n handleSubmit,\n isLoading,\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, readDataStream } from '@ai-sdk/ui-utils';\nimport { Readable, Writable, get, writable } from 'svelte/store';\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 e: any,\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}: 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 result = await fetch(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 (result.body == null) {\n throw new Error('The response body is empty.');\n }\n\n // Read the streamed response data\n for await (const { type, value } of readDataStream(\n result.body.getReader(),\n )) {\n switch (type) {\n case 'assistant_message': {\n mutateMessages([\n ...get(messages),\n {\n id: value.id,\n role: value.role,\n content: value.content[0].text.value,\n },\n ]);\n break;\n }\n\n case 'text': {\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 break;\n }\n\n case 'data_message': {\n mutateMessages([\n ...get(messages),\n {\n id: value.id ?? generateId(),\n role: 'data',\n content: '',\n data: value.data,\n },\n ]);\n break;\n }\n\n case 'assistant_control_data': {\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 break;\n }\n\n case 'error': {\n error.set(new Error(value));\n break;\n }\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 e: any,\n requestOptions?: { data?: Record<string, string> },\n ) {\n e.preventDefault();\n const inputValue = get(input);\n if (!inputValue) return;\n\n await append({ role: 'user', content: inputValue }, requestOptions);\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","generateIdFunc","data","chatRequest","messages","import_ui_utils","import_sswr","import_store","uniqueId","store","data","completion","import_ui_utils","import_store","uniqueId","store","messages"]}