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.
Files changed (112) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/core/EventEmitter.d.mts +11 -0
  3. package/core/EventEmitter.d.mts.map +1 -1
  4. package/core/EventEmitter.d.ts +11 -0
  5. package/core/EventEmitter.d.ts.map +1 -1
  6. package/core/EventEmitter.js +15 -1
  7. package/core/EventEmitter.js.map +1 -1
  8. package/core/EventEmitter.mjs +13 -0
  9. package/core/EventEmitter.mjs.map +1 -1
  10. package/internal/types.d.mts +6 -6
  11. package/internal/types.d.mts.map +1 -1
  12. package/internal/types.d.ts +6 -6
  13. package/internal/types.d.ts.map +1 -1
  14. package/internal/utils/env.js +2 -2
  15. package/internal/utils/env.js.map +1 -1
  16. package/internal/utils/env.mjs +2 -2
  17. package/internal/utils/env.mjs.map +1 -1
  18. package/internal/ws-adapter-browser.d.mts +34 -0
  19. package/internal/ws-adapter-browser.d.mts.map +1 -0
  20. package/internal/ws-adapter-browser.d.ts +34 -0
  21. package/internal/ws-adapter-browser.d.ts.map +1 -0
  22. package/internal/ws-adapter-browser.js +88 -0
  23. package/internal/ws-adapter-browser.js.map +1 -0
  24. package/internal/ws-adapter-browser.mjs +84 -0
  25. package/internal/ws-adapter-browser.mjs.map +1 -0
  26. package/internal/ws-adapter-node.d.mts +27 -0
  27. package/internal/ws-adapter-node.d.mts.map +1 -0
  28. package/internal/ws-adapter-node.d.ts +27 -0
  29. package/internal/ws-adapter-node.d.ts.map +1 -0
  30. package/internal/ws-adapter-node.js +90 -0
  31. package/internal/ws-adapter-node.js.map +1 -0
  32. package/internal/ws-adapter-node.mjs +86 -0
  33. package/internal/ws-adapter-node.mjs.map +1 -0
  34. package/internal/ws-adapter.d.mts +24 -0
  35. package/internal/ws-adapter.d.mts.map +1 -0
  36. package/internal/ws-adapter.d.ts +24 -0
  37. package/internal/ws-adapter.d.ts.map +1 -0
  38. package/internal/ws-adapter.js +11 -0
  39. package/internal/ws-adapter.js.map +1 -0
  40. package/internal/ws-adapter.mjs +8 -0
  41. package/internal/ws-adapter.mjs.map +1 -0
  42. package/internal/ws.d.mts +80 -0
  43. package/internal/ws.d.mts.map +1 -0
  44. package/internal/ws.d.ts +80 -0
  45. package/internal/ws.d.ts.map +1 -0
  46. package/internal/ws.js +153 -0
  47. package/internal/ws.js.map +1 -0
  48. package/internal/ws.mjs +147 -0
  49. package/internal/ws.mjs.map +1 -0
  50. package/package.json +13 -13
  51. package/resources/audio/speech.d.mts +2 -2
  52. package/resources/audio/speech.d.ts +2 -2
  53. package/resources/audio/speech.js +2 -2
  54. package/resources/audio/speech.mjs +2 -2
  55. package/resources/chat/completions/completions.d.mts +1 -1
  56. package/resources/chat/completions/completions.d.ts +1 -1
  57. package/resources/completions.d.mts +1 -1
  58. package/resources/completions.d.ts +1 -1
  59. package/resources/responses/index.d.mts +2 -0
  60. package/resources/responses/index.d.mts.map +1 -1
  61. package/resources/responses/index.d.ts +2 -0
  62. package/resources/responses/index.d.ts.map +1 -1
  63. package/resources/responses/internal-base.d.mts +24 -2
  64. package/resources/responses/internal-base.d.mts.map +1 -1
  65. package/resources/responses/internal-base.d.ts +24 -2
  66. package/resources/responses/internal-base.d.ts.map +1 -1
  67. package/resources/responses/internal-base.js +5 -9
  68. package/resources/responses/internal-base.js.map +1 -1
  69. package/resources/responses/internal-base.mjs +5 -9
  70. package/resources/responses/internal-base.mjs.map +1 -1
  71. package/resources/responses/responses.d.mts +19 -3
  72. package/resources/responses/responses.d.mts.map +1 -1
  73. package/resources/responses/responses.d.ts +19 -3
  74. package/resources/responses/responses.d.ts.map +1 -1
  75. package/resources/responses/responses.js.map +1 -1
  76. package/resources/responses/responses.mjs.map +1 -1
  77. package/resources/responses/ws-base.d.mts +106 -0
  78. package/resources/responses/ws-base.d.mts.map +1 -0
  79. package/resources/responses/ws-base.d.ts +106 -0
  80. package/resources/responses/ws-base.d.ts.map +1 -0
  81. package/resources/responses/ws-base.js +474 -0
  82. package/resources/responses/ws-base.js.map +1 -0
  83. package/resources/responses/ws-base.mjs +470 -0
  84. package/resources/responses/ws-base.mjs.map +1 -0
  85. package/resources/responses/ws.d.mts +9 -38
  86. package/resources/responses/ws.d.mts.map +1 -1
  87. package/resources/responses/ws.d.ts +9 -38
  88. package/resources/responses/ws.d.ts.map +1 -1
  89. package/resources/responses/ws.js +17 -171
  90. package/resources/responses/ws.js.map +1 -1
  91. package/resources/responses/ws.mjs +17 -171
  92. package/resources/responses/ws.mjs.map +1 -1
  93. package/src/core/EventEmitter.ts +16 -0
  94. package/src/internal/types.ts +6 -8
  95. package/src/internal/utils/env.ts +2 -2
  96. package/src/internal/ws-adapter-browser.ts +123 -0
  97. package/src/internal/ws-adapter-node.ts +105 -0
  98. package/src/internal/ws-adapter.ts +30 -0
  99. package/src/internal/ws.ts +193 -0
  100. package/src/resources/audio/speech.ts +2 -2
  101. package/src/resources/chat/completions/completions.ts +1 -1
  102. package/src/resources/completions.ts +1 -1
  103. package/src/resources/responses/index.ts +2 -0
  104. package/src/resources/responses/internal-base.ts +26 -10
  105. package/src/resources/responses/responses.ts +22 -3
  106. package/src/resources/responses/ws-base.ts +609 -0
  107. package/src/resources/responses/ws.ts +23 -186
  108. package/src/version.ts +1 -1
  109. package/version.d.mts +1 -1
  110. package/version.d.ts +1 -1
  111. package/version.js +1 -1
  112. 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: 'string',
