openai 4.28.4 → 4.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +7 -10
  3. package/index.d.mts +1 -0
  4. package/index.d.ts +1 -0
  5. package/index.d.ts.map +1 -1
  6. package/index.js.map +1 -1
  7. package/index.mjs.map +1 -1
  8. package/lib/AbstractAssistantStreamRunner.d.ts +74 -0
  9. package/lib/AbstractAssistantStreamRunner.d.ts.map +1 -0
  10. package/lib/AbstractAssistantStreamRunner.js +246 -0
  11. package/lib/AbstractAssistantStreamRunner.js.map +1 -0
  12. package/lib/AbstractAssistantStreamRunner.mjs +242 -0
  13. package/lib/AbstractAssistantStreamRunner.mjs.map +1 -0
  14. package/lib/AssistantStream.d.ts +56 -0
  15. package/lib/AssistantStream.d.ts.map +1 -0
  16. package/lib/AssistantStream.js +526 -0
  17. package/lib/AssistantStream.js.map +1 -0
  18. package/lib/AssistantStream.mjs +499 -0
  19. package/lib/AssistantStream.mjs.map +1 -0
  20. package/lib/ChatCompletionRunFunctions.test.js +35 -0
  21. package/lib/ChatCompletionRunFunctions.test.js.map +1 -1
  22. package/lib/ChatCompletionRunFunctions.test.mjs +35 -0
  23. package/lib/ChatCompletionRunFunctions.test.mjs.map +1 -1
  24. package/lib/ChatCompletionStream.d.ts.map +1 -1
  25. package/lib/ChatCompletionStream.js +21 -3
  26. package/lib/ChatCompletionStream.js.map +1 -1
  27. package/lib/ChatCompletionStream.mjs +21 -3
  28. package/lib/ChatCompletionStream.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/resources/audio/speech.d.ts +3 -6
  31. package/resources/audio/speech.d.ts.map +1 -1
  32. package/resources/audio/speech.js.map +1 -1
  33. package/resources/audio/speech.mjs.map +1 -1
  34. package/resources/audio/transcriptions.d.ts +14 -4
  35. package/resources/audio/transcriptions.d.ts.map +1 -1
  36. package/resources/audio/transcriptions.js.map +1 -1
  37. package/resources/audio/transcriptions.mjs.map +1 -1
  38. package/resources/audio/translations.d.ts +2 -1
  39. package/resources/audio/translations.d.ts.map +1 -1
  40. package/resources/audio/translations.js.map +1 -1
  41. package/resources/audio/translations.mjs.map +1 -1
  42. package/resources/beta/assistants/assistants.d.ts +629 -60
  43. package/resources/beta/assistants/assistants.d.ts.map +1 -1
  44. package/resources/beta/assistants/assistants.js.map +1 -1
  45. package/resources/beta/assistants/assistants.mjs.map +1 -1
  46. package/resources/beta/assistants/index.d.ts +1 -1
  47. package/resources/beta/assistants/index.d.ts.map +1 -1
  48. package/resources/beta/assistants/index.js.map +1 -1
  49. package/resources/beta/assistants/index.mjs.map +1 -1
  50. package/resources/beta/beta.d.ts +12 -0
  51. package/resources/beta/beta.d.ts.map +1 -1
  52. package/resources/beta/beta.js.map +1 -1
  53. package/resources/beta/beta.mjs.map +1 -1
  54. package/resources/beta/index.d.ts +2 -2
  55. package/resources/beta/index.d.ts.map +1 -1
  56. package/resources/beta/index.js.map +1 -1
  57. package/resources/beta/index.mjs.map +1 -1
  58. package/resources/beta/threads/index.d.ts +3 -3
  59. package/resources/beta/threads/index.d.ts.map +1 -1
  60. package/resources/beta/threads/index.js +2 -2
  61. package/resources/beta/threads/index.js.map +1 -1
  62. package/resources/beta/threads/index.mjs +1 -1
  63. package/resources/beta/threads/index.mjs.map +1 -1
  64. package/resources/beta/threads/messages/index.d.ts +1 -1
  65. package/resources/beta/threads/messages/index.d.ts.map +1 -1
  66. package/resources/beta/threads/messages/index.js +2 -2
  67. package/resources/beta/threads/messages/index.js.map +1 -1
  68. package/resources/beta/threads/messages/index.mjs +1 -1
  69. package/resources/beta/threads/messages/index.mjs.map +1 -1
  70. package/resources/beta/threads/messages/messages.d.ts +289 -86
  71. package/resources/beta/threads/messages/messages.d.ts.map +1 -1
  72. package/resources/beta/threads/messages/messages.js +5 -5
  73. package/resources/beta/threads/messages/messages.js.map +1 -1
  74. package/resources/beta/threads/messages/messages.mjs +3 -3
  75. package/resources/beta/threads/messages/messages.mjs.map +1 -1
  76. package/resources/beta/threads/runs/index.d.ts +2 -2
  77. package/resources/beta/threads/runs/index.d.ts.map +1 -1
  78. package/resources/beta/threads/runs/index.js.map +1 -1
  79. package/resources/beta/threads/runs/index.mjs.map +1 -1
  80. package/resources/beta/threads/runs/runs.d.ts +153 -49
  81. package/resources/beta/threads/runs/runs.d.ts.map +1 -1
  82. package/resources/beta/threads/runs/runs.js +14 -7
  83. package/resources/beta/threads/runs/runs.js.map +1 -1
  84. package/resources/beta/threads/runs/runs.mjs +14 -7
  85. package/resources/beta/threads/runs/runs.mjs.map +1 -1
  86. package/resources/beta/threads/runs/steps.d.ts +219 -5
  87. package/resources/beta/threads/runs/steps.d.ts.map +1 -1
  88. package/resources/beta/threads/runs/steps.js.map +1 -1
  89. package/resources/beta/threads/runs/steps.mjs.map +1 -1
  90. package/resources/beta/threads/threads.d.ts +144 -22
  91. package/resources/beta/threads/threads.d.ts.map +1 -1
  92. package/resources/beta/threads/threads.js +9 -4
  93. package/resources/beta/threads/threads.js.map +1 -1
  94. package/resources/beta/threads/threads.mjs +9 -4
  95. package/resources/beta/threads/threads.mjs.map +1 -1
  96. package/resources/chat/completions.d.ts +28 -18
  97. package/resources/chat/completions.d.ts.map +1 -1
  98. package/resources/chat/completions.js.map +1 -1
  99. package/resources/chat/completions.mjs.map +1 -1
  100. package/resources/completions.d.ts +2 -0
  101. package/resources/completions.d.ts.map +1 -1
  102. package/resources/completions.js.map +1 -1
  103. package/resources/completions.mjs.map +1 -1
  104. package/resources/files.d.ts +4 -4
  105. package/resources/images.d.ts +6 -3
  106. package/resources/images.d.ts.map +1 -1
  107. package/resources/images.js.map +1 -1
  108. package/resources/images.mjs.map +1 -1
  109. package/resources/moderations.d.ts +3 -5
  110. package/resources/moderations.d.ts.map +1 -1
  111. package/resources/moderations.js +1 -1
  112. package/resources/moderations.js.map +1 -1
  113. package/resources/moderations.mjs +1 -1
  114. package/resources/moderations.mjs.map +1 -1
  115. package/resources/shared.d.ts +6 -0
  116. package/resources/shared.d.ts.map +1 -1
  117. package/src/index.ts +1 -0
  118. package/src/lib/AbstractAssistantStreamRunner.ts +340 -0
  119. package/src/lib/AssistantStream.ts +698 -0
  120. package/src/lib/ChatCompletionRunFunctions.test.ts +52 -1
  121. package/src/lib/ChatCompletionStream.ts +29 -6
  122. package/src/resources/audio/speech.ts +3 -6
  123. package/src/resources/audio/transcriptions.ts +14 -4
  124. package/src/resources/audio/translations.ts +2 -1
  125. package/src/resources/beta/assistants/assistants.ts +768 -76
  126. package/src/resources/beta/assistants/index.ts +9 -0
  127. package/src/resources/beta/beta.ts +12 -0
  128. package/src/resources/beta/index.ts +12 -0
  129. package/src/resources/beta/threads/index.ts +30 -5
  130. package/src/resources/beta/threads/messages/index.ts +21 -5
  131. package/src/resources/beta/threads/messages/messages.ts +332 -94
  132. package/src/resources/beta/threads/runs/index.ts +18 -1
  133. package/src/resources/beta/threads/runs/runs.ts +225 -60
  134. package/src/resources/beta/threads/runs/steps.ts +254 -5
  135. package/src/resources/beta/threads/threads.ts +182 -25
  136. package/src/resources/chat/completions.ts +28 -18
  137. package/src/resources/completions.ts +2 -0
  138. package/src/resources/files.ts +4 -4
  139. package/src/resources/images.ts +6 -3
  140. package/src/resources/moderations.ts +3 -5
  141. package/src/resources/shared.ts +10 -0
  142. package/src/streaming.ts +31 -0
  143. package/src/version.ts +1 -1
  144. package/streaming.d.ts +2 -0
  145. package/streaming.d.ts.map +1 -1
  146. package/streaming.js +32 -1
  147. package/streaming.js.map +1 -1
  148. package/streaming.mjs +30 -0
  149. package/streaming.mjs.map +1 -1
  150. package/version.d.ts +1 -1
  151. package/version.js +1 -1
  152. package/version.mjs +1 -1
