@ai-sdk/angular 1.1.0-beta.9 → 2.0.0-beta.100

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,677 @@
1
1
  # @ai-sdk/angular
2
2
 
3
+ ## 2.0.0-beta.100
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [8370068]
8
+ - ai@6.0.0-beta.100
9
+
10
+ ## 2.0.0-beta.99
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [384142c]
15
+ - ai@6.0.0-beta.99
16
+
17
+ ## 2.0.0-beta.98
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies [b681d7d]
22
+ - ai@6.0.0-beta.98
23
+ - @ai-sdk/provider-utils@4.0.0-beta.33
24
+
25
+ ## 2.0.0-beta.97
26
+
27
+ ### Patch Changes
28
+
29
+ - Updated dependencies [32d8dbb]
30
+ - @ai-sdk/provider-utils@4.0.0-beta.32
31
+ - ai@6.0.0-beta.97
32
+
33
+ ## 2.0.0-beta.96
34
+
35
+ ### Patch Changes
36
+
37
+ - Updated dependencies [a322efa]
38
+ - ai@6.0.0-beta.96
39
+
40
+ ## 2.0.0-beta.95
41
+
42
+ ### Patch Changes
43
+
44
+ - Updated dependencies [eb8d1cb]
45
+ - ai@6.0.0-beta.95
46
+
47
+ ## 2.0.0-beta.94
48
+
49
+ ### Patch Changes
50
+
51
+ - Updated dependencies [ab1087b]
52
+ - ai@6.0.0-beta.94
53
+
54
+ ## 2.0.0-beta.93
55
+
56
+ ### Patch Changes
57
+
58
+ - ai@6.0.0-beta.93
59
+ - @ai-sdk/provider-utils@4.0.0-beta.31
60
+
61
+ ## 2.0.0-beta.92
62
+
63
+ ### Patch Changes
64
+
65
+ - Updated dependencies [97b1d77]
66
+ - ai@6.0.0-beta.92
67
+
68
+ ## 2.0.0-beta.91
69
+
70
+ ### Patch Changes
71
+
72
+ - Updated dependencies [4f16c37]
73
+ - @ai-sdk/provider-utils@4.0.0-beta.30
74
+ - ai@6.0.0-beta.91
75
+
76
+ ## 2.0.0-beta.90
77
+
78
+ ### Patch Changes
79
+
80
+ - ai@6.0.0-beta.90
81
+ - @ai-sdk/provider-utils@4.0.0-beta.29
82
+
83
+ ## 2.0.0-beta.89
84
+
85
+ ### Patch Changes
86
+
87
+ - Updated dependencies [d59ce25]
88
+ - ai@6.0.0-beta.89
89
+
90
+ ## 2.0.0-beta.88
91
+
92
+ ### Patch Changes
93
+
94
+ - Updated dependencies [22ef5c6]
95
+ - ai@6.0.0-beta.88
96
+
97
+ ## 2.0.0-beta.87
98
+
99
+ ### Patch Changes
100
+
101
+ - Updated dependencies [ca13d26]
102
+ - ai@6.0.0-beta.87
103
+
104
+ ## 2.0.0-beta.86
105
+
106
+ ### Patch Changes
107
+
108
+ - Updated dependencies [36b175c]
109
+ - ai@6.0.0-beta.86
110
+
111
+ ## 2.0.0-beta.85
112
+
113
+ ### Patch Changes
114
+
115
+ - ai@6.0.0-beta.85
116
+
117
+ ## 2.0.0-beta.84
118
+
119
+ ### Patch Changes
120
+
121
+ - Updated dependencies [016b111]
122
+ - @ai-sdk/provider-utils@4.0.0-beta.28
123
+ - ai@6.0.0-beta.84
124
+
125
+ ## 2.0.0-beta.83
126
+
127
+ ### Patch Changes
128
+
129
+ - Updated dependencies [e1f6e8e]
130
+ - ai@6.0.0-beta.83
131
+
132
+ ## 2.0.0-beta.82
133
+
134
+ ### Patch Changes
135
+
136
+ - Updated dependencies [37c58a0]
137
+ - ai@6.0.0-beta.82
138
+ - @ai-sdk/provider-utils@4.0.0-beta.27
139
+
140
+ ## 2.0.0-beta.81
141
+
142
+ ### Patch Changes
143
+
144
+ - ai@6.0.0-beta.81
145
+
146
+ ## 2.0.0-beta.80
147
+
148
+ ### Patch Changes
149
+
150
+ - Updated dependencies [9524761]
151
+ - ai@6.0.0-beta.80
152
+
153
+ ## 2.0.0-beta.79
154
+
155
+ ### Patch Changes
156
+
157
+ - Updated dependencies [d1bdadb]
158
+ - ai@6.0.0-beta.79
159
+ - @ai-sdk/provider-utils@4.0.0-beta.26
160
+
161
+ ## 2.0.0-beta.78
162
+
163
+ ### Patch Changes
164
+
165
+ - ai@6.0.0-beta.78
166
+ - @ai-sdk/provider-utils@4.0.0-beta.25
167
+
168
+ ## 2.0.0-beta.77
169
+
170
+ ### Patch Changes
171
+
172
+ - Updated dependencies [0c3b58b]
173
+ - ai@6.0.0-beta.77
174
+ - @ai-sdk/provider-utils@4.0.0-beta.24
175
+
176
+ ## 2.0.0-beta.76
177
+
178
+ ### Patch Changes
179
+
180
+ - Updated dependencies [a755db5]
181
+ - ai@6.0.0-beta.76
182
+ - @ai-sdk/provider-utils@4.0.0-beta.23
183
+
184
+ ## 2.0.0-beta.75
185
+
186
+ ### Patch Changes
187
+
188
+ - Updated dependencies [58920e0]
189
+ - Updated dependencies [58920e0]
190
+ - ai@6.0.0-beta.75
191
+ - @ai-sdk/provider-utils@4.0.0-beta.22
192
+
193
+ ## 2.0.0-beta.74
194
+
195
+ ### Patch Changes
196
+
197
+ - Updated dependencies [293a6b7]
198
+ - @ai-sdk/provider-utils@4.0.0-beta.21
199
+ - ai@6.0.0-beta.74
200
+
201
+ ## 2.0.0-beta.73
202
+
203
+ ### Patch Changes
204
+
205
+ - Updated dependencies [754df61]
206
+ - ai@6.0.0-beta.73
207
+
208
+ ## 2.0.0-beta.72
209
+
210
+ ### Patch Changes
211
+
212
+ - Updated dependencies [eca63f3]
213
+ - ai@6.0.0-beta.72
214
+
215
+ ## 2.0.0-beta.71
216
+
217
+ ### Patch Changes
218
+
219
+ - Updated dependencies [077aea3]
220
+ - ai@6.0.0-beta.71
221
+
222
+ ## 2.0.0-beta.70
223
+
224
+ ### Patch Changes
225
+
226
+ - Updated dependencies [d7bae86]
227
+ - ai@6.0.0-beta.70
228
+
229
+ ## 2.0.0-beta.69
230
+
231
+ ### Patch Changes
232
+
233
+ - Updated dependencies [d5b25ee]
234
+ - ai@6.0.0-beta.69
235
+
236
+ ## 2.0.0-beta.68
237
+
238
+ ### Patch Changes
239
+
240
+ - Updated dependencies [9b83947]
241
+ - ai@6.0.0-beta.68
242
+
243
+ ## 2.0.0-beta.67
244
+
245
+ ### Patch Changes
246
+
247
+ - ai@6.0.0-beta.67
248
+
249
+ ## 2.0.0-beta.66
250
+
251
+ ### Patch Changes
252
+
253
+ - Updated dependencies [fca786b]
254
+ - Updated dependencies [fca786b]
255
+ - ai@6.0.0-beta.66
256
+ - @ai-sdk/provider-utils@4.0.0-beta.20
257
+
258
+ ## 2.0.0-beta.65
259
+
260
+ ### Patch Changes
261
+
262
+ - Updated dependencies [dce4e7b]
263
+ - ai@6.0.0-beta.65
264
+
265
+ ## 2.0.0-beta.64
266
+
267
+ ### Patch Changes
268
+
269
+ - Updated dependencies [2d28066]
270
+ - ai@6.0.0-beta.64
271
+
272
+ ## 2.0.0-beta.63
273
+
274
+ ### Patch Changes
275
+
276
+ - Updated dependencies [a7da2b6]
277
+ - ai@6.0.0-beta.63
278
+
279
+ ## 2.0.0-beta.62
280
+
281
+ ### Patch Changes
282
+
283
+ - Updated dependencies [95b77e2]
284
+ - ai@6.0.0-beta.62
285
+
286
+ ## 2.0.0-beta.61
287
+
288
+ ### Patch Changes
289
+
290
+ - Updated dependencies [c98373a]
291
+ - ai@6.0.0-beta.61
292
+
293
+ ## 2.0.0-beta.60
294
+
295
+ ### Patch Changes
296
+
297
+ - Updated dependencies [2b49dae]
298
+ - ai@6.0.0-beta.60
299
+
300
+ ## 2.0.0-beta.59
301
+
302
+ ### Patch Changes
303
+
304
+ - Updated dependencies [e062079]
305
+ - ai@6.0.0-beta.59
306
+
307
+ ## 2.0.0-beta.58
308
+
309
+ ### Patch Changes
310
+
311
+ - Updated dependencies [a417a34]
312
+ - ai@6.0.0-beta.58
313
+
314
+ ## 2.0.0-beta.57
315
+
316
+ ### Patch Changes
317
+
318
+ - Updated dependencies [61f7b0f]
319
+ - ai@6.0.0-beta.57
320
+
321
+ ## 2.0.0-beta.56
322
+
323
+ ### Patch Changes
324
+
325
+ - Updated dependencies [3794514]
326
+ - @ai-sdk/provider-utils@4.0.0-beta.19
327
+ - ai@6.0.0-beta.56
328
+
329
+ ## 2.0.0-beta.55
330
+
331
+ ### Patch Changes
332
+
333
+ - Updated dependencies [42cf7ed]
334
+ - ai@6.0.0-beta.55
335
+
336
+ ## 2.0.0-beta.54
337
+
338
+ ### Patch Changes
339
+
340
+ - Updated dependencies [9388ff1]
341
+ - ai@6.0.0-beta.54
342
+
343
+ ## 2.0.0-beta.53
344
+
345
+ ### Patch Changes
346
+
347
+ - ai@6.0.0-beta.53
348
+
349
+ ## 2.0.0-beta.52
350
+
351
+ ### Patch Changes
352
+
353
+ - ai@6.0.0-beta.52
354
+
355
+ ## 2.0.0-beta.51
356
+
357
+ ### Patch Changes
358
+
359
+ - Updated dependencies [5e313e3]
360
+ - ai@6.0.0-beta.51
361
+
362
+ ## 2.0.0-beta.50
363
+
364
+ ### Patch Changes
365
+
366
+ - Updated dependencies [4812235]
367
+ - Updated dependencies [81d4308]
368
+ - ai@6.0.0-beta.50
369
+ - @ai-sdk/provider-utils@4.0.0-beta.18
370
+
371
+ ## 2.0.0-beta.49
372
+
373
+ ### Patch Changes
374
+
375
+ - Updated dependencies [703459a]
376
+ - @ai-sdk/provider-utils@4.0.0-beta.17
377
+ - ai@6.0.0-beta.49
378
+
379
+ ## 2.0.0-beta.48
380
+
381
+ ### Patch Changes
382
+
383
+ - Updated dependencies [7f2c9b6]
384
+ - ai@6.0.0-beta.48
385
+
386
+ ## 2.0.0-beta.47
387
+
388
+ ### Patch Changes
389
+
390
+ - Updated dependencies [c62ecf0]
391
+ - ai@6.0.0-beta.47
392
+
393
+ ## 2.0.0-beta.46
394
+
395
+ ### Patch Changes
396
+
397
+ - ai@6.0.0-beta.46
398
+
399
+ ## 2.0.0-beta.45
400
+
401
+ ### Patch Changes
402
+
403
+ - Updated dependencies [48454ab]
404
+ - ai@6.0.0-beta.45
405
+
406
+ ## 2.0.0-beta.44
407
+
408
+ ### Patch Changes
409
+
410
+ - Updated dependencies [2b1bf9d]
411
+ - ai@6.0.0-beta.44
412
+
413
+ ## 2.0.0-beta.43
414
+
415
+ ### Patch Changes
416
+
417
+ - Updated dependencies [27e8c3a]
418
+ - ai@6.0.0-beta.43
419
+
420
+ ## 2.0.0-beta.42
421
+
422
+ ### Patch Changes
423
+
424
+ - Updated dependencies [6306603]
425
+ - @ai-sdk/provider-utils@4.0.0-beta.16
426
+ - ai@6.0.0-beta.42
427
+
428
+ ## 2.0.0-beta.41
429
+
430
+ ### Patch Changes
431
+
432
+ - Updated dependencies [f0b2157]
433
+ - @ai-sdk/provider-utils@4.0.0-beta.15
434
+ - ai@6.0.0-beta.41
435
+
436
+ ## 2.0.0-beta.40
437
+
438
+ ### Patch Changes
439
+
440
+ - Updated dependencies [3b1d015]
441
+ - @ai-sdk/provider-utils@4.0.0-beta.14
442
+ - ai@6.0.0-beta.40
443
+
444
+ ## 2.0.0-beta.39
445
+
446
+ ### Patch Changes
447
+
448
+ - f6f0c5a: chore: remove zod from ui packages
449
+ - Updated dependencies [f6f0c5a]
450
+ - ai@6.0.0-beta.39
451
+
452
+ ## 2.0.0-beta.38
453
+
454
+ ### Patch Changes
455
+
456
+ - Updated dependencies [d116b4b]
457
+ - @ai-sdk/provider-utils@4.0.0-beta.13
458
+ - ai@6.0.0-beta.38
459
+
460
+ ## 2.0.0-beta.37
461
+
462
+ ### Patch Changes
463
+
464
+ - Updated dependencies [7e32fea]
465
+ - @ai-sdk/provider-utils@4.0.0-beta.12
466
+ - ai@6.0.0-beta.37
467
+
468
+ ## 2.0.0-beta.36
469
+
470
+ ### Patch Changes
471
+
472
+ - ai@6.0.0-beta.36
473
+
474
+ ## 2.0.0-beta.35
475
+
476
+ ### Patch Changes
477
+
478
+ - ai@6.0.0-beta.35
479
+
480
+ ## 2.0.0-beta.34
481
+
482
+ ### Patch Changes
483
+
484
+ - Updated dependencies [bb10a89]
485
+ - ai@6.0.0-beta.34
486
+
487
+ ## 2.0.0-beta.33
488
+
489
+ ### Patch Changes
490
+
491
+ - Updated dependencies [f733285]
492
+ - ai@6.0.0-beta.33
493
+
494
+ ## 2.0.0-beta.32
495
+
496
+ ### Patch Changes
497
+
498
+ - Updated dependencies [7e4649f]
499
+ - ai@6.0.0-beta.32
500
+
501
+ ## 2.0.0-beta.31
502
+
503
+ ### Patch Changes
504
+
505
+ - 95f65c2: chore: use import \* from zod/v4
506
+ - Updated dependencies [95f65c2]
507
+ - Updated dependencies [95f65c2]
508
+ - @ai-sdk/provider-utils@4.0.0-beta.11
509
+ - ai@6.0.0-beta.31
510
+
511
+ ## 2.0.0-beta.30
512
+
513
+ ### Patch Changes
514
+
515
+ - ai@6.0.0-beta.30
516
+
517
+ ## 2.0.0-beta.29
518
+
519
+ ### Major Changes
520
+
521
+ - dee8b05: ai SDK 6 beta
522
+
523
+ ### Patch Changes
524
+
525
+ - Updated dependencies [dee8b05]
526
+ - ai@6.0.0-beta.29
527
+ - @ai-sdk/provider-utils@4.0.0-beta.10
528
+
529
+ ## 1.1.0-beta.28
530
+
531
+ ### Patch Changes
532
+
533
+ - Updated dependencies [521c537]
534
+ - @ai-sdk/provider-utils@3.1.0-beta.9
535
+ - ai@5.1.0-beta.28
536
+
537
+ ## 1.1.0-beta.27
538
+
539
+ ### Patch Changes
540
+
541
+ - Updated dependencies [e06565c]
542
+ - @ai-sdk/provider-utils@3.1.0-beta.8
543
+ - ai@5.1.0-beta.27
544
+
545
+ ## 1.1.0-beta.26
546
+
547
+ ### Patch Changes
548
+
549
+ - Updated dependencies [c99da05]
550
+ - ai@5.1.0-beta.26
551
+
552
+ ## 1.1.0-beta.25
553
+
554
+ ### Patch Changes
555
+
556
+ - Updated dependencies [457f1c6]
557
+ - ai@5.1.0-beta.25
558
+
559
+ ## 1.1.0-beta.24
560
+
561
+ ### Patch Changes
562
+
563
+ - Updated dependencies [90e5bdd]
564
+ - ai@5.1.0-beta.24
565
+
566
+ ## 1.1.0-beta.23
567
+
568
+ ### Patch Changes
569
+
570
+ - ai@5.1.0-beta.23
571
+
572
+ ## 1.1.0-beta.22
573
+
574
+ ### Patch Changes
575
+
576
+ - e8109d3: feat: tool execution approval
577
+ - Updated dependencies [046aa3b]
578
+ - Updated dependencies [e8109d3]
579
+ - Updated dependencies [a5e152d]
580
+ - Updated dependencies [21e20c0]
581
+ - ai@5.1.0-beta.22
582
+ - @ai-sdk/provider-utils@3.1.0-beta.7
583
+
584
+ ## 1.1.0-beta.21
585
+
586
+ ### Patch Changes
587
+
588
+ - ai@5.1.0-beta.21
589
+
590
+ ## 1.1.0-beta.20
591
+
592
+ ### Patch Changes
593
+
594
+ - Updated dependencies [846e80e]
595
+ - ai@5.1.0-beta.20
596
+
597
+ ## 1.1.0-beta.19
598
+
599
+ ### Patch Changes
600
+
601
+ - Updated dependencies [aa0515c]
602
+ - Updated dependencies [e7d9b00]
603
+ - Updated dependencies [b1aeea7]
604
+ - ai@5.1.0-beta.19
605
+
606
+ ## 1.1.0-beta.18
607
+
608
+ ### Patch Changes
609
+
610
+ - Updated dependencies [0adc679]
611
+ - Updated dependencies [9b8d17e]
612
+ - @ai-sdk/provider-utils@3.1.0-beta.6
613
+ - ai@5.1.0-beta.18
614
+
615
+ ## 1.1.0-beta.17
616
+
617
+ ### Patch Changes
618
+
619
+ - ai@5.1.0-beta.17
620
+
621
+ ## 1.1.0-beta.16
622
+
623
+ ### Patch Changes
624
+
625
+ - Updated dependencies [14ca35d]
626
+ - ai@5.1.0-beta.16
627
+
628
+ ## 1.1.0-beta.15
629
+
630
+ ### Patch Changes
631
+
632
+ - ai@5.1.0-beta.15
633
+
634
+ ## 1.1.0-beta.14
635
+
636
+ ### Patch Changes
637
+
638
+ - 10c1322: fix: moved dependency `@ai-sdk/test-server` to devDependencies
639
+ - Updated dependencies [7c3c216]
640
+ - Updated dependencies [8dac895]
641
+ - Updated dependencies [e0d1ea9]
642
+ - Updated dependencies [10c1322]
643
+ - ai@5.1.0-beta.14
644
+ - @ai-sdk/provider-utils@3.1.0-beta.5
645
+
646
+ ## 1.1.0-beta.13
647
+
648
+ ### Patch Changes
649
+
650
+ - Updated dependencies [1c2a4c1]
651
+ - ai@5.1.0-beta.13
652
+
653
+ ## 1.1.0-beta.12
654
+
655
+ ### Patch Changes
656
+
657
+ - ai@5.1.0-beta.12
658
+
659
+ ## 1.1.0-beta.11
660
+
661
+ ### Patch Changes
662
+
663
+ - 4616b86: chore: update zod peer depenedency version
664
+ - Updated dependencies [4616b86]
665
+ - @ai-sdk/provider-utils@3.1.0-beta.4
666
+ - ai@5.1.0-beta.11
667
+
668
+ ## 1.1.0-beta.10
669
+
670
+ ### Patch Changes
671
+
672
+ - Updated dependencies [8c98371]
673
+ - ai@5.1.0-beta.10
674
+
3
675
  ## 1.1.0-beta.9
