@ai-sdk/svelte 0.0.9 → 0.0.11
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/.turbo/turbo-build.log +10 -10
- package/.turbo/turbo-clean.log +1 -1
- package/CHANGELOG.md +17 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/use-assistant.ts +6 -1
- package/src/use-chat.ts +10 -5
- package/src/use-completion.ts +2 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @ai-sdk/svelte@0.0.
|
|
2
|
+
> @ai-sdk/svelte@0.0.11 build /home/runner/work/ai/ai/packages/svelte
|
|
3
3
|
> tsup
|
|
4
4
|
|
|
5
5
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
[34mCLI[39m Target: es2018
|
|
10
10
|
[34mCJS[39m Build start
|
|
11
11
|
[34mESM[39m Build start
|
|
12
|
-
[32mCJS[39m [1mdist/index.js [22m[32m15.
|
|
13
|
-
[32mCJS[39m [1mdist/index.js.map [22m[32m31.
|
|
14
|
-
[32mCJS[39m ⚡️ Build success in
|
|
15
|
-
[32mESM[39m [1mdist/index.mjs [22m[
|
|
16
|
-
[32mESM[39m [1mdist/index.mjs.map [22m[
|
|
17
|
-
[32mESM[39m ⚡️ Build success in
|
|
12
|
+
[32mCJS[39m [1mdist/index.js [22m[32m15.71 KB[39m
|
|
13
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m31.63 KB[39m
|
|
14
|
+
[32mCJS[39m ⚡️ Build success in 52ms
|
|
15
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m14.05 KB[39m
|
|
16
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m31.49 KB[39m
|
|
17
|
+
[32mESM[39m ⚡️ Build success in 55ms
|
|
18
18
|
[34mDTS[39m Build start
|
|
19
|
-
[32mDTS[39m ⚡️ Build success in
|
|
20
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[32m5.
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[32m5.
|
|
19
|
+
[32mDTS[39m ⚡️ Build success in 4577ms
|
|
20
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m5.38 KB[39m
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m5.38 KB[39m
|
package/.turbo/turbo-clean.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @ai-sdk/svelte
|
|
2
2
|
|
|
3
|
+
## 0.0.11
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- d3100b9c: feat (ai/ui): support custom fetch function in useChat, useCompletion, useAssistant, useObject
|
|
8
|
+
- Updated dependencies [d3100b9c]
|
|
9
|
+
- @ai-sdk/ui-utils@0.0.8
|
|
10
|
+
|
|
11
|
+
## 0.0.10
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [5edc6110]
|
|
16
|
+
- Updated dependencies [5edc6110]
|
|
17
|
+
- @ai-sdk/provider-utils@1.0.0
|
|
18
|
+
- @ai-sdk/ui-utils@0.0.7
|
|
19
|
+
|
|
3
20
|
## 0.0.9
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -42,7 +42,7 @@ type UseChatHelpers = {
|
|
|
42
42
|
/** Additional data added on the server via StreamData */
|
|
43
43
|
data: Readable<JSONValue[] | undefined>;
|
|
44
44
|
};
|
|
45
|
-
declare function useChat({ api, id, initialMessages, initialInput, sendExtraMessageFields, experimental_onFunctionCall, experimental_onToolCall, streamMode, onResponse, onFinish, onError, credentials, headers, body, generateId, }?: UseChatOptions): UseChatHelpers;
|
|
45
|
+
declare function useChat({ api, id, initialMessages, initialInput, sendExtraMessageFields, experimental_onFunctionCall, experimental_onToolCall, streamMode, onResponse, onFinish, onError, credentials, headers, body, generateId, fetch, }?: UseChatOptions): UseChatHelpers;
|
|
46
46
|
|
|
47
47
|
type UseCompletionHelpers = {
|
|
48
48
|
/** The current completion result */
|
|
@@ -80,7 +80,7 @@ type UseCompletionHelpers = {
|
|
|
80
80
|
/** Additional data added on the server via StreamData */
|
|
81
81
|
data: Readable<JSONValue[] | undefined>;
|
|
82
82
|
};
|
|
83
|
-
declare function useCompletion({ api, id, initialCompletion, initialInput, credentials, headers, body, streamMode, onResponse, onFinish, onError, }?: UseCompletionOptions): UseCompletionHelpers;
|
|
83
|
+
declare function useCompletion({ api, id, initialCompletion, initialInput, credentials, headers, body, streamMode, onResponse, onFinish, onError, fetch, }?: UseCompletionOptions): UseCompletionHelpers;
|
|
84
84
|
|
|
85
85
|
type UseAssistantHelpers = {
|
|
86
86
|
/**
|
|
@@ -129,6 +129,6 @@ type UseAssistantHelpers = {
|
|
|
129
129
|
*/
|
|
130
130
|
error: Readable<undefined | Error>;
|
|
131
131
|
};
|
|
132
|
-
declare function useAssistant({ api, threadId: threadIdParam, credentials, headers, body, onError, }: UseAssistantOptions): UseAssistantHelpers;
|
|
132
|
+
declare function useAssistant({ api, threadId: threadIdParam, credentials, headers, body, onError, fetch, }: UseAssistantOptions): UseAssistantHelpers;
|
|
133
133
|
|
|
134
134
|
export { UseAssistantHelpers, UseChatHelpers, UseCompletionHelpers, useAssistant, useChat, useCompletion };
|
package/dist/index.d.ts
CHANGED
|
@@ -42,7 +42,7 @@ type UseChatHelpers = {
|
|
|
42
42
|
/** Additional data added on the server via StreamData */
|
|
43
43
|
data: Readable<JSONValue[] | undefined>;
|
|
44
44
|
};
|
|
45
|
-
declare function useChat({ api, id, initialMessages, initialInput, sendExtraMessageFields, experimental_onFunctionCall, experimental_onToolCall, streamMode, onResponse, onFinish, onError, credentials, headers, body, generateId, }?: UseChatOptions): UseChatHelpers;
|
|
45
|
+
declare function useChat({ api, id, initialMessages, initialInput, sendExtraMessageFields, experimental_onFunctionCall, experimental_onToolCall, streamMode, onResponse, onFinish, onError, credentials, headers, body, generateId, fetch, }?: UseChatOptions): UseChatHelpers;
|
|
46
46
|
|
|
47
47
|
type UseCompletionHelpers = {
|
|
48
48
|
/** The current completion result */
|
|
@@ -80,7 +80,7 @@ type UseCompletionHelpers = {
|
|
|
80
80
|
/** Additional data added on the server via StreamData */
|
|
81
81
|
data: Readable<JSONValue[] | undefined>;
|
|
82
82
|
};
|
|
83
|
-
declare function useCompletion({ api, id, initialCompletion, initialInput, credentials, headers, body, streamMode, onResponse, onFinish, onError, }?: UseCompletionOptions): UseCompletionHelpers;
|
|
83
|
+
declare function useCompletion({ api, id, initialCompletion, initialInput, credentials, headers, body, streamMode, onResponse, onFinish, onError, fetch, }?: UseCompletionOptions): UseCompletionHelpers;
|
|
84
84
|
|
|
85
85
|
type UseAssistantHelpers = {
|
|
86
86
|
/**
|
|
@@ -129,6 +129,6 @@ type UseAssistantHelpers = {
|
|
|
129
129
|
*/
|
|
130
130
|
error: Readable<undefined | Error>;
|
|
131
131
|
};
|
|
132
|
-
declare function useAssistant({ api, threadId: threadIdParam, credentials, headers, body, onError, }: UseAssistantOptions): UseAssistantHelpers;
|
|
132
|
+
declare function useAssistant({ api, threadId: threadIdParam, credentials, headers, body, onError, fetch, }: UseAssistantOptions): UseAssistantHelpers;
|
|
133
133
|
|
|
134
134
|
export { UseAssistantHelpers, UseChatHelpers, UseCompletionHelpers, useAssistant, useChat, useCompletion };
|
package/dist/index.js
CHANGED
|
@@ -30,7 +30,7 @@ module.exports = __toCommonJS(src_exports);
|
|
|
30
30
|
var import_ui_utils = require("@ai-sdk/ui-utils");
|
|
31
31
|
var import_sswr = require("sswr");
|
|
32
32
|
var import_store = require("svelte/store");
|
|
33
|
-
var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, existingData, extraMetadata, previousMessages, abortControllerRef, generateId2, streamMode, onFinish, onResponse, sendExtraMessageFields) => {
|
|
33
|
+
var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, existingData, extraMetadata, previousMessages, abortControllerRef, generateId2, streamMode, onFinish, onResponse, sendExtraMessageFields, fetch2) => {
|
|
34
34
|
var _a, _b;
|
|
35
35
|
mutate(chatRequest.messages);
|
|
36
36
|
const constructedMessagesPayload = sendExtraMessageFields ? chatRequest.messages : chatRequest.messages.map(
|
|
@@ -57,7 +57,6 @@ var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, exi
|
|
|
57
57
|
);
|
|
58
58
|
return await (0, import_ui_utils.callChatApi)({
|
|
59
59
|
api,
|
|
60
|
-
messages: constructedMessagesPayload,
|
|
61
60
|
body: {
|
|
62
61
|
messages: constructedMessagesPayload,
|
|
63
62
|
data: chatRequest.data,
|
|
@@ -92,7 +91,10 @@ var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, exi
|
|
|
92
91
|
mutateStreamData([...existingData || [], ...data || []]);
|
|
93
92
|
},
|
|
94
93
|
onFinish,
|
|
95
|
-
generateId: generateId2
|
|
94
|
+
generateId: generateId2,
|
|
95
|
+
onToolCall: void 0,
|
|
96
|
+
// not implemented yet
|
|
97
|
+
fetch: fetch2
|
|
96
98
|
});
|
|
97
99
|
};
|
|
98
100
|
var uniqueId = 0;
|
|
@@ -112,7 +114,8 @@ function useChat({
|
|
|
112
114
|
credentials,
|
|
113
115
|
headers,
|
|
114
116
|
body,
|
|
115
|
-
generateId: generateId2 = import_ui_utils.generateId
|
|
117
|
+
generateId: generateId2 = import_ui_utils.generateId,
|
|
118
|
+
fetch: fetch2
|
|
116
119
|
} = {}) {
|
|
117
120
|
const chatId = id || `chat-${uniqueId++}`;
|
|
118
121
|
const key = `${api}|${chatId}`;
|
|
@@ -160,7 +163,8 @@ function useChat({
|
|
|
160
163
|
streamMode,
|
|
161
164
|
onFinish,
|
|
162
165
|
onResponse,
|
|
163
|
-
sendExtraMessageFields
|
|
166
|
+
sendExtraMessageFields,
|
|
167
|
+
fetch2
|
|
164
168
|
),
|
|
165
169
|
experimental_onFunctionCall,
|
|
166
170
|
experimental_onToolCall,
|
|
@@ -301,7 +305,8 @@ function useCompletion({
|
|
|
301
305
|
streamMode,
|
|
302
306
|
onResponse,
|
|
303
307
|
onFinish,
|
|
304
|
-
onError
|
|
308
|
+
onError,
|
|
309
|
+
fetch: fetch2
|
|
305
310
|
} = {}) {
|
|
306
311
|
const completionId = id || `completion-${uniqueId2++}`;
|
|
307
312
|
const key = `${api}|${completionId}`;
|
|
@@ -349,7 +354,8 @@ function useCompletion({
|
|
|
349
354
|
onError,
|
|
350
355
|
onData(data2) {
|
|
351
356
|
streamData.set([...existingData || [], ...data2 || []]);
|
|
352
|
-
}
|
|
357
|
+
},
|
|
358
|
+
fetch: fetch2
|
|
353
359
|
});
|
|
354
360
|
};
|
|
355
361
|
const stop = () => {
|
|
@@ -391,6 +397,7 @@ function useCompletion({
|
|
|
391
397
|
var import_provider_utils = require("@ai-sdk/provider-utils");
|
|
392
398
|
var import_ui_utils3 = require("@ai-sdk/ui-utils");
|
|
393
399
|
var import_store3 = require("svelte/store");
|
|
400
|
+
var getOriginalFetch = () => fetch;
|
|
394
401
|
var uniqueId3 = 0;
|
|
395
402
|
var store3 = {};
|
|
396
403
|
function useAssistant({
|
|
@@ -399,7 +406,8 @@ function useAssistant({
|
|
|
399
406
|
credentials,
|
|
400
407
|
headers,
|
|
401
408
|
body,
|
|
402
|
-
onError
|
|
409
|
+
onError,
|
|
410
|
+
fetch: fetch2
|
|
403
411
|
}) {
|
|
404
412
|
const threadIdStore = (0, import_store3.writable)(threadIdParam);
|
|
405
413
|
const key = `${api}|${threadIdParam != null ? threadIdParam : `completion-${uniqueId3++}`}`;
|
|
@@ -422,7 +430,8 @@ function useAssistant({
|
|
|
422
430
|
]);
|
|
423
431
|
input.set("");
|
|
424
432
|
try {
|
|
425
|
-
const
|
|
433
|
+
const actualFetch = fetch2 != null ? fetch2 : getOriginalFetch();
|
|
434
|
+
const response = await actualFetch(api, {
|
|
426
435
|
method: "POST",
|
|
427
436
|
credentials,
|
|
428
437
|
signal: abortController.signal,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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: (\n event?: { preventDefault?: () => void },\n chatRequestOptions?: ChatRequestOptions,\n ) => 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 messages: constructedMessagesPayload,\n data: chatRequest.data,\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 = (\n event?: { preventDefault?: () => void },\n options: ChatRequestOptions = {},\n ) => {\n event?.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: (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: 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 = (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n\n const inputValue = get(input);\n return inputValue ? complete(inputValue) : undefined;\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 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}: 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 response = 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 (!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 // Read the streamed response data\n for await (const { type, value } of readDataStream(\n response.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 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({ 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"]}
|
|
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 FetchFunction,\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: (\n event?: { preventDefault?: () => void },\n chatRequestOptions?: ChatRequestOptions,\n ) => 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' | undefined,\n onFinish: ((message: Message) => void) | undefined,\n onResponse: ((response: Response) => void | Promise<void>) | undefined,\n sendExtraMessageFields: boolean | undefined,\n fetch: FetchFunction | undefined,\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 body: {\n messages: constructedMessagesPayload,\n data: chatRequest.data,\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 onToolCall: undefined, // not implemented yet\n fetch,\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 fetch,\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 fetch,\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 = (\n event?: { preventDefault?: () => void },\n options: ChatRequestOptions = {},\n ) => {\n event?.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: (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: 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 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 {\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 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 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\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 // Read the streamed response data\n for await (const { type, value } of readDataStream(\n response.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 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({ 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","fetch","generateIdFunc","data","chatRequest","messages","import_ui_utils","import_sswr","import_store","uniqueId","store","fetch","data","completion","import_ui_utils","import_store","uniqueId","store","fetch","messages"]}
|
package/dist/index.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "@ai-sdk/ui-utils";
|
|
7
7
|
import { useSWR } from "sswr";
|
|
8
8
|
import { derived, get, writable } from "svelte/store";
|
|
9
|
-
var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, existingData, extraMetadata, previousMessages, abortControllerRef, generateId2, streamMode, onFinish, onResponse, sendExtraMessageFields) => {
|
|
9
|
+
var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, existingData, extraMetadata, previousMessages, abortControllerRef, generateId2, streamMode, onFinish, onResponse, sendExtraMessageFields, fetch2) => {
|
|
10
10
|
var _a, _b;
|
|
11
11
|
mutate(chatRequest.messages);
|
|
12
12
|
const constructedMessagesPayload = sendExtraMessageFields ? chatRequest.messages : chatRequest.messages.map(
|
|
@@ -33,7 +33,6 @@ var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, exi
|
|
|
33
33
|
);
|
|
34
34
|
return await callChatApi({
|
|
35
35
|
api,
|
|
36
|
-
messages: constructedMessagesPayload,
|
|
37
36
|
body: {
|
|
38
37
|
messages: constructedMessagesPayload,
|
|
39
38
|
data: chatRequest.data,
|
|
@@ -68,7 +67,10 @@ var getStreamedResponse = async (api, chatRequest, mutate, mutateStreamData, exi
|
|
|
68
67
|
mutateStreamData([...existingData || [], ...data || []]);
|
|
69
68
|
},
|
|
70
69
|
onFinish,
|
|
71
|
-
generateId: generateId2
|
|
70
|
+
generateId: generateId2,
|
|
71
|
+
onToolCall: void 0,
|
|
72
|
+
// not implemented yet
|
|
73
|
+
fetch: fetch2
|
|
72
74
|
});
|
|
73
75
|
};
|
|
74
76
|
var uniqueId = 0;
|
|
@@ -88,7 +90,8 @@ function useChat({
|
|
|
88
90
|
credentials,
|
|
89
91
|
headers,
|
|
90
92
|
body,
|
|
91
|
-
generateId: generateId2 = generateIdFunc
|
|
93
|
+
generateId: generateId2 = generateIdFunc,
|
|
94
|
+
fetch: fetch2
|
|
92
95
|
} = {}) {
|
|
93
96
|
const chatId = id || `chat-${uniqueId++}`;
|
|
94
97
|
const key = `${api}|${chatId}`;
|
|
@@ -136,7 +139,8 @@ function useChat({
|
|
|
136
139
|
streamMode,
|
|
137
140
|
onFinish,
|
|
138
141
|
onResponse,
|
|
139
|
-
sendExtraMessageFields
|
|
142
|
+
sendExtraMessageFields,
|
|
143
|
+
fetch2
|
|
140
144
|
),
|
|
141
145
|
experimental_onFunctionCall,
|
|
142
146
|
experimental_onToolCall,
|
|
@@ -277,7 +281,8 @@ function useCompletion({
|
|
|
277
281
|
streamMode,
|
|
278
282
|
onResponse,
|
|
279
283
|
onFinish,
|
|
280
|
-
onError
|
|
284
|
+
onError,
|
|
285
|
+
fetch: fetch2
|
|
281
286
|
} = {}) {
|
|
282
287
|
const completionId = id || `completion-${uniqueId2++}`;
|
|
283
288
|
const key = `${api}|${completionId}`;
|
|
@@ -325,7 +330,8 @@ function useCompletion({
|
|
|
325
330
|
onError,
|
|
326
331
|
onData(data2) {
|
|
327
332
|
streamData.set([...existingData || [], ...data2 || []]);
|
|
328
|
-
}
|
|
333
|
+
},
|
|
334
|
+
fetch: fetch2
|
|
329
335
|
});
|
|
330
336
|
};
|
|
331
337
|
const stop = () => {
|
|
@@ -367,6 +373,7 @@ function useCompletion({
|
|
|
367
373
|
import { isAbortError } from "@ai-sdk/provider-utils";
|
|
368
374
|
import { generateId, readDataStream } from "@ai-sdk/ui-utils";
|
|
369
375
|
import { get as get3, writable as writable3 } from "svelte/store";
|
|
376
|
+
var getOriginalFetch = () => fetch;
|
|
370
377
|
var uniqueId3 = 0;
|
|
371
378
|
var store3 = {};
|
|
372
379
|
function useAssistant({
|
|
@@ -375,7 +382,8 @@ function useAssistant({
|
|
|
375
382
|
credentials,
|
|
376
383
|
headers,
|
|
377
384
|
body,
|
|
378
|
-
onError
|
|
385
|
+
onError,
|
|
386
|
+
fetch: fetch2
|
|
379
387
|
}) {
|
|
380
388
|
const threadIdStore = writable3(threadIdParam);
|
|
381
389
|
const key = `${api}|${threadIdParam != null ? threadIdParam : `completion-${uniqueId3++}`}`;
|
|
@@ -398,7 +406,8 @@ function useAssistant({
|
|
|
398
406
|
]);
|
|
399
407
|
input.set("");
|
|
400
408
|
try {
|
|
401
|
-
const
|
|
409
|
+
const actualFetch = fetch2 != null ? fetch2 : getOriginalFetch();
|
|
410
|
+
const response = await actualFetch(api, {
|
|
402
411
|
method: "POST",
|
|
403
412
|
credentials,
|
|
404
413
|
signal: abortController.signal,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 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: (\n event?: { preventDefault?: () => void },\n chatRequestOptions?: ChatRequestOptions,\n ) => 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 messages: constructedMessagesPayload,\n data: chatRequest.data,\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 = (\n event?: { preventDefault?: () => void },\n options: ChatRequestOptions = {},\n ) => {\n event?.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: (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: 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 = (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n\n const inputValue = get(input);\n return inputValue ? complete(inputValue) : undefined;\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 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}: 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 response = 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 (!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 // Read the streamed response data\n for await (const { type, value } of readDataStream(\n response.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 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({ 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","data","chatRequest","messages","useSWR","derived","get","writable","uniqueId","store","data","completion","get","writable","uniqueId","store","messages"]}
|
|
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 FetchFunction,\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: (\n event?: { preventDefault?: () => void },\n chatRequestOptions?: ChatRequestOptions,\n ) => 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' | undefined,\n onFinish: ((message: Message) => void) | undefined,\n onResponse: ((response: Response) => void | Promise<void>) | undefined,\n sendExtraMessageFields: boolean | undefined,\n fetch: FetchFunction | undefined,\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 body: {\n messages: constructedMessagesPayload,\n data: chatRequest.data,\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 onToolCall: undefined, // not implemented yet\n fetch,\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 fetch,\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 fetch,\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 = (\n event?: { preventDefault?: () => void },\n options: ChatRequestOptions = {},\n ) => {\n event?.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: (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: 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 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 {\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 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 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\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 // Read the streamed response data\n for await (const { type, value } of readDataStream(\n response.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 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({ 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","fetch","data","chatRequest","messages","useSWR","derived","get","writable","uniqueId","store","fetch","data","completion","get","writable","uniqueId","store","fetch","messages"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/svelte",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@ai-sdk/provider-utils": "0.0
|
|
19
|
-
"@ai-sdk/ui-utils": "0.0.
|
|
18
|
+
"@ai-sdk/provider-utils": "1.0.0",
|
|
19
|
+
"@ai-sdk/ui-utils": "0.0.8",
|
|
20
20
|
"sswr": "2.1.0"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
package/src/use-assistant.ts
CHANGED
|
@@ -8,6 +8,9 @@ import type {
|
|
|
8
8
|
import { generateId, readDataStream } from '@ai-sdk/ui-utils';
|
|
9
9
|
import { Readable, Writable, get, writable } from 'svelte/store';
|
|
10
10
|
|
|
11
|
+
// use function to allow for mocking in tests:
|
|
12
|
+
const getOriginalFetch = () => fetch;
|
|
13
|
+
|
|
11
14
|
let uniqueId = 0;
|
|
12
15
|
|
|
13
16
|
const store: Record<string, any> = {};
|
|
@@ -75,6 +78,7 @@ export function useAssistant({
|
|
|
75
78
|
headers,
|
|
76
79
|
body,
|
|
77
80
|
onError,
|
|
81
|
+
fetch,
|
|
78
82
|
}: UseAssistantOptions): UseAssistantHelpers {
|
|
79
83
|
// Generate a unique thread ID
|
|
80
84
|
const threadIdStore = writable<string | undefined>(threadIdParam);
|
|
@@ -112,7 +116,8 @@ export function useAssistant({
|
|
|
112
116
|
input.set('');
|
|
113
117
|
|
|
114
118
|
try {
|
|
115
|
-
const
|
|
119
|
+
const actualFetch = fetch ?? getOriginalFetch();
|
|
120
|
+
const response = await actualFetch(api, {
|
|
116
121
|
method: 'POST',
|
|
117
122
|
credentials,
|
|
118
123
|
signal: abortController.signal,
|
package/src/use-chat.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type {
|
|
|
2
2
|
ChatRequest,
|
|
3
3
|
ChatRequestOptions,
|
|
4
4
|
CreateMessage,
|
|
5
|
+
FetchFunction,
|
|
5
6
|
IdGenerator,
|
|
6
7
|
JSONValue,
|
|
7
8
|
Message,
|
|
@@ -77,10 +78,11 @@ const getStreamedResponse = async (
|
|
|
77
78
|
previousMessages: Message[],
|
|
78
79
|
abortControllerRef: AbortController | null,
|
|
79
80
|
generateId: IdGenerator,
|
|
80
|
-
streamMode
|
|
81
|
-
onFinish
|
|
82
|
-
onResponse
|
|
83
|
-
sendExtraMessageFields
|
|
81
|
+
streamMode: 'stream-data' | 'text' | undefined,
|
|
82
|
+
onFinish: ((message: Message) => void) | undefined,
|
|
83
|
+
onResponse: ((response: Response) => void | Promise<void>) | undefined,
|
|
84
|
+
sendExtraMessageFields: boolean | undefined,
|
|
85
|
+
fetch: FetchFunction | undefined,
|
|
84
86
|
) => {
|
|
85
87
|
// Do an optimistic update to the chat state to show the updated messages
|
|
86
88
|
// immediately.
|
|
@@ -113,7 +115,6 @@ const getStreamedResponse = async (
|
|
|
113
115
|
|
|
114
116
|
return await callChatApi({
|
|
115
117
|
api,
|
|
116
|
-
messages: constructedMessagesPayload,
|
|
117
118
|
body: {
|
|
118
119
|
messages: constructedMessagesPayload,
|
|
119
120
|
data: chatRequest.data,
|
|
@@ -149,6 +150,8 @@ const getStreamedResponse = async (
|
|
|
149
150
|
},
|
|
150
151
|
onFinish,
|
|
151
152
|
generateId,
|
|
153
|
+
onToolCall: undefined, // not implemented yet
|
|
154
|
+
fetch,
|
|
152
155
|
});
|
|
153
156
|
};
|
|
154
157
|
|
|
@@ -172,6 +175,7 @@ export function useChat({
|
|
|
172
175
|
headers,
|
|
173
176
|
body,
|
|
174
177
|
generateId = generateIdFunc,
|
|
178
|
+
fetch,
|
|
175
179
|
}: UseChatOptions = {}): UseChatHelpers {
|
|
176
180
|
// Generate a unique id for the chat if not provided.
|
|
177
181
|
const chatId = id || `chat-${uniqueId++}`;
|
|
@@ -238,6 +242,7 @@ export function useChat({
|
|
|
238
242
|
onFinish,
|
|
239
243
|
onResponse,
|
|
240
244
|
sendExtraMessageFields,
|
|
245
|
+
fetch,
|
|
241
246
|
),
|
|
242
247
|
experimental_onFunctionCall,
|
|
243
248
|
experimental_onToolCall,
|
package/src/use-completion.ts
CHANGED
|
@@ -64,6 +64,7 @@ export function useCompletion({
|
|
|
64
64
|
onResponse,
|
|
65
65
|
onFinish,
|
|
66
66
|
onError,
|
|
67
|
+
fetch,
|
|
67
68
|
}: UseCompletionOptions = {}): UseCompletionHelpers {
|
|
68
69
|
// Generate an unique id for the completion if not provided.
|
|
69
70
|
const completionId = id || `completion-${uniqueId++}`;
|
|
@@ -127,6 +128,7 @@ export function useCompletion({
|
|
|
127
128
|
onData(data) {
|
|
128
129
|
streamData.set([...(existingData || []), ...(data || [])]);
|
|
129
130
|
},
|
|
131
|
+
fetch,
|
|
130
132
|
});
|
|
131
133
|
};
|
|
132
134
|
|