@ai-sdk/angular 3.0.122 → 3.0.124

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,27 @@
1
1
  # @ai-sdk/angular
2
2
 
3
+ ## 3.0.124
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [8c65988]
8
+ - Updated dependencies [527a163]
9
+ - ai@7.0.124
10
+ - @ai-sdk/provider-utils@5.0.53
11
+
12
+ ## 3.0.123
13
+
14
+ ### Patch Changes
15
+
16
+ - ede5b89: chore: migrate package builds from tsup to tsdown
17
+ - Updated dependencies [05cdac6]
18
+ - Updated dependencies [4514fc1]
19
+ - Updated dependencies [ede5b89]
20
+ - Updated dependencies [2a625cf]
21
+ - Updated dependencies [50a26d5]
22
+ - ai@7.0.123
23
+ - @ai-sdk/provider-utils@5.0.52
24
+
3
25
  ## 3.0.122
4
26
 
5
27
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,113 +1,116 @@
1
- import { UIMessage, AbstractChat, ChatInit, UseCompletionOptions, CompletionRequestOptions, DeepPartial } from 'ai';
2
- import { FlexibleSchema, InferSchema, FetchFunction } from '@ai-sdk/provider-utils';
3
-
4
- declare class Chat<UI_MESSAGE extends UIMessage = UIMessage> extends AbstractChat<UI_MESSAGE> {
5
- constructor(init: ChatInit<UI_MESSAGE>);
1
+ import { AbstractChat, ChatInit, CompletionRequestOptions, DeepPartial, UIMessage, UseCompletionOptions } from "ai";
2
+ import { FetchFunction, FlexibleSchema, InferSchema } from "@ai-sdk/provider-utils";
3
+ //#region src/lib/chat.ng.d.ts
4
+ export declare class Chat<UI_MESSAGE extends UIMessage = UIMessage> extends AbstractChat<UI_MESSAGE> {
5
+ constructor(init: ChatInit<UI_MESSAGE>);
6
6
  }
7
-
7
+ //#endregion
8
+ //#region src/lib/completion.ng.d.ts
8
9
  type CompletionOptions<BODY extends object = object> = Readonly<UseCompletionOptions<BODY>>;
9
- declare class Completion<BODY extends object = object> {
10
- #private;
11
- readonly id: string;
12
- readonly api: string;
13
- readonly streamProtocol: 'data' | 'text';
14
- constructor(options?: CompletionOptions<NoInfer<BODY>>);
15
- /** Current value of the completion. Writable. */
16
- get completion(): string;
17
- set completion(value: string);
18
- /** Current value of the input. Writable. */
19
- get input(): string;
20
- set input(value: string);
21
- /** The error object of the API request */
22
- get error(): Error | undefined;
23
- /** Flag that indicates whether an API request is in progress. */
24
- get loading(): boolean;
25
- /** Abort the current request immediately, keep the generated tokens if any. */
26
- stop: () => void;
27
- /** Send a new prompt to the API endpoint and update the completion state. */
28
- complete: (prompt: string, options?: CompletionRequestOptions<BODY>) => Promise<string | null | undefined>;
29
- /** Form submission handler to automatically reset input and call the completion API */
30
- handleSubmit: (event?: {
31
- preventDefault?: () => void;
32
- }) => Promise<void>;
10
+ export declare class Completion<BODY extends object = object> {
11
+ #private;
12
+ readonly id: string;
13
+ readonly api: string;
14
+ readonly streamProtocol: 'data' | 'text';
15
+ constructor(options?: CompletionOptions<NoInfer<BODY>>);
16
+ /** Current value of the completion. Writable. */
17
+ get completion(): string;
18
+ set completion(value: string);
19
+ /** Current value of the input. Writable. */
20
+ get input(): string;
21
+ set input(value: string);
22
+ /** The error object of the API request */
23
+ get error(): Error | undefined;
24
+ /** Flag that indicates whether an API request is in progress. */
25
+ get loading(): boolean;
26
+ /** Abort the current request immediately, keep the generated tokens if any. */
27
+ stop: () => void;
28
+ /** Send a new prompt to the API endpoint and update the completion state. */
29
+ complete: (prompt: string, options?: CompletionRequestOptions<BODY>) => Promise<string | null | undefined>;
30
+ /** Form submission handler to automatically reset input and call the completion API */
31
+ handleSubmit: (event?: {
32
+ preventDefault?: () => void;
33
+ }) => Promise<void>;
33
34
  }
34
-
35
+ //#endregion
36
+ //#region src/lib/structured-object.ng.d.ts
35
37
  type StructuredObjectOptions<SCHEMA extends FlexibleSchema, RESULT = InferSchema<SCHEMA>> = {
38
+ /**
39
+ * The API endpoint. It should stream JSON that matches the schema as chunked text.
40
+ */
41
+ api: string;
42
+ /**
43
+ * A schema that defines the shape of the complete object.
44
+ */
45
+ schema: SCHEMA;
46
+ /**
47
+ * A unique identifier. If not provided, a random one will be
48
+ * generated. When provided, the `useObject` hook with the same `id` will
49
+ * have shared states across components.
50
+ */
51
+ id?: string;
52
+ /**
53
+ * An optional value for the initial object.
54
+ */
55
+ initialValue?: DeepPartial<RESULT>;
56
+ /**
57
+ * Custom fetch implementation. You can use it as a middleware to intercept requests,
58
+ * or to provide a custom fetch implementation for e.g. testing.
59
+ */
60
+ fetch?: FetchFunction;
61
+ /**
62
+ * Callback that is called when the stream has finished.
63
+ */
64
+ onFinish?: (event: {
36
65
  /**
37
- * The API endpoint. It should stream JSON that matches the schema as chunked text.
66
+ * The generated object (typed according to the schema).
67
+ * Can be undefined if the final object does not match the schema.
38
68
  */
39
- api: string;
69
+ object: RESULT | undefined;
40
70
  /**
41
- * A schema that defines the shape of the complete object.
71
+ * Optional error object. This is e.g. a TypeValidationError when the final object does not match the schema.
42
72
  */
43
- schema: SCHEMA;
44
- /**
45
- * A unique identifier. If not provided, a random one will be
46
- * generated. When provided, the `useObject` hook with the same `id` will
47
- * have shared states across components.
48
- */
49
- id?: string;
50
- /**
51
- * An optional value for the initial object.
52
- */
53
- initialValue?: DeepPartial<RESULT>;
54
- /**
55
- * Custom fetch implementation. You can use it as a middleware to intercept requests,
56
- * or to provide a custom fetch implementation for e.g. testing.
57
- */
58
- fetch?: FetchFunction;
59
- /**
60
- * Callback that is called when the stream has finished.
61
- */
62
- onFinish?: (event: {
63
- /**
64
- * The generated object (typed according to the schema).
65
- * Can be undefined if the final object does not match the schema.
66
- */
67
- object: RESULT | undefined;
68
- /**
69
- * Optional error object. This is e.g. a TypeValidationError when the final object does not match the schema.
70
- */
71
- error: Error | undefined;
72
- }) => Promise<void> | void;
73
- /**
74
- * Callback function to be called when an error is encountered.
75
- */
76
- onError?: (error: Error) => void;
77
- /**
78
- * Additional HTTP headers to be included in the request.
79
- */
80
- headers?: Record<string, string> | Headers;
81
- /**
82
- * The credentials mode to be used for the fetch request.
83
- * Possible values are: 'omit', 'same-origin', 'include'.
84
- * Defaults to 'same-origin'.
85
- */
86
- credentials?: RequestCredentials;
73
+ error: Error | undefined;
74
+ }) => Promise<void> | void;
75
+ /**
76
+ * Callback function to be called when an error is encountered.
77
+ */
78
+ onError?: (error: Error) => void;
79
+ /**
80
+ * Additional HTTP headers to be included in the request.
81
+ */
82
+ headers?: Record<string, string> | Headers;
83
+ /**
84
+ * The credentials mode to be used for the fetch request.
85
+ * Possible values are: 'omit', 'same-origin', 'include'.
86
+ * Defaults to 'same-origin'.
87
+ */
88
+ credentials?: RequestCredentials;
87
89
  };
88
- declare class StructuredObject<SCHEMA extends FlexibleSchema, RESULT = InferSchema<SCHEMA>, INPUT = unknown> {
89
- #private;
90
- readonly options: StructuredObjectOptions<SCHEMA, RESULT>;
91
- readonly id: string;
92
- /**
93
- * The current value for the generated object. Updated as the API streams JSON chunks.
94
- */
95
- get object(): DeepPartial<RESULT> | undefined;
96
- /** The error object of the API request */
97
- get error(): Error | undefined;
98
- /**
99
- * Flag that indicates whether an API request is in progress.
100
- */
101
- get loading(): boolean;
102
- constructor(options: StructuredObjectOptions<SCHEMA, RESULT>);
103
- /**
104
- * Abort the current request immediately, keep the current partial object if any.
105
- */
106
- stop: () => void;
107
- /**
108
- * Calls the API with the provided input as JSON body.
109
- */
110
- submit: (input: INPUT) => Promise<void>;
90
+ export declare class StructuredObject<SCHEMA extends FlexibleSchema, RESULT = InferSchema<SCHEMA>, INPUT = unknown> {
91
+ #private;
92
+ readonly options: StructuredObjectOptions<SCHEMA, RESULT>;
93
+ readonly id: string;
94
+ /**
95
+ * The current value for the generated object. Updated as the API streams JSON chunks.
96
+ */
97
+ get object(): DeepPartial<RESULT> | undefined;
98
+ /** The error object of the API request */
99
+ get error(): Error | undefined;
100
+ /**
101
+ * Flag that indicates whether an API request is in progress.
102
+ */
103
+ get loading(): boolean;
104
+ constructor(options: StructuredObjectOptions<SCHEMA, RESULT>);
105
+ /**
106
+ * Abort the current request immediately, keep the current partial object if any.
107
+ */
108
+ stop: () => void;
109
+ /**
110
+ * Calls the API with the provided input as JSON body.
111
+ */
112
+ submit: (input: INPUT) => Promise<void>;
111
113
  }
112
-
113
- export { Chat, Completion, CompletionOptions, StructuredObject, StructuredObjectOptions };
114
+ //#endregion
115
+ export type { CompletionOptions, StructuredObjectOptions };
116
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib/chat.ng.ts","../src/lib/completion.ng.ts","../src/lib/structured-object.ng.ts"],"mappings":";;;qBAQa,KACX,mBAAmB,YAAY,mBACvB,aAAa;EACT,YAAA,MAAM,SAAS;;;;KCFjB,kBAAkB,gCAAgC,SAC5D,qBAAqB;qBAGV,WAAW;;WAIb;WACA;WACA;EAUG,YAAA,UAAS,kBAAkB,QAAQ;;MAU3C;MAGA,WAAW;;MAKX;MAGA,MAAM;;MAKN,SAAS;;MAKT;;EAKJ;;EAWA,WAAkB,gBAAgB,UAAU,yBAAyB,UAAK;;EAI1E,eAAsB;IAAU;QAA6B;;;;KChEnD,wBACV,eAAe,gBACf,SAAS,YAAY;;;;EAKrB;;;;EAKA,QAAQ;;;;;;EAOR;;;;EAKA,eAAe,YAAY;;;;;EAM3B,QAAQ;;;;EAKR,YAAY;;;;;IAKV,QAAQ;;;;IAKR,OAAO;QACH;;;;EAKN,WAAW,OAAO;;;;EAKlB,UAAU,yBAAyB;;;;;;EAOnC,cAAc;;qBAGH,iBACX,eAAe,gBACf,SAAS,YAAY,SACrB;;WAES,SAAS,wBAAwB,QAAQ;WACzC;;;;MAWL,UAAU,YAAY;;MAKtB,SAAS;;;;MAOT;EAIQ,YAAA,SAAS,wBAAwB,QAAQ;;;;EASrD;;;;EAcA,SAAgB,OAAO,UAAK"}
package/dist/index.js CHANGED
@@ -1,305 +1,251 @@
1
- // src/lib/chat.ng.ts
2
1
  import { signal } from "@angular/core";
3
- import {
4
- AbstractChat
5
- } from "ai";
2
+ import { AbstractChat, asSchema, callCompletionApi, generateId, isDeepEqualData, parsePartialJson } from "ai";
3
+ import { generateId as generateId$1, isAbortError, normalizeHeaders, safeValidateTypes } from "@ai-sdk/provider-utils";
4
+ //#region src/lib/chat.ng.ts
6
5
  var Chat = class extends AbstractChat {
7
- constructor(init) {
8
- super({
9
- ...init,
10
- state: new AngularChatState(init.messages)
11
- });
12
- }
6
+ constructor(init) {
7
+ super({
8
+ ...init,
9
+ state: new AngularChatState(init.messages)
10
+ });
11
+ }
13
12
  };
14
13
  var AngularChatState = class {
15
- constructor(initialMessages = []) {
16
- this.#messages = signal([]);
17
- this.#status = signal("ready");
18
- this.#error = signal(void 0);
19
- this.setMessages = (messages) => {
20
- this.#messages.set([...messages]);
21
- };
22
- this.pushMessage = (message) => {
23
- this.#messages.update((msgs) => [...msgs, message]);
24
- };
25
- this.popMessage = () => {
26
- this.#messages.update((msgs) => msgs.slice(0, -1));
27
- };
28
- this.replaceMessage = (index, message) => {
29
- this.#messages.update((msgs) => {
30
- const copy = [...msgs];
31
- copy[index] = message;
32
- return copy;
33
- });
34
- };
35
- this.snapshot = (thing) => thing;
36
- this.#messages.set([...initialMessages]);
37
- }
38
- #messages;
39
- #status;
40
- #error;
41
- get messages() {
42
- return this.#messages();
43
- }
44
- set messages(messages) {
45
- this.#messages.set([...messages]);
46
- }
47
- get status() {
48
- return this.#status();
49
- }
50
- set status(status) {
51
- this.#status.set(status);
52
- }
53
- get error() {
54
- return this.#error();
55
- }
56
- set error(error) {
57
- this.#error.set(error);
58
- }
14
+ #messages;
15
+ #status;
16
+ #error;
17
+ get messages() {
18
+ return this.#messages();
19
+ }
20
+ set messages(messages) {
21
+ this.#messages.set([...messages]);
22
+ }
23
+ get status() {
24
+ return this.#status();
25
+ }
26
+ set status(status) {
27
+ this.#status.set(status);
28
+ }
29
+ get error() {
30
+ return this.#error();
31
+ }
32
+ set error(error) {
33
+ this.#error.set(error);
34
+ }
35
+ constructor(initialMessages = []) {
36
+ this.#messages = signal([]);
37
+ this.#status = signal("ready");
38
+ this.#error = signal(void 0);
39
+ this.setMessages = (messages) => {
40
+ this.#messages.set([...messages]);
41
+ };
42
+ this.pushMessage = (message) => {
43
+ this.#messages.update((msgs) => [...msgs, message]);
44
+ };
45
+ this.popMessage = () => {
46
+ this.#messages.update((msgs) => msgs.slice(0, -1));
47
+ };
48
+ this.replaceMessage = (index, message) => {
49
+ this.#messages.update((msgs) => {
50
+ const copy = [...msgs];
51
+ copy[index] = message;
52
+ return copy;
53
+ });
54
+ };
55
+ this.snapshot = (thing) => thing;
56
+ this.#messages.set([...initialMessages]);
57
+ }
59
58
  };
