@ai-sdk/angular 1.0.0-beta.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +353 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,358 @@
|
|
|
1
1
|
# @ai-sdk/angular
|
|
2
2
|
|
|
3
|
+
## 1.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 654ff2b: Add Angular support
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- ac34802: Add clear object function to React and Angular packages
|
|
12
|
+
- 205077b: fix: improve Zod compatibility
|
|
13
|
+
- Updated dependencies [e1cbf8a]
|
|
14
|
+
- Updated dependencies [a571d6e]
|
|
15
|
+
- Updated dependencies [de2d2ab]
|
|
16
|
+
- Updated dependencies [c22ad54]
|
|
17
|
+
- Updated dependencies [a847c3e]
|
|
18
|
+
- Updated dependencies [13fef90]
|
|
19
|
+
- Updated dependencies [d88455d]
|
|
20
|
+
- Updated dependencies [e7fcc86]
|
|
21
|
+
- Updated dependencies [da1e6f0]
|
|
22
|
+
- Updated dependencies [48378b9]
|
|
23
|
+
- Updated dependencies [5d1e3ba]
|
|
24
|
+
- Updated dependencies [d964901]
|
|
25
|
+
- Updated dependencies [45c1ea2]
|
|
26
|
+
- Updated dependencies [93d53a1]
|
|
27
|
+
- Updated dependencies [e90d45d]
|
|
28
|
+
- Updated dependencies [b32c141]
|
|
29
|
+
- Updated dependencies [bc3109f]
|
|
30
|
+
- Updated dependencies [0a710d8]
|
|
31
|
+
- Updated dependencies [0d9583c]
|
|
32
|
+
- Updated dependencies [060370c]
|
|
33
|
+
- Updated dependencies [9ad0484]
|
|
34
|
+
- Updated dependencies [38ae5cc]
|
|
35
|
+
- Updated dependencies [10b21eb]
|
|
36
|
+
- Updated dependencies [63f9e9b]
|
|
37
|
+
- Updated dependencies [5d142ab]
|
|
38
|
+
- Updated dependencies [ab7ccef]
|
|
39
|
+
- Updated dependencies [d5f588f]
|
|
40
|
+
- Updated dependencies [9e40cbe]
|
|
41
|
+
- Updated dependencies [6909543]
|
|
42
|
+
- Updated dependencies [86cfc72]
|
|
43
|
+
- Updated dependencies [ec78cdc]
|
|
44
|
+
- Updated dependencies [e025824]
|
|
45
|
+
- Updated dependencies [377bbcf]
|
|
46
|
+
- Updated dependencies [0571b98]
|
|
47
|
+
- Updated dependencies [6a83f7d]
|
|
48
|
+
- Updated dependencies [d8aeaef]
|
|
49
|
+
- Updated dependencies [ae77a99]
|
|
50
|
+
- Updated dependencies [4fef487]
|
|
51
|
+
- Updated dependencies [b1e3abd]
|
|
52
|
+
- Updated dependencies [4f3e637]
|
|
53
|
+
- Updated dependencies [0c0c0b3]
|
|
54
|
+
- Updated dependencies [db345da]
|
|
55
|
+
- Updated dependencies [496bbc1]
|
|
56
|
+
- Updated dependencies [14cb3be]
|
|
57
|
+
- Updated dependencies [1f6ce57]
|
|
58
|
+
- Updated dependencies [72d7d72]
|
|
59
|
+
- Updated dependencies [40acf9b]
|
|
60
|
+
- Updated dependencies [98f25e5]
|
|
61
|
+
- Updated dependencies [16ccfb2]
|
|
62
|
+
- Updated dependencies [225f087]
|
|
63
|
+
- Updated dependencies [ce1d1f3]
|
|
64
|
+
- Updated dependencies [fc0380b]
|
|
65
|
+
- Updated dependencies [b7eae2d]
|
|
66
|
+
- Updated dependencies [2d03e19]
|
|
67
|
+
- Updated dependencies [6622441]
|
|
68
|
+
- Updated dependencies [4048ce3]
|
|
69
|
+
- Updated dependencies [6c42e56]
|
|
70
|
+
- Updated dependencies [bedb239]
|
|
71
|
+
- Updated dependencies [da70d79]
|
|
72
|
+
- Updated dependencies [9b4d074]
|
|
73
|
+
- Updated dependencies [c60f895]
|
|
74
|
+
- Updated dependencies [bcea599]
|
|
75
|
+
- Updated dependencies [c8fce91]
|
|
76
|
+
- Updated dependencies [655cf3c]
|
|
77
|
+
- Updated dependencies [3e10408]
|
|
78
|
+
- Updated dependencies [d5ae088]
|
|
79
|
+
- Updated dependencies [ced8eee]
|
|
80
|
+
- Updated dependencies [c040e2f]
|
|
81
|
+
- Updated dependencies [8ba77a7]
|
|
82
|
+
- Updated dependencies [d3960e3]
|
|
83
|
+
- Updated dependencies [0560977]
|
|
84
|
+
- Updated dependencies [faea29f]
|
|
85
|
+
- Updated dependencies [66af894]
|
|
86
|
+
- Updated dependencies [332167b]
|
|
87
|
+
- Updated dependencies [9477ebb]
|
|
88
|
+
- Updated dependencies [6b1c55c]
|
|
89
|
+
- Updated dependencies [5a975a4]
|
|
90
|
+
- Updated dependencies [1f55c21]
|
|
91
|
+
- Updated dependencies [507ac1d]
|
|
92
|
+
- Updated dependencies [a166433]
|
|
93
|
+
- Updated dependencies [e7dc6c7]
|
|
94
|
+
- Updated dependencies [26735b5]
|
|
95
|
+
- Updated dependencies [c93a8bc]
|
|
96
|
+
- Updated dependencies [8b86e99]
|
|
97
|
+
- Updated dependencies [0d2c085]
|
|
98
|
+
- Updated dependencies [2b9bbcd]
|
|
99
|
+
- Updated dependencies [04d5063]
|
|
100
|
+
- Updated dependencies [a8c8bd5]
|
|
101
|
+
- Updated dependencies [75c3396]
|
|
102
|
+
- Updated dependencies [cb9c9e4]
|
|
103
|
+
- Updated dependencies [319b989]
|
|
104
|
+
- Updated dependencies [14c9410]
|
|
105
|
+
- Updated dependencies [9bf7291]
|
|
106
|
+
- Updated dependencies [9b0da33]
|
|
107
|
+
- Updated dependencies [a34eb39]
|
|
108
|
+
- Updated dependencies [28ad69e]
|
|
109
|
+
- Updated dependencies [0b78e17]
|
|
110
|
+
- Updated dependencies [9f95b35]
|
|
111
|
+
- Updated dependencies [20398f2]
|
|
112
|
+
- Updated dependencies [66962ed]
|
|
113
|
+
- Updated dependencies [f04fb4a]
|
|
114
|
+
- Updated dependencies [b71fe8d]
|
|
115
|
+
- Updated dependencies [f7e8bf4]
|
|
116
|
+
- Updated dependencies [7827a49]
|
|
117
|
+
- Updated dependencies [48d675a]
|
|
118
|
+
- Updated dependencies [257224b]
|
|
119
|
+
- Updated dependencies [bd8a36c]
|
|
120
|
+
- Updated dependencies [d9209ca]
|
|
121
|
+
- Updated dependencies [b346545]
|
|
122
|
+
- Updated dependencies [05d2819]
|
|
123
|
+
- Updated dependencies [f2b041e]
|
|
124
|
+
- Updated dependencies [2a62513]
|
|
125
|
+
- Updated dependencies [143c55b]
|
|
126
|
+
- Updated dependencies [9301f86]
|
|
127
|
+
- Updated dependencies [904fa5e]
|
|
128
|
+
- Updated dependencies [fd1924b]
|
|
129
|
+
- Updated dependencies [0a87932]
|
|
130
|
+
- Updated dependencies [2524fc7]
|
|
131
|
+
- Updated dependencies [957b739]
|
|
132
|
+
- Updated dependencies [1675396]
|
|
133
|
+
- Updated dependencies [51f497d]
|
|
134
|
+
- Updated dependencies [cee64b2]
|
|
135
|
+
- Updated dependencies [6fba4c7]
|
|
136
|
+
- Updated dependencies [b4b4bb2]
|
|
137
|
+
- Updated dependencies [f04ffe4]
|
|
138
|
+
- Updated dependencies [bc24722]
|
|
139
|
+
- Updated dependencies [b6f9f3c]
|
|
140
|
+
- Updated dependencies [8aa9e20]
|
|
141
|
+
- Updated dependencies [4617fab]
|
|
142
|
+
- Updated dependencies [8255639]
|
|
143
|
+
- Updated dependencies [f81c720]
|
|
144
|
+
- Updated dependencies [441d042]
|
|
145
|
+
- Updated dependencies [cf9af6e]
|
|
146
|
+
- Updated dependencies [ef256ed]
|
|
147
|
+
- Updated dependencies [ee38081]
|
|
148
|
+
- Updated dependencies [2e4f9e4]
|
|
149
|
+
- Updated dependencies [516be5b]
|
|
150
|
+
- Updated dependencies [a662dea]
|
|
151
|
+
- Updated dependencies [d884051]
|
|
152
|
+
- Updated dependencies [3e3b9df]
|
|
153
|
+
- Updated dependencies [cda32ba]
|
|
154
|
+
- Updated dependencies [ac34802]
|
|
155
|
+
- Updated dependencies [e8324c5]
|
|
156
|
+
- Updated dependencies [fafc3f2]
|
|
157
|
+
- Updated dependencies [48a7606]
|
|
158
|
+
- Updated dependencies [cb68df0]
|
|
159
|
+
- Updated dependencies [db64cbe]
|
|
160
|
+
- Updated dependencies [97c35c0]
|
|
161
|
+
- Updated dependencies [1ed0287]
|
|
162
|
+
- Updated dependencies [26695a3]
|
|
163
|
+
- Updated dependencies [90ac328]
|
|
164
|
+
- Updated dependencies [c9ad635]
|
|
165
|
+
- Updated dependencies [60132dd]
|
|
166
|
+
- Updated dependencies [c7710a9]
|
|
167
|
+
- Updated dependencies [4a1e0c8]
|
|
168
|
+
- Updated dependencies [bfbfc4c]
|
|
169
|
+
- Updated dependencies [c6b64a7]
|
|
170
|
+
- Updated dependencies [fccf75c]
|
|
171
|
+
- Updated dependencies [9ae327d]
|
|
172
|
+
- Updated dependencies [9315076]
|
|
173
|
+
- Updated dependencies [247ee0c]
|
|
174
|
+
- Updated dependencies [9121250]
|
|
175
|
+
- Updated dependencies [ea27cc6]
|
|
176
|
+
- Updated dependencies [90ca2b9]
|
|
177
|
+
- Updated dependencies [50f0362]
|
|
178
|
+
- Updated dependencies [109c0ac]
|
|
179
|
+
- Updated dependencies [954aa73]
|
|
180
|
+
- Updated dependencies [63d791d]
|
|
181
|
+
- Updated dependencies [33eb499]
|
|
182
|
+
- Updated dependencies [825e8d7]
|
|
183
|
+
- Updated dependencies [87b828f]
|
|
184
|
+
- Updated dependencies [901df02]
|
|
185
|
+
- Updated dependencies [7d97ab6]
|
|
186
|
+
- Updated dependencies [4892798]
|
|
187
|
+
- Updated dependencies [bfdca8d]
|
|
188
|
+
- Updated dependencies [0ff02bb]
|
|
189
|
+
- Updated dependencies [c25cbce]
|
|
190
|
+
- Updated dependencies [4f3776c]
|
|
191
|
+
- Updated dependencies [9338f3e]
|
|
192
|
+
- Updated dependencies [b33ed7a]
|
|
193
|
+
- Updated dependencies [92c8e66]
|
|
194
|
+
- Updated dependencies [53569b8]
|
|
195
|
+
- Updated dependencies [82aa95d]
|
|
196
|
+
- Updated dependencies [ed675de]
|
|
197
|
+
- Updated dependencies [39a4fab]
|
|
198
|
+
- Updated dependencies [e7d2ce3]
|
|
199
|
+
- Updated dependencies [add5ac1]
|
|
200
|
+
- Updated dependencies [37a916d]
|
|
201
|
+
- Updated dependencies [30ac566]
|
|
202
|
+
- Updated dependencies [8026705]
|
|
203
|
+
- Updated dependencies [9bd5ab5]
|
|
204
|
+
- Updated dependencies [ec5933d]
|
|
205
|
+
- Updated dependencies [57edfcb]
|
|
206
|
+
- Updated dependencies [09f41ac]
|
|
207
|
+
- Updated dependencies [7bb58d4]
|
|
208
|
+
- Updated dependencies [faf8446]
|
|
209
|
+
- Updated dependencies [ff1c81a]
|
|
210
|
+
- Updated dependencies [af1d5a5]
|
|
211
|
+
- Updated dependencies [cb3b9c9]
|
|
212
|
+
- Updated dependencies [86293e5]
|
|
213
|
+
- Updated dependencies [d1a034f]
|
|
214
|
+
- Updated dependencies [fd65bc6]
|
|
215
|
+
- Updated dependencies [ea7a7c9]
|
|
216
|
+
- Updated dependencies [d92b9a8]
|
|
217
|
+
- Updated dependencies [102b066]
|
|
218
|
+
- Updated dependencies [142576e]
|
|
219
|
+
- Updated dependencies [84343eb]
|
|
220
|
+
- Updated dependencies [0463011]
|
|
221
|
+
- Updated dependencies [a76a62b]
|
|
222
|
+
- Updated dependencies [89ba235]
|
|
223
|
+
- Updated dependencies [8e31d46]
|
|
224
|
+
- Updated dependencies [dcc549b]
|
|
225
|
+
- Updated dependencies [35fc02c]
|
|
226
|
+
- Updated dependencies [64f6d64]
|
|
227
|
+
- Updated dependencies [bd398e4]
|
|
228
|
+
- Updated dependencies [88a8ee5]
|
|
229
|
+
- Updated dependencies [41fa418]
|
|
230
|
+
- Updated dependencies [205077b]
|
|
231
|
+
- Updated dependencies [d91b50d]
|
|
232
|
+
- Updated dependencies [e4c8647]
|
|
233
|
+
- Updated dependencies [71f938d]
|
|
234
|
+
- Updated dependencies [c808e4d]
|
|
235
|
+
- Updated dependencies [175b868]
|
|
236
|
+
- Updated dependencies [28a5ed5]
|
|
237
|
+
- Updated dependencies [e862b5b]
|
|
238
|
+
- Updated dependencies [395c85e]
|
|
239
|
+
- Updated dependencies [60e2c56]
|
|
240
|
+
- Updated dependencies [5bdff05]
|
|
241
|
+
- Updated dependencies [13b4f46]
|
|
242
|
+
- Updated dependencies [a4f3007]
|
|
243
|
+
- Updated dependencies [8e64e9c]
|
|
244
|
+
- Updated dependencies [765f1cd]
|
|
245
|
+
- Updated dependencies [cb2b53a]
|
|
246
|
+
- Updated dependencies [b983b51]
|
|
247
|
+
- Updated dependencies [e244a78]
|
|
248
|
+
- Updated dependencies [d306260]
|
|
249
|
+
- Updated dependencies [4bfe9ec]
|
|
250
|
+
- Updated dependencies [56c232b]
|
|
251
|
+
- Updated dependencies [1766ede]
|
|
252
|
+
- Updated dependencies [7324c21]
|
|
253
|
+
- Updated dependencies [2877a74]
|
|
254
|
+
- Updated dependencies [f10304b]
|
|
255
|
+
- Updated dependencies [dd5fd43]
|
|
256
|
+
- Updated dependencies [a753b3a]
|
|
257
|
+
- Updated dependencies [1409e13]
|
|
258
|
+
- Updated dependencies [383cbfa]
|
|
259
|
+
- Updated dependencies [27deb4d]
|
|
260
|
+
- Updated dependencies [5f2b3d4]
|
|
261
|
+
- Updated dependencies [4c8f834]
|
|
262
|
+
- Updated dependencies [f2c7f19]
|
|
263
|
+
- Updated dependencies [b32e192]
|
|
264
|
+
- Updated dependencies [92cb0a2]
|
|
265
|
+
- Updated dependencies [2b637d6]
|
|
266
|
+
- Updated dependencies [7bd025b]
|
|
267
|
+
- ai@5.0.0
|
|
268
|
+
- @ai-sdk/provider-utils@3.0.0
|
|
269
|
+
|
|
270
|
+
## 1.0.0-beta.17
|
|
271
|
+
|
|
272
|
+
### Patch Changes
|
|
273
|
+
|
|
274
|
+
- Updated dependencies [53569b8]
|
|
275
|
+
- Updated dependencies [88a8ee5]
|
|
276
|
+
- Updated dependencies [f2c7f19]
|
|
277
|
+
- ai@5.0.0-beta.34
|
|
278
|
+
- @ai-sdk/provider-utils@3.0.0-beta.10
|
|
279
|
+
|
|
280
|
+
## 1.0.0-beta.16
|
|
281
|
+
|
|
282
|
+
### Patch Changes
|
|
283
|
+
|
|
284
|
+
- Updated dependencies [48378b9]
|
|
285
|
+
- Updated dependencies [93d53a1]
|
|
286
|
+
- Updated dependencies [27deb4d]
|
|
287
|
+
- ai@5.0.0-beta.33
|
|
288
|
+
- @ai-sdk/provider-utils@3.0.0-beta.9
|
|
289
|
+
|
|
290
|
+
## 1.0.0-beta.15
|
|
291
|
+
|
|
292
|
+
### Patch Changes
|
|
293
|
+
|
|
294
|
+
- Updated dependencies [bc24722]
|
|
295
|
+
- Updated dependencies [13b4f46]
|
|
296
|
+
- Updated dependencies [56c232b]
|
|
297
|
+
- ai@5.0.0-beta.32
|
|
298
|
+
|
|
299
|
+
## 1.0.0-beta.14
|
|
300
|
+
|
|
301
|
+
### Patch Changes
|
|
302
|
+
|
|
303
|
+
- Updated dependencies [6622441]
|
|
304
|
+
- Updated dependencies [ced8eee]
|
|
305
|
+
- Updated dependencies [cee64b2]
|
|
306
|
+
- Updated dependencies [ee38081]
|
|
307
|
+
- Updated dependencies [dd5fd43]
|
|
308
|
+
- ai@5.0.0-beta.31
|
|
309
|
+
- @ai-sdk/provider-utils@3.0.0-beta.8
|
|
310
|
+
|
|
311
|
+
## 1.0.0-beta.13
|
|
312
|
+
|
|
313
|
+
### Patch Changes
|
|
314
|
+
|
|
315
|
+
- ai@5.0.0-beta.30
|
|
316
|
+
|
|
317
|
+
## 1.0.0-beta.12
|
|
318
|
+
|
|
319
|
+
### Patch Changes
|
|
320
|
+
|
|
321
|
+
- Updated dependencies [e7fcc86]
|
|
322
|
+
- Updated dependencies [d92b9a8]
|
|
323
|
+
- @ai-sdk/provider-utils@3.0.0-beta.7
|
|
324
|
+
- ai@5.0.0-beta.29
|
|
325
|
+
|
|
326
|
+
## 1.0.0-beta.11
|
|
327
|
+
|
|
328
|
+
### Patch Changes
|
|
329
|
+
|
|
330
|
+
- ac34802: Add clear object function to React and Angular packages
|
|
331
|
+
- Updated dependencies [ac34802]
|
|
332
|
+
- Updated dependencies [84343eb]
|
|
333
|
+
- Updated dependencies [a753b3a]
|
|
334
|
+
- @ai-sdk/provider-utils@3.0.0-beta.6
|
|
335
|
+
- ai@5.0.0-beta.28
|
|
336
|
+
|
|
337
|
+
## 1.0.0-beta.10
|
|
338
|
+
|
|
339
|
+
### Patch Changes
|
|
340
|
+
|
|
341
|
+
- Updated dependencies [d5ae088]
|
|
342
|
+
- ai@5.0.0-beta.27
|
|
343
|
+
|
|
344
|
+
## 1.0.0-beta.9
|
|
345
|
+
|
|
346
|
+
### Patch Changes
|
|
347
|
+
|
|
348
|
+
- Updated dependencies [ae77a99]
|
|
349
|
+
- Updated dependencies [1f6ce57]
|
|
350
|
+
- Updated dependencies [5a975a4]
|
|
351
|
+
- Updated dependencies [2a62513]
|
|
352
|
+
- Updated dependencies [904fa5e]
|
|
353
|
+
- Updated dependencies [f81c720]
|
|
354
|
+
- ai@5.0.0-beta.26
|
|
355
|
+
|
|
3
356
|
## 1.0.0-beta.8
|
|
4
357
|
|
|
5
358
|
### Patch Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -110,6 +110,7 @@ declare class StructuredObject<SCHEMA extends z3.Schema | z4.core.$ZodType | Sch
|
|
|
110
110
|
* Calls the API with the provided input as JSON body.
|
|
111
111
|
*/
|
|
112
112
|
submit: (input: INPUT) => Promise<void>;
|
|
113
|
+
clear: () => void;
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
export { Chat, Completion, CompletionOptions, StructuredObject, StructuredObjectOptions };
|
package/dist/index.d.ts
CHANGED
|
@@ -110,6 +110,7 @@ declare class StructuredObject<SCHEMA extends z3.Schema | z4.core.$ZodType | Sch
|
|
|
110
110
|
* Calls the API with the provided input as JSON body.
|
|
111
111
|
*/
|
|
112
112
|
submit: (input: INPUT) => Promise<void>;
|
|
113
|
+
clear: () => void;
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
export { Chat, Completion, CompletionOptions, StructuredObject, StructuredObjectOptions };
|
package/dist/index.js
CHANGED
|
@@ -207,9 +207,8 @@ var StructuredObject = class {
|
|
|
207
207
|
*/
|
|
208
208
|
this.submit = async (input) => {
|
|
209
209
|
try {
|
|
210
|
-
this.#
|
|
210
|
+
this.#clearObject();
|
|
211
211
|
this.#loading.set(true);
|
|
212
|
-
this.#error.set(void 0);
|
|
213
212
|
const abortController = new AbortController();
|
|
214
213
|
this.#abortController = abortController;
|
|
215
214
|
const actualFetch = this.options.fetch ?? fetch;
|
|
@@ -282,6 +281,15 @@ var StructuredObject = class {
|
|
|
282
281
|
this.#error.set(coalescedError);
|
|
283
282
|
}
|
|
284
283
|
};
|
|
284
|
+
this.clear = () => {
|
|
285
|
+
this.stop();
|
|
286
|
+
this.#clearObject();
|
|
287
|
+
};
|
|
288
|
+
this.#clearObject = () => {
|
|
289
|
+
this.#object.set(void 0);
|
|
290
|
+
this.#error.set(void 0);
|
|
291
|
+
this.#loading.set(false);
|
|
292
|
+
};
|
|
285
293
|
this.options = options;
|
|
286
294
|
this.id = options.id ?? (0, import_provider_utils.generateId)();
|
|
287
295
|
this.#object.set(options.initialValue);
|
|
@@ -306,6 +314,7 @@ var StructuredObject = class {
|
|
|
306
314
|
get loading() {
|
|
307
315
|
return this.#loading();
|
|
308
316
|
}
|
|
317
|
+
#clearObject;
|
|
309
318
|
};
|
|
310
319
|
// Annotate the CommonJS export names for ESM import in node:
|
|
311
320
|
0 && (module.exports = {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/lib/chat.ng.ts","../src/lib/completion.ng.ts","../src/lib/structured-object.ng.ts"],"sourcesContent":["export { Chat } from './lib/chat.ng';\nexport { Completion, type CompletionOptions } from './lib/completion.ng';\nexport {\n StructuredObject,\n type StructuredObjectOptions,\n} from './lib/structured-object.ng';\n","import { signal } from '@angular/core';\nimport {\n type ChatState,\n type ChatStatus,\n type UIMessage,\n type ChatInit,\n AbstractChat,\n} from 'ai';\n\nexport class Chat<\n UI_MESSAGE extends UIMessage = UIMessage,\n> extends AbstractChat<UI_MESSAGE> {\n constructor(init: ChatInit<UI_MESSAGE>) {\n super({\n ...init,\n state: new AngularChatState(init.messages),\n });\n }\n}\n\nclass AngularChatState<UI_MESSAGE extends UIMessage = UIMessage>\n implements ChatState<UI_MESSAGE>\n{\n readonly #messages = signal<UI_MESSAGE[]>([]);\n readonly #status = signal<ChatStatus>('ready');\n readonly #error = signal<Error | undefined>(undefined);\n\n get messages(): UI_MESSAGE[] {\n return this.#messages();\n }\n\n set messages(messages: UI_MESSAGE[]) {\n this.#messages.set([...messages]);\n }\n\n get status(): ChatStatus {\n return this.#status();\n }\n\n set status(status: ChatStatus) {\n this.#status.set(status);\n }\n\n get error(): Error | undefined {\n return this.#error();\n }\n\n set error(error: Error | undefined) {\n this.#error.set(error);\n }\n\n constructor(initialMessages: UI_MESSAGE[] = []) {\n this.#messages.set([...initialMessages]);\n }\n\n setMessages = (messages: UI_MESSAGE[]) => {\n this.#messages.set([...messages]);\n };\n\n pushMessage = (message: UI_MESSAGE) => {\n this.#messages.update(msgs => [...msgs, message]);\n };\n\n popMessage = () => {\n this.#messages.update(msgs => msgs.slice(0, -1));\n };\n\n replaceMessage = (index: number, message: UI_MESSAGE) => {\n this.#messages.update(msgs => {\n const copy = [...msgs];\n copy[index] = message;\n return copy;\n });\n };\n\n snapshot = <T>(thing: T): T => structuredClone(thing);\n}\n","import { signal } from '@angular/core';\nimport {\n callCompletionApi,\n generateId,\n type CompletionRequestOptions,\n type UseCompletionOptions,\n} from 'ai';\n\nexport type CompletionOptions = Readonly<UseCompletionOptions>;\n\nexport class Completion {\n readonly #options: CompletionOptions;\n\n // Static config\n readonly id: string;\n readonly api: string;\n readonly streamProtocol: 'data' | 'text';\n\n // Reactive state\n readonly #input = signal('');\n readonly #completion = signal<string>('');\n readonly #error = signal<Error | undefined>(undefined);\n readonly #loading = signal<boolean>(false);\n\n #abortController: AbortController | null = null;\n\n constructor(options: CompletionOptions = {}) {\n this.#options = options;\n this.#completion.set(options.initialCompletion ?? '');\n this.#input.set(options.initialInput ?? '');\n this.api = options.api ?? '/api/completion';\n this.id = options.id ?? generateId();\n this.streamProtocol = options.streamProtocol ?? 'data';\n }\n\n /** Current value of the completion. Writable. */\n get completion(): string {\n return this.#completion();\n }\n set completion(value: string) {\n this.#completion.set(value);\n }\n\n /** Current value of the input. Writable. */\n get input(): string {\n return this.#input();\n }\n set input(value: string) {\n this.#input.set(value);\n }\n\n /** The error object of the API request */\n get error(): Error | undefined {\n return this.#error();\n }\n\n /** Flag that indicates whether an API request is in progress. */\n get loading(): boolean {\n return this.#loading();\n }\n\n /** Abort the current request immediately, keep the generated tokens if any. */\n stop = () => {\n try {\n this.#abortController?.abort();\n } catch {\n // ignore\n } finally {\n this.#loading.set(false);\n this.#abortController = null;\n }\n };\n\n /** Send a new prompt to the API endpoint and update the completion state. */\n complete = async (prompt: string, options?: CompletionRequestOptions) =>\n this.#triggerRequest(prompt, options);\n\n /** Form submission handler to automatically reset input and call the completion API */\n handleSubmit = async (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n if (this.#input()) {\n await this.complete(this.#input());\n }\n };\n\n #triggerRequest = async (\n prompt: string,\n options?: CompletionRequestOptions,\n ) => {\n return callCompletionApi({\n api: this.api,\n prompt,\n credentials: this.#options.credentials,\n headers: { ...this.#options.headers, ...options?.headers },\n body: {\n ...this.#options.body,\n ...options?.body,\n },\n streamProtocol: this.streamProtocol,\n fetch: this.#options.fetch,\n setCompletion: (completion: string) => {\n this.#completion.set(completion);\n },\n setLoading: (loading: boolean) => {\n this.#loading.set(loading);\n },\n setError: (error: any) => {\n this.#error.set(error);\n },\n setAbortController: abortController => {\n this.#abortController = abortController ?? null;\n },\n onFinish: this.#options.onFinish,\n onError: this.#options.onError,\n });\n };\n}\n","import {\n generateId,\n isAbortError,\n safeValidateTypes,\n type FetchFunction,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { signal } from '@angular/core';\nimport {\n asSchema,\n isDeepEqualData,\n parsePartialJson,\n type DeepPartial,\n type Schema,\n} from 'ai';\nimport type * as z3 from 'zod/v3';\nimport type * as z4 from 'zod/v4';\n\nexport type StructuredObjectOptions<\n SCHEMA extends z3.Schema | z4.core.$ZodType | Schema,\n RESULT = InferSchema<SCHEMA>,\n> = {\n /**\n * The API endpoint. It should stream JSON that matches the schema as chunked text.\n */\n api: string;\n\n /**\n * A Zod schema that defines the shape of the complete object.\n */\n schema: SCHEMA;\n\n /**\n * A unique identifier. If not provided, a random one will be\n * generated. When provided, the `useObject` hook with the same `id` will\n * have shared states across components.\n */\n id?: string;\n\n /**\n * An optional value for the initial object.\n */\n initialValue?: DeepPartial<RESULT>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Callback that is called when the stream has finished.\n */\n onFinish?: (event: {\n /**\n * The generated object (typed according to the schema).\n * Can be undefined if the final object does not match the schema.\n */\n object: RESULT | undefined;\n\n /**\n * Optional error object. This is e.g. a TypeValidationError when the final object does not match the schema.\n */\n error: Error | undefined;\n }) => Promise<void> | void;\n\n /**\n * Callback function to be called when an error is encountered.\n */\n onError?: (error: Error) => void;\n\n /**\n * Additional HTTP headers to be included in the request.\n */\n headers?: Record<string, string> | Headers;\n\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: RequestCredentials;\n};\n\nexport class StructuredObject<\n SCHEMA extends z3.Schema | z4.core.$ZodType | Schema,\n RESULT = InferSchema<SCHEMA>,\n INPUT = unknown,\n> {\n readonly options: StructuredObjectOptions<SCHEMA, RESULT>;\n readonly id: string;\n #abortController: AbortController | undefined;\n\n // Reactive state\n readonly #object = signal<DeepPartial<RESULT> | undefined>(undefined);\n readonly #loading = signal<boolean>(false);\n readonly #error = signal<Error | undefined>(undefined);\n\n /**\n * The current value for the generated object. Updated as the API streams JSON chunks.\n */\n get object(): DeepPartial<RESULT> | undefined {\n return this.#object();\n }\n\n /** The error object of the API request */\n get error(): Error | undefined {\n return this.#error();\n }\n\n /**\n * Flag that indicates whether an API request is in progress.\n */\n get loading(): boolean {\n return this.#loading();\n }\n\n constructor(options: StructuredObjectOptions<SCHEMA, RESULT>) {\n this.options = options;\n this.id = options.id ?? generateId();\n this.#object.set(options.initialValue);\n }\n\n /**\n * Abort the current request immediately, keep the current partial object if any.\n */\n stop = () => {\n try {\n this.#abortController?.abort();\n } catch {\n // ignore\n } finally {\n this.#loading.set(false);\n this.#abortController = undefined;\n }\n };\n\n /**\n * Calls the API with the provided input as JSON body.\n */\n submit = async (input: INPUT) => {\n try {\n this.#object.set(undefined); // reset the data\n this.#loading.set(true);\n this.#error.set(undefined);\n\n const abortController = new AbortController();\n this.#abortController = abortController;\n\n const actualFetch = this.options.fetch ?? fetch;\n const response = await actualFetch(this.options.api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.options.headers,\n },\n credentials: this.options.credentials,\n signal: abortController.signal,\n body: JSON.stringify(input),\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the response.',\n );\n }\n\n if (response.body == null) {\n throw new Error('The response body is empty.');\n }\n\n let accumulatedText = '';\n let latestObject: DeepPartial<RESULT> | undefined = undefined;\n\n await response.body.pipeThrough(new TextDecoderStream()).pipeTo(\n new WritableStream<string>({\n write: async chunk => {\n if (abortController?.signal.aborted) {\n throw new DOMException('Stream aborted', 'AbortError');\n }\n accumulatedText += chunk;\n\n const { value } = await parsePartialJson(accumulatedText);\n const currentObject = value as DeepPartial<RESULT>;\n\n if (!isDeepEqualData(latestObject, currentObject)) {\n latestObject = currentObject;\n\n this.#object.set(currentObject);\n }\n },\n\n close: async () => {\n this.#loading.set(false);\n this.#abortController = undefined;\n\n if (this.options.onFinish != null) {\n const validationResult = await safeValidateTypes({\n value: latestObject,\n schema: asSchema(this.options.schema),\n });\n\n if (validationResult.success) {\n this.options.onFinish({\n object: validationResult.value,\n error: undefined,\n });\n } else {\n this.options.onFinish({\n object: undefined,\n error: (validationResult as { error: Error }).error,\n });\n }\n }\n },\n }),\n );\n } catch (error) {\n if (isAbortError(error)) {\n return;\n }\n\n const coalescedError =\n error instanceof Error ? error : new Error(String(error));\n if (this.options.onError) {\n this.options.onError(coalescedError);\n }\n\n this.#loading.set(false);\n this.#error.set(coalescedError);\n }\n };\n}\n"],"mappings":"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","names":["import_core","import_ai","import_core","import_ai"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/lib/chat.ng.ts","../src/lib/completion.ng.ts","../src/lib/structured-object.ng.ts"],"sourcesContent":["export { Chat } from './lib/chat.ng';\nexport { Completion, type CompletionOptions } from './lib/completion.ng';\nexport {\n StructuredObject,\n type StructuredObjectOptions,\n} from './lib/structured-object.ng';\n","import { signal } from '@angular/core';\nimport {\n type ChatState,\n type ChatStatus,\n type UIMessage,\n type ChatInit,\n AbstractChat,\n} from 'ai';\n\nexport class Chat<\n UI_MESSAGE extends UIMessage = UIMessage,\n> extends AbstractChat<UI_MESSAGE> {\n constructor(init: ChatInit<UI_MESSAGE>) {\n super({\n ...init,\n state: new AngularChatState(init.messages),\n });\n }\n}\n\nclass AngularChatState<UI_MESSAGE extends UIMessage = UIMessage>\n implements ChatState<UI_MESSAGE>\n{\n readonly #messages = signal<UI_MESSAGE[]>([]);\n readonly #status = signal<ChatStatus>('ready');\n readonly #error = signal<Error | undefined>(undefined);\n\n get messages(): UI_MESSAGE[] {\n return this.#messages();\n }\n\n set messages(messages: UI_MESSAGE[]) {\n this.#messages.set([...messages]);\n }\n\n get status(): ChatStatus {\n return this.#status();\n }\n\n set status(status: ChatStatus) {\n this.#status.set(status);\n }\n\n get error(): Error | undefined {\n return this.#error();\n }\n\n set error(error: Error | undefined) {\n this.#error.set(error);\n }\n\n constructor(initialMessages: UI_MESSAGE[] = []) {\n this.#messages.set([...initialMessages]);\n }\n\n setMessages = (messages: UI_MESSAGE[]) => {\n this.#messages.set([...messages]);\n };\n\n pushMessage = (message: UI_MESSAGE) => {\n this.#messages.update(msgs => [...msgs, message]);\n };\n\n popMessage = () => {\n this.#messages.update(msgs => msgs.slice(0, -1));\n };\n\n replaceMessage = (index: number, message: UI_MESSAGE) => {\n this.#messages.update(msgs => {\n const copy = [...msgs];\n copy[index] = message;\n return copy;\n });\n };\n\n snapshot = <T>(thing: T): T => structuredClone(thing);\n}\n","import { signal } from '@angular/core';\nimport {\n callCompletionApi,\n generateId,\n type CompletionRequestOptions,\n type UseCompletionOptions,\n} from 'ai';\n\nexport type CompletionOptions = Readonly<UseCompletionOptions>;\n\nexport class Completion {\n readonly #options: CompletionOptions;\n\n // Static config\n readonly id: string;\n readonly api: string;\n readonly streamProtocol: 'data' | 'text';\n\n // Reactive state\n readonly #input = signal('');\n readonly #completion = signal<string>('');\n readonly #error = signal<Error | undefined>(undefined);\n readonly #loading = signal<boolean>(false);\n\n #abortController: AbortController | null = null;\n\n constructor(options: CompletionOptions = {}) {\n this.#options = options;\n this.#completion.set(options.initialCompletion ?? '');\n this.#input.set(options.initialInput ?? '');\n this.api = options.api ?? '/api/completion';\n this.id = options.id ?? generateId();\n this.streamProtocol = options.streamProtocol ?? 'data';\n }\n\n /** Current value of the completion. Writable. */\n get completion(): string {\n return this.#completion();\n }\n set completion(value: string) {\n this.#completion.set(value);\n }\n\n /** Current value of the input. Writable. */\n get input(): string {\n return this.#input();\n }\n set input(value: string) {\n this.#input.set(value);\n }\n\n /** The error object of the API request */\n get error(): Error | undefined {\n return this.#error();\n }\n\n /** Flag that indicates whether an API request is in progress. */\n get loading(): boolean {\n return this.#loading();\n }\n\n /** Abort the current request immediately, keep the generated tokens if any. */\n stop = () => {\n try {\n this.#abortController?.abort();\n } catch {\n // ignore\n } finally {\n this.#loading.set(false);\n this.#abortController = null;\n }\n };\n\n /** Send a new prompt to the API endpoint and update the completion state. */\n complete = async (prompt: string, options?: CompletionRequestOptions) =>\n this.#triggerRequest(prompt, options);\n\n /** Form submission handler to automatically reset input and call the completion API */\n handleSubmit = async (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n if (this.#input()) {\n await this.complete(this.#input());\n }\n };\n\n #triggerRequest = async (\n prompt: string,\n options?: CompletionRequestOptions,\n ) => {\n return callCompletionApi({\n api: this.api,\n prompt,\n credentials: this.#options.credentials,\n headers: { ...this.#options.headers, ...options?.headers },\n body: {\n ...this.#options.body,\n ...options?.body,\n },\n streamProtocol: this.streamProtocol,\n fetch: this.#options.fetch,\n setCompletion: (completion: string) => {\n this.#completion.set(completion);\n },\n setLoading: (loading: boolean) => {\n this.#loading.set(loading);\n },\n setError: (error: any) => {\n this.#error.set(error);\n },\n setAbortController: abortController => {\n this.#abortController = abortController ?? null;\n },\n onFinish: this.#options.onFinish,\n onError: this.#options.onError,\n });\n };\n}\n","import {\n generateId,\n isAbortError,\n safeValidateTypes,\n type FetchFunction,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { signal } from '@angular/core';\nimport {\n asSchema,\n isDeepEqualData,\n parsePartialJson,\n type DeepPartial,\n type Schema,\n} from 'ai';\nimport type * as z3 from 'zod/v3';\nimport type * as z4 from 'zod/v4';\n\nexport type StructuredObjectOptions<\n SCHEMA extends z3.Schema | z4.core.$ZodType | Schema,\n RESULT = InferSchema<SCHEMA>,\n> = {\n /**\n * The API endpoint. It should stream JSON that matches the schema as chunked text.\n */\n api: string;\n\n /**\n * A Zod schema that defines the shape of the complete object.\n */\n schema: SCHEMA;\n\n /**\n * A unique identifier. If not provided, a random one will be\n * generated. When provided, the `useObject` hook with the same `id` will\n * have shared states across components.\n */\n id?: string;\n\n /**\n * An optional value for the initial object.\n */\n initialValue?: DeepPartial<RESULT>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Callback that is called when the stream has finished.\n */\n onFinish?: (event: {\n /**\n * The generated object (typed according to the schema).\n * Can be undefined if the final object does not match the schema.\n */\n object: RESULT | undefined;\n\n /**\n * Optional error object. This is e.g. a TypeValidationError when the final object does not match the schema.\n */\n error: Error | undefined;\n }) => Promise<void> | void;\n\n /**\n * Callback function to be called when an error is encountered.\n */\n onError?: (error: Error) => void;\n\n /**\n * Additional HTTP headers to be included in the request.\n */\n headers?: Record<string, string> | Headers;\n\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: RequestCredentials;\n};\n\nexport class StructuredObject<\n SCHEMA extends z3.Schema | z4.core.$ZodType | Schema,\n RESULT = InferSchema<SCHEMA>,\n INPUT = unknown,\n> {\n readonly options: StructuredObjectOptions<SCHEMA, RESULT>;\n readonly id: string;\n #abortController: AbortController | undefined;\n\n // Reactive state\n readonly #object = signal<DeepPartial<RESULT> | undefined>(undefined);\n readonly #loading = signal<boolean>(false);\n readonly #error = signal<Error | undefined>(undefined);\n\n /**\n * The current value for the generated object. Updated as the API streams JSON chunks.\n */\n get object(): DeepPartial<RESULT> | undefined {\n return this.#object();\n }\n\n /** The error object of the API request */\n get error(): Error | undefined {\n return this.#error();\n }\n\n /**\n * Flag that indicates whether an API request is in progress.\n */\n get loading(): boolean {\n return this.#loading();\n }\n\n constructor(options: StructuredObjectOptions<SCHEMA, RESULT>) {\n this.options = options;\n this.id = options.id ?? generateId();\n this.#object.set(options.initialValue);\n }\n\n /**\n * Abort the current request immediately, keep the current partial object if any.\n */\n stop = () => {\n try {\n this.#abortController?.abort();\n } catch {\n // ignore\n } finally {\n this.#loading.set(false);\n this.#abortController = undefined;\n }\n };\n\n /**\n * Calls the API with the provided input as JSON body.\n */\n submit = async (input: INPUT) => {\n try {\n this.#clearObject();\n\n this.#loading.set(true);\n\n const abortController = new AbortController();\n this.#abortController = abortController;\n\n const actualFetch = this.options.fetch ?? fetch;\n const response = await actualFetch(this.options.api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.options.headers,\n },\n credentials: this.options.credentials,\n signal: abortController.signal,\n body: JSON.stringify(input),\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the response.',\n );\n }\n\n if (response.body == null) {\n throw new Error('The response body is empty.');\n }\n\n let accumulatedText = '';\n let latestObject: DeepPartial<RESULT> | undefined = undefined;\n\n await response.body.pipeThrough(new TextDecoderStream()).pipeTo(\n new WritableStream<string>({\n write: async chunk => {\n if (abortController?.signal.aborted) {\n throw new DOMException('Stream aborted', 'AbortError');\n }\n accumulatedText += chunk;\n\n const { value } = await parsePartialJson(accumulatedText);\n const currentObject = value as DeepPartial<RESULT>;\n\n if (!isDeepEqualData(latestObject, currentObject)) {\n latestObject = currentObject;\n\n this.#object.set(currentObject);\n }\n },\n\n close: async () => {\n this.#loading.set(false);\n this.#abortController = undefined;\n\n if (this.options.onFinish != null) {\n const validationResult = await safeValidateTypes({\n value: latestObject,\n schema: asSchema(this.options.schema),\n });\n\n if (validationResult.success) {\n this.options.onFinish({\n object: validationResult.value,\n error: undefined,\n });\n } else {\n this.options.onFinish({\n object: undefined,\n error: (validationResult as { error: Error }).error,\n });\n }\n }\n },\n }),\n );\n } catch (error) {\n if (isAbortError(error)) {\n return;\n }\n\n const coalescedError =\n error instanceof Error ? error : new Error(String(error));\n if (this.options.onError) {\n this.options.onError(coalescedError);\n }\n\n this.#loading.set(false);\n this.#error.set(coalescedError);\n }\n };\n\n clear = () => {\n this.stop();\n this.#clearObject();\n };\n\n #clearObject = () => {\n this.#object.set(undefined);\n this.#error.set(undefined);\n this.#loading.set(false);\n };\n}\n"],"mappings":"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","names":["import_core","import_ai","import_core","import_ai"]}
|
package/dist/index.mjs
CHANGED
|
@@ -192,9 +192,8 @@ var StructuredObject = class {
|
|
|
192
192
|
*/
|
|
193
193
|
this.submit = async (input) => {
|
|
194
194
|
try {
|
|
195
|
-
this.#
|
|
195
|
+
this.#clearObject();
|
|
196
196
|
this.#loading.set(true);
|
|
197
|
-
this.#error.set(void 0);
|
|
198
197
|
const abortController = new AbortController();
|
|
199
198
|
this.#abortController = abortController;
|
|
200
199
|
const actualFetch = this.options.fetch ?? fetch;
|
|
@@ -267,6 +266,15 @@ var StructuredObject = class {
|
|
|
267
266
|
this.#error.set(coalescedError);
|
|
268
267
|
}
|
|
269
268
|
};
|
|
269
|
+
this.clear = () => {
|
|
270
|
+
this.stop();
|
|
271
|
+
this.#clearObject();
|
|
272
|
+
};
|
|
273
|
+
this.#clearObject = () => {
|
|
274
|
+
this.#object.set(void 0);
|
|
275
|
+
this.#error.set(void 0);
|
|
276
|
+
this.#loading.set(false);
|
|
277
|
+
};
|
|
270
278
|
this.options = options;
|
|
271
279
|
this.id = options.id ?? generateId2();
|
|
272
280
|
this.#object.set(options.initialValue);
|
|
@@ -291,6 +299,7 @@ var StructuredObject = class {
|
|
|
291
299
|
get loading() {
|
|
292
300
|
return this.#loading();
|
|
293
301
|
}
|
|
302
|
+
#clearObject;
|
|
294
303
|
};
|
|
295
304
|
export {
|
|
296
305
|
Chat,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/chat.ng.ts","../src/lib/completion.ng.ts","../src/lib/structured-object.ng.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport {\n type ChatState,\n type ChatStatus,\n type UIMessage,\n type ChatInit,\n AbstractChat,\n} from 'ai';\n\nexport class Chat<\n UI_MESSAGE extends UIMessage = UIMessage,\n> extends AbstractChat<UI_MESSAGE> {\n constructor(init: ChatInit<UI_MESSAGE>) {\n super({\n ...init,\n state: new AngularChatState(init.messages),\n });\n }\n}\n\nclass AngularChatState<UI_MESSAGE extends UIMessage = UIMessage>\n implements ChatState<UI_MESSAGE>\n{\n readonly #messages = signal<UI_MESSAGE[]>([]);\n readonly #status = signal<ChatStatus>('ready');\n readonly #error = signal<Error | undefined>(undefined);\n\n get messages(): UI_MESSAGE[] {\n return this.#messages();\n }\n\n set messages(messages: UI_MESSAGE[]) {\n this.#messages.set([...messages]);\n }\n\n get status(): ChatStatus {\n return this.#status();\n }\n\n set status(status: ChatStatus) {\n this.#status.set(status);\n }\n\n get error(): Error | undefined {\n return this.#error();\n }\n\n set error(error: Error | undefined) {\n this.#error.set(error);\n }\n\n constructor(initialMessages: UI_MESSAGE[] = []) {\n this.#messages.set([...initialMessages]);\n }\n\n setMessages = (messages: UI_MESSAGE[]) => {\n this.#messages.set([...messages]);\n };\n\n pushMessage = (message: UI_MESSAGE) => {\n this.#messages.update(msgs => [...msgs, message]);\n };\n\n popMessage = () => {\n this.#messages.update(msgs => msgs.slice(0, -1));\n };\n\n replaceMessage = (index: number, message: UI_MESSAGE) => {\n this.#messages.update(msgs => {\n const copy = [...msgs];\n copy[index] = message;\n return copy;\n });\n };\n\n snapshot = <T>(thing: T): T => structuredClone(thing);\n}\n","import { signal } from '@angular/core';\nimport {\n callCompletionApi,\n generateId,\n type CompletionRequestOptions,\n type UseCompletionOptions,\n} from 'ai';\n\nexport type CompletionOptions = Readonly<UseCompletionOptions>;\n\nexport class Completion {\n readonly #options: CompletionOptions;\n\n // Static config\n readonly id: string;\n readonly api: string;\n readonly streamProtocol: 'data' | 'text';\n\n // Reactive state\n readonly #input = signal('');\n readonly #completion = signal<string>('');\n readonly #error = signal<Error | undefined>(undefined);\n readonly #loading = signal<boolean>(false);\n\n #abortController: AbortController | null = null;\n\n constructor(options: CompletionOptions = {}) {\n this.#options = options;\n this.#completion.set(options.initialCompletion ?? '');\n this.#input.set(options.initialInput ?? '');\n this.api = options.api ?? '/api/completion';\n this.id = options.id ?? generateId();\n this.streamProtocol = options.streamProtocol ?? 'data';\n }\n\n /** Current value of the completion. Writable. */\n get completion(): string {\n return this.#completion();\n }\n set completion(value: string) {\n this.#completion.set(value);\n }\n\n /** Current value of the input. Writable. */\n get input(): string {\n return this.#input();\n }\n set input(value: string) {\n this.#input.set(value);\n }\n\n /** The error object of the API request */\n get error(): Error | undefined {\n return this.#error();\n }\n\n /** Flag that indicates whether an API request is in progress. */\n get loading(): boolean {\n return this.#loading();\n }\n\n /** Abort the current request immediately, keep the generated tokens if any. */\n stop = () => {\n try {\n this.#abortController?.abort();\n } catch {\n // ignore\n } finally {\n this.#loading.set(false);\n this.#abortController = null;\n }\n };\n\n /** Send a new prompt to the API endpoint and update the completion state. */\n complete = async (prompt: string, options?: CompletionRequestOptions) =>\n this.#triggerRequest(prompt, options);\n\n /** Form submission handler to automatically reset input and call the completion API */\n handleSubmit = async (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n if (this.#input()) {\n await this.complete(this.#input());\n }\n };\n\n #triggerRequest = async (\n prompt: string,\n options?: CompletionRequestOptions,\n ) => {\n return callCompletionApi({\n api: this.api,\n prompt,\n credentials: this.#options.credentials,\n headers: { ...this.#options.headers, ...options?.headers },\n body: {\n ...this.#options.body,\n ...options?.body,\n },\n streamProtocol: this.streamProtocol,\n fetch: this.#options.fetch,\n setCompletion: (completion: string) => {\n this.#completion.set(completion);\n },\n setLoading: (loading: boolean) => {\n this.#loading.set(loading);\n },\n setError: (error: any) => {\n this.#error.set(error);\n },\n setAbortController: abortController => {\n this.#abortController = abortController ?? null;\n },\n onFinish: this.#options.onFinish,\n onError: this.#options.onError,\n });\n };\n}\n","import {\n generateId,\n isAbortError,\n safeValidateTypes,\n type FetchFunction,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { signal } from '@angular/core';\nimport {\n asSchema,\n isDeepEqualData,\n parsePartialJson,\n type DeepPartial,\n type Schema,\n} from 'ai';\nimport type * as z3 from 'zod/v3';\nimport type * as z4 from 'zod/v4';\n\nexport type StructuredObjectOptions<\n SCHEMA extends z3.Schema | z4.core.$ZodType | Schema,\n RESULT = InferSchema<SCHEMA>,\n> = {\n /**\n * The API endpoint. It should stream JSON that matches the schema as chunked text.\n */\n api: string;\n\n /**\n * A Zod schema that defines the shape of the complete object.\n */\n schema: SCHEMA;\n\n /**\n * A unique identifier. If not provided, a random one will be\n * generated. When provided, the `useObject` hook with the same `id` will\n * have shared states across components.\n */\n id?: string;\n\n /**\n * An optional value for the initial object.\n */\n initialValue?: DeepPartial<RESULT>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Callback that is called when the stream has finished.\n */\n onFinish?: (event: {\n /**\n * The generated object (typed according to the schema).\n * Can be undefined if the final object does not match the schema.\n */\n object: RESULT | undefined;\n\n /**\n * Optional error object. This is e.g. a TypeValidationError when the final object does not match the schema.\n */\n error: Error | undefined;\n }) => Promise<void> | void;\n\n /**\n * Callback function to be called when an error is encountered.\n */\n onError?: (error: Error) => void;\n\n /**\n * Additional HTTP headers to be included in the request.\n */\n headers?: Record<string, string> | Headers;\n\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: RequestCredentials;\n};\n\nexport class StructuredObject<\n SCHEMA extends z3.Schema | z4.core.$ZodType | Schema,\n RESULT = InferSchema<SCHEMA>,\n INPUT = unknown,\n> {\n readonly options: StructuredObjectOptions<SCHEMA, RESULT>;\n readonly id: string;\n #abortController: AbortController | undefined;\n\n // Reactive state\n readonly #object = signal<DeepPartial<RESULT> | undefined>(undefined);\n readonly #loading = signal<boolean>(false);\n readonly #error = signal<Error | undefined>(undefined);\n\n /**\n * The current value for the generated object. Updated as the API streams JSON chunks.\n */\n get object(): DeepPartial<RESULT> | undefined {\n return this.#object();\n }\n\n /** The error object of the API request */\n get error(): Error | undefined {\n return this.#error();\n }\n\n /**\n * Flag that indicates whether an API request is in progress.\n */\n get loading(): boolean {\n return this.#loading();\n }\n\n constructor(options: StructuredObjectOptions<SCHEMA, RESULT>) {\n this.options = options;\n this.id = options.id ?? generateId();\n this.#object.set(options.initialValue);\n }\n\n /**\n * Abort the current request immediately, keep the current partial object if any.\n */\n stop = () => {\n try {\n this.#abortController?.abort();\n } catch {\n // ignore\n } finally {\n this.#loading.set(false);\n this.#abortController = undefined;\n }\n };\n\n /**\n * Calls the API with the provided input as JSON body.\n */\n submit = async (input: INPUT) => {\n try {\n this.#object.set(undefined); // reset the data\n this.#loading.set(true);\n this.#error.set(undefined);\n\n const abortController = new AbortController();\n this.#abortController = abortController;\n\n const actualFetch = this.options.fetch ?? fetch;\n const response = await actualFetch(this.options.api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.options.headers,\n },\n credentials: this.options.credentials,\n signal: abortController.signal,\n body: JSON.stringify(input),\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the response.',\n );\n }\n\n if (response.body == null) {\n throw new Error('The response body is empty.');\n }\n\n let accumulatedText = '';\n let latestObject: DeepPartial<RESULT> | undefined = undefined;\n\n await response.body.pipeThrough(new TextDecoderStream()).pipeTo(\n new WritableStream<string>({\n write: async chunk => {\n if (abortController?.signal.aborted) {\n throw new DOMException('Stream aborted', 'AbortError');\n }\n accumulatedText += chunk;\n\n const { value } = await parsePartialJson(accumulatedText);\n const currentObject = value as DeepPartial<RESULT>;\n\n if (!isDeepEqualData(latestObject, currentObject)) {\n latestObject = currentObject;\n\n this.#object.set(currentObject);\n }\n },\n\n close: async () => {\n this.#loading.set(false);\n this.#abortController = undefined;\n\n if (this.options.onFinish != null) {\n const validationResult = await safeValidateTypes({\n value: latestObject,\n schema: asSchema(this.options.schema),\n });\n\n if (validationResult.success) {\n this.options.onFinish({\n object: validationResult.value,\n error: undefined,\n });\n } else {\n this.options.onFinish({\n object: undefined,\n error: (validationResult as { error: Error }).error,\n });\n }\n }\n },\n }),\n );\n } catch (error) {\n if (isAbortError(error)) {\n return;\n }\n\n const coalescedError =\n error instanceof Error ? error : new Error(String(error));\n if (this.options.onError) {\n this.options.onError(coalescedError);\n }\n\n this.#loading.set(false);\n this.#error.set(coalescedError);\n }\n };\n}\n"],"mappings":"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","names":["signal","generateId","signal"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/chat.ng.ts","../src/lib/completion.ng.ts","../src/lib/structured-object.ng.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport {\n type ChatState,\n type ChatStatus,\n type UIMessage,\n type ChatInit,\n AbstractChat,\n} from 'ai';\n\nexport class Chat<\n UI_MESSAGE extends UIMessage = UIMessage,\n> extends AbstractChat<UI_MESSAGE> {\n constructor(init: ChatInit<UI_MESSAGE>) {\n super({\n ...init,\n state: new AngularChatState(init.messages),\n });\n }\n}\n\nclass AngularChatState<UI_MESSAGE extends UIMessage = UIMessage>\n implements ChatState<UI_MESSAGE>\n{\n readonly #messages = signal<UI_MESSAGE[]>([]);\n readonly #status = signal<ChatStatus>('ready');\n readonly #error = signal<Error | undefined>(undefined);\n\n get messages(): UI_MESSAGE[] {\n return this.#messages();\n }\n\n set messages(messages: UI_MESSAGE[]) {\n this.#messages.set([...messages]);\n }\n\n get status(): ChatStatus {\n return this.#status();\n }\n\n set status(status: ChatStatus) {\n this.#status.set(status);\n }\n\n get error(): Error | undefined {\n return this.#error();\n }\n\n set error(error: Error | undefined) {\n this.#error.set(error);\n }\n\n constructor(initialMessages: UI_MESSAGE[] = []) {\n this.#messages.set([...initialMessages]);\n }\n\n setMessages = (messages: UI_MESSAGE[]) => {\n this.#messages.set([...messages]);\n };\n\n pushMessage = (message: UI_MESSAGE) => {\n this.#messages.update(msgs => [...msgs, message]);\n };\n\n popMessage = () => {\n this.#messages.update(msgs => msgs.slice(0, -1));\n };\n\n replaceMessage = (index: number, message: UI_MESSAGE) => {\n this.#messages.update(msgs => {\n const copy = [...msgs];\n copy[index] = message;\n return copy;\n });\n };\n\n snapshot = <T>(thing: T): T => structuredClone(thing);\n}\n","import { signal } from '@angular/core';\nimport {\n callCompletionApi,\n generateId,\n type CompletionRequestOptions,\n type UseCompletionOptions,\n} from 'ai';\n\nexport type CompletionOptions = Readonly<UseCompletionOptions>;\n\nexport class Completion {\n readonly #options: CompletionOptions;\n\n // Static config\n readonly id: string;\n readonly api: string;\n readonly streamProtocol: 'data' | 'text';\n\n // Reactive state\n readonly #input = signal('');\n readonly #completion = signal<string>('');\n readonly #error = signal<Error | undefined>(undefined);\n readonly #loading = signal<boolean>(false);\n\n #abortController: AbortController | null = null;\n\n constructor(options: CompletionOptions = {}) {\n this.#options = options;\n this.#completion.set(options.initialCompletion ?? '');\n this.#input.set(options.initialInput ?? '');\n this.api = options.api ?? '/api/completion';\n this.id = options.id ?? generateId();\n this.streamProtocol = options.streamProtocol ?? 'data';\n }\n\n /** Current value of the completion. Writable. */\n get completion(): string {\n return this.#completion();\n }\n set completion(value: string) {\n this.#completion.set(value);\n }\n\n /** Current value of the input. Writable. */\n get input(): string {\n return this.#input();\n }\n set input(value: string) {\n this.#input.set(value);\n }\n\n /** The error object of the API request */\n get error(): Error | undefined {\n return this.#error();\n }\n\n /** Flag that indicates whether an API request is in progress. */\n get loading(): boolean {\n return this.#loading();\n }\n\n /** Abort the current request immediately, keep the generated tokens if any. */\n stop = () => {\n try {\n this.#abortController?.abort();\n } catch {\n // ignore\n } finally {\n this.#loading.set(false);\n this.#abortController = null;\n }\n };\n\n /** Send a new prompt to the API endpoint and update the completion state. */\n complete = async (prompt: string, options?: CompletionRequestOptions) =>\n this.#triggerRequest(prompt, options);\n\n /** Form submission handler to automatically reset input and call the completion API */\n handleSubmit = async (event?: { preventDefault?: () => void }) => {\n event?.preventDefault?.();\n if (this.#input()) {\n await this.complete(this.#input());\n }\n };\n\n #triggerRequest = async (\n prompt: string,\n options?: CompletionRequestOptions,\n ) => {\n return callCompletionApi({\n api: this.api,\n prompt,\n credentials: this.#options.credentials,\n headers: { ...this.#options.headers, ...options?.headers },\n body: {\n ...this.#options.body,\n ...options?.body,\n },\n streamProtocol: this.streamProtocol,\n fetch: this.#options.fetch,\n setCompletion: (completion: string) => {\n this.#completion.set(completion);\n },\n setLoading: (loading: boolean) => {\n this.#loading.set(loading);\n },\n setError: (error: any) => {\n this.#error.set(error);\n },\n setAbortController: abortController => {\n this.#abortController = abortController ?? null;\n },\n onFinish: this.#options.onFinish,\n onError: this.#options.onError,\n });\n };\n}\n","import {\n generateId,\n isAbortError,\n safeValidateTypes,\n type FetchFunction,\n type InferSchema,\n} from '@ai-sdk/provider-utils';\nimport { signal } from '@angular/core';\nimport {\n asSchema,\n isDeepEqualData,\n parsePartialJson,\n type DeepPartial,\n type Schema,\n} from 'ai';\nimport type * as z3 from 'zod/v3';\nimport type * as z4 from 'zod/v4';\n\nexport type StructuredObjectOptions<\n SCHEMA extends z3.Schema | z4.core.$ZodType | Schema,\n RESULT = InferSchema<SCHEMA>,\n> = {\n /**\n * The API endpoint. It should stream JSON that matches the schema as chunked text.\n */\n api: string;\n\n /**\n * A Zod schema that defines the shape of the complete object.\n */\n schema: SCHEMA;\n\n /**\n * A unique identifier. If not provided, a random one will be\n * generated. When provided, the `useObject` hook with the same `id` will\n * have shared states across components.\n */\n id?: string;\n\n /**\n * An optional value for the initial object.\n */\n initialValue?: DeepPartial<RESULT>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n\n /**\n * Callback that is called when the stream has finished.\n */\n onFinish?: (event: {\n /**\n * The generated object (typed according to the schema).\n * Can be undefined if the final object does not match the schema.\n */\n object: RESULT | undefined;\n\n /**\n * Optional error object. This is e.g. a TypeValidationError when the final object does not match the schema.\n */\n error: Error | undefined;\n }) => Promise<void> | void;\n\n /**\n * Callback function to be called when an error is encountered.\n */\n onError?: (error: Error) => void;\n\n /**\n * Additional HTTP headers to be included in the request.\n */\n headers?: Record<string, string> | Headers;\n\n /**\n * The credentials mode to be used for the fetch request.\n * Possible values are: 'omit', 'same-origin', 'include'.\n * Defaults to 'same-origin'.\n */\n credentials?: RequestCredentials;\n};\n\nexport class StructuredObject<\n SCHEMA extends z3.Schema | z4.core.$ZodType | Schema,\n RESULT = InferSchema<SCHEMA>,\n INPUT = unknown,\n> {\n readonly options: StructuredObjectOptions<SCHEMA, RESULT>;\n readonly id: string;\n #abortController: AbortController | undefined;\n\n // Reactive state\n readonly #object = signal<DeepPartial<RESULT> | undefined>(undefined);\n readonly #loading = signal<boolean>(false);\n readonly #error = signal<Error | undefined>(undefined);\n\n /**\n * The current value for the generated object. Updated as the API streams JSON chunks.\n */\n get object(): DeepPartial<RESULT> | undefined {\n return this.#object();\n }\n\n /** The error object of the API request */\n get error(): Error | undefined {\n return this.#error();\n }\n\n /**\n * Flag that indicates whether an API request is in progress.\n */\n get loading(): boolean {\n return this.#loading();\n }\n\n constructor(options: StructuredObjectOptions<SCHEMA, RESULT>) {\n this.options = options;\n this.id = options.id ?? generateId();\n this.#object.set(options.initialValue);\n }\n\n /**\n * Abort the current request immediately, keep the current partial object if any.\n */\n stop = () => {\n try {\n this.#abortController?.abort();\n } catch {\n // ignore\n } finally {\n this.#loading.set(false);\n this.#abortController = undefined;\n }\n };\n\n /**\n * Calls the API with the provided input as JSON body.\n */\n submit = async (input: INPUT) => {\n try {\n this.#clearObject();\n\n this.#loading.set(true);\n\n const abortController = new AbortController();\n this.#abortController = abortController;\n\n const actualFetch = this.options.fetch ?? fetch;\n const response = await actualFetch(this.options.api, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...this.options.headers,\n },\n credentials: this.options.credentials,\n signal: abortController.signal,\n body: JSON.stringify(input),\n });\n\n if (!response.ok) {\n throw new Error(\n (await response.text()) ?? 'Failed to fetch the response.',\n );\n }\n\n if (response.body == null) {\n throw new Error('The response body is empty.');\n }\n\n let accumulatedText = '';\n let latestObject: DeepPartial<RESULT> | undefined = undefined;\n\n await response.body.pipeThrough(new TextDecoderStream()).pipeTo(\n new WritableStream<string>({\n write: async chunk => {\n if (abortController?.signal.aborted) {\n throw new DOMException('Stream aborted', 'AbortError');\n }\n accumulatedText += chunk;\n\n const { value } = await parsePartialJson(accumulatedText);\n const currentObject = value as DeepPartial<RESULT>;\n\n if (!isDeepEqualData(latestObject, currentObject)) {\n latestObject = currentObject;\n\n this.#object.set(currentObject);\n }\n },\n\n close: async () => {\n this.#loading.set(false);\n this.#abortController = undefined;\n\n if (this.options.onFinish != null) {\n const validationResult = await safeValidateTypes({\n value: latestObject,\n schema: asSchema(this.options.schema),\n });\n\n if (validationResult.success) {\n this.options.onFinish({\n object: validationResult.value,\n error: undefined,\n });\n } else {\n this.options.onFinish({\n object: undefined,\n error: (validationResult as { error: Error }).error,\n });\n }\n }\n },\n }),\n );\n } catch (error) {\n if (isAbortError(error)) {\n return;\n }\n\n const coalescedError =\n error instanceof Error ? error : new Error(String(error));\n if (this.options.onError) {\n this.options.onError(coalescedError);\n }\n\n this.#loading.set(false);\n this.#error.set(coalescedError);\n }\n };\n\n clear = () => {\n this.stop();\n this.#clearObject();\n };\n\n #clearObject = () => {\n this.#object.set(undefined);\n this.#error.set(undefined);\n this.#loading.set(false);\n };\n}\n"],"mappings":"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","names":["signal","generateId","signal"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/angular",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Angular implementation of ai-sdk.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"CHANGELOG.md"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@ai-sdk/provider-utils": "3.0.0
|
|
23
|
-
"ai": "5.0.0
|
|
22
|
+
"@ai-sdk/provider-utils": "3.0.0",
|
|
23
|
+
"ai": "5.0.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "20.17.24",
|