4
676
 
5
677
  ### Patch Changes
package/README.md CHANGED
@@ -163,7 +163,7 @@ await chat.regenerate(options?: {
163
163
  });
164
164
 
165
165
  // Add tool execution result
166
- chat.addToolResult({
166
+ chat.addToolOutput({
167
167
  toolCallId: string;
168
168
  output: string;
169
169
  });
package/dist/index.d.mts CHANGED
@@ -1,7 +1,5 @@
1
- import { UIMessage, AbstractChat, ChatInit, UseCompletionOptions, CompletionRequestOptions, Schema, DeepPartial } from 'ai';
1
+ import { UIMessage, AbstractChat, ChatInit, UseCompletionOptions, CompletionRequestOptions, FlexibleSchema, DeepPartial } from 'ai';
2
2
  import { InferSchema, FetchFunction } from '@ai-sdk/provider-utils';
3
- import * as z3 from 'zod/v3';
4
- import * as z4 from 'zod/v4';
5
3
 
6
4
  declare class Chat<UI_MESSAGE extends UIMessage = UIMessage> extends AbstractChat<UI_MESSAGE> {
7
5
  constructor(init: ChatInit<UI_MESSAGE>);
@@ -34,13 +32,13 @@ declare class Completion {
34
32
  }) => Promise<void>;
35
33
  }
36
34
 
37
- type StructuredObjectOptions<SCHEMA extends z3.Schema | z4.core.$ZodType | Schema, RESULT = InferSchema<SCHEMA>> = {
35
+ type StructuredObjectOptions<SCHEMA extends FlexibleSchema, RESULT = InferSchema<SCHEMA>> = {
38
36
  /**
39
37
  * The API endpoint. It should stream JSON that matches the schema as chunked text.
40
38
  */
41
39
  api: string;
42
40
  /**
43
- * A Zod schema that defines the shape of the complete object.
41
+ * A schema that defines the shape of the complete object.
44
42
  */
45
43
  schema: SCHEMA;
46
44
  /**
@@ -87,7 +85,7 @@ type StructuredObjectOptions<SCHEMA extends z3.Schema | z4.core.$ZodType | Schem
87
85
  */
88
86
  credentials?: RequestCredentials;
89
87
  };
90
- declare class StructuredObject<SCHEMA extends z3.Schema | z4.core.$ZodType | Schema, RESULT = InferSchema<SCHEMA>, INPUT = unknown> {
88
+ declare class StructuredObject<SCHEMA extends FlexibleSchema, RESULT = InferSchema<SCHEMA>, INPUT = unknown> {
91
89
  #private;
92
90
  readonly options: StructuredObjectOptions<SCHEMA, RESULT>;
93
91
  readonly id: string;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,5 @@
1
- import { UIMessage, AbstractChat, ChatInit, UseCompletionOptions, CompletionRequestOptions, Schema, DeepPartial } from 'ai';
1
+ import { UIMessage, AbstractChat, ChatInit, UseCompletionOptions, CompletionRequestOptions, FlexibleSchema, DeepPartial } from 'ai';
2
2
  import { InferSchema, FetchFunction } from '@ai-sdk/provider-utils';
3
- import * as z3 from 'zod/v3';
4
- import * as z4 from 'zod/v4';
5
3
 
6
4
  declare class Chat<UI_MESSAGE extends UIMessage = UIMessage> extends AbstractChat<UI_MESSAGE> {
7
5
  constructor(init: ChatInit<UI_MESSAGE>);
@@ -34,13 +32,13 @@ declare class Completion {
34
32
  }) => Promise<void>;
35
33
  }
36
34
 
37
- type StructuredObjectOptions<SCHEMA extends z3.Schema | z4.core.$ZodType | Schema, RESULT = InferSchema<SCHEMA>> = {
35
+ type StructuredObjectOptions<SCHEMA extends FlexibleSchema, RESULT = InferSchema<SCHEMA>> = {
38
36
  /**
39
37
  * The API endpoint. It should stream JSON that matches the schema as chunked text.
40
38
  */
41
39
  api: string;
42
40
  /**
43
- * A Zod schema that defines the shape of the complete object.
41
+ * A schema that defines the shape of the complete object.
44
42
  */
45
43
  schema: SCHEMA;
46
44
  /**
@@ -87,7 +85,7 @@ type StructuredObjectOptions<SCHEMA extends z3.Schema | z4.core.$ZodType | Schem
87
85
  */
88
86
  credentials?: RequestCredentials;
89
87
  };
90
- declare class StructuredObject<SCHEMA extends z3.Schema | z4.core.$ZodType | Schema, RESULT = InferSchema<SCHEMA>, INPUT = unknown> {
88
+ declare class StructuredObject<SCHEMA extends FlexibleSchema, RESULT = InferSchema<SCHEMA>, INPUT = unknown> {
91
89
  #private;
92
90
  readonly options: StructuredObjectOptions<SCHEMA, RESULT>;
93
91
  readonly id: string;
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.#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"]}
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 FlexibleSchema,\n asSchema,\n isDeepEqualData,\n parsePartialJson,\n type DeepPartial,\n} from 'ai';\n\nexport type StructuredObjectOptions<\n SCHEMA extends FlexibleSchema,\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 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 FlexibleSchema,\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"]}
@@ -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.#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"]}
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 FlexibleSchema,\n asSchema,\n isDeepEqualData,\n parsePartialJson,\n type DeepPartial,\n} from 'ai';\n\nexport type StructuredObjectOptions<\n SCHEMA extends FlexibleSchema,\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 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 FlexibleSchema,\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.1.0-beta.9",
3
+ "version": "2.0.0-beta.100",
4
4
  "description": "Angular implementation of ai-sdk.",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/index.cjs",
@@ -16,12 +16,12 @@
16
16
  },
17
17
  "files": [
18
18
  "dist/**/*",
19
- "CHANGELOG.md"
19
+ "CHANGELOG.md",
20
+ "README.md"
20
21
  ],
21
22
  "dependencies": {
22
- "@ai-sdk/provider-utils": "3.1.0-beta.3",
23
- "@ai-sdk/test-server": "1.0.0-beta.0",
24
- "ai": "5.1.0-beta.9"
23
+ "@ai-sdk/provider-utils": "4.0.0-beta.33",
24
+ "ai": "6.0.0-beta.100"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/node": "20.17.24",
@@ -30,12 +30,13 @@
30
30
  "tsup": "^7.2.0",
31
31
  "typescript": "5.8.3",
32
32
  "vitest": "^3.0.0",
33
+ "zod": "3.25.76",
34
+ "@ai-sdk/test-server": "1.0.0-beta.1",
33
35
  "@vercel/ai-tsconfig": "0.0.0",
34
36
  "eslint-config-vercel-ai": "0.0.0"
35
37
  },
36
38
  "peerDependencies": {
37
- "@angular/core": ">=16.0.0",
38
- "zod": "^3.25.76 || ^4"
39
+ "@angular/core": ">=16.0.0"
39
40
  },
40
41
  "engines": {
41
42
  "node": ">=18"
@@ -43,7 +44,7 @@
43
44
  "scripts": {
44
45
  "build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
45
46
  "build:watch": "pnpm clean && tsup --tsconfig tsconfig.build.json --watch",
46
- "clean": "rm -rf dist *.tsbuildinfo",
47
+ "clean": "del-cli dist *.tsbuildinfo",
47
48
  "lint": "eslint \"./**/*.ts*\"",
48
49
  "type-check": "tsc --build",
49
50
  "prettier-check": "prettier --check \"./**/*.ts*\"",