@ai-sdk/angular 3.0.0-beta.8 → 3.0.0-beta.81

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,515 @@
1
1
  # @ai-sdk/angular
2
2
 
3
+ ## 3.0.0-beta.81
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [2fe1099]
8
+ - Updated dependencies [f04adcb]
9
+ - ai@7.0.0-beta.81
10
+
11
+ ## 3.0.0-beta.80
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [3ae1786]
16
+ - @ai-sdk/provider-utils@5.0.0-beta.17
17
+ - ai@7.0.0-beta.80
18
+
19
+ ## 3.0.0-beta.79
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies [6866afe]
24
+ - ai@7.0.0-beta.79
25
+
26
+ ## 3.0.0-beta.78
27
+
28
+ ### Patch Changes
29
+
30
+ - Updated dependencies [f372547]
31
+ - ai@7.0.0-beta.78
32
+
33
+ ## 3.0.0-beta.77
34
+
35
+ ### Patch Changes
36
+
37
+ - Updated dependencies [2add429]
38
+ - ai@7.0.0-beta.77
39
+
40
+ ## 3.0.0-beta.76
41
+
42
+ ### Patch Changes
43
+
44
+ - Updated dependencies [fcc6869]
45
+ - ai@7.0.0-beta.76
46
+
47
+ ## 3.0.0-beta.75
48
+
49
+ ### Patch Changes
50
+
51
+ - Updated dependencies [176466a]
52
+ - ai@7.0.0-beta.75
53
+ - @ai-sdk/provider-utils@5.0.0-beta.16
54
+
55
+ ## 3.0.0-beta.74
56
+
57
+ ### Patch Changes
58
+
59
+ - Updated dependencies [e311194]
60
+ - ai@7.0.0-beta.74
61
+ - @ai-sdk/provider-utils@5.0.0-beta.15
62
+
63
+ ## 3.0.0-beta.73
64
+
65
+ ### Patch Changes
66
+
67
+ - ai@7.0.0-beta.73
68
+
69
+ ## 3.0.0-beta.72
70
+
71
+ ### Patch Changes
72
+
73
+ - Updated dependencies [664a0eb]
74
+ - ai@7.0.0-beta.72
75
+
76
+ ## 3.0.0-beta.71
77
+
78
+ ### Patch Changes
79
+
80
+ - Updated dependencies [e68be55]
81
+ - ai@7.0.0-beta.71
82
+
83
+ ## 3.0.0-beta.70
84
+
85
+ ### Patch Changes
86
+
87
+ - ai@7.0.0-beta.70
88
+
89
+ ## 3.0.0-beta.69
90
+
91
+ ### Patch Changes
92
+
93
+ - Updated dependencies [34bd95d]
94
+ - Updated dependencies [008271d]
95
+ - Updated dependencies [72223e7]
96
+ - ai@7.0.0-beta.69
97
+ - @ai-sdk/provider-utils@5.0.0-beta.14
98
+
99
+ ## 3.0.0-beta.68
100
+
101
+ ### Patch Changes
102
+
103
+ - Updated dependencies [b0c2869]
104
+ - Updated dependencies [7e26e81]
105
+ - @ai-sdk/provider-utils@5.0.0-beta.13
106
+ - ai@7.0.0-beta.68
107
+
108
+ ## 3.0.0-beta.67
109
+
110
+ ### Patch Changes
111
+
112
+ - Updated dependencies [d1a8bed]
113
+ - ai@7.0.0-beta.67
114
+
115
+ ## 3.0.0-beta.66
116
+
117
+ ### Patch Changes
118
+
119
+ - ai@7.0.0-beta.66
120
+
121
+ ## 3.0.0-beta.65
122
+
123
+ ### Patch Changes
124
+
125
+ - Updated dependencies [46d1149]
126
+ - @ai-sdk/provider-utils@5.0.0-beta.12
127
+ - ai@7.0.0-beta.65
128
+
129
+ ## 3.0.0-beta.64
130
+
131
+ ### Patch Changes
132
+
133
+ - ai@7.0.0-beta.64
134
+
135
+ ## 3.0.0-beta.63
136
+
137
+ ### Patch Changes
138
+
139
+ - Updated dependencies [6fd51c0]
140
+ - @ai-sdk/provider-utils@5.0.0-beta.11
141
+ - ai@7.0.0-beta.63
142
+
143
+ ## 3.0.0-beta.62
144
+
145
+ ### Patch Changes
146
+
147
+ - ai@7.0.0-beta.62
148
+
149
+ ## 3.0.0-beta.61
150
+
151
+ ### Patch Changes
152
+
153
+ - Updated dependencies [c29a26f]
154
+ - @ai-sdk/provider-utils@5.0.0-beta.10
155
+ - ai@7.0.0-beta.61
156
+
157
+ ## 3.0.0-beta.60
158
+
159
+ ### Patch Changes
160
+
161
+ - Updated dependencies [38fc777]
162
+ - ai@7.0.0-beta.60
163
+
164
+ ## 3.0.0-beta.59
165
+
166
+ ### Patch Changes
167
+
168
+ - ai@7.0.0-beta.59
169
+
170
+ ## 3.0.0-beta.58
171
+
172
+ ### Patch Changes
173
+
174
+ - Updated dependencies [2e17091]
175
+ - ai@7.0.0-beta.58
176
+ - @ai-sdk/provider-utils@5.0.0-beta.9
177
+
178
+ ## 3.0.0-beta.57
179
+
180
+ ### Patch Changes
181
+
182
+ - Updated dependencies [986c6fd]
183
+ - Updated dependencies [493295c]
184
+ - @ai-sdk/provider-utils@5.0.0-beta.8
185
+ - ai@7.0.0-beta.57
186
+
187
+ ## 3.0.0-beta.56
188
+
189
+ ### Patch Changes
190
+
191
+ - ai@7.0.0-beta.56
192
+
193
+ ## 3.0.0-beta.55
194
+
195
+ ### Patch Changes
196
+
197
+ - Updated dependencies [b3c9f6a]
198
+ - ai@7.0.0-beta.55
199
+
200
+ ## 3.0.0-beta.54
201
+
202
+ ### Patch Changes
203
+
204
+ - Updated dependencies [5d0f18e]
205
+ - ai@7.0.0-beta.54
206
+
207
+ ## 3.0.0-beta.53
208
+
209
+ ### Patch Changes
210
+
211
+ - Updated dependencies [9b47dea]
212
+ - ai@7.0.0-beta.53
213
+
214
+ ## 3.0.0-beta.52
215
+
216
+ ### Patch Changes
217
+
218
+ - Updated dependencies [b56301c]
219
+ - ai@7.0.0-beta.52
220
+
221
+ ## 3.0.0-beta.51
222
+
223
+ ### Patch Changes
224
+
225
+ - Updated dependencies [6abd098]
226
+ - ai@7.0.0-beta.51
227
+
228
+ ## 3.0.0-beta.50
229
+
230
+ ### Patch Changes
231
+
232
+ - Updated dependencies [3debdb7]
233
+ - ai@7.0.0-beta.50
234
+
235
+ ## 3.0.0-beta.49
236
+
237
+ ### Patch Changes
238
+
239
+ - ai@7.0.0-beta.49
240
+
241
+ ## 3.0.0-beta.48
242
+
243
+ ### Patch Changes
244
+
245
+ - Updated dependencies [5c4d910]
246
+ - ai@7.0.0-beta.48
247
+
248
+ ## 3.0.0-beta.47
249
+
250
+ ### Patch Changes
251
+
252
+ - Updated dependencies [bc67b4f]
253
+ - ai@7.0.0-beta.47
254
+
255
+ ## 3.0.0-beta.46
256
+
257
+ ### Patch Changes
258
+
259
+ - Updated dependencies [31ee822]
260
+ - ai@7.0.0-beta.46
261
+
262
+ ## 3.0.0-beta.45
263
+
264
+ ### Patch Changes
265
+
266
+ - ai@7.0.0-beta.45
267
+
268
+ ## 3.0.0-beta.44
269
+
270
+ ### Patch Changes
271
+
272
+ - ai@7.0.0-beta.44
273
+
274
+ ## 3.0.0-beta.43
275
+
276
+ ### Patch Changes
277
+
278
+ - ai@7.0.0-beta.43
279
+
280
+ ## 3.0.0-beta.42
281
+
282
+ ### Patch Changes
283
+
284
+ - Updated dependencies [a3fd75b]
285
+ - ai@7.0.0-beta.42
286
+
287
+ ## 3.0.0-beta.41
288
+
289
+ ### Patch Changes
290
+
291
+ - ai@7.0.0-beta.41
292
+
293
+ ## 3.0.0-beta.40
294
+
295
+ ### Patch Changes
296
+
297
+ - Updated dependencies [989d3d2]
298
+ - ai@7.0.0-beta.40
299
+
300
+ ## 3.0.0-beta.39
301
+
302
+ ### Patch Changes
303
+
304
+ - Updated dependencies [f4cfccd]
305
+ - ai@7.0.0-beta.39
306
+
307
+ ## 3.0.0-beta.38
308
+
309
+ ### Patch Changes
310
+
311
+ - Updated dependencies [1f509d4]
312
+ - @ai-sdk/provider-utils@5.0.0-beta.7
313
+ - ai@7.0.0-beta.38
314
+
315
+ ## 3.0.0-beta.37
316
+
317
+ ### Patch Changes
318
+
319
+ - ai@7.0.0-beta.37
320
+
321
+ ## 3.0.0-beta.36
322
+
323
+ ### Patch Changes
324
+
325
+ - Updated dependencies [118b953]
326
+ - ai@7.0.0-beta.36
327
+
328
+ ## 3.0.0-beta.35
329
+
330
+ ### Patch Changes
331
+
332
+ - Updated dependencies [99bf941]
333
+ - ai@7.0.0-beta.35
334
+
335
+ ## 3.0.0-beta.34
336
+
337
+ ### Patch Changes
338
+
339
+ - ai@7.0.0-beta.34
340
+
341
+ ## 3.0.0-beta.33
342
+
343
+ ### Patch Changes
344
+
345
+ - Updated dependencies [caf1b6f]
346
+ - ai@7.0.0-beta.33
347
+
348
+ ## 3.0.0-beta.32
349
+
350
+ ### Patch Changes
351
+
352
+ - Updated dependencies [4b46062]
353
+ - ai@7.0.0-beta.32
354
+
355
+ ## 3.0.0-beta.31
356
+
357
+ ### Patch Changes
358
+
359
+ - Updated dependencies [e79e644]
360
+ - ai@7.0.0-beta.31
361
+
362
+ ## 3.0.0-beta.30
363
+
364
+ ### Patch Changes
365
+
366
+ - Updated dependencies [f5a6f89]
367
+ - ai@7.0.0-beta.30
368
+
369
+ ## 3.0.0-beta.29
370
+
371
+ ### Patch Changes
372
+
373
+ - Updated dependencies [877bf12]
374
+ - ai@7.0.0-beta.29
375
+
376
+ ## 3.0.0-beta.28
377
+
378
+ ### Patch Changes
379
+
380
+ - Updated dependencies [b9cf502]
381
+ - ai@7.0.0-beta.28
382
+
383
+ ## 3.0.0-beta.27
384
+
385
+ ### Patch Changes
386
+
387
+ - Updated dependencies [3887c70]
388
+ - @ai-sdk/provider-utils@5.0.0-beta.6
389
+ - ai@7.0.0-beta.27
390
+
391
+ ## 3.0.0-beta.26
392
+
393
+ ### Patch Changes
394
+
395
+ - Updated dependencies [f0b0b20]
396
+ - ai@7.0.0-beta.26
397
+
398
+ ## 3.0.0-beta.25
399
+
400
+ ### Patch Changes
401
+
402
+ - Updated dependencies [ff9ce30]
403
+ - ai@7.0.0-beta.25
404
+
405
+ ## 3.0.0-beta.24
406
+
407
+ ### Patch Changes
408
+
409
+ - Updated dependencies [776b617]
410
+ - @ai-sdk/provider-utils@5.0.0-beta.5
411
+ - ai@7.0.0-beta.24
412
+
413
+ ## 3.0.0-beta.23
414
+
415
+ ### Patch Changes
416
+
417
+ - Updated dependencies [80d4dde]
418
+ - Updated dependencies [61753c3]
419
+ - ai@7.0.0-beta.23
420
+ - @ai-sdk/provider-utils@5.0.0-beta.4
421
+
422
+ ## 3.0.0-beta.22
423
+
424
+ ### Patch Changes
425
+
426
+ - ai@7.0.0-beta.22
427
+
428
+ ## 3.0.0-beta.21
429
+
430
+ ### Patch Changes
431
+
432
+ - Updated dependencies [34fd051]
433
+ - ai@7.0.0-beta.21
434
+
435
+ ## 3.0.0-beta.20
436
+
437
+ ### Patch Changes
438
+
439
+ - ai@7.0.0-beta.20
440
+
441
+ ## 3.0.0-beta.19
442
+
443
+ ### Patch Changes
444
+
445
+ - Updated dependencies [f7d4f01]
446
+ - @ai-sdk/provider-utils@5.0.0-beta.3
447
+ - ai@7.0.0-beta.19
448
+
449
+ ## 3.0.0-beta.18
450
+
451
+ ### Patch Changes
452
+
453
+ - ai@7.0.0-beta.18
454
+ - @ai-sdk/provider-utils@5.0.0-beta.2
455
+
456
+ ## 3.0.0-beta.17
457
+
458
+ ### Patch Changes
459
+
460
+ - ai@7.0.0-beta.17
461
+
462
+ ## 3.0.0-beta.16
463
+
464
+ ### Patch Changes
465
+
466
+ - Updated dependencies [5b8c58f]
467
+ - ai@7.0.0-beta.16
468
+
469
+ ## 3.0.0-beta.15
470
+
471
+ ### Patch Changes
472
+
473
+ - ai@7.0.0-beta.15
474
+
475
+ ## 3.0.0-beta.14
476
+
477
+ ### Patch Changes
478
+
479
+ - ai@7.0.0-beta.14
480
+
481
+ ## 3.0.0-beta.13
482
+
483
+ ### Patch Changes
484
+
485
+ - Updated dependencies [c26ca8d]
486
+ - ai@7.0.0-beta.13
487
+
488
+ ## 3.0.0-beta.12
489
+
490
+ ### Patch Changes
491
+
492
+ - ai@7.0.0-beta.12
493
+
494
+ ## 3.0.0-beta.11
495
+
496
+ ### Patch Changes
497
+
498
+ - ai@7.0.0-beta.11
499
+
500
+ ## 3.0.0-beta.10
501
+
502
+ ### Patch Changes
503
+
504
+ - ai@7.0.0-beta.10
505
+
506
+ ## 3.0.0-beta.9
507
+
508
+ ### Patch Changes
509
+
510
+ - Updated dependencies [1fe058b]
511
+ - ai@7.0.0-beta.9
512
+
3
513
  ## 3.0.0-beta.8