60
-
61
- // src/lib/completion.ng.ts
62
- import { signal as signal2 } from "@angular/core";
63
- import {
64
- callCompletionApi,
65
- generateId
66
- } from "ai";
67
- import { normalizeHeaders } from "@ai-sdk/provider-utils";
59
+ //#endregion
60
+ //#region src/lib/completion.ng.ts
68
61
  var Completion = class {
69
- constructor(options = {}) {
70
- // Reactive state
71
- this.#input = signal2("");
72
- this.#completion = signal2("");
73
- this.#error = signal2(void 0);
74
- this.#loading = signal2(false);
75
- this.#abortController = null;
76
- /** Abort the current request immediately, keep the generated tokens if any. */
77
- this.stop = () => {
78
- try {
79
- this.#abortController?.abort();
80
- } catch {
81
- } finally {
82
- this.#loading.set(false);
83
- }
84
- };
85
- /** Send a new prompt to the API endpoint and update the completion state. */
86
- this.complete = async (prompt, options) => this.#triggerRequest(prompt, options);
87
- /** Form submission handler to automatically reset input and call the completion API */
88
- this.handleSubmit = async (event) => {
89
- event?.preventDefault?.();
90
- if (this.#input()) {
91
- await this.complete(this.#input());
92
- }
93
- };
94
- this.#triggerRequest = async (prompt, options) => {
95
- return callCompletionApi({
96
- api: this.api,
97
- prompt,
98
- credentials: this.#options.credentials,
99
- headers: {
100
- ...normalizeHeaders(this.#options.headers),
101
- ...normalizeHeaders(options?.headers)
102
- },
103
- body: {
104
- ...this.#options.body,
105
- ...options?.body
106
- },
107
- streamProtocol: this.streamProtocol,
108
- fetch: this.#options.fetch,
109
- setCompletion: (completion) => {
110
- this.#completion.set(completion);
111
- },
112
- setLoading: (loading) => {
113
- this.#loading.set(loading);
114
- },
115
- setError: (error) => {
116
- this.#error.set(error);
117
- },
118
- setAbortController: (abortController) => {
119
- this.#abortController = abortController ?? null;
120
- },
121
- getAbortController: () => this.#abortController,
122
- onFinish: this.#options.onFinish,
123
- onError: this.#options.onError
124
- });
125
- };
126
- this.#options = options;
127
- this.#completion.set(options.initialCompletion ?? "");
128
- this.#input.set(options.initialInput ?? "");
129
- this.api = options.api ?? "/api/completion";
130
- this.id = options.id ?? generateId();
131
- this.streamProtocol = options.streamProtocol ?? "data";
132
- }
133
- #options;
134
- #input;
135
- #completion;
136
- #error;
137
- #loading;
138
- #abortController;
139
- /** Current value of the completion. Writable. */
140
- get completion() {
141
- return this.#completion();
142
- }
143
- set completion(value) {
144
- this.#completion.set(value);
145
- }
146
- /** Current value of the input. Writable. */
147
- get input() {
148
- return this.#input();
149
- }
150
- set input(value) {
151
- this.#input.set(value);
152
- }
153
- /** The error object of the API request */
154
- get error() {
155
- return this.#error();
156
- }
157
- /** Flag that indicates whether an API request is in progress. */
158
- get loading() {
159
- return this.#loading();
160
- }
161
- #triggerRequest;
62
+ #options;
63
+ #input;
64
+ #completion;
65
+ #error;
66
+ #loading;
67
+ #abortController;
68
+ constructor(options = {}) {
69
+ this.#input = signal("");
70
+ this.#completion = signal("");
71
+ this.#error = signal(void 0);
72
+ this.#loading = signal(false);
73
+ this.#abortController = null;
74
+ this.stop = () => {
75
+ try {
76
+ this.#abortController?.abort();
77
+ } catch {} finally {
78
+ this.#loading.set(false);
79
+ }
80
+ };
81
+ this.complete = async (prompt, options) => this.#triggerRequest(prompt, options);
82
+ this.handleSubmit = async (event) => {
83
+ event?.preventDefault?.();
84
+ if (this.#input()) await this.complete(this.#input());
85
+ };
86
+ this.#triggerRequest = async (prompt, options) => {
87
+ return callCompletionApi({
88
+ api: this.api,
89
+ prompt,
90
+ credentials: this.#options.credentials,
91
+ headers: {
92
+ ...normalizeHeaders(this.#options.headers),
93
+ ...normalizeHeaders(options?.headers)
94
+ },
95
+ body: {
96
+ ...this.#options.body,
97
+ ...options?.body
98
+ },
99
+ streamProtocol: this.streamProtocol,
100
+ fetch: this.#options.fetch,
101
+ setCompletion: (completion) => {
102
+ this.#completion.set(completion);
103
+ },
104
+ setLoading: (loading) => {
105
+ this.#loading.set(loading);
106
+ },
107
+ setError: (error) => {
108
+ this.#error.set(error);
109
+ },
110
+ setAbortController: (abortController) => {
111
+ this.#abortController = abortController ?? null;
112
+ },
113
+ getAbortController: () => this.#abortController,
114
+ onFinish: this.#options.onFinish,
115
+ onError: this.#options.onError
116
+ });
117
+ };
118
+ this.#options = options;
119
+ this.#completion.set(options.initialCompletion ?? "");
120
+ this.#input.set(options.initialInput ?? "");
121
+ this.api = options.api ?? "/api/completion";
122
+ this.id = options.id ?? generateId();
123
+ this.streamProtocol = options.streamProtocol ?? "data";
124
+ }
125
+ /** Current value of the completion. Writable. */
126
+ get completion() {
127
+ return this.#completion();
128
+ }
129
+ set completion(value) {
130
+ this.#completion.set(value);
131
+ }
132
+ /** Current value of the input. Writable. */
133
+ get input() {
134
+ return this.#input();
135
+ }
136
+ set input(value) {
137
+ this.#input.set(value);
138
+ }
139
+ /** The error object of the API request */
140
+ get error() {
141
+ return this.#error();
142
+ }
143
+ /** Flag that indicates whether an API request is in progress. */
144
+ get loading() {
145
+ return this.#loading();
146
+ }
147
+ #triggerRequest;
162
148
  };
163
-
164
- // src/lib/structured-object.ng.ts
165
- import {
166
- generateId as generateId2,
167
- isAbortError,
168
- normalizeHeaders as normalizeHeaders2,
169
- safeValidateTypes
170
- } from "@ai-sdk/provider-utils";
171
- import { signal as signal3 } from "@angular/core";
172
- import {
173
- asSchema,
174
- isDeepEqualData,
175
- parsePartialJson
176
- } from "ai";
149
+ //#endregion
150
+ //#region src/lib/structured-object.ng.ts
177
151
  var StructuredObject = class {
178
- constructor(options) {
179
- // Reactive state
180
- this.#object = signal3(void 0);
181
- this.#loading = signal3(false);
182
- this.#error = signal3(void 0);
183
- /**
184
- * Abort the current request immediately, keep the current partial object if any.
185
- */
186
- this.stop = () => {
187
- try {
188
- this.#abortController?.abort();
189
- } catch {
190
- } finally {
191
- this.#loading.set(false);
192
- this.#abortController = void 0;
193
- }
194
- };
195
- /**
196
- * Calls the API with the provided input as JSON body.
197
- */
198
- this.submit = async (input) => {
199
- try {
200
- this.#object.set(void 0);
201
- this.#loading.set(true);
202
- this.#error.set(void 0);
203
- const abortController = new AbortController();
204
- this.#abortController = abortController;
205
- const actualFetch = this.options.fetch ?? fetch;
206
- const response = await actualFetch(this.options.api, {
207
- method: "POST",
208
- headers: {
209
- "Content-Type": "application/json",
210
- ...normalizeHeaders2(this.options.headers)
211
- },
212
- credentials: this.options.credentials,
213
- signal: abortController.signal,
214
- body: JSON.stringify(input)
215
- });
216
- if (!response.ok) {
217
- throw new Error(
218
- await response.text() || "Failed to fetch the response."
219
- );
220
- }
221
- if (response.body == null) {
222
- throw new Error("The response body is empty.");
223
- }
224
- let accumulatedText = "";
225
- let latestObject = void 0;
226
- await response.body.pipeThrough(new TextDecoderStream()).pipeTo(
227
- new WritableStream({
228
- write: async (chunk) => {
229
- if (abortController?.signal.aborted) {
230
- throw new DOMException("Stream aborted", "AbortError");
231
- }
232
- accumulatedText += chunk;
233
- const { value } = await parsePartialJson(accumulatedText);
234
- const currentObject = value;
235
- if (!isDeepEqualData(latestObject, currentObject)) {
236
- latestObject = currentObject;
237
- this.#object.set(currentObject);
238
- }
239
- },
240
- close: async () => {
241
- this.#loading.set(false);
242
- this.#abortController = void 0;
243
- if (this.options.onFinish != null) {
244
- const validationResult = await safeValidateTypes({
245
- value: latestObject,
246
- schema: asSchema(this.options.schema)
247
- });
248
- if (validationResult.success) {
249
- this.options.onFinish({
250
- object: validationResult.value,
251
- error: void 0
252
- });
253
- } else {
254
- this.options.onFinish({
255
- object: void 0,
256
- error: validationResult.error
257
- });
258
- }
259
- }
260
- }
261
- })
262
- );
263
- } catch (error) {
264
- if (isAbortError(error)) {
265
- return;
266
- }
267
- const coalescedError = error instanceof Error ? error : new Error(String(error));
268
- if (this.options.onError) {
269
- this.options.onError(coalescedError);
270
- }
271
- this.#loading.set(false);
272
- this.#error.set(coalescedError);
273
- }
274
- };
275
- this.options = options;
276
- this.id = options.id ?? generateId2();
277
- this.#object.set(options.initialValue);
278
- }
279
- #abortController;
280
- #object;
281
- #loading;
282
- #error;
283
- /**
284
- * The current value for the generated object. Updated as the API streams JSON chunks.
285
- */
286
- get object() {
287
- return this.#object();
288
- }
289
- /** The error object of the API request */
290
- get error() {
291
- return this.#error();
292
- }
293
- /**
294
- * Flag that indicates whether an API request is in progress.
295
- */
296
- get loading() {
297
- return this.#loading();
298
- }
299
- };
300
- export {
301
- Chat,
302
- Completion,
303
- StructuredObject
152
+ #abortController;
153
+ #object;
154
+ #loading;
155
+ #error;
156
+ /**
157
+ * The current value for the generated object. Updated as the API streams JSON chunks.
158
+ */
159
+ get object() {
160
+ return this.#object();
161
+ }
162
+ /** The error object of the API request */
163
+ get error() {
164
+ return this.#error();
165
+ }
166
+ /**
167
+ * Flag that indicates whether an API request is in progress.
168
+ */
169
+ get loading() {
170
+ return this.#loading();
171
+ }
172
+ constructor(options) {
173
+ this.#object = signal(void 0);
174
+ this.#loading = signal(false);
175
+ this.#error = signal(void 0);
176
+ this.stop = () => {
177
+ try {
178
+ this.#abortController?.abort();
179
+ } catch {} finally {
180
+ this.#loading.set(false);
181
+ this.#abortController = void 0;
182
+ }
183
+ };
184
+ this.submit = async (input) => {
185
+ try {
186
+ this.#object.set(void 0);
187
+ this.#loading.set(true);
188
+ this.#error.set(void 0);
189
+ const abortController = new AbortController();
190
+ this.#abortController = abortController;
191
+ const response = await (this.options.fetch ?? fetch)(this.options.api, {
192
+ method: "POST",
193
+ headers: {
194
+ "Content-Type": "application/json",
195
+ ...normalizeHeaders(this.options.headers)
196
+ },
197
+ credentials: this.options.credentials,
198
+ signal: abortController.signal,
199
+ body: JSON.stringify(input)
200
+ });
201
+ if (!response.ok) throw new Error(await response.text() || "Failed to fetch the response.");
202
+ if (response.body == null) throw new Error("The response body is empty.");
203
+ let accumulatedText = "";
204
+ let latestObject = void 0;
205
+ await response.body.pipeThrough(new TextDecoderStream()).pipeTo(new WritableStream({
206
+ write: async (chunk) => {
207
+ if (abortController?.signal.aborted) throw new DOMException("Stream aborted", "AbortError");
208
+ accumulatedText += chunk;
209
+ const { value } = await parsePartialJson(accumulatedText);
210
+ const currentObject = value;
211
+ if (!isDeepEqualData(latestObject, currentObject)) {
212
+ latestObject = currentObject;
213
+ this.#object.set(currentObject);
214
+ }
215
+ },
216
+ close: async () => {
217
+ this.#loading.set(false);
218
+ this.#abortController = void 0;
219
+ if (this.options.onFinish != null) {
220
+ const validationResult = await safeValidateTypes({
221
+ value: latestObject,
222
+ schema: asSchema(this.options.schema)
223
+ });
224
+ if (validationResult.success) this.options.onFinish({
225
+ object: validationResult.value,
226
+ error: void 0
227
+ });
228
+ else this.options.onFinish({
229
+ object: void 0,
230
+ error: validationResult.error
231
+ });
232
+ }
233
+ }
234
+ }));
235
+ } catch (error) {
236
+ if (isAbortError(error)) return;
237
+ const coalescedError = error instanceof Error ? error : new Error(String(error));
238
+ if (this.options.onError) this.options.onError(coalescedError);
239
+ this.#loading.set(false);
240
+ this.#error.set(coalescedError);
241
+ }
242
+ };
243
+ this.options = options;
244
+ this.id = options.id ?? generateId$1();
245
+ this.#object.set(options.initialValue);
246
+ }
304
247
  };
248
+ //#endregion
249
+ export { Chat, Completion, StructuredObject };
250
+
305
251
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/chat.ng.ts","../src/lib/completion.ng.ts","../src/lib/structured-object.ng.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport {\n AbstractChat,\n type ChatState,\n type ChatStatus,\n type UIMessage,\n type ChatInit,\n} from 'ai';\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 => 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<BODY extends object = object> = Readonly<\n UseCompletionOptions<BODY>\n>;\n\nexport class Completion<BODY extends object = object> {\n readonly #options: CompletionOptions<BODY>;\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<NoInfer<BODY>> = {}) {\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 }\n };\n\n /** Send a new prompt to the API endpoint and update the completion state. */\n complete = async (prompt: string, options?: CompletionRequestOptions<BODY>) =>\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<BODY>,\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 getAbortController: () => this.#abortController,\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';\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,"file":"index.js","names":["generateId"],"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 AbstractChat,\n type ChatState,\n type ChatStatus,\n type UIMessage,\n type ChatInit,\n} from 'ai';\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 => 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<BODY extends object = object> = Readonly<\n UseCompletionOptions<BODY>\n>;\n\nexport class Completion<BODY extends object = object> {\n readonly #options: CompletionOptions<BODY>;\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<NoInfer<BODY>> = {}) {\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 }\n };\n\n /** Send a new prompt to the API endpoint and update the completion state. */\n complete = async (prompt: string, options?: CompletionRequestOptions<BODY>) =>\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<BODY>,\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 getAbortController: () => this.#abortController,\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';\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/angular",
3
- "version": "3.0.122",
3
+ "version": "3.0.124",
4
4
  "type": "module",
5
5
  "description": "Angular implementation of ai-sdk.",
6
6
  "license": "Apache-2.0",
@@ -25,15 +25,15 @@
25
25
  "README.md"
26
26
  ],
27
27
  "dependencies": {
28
- "@ai-sdk/provider-utils": "5.0.51",
29
- "ai": "7.0.122"
28
+ "@ai-sdk/provider-utils": "5.0.53",
29
+ "ai": "7.0.124"
30
30
  },
31
31
  "devDependencies": {
32
- "@ai-sdk/test-server": "2.0.2",
32
+ "@ai-sdk/test-server": "2.0.3",
33
33
  "@types/node": "22.19.19",
34
34
  "@vercel/ai-tsconfig": "0.0.0",
35
35
  "jsdom": "^24.1.3",
36
- "tsup": "^7.2.0",
36
+ "tsdown": "^0.23.0",
37
37
  "typescript": "5.8.3",
38
38
  "vitest": "^4.1.6",
39
39
  "zod": "3.25.76"
@@ -63,9 +63,9 @@
63
63
  "angular"
64
64
  ],
65
65
  "scripts": {
66
- "build": "pnpm clean && tsup --tsconfig tsconfig.build.json",
67
- "build:watch": "pnpm clean && tsup --tsconfig tsconfig.build.json --watch",
68
- "clean": "del-cli dist *.tsbuildinfo",
66
+ "build": "pnpm clean && tsdown",
67
+ "build:watch": "pnpm clean && tsdown --watch",
68
+ "clean": "del-cli *.tsbuildinfo",
69
69
  "type-check": "tsc --build",
70
70
  "test": "vitest --config vitest.config.ts --run",
71
71
  "test:update": "vitest --config vitest.config.ts --run -u",