@@ -0,0 +1,340 @@
1
+ import * as Core from "../core";
2
+ import { APIUserAbortError, OpenAIError } from "../error";
3
+ import { Run, RunSubmitToolOutputsParamsBase } from "../resources/beta/threads/runs/runs";
4
+ import { RunCreateParamsBase, Runs } from "../resources/beta/threads/runs/runs";
5
+ import { ThreadCreateAndRunParamsBase, Threads } from "../resources/beta/threads/threads";
6
+
7
+ export abstract class AbstractAssistantStreamRunner<
8
+ Events extends CustomEvents<any> = AbstractAssistantRunnerEvents,
9
+ > {
10
+ controller: AbortController = new AbortController();
11
+
12
+ #connectedPromise: Promise<void>;
13
+ #resolveConnectedPromise: () => void = () => {};
14
+ #rejectConnectedPromise: (error: OpenAIError) => void = () => {};
15
+
16
+ #endPromise: Promise<void>;
17
+ #resolveEndPromise: () => void = () => {};
18
+ #rejectEndPromise: (error: OpenAIError) => void = () => {};
19
+
20
+ #listeners: { [Event in keyof Events]?: ListenersForEvent<Events, Event> } = {};
21
+
22
+ #ended = false;
23
+ #errored = false;
24
+ #aborted = false;
25
+ #catchingPromiseCreated = false;
26
+
27
+ constructor() {
28
+ this.#connectedPromise = new Promise<void>((resolve, reject) => {
29
+ this.#resolveConnectedPromise = resolve;
30
+ this.#rejectConnectedPromise = reject;
31
+ });
32
+
33
+ this.#endPromise = new Promise<void>((resolve, reject) => {
34
+ this.#resolveEndPromise = resolve;
35
+ this.#rejectEndPromise = reject;
36
+ });
37
+
38
+ // Don't let these promises cause unhandled rejection errors.
39
+ // we will manually cause an unhandled rejection error later
40
+ // if the user hasn't registered any error listener or called
41
+ // any promise-returning method.
42
+ this.#connectedPromise.catch(() => {});
43
+ this.#endPromise.catch(() => {});
44
+ }
45
+
46
+ protected _run(executor: () => Promise<any>) {
47
+ // Unfortunately if we call `executor()` immediately we get runtime errors about
48
+ // references to `this` before the `super()` constructor call returns.
49
+ setTimeout(() => {
50
+ executor().then(() => {
51
+ // this._emitFinal();
52
+ this._emit('end');
53
+ }, this.#handleError);
54
+ }, 0);
55
+ }
56
+
57
+ protected _addRun(run: Run): Run {
58
+ return run;
59
+ }
60
+
61
+ protected _connected() {
62
+ if (this.ended) return;
63
+ this.#resolveConnectedPromise();
64
+ this._emit('connect');
65
+ }
66
+
67
+ get ended(): boolean {
68
+ return this.#ended;
69
+ }
70
+
71
+ get errored(): boolean {
72
+ return this.#errored;
73
+ }
74
+
75
+ get aborted(): boolean {
76
+ return this.#aborted;
77
+ }
78
+
79
+ abort() {
80
+ this.controller.abort();
81
+ }
82
+
83
+ /**
84
+ * Adds the listener function to the end of the listeners array for the event.
85
+ * No checks are made to see if the listener has already been added. Multiple calls passing
86
+ * the same combination of event and listener will result in the listener being added, and
87
+ * called, multiple times.
88
+ * @returns this ChatCompletionStream, so that calls can be chained
89
+ */
90
+ on<Event extends keyof Events>(event: Event, listener: ListenerForEvent<Events, Event>): this {
91
+ const listeners: ListenersForEvent<Events, Event> =
92
+ this.#listeners[event] || (this.#listeners[event] = []);
93
+ listeners.push({ listener });
94
+ return this;
95
+ }
96
+
97
+ /**
98
+ * Removes the specified listener from the listener array for the event.
99
+ * off() will remove, at most, one instance of a listener from the listener array. If any single
100
+ * listener has been added multiple times to the listener array for the specified event, then
101
+ * off() must be called multiple times to remove each instance.
102
+ * @returns this ChatCompletionStream, so that calls can be chained
103
+ */
104
+ off<Event extends keyof Events>(event: Event, listener: ListenerForEvent<Events, Event>): this {
105
+ const listeners = this.#listeners[event];
106
+ if (!listeners) return this;
107
+ const index = listeners.findIndex((l) => l.listener === listener);
108
+ if (index >= 0) listeners.splice(index, 1);
109
+ return this;
110
+ }
111
+
112
+ /**
113
+ * Adds a one-time listener function for the event. The next time the event is triggered,
114
+ * this listener is removed and then invoked.
115
+ * @returns this ChatCompletionStream, so that calls can be chained
116
+ */
117
+ once<Event extends keyof Events>(event: Event, listener: ListenerForEvent<Events, Event>): this {
118
+ const listeners: ListenersForEvent<Events, Event> =
119
+ this.#listeners[event] || (this.#listeners[event] = []);
120
+ listeners.push({ listener, once: true });
121
+ return this;
122
+ }
123
+
124
+ /**
125
+ * This is similar to `.once()`, but returns a Promise that resolves the next time
126
+ * the event is triggered, instead of calling a listener callback.
127
+ * @returns a Promise that resolves the next time given event is triggered,
128
+ * or rejects if an error is emitted. (If you request the 'error' event,
129
+ * returns a promise that resolves with the error).
130
+ *
131
+ * Example:
132
+ *
133
+ * const message = await stream.emitted('message') // rejects if the stream errors
134
+ */
135
+ emitted<Event extends keyof Events>(
136
+ event: Event,
137
+ ): Promise<
138
+ EventParameters<Events, Event> extends [infer Param] ? Param
139
+ : EventParameters<Events, Event> extends [] ? void
140
+ : EventParameters<Events, Event>
141
+ > {
142
+ return new Promise((resolve, reject) => {
143
+ this.#catchingPromiseCreated = true;
144
+ if (event !== 'error') this.once('error', reject);
145
+ this.once(event, resolve as any);
146
+ });
147
+ }
148
+
149
+ async done(): Promise<void> {
150
+ this.#catchingPromiseCreated = true;
151
+ await this.#endPromise;
152
+ }
153
+
154
+ #handleError = (error: unknown) => {
155
+ this.#errored = true;
156
+ if (error instanceof Error && error.name === 'AbortError') {
157
+ error = new APIUserAbortError();
158
+ }
159
+ if (error instanceof APIUserAbortError) {
160
+ this.#aborted = true;
161
+ return this._emit('abort', error);
162
+ }
163
+ if (error instanceof OpenAIError) {
164
+ return this._emit('error', error);
165
+ }
166
+ if (error instanceof Error) {
167
+ const openAIError: OpenAIError = new OpenAIError(error.message);
168
+ // @ts-ignore
169
+ openAIError.cause = error;
170
+ return this._emit('error', openAIError);
171
+ }
172
+ return this._emit('error', new OpenAIError(String(error)));
173
+ };
174
+
175
+ protected _emit<Event extends keyof Events>(event: Event, ...args: EventParameters<Events, Event>) {
176
+ // make sure we don't emit any events after end
177
+ if (this.#ended) {
178
+ return;
179
+ }
180
+
181
+ if (event === 'end') {
182
+ this.#ended = true;
183
+ this.#resolveEndPromise();
184
+ }
185
+
186
+ const listeners: ListenersForEvent<Events, Event> | undefined = this.#listeners[event];
187
+ if (listeners) {
188
+ this.#listeners[event] = listeners.filter((l) => !l.once) as any;
189
+ listeners.forEach(({ listener }: any) => listener(...args));
190
+ }
191
+
192
+ if (event === 'abort') {
193
+ const error = args[0] as APIUserAbortError;
194
+ if (!this.#catchingPromiseCreated && !listeners?.length) {
195
+ Promise.reject(error);
196
+ }
197
+ this.#rejectConnectedPromise(error);
198
+ this.#rejectEndPromise(error);
199
+ this._emit('end');
200
+ return;
201
+ }
202
+
203
+ if (event === 'error') {
204
+ // NOTE: _emit('error', error) should only be called from #handleError().
205
+
206
+ const error = args[0] as OpenAIError;
207
+ if (!this.#catchingPromiseCreated && !listeners?.length) {
208
+ // Trigger an unhandled rejection if the user hasn't registered any error handlers.
209
+ // If you are seeing stack traces here, make sure to handle errors via either:
210
+ // - runner.on('error', () => ...)
211
+ // - await runner.done()
212
+ // - await runner.finalChatCompletion()
213
+ // - etc.
214
+ Promise.reject(error);
215
+ }
216
+ this.#rejectConnectedPromise(error);
217
+ this.#rejectEndPromise(error);
218
+ this._emit('end');
219
+ }
220
+ }
221
+
222
+ protected async _threadAssistantStream(
223
+ body: ThreadCreateAndRunParamsBase,
224
+ thread: Threads,
225
+ options?: Core.RequestOptions,
226
+ ): Promise<Run> {
227
+ return await this._createThreadAssistantStream(thread, body, options);
228
+ }
229
+
230
+ protected async _runAssistantStream(
231
+ threadId: string,
232
+ runs: Runs,
233
+ params: RunCreateParamsBase,
234
+ options?: Core.RequestOptions,
235
+ ): Promise<Run> {
236
+ return await this._createAssistantStream(runs, threadId, params, options);
237
+ }
238
+
239
+ protected async _runToolAssistantStream(
240
+ threadId: string,
241
+ runId: string,
242
+ runs: Runs,
243
+ params: RunSubmitToolOutputsParamsBase,
244
+ options?: Core.RequestOptions,
245
+ ): Promise<Run> {
246
+ return await this._createToolAssistantStream(runs, threadId, runId, params, options);
247
+ }
248
+
249
+ protected async _createThreadAssistantStream(
250
+ thread: Threads,
251
+ body: ThreadCreateAndRunParamsBase,
252
+ options?: Core.RequestOptions,
253
+ ): Promise<Run> {
254
+ const signal = options?.signal;
255
+ if (signal) {
256
+ if (signal.aborted) this.controller.abort();
257
+ signal.addEventListener('abort', () => this.controller.abort());
258
+ }
259
+ // this.#validateParams(params);
260
+
261
+ const runResult = await thread.createAndRun(
262
+ { ...body, stream: false },
263
+ { ...options, signal: this.controller.signal },
264
+ );
265
+ this._connected();
266
+ return this._addRun(runResult as Run);
267
+ }
268
+
269
+ protected async _createToolAssistantStream(
270
+ run: Runs,
271
+ threadId: string,
272
+ runId: string,
273
+ params: RunSubmitToolOutputsParamsBase,
274
+ options?: Core.RequestOptions,
275
+ ): Promise<Run> {
276
+ const signal = options?.signal;
277
+ if (signal) {
278
+ if (signal.aborted) this.controller.abort();
279
+ signal.addEventListener('abort', () => this.controller.abort());
280
+ }
281
+
282
+ const runResult = await run.submitToolOutputs(
283
+ threadId,
284
+ runId,
285
+ { ...params, stream: false },
286
+ { ...options, signal: this.controller.signal },
287
+ );
288
+ this._connected();
289
+ return this._addRun(runResult as Run);
290
+ }
291
+
292
+ protected async _createAssistantStream(
293
+ run: Runs,
294
+ threadId: string,
295
+ params: RunCreateParamsBase,
296
+ options?: Core.RequestOptions,
297
+ ): Promise<Run> {
298
+ const signal = options?.signal;
299
+ if (signal) {
300
+ if (signal.aborted) this.controller.abort();
301
+ signal.addEventListener('abort', () => this.controller.abort());
302
+ }
303
+ // this.#validateParams(params);
304
+
305
+ const runResult = await run.create(
306
+ threadId,
307
+ { ...params, stream: false },
308
+ { ...options, signal: this.controller.signal },
309
+ );
310
+ this._connected();
311
+ return this._addRun(runResult as Run);
312
+ }
313
+ }
314
+
315
+ type CustomEvents<Event extends string> = {
316
+ [k in Event]: k extends keyof AbstractAssistantRunnerEvents ? AbstractAssistantRunnerEvents[k]
317
+ : (...args: any[]) => void;
318
+ };
319
+
320
+ type ListenerForEvent<Events extends CustomEvents<any>, Event extends keyof Events> = Event extends (
321
+ keyof AbstractAssistantRunnerEvents
322
+ ) ?
323
+ AbstractAssistantRunnerEvents[Event]
324
+ : Events[Event];
325
+
326
+ type ListenersForEvent<Events extends CustomEvents<any>, Event extends keyof Events> = Array<{
327
+ listener: ListenerForEvent<Events, Event>;
328
+ once?: boolean;
329
+ }>;
330
+ type EventParameters<Events extends CustomEvents<any>, Event extends keyof Events> = Parameters<
331
+ ListenerForEvent<Events, Event>
332
+ >;
333
+
334
+ export interface AbstractAssistantRunnerEvents {
335
+ connect: () => void;
336
+ run: (run: Run) => void;
337
+ error: (error: OpenAIError) => void;
338
+ abort: (error: APIUserAbortError) => void;
339
+ end: () => void;
340
+ }