4
514
 
5
515
  ### Patch Changes
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';\nimport { normalizeHeaders } from '@ai-sdk/provider-utils';\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: {\n ...normalizeHeaders(this.#options.headers),\n ...normalizeHeaders(options?.headers),\n },\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 normalizeHeaders,\n safeValidateTypes,\n type FetchFunction,\n type FlexibleSchema,\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} 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.#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 ...normalizeHeaders(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_provider_utils","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<\n UI_MESSAGE extends UIMessage = UIMessage,\n> implements ChatState<UI_MESSAGE> {\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';\nimport { normalizeHeaders } from '@ai-sdk/provider-utils';\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: {\n ...normalizeHeaders(this.#options.headers),\n ...normalizeHeaders(options?.headers),\n },\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 normalizeHeaders,\n safeValidateTypes,\n type FetchFunction,\n type FlexibleSchema,\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} 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.#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 ...normalizeHeaders(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_provider_utils","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';\nimport { normalizeHeaders } from '@ai-sdk/provider-utils';\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: {\n ...normalizeHeaders(this.#options.headers),\n ...normalizeHeaders(options?.headers),\n },\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 normalizeHeaders,\n safeValidateTypes,\n type FetchFunction,\n type FlexibleSchema,\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} 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.#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 ...normalizeHeaders(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","normalizeHeaders","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<\n UI_MESSAGE extends UIMessage = UIMessage,\n> implements ChatState<UI_MESSAGE> {\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';\nimport { normalizeHeaders } from '@ai-sdk/provider-utils';\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: {\n ...normalizeHeaders(this.#options.headers),\n ...normalizeHeaders(options?.headers),\n },\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 normalizeHeaders,\n safeValidateTypes,\n type FetchFunction,\n type FlexibleSchema,\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} 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.#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 ...normalizeHeaders(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","normalizeHeaders","signal"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/angular",
3
- "version": "3.0.0-beta.8",
3
+ "version": "3.0.0-beta.81",
4
4
  "description": "Angular implementation of ai-sdk.",
5
5
  "license": "Apache-2.0",
6
6
  "main": "dist/index.cjs",
@@ -25,20 +25,18 @@
25
25
  "README.md"
26
26
  ],
27
27
  "dependencies": {
28
- "@ai-sdk/provider-utils": "5.0.0-beta.1",
29
- "ai": "7.0.0-beta.8"
28
+ "@ai-sdk/provider-utils": "5.0.0-beta.17",
29
+ "ai": "7.0.0-beta.81"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "20.17.24",
33
- "eslint": "8.57.1",
34
33
  "jsdom": "^24.0.0",
35
34
  "tsup": "^7.2.0",
36
35
  "typescript": "5.8.3",
37
- "vitest": "^3.0.0",
36
+ "vitest": "^4.1.0",
38
37
  "zod": "3.25.76",
39
38
  "@ai-sdk/test-server": "2.0.0-beta.0",
40
- "@vercel/ai-tsconfig": "0.0.0",
41
- "eslint-config-vercel-ai": "0.0.0"
39
+ "@vercel/ai-tsconfig": "0.0.0"
42
40
  },
43
41
  "peerDependencies": {
44
42
  "@angular/core": ">=16.0.0"
@@ -50,9 +48,7 @@
50
48
  "build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
51
49
  "build:watch": "pnpm clean && tsup --tsconfig tsconfig.build.json --watch",
52
50
  "clean": "del-cli dist *.tsbuildinfo",
53
- "lint": "eslint \"./**/*.ts*\"",
54
51
  "type-check": "tsc --build",
55
- "prettier-check": "prettier --check \"./**/*.ts*\"",
56
52
  "test": "vitest --config vitest.config.ts --run",
57
53
  "test:update": "vitest --config vitest.config.ts --run -u",
58
54
  "test:watch": "vitest --config vitest.config.ts"
@@ -18,9 +18,9 @@ export class Chat<
18
18
  }
19
19
  }
20
20
 
21
- class AngularChatState<UI_MESSAGE extends UIMessage = UIMessage>
22
- implements ChatState<UI_MESSAGE>
23
- {
21
+ class AngularChatState<
22
+ UI_MESSAGE extends UIMessage = UIMessage,
23
+ > implements ChatState<UI_MESSAGE> {
24
24
  readonly #messages = signal<UI_MESSAGE[]>([]);
25
25
  readonly #status = signal<ChatStatus>('ready');
26
26
  readonly #error = signal<Error | undefined>(undefined);