22
- * voice: 'string',
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?: 'in-memory' | '24h' | null;
1668
+ prompt_cache_retention?: 'in_memory' | '24h' | null;
1669
1669
 
1670
1670
  /**
1671
1671
  * Constrains effort on reasoning for
@@ -20,7 +20,7 @@ export class Completions extends APIResource {
20
20
  * @example
21
21
  * ```ts
22
22
  * const completion = await client.completions.create({
23
- * model: 'string',
23
+ * model: 'gpt-3.5-turbo-instruct',
24
24
  * prompt: 'This is a test.',
25
25
  * });
26
26
  * ```
@@ -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
- import { stringifyQuery } from '../../internal/utils';
7
+
8
+ import type { RawWebSocketData, ReconnectingEvent, UnsentMessage } from '../../internal/ws';
8
9
 
9
10
  export type ResponsesStreamMessage =
10
- | { type: 'connecting' | 'open' | 'closing' | 'close' }
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, query?: object | null): URL {
81
- const path = '/responses';
82
- const baseURL = client.baseURL;
83
- const url = new URL(baseURL + (baseURL.endsWith('/') ? path.slice(1) : path));
84
- if (query) {
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?: 'in-memory' | '24h' | null;
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?: 'in-memory' | '24h' | null;
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?: 'in-memory' | '24h' | null;
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;