openai 4.53.2 → 4.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +2 -2
- package/index.d.mts +4 -0
- package/index.d.ts +4 -0
- package/index.d.ts.map +1 -1
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/index.mjs +1 -0
- package/index.mjs.map +1 -1
- package/lib/AbstractChatCompletionRunner.d.ts +6 -61
- package/lib/AbstractChatCompletionRunner.d.ts.map +1 -1
- package/lib/AbstractChatCompletionRunner.js +5 -185
- package/lib/AbstractChatCompletionRunner.js.map +1 -1
- package/lib/AbstractChatCompletionRunner.mjs +6 -186
- package/lib/AbstractChatCompletionRunner.mjs.map +1 -1
- package/lib/AssistantStream.d.ts +8 -4
- package/lib/AssistantStream.d.ts.map +1 -1
- package/lib/AssistantStream.js +14 -2
- package/lib/AssistantStream.js.map +1 -1
- package/lib/AssistantStream.mjs +14 -2
- package/lib/AssistantStream.mjs.map +1 -1
- package/lib/ChatCompletionRunner.d.ts +1 -1
- package/lib/ChatCompletionRunner.d.ts.map +1 -1
- package/lib/ChatCompletionRunner.js.map +1 -1
- package/lib/ChatCompletionRunner.mjs.map +1 -1
- package/lib/ChatCompletionStream.d.ts +1 -1
- package/lib/ChatCompletionStream.d.ts.map +1 -1
- package/lib/ChatCompletionStream.js.map +1 -1
- package/lib/ChatCompletionStream.mjs.map +1 -1
- package/lib/EventStream.d.ts +63 -0
- package/lib/EventStream.d.ts.map +1 -0
- package/lib/EventStream.js +200 -0
- package/lib/EventStream.js.map +1 -0
- package/lib/EventStream.mjs +196 -0
- package/lib/EventStream.mjs.map +1 -0
- package/package.json +1 -1
- package/resources/audio/audio.d.ts +4 -0
- package/resources/audio/audio.d.ts.map +1 -1
- package/resources/audio/audio.js.map +1 -1
- package/resources/audio/audio.mjs.map +1 -1
- package/resources/audio/index.d.ts +2 -2
- package/resources/audio/index.d.ts.map +1 -1
- package/resources/audio/index.js.map +1 -1
- package/resources/audio/index.mjs.map +1 -1
- package/resources/audio/speech.d.ts +3 -1
- package/resources/audio/speech.d.ts.map +1 -1
- package/resources/audio/speech.js.map +1 -1
- package/resources/audio/speech.mjs.map +1 -1
- package/resources/audio/transcriptions.d.ts +2 -1
- package/resources/audio/transcriptions.d.ts.map +1 -1
- package/resources/audio/transcriptions.js.map +1 -1
- package/resources/audio/transcriptions.mjs.map +1 -1
- package/resources/audio/translations.d.ts +2 -1
- package/resources/audio/translations.d.ts.map +1 -1
- package/resources/audio/translations.js.map +1 -1
- package/resources/audio/translations.mjs.map +1 -1
- package/resources/beta/assistants.d.ts +2 -1
- package/resources/beta/assistants.d.ts.map +1 -1
- package/resources/beta/assistants.js.map +1 -1
- package/resources/beta/assistants.mjs.map +1 -1
- package/resources/beta/threads/runs/runs.d.ts +2 -1
- package/resources/beta/threads/runs/runs.d.ts.map +1 -1
- package/resources/beta/threads/runs/runs.js.map +1 -1
- package/resources/beta/threads/runs/runs.mjs.map +1 -1
- package/resources/beta/threads/threads.d.ts +2 -1
- package/resources/beta/threads/threads.d.ts.map +1 -1
- package/resources/beta/threads/threads.js.map +1 -1
- package/resources/beta/threads/threads.mjs.map +1 -1
- package/resources/images.d.ts +5 -3
- package/resources/images.d.ts.map +1 -1
- package/resources/images.js.map +1 -1
- package/resources/images.mjs.map +1 -1
- package/resources/index.d.ts +3 -3
- package/resources/index.d.ts.map +1 -1
- package/resources/index.js.map +1 -1
- package/resources/index.mjs +1 -1
- package/resources/index.mjs.map +1 -1
- package/resources/moderations.d.ts +3 -1
- package/resources/moderations.d.ts.map +1 -1
- package/resources/moderations.js.map +1 -1
- package/resources/moderations.mjs.map +1 -1
- package/src/index.ts +4 -0
- package/src/lib/AbstractChatCompletionRunner.ts +16 -239
- package/src/lib/AssistantStream.ts +43 -15
- package/src/lib/ChatCompletionRunner.ts +1 -1
- package/src/lib/ChatCompletionStream.ts +2 -2
- package/src/lib/{AbstractAssistantStreamRunner.ts → EventStream.ts} +37 -138
- package/src/resources/audio/audio.ts +5 -0
- package/src/resources/audio/index.ts +2 -2
- package/src/resources/audio/speech.ts +4 -1
- package/src/resources/audio/transcriptions.ts +2 -1
- package/src/resources/audio/translations.ts +2 -1
- package/src/resources/beta/assistants.ts +2 -24
- package/src/resources/beta/threads/runs/runs.ts +2 -25
- package/src/resources/beta/threads/threads.ts +2 -25
- package/src/resources/images.ts +6 -3
- package/src/resources/index.ts +9 -2
- package/src/resources/moderations.ts +4 -1
- package/src/version.ts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
- package/lib/AbstractAssistantStreamRunner.d.ts +0 -74
- package/lib/AbstractAssistantStreamRunner.d.ts.map +0 -1
- package/lib/AbstractAssistantStreamRunner.js +0 -246
- package/lib/AbstractAssistantStreamRunner.js.map +0 -1
- package/lib/AbstractAssistantStreamRunner.mjs +0 -242
- package/lib/AbstractAssistantStreamRunner.mjs.map +0 -1
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
type ChatCompletionCreateParams,
|
|
9
9
|
type ChatCompletionTool,
|
|
10
10
|
} from "../resources/chat/completions";
|
|
11
|
-
import {
|
|
11
|
+
import { OpenAIError } from "../error";
|
|
12
12
|
import {
|
|
13
13
|
type RunnableFunction,
|
|
14
14
|
isRunnableFunctionWithParse,
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
ChatCompletionStreamingToolRunnerParams,
|
|
21
21
|
} from './ChatCompletionStreamingRunner';
|
|
22
22
|
import { isAssistantMessage, isFunctionMessage, isToolMessage } from './chatCompletionUtils';
|
|
23
|
+
import { BaseEvents, EventStream } from './EventStream';
|
|
23
24
|
|
|
24
25
|
const DEFAULT_MAX_CHAT_COMPLETIONS = 10;
|
|
25
26
|
export interface RunnerOptions extends Core.RequestOptions {
|
|
@@ -27,60 +28,16 @@ export interface RunnerOptions extends Core.RequestOptions {
|
|
|
27
28
|
maxChatCompletions?: number;
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
export
|
|
31
|
-
|
|
32
|
-
> {
|
|
33
|
-
controller: AbortController = new AbortController();
|
|
34
|
-
|
|
35
|
-
#connectedPromise: Promise<void>;
|
|
36
|
-
#resolveConnectedPromise: () => void = () => {};
|
|
37
|
-
#rejectConnectedPromise: (error: OpenAIError) => void = () => {};
|
|
38
|
-
|
|
39
|
-
#endPromise: Promise<void>;
|
|
40
|
-
#resolveEndPromise: () => void = () => {};
|
|
41
|
-
#rejectEndPromise: (error: OpenAIError) => void = () => {};
|
|
42
|
-
|
|
43
|
-
#listeners: { [Event in keyof Events]?: ListenersForEvent<Events, Event> } = {};
|
|
44
|
-
|
|
31
|
+
export class AbstractChatCompletionRunner<
|
|
32
|
+
EventTypes extends AbstractChatCompletionRunnerEvents,
|
|
33
|
+
> extends EventStream<EventTypes> {
|
|
45
34
|
protected _chatCompletions: ChatCompletion[] = [];
|
|
46
35
|
messages: ChatCompletionMessageParam[] = [];
|
|
47
36
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
constructor() {
|
|
54
|
-
this.#connectedPromise = new Promise<void>((resolve, reject) => {
|
|
55
|
-
this.#resolveConnectedPromise = resolve;
|
|
56
|
-
this.#rejectConnectedPromise = reject;
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
this.#endPromise = new Promise<void>((resolve, reject) => {
|
|
60
|
-
this.#resolveEndPromise = resolve;
|
|
61
|
-
this.#rejectEndPromise = reject;
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// Don't let these promises cause unhandled rejection errors.
|
|
65
|
-
// we will manually cause an unhandled rejection error later
|
|
66
|
-
// if the user hasn't registered any error listener or called
|
|
67
|
-
// any promise-returning method.
|
|
68
|
-
this.#connectedPromise.catch(() => {});
|
|
69
|
-
this.#endPromise.catch(() => {});
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
protected _run(executor: () => Promise<any>) {
|
|
73
|
-
// Unfortunately if we call `executor()` immediately we get runtime errors about
|
|
74
|
-
// references to `this` before the `super()` constructor call returns.
|
|
75
|
-
setTimeout(() => {
|
|
76
|
-
executor().then(() => {
|
|
77
|
-
this._emitFinal();
|
|
78
|
-
this._emit('end');
|
|
79
|
-
}, this.#handleError);
|
|
80
|
-
}, 0);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
protected _addChatCompletion(chatCompletion: ChatCompletion): ChatCompletion {
|
|
37
|
+
protected _addChatCompletion(
|
|
38
|
+
this: AbstractChatCompletionRunner<AbstractChatCompletionRunnerEvents>,
|
|
39
|
+
chatCompletion: ChatCompletion,
|
|
40
|
+
): ChatCompletion {
|
|
84
41
|
this._chatCompletions.push(chatCompletion);
|
|
85
42
|
this._emit('chatCompletion', chatCompletion);
|
|
86
43
|
const message = chatCompletion.choices[0]?.message;
|
|
@@ -88,7 +45,11 @@ export abstract class AbstractChatCompletionRunner<
|
|
|
88
45
|
return chatCompletion;
|
|
89
46
|
}
|
|
90
47
|
|
|
91
|
-
protected _addMessage(
|
|
48
|
+
protected _addMessage(
|
|
49
|
+
this: AbstractChatCompletionRunner<AbstractChatCompletionRunnerEvents>,
|
|
50
|
+
message: ChatCompletionMessageParam,
|
|
51
|
+
emit = true,
|
|
52
|
+
) {
|
|
92
53
|
if (!('content' in message)) message.content = null;
|
|
93
54
|
|
|
94
55
|
this.messages.push(message);
|
|
@@ -110,99 +71,6 @@ export abstract class AbstractChatCompletionRunner<
|
|
|
110
71
|
}
|
|
111
72
|
}
|
|
112
73
|
|
|
113
|
-
protected _connected() {
|
|
114
|
-
if (this.ended) return;
|
|
115
|
-
this.#resolveConnectedPromise();
|
|
116
|
-
this._emit('connect');
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
get ended(): boolean {
|
|
120
|
-
return this.#ended;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
get errored(): boolean {
|
|
124
|
-
return this.#errored;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
get aborted(): boolean {
|
|
128
|
-
return this.#aborted;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
abort() {
|
|
132
|
-
this.controller.abort();
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Adds the listener function to the end of the listeners array for the event.
|
|
137
|
-
* No checks are made to see if the listener has already been added. Multiple calls passing
|
|
138
|
-
* the same combination of event and listener will result in the listener being added, and
|
|
139
|
-
* called, multiple times.
|
|
140
|
-
* @returns this ChatCompletionStream, so that calls can be chained
|
|
141
|
-
*/
|
|
142
|
-
on<Event extends keyof Events>(event: Event, listener: ListenerForEvent<Events, Event>): this {
|
|
143
|
-
const listeners: ListenersForEvent<Events, Event> =
|
|
144
|
-
this.#listeners[event] || (this.#listeners[event] = []);
|
|
145
|
-
listeners.push({ listener });
|
|
146
|
-
return this;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Removes the specified listener from the listener array for the event.
|
|
151
|
-
* off() will remove, at most, one instance of a listener from the listener array. If any single
|
|
152
|
-
* listener has been added multiple times to the listener array for the specified event, then
|
|
153
|
-
* off() must be called multiple times to remove each instance.
|
|
154
|
-
* @returns this ChatCompletionStream, so that calls can be chained
|
|
155
|
-
*/
|
|
156
|
-
off<Event extends keyof Events>(event: Event, listener: ListenerForEvent<Events, Event>): this {
|
|
157
|
-
const listeners = this.#listeners[event];
|
|
158
|
-
if (!listeners) return this;
|
|
159
|
-
const index = listeners.findIndex((l) => l.listener === listener);
|
|
160
|
-
if (index >= 0) listeners.splice(index, 1);
|
|
161
|
-
return this;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Adds a one-time listener function for the event. The next time the event is triggered,
|
|
166
|
-
* this listener is removed and then invoked.
|
|
167
|
-
* @returns this ChatCompletionStream, so that calls can be chained
|
|
168
|
-
*/
|
|
169
|
-
once<Event extends keyof Events>(event: Event, listener: ListenerForEvent<Events, Event>): this {
|
|
170
|
-
const listeners: ListenersForEvent<Events, Event> =
|
|
171
|
-
this.#listeners[event] || (this.#listeners[event] = []);
|
|
172
|
-
listeners.push({ listener, once: true });
|
|
173
|
-
return this;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* This is similar to `.once()`, but returns a Promise that resolves the next time
|
|
178
|
-
* the event is triggered, instead of calling a listener callback.
|
|
179
|
-
* @returns a Promise that resolves the next time given event is triggered,
|
|
180
|
-
* or rejects if an error is emitted. (If you request the 'error' event,
|
|
181
|
-
* returns a promise that resolves with the error).
|
|
182
|
-
*
|
|
183
|
-
* Example:
|
|
184
|
-
*
|
|
185
|
-
* const message = await stream.emitted('message') // rejects if the stream errors
|
|
186
|
-
*/
|
|
187
|
-
emitted<Event extends keyof Events>(
|
|
188
|
-
event: Event,
|
|
189
|
-
): Promise<
|
|
190
|
-
EventParameters<Events, Event> extends [infer Param] ? Param
|
|
191
|
-
: EventParameters<Events, Event> extends [] ? void
|
|
192
|
-
: EventParameters<Events, Event>
|
|
193
|
-
> {
|
|
194
|
-
return new Promise((resolve, reject) => {
|
|
195
|
-
this.#catchingPromiseCreated = true;
|
|
196
|
-
if (event !== 'error') this.once('error', reject);
|
|
197
|
-
this.once(event, resolve as any);
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
async done(): Promise<void> {
|
|
202
|
-
this.#catchingPromiseCreated = true;
|
|
203
|
-
await this.#endPromise;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
74
|
/**
|
|
207
75
|
* @returns a promise that resolves with the final ChatCompletion, or rejects
|
|
208
76
|
* if an error occurred or the stream ended prematurely without producing a ChatCompletion.
|
|
@@ -327,75 +195,7 @@ export abstract class AbstractChatCompletionRunner<
|
|
|
327
195
|
return [...this._chatCompletions];
|
|
328
196
|
}
|
|
329
197
|
|
|
330
|
-
|
|
331
|
-
this.#errored = true;
|
|
332
|
-
if (error instanceof Error && error.name === 'AbortError') {
|
|
333
|
-
error = new APIUserAbortError();
|
|
334
|
-
}
|
|
335
|
-
if (error instanceof APIUserAbortError) {
|
|
336
|
-
this.#aborted = true;
|
|
337
|
-
return this._emit('abort', error);
|
|
338
|
-
}
|
|
339
|
-
if (error instanceof OpenAIError) {
|
|
340
|
-
return this._emit('error', error);
|
|
341
|
-
}
|
|
342
|
-
if (error instanceof Error) {
|
|
343
|
-
const openAIError: OpenAIError = new OpenAIError(error.message);
|
|
344
|
-
// @ts-ignore
|
|
345
|
-
openAIError.cause = error;
|
|
346
|
-
return this._emit('error', openAIError);
|
|
347
|
-
}
|
|
348
|
-
return this._emit('error', new OpenAIError(String(error)));
|
|
349
|
-
};
|
|
350
|
-
|
|
351
|
-
protected _emit<Event extends keyof Events>(event: Event, ...args: EventParameters<Events, Event>) {
|
|
352
|
-
// make sure we don't emit any events after end
|
|
353
|
-
if (this.#ended) {
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
if (event === 'end') {
|
|
358
|
-
this.#ended = true;
|
|
359
|
-
this.#resolveEndPromise();
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
const listeners: ListenersForEvent<Events, Event> | undefined = this.#listeners[event];
|
|
363
|
-
if (listeners) {
|
|
364
|
-
this.#listeners[event] = listeners.filter((l) => !l.once) as any;
|
|
365
|
-
listeners.forEach(({ listener }: any) => listener(...args));
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
if (event === 'abort') {
|
|
369
|
-
const error = args[0] as APIUserAbortError;
|
|
370
|
-
if (!this.#catchingPromiseCreated && !listeners?.length) {
|
|
371
|
-
Promise.reject(error);
|
|
372
|
-
}
|
|
373
|
-
this.#rejectConnectedPromise(error);
|
|
374
|
-
this.#rejectEndPromise(error);
|
|
375
|
-
this._emit('end');
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
if (event === 'error') {
|
|
380
|
-
// NOTE: _emit('error', error) should only be called from #handleError().
|
|
381
|
-
|
|
382
|
-
const error = args[0] as OpenAIError;
|
|
383
|
-
if (!this.#catchingPromiseCreated && !listeners?.length) {
|
|
384
|
-
// Trigger an unhandled rejection if the user hasn't registered any error handlers.
|
|
385
|
-
// If you are seeing stack traces here, make sure to handle errors via either:
|
|
386
|
-
// - runner.on('error', () => ...)
|
|
387
|
-
// - await runner.done()
|
|
388
|
-
// - await runner.finalChatCompletion()
|
|
389
|
-
// - etc.
|
|
390
|
-
Promise.reject(error);
|
|
391
|
-
}
|
|
392
|
-
this.#rejectConnectedPromise(error);
|
|
393
|
-
this.#rejectEndPromise(error);
|
|
394
|
-
this._emit('end');
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
protected _emitFinal() {
|
|
198
|
+
protected override _emitFinal(this: AbstractChatCompletionRunner<AbstractChatCompletionRunnerEvents>) {
|
|
399
199
|
const completion = this._chatCompletions[this._chatCompletions.length - 1];
|
|
400
200
|
if (completion) this._emit('finalChatCompletion', completion);
|
|
401
201
|
const finalMessage = this.#getFinalMessage();
|
|
@@ -650,27 +450,7 @@ export abstract class AbstractChatCompletionRunner<
|
|
|
650
450
|
}
|
|
651
451
|
}
|
|
652
452
|
|
|
653
|
-
|
|
654
|
-
[k in Event]: k extends keyof AbstractChatCompletionRunnerEvents ? AbstractChatCompletionRunnerEvents[k]
|
|
655
|
-
: (...args: any[]) => void;
|
|
656
|
-
};
|
|
657
|
-
|
|
658
|
-
type ListenerForEvent<Events extends CustomEvents<any>, Event extends keyof Events> = Event extends (
|
|
659
|
-
keyof AbstractChatCompletionRunnerEvents
|
|
660
|
-
) ?
|
|
661
|
-
AbstractChatCompletionRunnerEvents[Event]
|
|
662
|
-
: Events[Event];
|
|
663
|
-
|
|
664
|
-
type ListenersForEvent<Events extends CustomEvents<any>, Event extends keyof Events> = Array<{
|
|
665
|
-
listener: ListenerForEvent<Events, Event>;
|
|
666
|
-
once?: boolean;
|
|
667
|
-
}>;
|
|
668
|
-
type EventParameters<Events extends CustomEvents<any>, Event extends keyof Events> = Parameters<
|
|
669
|
-
ListenerForEvent<Events, Event>
|
|
670
|
-
>;
|
|
671
|
-
|
|
672
|
-
export interface AbstractChatCompletionRunnerEvents {
|
|
673
|
-
connect: () => void;
|
|
453
|
+
export interface AbstractChatCompletionRunnerEvents extends BaseEvents {
|
|
674
454
|
functionCall: (functionCall: ChatCompletionMessage.FunctionCall) => void;
|
|
675
455
|
message: (message: ChatCompletionMessageParam) => void;
|
|
676
456
|
chatCompletion: (completion: ChatCompletion) => void;
|
|
@@ -680,8 +460,5 @@ export interface AbstractChatCompletionRunnerEvents {
|
|
|
680
460
|
finalFunctionCall: (functionCall: ChatCompletionMessage.FunctionCall) => void;
|
|
681
461
|
functionCallResult: (content: string) => void;
|
|
682
462
|
finalFunctionCallResult: (content: string) => void;
|
|
683
|
-
error: (error: OpenAIError) => void;
|
|
684
|
-
abort: (error: APIUserAbortError) => void;
|
|
685
|
-
end: () => void;
|
|
686
463
|
totalUsage: (usage: CompletionUsage) => void;
|
|
687
464
|
}
|
|
@@ -19,10 +19,6 @@ import {
|
|
|
19
19
|
RunSubmitToolOutputsParamsBase,
|
|
20
20
|
RunSubmitToolOutputsParamsStreaming,
|
|
21
21
|
} from "../resources/beta/threads/runs/runs";
|
|
22
|
-
import {
|
|
23
|
-
AbstractAssistantRunnerEvents,
|
|
24
|
-
AbstractAssistantStreamRunner,
|
|
25
|
-
} from './AbstractAssistantStreamRunner';
|
|
26
22
|
import { type ReadableStream } from "../_shims/index";
|
|
27
23
|
import { Stream } from "../streaming";
|
|
28
24
|
import { APIUserAbortError, OpenAIError } from "../error";
|
|
@@ -34,9 +30,12 @@ import {
|
|
|
34
30
|
} from "../resources/beta/assistants";
|
|
35
31
|
import { RunStep, RunStepDelta, ToolCall, ToolCallDelta } from "../resources/beta/threads/runs/steps";
|
|
36
32
|
import { ThreadCreateAndRunParamsBase, Threads } from "../resources/beta/threads/threads";
|
|
33
|
+
import { BaseEvents, EventStream } from './EventStream';
|
|
37
34
|
import MessageDelta = Messages.MessageDelta;
|
|
38
35
|
|
|
39
|
-
export interface AssistantStreamEvents extends
|
|
36
|
+
export interface AssistantStreamEvents extends BaseEvents {
|
|
37
|
+
run: (run: Run) => void;
|
|
38
|
+
|
|
40
39
|
//New event structure
|
|
41
40
|
messageCreated: (message: Message) => void;
|
|
42
41
|
messageDelta: (message: MessageDelta, snapshot: Message) => void;
|
|
@@ -57,8 +56,6 @@ export interface AssistantStreamEvents extends AbstractAssistantRunnerEvents {
|
|
|
57
56
|
//No created or delta as this is not streamed
|
|
58
57
|
imageFileDone: (content: ImageFile, snapshot: Message) => void;
|
|
59
58
|
|
|
60
|
-
end: () => void;
|
|
61
|
-
|
|
62
59
|
event: (event: AssistantStreamEvent) => void;
|
|
63
60
|
}
|
|
64
61
|
|
|
@@ -75,7 +72,7 @@ export type RunSubmitToolOutputsParamsStream = Omit<RunSubmitToolOutputsParamsBa
|
|
|
75
72
|
};
|
|
76
73
|
|
|
77
74
|
export class AssistantStream
|
|
78
|
-
extends
|
|
75
|
+
extends EventStream<AssistantStreamEvents>
|
|
79
76
|
implements AsyncIterable<AssistantStreamEvent>
|
|
80
77
|
{
|
|
81
78
|
//Track all events in a single list for reference
|
|
@@ -207,7 +204,7 @@ export class AssistantStream
|
|
|
207
204
|
return runner;
|
|
208
205
|
}
|
|
209
206
|
|
|
210
|
-
protected
|
|
207
|
+
protected async _createToolAssistantStream(
|
|
211
208
|
run: Runs,
|
|
212
209
|
threadId: string,
|
|
213
210
|
runId: string,
|
|
@@ -304,7 +301,7 @@ export class AssistantStream
|
|
|
304
301
|
return this.#finalRun;
|
|
305
302
|
}
|
|
306
303
|
|
|
307
|
-
protected
|
|
304
|
+
protected async _createThreadAssistantStream(
|
|
308
305
|
thread: Threads,
|
|
309
306
|
params: ThreadCreateAndRunParamsBase,
|
|
310
307
|
options?: Core.RequestOptions,
|
|
@@ -330,7 +327,7 @@ export class AssistantStream
|
|
|
330
327
|
return this._addRun(this.#endRequest());
|
|
331
328
|
}
|
|
332
329
|
|
|
333
|
-
protected
|
|
330
|
+
protected async _createAssistantStream(
|
|
334
331
|
run: Runs,
|
|
335
332
|
threadId: string,
|
|
336
333
|
params: RunCreateParamsBase,
|
|
@@ -417,7 +414,7 @@ export class AssistantStream
|
|
|
417
414
|
return this.#finalRun;
|
|
418
415
|
}
|
|
419
416
|
|
|
420
|
-
#handleMessage(event: MessageStreamEvent) {
|
|
417
|
+
#handleMessage(this: AssistantStream, event: MessageStreamEvent) {
|
|
421
418
|
const [accumulatedMessage, newContent] = this.#accumulateMessage(event, this.#messageSnapshot);
|
|
422
419
|
this.#messageSnapshot = accumulatedMessage;
|
|
423
420
|
this.#messageSnapshots[accumulatedMessage.id] = accumulatedMessage;
|
|
@@ -500,7 +497,7 @@ export class AssistantStream
|
|
|
500
497
|
}
|
|
501
498
|
}
|
|
502
499
|
|
|
503
|
-
#handleRunStep(event: RunStepStreamEvent) {
|
|
500
|
+
#handleRunStep(this: AssistantStream, event: RunStepStreamEvent) {
|
|
504
501
|
const accumulatedRunStep = this.#accumulateRunStep(event);
|
|
505
502
|
this.#currentRunStepSnapshot = accumulatedRunStep;
|
|
506
503
|
|
|
@@ -556,7 +553,7 @@ export class AssistantStream
|
|
|
556
553
|
}
|
|
557
554
|
}
|
|
558
555
|
|
|
559
|
-
#handleEvent(event: AssistantStreamEvent) {
|
|
556
|
+
#handleEvent(this: AssistantStream, event: AssistantStreamEvent) {
|
|
560
557
|
this.#events.push(event);
|
|
561
558
|
this._emit('event', event);
|
|
562
559
|
}
|
|
@@ -696,7 +693,7 @@ export class AssistantStream
|
|
|
696
693
|
return acc;
|
|
697
694
|
}
|
|
698
695
|
|
|
699
|
-
#handleRun(event: RunStreamEvent) {
|
|
696
|
+
#handleRun(this: AssistantStream, event: RunStreamEvent) {
|
|
700
697
|
this.#currentRunSnapshot = event.data;
|
|
701
698
|
switch (event.event) {
|
|
702
699
|
case 'thread.run.created':
|
|
@@ -720,4 +717,35 @@ export class AssistantStream
|
|
|
720
717
|
break;
|
|
721
718
|
}
|
|
722
719
|
}
|
|
720
|
+
|
|
721
|
+
protected _addRun(run: Run): Run {
|
|
722
|
+
return run;
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
protected async _threadAssistantStream(
|
|
726
|
+
body: ThreadCreateAndRunParamsBase,
|
|
727
|
+
thread: Threads,
|
|
728
|
+
options?: Core.RequestOptions,
|
|
729
|
+
): Promise<Run> {
|
|
730
|
+
return await this._createThreadAssistantStream(thread, body, options);
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
protected async _runAssistantStream(
|
|
734
|
+
threadId: string,
|
|
735
|
+
runs: Runs,
|
|
736
|
+
params: RunCreateParamsBase,
|
|
737
|
+
options?: Core.RequestOptions,
|
|
738
|
+
): Promise<Run> {
|
|
739
|
+
return await this._createAssistantStream(runs, threadId, params, options);
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
protected async _runToolAssistantStream(
|
|
743
|
+
threadId: string,
|
|
744
|
+
runId: string,
|
|
745
|
+
runs: Runs,
|
|
746
|
+
params: RunSubmitToolOutputsParamsStream,
|
|
747
|
+
options?: Core.RequestOptions,
|
|
748
|
+
): Promise<Run> {
|
|
749
|
+
return await this._createToolAssistantStream(runs, threadId, runId, params, options);
|
|
750
|
+
}
|
|
723
751
|
}
|
|
@@ -59,7 +59,7 @@ export class ChatCompletionRunner extends AbstractChatCompletionRunner<ChatCompl
|
|
|
59
59
|
return runner;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
override _addMessage(message: ChatCompletionMessageParam) {
|
|
62
|
+
override _addMessage(this: ChatCompletionRunner, message: ChatCompletionMessageParam) {
|
|
63
63
|
super._addMessage(message);
|
|
64
64
|
if (isAssistantMessage(message) && message.content) {
|
|
65
65
|
this._emit('content', message.content as string);
|
|
@@ -66,7 +66,7 @@ export class ChatCompletionStream
|
|
|
66
66
|
if (this.ended) return;
|
|
67
67
|
this.#currentChatCompletionSnapshot = undefined;
|
|
68
68
|
}
|
|
69
|
-
#addChunk(chunk: ChatCompletionChunk) {
|
|
69
|
+
#addChunk(this: ChatCompletionStream, chunk: ChatCompletionChunk) {
|
|
70
70
|
if (this.ended) return;
|
|
71
71
|
const completion = this.#accumulateChatCompletion(chunk);
|
|
72
72
|
this._emit('chunk', chunk, completion);
|
|
@@ -208,7 +208,7 @@ export class ChatCompletionStream
|
|
|
208
208
|
return snapshot;
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
-
[Symbol.asyncIterator](): AsyncIterator<ChatCompletionChunk> {
|
|
211
|
+
[Symbol.asyncIterator](this: ChatCompletionStream): AsyncIterator<ChatCompletionChunk> {
|
|
212
212
|
const pushQueue: ChatCompletionChunk[] = [];
|
|
213
213
|
const readQueue: {
|
|
214
214
|
resolve: (chunk: ChatCompletionChunk | undefined) => void;
|