@ai-sdk/vue 2.0.0-alpha.9 → 2.0.0-beta.2
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/CHANGELOG.md +107 -0
- package/dist/index.d.mts +7 -72
- package/dist/index.d.ts +7 -72
- package/dist/index.js +53 -118
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +52 -116
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,112 @@
|
|
|
1
1
|
# @ai-sdk/vue
|
|
2
2
|
|
|
3
|
+
## 2.0.0-beta.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [0d9583c]
|
|
8
|
+
- Updated dependencies [0571b98]
|
|
9
|
+
- Updated dependencies [c6b64a7]
|
|
10
|
+
- Updated dependencies [39a4fab]
|
|
11
|
+
- Updated dependencies [cb3b9c9]
|
|
12
|
+
- Updated dependencies [d1a034f]
|
|
13
|
+
- ai@5.0.0-beta.2
|
|
14
|
+
- @ai-sdk/provider-utils@3.0.0-beta.2
|
|
15
|
+
|
|
16
|
+
## 2.0.0-beta.1
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- Updated dependencies [d88455d]
|
|
21
|
+
- Updated dependencies [45c1ea2]
|
|
22
|
+
- Updated dependencies [9ad0484]
|
|
23
|
+
- Updated dependencies [e025824]
|
|
24
|
+
- Updated dependencies [4048ce3]
|
|
25
|
+
- Updated dependencies [f2b041e]
|
|
26
|
+
- Updated dependencies [cb68df0]
|
|
27
|
+
- Updated dependencies [26695a3]
|
|
28
|
+
- Updated dependencies [bfdca8d]
|
|
29
|
+
- Updated dependencies [e7d2ce3]
|
|
30
|
+
- Updated dependencies [102b066]
|
|
31
|
+
- Updated dependencies [71f938d]
|
|
32
|
+
- Updated dependencies [28a5ed5]
|
|
33
|
+
- Updated dependencies [e862b5b]
|
|
34
|
+
- Updated dependencies [7bd025b]
|
|
35
|
+
- ai@5.0.0-beta.1
|
|
36
|
+
- @ai-sdk/provider-utils@3.0.0-beta.1
|
|
37
|
+
|
|
38
|
+
## 2.0.0-alpha.15
|
|
39
|
+
|
|
40
|
+
### Patch Changes
|
|
41
|
+
|
|
42
|
+
- Updated dependencies [b1e3abd]
|
|
43
|
+
- Updated dependencies [8ba77a7]
|
|
44
|
+
- Updated dependencies [04d5063]
|
|
45
|
+
- Updated dependencies [b4b4bb2]
|
|
46
|
+
- Updated dependencies [d884051]
|
|
47
|
+
- Updated dependencies [954aa73]
|
|
48
|
+
- Updated dependencies [142576e]
|
|
49
|
+
- Updated dependencies [395c85e]
|
|
50
|
+
- Updated dependencies [60e2c56]
|
|
51
|
+
- ai@5.0.0-alpha.15
|
|
52
|
+
- @ai-sdk/provider-utils@3.0.0-alpha.15
|
|
53
|
+
|
|
54
|
+
## 2.0.0-alpha.14
|
|
55
|
+
|
|
56
|
+
### Patch Changes
|
|
57
|
+
|
|
58
|
+
- Updated dependencies [63f9e9b]
|
|
59
|
+
- ai@5.0.0-alpha.14
|
|
60
|
+
- @ai-sdk/provider-utils@3.0.0-alpha.14
|
|
61
|
+
|
|
62
|
+
## 2.0.0-alpha.13
|
|
63
|
+
|
|
64
|
+
### Major Changes
|
|
65
|
+
|
|
66
|
+
- 0a710d8: feat (ui): typed tool parts in ui messages
|
|
67
|
+
- 901df02: feat (ui): use UI_MESSAGE generic
|
|
68
|
+
|
|
69
|
+
### Patch Changes
|
|
70
|
+
|
|
71
|
+
- Updated dependencies [0a710d8]
|
|
72
|
+
- Updated dependencies [6a83f7d]
|
|
73
|
+
- Updated dependencies [1f55c21]
|
|
74
|
+
- Updated dependencies [33eb499]
|
|
75
|
+
- Updated dependencies [901df02]
|
|
76
|
+
- ai@5.0.0-alpha.13
|
|
77
|
+
- @ai-sdk/provider-utils@3.0.0-alpha.13
|
|
78
|
+
|
|
79
|
+
## 2.0.0-alpha.12
|
|
80
|
+
|
|
81
|
+
### Patch Changes
|
|
82
|
+
|
|
83
|
+
- Updated dependencies [da1e6f0]
|
|
84
|
+
- Updated dependencies [4892798]
|
|
85
|
+
- ai@5.0.0-alpha.12
|
|
86
|
+
- @ai-sdk/provider-utils@3.0.0-alpha.12
|
|
87
|
+
|
|
88
|
+
## 2.0.0-alpha.11
|
|
89
|
+
|
|
90
|
+
### Patch Changes
|
|
91
|
+
|
|
92
|
+
- Updated dependencies [e8324c5]
|
|
93
|
+
- ai@5.0.0-alpha.11
|
|
94
|
+
- @ai-sdk/provider-utils@3.0.0-alpha.11
|
|
95
|
+
|
|
96
|
+
## 2.0.0-alpha.10
|
|
97
|
+
|
|
98
|
+
### Major Changes
|
|
99
|
+
|
|
100
|
+
- 98f25e5: chore (ui): remove managed chat inputs
|
|
101
|
+
- 98f25e5: chore (ui/vue): replace useChat with new Chat
|
|
102
|
+
|
|
103
|
+
### Patch Changes
|
|
104
|
+
|
|
105
|
+
- Updated dependencies [98f25e5]
|
|
106
|
+
- Updated dependencies [7bb58d4]
|
|
107
|
+
- ai@5.0.0-alpha.10
|
|
108
|
+
- @ai-sdk/provider-utils@3.0.0-alpha.10
|
|
109
|
+
|
|
3
110
|
## 2.0.0-alpha.9
|
|
4
111
|
|
|
5
112
|
### Patch Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -1,76 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { CompletionRequestOptions, UseCompletionOptions, UIMessage, AbstractChat, ChatInit } from 'ai';
|
|
2
|
+
export { UseCompletionOptions } from 'ai';
|
|
3
3
|
import { Ref } from 'vue';
|
|
4
4
|
|
|
5
|
-
declare class Chat<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas> extends AbstractChat<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS> {
|
|
6
|
-
constructor({ messages, ...init }: BaseChatInit<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS>);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
type UseChatOptions<MESSAGE_METADATA = unknown, DATA_TYPE_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas> = ({
|
|
10
|
-
chat: Chat<MESSAGE_METADATA, DATA_TYPE_SCHEMAS>;
|
|
11
|
-
} | BaseChatInit<MESSAGE_METADATA, DATA_TYPE_SCHEMAS>) & {
|
|
12
|
-
/**
|
|
13
|
-
* Initial input of the chat.
|
|
14
|
-
*/
|
|
15
|
-
initialInput?: string;
|
|
16
|
-
};
|
|
17
|
-
type UseChatHelpers<MESSAGE_METADATA = unknown, DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas> = {
|
|
18
|
-
/**
|
|
19
|
-
* The id of the chat.
|
|
20
|
-
*/
|
|
21
|
-
readonly id: string;
|
|
22
|
-
/** Current messages in the chat */
|
|
23
|
-
readonly messages: Ref<UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]>;
|
|
24
|
-
/** The error object of the API request */
|
|
25
|
-
readonly error: Ref<Error | undefined>;
|
|
26
|
-
/**
|
|
27
|
-
* Append a user message to the chat list. This triggers the API call to fetch
|
|
28
|
-
* the assistant's response.
|
|
29
|
-
*
|
|
30
|
-
* @param message The message to append
|
|
31
|
-
* @param options Additional options to pass to the API call
|
|
32
|
-
*/
|
|
33
|
-
append: (message: CreateUIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>, options?: ChatRequestOptions) => Promise<void>;
|
|
34
|
-
/**
|
|
35
|
-
* Reload the last AI chat response for the given chat history. If the last
|
|
36
|
-
* message isn't from the assistant, it will request the API to generate a
|
|
37
|
-
* new response.
|
|
38
|
-
*/
|
|
39
|
-
reload: (chatRequestOptions?: ChatRequestOptions) => Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Abort the current request immediately, keep the generated tokens if any.
|
|
42
|
-
*/
|
|
43
|
-
stop: () => void;
|
|
44
|
-
/**
|
|
45
|
-
* Update the `messages` state locally. This is useful when you want to
|
|
46
|
-
* edit the messages on the client, and then trigger the `reload` method
|
|
47
|
-
* manually to regenerate the AI response.
|
|
48
|
-
*/
|
|
49
|
-
setMessages: (messages: UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[] | ((messages: UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]) => UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[])) => void;
|
|
50
|
-
/** The current value of the input */
|
|
51
|
-
input: Ref<string>;
|
|
52
|
-
/** Form submission handler to automatically reset input and append a user message */
|
|
53
|
-
handleSubmit: (event?: {
|
|
54
|
-
preventDefault?: () => void;
|
|
55
|
-
}, chatRequestOptions?: ChatRequestOptions & {
|
|
56
|
-
files?: FileList | FileUIPart[];
|
|
57
|
-
}) => void;
|
|
58
|
-
/**
|
|
59
|
-
* Hook status:
|
|
60
|
-
*
|
|
61
|
-
* - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.
|
|
62
|
-
* - `streaming`: The response is actively streaming in from the API, receiving chunks of data.
|
|
63
|
-
* - `ready`: The full response has been received and processed; a new user message can be submitted.
|
|
64
|
-
* - `error`: An error occurred during the API request, preventing successful completion.
|
|
65
|
-
*/
|
|
66
|
-
status: Ref<ChatStatus>;
|
|
67
|
-
addToolResult: ({ toolCallId, result, }: {
|
|
68
|
-
toolCallId: string;
|
|
69
|
-
result: any;
|
|
70
|
-
}) => void;
|
|
71
|
-
};
|
|
72
|
-
declare function useChat<MESSAGE_METADATA = unknown, DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas>({ initialInput, ...options }?: UseChatOptions<MESSAGE_METADATA, DATA_PART_SCHEMAS>): UseChatHelpers<MESSAGE_METADATA, DATA_PART_SCHEMAS>;
|
|
73
|
-
|
|
74
5
|
type UseCompletionHelpers = {
|
|
75
6
|
/** The current completion result */
|
|
76
7
|
completion: Ref<string>;
|
|
@@ -107,4 +38,8 @@ type UseCompletionHelpers = {
|
|
|
107
38
|
};
|
|
108
39
|
declare function useCompletion({ api, id, initialCompletion, initialInput, credentials, headers, body, streamProtocol, onFinish, onError, fetch, }?: UseCompletionOptions): UseCompletionHelpers;
|
|
109
40
|
|
|
110
|
-
|
|
41
|
+
declare class Chat<UI_MESSAGE extends UIMessage> extends AbstractChat<UI_MESSAGE> {
|
|
42
|
+
constructor({ messages, ...init }: ChatInit<UI_MESSAGE>);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { Chat, UseCompletionHelpers, useCompletion };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,76 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
1
|
+
import { CompletionRequestOptions, UseCompletionOptions, UIMessage, AbstractChat, ChatInit } from 'ai';
|
|
2
|
+
export { UseCompletionOptions } from 'ai';
|
|
3
3
|
import { Ref } from 'vue';
|
|
4
4
|
|
|
5
|
-
declare class Chat<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas> extends AbstractChat<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS> {
|
|
6
|
-
constructor({ messages, ...init }: BaseChatInit<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS>);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
type UseChatOptions<MESSAGE_METADATA = unknown, DATA_TYPE_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas> = ({
|
|
10
|
-
chat: Chat<MESSAGE_METADATA, DATA_TYPE_SCHEMAS>;
|
|
11
|
-
} | BaseChatInit<MESSAGE_METADATA, DATA_TYPE_SCHEMAS>) & {
|
|
12
|
-
/**
|
|
13
|
-
* Initial input of the chat.
|
|
14
|
-
*/
|
|
15
|
-
initialInput?: string;
|
|
16
|
-
};
|
|
17
|
-
type UseChatHelpers<MESSAGE_METADATA = unknown, DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas> = {
|
|
18
|
-
/**
|
|
19
|
-
* The id of the chat.
|
|
20
|
-
*/
|
|
21
|
-
readonly id: string;
|
|
22
|
-
/** Current messages in the chat */
|
|
23
|
-
readonly messages: Ref<UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]>;
|
|
24
|
-
/** The error object of the API request */
|
|
25
|
-
readonly error: Ref<Error | undefined>;
|
|
26
|
-
/**
|
|
27
|
-
* Append a user message to the chat list. This triggers the API call to fetch
|
|
28
|
-
* the assistant's response.
|
|
29
|
-
*
|
|
30
|
-
* @param message The message to append
|
|
31
|
-
* @param options Additional options to pass to the API call
|
|
32
|
-
*/
|
|
33
|
-
append: (message: CreateUIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>, options?: ChatRequestOptions) => Promise<void>;
|
|
34
|
-
/**
|
|
35
|
-
* Reload the last AI chat response for the given chat history. If the last
|
|
36
|
-
* message isn't from the assistant, it will request the API to generate a
|
|
37
|
-
* new response.
|
|
38
|
-
*/
|
|
39
|
-
reload: (chatRequestOptions?: ChatRequestOptions) => Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Abort the current request immediately, keep the generated tokens if any.
|
|
42
|
-
*/
|
|
43
|
-
stop: () => void;
|
|
44
|
-
/**
|
|
45
|
-
* Update the `messages` state locally. This is useful when you want to
|
|
46
|
-
* edit the messages on the client, and then trigger the `reload` method
|
|
47
|
-
* manually to regenerate the AI response.
|
|
48
|
-
*/
|
|
49
|
-
setMessages: (messages: UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[] | ((messages: UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]) => UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[])) => void;
|
|
50
|
-
/** The current value of the input */
|
|
51
|
-
input: Ref<string>;
|
|
52
|
-
/** Form submission handler to automatically reset input and append a user message */
|
|
53
|
-
handleSubmit: (event?: {
|
|
54
|
-
preventDefault?: () => void;
|
|
55
|
-
}, chatRequestOptions?: ChatRequestOptions & {
|
|
56
|
-
files?: FileList | FileUIPart[];
|
|
57
|
-
}) => void;
|
|
58
|
-
/**
|
|
59
|
-
* Hook status:
|
|
60
|
-
*
|
|
61
|
-
* - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.
|
|
62
|
-
* - `streaming`: The response is actively streaming in from the API, receiving chunks of data.
|
|
63
|
-
* - `ready`: The full response has been received and processed; a new user message can be submitted.
|
|
64
|
-
* - `error`: An error occurred during the API request, preventing successful completion.
|
|
65
|
-
*/
|
|
66
|
-
status: Ref<ChatStatus>;
|
|
67
|
-
addToolResult: ({ toolCallId, result, }: {
|
|
68
|
-
toolCallId: string;
|
|
69
|
-
result: any;
|
|
70
|
-
}) => void;
|
|
71
|
-
};
|
|
72
|
-
declare function useChat<MESSAGE_METADATA = unknown, DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas>({ initialInput, ...options }?: UseChatOptions<MESSAGE_METADATA, DATA_PART_SCHEMAS>): UseChatHelpers<MESSAGE_METADATA, DATA_PART_SCHEMAS>;
|
|
73
|
-
|
|
74
5
|
type UseCompletionHelpers = {
|
|
75
6
|
/** The current completion result */
|
|
76
7
|
completion: Ref<string>;
|
|
@@ -107,4 +38,8 @@ type UseCompletionHelpers = {
|
|
|
107
38
|
};
|
|
108
39
|
declare function useCompletion({ api, id, initialCompletion, initialInput, credentials, headers, body, streamProtocol, onFinish, onError, fetch, }?: UseCompletionOptions): UseCompletionHelpers;
|
|
109
40
|
|
|
110
|
-
|
|
41
|
+
declare class Chat<UI_MESSAGE extends UIMessage> extends AbstractChat<UI_MESSAGE> {
|
|
42
|
+
constructor({ messages, ...init }: ChatInit<UI_MESSAGE>);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { Chat, UseCompletionHelpers, useCompletion };
|
package/dist/index.js
CHANGED
|
@@ -31,125 +31,14 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
33
|
Chat: () => Chat,
|
|
34
|
-
useChat: () => useChat,
|
|
35
34
|
useCompletion: () => useCompletion
|
|
36
35
|
});
|
|
37
36
|
module.exports = __toCommonJS(src_exports);
|
|
38
37
|
|
|
39
|
-
// src/use-chat.ts
|
|
40
|
-
var import_ai2 = require("ai");
|
|
41
|
-
var import_vue2 = require("vue");
|
|
42
|
-
|
|
43
|
-
// src/chat.vue.ts
|
|
44
|
-
var import_ai = require("ai");
|
|
45
|
-
var import_vue = require("vue");
|
|
46
|
-
var VueChatState = class {
|
|
47
|
-
constructor(messages) {
|
|
48
|
-
this.statusRef = (0, import_vue.ref)("ready");
|
|
49
|
-
this.errorRef = (0, import_vue.ref)(void 0);
|
|
50
|
-
this.pushMessage = (message) => {
|
|
51
|
-
this.messagesRef.value.push(message);
|
|
52
|
-
};
|
|
53
|
-
this.popMessage = () => {
|
|
54
|
-
this.messagesRef.value.pop();
|
|
55
|
-
};
|
|
56
|
-
this.replaceMessage = (index, message) => {
|
|
57
|
-
this.messagesRef.value[index] = { ...message };
|
|
58
|
-
};
|
|
59
|
-
this.snapshot = (value) => value;
|
|
60
|
-
this.messagesRef = (0, import_vue.ref)(messages != null ? messages : []);
|
|
61
|
-
}
|
|
62
|
-
get messages() {
|
|
63
|
-
return this.messagesRef.value;
|
|
64
|
-
}
|
|
65
|
-
set messages(messages) {
|
|
66
|
-
this.messagesRef.value = messages;
|
|
67
|
-
}
|
|
68
|
-
get status() {
|
|
69
|
-
return this.statusRef.value;
|
|
70
|
-
}
|
|
71
|
-
set status(status) {
|
|
72
|
-
this.statusRef.value = status;
|
|
73
|
-
}
|
|
74
|
-
get error() {
|
|
75
|
-
return this.errorRef.value;
|
|
76
|
-
}
|
|
77
|
-
set error(error) {
|
|
78
|
-
this.errorRef.value = error;
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
var Chat = class extends import_ai.AbstractChat {
|
|
82
|
-
constructor({
|
|
83
|
-
messages,
|
|
84
|
-
...init
|
|
85
|
-
}) {
|
|
86
|
-
super({
|
|
87
|
-
...init,
|
|
88
|
-
state: new VueChatState(messages)
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
// src/use-chat.ts
|
|
94
|
-
function useChat({
|
|
95
|
-
initialInput = "",
|
|
96
|
-
...options
|
|
97
|
-
} = {}) {
|
|
98
|
-
const chat = "chat" in options ? options.chat : new Chat(options);
|
|
99
|
-
const messages = (0, import_vue2.computed)(() => chat.messages);
|
|
100
|
-
const status = (0, import_vue2.computed)(() => chat.status);
|
|
101
|
-
const error = (0, import_vue2.computed)(() => chat.error);
|
|
102
|
-
const append = async (message, { headers, body } = {}) => chat.append(message, { headers, body });
|
|
103
|
-
const reload = async ({ headers, body } = {}) => chat.reload({ headers, body });
|
|
104
|
-
const stop = () => chat.stop();
|
|
105
|
-
const setMessages = (messagesParam) => {
|
|
106
|
-
if (typeof messagesParam === "function") {
|
|
107
|
-
messagesParam = messagesParam(chat.messages);
|
|
108
|
-
}
|
|
109
|
-
chat.messages = messagesParam;
|
|
110
|
-
};
|
|
111
|
-
const input = (0, import_vue2.ref)(initialInput);
|
|
112
|
-
const handleSubmit = async (event, options2 = {}) => {
|
|
113
|
-
var _a;
|
|
114
|
-
(_a = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a.call(event);
|
|
115
|
-
const inputValue = input.value;
|
|
116
|
-
const fileParts = Array.isArray(options2 == null ? void 0 : options2.files) ? options2.files : await (0, import_ai2.convertFileListToFileUIParts)(options2 == null ? void 0 : options2.files);
|
|
117
|
-
if (!inputValue && fileParts.length === 0)
|
|
118
|
-
return;
|
|
119
|
-
await append(
|
|
120
|
-
{
|
|
121
|
-
id: chat.generateId(),
|
|
122
|
-
role: "user",
|
|
123
|
-
metadata: void 0,
|
|
124
|
-
parts: [...fileParts, { type: "text", text: inputValue }]
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
headers: options2.headers,
|
|
128
|
-
body: options2.body
|
|
129
|
-
}
|
|
130
|
-
);
|
|
131
|
-
input.value = "";
|
|
132
|
-
};
|
|
133
|
-
const addToolResult = (options2) => chat.addToolResult(options2);
|
|
134
|
-
return {
|
|
135
|
-
id: chat.id,
|
|
136
|
-
messages,
|
|
137
|
-
append,
|
|
138
|
-
error,
|
|
139
|
-
reload,
|
|
140
|
-
stop,
|
|
141
|
-
setMessages,
|
|
142
|
-
input,
|
|
143
|
-
handleSubmit,
|
|
144
|
-
status,
|
|
145
|
-
addToolResult
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
38
|
// src/use-completion.ts
|
|
150
|
-
var
|
|
39
|
+
var import_ai = require("ai");
|
|
151
40
|
var import_swrv = __toESM(require("swrv"));
|
|
152
|
-
var
|
|
41
|
+
var import_vue = require("vue");
|
|
153
42
|
var uniqueId = 0;
|
|
154
43
|
var useSWRV = import_swrv.default.default || import_swrv.default;
|
|
155
44
|
var store = {};
|
|
@@ -184,10 +73,10 @@ function useCompletion({
|
|
|
184
73
|
return originalMutate();
|
|
185
74
|
};
|
|
186
75
|
const completion = data;
|
|
187
|
-
const error = (0,
|
|
76
|
+
const error = (0, import_vue.ref)(void 0);
|
|
188
77
|
let abortController = null;
|
|
189
78
|
async function triggerRequest(prompt, options) {
|
|
190
|
-
return (0,
|
|
79
|
+
return (0, import_ai.callCompletionApi)({
|
|
191
80
|
api,
|
|
192
81
|
prompt,
|
|
193
82
|
credentials,
|
|
@@ -196,7 +85,7 @@ function useCompletion({
|
|
|
196
85
|
...options == null ? void 0 : options.headers
|
|
197
86
|
},
|
|
198
87
|
body: {
|
|
199
|
-
...(0,
|
|
88
|
+
...(0, import_vue.unref)(body),
|
|
200
89
|
...options == null ? void 0 : options.body
|
|
201
90
|
},
|
|
202
91
|
streamProtocol,
|
|
@@ -225,7 +114,7 @@ function useCompletion({
|
|
|
225
114
|
const setCompletion = (completion2) => {
|
|
226
115
|
mutate(completion2);
|
|
227
116
|
};
|
|
228
|
-
const input = (0,
|
|
117
|
+
const input = (0, import_vue.ref)(initialInput);
|
|
229
118
|
const handleSubmit = (event) => {
|
|
230
119
|
var _a2;
|
|
231
120
|
(_a2 = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a2.call(event);
|
|
@@ -243,10 +132,56 @@ function useCompletion({
|
|
|
243
132
|
isLoading
|
|
244
133
|
};
|
|
245
134
|
}
|
|
135
|
+
|
|
136
|
+
// src/chat.vue.ts
|
|
137
|
+
var import_ai2 = require("ai");
|
|
138
|
+
var import_vue2 = require("vue");
|
|
139
|
+
var VueChatState = class {
|
|
140
|
+
constructor(messages) {
|
|
141
|
+
this.statusRef = (0, import_vue2.ref)("ready");
|
|
142
|
+
this.errorRef = (0, import_vue2.ref)(void 0);
|
|
143
|
+
this.pushMessage = (message) => {
|
|
144
|
+
this.messagesRef.value.push(message);
|
|
145
|
+
};
|
|
146
|
+
this.popMessage = () => {
|
|
147
|
+
this.messagesRef.value.pop();
|
|
148
|
+
};
|
|
149
|
+
this.replaceMessage = (index, message) => {
|
|
150
|
+
this.messagesRef.value[index] = { ...message };
|
|
151
|
+
};
|
|
152
|
+
this.snapshot = (value) => value;
|
|
153
|
+
this.messagesRef = (0, import_vue2.ref)(messages != null ? messages : []);
|
|
154
|
+
}
|
|
155
|
+
get messages() {
|
|
156
|
+
return this.messagesRef.value;
|
|
157
|
+
}
|
|
158
|
+
set messages(messages) {
|
|
159
|
+
this.messagesRef.value = messages;
|
|
160
|
+
}
|
|
161
|
+
get status() {
|
|
162
|
+
return this.statusRef.value;
|
|
163
|
+
}
|
|
164
|
+
set status(status) {
|
|
165
|
+
this.statusRef.value = status;
|
|
166
|
+
}
|
|
167
|
+
get error() {
|
|
168
|
+
return this.errorRef.value;
|
|
169
|
+
}
|
|
170
|
+
set error(error) {
|
|
171
|
+
this.errorRef.value = error;
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
var Chat = class extends import_ai2.AbstractChat {
|
|
175
|
+
constructor({ messages, ...init }) {
|
|
176
|
+
super({
|
|
177
|
+
...init,
|
|
178
|
+
state: new VueChatState(messages)
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
};
|
|
246
182
|
// Annotate the CommonJS export names for ESM import in node:
|
|
247
183
|
0 && (module.exports = {
|
|
248
184
|
Chat,
|
|
249
|
-
useChat,
|
|
250
185
|
useCompletion
|
|
251
186
|
});
|
|
252
187
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/use-chat.ts","../src/chat.vue.ts","../src/use-completion.ts"],"sourcesContent":["export * from './use-chat';\nexport * from './use-completion';\nexport { Chat } from './chat.vue';\n","import type {\n BaseChatInit,\n ChatRequestOptions,\n ChatStatus,\n CreateUIMessage,\n FileUIPart,\n InferUIDataParts,\n UIDataPartSchemas,\n UIMessage,\n} from 'ai';\nimport { convertFileListToFileUIParts } from 'ai';\nimport type { Ref } from 'vue';\nimport { computed, ref } from 'vue';\nimport { Chat } from './chat.vue';\n\nexport type { CreateUIMessage, UIMessage };\n\nexport type UseChatOptions<\n MESSAGE_METADATA = unknown,\n DATA_TYPE_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas,\n> = (\n | { chat: Chat<MESSAGE_METADATA, DATA_TYPE_SCHEMAS> }\n | BaseChatInit<MESSAGE_METADATA, DATA_TYPE_SCHEMAS>\n) & {\n /**\n * Initial input of the chat.\n */\n initialInput?: string;\n};\n\nexport type UseChatHelpers<\n MESSAGE_METADATA = unknown,\n DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas,\n> = {\n /**\n * The id of the chat.\n */\n readonly id: string;\n\n /** Current messages in the chat */\n readonly messages: Ref<\n UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]\n >;\n\n /** The error object of the API request */\n readonly error: Ref<Error | undefined>;\n\n /**\n * Append a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n *\n * @param message The message to append\n * @param options Additional options to pass to the API call\n */\n append: (\n message: CreateUIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >,\n options?: ChatRequestOptions,\n ) => Promise<void>;\n\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: (chatRequestOptions?: ChatRequestOptions) => Promise<void>;\n\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n stop: () => void;\n\n /**\n * Update the `messages` state locally. This is useful when you want to\n * edit the messages on the client, and then trigger the `reload` method\n * manually to regenerate the AI response.\n */\n setMessages: (\n messages:\n | UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]\n | ((\n messages: UIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >[],\n ) => UIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >[]),\n ) => void;\n\n /** The current value of the input */\n input: Ref<string>;\n\n /** Form submission handler to automatically reset input and append a user message */\n handleSubmit: (\n event?: { preventDefault?: () => void },\n chatRequestOptions?: ChatRequestOptions & {\n files?: FileList | FileUIPart[];\n },\n ) => void;\n\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n status: Ref<ChatStatus>;\n\n addToolResult: ({\n toolCallId,\n result,\n }: {\n toolCallId: string;\n result: any;\n }) => void;\n};\n\nexport function useChat<\n MESSAGE_METADATA = unknown,\n DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas,\n>({\n initialInput = '',\n ...options\n}: UseChatOptions<MESSAGE_METADATA, DATA_PART_SCHEMAS> = {}): UseChatHelpers<\n MESSAGE_METADATA,\n DATA_PART_SCHEMAS\n> {\n const chat = 'chat' in options ? options.chat : new Chat(options);\n\n const messages = computed(() => chat.messages);\n const status = computed(() => chat.status);\n const error = computed(() => chat.error);\n\n const append = async (\n message: CreateUIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >,\n { headers, body }: ChatRequestOptions = {},\n ) => chat.append(message, { headers, body });\n\n const reload = async ({ headers, body }: ChatRequestOptions = {}) =>\n chat.reload({ headers, body });\n\n const stop = () => chat.stop();\n\n const setMessages = (\n messagesParam:\n | UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]\n | ((\n messages: UIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >[],\n ) => UIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >[]),\n ) => {\n if (typeof messagesParam === 'function') {\n messagesParam = messagesParam(chat.messages);\n }\n\n chat.messages = messagesParam;\n };\n\n const input = ref(initialInput);\n\n const handleSubmit = async (\n event?: { preventDefault?: () => void },\n options: ChatRequestOptions & { files?: FileList | FileUIPart[] } = {},\n ) => {\n event?.preventDefault?.();\n\n const inputValue = input.value;\n\n const fileParts = Array.isArray(options?.files)\n ? options.files\n : await convertFileListToFileUIParts(options?.files);\n\n if (!inputValue && fileParts.length === 0) return;\n\n await append(\n {\n id: chat.generateId(),\n role: 'user',\n metadata: undefined,\n parts: [...fileParts, { type: 'text', text: inputValue }],\n },\n {\n headers: options.headers,\n body: options.body,\n },\n );\n\n input.value = '';\n };\n\n const addToolResult = (\n options: Omit<\n Parameters<Chat<MESSAGE_METADATA, DATA_PART_SCHEMAS>['addToolResult']>[0],\n 'chatId'\n >,\n ) => chat.addToolResult(options);\n\n return {\n id: chat.id,\n messages,\n append,\n error,\n reload,\n stop,\n setMessages,\n input,\n handleSubmit,\n status,\n addToolResult,\n };\n}\n","import {\n AbstractChat,\n BaseChatInit,\n ChatState,\n ChatStatus,\n UIDataPartSchemas,\n UIDataTypes,\n UIMessage,\n} from 'ai';\nimport { Ref, ref } from 'vue';\n\nclass VueChatState<MESSAGE_METADATA, DATA_TYPES extends UIDataTypes>\n implements ChatState<MESSAGE_METADATA, DATA_TYPES>\n{\n private messagesRef: Ref<UIMessage<MESSAGE_METADATA, DATA_TYPES>[]>;\n private statusRef = ref<ChatStatus>('ready');\n private errorRef = ref<Error | undefined>(undefined);\n\n constructor(messages?: UIMessage<MESSAGE_METADATA, DATA_TYPES>[]) {\n this.messagesRef = ref(messages ?? []) as Ref<\n UIMessage<MESSAGE_METADATA, DATA_TYPES>[]\n >;\n }\n\n get messages(): UIMessage<MESSAGE_METADATA, DATA_TYPES>[] {\n return this.messagesRef.value;\n }\n\n set messages(messages: UIMessage<MESSAGE_METADATA, DATA_TYPES>[]) {\n this.messagesRef.value = messages;\n }\n\n get status(): ChatStatus {\n return this.statusRef.value;\n }\n\n set status(status: ChatStatus) {\n this.statusRef.value = status;\n }\n\n get error(): Error | undefined {\n return this.errorRef.value;\n }\n\n set error(error: Error | undefined) {\n this.errorRef.value = error;\n }\n\n pushMessage = (message: UIMessage<MESSAGE_METADATA, DATA_TYPES>) => {\n this.messagesRef.value.push(message);\n };\n\n popMessage = () => {\n this.messagesRef.value.pop();\n };\n\n replaceMessage = (\n index: number,\n message: UIMessage<MESSAGE_METADATA, DATA_TYPES>,\n ) => {\n // message is cloned here because vue's deep reactivity shows unexpected behavior, particularly when updating tool invocation parts\n this.messagesRef.value[index] = { ...message };\n };\n\n snapshot = <T>(value: T): T => value;\n}\n\nexport class Chat<\n MESSAGE_METADATA,\n UI_DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas,\n> extends AbstractChat<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS> {\n constructor({\n messages,\n ...init\n }: BaseChatInit<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS>) {\n super({\n ...init,\n state: new VueChatState(messages),\n });\n }\n}\n","import type { CompletionRequestOptions, UseCompletionOptions } from 'ai';\nimport { callCompletionApi } from 'ai';\nimport swrv from 'swrv';\nimport type { Ref } from 'vue';\nimport { ref, unref } from 'vue';\n\nexport type { UseCompletionOptions };\n\nexport type UseCompletionHelpers = {\n /** The current completion result */\n completion: Ref<string>;\n /** The error object of the API request */\n error: Ref<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?: CompletionRequestOptions,\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: Ref<string>;\n /**\n * Form submission handler to automatically reset input and append a user message\n * @example\n * ```jsx\n * <form @submit=\"handleSubmit\">\n * <input @change=\"handleInputChange\" v-model=\"input\" />\n * </form>\n * ```\n */\n handleSubmit: (event?: { preventDefault?: () => void }) => void;\n /** Whether the API request is in progress */\n isLoading: Ref<boolean | undefined>;\n};\n\nlet uniqueId = 0;\n\n// @ts-expect-error - some issues with the default export of useSWRV\nconst useSWRV = (swrv.default as (typeof import('swrv'))['default']) || swrv;\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 streamProtocol,\n onFinish,\n onError,\n fetch,\n}: UseCompletionOptions = {}): UseCompletionHelpers {\n // Generate an unique id for the completion if not provided.\n const completionId = id || `completion-${uniqueId++}`;\n\n const key = `${api}|${completionId}`;\n const { data, mutate: originalMutate } = useSWRV<string>(\n key,\n () => store[key] || initialCompletion,\n );\n\n const { data: isLoading, mutate: mutateLoading } = useSWRV<boolean>(\n `${completionId}-loading`,\n null,\n );\n\n isLoading.value ??= false;\n\n // Force the `data` to be `initialCompletion` if it's `undefined`.\n data.value ||= initialCompletion;\n\n const mutate = (data: string) => {\n store[key] = data;\n return originalMutate();\n };\n\n // Because of the `initialData` option, the `data` will never be `undefined`.\n const completion = data as Ref<string>;\n\n const error = ref<undefined | Error>(undefined);\n\n let abortController: AbortController | null = null;\n\n async function triggerRequest(\n prompt: string,\n options?: CompletionRequestOptions,\n ) {\n return callCompletionApi({\n api,\n prompt,\n credentials,\n headers: {\n ...headers,\n ...options?.headers,\n },\n body: {\n ...unref(body),\n ...options?.body,\n },\n streamProtocol,\n setCompletion: mutate,\n setLoading: loading => mutateLoading(() => loading),\n setError: err => {\n error.value = err;\n },\n setAbortController: controller => {\n abortController = controller;\n },\n onFinish,\n onError,\n fetch,\n });\n }\n\n const complete: UseCompletionHelpers['complete'] = async (\n prompt,\n options,\n ) => {\n return triggerRequest(prompt, options);\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 = ref(initialInput);\n\n const handleSubmit = (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n const inputValue = input.value;\n return inputValue ? complete(inputValue) : undefined;\n };\n\n return {\n completion,\n complete,\n error,\n stop,\n setCompletion,\n input,\n handleSubmit,\n isLoading,\n };\n}\n"],"mappings":"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","names":["import_ai","import_vue","options","import_ai","import_vue","swrv","data","completion","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/use-completion.ts","../src/chat.vue.ts"],"sourcesContent":["export * from './use-completion';\nexport { Chat } from './chat.vue';\n","import type { CompletionRequestOptions, UseCompletionOptions } from 'ai';\nimport { callCompletionApi } from 'ai';\nimport swrv from 'swrv';\nimport type { Ref } from 'vue';\nimport { ref, unref } from 'vue';\n\nexport type { UseCompletionOptions };\n\nexport type UseCompletionHelpers = {\n /** The current completion result */\n completion: Ref<string>;\n /** The error object of the API request */\n error: Ref<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?: CompletionRequestOptions,\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: Ref<string>;\n /**\n * Form submission handler to automatically reset input and append a user message\n * @example\n * ```jsx\n * <form @submit=\"handleSubmit\">\n * <input @change=\"handleInputChange\" v-model=\"input\" />\n * </form>\n * ```\n */\n handleSubmit: (event?: { preventDefault?: () => void }) => void;\n /** Whether the API request is in progress */\n isLoading: Ref<boolean | undefined>;\n};\n\nlet uniqueId = 0;\n\n// @ts-expect-error - some issues with the default export of useSWRV\nconst useSWRV = (swrv.default as (typeof import('swrv'))['default']) || swrv;\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 streamProtocol,\n onFinish,\n onError,\n fetch,\n}: UseCompletionOptions = {}): UseCompletionHelpers {\n // Generate an unique id for the completion if not provided.\n const completionId = id || `completion-${uniqueId++}`;\n\n const key = `${api}|${completionId}`;\n const { data, mutate: originalMutate } = useSWRV<string>(\n key,\n () => store[key] || initialCompletion,\n );\n\n const { data: isLoading, mutate: mutateLoading } = useSWRV<boolean>(\n `${completionId}-loading`,\n null,\n );\n\n isLoading.value ??= false;\n\n // Force the `data` to be `initialCompletion` if it's `undefined`.\n data.value ||= initialCompletion;\n\n const mutate = (data: string) => {\n store[key] = data;\n return originalMutate();\n };\n\n // Because of the `initialData` option, the `data` will never be `undefined`.\n const completion = data as Ref<string>;\n\n const error = ref<undefined | Error>(undefined);\n\n let abortController: AbortController | null = null;\n\n async function triggerRequest(\n prompt: string,\n options?: CompletionRequestOptions,\n ) {\n return callCompletionApi({\n api,\n prompt,\n credentials,\n headers: {\n ...headers,\n ...options?.headers,\n },\n body: {\n ...unref(body),\n ...options?.body,\n },\n streamProtocol,\n setCompletion: mutate,\n setLoading: loading => mutateLoading(() => loading),\n setError: err => {\n error.value = err;\n },\n setAbortController: controller => {\n abortController = controller;\n },\n onFinish,\n onError,\n fetch,\n });\n }\n\n const complete: UseCompletionHelpers['complete'] = async (\n prompt,\n options,\n ) => {\n return triggerRequest(prompt, options);\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 = ref(initialInput);\n\n const handleSubmit = (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n const inputValue = input.value;\n return inputValue ? complete(inputValue) : undefined;\n };\n\n return {\n completion,\n complete,\n error,\n stop,\n setCompletion,\n input,\n handleSubmit,\n isLoading,\n };\n}\n","import {\n AbstractChat,\n ChatInit as BaseChatInit,\n ChatState,\n ChatStatus,\n UIMessage,\n} from 'ai';\nimport { Ref, ref } from 'vue';\n\nclass VueChatState<UI_MESSAGE extends UIMessage>\n implements ChatState<UI_MESSAGE>\n{\n private messagesRef: Ref<UI_MESSAGE[]>;\n private statusRef = ref<ChatStatus>('ready');\n private errorRef = ref<Error | undefined>(undefined);\n\n constructor(messages?: UI_MESSAGE[]) {\n this.messagesRef = ref(messages ?? []) as Ref<UI_MESSAGE[]>;\n }\n\n get messages(): UI_MESSAGE[] {\n return this.messagesRef.value;\n }\n\n set messages(messages: UI_MESSAGE[]) {\n this.messagesRef.value = messages;\n }\n\n get status(): ChatStatus {\n return this.statusRef.value;\n }\n\n set status(status: ChatStatus) {\n this.statusRef.value = status;\n }\n\n get error(): Error | undefined {\n return this.errorRef.value;\n }\n\n set error(error: Error | undefined) {\n this.errorRef.value = error;\n }\n\n pushMessage = (message: UI_MESSAGE) => {\n this.messagesRef.value.push(message);\n };\n\n popMessage = () => {\n this.messagesRef.value.pop();\n };\n\n replaceMessage = (index: number, message: UI_MESSAGE) => {\n // message is cloned here because vue's deep reactivity shows unexpected behavior, particularly when updating tool invocation parts\n this.messagesRef.value[index] = { ...message };\n };\n\n snapshot = <T>(value: T): T => value;\n}\n\nexport class Chat<\n UI_MESSAGE extends UIMessage,\n> extends AbstractChat<UI_MESSAGE> {\n constructor({ messages, ...init }: BaseChatInit<UI_MESSAGE>) {\n super({\n ...init,\n state: new VueChatState(messages),\n });\n }\n}\n"],"mappings":"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","names":["swrv","data","completion","_a","import_ai","import_vue"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,119 +1,7 @@
|
|
|
1
|
-
// src/use-chat.ts
|
|
2
|
-
import { convertFileListToFileUIParts } from "ai";
|
|
3
|
-
import { computed, ref as ref2 } from "vue";
|
|
4
|
-
|
|
5
|
-
// src/chat.vue.ts
|
|
6
|
-
import {
|
|
7
|
-
AbstractChat
|
|
8
|
-
} from "ai";
|
|
9
|
-
import { ref } from "vue";
|
|
10
|
-
var VueChatState = class {
|
|
11
|
-
constructor(messages) {
|
|
12
|
-
this.statusRef = ref("ready");
|
|
13
|
-
this.errorRef = ref(void 0);
|
|
14
|
-
this.pushMessage = (message) => {
|
|
15
|
-
this.messagesRef.value.push(message);
|
|
16
|
-
};
|
|
17
|
-
this.popMessage = () => {
|
|
18
|
-
this.messagesRef.value.pop();
|
|
19
|
-
};
|
|
20
|
-
this.replaceMessage = (index, message) => {
|
|
21
|
-
this.messagesRef.value[index] = { ...message };
|
|
22
|
-
};
|
|
23
|
-
this.snapshot = (value) => value;
|
|
24
|
-
this.messagesRef = ref(messages != null ? messages : []);
|
|
25
|
-
}
|
|
26
|
-
get messages() {
|
|
27
|
-
return this.messagesRef.value;
|
|
28
|
-
}
|
|
29
|
-
set messages(messages) {
|
|
30
|
-
this.messagesRef.value = messages;
|
|
31
|
-
}
|
|
32
|
-
get status() {
|
|
33
|
-
return this.statusRef.value;
|
|
34
|
-
}
|
|
35
|
-
set status(status) {
|
|
36
|
-
this.statusRef.value = status;
|
|
37
|
-
}
|
|
38
|
-
get error() {
|
|
39
|
-
return this.errorRef.value;
|
|
40
|
-
}
|
|
41
|
-
set error(error) {
|
|
42
|
-
this.errorRef.value = error;
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
var Chat = class extends AbstractChat {
|
|
46
|
-
constructor({
|
|
47
|
-
messages,
|
|
48
|
-
...init
|
|
49
|
-
}) {
|
|
50
|
-
super({
|
|
51
|
-
...init,
|
|
52
|
-
state: new VueChatState(messages)
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
// src/use-chat.ts
|
|
58
|
-
function useChat({
|
|
59
|
-
initialInput = "",
|
|
60
|
-
...options
|
|
61
|
-
} = {}) {
|
|
62
|
-
const chat = "chat" in options ? options.chat : new Chat(options);
|
|
63
|
-
const messages = computed(() => chat.messages);
|
|
64
|
-
const status = computed(() => chat.status);
|
|
65
|
-
const error = computed(() => chat.error);
|
|
66
|
-
const append = async (message, { headers, body } = {}) => chat.append(message, { headers, body });
|
|
67
|
-
const reload = async ({ headers, body } = {}) => chat.reload({ headers, body });
|
|
68
|
-
const stop = () => chat.stop();
|
|
69
|
-
const setMessages = (messagesParam) => {
|
|
70
|
-
if (typeof messagesParam === "function") {
|
|
71
|
-
messagesParam = messagesParam(chat.messages);
|
|
72
|
-
}
|
|
73
|
-
chat.messages = messagesParam;
|
|
74
|
-
};
|
|
75
|
-
const input = ref2(initialInput);
|
|
76
|
-
const handleSubmit = async (event, options2 = {}) => {
|
|
77
|
-
var _a;
|
|
78
|
-
(_a = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a.call(event);
|
|
79
|
-
const inputValue = input.value;
|
|
80
|
-
const fileParts = Array.isArray(options2 == null ? void 0 : options2.files) ? options2.files : await convertFileListToFileUIParts(options2 == null ? void 0 : options2.files);
|
|
81
|
-
if (!inputValue && fileParts.length === 0)
|
|
82
|
-
return;
|
|
83
|
-
await append(
|
|
84
|
-
{
|
|
85
|
-
id: chat.generateId(),
|
|
86
|
-
role: "user",
|
|
87
|
-
metadata: void 0,
|
|
88
|
-
parts: [...fileParts, { type: "text", text: inputValue }]
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
headers: options2.headers,
|
|
92
|
-
body: options2.body
|
|
93
|
-
}
|
|
94
|
-
);
|
|
95
|
-
input.value = "";
|
|
96
|
-
};
|
|
97
|
-
const addToolResult = (options2) => chat.addToolResult(options2);
|
|
98
|
-
return {
|
|
99
|
-
id: chat.id,
|
|
100
|
-
messages,
|
|
101
|
-
append,
|
|
102
|
-
error,
|
|
103
|
-
reload,
|
|
104
|
-
stop,
|
|
105
|
-
setMessages,
|
|
106
|
-
input,
|
|
107
|
-
handleSubmit,
|
|
108
|
-
status,
|
|
109
|
-
addToolResult
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
|
|
113
1
|
// src/use-completion.ts
|
|
114
2
|
import { callCompletionApi } from "ai";
|
|
115
3
|
import swrv from "swrv";
|
|
116
|
-
import { ref
|
|
4
|
+
import { ref, unref } from "vue";
|
|
117
5
|
var uniqueId = 0;
|
|
118
6
|
var useSWRV = swrv.default || swrv;
|
|
119
7
|
var store = {};
|
|
@@ -148,7 +36,7 @@ function useCompletion({
|
|
|
148
36
|
return originalMutate();
|
|
149
37
|
};
|
|
150
38
|
const completion = data;
|
|
151
|
-
const error =
|
|
39
|
+
const error = ref(void 0);
|
|
152
40
|
let abortController = null;
|
|
153
41
|
async function triggerRequest(prompt, options) {
|
|
154
42
|
return callCompletionApi({
|
|
@@ -189,7 +77,7 @@ function useCompletion({
|
|
|
189
77
|
const setCompletion = (completion2) => {
|
|
190
78
|
mutate(completion2);
|
|
191
79
|
};
|
|
192
|
-
const input =
|
|
80
|
+
const input = ref(initialInput);
|
|
193
81
|
const handleSubmit = (event) => {
|
|
194
82
|
var _a2;
|
|
195
83
|
(_a2 = event == null ? void 0 : event.preventDefault) == null ? void 0 : _a2.call(event);
|
|
@@ -207,9 +95,57 @@ function useCompletion({
|
|
|
207
95
|
isLoading
|
|
208
96
|
};
|
|
209
97
|
}
|
|
98
|
+
|
|
99
|
+
// src/chat.vue.ts
|
|
100
|
+
import {
|
|
101
|
+
AbstractChat
|
|
102
|
+
} from "ai";
|
|
103
|
+
import { ref as ref2 } from "vue";
|
|
104
|
+
var VueChatState = class {
|
|
105
|
+
constructor(messages) {
|
|
106
|
+
this.statusRef = ref2("ready");
|
|
107
|
+
this.errorRef = ref2(void 0);
|
|
108
|
+
this.pushMessage = (message) => {
|
|
109
|
+
this.messagesRef.value.push(message);
|
|
110
|
+
};
|
|
111
|
+
this.popMessage = () => {
|
|
112
|
+
this.messagesRef.value.pop();
|
|
113
|
+
};
|
|
114
|
+
this.replaceMessage = (index, message) => {
|
|
115
|
+
this.messagesRef.value[index] = { ...message };
|
|
116
|
+
};
|
|
117
|
+
this.snapshot = (value) => value;
|
|
118
|
+
this.messagesRef = ref2(messages != null ? messages : []);
|
|
119
|
+
}
|
|
120
|
+
get messages() {
|
|
121
|
+
return this.messagesRef.value;
|
|
122
|
+
}
|
|
123
|
+
set messages(messages) {
|
|
124
|
+
this.messagesRef.value = messages;
|
|
125
|
+
}
|
|
126
|
+
get status() {
|
|
127
|
+
return this.statusRef.value;
|
|
128
|
+
}
|
|
129
|
+
set status(status) {
|
|
130
|
+
this.statusRef.value = status;
|
|
131
|
+
}
|
|
132
|
+
get error() {
|
|
133
|
+
return this.errorRef.value;
|
|
134
|
+
}
|
|
135
|
+
set error(error) {
|
|
136
|
+
this.errorRef.value = error;
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
var Chat = class extends AbstractChat {
|
|
140
|
+
constructor({ messages, ...init }) {
|
|
141
|
+
super({
|
|
142
|
+
...init,
|
|
143
|
+
state: new VueChatState(messages)
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
};
|
|
210
147
|
export {
|
|
211
148
|
Chat,
|
|
212
|
-
useChat,
|
|
213
149
|
useCompletion
|
|
214
150
|
};
|
|
215
151
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/use-chat.ts","../src/chat.vue.ts","../src/use-completion.ts"],"sourcesContent":["import type {\n BaseChatInit,\n ChatRequestOptions,\n ChatStatus,\n CreateUIMessage,\n FileUIPart,\n InferUIDataParts,\n UIDataPartSchemas,\n UIMessage,\n} from 'ai';\nimport { convertFileListToFileUIParts } from 'ai';\nimport type { Ref } from 'vue';\nimport { computed, ref } from 'vue';\nimport { Chat } from './chat.vue';\n\nexport type { CreateUIMessage, UIMessage };\n\nexport type UseChatOptions<\n MESSAGE_METADATA = unknown,\n DATA_TYPE_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas,\n> = (\n | { chat: Chat<MESSAGE_METADATA, DATA_TYPE_SCHEMAS> }\n | BaseChatInit<MESSAGE_METADATA, DATA_TYPE_SCHEMAS>\n) & {\n /**\n * Initial input of the chat.\n */\n initialInput?: string;\n};\n\nexport type UseChatHelpers<\n MESSAGE_METADATA = unknown,\n DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas,\n> = {\n /**\n * The id of the chat.\n */\n readonly id: string;\n\n /** Current messages in the chat */\n readonly messages: Ref<\n UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]\n >;\n\n /** The error object of the API request */\n readonly error: Ref<Error | undefined>;\n\n /**\n * Append a user message to the chat list. This triggers the API call to fetch\n * the assistant's response.\n *\n * @param message The message to append\n * @param options Additional options to pass to the API call\n */\n append: (\n message: CreateUIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >,\n options?: ChatRequestOptions,\n ) => Promise<void>;\n\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: (chatRequestOptions?: ChatRequestOptions) => Promise<void>;\n\n /**\n * Abort the current request immediately, keep the generated tokens if any.\n */\n stop: () => void;\n\n /**\n * Update the `messages` state locally. This is useful when you want to\n * edit the messages on the client, and then trigger the `reload` method\n * manually to regenerate the AI response.\n */\n setMessages: (\n messages:\n | UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]\n | ((\n messages: UIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >[],\n ) => UIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >[]),\n ) => void;\n\n /** The current value of the input */\n input: Ref<string>;\n\n /** Form submission handler to automatically reset input and append a user message */\n handleSubmit: (\n event?: { preventDefault?: () => void },\n chatRequestOptions?: ChatRequestOptions & {\n files?: FileList | FileUIPart[];\n },\n ) => void;\n\n /**\n * Hook status:\n *\n * - `submitted`: The message has been sent to the API and we're awaiting the start of the response stream.\n * - `streaming`: The response is actively streaming in from the API, receiving chunks of data.\n * - `ready`: The full response has been received and processed; a new user message can be submitted.\n * - `error`: An error occurred during the API request, preventing successful completion.\n */\n status: Ref<ChatStatus>;\n\n addToolResult: ({\n toolCallId,\n result,\n }: {\n toolCallId: string;\n result: any;\n }) => void;\n};\n\nexport function useChat<\n MESSAGE_METADATA = unknown,\n DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas,\n>({\n initialInput = '',\n ...options\n}: UseChatOptions<MESSAGE_METADATA, DATA_PART_SCHEMAS> = {}): UseChatHelpers<\n MESSAGE_METADATA,\n DATA_PART_SCHEMAS\n> {\n const chat = 'chat' in options ? options.chat : new Chat(options);\n\n const messages = computed(() => chat.messages);\n const status = computed(() => chat.status);\n const error = computed(() => chat.error);\n\n const append = async (\n message: CreateUIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >,\n { headers, body }: ChatRequestOptions = {},\n ) => chat.append(message, { headers, body });\n\n const reload = async ({ headers, body }: ChatRequestOptions = {}) =>\n chat.reload({ headers, body });\n\n const stop = () => chat.stop();\n\n const setMessages = (\n messagesParam:\n | UIMessage<MESSAGE_METADATA, InferUIDataParts<DATA_PART_SCHEMAS>>[]\n | ((\n messages: UIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >[],\n ) => UIMessage<\n MESSAGE_METADATA,\n InferUIDataParts<DATA_PART_SCHEMAS>\n >[]),\n ) => {\n if (typeof messagesParam === 'function') {\n messagesParam = messagesParam(chat.messages);\n }\n\n chat.messages = messagesParam;\n };\n\n const input = ref(initialInput);\n\n const handleSubmit = async (\n event?: { preventDefault?: () => void },\n options: ChatRequestOptions & { files?: FileList | FileUIPart[] } = {},\n ) => {\n event?.preventDefault?.();\n\n const inputValue = input.value;\n\n const fileParts = Array.isArray(options?.files)\n ? options.files\n : await convertFileListToFileUIParts(options?.files);\n\n if (!inputValue && fileParts.length === 0) return;\n\n await append(\n {\n id: chat.generateId(),\n role: 'user',\n metadata: undefined,\n parts: [...fileParts, { type: 'text', text: inputValue }],\n },\n {\n headers: options.headers,\n body: options.body,\n },\n );\n\n input.value = '';\n };\n\n const addToolResult = (\n options: Omit<\n Parameters<Chat<MESSAGE_METADATA, DATA_PART_SCHEMAS>['addToolResult']>[0],\n 'chatId'\n >,\n ) => chat.addToolResult(options);\n\n return {\n id: chat.id,\n messages,\n append,\n error,\n reload,\n stop,\n setMessages,\n input,\n handleSubmit,\n status,\n addToolResult,\n };\n}\n","import {\n AbstractChat,\n BaseChatInit,\n ChatState,\n ChatStatus,\n UIDataPartSchemas,\n UIDataTypes,\n UIMessage,\n} from 'ai';\nimport { Ref, ref } from 'vue';\n\nclass VueChatState<MESSAGE_METADATA, DATA_TYPES extends UIDataTypes>\n implements ChatState<MESSAGE_METADATA, DATA_TYPES>\n{\n private messagesRef: Ref<UIMessage<MESSAGE_METADATA, DATA_TYPES>[]>;\n private statusRef = ref<ChatStatus>('ready');\n private errorRef = ref<Error | undefined>(undefined);\n\n constructor(messages?: UIMessage<MESSAGE_METADATA, DATA_TYPES>[]) {\n this.messagesRef = ref(messages ?? []) as Ref<\n UIMessage<MESSAGE_METADATA, DATA_TYPES>[]\n >;\n }\n\n get messages(): UIMessage<MESSAGE_METADATA, DATA_TYPES>[] {\n return this.messagesRef.value;\n }\n\n set messages(messages: UIMessage<MESSAGE_METADATA, DATA_TYPES>[]) {\n this.messagesRef.value = messages;\n }\n\n get status(): ChatStatus {\n return this.statusRef.value;\n }\n\n set status(status: ChatStatus) {\n this.statusRef.value = status;\n }\n\n get error(): Error | undefined {\n return this.errorRef.value;\n }\n\n set error(error: Error | undefined) {\n this.errorRef.value = error;\n }\n\n pushMessage = (message: UIMessage<MESSAGE_METADATA, DATA_TYPES>) => {\n this.messagesRef.value.push(message);\n };\n\n popMessage = () => {\n this.messagesRef.value.pop();\n };\n\n replaceMessage = (\n index: number,\n message: UIMessage<MESSAGE_METADATA, DATA_TYPES>,\n ) => {\n // message is cloned here because vue's deep reactivity shows unexpected behavior, particularly when updating tool invocation parts\n this.messagesRef.value[index] = { ...message };\n };\n\n snapshot = <T>(value: T): T => value;\n}\n\nexport class Chat<\n MESSAGE_METADATA,\n UI_DATA_PART_SCHEMAS extends UIDataPartSchemas = UIDataPartSchemas,\n> extends AbstractChat<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS> {\n constructor({\n messages,\n ...init\n }: BaseChatInit<MESSAGE_METADATA, UI_DATA_PART_SCHEMAS>) {\n super({\n ...init,\n state: new VueChatState(messages),\n });\n }\n}\n","import type { CompletionRequestOptions, UseCompletionOptions } from 'ai';\nimport { callCompletionApi } from 'ai';\nimport swrv from 'swrv';\nimport type { Ref } from 'vue';\nimport { ref, unref } from 'vue';\n\nexport type { UseCompletionOptions };\n\nexport type UseCompletionHelpers = {\n /** The current completion result */\n completion: Ref<string>;\n /** The error object of the API request */\n error: Ref<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?: CompletionRequestOptions,\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: Ref<string>;\n /**\n * Form submission handler to automatically reset input and append a user message\n * @example\n * ```jsx\n * <form @submit=\"handleSubmit\">\n * <input @change=\"handleInputChange\" v-model=\"input\" />\n * </form>\n * ```\n */\n handleSubmit: (event?: { preventDefault?: () => void }) => void;\n /** Whether the API request is in progress */\n isLoading: Ref<boolean | undefined>;\n};\n\nlet uniqueId = 0;\n\n// @ts-expect-error - some issues with the default export of useSWRV\nconst useSWRV = (swrv.default as (typeof import('swrv'))['default']) || swrv;\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 streamProtocol,\n onFinish,\n onError,\n fetch,\n}: UseCompletionOptions = {}): UseCompletionHelpers {\n // Generate an unique id for the completion if not provided.\n const completionId = id || `completion-${uniqueId++}`;\n\n const key = `${api}|${completionId}`;\n const { data, mutate: originalMutate } = useSWRV<string>(\n key,\n () => store[key] || initialCompletion,\n );\n\n const { data: isLoading, mutate: mutateLoading } = useSWRV<boolean>(\n `${completionId}-loading`,\n null,\n );\n\n isLoading.value ??= false;\n\n // Force the `data` to be `initialCompletion` if it's `undefined`.\n data.value ||= initialCompletion;\n\n const mutate = (data: string) => {\n store[key] = data;\n return originalMutate();\n };\n\n // Because of the `initialData` option, the `data` will never be `undefined`.\n const completion = data as Ref<string>;\n\n const error = ref<undefined | Error>(undefined);\n\n let abortController: AbortController | null = null;\n\n async function triggerRequest(\n prompt: string,\n options?: CompletionRequestOptions,\n ) {\n return callCompletionApi({\n api,\n prompt,\n credentials,\n headers: {\n ...headers,\n ...options?.headers,\n },\n body: {\n ...unref(body),\n ...options?.body,\n },\n streamProtocol,\n setCompletion: mutate,\n setLoading: loading => mutateLoading(() => loading),\n setError: err => {\n error.value = err;\n },\n setAbortController: controller => {\n abortController = controller;\n },\n onFinish,\n onError,\n fetch,\n });\n }\n\n const complete: UseCompletionHelpers['complete'] = async (\n prompt,\n options,\n ) => {\n return triggerRequest(prompt, options);\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 = ref(initialInput);\n\n const handleSubmit = (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n const inputValue = input.value;\n return inputValue ? complete(inputValue) : undefined;\n };\n\n return {\n completion,\n complete,\n error,\n stop,\n setCompletion,\n input,\n handleSubmit,\n isLoading,\n };\n}\n"],"mappings":"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","names":["ref","ref","options","ref","data","completion","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/use-completion.ts","../src/chat.vue.ts"],"sourcesContent":["import type { CompletionRequestOptions, UseCompletionOptions } from 'ai';\nimport { callCompletionApi } from 'ai';\nimport swrv from 'swrv';\nimport type { Ref } from 'vue';\nimport { ref, unref } from 'vue';\n\nexport type { UseCompletionOptions };\n\nexport type UseCompletionHelpers = {\n /** The current completion result */\n completion: Ref<string>;\n /** The error object of the API request */\n error: Ref<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?: CompletionRequestOptions,\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: Ref<string>;\n /**\n * Form submission handler to automatically reset input and append a user message\n * @example\n * ```jsx\n * <form @submit=\"handleSubmit\">\n * <input @change=\"handleInputChange\" v-model=\"input\" />\n * </form>\n * ```\n */\n handleSubmit: (event?: { preventDefault?: () => void }) => void;\n /** Whether the API request is in progress */\n isLoading: Ref<boolean | undefined>;\n};\n\nlet uniqueId = 0;\n\n// @ts-expect-error - some issues with the default export of useSWRV\nconst useSWRV = (swrv.default as (typeof import('swrv'))['default']) || swrv;\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 streamProtocol,\n onFinish,\n onError,\n fetch,\n}: UseCompletionOptions = {}): UseCompletionHelpers {\n // Generate an unique id for the completion if not provided.\n const completionId = id || `completion-${uniqueId++}`;\n\n const key = `${api}|${completionId}`;\n const { data, mutate: originalMutate } = useSWRV<string>(\n key,\n () => store[key] || initialCompletion,\n );\n\n const { data: isLoading, mutate: mutateLoading } = useSWRV<boolean>(\n `${completionId}-loading`,\n null,\n );\n\n isLoading.value ??= false;\n\n // Force the `data` to be `initialCompletion` if it's `undefined`.\n data.value ||= initialCompletion;\n\n const mutate = (data: string) => {\n store[key] = data;\n return originalMutate();\n };\n\n // Because of the `initialData` option, the `data` will never be `undefined`.\n const completion = data as Ref<string>;\n\n const error = ref<undefined | Error>(undefined);\n\n let abortController: AbortController | null = null;\n\n async function triggerRequest(\n prompt: string,\n options?: CompletionRequestOptions,\n ) {\n return callCompletionApi({\n api,\n prompt,\n credentials,\n headers: {\n ...headers,\n ...options?.headers,\n },\n body: {\n ...unref(body),\n ...options?.body,\n },\n streamProtocol,\n setCompletion: mutate,\n setLoading: loading => mutateLoading(() => loading),\n setError: err => {\n error.value = err;\n },\n setAbortController: controller => {\n abortController = controller;\n },\n onFinish,\n onError,\n fetch,\n });\n }\n\n const complete: UseCompletionHelpers['complete'] = async (\n prompt,\n options,\n ) => {\n return triggerRequest(prompt, options);\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 = ref(initialInput);\n\n const handleSubmit = (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n const inputValue = input.value;\n return inputValue ? complete(inputValue) : undefined;\n };\n\n return {\n completion,\n complete,\n error,\n stop,\n setCompletion,\n input,\n handleSubmit,\n isLoading,\n };\n}\n","import {\n AbstractChat,\n ChatInit as BaseChatInit,\n ChatState,\n ChatStatus,\n UIMessage,\n} from 'ai';\nimport { Ref, ref } from 'vue';\n\nclass VueChatState<UI_MESSAGE extends UIMessage>\n implements ChatState<UI_MESSAGE>\n{\n private messagesRef: Ref<UI_MESSAGE[]>;\n private statusRef = ref<ChatStatus>('ready');\n private errorRef = ref<Error | undefined>(undefined);\n\n constructor(messages?: UI_MESSAGE[]) {\n this.messagesRef = ref(messages ?? []) as Ref<UI_MESSAGE[]>;\n }\n\n get messages(): UI_MESSAGE[] {\n return this.messagesRef.value;\n }\n\n set messages(messages: UI_MESSAGE[]) {\n this.messagesRef.value = messages;\n }\n\n get status(): ChatStatus {\n return this.statusRef.value;\n }\n\n set status(status: ChatStatus) {\n this.statusRef.value = status;\n }\n\n get error(): Error | undefined {\n return this.errorRef.value;\n }\n\n set error(error: Error | undefined) {\n this.errorRef.value = error;\n }\n\n pushMessage = (message: UI_MESSAGE) => {\n this.messagesRef.value.push(message);\n };\n\n popMessage = () => {\n this.messagesRef.value.pop();\n };\n\n replaceMessage = (index: number, message: UI_MESSAGE) => {\n // message is cloned here because vue's deep reactivity shows unexpected behavior, particularly when updating tool invocation parts\n this.messagesRef.value[index] = { ...message };\n };\n\n snapshot = <T>(value: T): T => value;\n}\n\nexport class Chat<\n UI_MESSAGE extends UIMessage,\n> extends AbstractChat<UI_MESSAGE> {\n constructor({ messages, ...init }: BaseChatInit<UI_MESSAGE>) {\n super({\n ...init,\n state: new VueChatState(messages),\n });\n }\n}\n"],"mappings":"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","names":["data","completion","_a","ref"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/vue",
|
|
3
|
-
"version": "2.0.0-
|
|
3
|
+
"version": "2.0.0-beta.2",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"swrv": "^1.0.4",
|
|
23
|
-
"ai": "5.0.0-
|
|
24
|
-
"@ai-sdk/provider-utils": "3.0.0-
|
|
23
|
+
"ai": "5.0.0-beta.2",
|
|
24
|
+
"@ai-sdk/provider-utils": "3.0.0-beta.2"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@testing-library/jest-dom": "^6.6.3",
|