openai 6.34.0 → 6.35.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 +44 -0
- package/core/EventEmitter.d.mts +11 -0
- package/core/EventEmitter.d.mts.map +1 -1
- package/core/EventEmitter.d.ts +11 -0
- package/core/EventEmitter.d.ts.map +1 -1
- package/core/EventEmitter.js +15 -1
- package/core/EventEmitter.js.map +1 -1
- package/core/EventEmitter.mjs +13 -0
- package/core/EventEmitter.mjs.map +1 -1
- package/internal/types.d.mts +6 -6
- package/internal/types.d.mts.map +1 -1
- package/internal/types.d.ts +6 -6
- package/internal/types.d.ts.map +1 -1
- package/internal/utils/env.js +2 -2
- package/internal/utils/env.js.map +1 -1
- package/internal/utils/env.mjs +2 -2
- package/internal/utils/env.mjs.map +1 -1
- package/internal/ws-adapter-browser.d.mts +34 -0
- package/internal/ws-adapter-browser.d.mts.map +1 -0
- package/internal/ws-adapter-browser.d.ts +34 -0
- package/internal/ws-adapter-browser.d.ts.map +1 -0
- package/internal/ws-adapter-browser.js +88 -0
- package/internal/ws-adapter-browser.js.map +1 -0
- package/internal/ws-adapter-browser.mjs +84 -0
- package/internal/ws-adapter-browser.mjs.map +1 -0
- package/internal/ws-adapter-node.d.mts +27 -0
- package/internal/ws-adapter-node.d.mts.map +1 -0
- package/internal/ws-adapter-node.d.ts +27 -0
- package/internal/ws-adapter-node.d.ts.map +1 -0
- package/internal/ws-adapter-node.js +90 -0
- package/internal/ws-adapter-node.js.map +1 -0
- package/internal/ws-adapter-node.mjs +86 -0
- package/internal/ws-adapter-node.mjs.map +1 -0
- package/internal/ws-adapter.d.mts +24 -0
- package/internal/ws-adapter.d.mts.map +1 -0
- package/internal/ws-adapter.d.ts +24 -0
- package/internal/ws-adapter.d.ts.map +1 -0
- package/internal/ws-adapter.js +11 -0
- package/internal/ws-adapter.js.map +1 -0
- package/internal/ws-adapter.mjs +8 -0
- package/internal/ws-adapter.mjs.map +1 -0
- package/internal/ws.d.mts +80 -0
- package/internal/ws.d.mts.map +1 -0
- package/internal/ws.d.ts +80 -0
- package/internal/ws.d.ts.map +1 -0
- package/internal/ws.js +153 -0
- package/internal/ws.js.map +1 -0
- package/internal/ws.mjs +147 -0
- package/internal/ws.mjs.map +1 -0
- package/package.json +13 -13
- package/resources/audio/speech.d.mts +2 -2
- package/resources/audio/speech.d.ts +2 -2
- package/resources/audio/speech.js +2 -2
- package/resources/audio/speech.mjs +2 -2
- package/resources/chat/completions/completions.d.mts +1 -1
- package/resources/chat/completions/completions.d.ts +1 -1
- package/resources/completions.d.mts +1 -1
- package/resources/completions.d.ts +1 -1
- package/resources/responses/index.d.mts +2 -0
- package/resources/responses/index.d.mts.map +1 -1
- package/resources/responses/index.d.ts +2 -0
- package/resources/responses/index.d.ts.map +1 -1
- package/resources/responses/internal-base.d.mts +24 -2
- package/resources/responses/internal-base.d.mts.map +1 -1
- package/resources/responses/internal-base.d.ts +24 -2
- package/resources/responses/internal-base.d.ts.map +1 -1
- package/resources/responses/internal-base.js +5 -9
- package/resources/responses/internal-base.js.map +1 -1
- package/resources/responses/internal-base.mjs +5 -9
- package/resources/responses/internal-base.mjs.map +1 -1
- package/resources/responses/responses.d.mts +19 -3
- package/resources/responses/responses.d.mts.map +1 -1
- package/resources/responses/responses.d.ts +19 -3
- package/resources/responses/responses.d.ts.map +1 -1
- package/resources/responses/responses.js.map +1 -1
- package/resources/responses/responses.mjs.map +1 -1
- package/resources/responses/ws-base.d.mts +106 -0
- package/resources/responses/ws-base.d.mts.map +1 -0
- package/resources/responses/ws-base.d.ts +106 -0
- package/resources/responses/ws-base.d.ts.map +1 -0
- package/resources/responses/ws-base.js +474 -0
- package/resources/responses/ws-base.js.map +1 -0
- package/resources/responses/ws-base.mjs +470 -0
- package/resources/responses/ws-base.mjs.map +1 -0
- package/resources/responses/ws.d.mts +9 -38
- package/resources/responses/ws.d.mts.map +1 -1
- package/resources/responses/ws.d.ts +9 -38
- package/resources/responses/ws.d.ts.map +1 -1
- package/resources/responses/ws.js +17 -171
- package/resources/responses/ws.js.map +1 -1
- package/resources/responses/ws.mjs +17 -171
- package/resources/responses/ws.mjs.map +1 -1
- package/src/core/EventEmitter.ts +16 -0
- package/src/internal/types.ts +6 -8
- package/src/internal/utils/env.ts +2 -2
- package/src/internal/ws-adapter-browser.ts +123 -0
- package/src/internal/ws-adapter-node.ts +105 -0
- package/src/internal/ws-adapter.ts +30 -0
- package/src/internal/ws.ts +193 -0
- package/src/resources/audio/speech.ts +2 -2
- package/src/resources/chat/completions/completions.ts +1 -1
- package/src/resources/completions.ts +1 -1
- package/src/resources/responses/index.ts +2 -0
- package/src/resources/responses/internal-base.ts +26 -10
- package/src/resources/responses/responses.ts +22 -3
- package/src/resources/responses/ws-base.ts +609 -0
- package/src/resources/responses/ws.ts +23 -186
- package/src/version.ts +1 -1
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type * as WS from 'ws';
|
|
2
|
+
import type { WebSocketLike } from './ws-adapter';
|
|
3
|
+
|
|
4
|
+
/** A generic event listener callback. */
|
|
5
|
+
type Listener = (...args: any[]) => void;
|
|
6
|
+
|
|
7
|
+
export class NodeWebSocket implements WebSocketLike {
|
|
8
|
+
private _ws: WS.WebSocket;
|
|
9
|
+
|
|
10
|
+
/** Maps `(event, originalListener)` -> wrapped listener for correct `off()` removal. */
|
|
11
|
+
private _listenerMap = new Map<string, Map<Listener, Listener>>();
|
|
12
|
+
|
|
13
|
+
constructor(ws: WS.WebSocket) {
|
|
14
|
+
this._ws = ws;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** The underlying platform-specific socket. Code that accesses this will not be isomorphic across server and browser environments. */
|
|
18
|
+
get platformSocket(): WS.WebSocket {
|
|
19
|
+
return this._ws;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
get readyState(): number {
|
|
23
|
+
return this._ws.readyState;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
send(data: string | ArrayBufferLike | ArrayBufferView): void {
|
|
27
|
+
this._ws.send(data);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
close(code?: number, reason?: string): void {
|
|
31
|
+
this._ws.close(code, reason);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
on(event: string, listener: Listener): void {
|
|
35
|
+
const wrapped = this._wrapListener(event, listener);
|
|
36
|
+
this._listenersFor(event).set(listener, wrapped);
|
|
37
|
+
this._ws.on(event, wrapped);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
off(event: string, listener: Listener): void {
|
|
41
|
+
const byListener = this._listenerMap.get(event);
|
|
42
|
+
if (!byListener) return;
|
|
43
|
+
const wrapped = byListener.get(listener);
|
|
44
|
+
if (wrapped) {
|
|
45
|
+
byListener.delete(listener);
|
|
46
|
+
this._ws.removeListener(event, wrapped);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
once(event: string, listener: Listener): void {
|
|
51
|
+
const onceListener: Listener = (...args) => {
|
|
52
|
+
this.off(event, listener);
|
|
53
|
+
listener(...args);
|
|
54
|
+
};
|
|
55
|
+
const wrapped = this._wrapListener(event, onceListener);
|
|
56
|
+
this._listenersFor(event).set(listener, wrapped);
|
|
57
|
+
this._ws.on(event, wrapped);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private _listenersFor(event: string): Map<Listener, Listener> {
|
|
61
|
+
let map = this._listenerMap.get(event);
|
|
62
|
+
if (!map) {
|
|
63
|
+
map = new Map();
|
|
64
|
+
this._listenerMap.set(event, map);
|
|
65
|
+
}
|
|
66
|
+
return map;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Normalizes `ws` message payloads: text frames become strings,
|
|
71
|
+
* binary frames stay as `Buffer`, and fragmented frames are merged.
|
|
72
|
+
*/
|
|
73
|
+
private static _normalizeMessageData(
|
|
74
|
+
data: Buffer | ArrayBuffer | Buffer[],
|
|
75
|
+
isBinary: boolean,
|
|
76
|
+
): string | Buffer {
|
|
77
|
+
if (!isBinary) {
|
|
78
|
+
if (Array.isArray(data)) return Buffer.concat(data).toString();
|
|
79
|
+
if (data instanceof ArrayBuffer) return Buffer.from(data).toString();
|
|
80
|
+
return data.toString();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (Array.isArray(data)) return Buffer.concat(data);
|
|
84
|
+
if (data instanceof ArrayBuffer) return Buffer.from(data);
|
|
85
|
+
return data;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private _wrapListener(event: string, listener: Listener): Listener {
|
|
89
|
+
switch (event) {
|
|
90
|
+
case 'message':
|
|
91
|
+
return (data: Buffer | ArrayBuffer | Buffer[], isBinary: boolean) => {
|
|
92
|
+
listener(NodeWebSocket._normalizeMessageData(data, isBinary), isBinary);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
case 'close':
|
|
96
|
+
return (code: number, reason: Buffer) => {
|
|
97
|
+
listener(code, reason.toString());
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// 'open' and 'error' pass through unchanged
|
|
101
|
+
default:
|
|
102
|
+
return listener;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalized WebSocket interface that abstracts over the `ws` package (Node.js)
|
|
3
|
+
* and the native WebSocket API (browser).
|
|
4
|
+
*/
|
|
5
|
+
export interface WebSocketLike {
|
|
6
|
+
readonly readyState: number;
|
|
7
|
+
|
|
8
|
+
send(data: string | ArrayBufferLike | ArrayBufferView): void;
|
|
9
|
+
close(code?: number, reason?: string): void;
|
|
10
|
+
|
|
11
|
+
on(event: 'open', listener: () => void): void;
|
|
12
|
+
on(
|
|
13
|
+
event: 'message',
|
|
14
|
+
listener: (data: string | ArrayBuffer | ArrayBufferView, isBinary: boolean) => void,
|
|
15
|
+
): void;
|
|
16
|
+
on(event: 'close', listener: (code: number, reason: string) => void): void;
|
|
17
|
+
on(event: 'error', listener: (err: Error) => void): void;
|
|
18
|
+
on(event: string, listener: (...args: any[]) => void): void;
|
|
19
|
+
|
|
20
|
+
off(event: string, listener: (...args: any[]) => void): void;
|
|
21
|
+
once(event: string, listener: (...args: any[]) => void): void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Standard WebSocket readyState values (RFC 6455). */
|
|
25
|
+
export const ReadyState = {
|
|
26
|
+
CONNECTING: 0,
|
|
27
|
+
OPEN: 1,
|
|
28
|
+
CLOSING: 2,
|
|
29
|
+
CLOSED: 3,
|
|
30
|
+
} as const;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { concatBytes, encodeUTF8 } from './utils/bytes';
|
|
2
|
+
|
|
3
|
+
/** Reconnection event passed to the `onReconnecting` handler and event listeners. */
|
|
4
|
+
export interface ReconnectingEvent<Parameters = Record<string, unknown>> {
|
|
5
|
+
/** Which retry attempt this is (1-based). */
|
|
6
|
+
readonly attempt: number;
|
|
7
|
+
/** Total attempts that will be made. */
|
|
8
|
+
readonly maxAttempts: number;
|
|
9
|
+
/** Delay in ms before this attempt connects. */
|
|
10
|
+
readonly delay: number;
|
|
11
|
+
/** The WebSocket close code that triggered reconnection. */
|
|
12
|
+
readonly closeCode: number;
|
|
13
|
+
/** The current query parameters. */
|
|
14
|
+
readonly parameters: (Parameters & Record<string, unknown>) | undefined;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Optional overrides returned from the `onReconnecting` handler
|
|
19
|
+
* to customize the next reconnection attempt.
|
|
20
|
+
*/
|
|
21
|
+
export type ReconnectingOverrides<Parameters = Record<string, unknown>> =
|
|
22
|
+
| {
|
|
23
|
+
/**
|
|
24
|
+
* If provided, assigns the query parameters for the next connection.
|
|
25
|
+
* Set to `undefined` to clear all query parameters.
|
|
26
|
+
*/
|
|
27
|
+
parameters?: (Parameters & Record<string, unknown>) | undefined;
|
|
28
|
+
}
|
|
29
|
+
| {
|
|
30
|
+
/**
|
|
31
|
+
* If set, will stop attempting to reconnect.
|
|
32
|
+
*/
|
|
33
|
+
abort: true;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Raw data types that can be sent over a WebSocket without serialization.
|
|
38
|
+
*/
|
|
39
|
+
export type RawWebSocketData = string | ArrayBufferLike | ArrayBufferView | ArrayBufferView[];
|
|
40
|
+
|
|
41
|
+
export type UnsentMessage<T> = { type: 'message'; message: T } | { type: 'raw'; data: RawWebSocketData };
|
|
42
|
+
|
|
43
|
+
type QueueEntry =
|
|
44
|
+
| { kind: 'json'; data: string; byteLength: number }
|
|
45
|
+
| { kind: 'raw'; data: RawWebSocketData; byteLength: number };
|
|
46
|
+
|
|
47
|
+
function toUint8Array(view: ArrayBufferView): Uint8Array {
|
|
48
|
+
if (view instanceof Uint8Array) return view;
|
|
49
|
+
return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Flatten `ArrayBufferView[]` fragments into a single `Uint8Array` so that
|
|
54
|
+
* `ws.send()` transmits the correct bytes.
|
|
55
|
+
*/
|
|
56
|
+
export function flattenRawData(data: RawWebSocketData): Exclude<RawWebSocketData, ArrayBufferView[]> {
|
|
57
|
+
if (Array.isArray(data)) return concatBytes(data.map(toUint8Array));
|
|
58
|
+
return data;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function snapshotRawData(data: RawWebSocketData): Exclude<RawWebSocketData, ArrayBufferView[]> {
|
|
62
|
+
if (typeof data === 'string') return data;
|
|
63
|
+
if (Array.isArray(data)) return concatBytes(data.map(toUint8Array));
|
|
64
|
+
if (ArrayBuffer.isView(data)) {
|
|
65
|
+
const copy = new Uint8Array(data.byteLength);
|
|
66
|
+
copy.set(toUint8Array(data));
|
|
67
|
+
return copy;
|
|
68
|
+
}
|
|
69
|
+
return data.slice(0);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function rawByteLength(data: RawWebSocketData): number {
|
|
73
|
+
if (typeof data === 'string') return encodeUTF8(data).byteLength;
|
|
74
|
+
if (Array.isArray(data)) return data.reduce((sum, buf) => sum + buf.byteLength, 0);
|
|
75
|
+
if ('byteLength' in data) return data.byteLength;
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* A bounded queue for outgoing WebSocket messages. JSON messages are
|
|
81
|
+
* serialized on enqueue; raw messages are stored as-is. The queue enforces
|
|
82
|
+
* a configurable byte-size limit and can return the original messages via
|
|
83
|
+
* {@link drain} when the connection permanently closes.
|
|
84
|
+
*/
|
|
85
|
+
export class SendQueue<T = unknown> {
|
|
86
|
+
private _queue: QueueEntry[] = [];
|
|
87
|
+
private _bytes: number = 0;
|
|
88
|
+
private _maxBytes: number;
|
|
89
|
+
|
|
90
|
+
constructor(maxBytes: number = 1_048_576) {
|
|
91
|
+
this._maxBytes = maxBytes;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Serialize and enqueue a JSON message. Returns `true` if the message was
|
|
96
|
+
* accepted, `false` if it would exceed the byte-size limit.
|
|
97
|
+
*/
|
|
98
|
+
enqueue(event: T): boolean {
|
|
99
|
+
const data = JSON.stringify(event);
|
|
100
|
+
const byteLength = encodeUTF8(data).byteLength;
|
|
101
|
+
if (this._bytes + byteLength > this._maxBytes && this._queue.length > 0) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
this._queue.push({ kind: 'json', data, byteLength });
|
|
105
|
+
this._bytes += byteLength;
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Enqueue raw data without serialization. Returns `true` if the data was
|
|
111
|
+
* accepted, `false` if it would exceed the byte-size limit.
|
|
112
|
+
*/
|
|
113
|
+
enqueueRaw(data: RawWebSocketData): boolean {
|
|
114
|
+
const snapshot = snapshotRawData(data);
|
|
115
|
+
const byteLength = rawByteLength(snapshot);
|
|
116
|
+
if (this._bytes + byteLength > this._maxBytes && this._queue.length > 0) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
this._queue.push({ kind: 'raw', data: snapshot, byteLength });
|
|
120
|
+
this._bytes += byteLength;
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Send every queued message via `send`. If `send` throws, the failing
|
|
126
|
+
* message and all subsequent messages are re-queued and the error is
|
|
127
|
+
* re-thrown so the caller can report it.
|
|
128
|
+
*/
|
|
129
|
+
flush(send: (data: RawWebSocketData) => void): void {
|
|
130
|
+
const pending = this._queue.splice(0);
|
|
131
|
+
this._bytes = 0;
|
|
132
|
+
for (let i = 0; i < pending.length; i++) {
|
|
133
|
+
try {
|
|
134
|
+
send(pending[i]!.data);
|
|
135
|
+
} catch (err) {
|
|
136
|
+
const remaining = pending.slice(i);
|
|
137
|
+
this._queue = remaining.concat(this._queue);
|
|
138
|
+
this._bytes = this._queue.reduce((sum, item) => sum + item.byteLength, 0);
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Drain the queue and return the unsent messages. JSON messages are
|
|
146
|
+
* deserialized back to their original form. Resets byte tracking to zero.
|
|
147
|
+
*/
|
|
148
|
+
drain(): UnsentMessage<T>[] {
|
|
149
|
+
const unsent = this._queue.map((entry): UnsentMessage<T> => {
|
|
150
|
+
if (entry.kind === 'raw') return { type: 'raw', data: entry.data };
|
|
151
|
+
return { type: 'message', message: JSON.parse(entry.data) as T };
|
|
152
|
+
});
|
|
153
|
+
this._queue = [];
|
|
154
|
+
this._bytes = 0;
|
|
155
|
+
return unsent;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// RFC 6455 §7.4.1
|
|
160
|
+
export function isRecoverableClose(code: number): boolean {
|
|
161
|
+
switch (code) {
|
|
162
|
+
case 1000:
|
|
163
|
+
return false; // Normal closure
|
|
164
|
+
case 1001:
|
|
165
|
+
return true; // Going away (server shutting down)
|
|
166
|
+
case 1002:
|
|
167
|
+
return false; // Protocol error
|
|
168
|
+
case 1003:
|
|
169
|
+
return false; // Unsupported data
|
|
170
|
+
case 1005:
|
|
171
|
+
return true; // No status code (abnormal)
|
|
172
|
+
case 1006:
|
|
173
|
+
return true; // Abnormal closure (network drop)
|
|
174
|
+
case 1007:
|
|
175
|
+
return false; // Invalid payload
|
|
176
|
+
case 1008:
|
|
177
|
+
return false; // Policy violation
|
|
178
|
+
case 1009:
|
|
179
|
+
return false; // Message too big
|
|
180
|
+
case 1010:
|
|
181
|
+
return false; // Missing extension
|
|
182
|
+
case 1011:
|
|
183
|
+
return true; // Internal server error
|
|
184
|
+
case 1012:
|
|
185
|
+
return true; // Service restart
|
|
186
|
+
case 1013:
|
|
187
|
+
return true; // Try again later
|
|
188
|
+
case 1015:
|
|
189
|
+
return true; // TLS handshake failure
|
|
190
|
+
default:
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -18,8 +18,8 @@ export class Speech extends APIResource {
|
|
|
18
18
|
* ```ts
|
|
19
19
|
* const speech = await client.audio.speech.create({
|
|
20
20
|
* input: 'input',
|
|
21
|
-
* model: '
|
|
22
|
-
* voice: '
|
|
21
|
+
* model: 'tts-1',
|
|
22
|
+
* voice: 'alloy',
|
|
23
23
|
* });
|
|
24
24
|
*
|
|
25
25
|
* const content = await speech.blob();
|
|
@@ -1665,7 +1665,7 @@ export interface ChatCompletionCreateParamsBase {
|
|
|
1665
1665
|
* of 24 hours.
|
|
1666
1666
|
* [Learn more](https://platform.openai.com/docs/guides/prompt-caching#prompt-cache-retention).
|
|
1667
1667
|
*/
|
|
1668
|
-
prompt_cache_retention?: '
|
|
1668
|
+
prompt_cache_retention?: 'in_memory' | '24h' | null;
|
|
1669
1669
|
|
|
1670
1670
|
/**
|
|
1671
1671
|
* Constrains effort on reasoning for
|
|
@@ -3,3 +3,5 @@
|
|
|
3
3
|
export { InputItems, type ResponseItemList, type InputItemListParams } from './input-items';
|
|
4
4
|
export { InputTokens, type InputTokenCountResponse, type InputTokenCountParams } from './input-tokens';
|
|
5
5
|
export { Responses } from './responses';
|
|
6
|
+
export { type ResponsesWSClientOptions } from './ws';
|
|
7
|
+
export { type ResponsesWSReconnectOptions } from './ws-base';
|
|
@@ -4,11 +4,21 @@ import * as ResponsesAPI from './responses';
|
|
|
4
4
|
import { OpenAI } from '../../client';
|
|
5
5
|
import { EventEmitter } from '../../core/EventEmitter';
|
|
6
6
|
import { OpenAIError } from '../../core/error';
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
import type { RawWebSocketData, ReconnectingEvent, UnsentMessage } from '../../internal/ws';
|
|
8
9
|
|
|
9
10
|
export type ResponsesStreamMessage =
|
|
10
|
-
| { type: 'connecting' | 'open' | 'closing'
|
|
11
|
+
| { type: 'connecting' | 'open' | 'closing' }
|
|
12
|
+
| {
|
|
13
|
+
type: 'close';
|
|
14
|
+
code: number;
|
|
15
|
+
reason: string;
|
|
16
|
+
unsent: UnsentMessage<ResponsesAPI.ResponsesClientEvent>[];
|
|
17
|
+
}
|
|
18
|
+
| { type: 'reconnecting'; reconnect: ReconnectingEvent }
|
|
19
|
+
| { type: 'reconnected' }
|
|
11
20
|
| { type: 'message'; message: ResponsesAPI.ResponsesServerEvent }
|
|
21
|
+
| { type: 'raw'; data: RawWebSocketData }
|
|
12
22
|
| { type: 'error'; error: WebSocketError };
|
|
13
23
|
|
|
14
24
|
export class WebSocketError extends OpenAIError {
|
|
@@ -29,7 +39,11 @@ type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};
|
|
|
29
39
|
type WebSocketEvents = Simplify<
|
|
30
40
|
{
|
|
31
41
|
event: (event: ResponsesAPI.ResponsesServerEvent) => void;
|
|
42
|
+
raw: (data: RawWebSocketData) => void;
|
|
32
43
|
error: (error: WebSocketError) => void;
|
|
44
|
+
close: (code: number, reason: string, unsent: UnsentMessage<ResponsesAPI.ResponsesClientEvent>[]) => void;
|
|
45
|
+
reconnecting: (event: ReconnectingEvent) => void;
|
|
46
|
+
reconnected: () => void;
|
|
33
47
|
} & {
|
|
34
48
|
[EventType in Exclude<NonNullable<ResponsesAPI.ResponsesServerEvent['type']>, 'error'>]: (
|
|
35
49
|
event: Extract<ResponsesAPI.ResponsesServerEvent, { type?: EventType }>,
|
|
@@ -43,6 +57,11 @@ export abstract class ResponsesEmitter extends EventEmitter<WebSocketEvents> {
|
|
|
43
57
|
*/
|
|
44
58
|
abstract send(event: ResponsesAPI.ResponsesClientEvent): void;
|
|
45
59
|
|
|
60
|
+
/**
|
|
61
|
+
* Send raw data over the WebSocket without JSON serialization.
|
|
62
|
+
*/
|
|
63
|
+
abstract sendRaw(data: RawWebSocketData): void;
|
|
64
|
+
|
|
46
65
|
/**
|
|
47
66
|
* Close the WebSocket connection.
|
|
48
67
|
*/
|
|
@@ -77,14 +96,11 @@ export abstract class ResponsesEmitter extends EventEmitter<WebSocketEvents> {
|
|
|
77
96
|
}
|
|
78
97
|
}
|
|
79
98
|
|
|
80
|
-
export function buildURL(client: OpenAI,
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
const url = new URL(
|
|
84
|
-
|
|
85
|
-
url.search = stringifyQuery(query);
|
|
86
|
-
}
|
|
87
|
-
url.protocol = url.protocol === 'http:' ? 'ws:' : 'wss:';
|
|
99
|
+
export function buildURL(client: OpenAI, parameters: Record<string, unknown>): URL {
|
|
100
|
+
const { ...query } = parameters;
|
|
101
|
+
const endpoint = '/responses';
|
|
102
|
+
const url = new URL(client.buildURL(endpoint, query, undefined));
|
|
103
|
+
url.protocol = url.protocol === 'http:' || url.protocol === 'ws:' ? 'ws:' : 'wss:';
|
|
88
104
|
return url;
|
|
89
105
|
}
|
|
90
106
|
|
|
@@ -1120,7 +1120,7 @@ export interface Response {
|
|
|
1120
1120
|
* of 24 hours.
|
|
1121
1121
|
* [Learn more](https://platform.openai.com/docs/guides/prompt-caching#prompt-cache-retention).
|
|
1122
1122
|
*/
|
|
1123
|
-
prompt_cache_retention?: '
|
|
1123
|
+
prompt_cache_retention?: 'in_memory' | '24h' | null;
|
|
1124
1124
|
|
|
1125
1125
|
/**
|
|
1126
1126
|
* **gpt-5 and o-series models only**
|
|
@@ -3423,6 +3423,13 @@ export interface ResponseInputFile {
|
|
|
3423
3423
|
*/
|
|
3424
3424
|
type: 'input_file';
|
|
3425
3425
|
|
|
3426
|
+
/**
|
|
3427
|
+
* The detail level of the file to be sent to the model. Use `low` for the default
|
|
3428
|
+
* rendering behavior, or `high` to render the file at higher quality. Defaults to
|
|
3429
|
+
* `low`.
|
|
3430
|
+
*/
|
|
3431
|
+
detail?: 'low' | 'high';
|
|
3432
|
+
|
|
3426
3433
|
/**
|
|
3427
3434
|
* The content of the file to be sent to the model.
|
|
3428
3435
|
*/
|
|
@@ -3453,6 +3460,13 @@ export interface ResponseInputFileContent {
|
|
|
3453
3460
|
*/
|
|
3454
3461
|
type: 'input_file';
|
|
3455
3462
|
|
|
3463
|
+
/**
|
|
3464
|
+
* The detail level of the file to be sent to the model. Use `low` for the default
|
|
3465
|
+
* rendering behavior, or `high` to render the file at higher quality. Defaults to
|
|
3466
|
+
* `low`.
|
|
3467
|
+
*/
|
|
3468
|
+
detail?: 'low' | 'high';
|
|
3469
|
+
|
|
3456
3470
|
/**
|
|
3457
3471
|
* The base64-encoded data of the file to be sent to the model.
|
|
3458
3472
|
*/
|
|
@@ -6551,7 +6565,7 @@ export interface ResponsesClientEvent {
|
|
|
6551
6565
|
* of 24 hours.
|
|
6552
6566
|
* [Learn more](https://platform.openai.com/docs/guides/prompt-caching#prompt-cache-retention).
|
|
6553
6567
|
*/
|
|
6554
|
-
prompt_cache_retention?: '
|
|
6568
|
+
prompt_cache_retention?: 'in_memory' | '24h' | null;
|
|
6555
6569
|
|
|
6556
6570
|
/**
|
|
6557
6571
|
* **gpt-5 and o-series models only**
|
|
@@ -7571,7 +7585,7 @@ export interface ResponseCreateParamsBase {
|
|
|
7571
7585
|
* of 24 hours.
|
|
7572
7586
|
* [Learn more](https://platform.openai.com/docs/guides/prompt-caching#prompt-cache-retention).
|
|
7573
7587
|
*/
|
|
7574
|
-
prompt_cache_retention?: '
|
|
7588
|
+
prompt_cache_retention?: 'in_memory' | '24h' | null;
|
|
7575
7589
|
|
|
7576
7590
|
/**
|
|
7577
7591
|
* **gpt-5 and o-series models only**
|
|
@@ -7965,6 +7979,11 @@ export interface ResponseCompactParams {
|
|
|
7965
7979
|
* A key to use when reading from or writing to the prompt cache.
|
|
7966
7980
|
*/
|
|
7967
7981
|
prompt_cache_key?: string | null;
|
|
7982
|
+
|
|
7983
|
+
/**
|
|
7984
|
+
* How long to retain a prompt cache entry created by this request.
|
|
7985
|
+
*/
|
|
7986
|
+
prompt_cache_retention?: 'in_memory' | '24h' | null;
|
|
7968
7987
|
}
|
|
7969
7988
|
|
|
7970
7989
|
Responses.InputItems = InputItems;
|