@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 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 { UIDataPartSchemas, AbstractChat, BaseChatInit, UIMessage, InferUIDataParts, CreateUIMessage, ChatRequestOptions, FileUIPart, ChatStatus, CompletionRequestOptions, UseCompletionOptions } from 'ai';
2
- export { CreateUIMessage, UIMessage, UseCompletionOptions } from 'ai';
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
- export { Chat, UseChatHelpers, UseChatOptions, UseCompletionHelpers, useChat, useCompletion };
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 { UIDataPartSchemas, AbstractChat, BaseChatInit, UIMessage, InferUIDataParts, CreateUIMessage, ChatRequestOptions, FileUIPart, ChatStatus, CompletionRequestOptions, UseCompletionOptions } from 'ai';
2
- export { CreateUIMessage, UIMessage, UseCompletionOptions } from 'ai';
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
- export { Chat, UseChatHelpers, UseChatOptions, UseCompletionHelpers, useChat, useCompletion };
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 import_ai3 = require("ai");
39
+ var import_ai = require("ai");
151
40
  var import_swrv = __toESM(require("swrv"));
152
- var import_vue3 = require("vue");
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, import_vue3.ref)(void 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, import_ai3.callCompletionApi)({
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, import_vue3.unref)(body),
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, import_vue3.ref)(initialInput);
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 as ref3, unref } from "vue";
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 = ref3(void 0);
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 = ref3(initialInput);
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
@@ -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-alpha.9",
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-alpha.9",
24
- "@ai-sdk/provider-utils": "3.0.0-alpha.9"
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",