openai 7.17.0 → 7.19.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 (236) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +6 -3
  3. package/client.d.mts +2 -0
  4. package/client.d.mts.map +1 -1
  5. package/client.d.ts +2 -0
  6. package/client.d.ts.map +1 -1
  7. package/client.js +25 -7
  8. package/client.js.map +1 -1
  9. package/client.mjs +25 -7
  10. package/client.mjs.map +1 -1
  11. package/internal/parse.d.mts.map +1 -1
  12. package/internal/parse.d.ts.map +1 -1
  13. package/internal/parse.js +11 -7
  14. package/internal/parse.js.map +1 -1
  15. package/internal/parse.mjs +11 -7
  16. package/internal/parse.mjs.map +1 -1
  17. package/internal/utils/log.d.mts.map +1 -1
  18. package/internal/utils/log.d.ts.map +1 -1
  19. package/internal/utils/log.js +1 -0
  20. package/internal/utils/log.js.map +1 -1
  21. package/internal/utils/log.mjs +1 -0
  22. package/internal/utils/log.mjs.map +1 -1
  23. package/internal/ws.d.mts +7 -0
  24. package/internal/ws.d.mts.map +1 -1
  25. package/internal/ws.d.ts +7 -0
  26. package/internal/ws.d.ts.map +1 -1
  27. package/internal/ws.js +36 -2
  28. package/internal/ws.js.map +1 -1
  29. package/internal/ws.mjs +34 -3
  30. package/internal/ws.mjs.map +1 -1
  31. package/lib/responses/responses-websocket-lane.d.mts +63 -0
  32. package/lib/responses/responses-websocket-lane.d.mts.map +1 -0
  33. package/lib/responses/responses-websocket-lane.d.ts +63 -0
  34. package/lib/responses/responses-websocket-lane.d.ts.map +1 -0
  35. package/lib/responses/responses-websocket-lane.js +314 -0
  36. package/lib/responses/responses-websocket-lane.js.map +1 -0
  37. package/lib/responses/responses-websocket-lane.mjs +309 -0
  38. package/lib/responses/responses-websocket-lane.mjs.map +1 -0
  39. package/lib/responses/responses-websocket-session.d.mts +38 -0
  40. package/lib/responses/responses-websocket-session.d.mts.map +1 -0
  41. package/lib/responses/responses-websocket-session.d.ts +38 -0
  42. package/lib/responses/responses-websocket-session.d.ts.map +1 -0
  43. package/lib/responses/responses-websocket-session.js +268 -0
  44. package/lib/responses/responses-websocket-session.js.map +1 -0
  45. package/lib/responses/responses-websocket-session.mjs +263 -0
  46. package/lib/responses/responses-websocket-session.mjs.map +1 -0
  47. package/package.json +1 -1
  48. package/resources/admin/organization/admin-api-keys.d.mts +5 -1
  49. package/resources/admin/organization/admin-api-keys.d.mts.map +1 -1
  50. package/resources/admin/organization/admin-api-keys.d.ts +5 -1
  51. package/resources/admin/organization/admin-api-keys.d.ts.map +1 -1
  52. package/resources/beta/agents/agents.d.mts +6 -3
  53. package/resources/beta/agents/agents.d.mts.map +1 -1
  54. package/resources/beta/agents/agents.d.ts +6 -3
  55. package/resources/beta/agents/agents.d.ts.map +1 -1
  56. package/resources/beta/agents/agents.js.map +1 -1
  57. package/resources/beta/agents/agents.mjs.map +1 -1
  58. package/resources/beta/agents/environments/files.d.mts +5 -1
  59. package/resources/beta/agents/environments/files.d.mts.map +1 -1
  60. package/resources/beta/agents/environments/files.d.ts +5 -1
  61. package/resources/beta/agents/environments/files.d.ts.map +1 -1
  62. package/resources/beta/agents/environments/templates.d.mts +2 -4
  63. package/resources/beta/agents/environments/templates.d.mts.map +1 -1
  64. package/resources/beta/agents/environments/templates.d.ts +2 -4
  65. package/resources/beta/agents/environments/templates.d.ts.map +1 -1
  66. package/resources/beta/agents/sessions/artifacts.d.mts +9 -1
  67. package/resources/beta/agents/sessions/artifacts.d.mts.map +1 -1
  68. package/resources/beta/agents/sessions/artifacts.d.ts +9 -1
  69. package/resources/beta/agents/sessions/artifacts.d.ts.map +1 -1
  70. package/resources/beta/agents/sessions/events.d.mts +4 -1
  71. package/resources/beta/agents/sessions/events.d.mts.map +1 -1
  72. package/resources/beta/agents/sessions/events.d.ts +4 -1
  73. package/resources/beta/agents/sessions/events.d.ts.map +1 -1
  74. package/resources/beta/agents/sessions/events.js +4 -1
  75. package/resources/beta/agents/sessions/events.js.map +1 -1
  76. package/resources/beta/agents/sessions/events.mjs +4 -1
  77. package/resources/beta/agents/sessions/events.mjs.map +1 -1
  78. package/resources/beta/agents/sessions/sessions.d.mts +50 -3
  79. package/resources/beta/agents/sessions/sessions.d.mts.map +1 -1
  80. package/resources/beta/agents/sessions/sessions.d.ts +50 -3
  81. package/resources/beta/agents/sessions/sessions.d.ts.map +1 -1
  82. package/resources/beta/agents/sessions/sessions.js +5 -2
  83. package/resources/beta/agents/sessions/sessions.js.map +1 -1
  84. package/resources/beta/agents/sessions/sessions.mjs +5 -2
  85. package/resources/beta/agents/sessions/sessions.mjs.map +1 -1
  86. package/resources/beta/agents/vaults/credentials.d.mts +6 -1
  87. package/resources/beta/agents/vaults/credentials.d.mts.map +1 -1
  88. package/resources/beta/agents/vaults/credentials.d.ts +6 -1
  89. package/resources/beta/agents/vaults/credentials.d.ts.map +1 -1
  90. package/resources/beta/agents/vaults/vaults.d.mts +6 -1
  91. package/resources/beta/agents/vaults/vaults.d.mts.map +1 -1
  92. package/resources/beta/agents/vaults/vaults.d.ts +6 -1
  93. package/resources/beta/agents/vaults/vaults.d.ts.map +1 -1
  94. package/resources/beta/agents/vaults/vaults.js.map +1 -1
  95. package/resources/beta/agents/vaults/vaults.mjs.map +1 -1
  96. package/resources/beta/responses/responses.d.mts +21 -7
  97. package/resources/beta/responses/responses.d.mts.map +1 -1
  98. package/resources/beta/responses/responses.d.ts +21 -7
  99. package/resources/beta/responses/responses.d.ts.map +1 -1
  100. package/resources/beta/responses/responses.js.map +1 -1
  101. package/resources/beta/responses/responses.mjs.map +1 -1
  102. package/resources/beta/responses/ws-base.d.mts +4 -0
  103. package/resources/beta/responses/ws-base.d.mts.map +1 -1
  104. package/resources/beta/responses/ws-base.d.ts +4 -0
  105. package/resources/beta/responses/ws-base.d.ts.map +1 -1
  106. package/resources/beta/responses/ws-base.js +22 -1
  107. package/resources/beta/responses/ws-base.js.map +1 -1
  108. package/resources/beta/responses/ws-base.mjs +21 -2
  109. package/resources/beta/responses/ws-base.mjs.map +1 -1
  110. package/resources/beta/responses/ws.d.mts.map +1 -1
  111. package/resources/beta/responses/ws.d.ts.map +1 -1
  112. package/resources/beta/responses/ws.js +10 -6
  113. package/resources/beta/responses/ws.js.map +1 -1
  114. package/resources/beta/responses/ws.mjs +10 -6
  115. package/resources/beta/responses/ws.mjs.map +1 -1
  116. package/resources/index.d.mts +1 -1
  117. package/resources/index.d.mts.map +1 -1
  118. package/resources/index.d.ts +1 -1
  119. package/resources/index.d.ts.map +1 -1
  120. package/resources/index.js +1 -1
  121. package/resources/index.js.map +1 -1
  122. package/resources/index.mjs +1 -1
  123. package/resources/index.mjs.map +1 -1
  124. package/resources/live/forks/ws.d.mts.map +1 -1
  125. package/resources/live/forks/ws.d.ts.map +1 -1
  126. package/resources/live/forks/ws.js +2 -4
  127. package/resources/live/forks/ws.js.map +1 -1
  128. package/resources/live/forks/ws.mjs +2 -4
  129. package/resources/live/forks/ws.mjs.map +1 -1
  130. package/resources/live/sideband/ws.d.mts.map +1 -1
  131. package/resources/live/sideband/ws.d.ts.map +1 -1
  132. package/resources/live/sideband/ws.js +2 -4
  133. package/resources/live/sideband/ws.js.map +1 -1
  134. package/resources/live/sideband/ws.mjs +2 -4
  135. package/resources/live/sideband/ws.mjs.map +1 -1
  136. package/resources/live/ws.d.mts.map +1 -1
  137. package/resources/live/ws.d.ts.map +1 -1
  138. package/resources/live/ws.js +2 -4
  139. package/resources/live/ws.js.map +1 -1
  140. package/resources/live/ws.mjs +2 -4
  141. package/resources/live/ws.mjs.map +1 -1
  142. package/resources/realtime/client-secrets.d.mts +7 -3
  143. package/resources/realtime/client-secrets.d.mts.map +1 -1
  144. package/resources/realtime/client-secrets.d.ts +7 -3
  145. package/resources/realtime/client-secrets.d.ts.map +1 -1
  146. package/resources/realtime/realtime.d.mts +17 -8
  147. package/resources/realtime/realtime.d.mts.map +1 -1
  148. package/resources/realtime/realtime.d.ts +17 -8
  149. package/resources/realtime/realtime.d.ts.map +1 -1
  150. package/resources/realtime/realtime.js.map +1 -1
  151. package/resources/realtime/realtime.mjs.map +1 -1
  152. package/resources/responses/responses.d.mts +18 -4
  153. package/resources/responses/responses.d.mts.map +1 -1
  154. package/resources/responses/responses.d.ts +18 -4
  155. package/resources/responses/responses.d.ts.map +1 -1
  156. package/resources/responses/responses.js.map +1 -1
  157. package/resources/responses/responses.mjs.map +1 -1
  158. package/resources/responses/ws-base.d.mts +6 -0
  159. package/resources/responses/ws-base.d.mts.map +1 -1
  160. package/resources/responses/ws-base.d.ts +6 -0
  161. package/resources/responses/ws-base.d.ts.map +1 -1
  162. package/resources/responses/ws-base.js +27 -4
  163. package/resources/responses/ws-base.js.map +1 -1
  164. package/resources/responses/ws-base.mjs +26 -5
  165. package/resources/responses/ws-base.mjs.map +1 -1
  166. package/resources/responses/ws.d.mts.map +1 -1
  167. package/resources/responses/ws.d.ts.map +1 -1
  168. package/resources/responses/ws.js +10 -6
  169. package/resources/responses/ws.js.map +1 -1
  170. package/resources/responses/ws.mjs +10 -6
  171. package/resources/responses/ws.mjs.map +1 -1
  172. package/resources/shared.d.mts +1 -1
  173. package/resources/shared.d.mts.map +1 -1
  174. package/resources/shared.d.ts +1 -1
  175. package/resources/shared.d.ts.map +1 -1
  176. package/resources/webhooks/event-types.d.mts +17 -0
  177. package/resources/webhooks/event-types.d.mts.map +1 -0
  178. package/resources/webhooks/event-types.d.ts +17 -0
  179. package/resources/webhooks/event-types.d.ts.map +1 -0
  180. package/resources/webhooks/event-types.js +21 -0
  181. package/resources/webhooks/event-types.js.map +1 -0
  182. package/resources/webhooks/event-types.mjs +17 -0
  183. package/resources/webhooks/event-types.mjs.map +1 -0
  184. package/resources/webhooks/index.d.mts +1 -0
  185. package/resources/webhooks/index.d.mts.map +1 -1
  186. package/resources/webhooks/index.d.ts +1 -0
  187. package/resources/webhooks/index.d.ts.map +1 -1
  188. package/resources/webhooks/index.js +3 -0
  189. package/resources/webhooks/index.js.map +1 -1
  190. package/resources/webhooks/index.mjs +1 -0
  191. package/resources/webhooks/index.mjs.map +1 -1
  192. package/resources/webhooks/webhooks.d.mts +282 -5
  193. package/resources/webhooks/webhooks.d.mts.map +1 -1
  194. package/resources/webhooks/webhooks.d.ts +282 -5
  195. package/resources/webhooks/webhooks.d.ts.map +1 -1
  196. package/resources/webhooks/webhooks.js +121 -0
  197. package/resources/webhooks/webhooks.js.map +1 -1
  198. package/resources/webhooks/webhooks.mjs +121 -0
  199. package/resources/webhooks/webhooks.mjs.map +1 -1
  200. package/src/client.ts +31 -10
  201. package/src/internal/parse.ts +14 -10
  202. package/src/internal/utils/log.ts +1 -0
  203. package/src/internal/ws.ts +37 -3
  204. package/src/lib/responses/responses-websocket-lane.ts +388 -0
  205. package/src/lib/responses/responses-websocket-session.ts +317 -0
  206. package/src/resources/admin/organization/admin-api-keys.ts +6 -1
  207. package/src/resources/beta/agents/agents.ts +7 -3
  208. package/src/resources/beta/agents/environments/files.ts +6 -1
  209. package/src/resources/beta/agents/environments/templates.ts +2 -4
  210. package/src/resources/beta/agents/sessions/artifacts.ts +11 -1
  211. package/src/resources/beta/agents/sessions/events.ts +4 -1
  212. package/src/resources/beta/agents/sessions/sessions.ts +56 -3
  213. package/src/resources/beta/agents/vaults/credentials.ts +7 -1
  214. package/src/resources/beta/agents/vaults/vaults.ts +7 -1
  215. package/src/resources/beta/responses/responses.ts +27 -3
  216. package/src/resources/beta/responses/ws-base.ts +24 -1
  217. package/src/resources/beta/responses/ws.ts +9 -6
  218. package/src/resources/index.ts +1 -1
  219. package/src/resources/live/forks/ws.ts +4 -5
  220. package/src/resources/live/sideband/ws.ts +4 -5
  221. package/src/resources/live/ws.ts +4 -5
  222. package/src/resources/realtime/client-secrets.ts +7 -3
  223. package/src/resources/realtime/realtime.ts +17 -8
  224. package/src/resources/responses/responses.ts +21 -3
  225. package/src/resources/responses/ws-base.ts +29 -4
  226. package/src/resources/responses/ws.ts +9 -6
  227. package/src/resources/shared.ts +2 -0
  228. package/src/resources/webhooks/api.md +40 -21
  229. package/src/resources/webhooks/event-types.ts +21 -0
  230. package/src/resources/webhooks/index.ts +1 -0
  231. package/src/resources/webhooks/webhooks.ts +455 -4
  232. package/src/version.ts +1 -1
  233. package/version.d.mts +1 -1
  234. package/version.d.ts +1 -1
  235. package/version.js +1 -1
  236. package/version.mjs +1 -1
@@ -0,0 +1,317 @@
1
+ import type { ResponsesServerEvent } from '../../resources/responses/responses';
2
+ import type { ResponsesEmitter } from '../../resources/responses/internal-base';
3
+ import { WebSocketError } from '../../resources/responses/internal-base';
4
+ import { OpenAIError } from '../../core/error';
5
+ import { ReadyState } from '../../internal/ws-adapter';
6
+ import type { WebSocketLike } from '../../internal/ws-adapter';
7
+ import { getWebSocketError, rawByteLength } from '../../internal/ws';
8
+ import { hasOwn, isObj } from '../../internal/utils/values';
9
+ import { getWebSocketEventBytes, getWebSocketEventPayload } from '../../resources/responses/ws-base';
10
+ import {
11
+ getWebSocketEventBytes as getBetaWebSocketEventBytes,
12
+ getWebSocketEventPayload as getBetaWebSocketEventPayload,
13
+ } from '../../resources/beta/responses/ws-base';
14
+ import { ResponsesWebSocketLane, positiveInteger } from './responses-websocket-lane';
15
+
16
+ export { ResponsesWebSocketLane } from './responses-websocket-lane';
17
+ export type { ResponsesWebSocketEvent } from './responses-websocket-lane';
18
+
19
+ interface LaneState {
20
+ lane: ResponsesWebSocketLane;
21
+ events: number;
22
+ bytes: number;
23
+ }
24
+
25
+ /** Limits for this optional helper. They do not change the underlying socket's limits. */
26
+ export interface ResponsesWebSocketSessionOptions {
27
+ /** Maximum lane IDs registered until the next reconnect, including detached lanes. */
28
+ maxLanes: number;
29
+ /** Maximum queued events across all lanes. */
30
+ maxBufferedEvents: number;
31
+ /** Maximum queued UTF-8 JSON bytes across all lanes. */
32
+ maxBufferedBytes: number;
33
+ }
34
+
35
+ function parseEvent(serialized: string): ResponsesServerEvent {
36
+ // SAFETY: Validate the envelope below, as the native transport does for server-defined payloads.
37
+ const event = JSON.parse(serialized) as ResponsesServerEvent;
38
+ if (
39
+ !isObj(event) ||
40
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Match the native event envelope at this untyped boundary.
41
+ typeof Object.getOwnPropertyDescriptor(event, 'type')?.value !== 'string'
42
+ ) {
43
+ throw new OpenAIError('Invalid WebSocket event shape');
44
+ }
45
+ return event;
46
+ }
47
+
48
+ function serializeCustomEvent(incoming: ResponsesServerEvent): string {
49
+ const snapshot = structuredClone(incoming);
50
+ // Mask inherited serialization hooks throughout our copy, not the caller's event.
51
+ const pending: unknown[] = [snapshot];
52
+ const visited = new Set<object>();
53
+ while (pending.length > 0) {
54
+ const value = pending.pop();
55
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Traverse only objects in the untyped structured clone.
56
+ if (value === null || typeof value !== 'object' || visited.has(value)) {
57
+ continue;
58
+ }
59
+ visited.add(value);
60
+ // Keep Date's standard JSON conversion, which is owned by Date.prototype.
61
+ if (!(value instanceof Date) && !hasOwn(value, 'toJSON')) {
62
+ Object.defineProperty(value, 'toJSON', { value: undefined });
63
+ }
64
+ for (const child of Object.values(value)) {
65
+ pending.push(child);
66
+ }
67
+ }
68
+ return JSON.stringify(snapshot);
69
+ }
70
+
71
+ /**
72
+ * Routes events from an existing Responses socket without creating another reader.
73
+ * Register lanes before sending. Unregistered events remain observable on the socket.
74
+ * Closing this helper releases its listeners and lanes, but leaves the socket open.
75
+ * Attaching to a closing or closed socket is rejected.
76
+ * Reconnecting invalidates lanes: register new ones after restoring application state.
77
+ * No request is replayed by this helper.
78
+ */
79
+ export class ResponsesWebSocketSession {
80
+ readonly #connection: ResponsesEmitter & { readonly socket: WebSocketLike };
81
+ readonly #lanes = new Map<string | undefined, LaneState>();
82
+ readonly #maxLanes: number;
83
+ readonly #maxEvents: number;
84
+ readonly #maxBytes: number;
85
+ #events = 0;
86
+ #bytes = 0;
87
+ #closed = false;
88
+ #socket: WebSocketLike | undefined;
89
+ #failedTransport: { socket: WebSocketLike | undefined; error: WebSocketError } | undefined;
90
+
91
+ constructor(
92
+ connection: ResponsesEmitter & { readonly socket: WebSocketLike },
93
+ options: ResponsesWebSocketSessionOptions,
94
+ ) {
95
+ this.#connection = connection;
96
+ this.#maxLanes = positiveInteger(options.maxLanes);
97
+ this.#maxEvents = positiveInteger(options.maxBufferedEvents);
98
+ this.#maxBytes = positiveInteger(options.maxBufferedBytes);
99
+ if (
100
+ connection.socket.readyState === ReadyState.CLOSING ||
101
+ connection.socket.readyState === ReadyState.CLOSED
102
+ ) {
103
+ throw new OpenAIError('Cannot attach a Responses WebSocket session to a closing or closed socket');
104
+ }
105
+ connection.on('event', this.#onEvent);
106
+ connection.on('error', this.#onError);
107
+ connection.on('close', this.#onClose);
108
+ connection.on('reconnecting', this.#onReconnect);
109
+ connection.on('reconnected', this.#onReconnected);
110
+ this.#onReconnected();
111
+ }
112
+
113
+ /** Omit streamID for the protocol's default lane. A lane has one consumer.
114
+ * IDs remain reserved until reconnect, including after close or failure:
115
+ * a terminal response can still be followed by an automatic successor.
116
+ */
117
+ lane(
118
+ streamID?: string,
119
+ limits: { maxBufferedEvents?: number; maxBufferedBytes?: number } = {},
120
+ ): ResponsesWebSocketLane {
121
+ if (this.#closed) {
122
+ throw new OpenAIError('Responses WebSocket session is closed');
123
+ }
124
+ this.#assertTransportAvailable(this.#connection.socket);
125
+ if (
126
+ streamID !== undefined &&
127
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Untyped JavaScript callers must not create non-string routing keys through RegExp coercion.
128
+ (typeof streamID !== 'string' || !/^[A-Za-z0-9_.-]{1,256}$/u.test(streamID))
129
+ ) {
130
+ throw new OpenAIError('Invalid Responses WebSocket stream ID');
131
+ }
132
+ if (this.#lanes.has(streamID)) {
133
+ throw new OpenAIError('Responses WebSocket lane is already registered');
134
+ }
135
+ if (this.#lanes.size >= this.#maxLanes) {
136
+ throw new OpenAIError('Responses WebSocket lane limit exceeded');
137
+ }
138
+ const entry: LaneState = {
139
+ events: 0,
140
+ bytes: 0,
141
+ lane: new ResponsesWebSocketLane(
142
+ streamID,
143
+ (event) => {
144
+ const { socket } = this.#connection;
145
+ this.#assertTransportAvailable(socket);
146
+ if (socket.readyState !== ReadyState.OPEN) {
147
+ throw new OpenAIError('Wait for an open Responses WebSocket before sending');
148
+ }
149
+ // The emitter's reconnect queue may replay an uncertain write. Send
150
+ // directly to the physical socket, including during its open callback.
151
+ socket.send(JSON.stringify(event));
152
+ },
153
+ (bytes) => {
154
+ this.#events -= 1;
155
+ this.#bytes -= bytes;
156
+ entry.events -= 1;
157
+ entry.bytes -= bytes;
158
+ },
159
+ positiveInteger(limits.maxBufferedEvents ?? this.#maxEvents),
160
+ positiveInteger(limits.maxBufferedBytes ?? this.#maxBytes),
161
+ ),
162
+ };
163
+ this.#lanes.set(streamID, entry);
164
+ return entry.lane;
165
+ }
166
+
167
+ close(): void {
168
+ this.#closed = true;
169
+ this.#removeListeners();
170
+ this.#failLanes(new OpenAIError('Responses WebSocket session is closed'));
171
+ this.#lanes.clear();
172
+ }
173
+
174
+ #removeListeners(): void {
175
+ this.#connection.off('event', this.#onEvent);
176
+ this.#connection.off('error', this.#onError);
177
+ this.#connection.off('close', this.#onClose);
178
+ this.#connection.off('reconnecting', this.#onReconnect);
179
+ this.#connection.off('reconnected', this.#onReconnected);
180
+ this.#socket?.off('error', this.#onSocketError);
181
+ this.#socket = undefined;
182
+ }
183
+
184
+ #onEvent = (incoming: ResponsesServerEvent): void => {
185
+ let event: ResponsesServerEvent;
186
+ let bytes: number;
187
+ try {
188
+ const payload = getWebSocketEventPayload(incoming) ?? getBetaWebSocketEventPayload(incoming);
189
+ // Native events are copied from the wire, before any observer's mutations.
190
+ // Clone custom inputs once to strip prototypes and evaluate accessors,
191
+ // then retain only the JSON representation covered by byte accounting.
192
+ let serialized = payload;
193
+ if (serialized === undefined) {
194
+ serialized = serializeCustomEvent(incoming);
195
+ }
196
+ event = parseEvent(serialized);
197
+ bytes =
198
+ payload === undefined
199
+ ? rawByteLength(serialized)
200
+ : (getBetaWebSocketEventBytes(incoming) ?? getWebSocketEventBytes(incoming));
201
+ } catch {
202
+ this.#failLanes(new OpenAIError('Cannot snapshot custom WebSocket event'));
203
+ return;
204
+ }
205
+ const routing = Object.getOwnPropertyDescriptor(event, 'stream_id');
206
+ let streamID: string | undefined;
207
+ if (routing) {
208
+ const value: unknown = routing.value;
209
+ // oxlint-disable-next-line anti-slop/no-runtime-typeof -- Raw event observers may mutate routing; only an own string value can select a lane, without invoking accessors.
210
+ if (typeof value !== 'string') {
211
+ return;
212
+ }
213
+ streamID = value;
214
+ }
215
+ const entry = this.#lanes.get(streamID);
216
+ if (!entry || entry.lane.ended) {
217
+ return;
218
+ }
219
+ if (bytes > this.#maxBytes) {
220
+ entry.lane.fail(new OpenAIError('Responses WebSocket helper buffer limit exceeded'));
221
+ return;
222
+ }
223
+ this.#events += 1;
224
+ this.#bytes += bytes;
225
+ entry.events += 1;
226
+ entry.bytes += bytes;
227
+ // Apply the lane's own limits first, releasing its backlog on overflow.
228
+ entry.lane.push(event, bytes);
229
+ while (this.#events > this.#maxEvents || this.#bytes > this.#maxBytes) {
230
+ const bytePressure = this.#bytes > this.#maxBytes;
231
+ let largest = entry;
232
+ let largestSize = 0;
233
+ for (const candidate of this.#lanes.values()) {
234
+ // Attribute pressure to existing backlogs, excluding the incoming event.
235
+ const size = bytePressure
236
+ ? candidate.bytes - (candidate === entry ? bytes : 0)
237
+ : candidate.events - (candidate === entry ? 1 : 0);
238
+ // Strict comparison breaks ties by lane registration order.
239
+ if (size > largestSize) {
240
+ largest = candidate;
241
+ largestSize = size;
242
+ }
243
+ }
244
+ largest.lane.fail(new OpenAIError('Responses WebSocket helper buffer limit exceeded'));
245
+ }
246
+ };
247
+
248
+ #onClose = (): void => {
249
+ if (this.#closed) {
250
+ return;
251
+ }
252
+ this.#closed = true;
253
+ this.#removeListeners();
254
+ for (const { lane } of this.#lanes.values()) {
255
+ lane.end(new OpenAIError('Responses WebSocket connection closed'));
256
+ }
257
+ };
258
+ // oxlint-disable-next-line eslint/class-methods-use-this -- Each session owns a distinct listener so detaching one does not unhandle another session's errors.
259
+ #onError = (): void => {
260
+ // API errors are routed as events. Other emitter errors may be recoverable
261
+ // diagnostics; only the physical socket's errors end all lanes.
262
+ };
263
+ #onSocketError = (cause: Error): void => {
264
+ const error = new WebSocketError(cause.message, null);
265
+ Object.assign(error, { cause });
266
+ this.#failedTransport = { socket: this.#socket, error };
267
+ for (const { lane } of this.#lanes.values()) {
268
+ lane.end(error);
269
+ }
270
+ };
271
+ #onReconnect = (): void => {
272
+ this.#socket?.off('error', this.#onSocketError);
273
+ this.#socket = undefined;
274
+ this.#failLanes(new OpenAIError('Responses WebSocket reconnected state must be restored explicitly'));
275
+ this.#lanes.clear();
276
+ };
277
+ #onReconnected = (): void => {
278
+ if (this.#closed) {
279
+ return;
280
+ }
281
+ this.#socket?.off('error', this.#onSocketError);
282
+ this.#socket = this.#connection.socket;
283
+ this.#clearRecoveredTransportError(this.#socket);
284
+ this.#socket.on('error', this.#onSocketError);
285
+ };
286
+
287
+ #assertTransportAvailable(socket: WebSocketLike): void {
288
+ // Native transports record failure before forwarding their public error event.
289
+ const cause = getWebSocketError(socket);
290
+ if (cause) {
291
+ const error = new WebSocketError(cause.message, null);
292
+ Object.assign(error, { cause });
293
+ throw error;
294
+ }
295
+ this.#clearRecoveredTransportError(socket);
296
+ if (this.#failedTransport) {
297
+ throw this.#failedTransport.error;
298
+ }
299
+ }
300
+
301
+ #clearRecoveredTransportError(socket: WebSocketLike): void {
302
+ // Application recovery callbacks can run before our reconnected listener.
303
+ if (
304
+ this.#failedTransport &&
305
+ socket !== this.#failedTransport.socket &&
306
+ socket.readyState === ReadyState.OPEN
307
+ ) {
308
+ this.#failedTransport = undefined;
309
+ }
310
+ }
311
+
312
+ #failLanes(error: Error): void {
313
+ for (const { lane } of this.#lanes.values()) {
314
+ lane.fail(error);
315
+ }
316
+ }
317
+ }
@@ -191,7 +191,12 @@ export interface AdminAPIKeyCreateParams {
191
191
  expires_in_seconds?: number;
192
192
  }
193
193
 
194
- export interface AdminAPIKeyListParams extends CursorPageParams {
194
+ export interface AdminAPIKeyListParams extends Omit<CursorPageParams, 'after'> {
195
+ /**
196
+ * Return keys with IDs that come after this ID in the pagination order.
197
+ */
198
+ after?: string | null;
199
+
195
200
  /**
196
201
  * Order results by creation time, ascending or descending.
197
202
  */
@@ -2955,8 +2955,7 @@ export namespace EnvironmentParam {
2955
2955
  /**
2956
2956
  * The environment's network access mode.
2957
2957
  *
2958
- * - `enabled` - Allows unrestricted network access, matching an omitted network
2959
- * policy.
2958
+ * - `enabled` - Allows unrestricted network access.
2960
2959
  * - `disabled` - Disables network access.
2961
2960
  * - `restricted` - Allows access only to configured domains.
2962
2961
  */
@@ -4481,7 +4480,12 @@ export interface AgentUpdateParams {
4481
4480
  tools?: Array<PersistedAgentToolParam> | null;
4482
4481
  }
4483
4482
 
4484
- export interface AgentListParams extends CursorPageParams {
4483
+ export interface AgentListParams extends Omit<CursorPageParams, 'limit'> {
4484
+ /**
4485
+ * The maximum number of resources to return.
4486
+ */
4487
+ limit?: number | null;
4488
+
4485
4489
  /**
4486
4490
  * The order in which resources are returned. Defaults to `desc`.
4487
4491
  *
@@ -139,7 +139,12 @@ export declare namespace FileCreateParams {
139
139
  }
140
140
  }
141
141
 
142
- export interface FileListParams extends TokenPageParams {
142
+ export interface FileListParams extends Omit<TokenPageParams, 'limit'> {
143
+ /**
144
+ * The maximum number of files to return, between 1 and 100.
145
+ */
146
+ limit?: number | null;
147
+
143
148
  /**
144
149
  * Sort by case-sensitive path components. Defaults to descending.
145
150
  *
@@ -392,8 +392,7 @@ export namespace TemplateCreateParams {
392
392
  /**
393
393
  * The environment's network access mode.
394
394
  *
395
- * - `enabled` - Allows unrestricted network access, matching an omitted network
396
- * policy.
395
+ * - `enabled` - Allows unrestricted network access.
397
396
  * - `disabled` - Disables network access.
398
397
  * - `restricted` - Allows access only to configured domains.
399
398
  */
@@ -481,8 +480,7 @@ export namespace TemplateUpdateParams {
481
480
  /**
482
481
  * The environment's network access mode.
483
482
  *
484
- * - `enabled` - Allows unrestricted network access, matching an omitted network
485
- * policy.
483
+ * - `enabled` - Allows unrestricted network access.
486
484
  * - `disabled` - Disables network access.
487
485
  * - `restricted` - Allows access only to configured domains.
488
486
  */
@@ -197,12 +197,22 @@ export interface ArtifactRetrieveParams {
197
197
  session_id: string;
198
198
  }
199
199
 
200
- export interface ArtifactListParams extends CursorPageParams {
200
+ export interface ArtifactListParams extends Omit<CursorPageParams, 'after' | 'limit'> {
201
+ /**
202
+ * Return artifacts after this immutable artifact ID.
203
+ */
204
+ after?: string | null;
205
+
201
206
  /**
202
207
  * Restrict the listing to artifacts produced by this environment.
203
208
  */
204
209
  environment_id?: string | null;
205
210
 
211
+ /**
212
+ * The maximum number of artifacts to return, between 1 and 100.
213
+ */
214
+ limit?: number | null;
215
+
206
216
  /**
207
217
  * Sort by creation time and ID. Defaults to descending.
208
218
  *
@@ -11,7 +11,10 @@ import { path } from '../../../../internal/utils/path';
11
11
  export class Events extends APIResource {
12
12
  /**
13
13
  * Submits message, cancellation, or tool-result events to a managed agent session.
14
- * See
14
+ * Cancellation can recover a still-open turn whose backend execution has ended by
15
+ * marking it cancelled and abandoning unpublished outputs. Saved results,
16
+ * published files, and existing terminal outcomes are preserved. HTTP 202 confirms
17
+ * acceptance, not durable completion. See
15
18
  * [session events](https://developers.openai.com/api/docs/guides/agents-api/sessions/events).
16
19
  *
17
20
  * @example
@@ -100,7 +100,8 @@ export class Sessions extends APIResource {
100
100
  }
101
101
 
102
102
  /**
103
- * Updates session metadata. Omitted fields are unchanged. See
103
+ * Updates session metadata, model, reasoning effort, or service tier. Model
104
+ * settings apply to subsequent turns. Omitted fields are unchanged. See
104
105
  * [managing sessions](https://developers.openai.com/api/docs/guides/agents-api/sessions/manage).
105
106
  *
106
107
  * @example
@@ -149,7 +150,9 @@ export class Sessions extends APIResource {
149
150
 
150
151
  /**
151
152
  * Removes a managed agent session from the public API and returns a deletion
152
- * confirmation. Physical cleanup may continue asynchronously. See
153
+ * confirmation. If backend execution has ended, deletion can cancel a still-open
154
+ * public turn and abandon unpublished outputs. Running execution must be cancelled
155
+ * first. Physical cleanup may continue asynchronously. See
153
156
  * [managing sessions](https://developers.openai.com/api/docs/guides/agents-api/sessions/manage).
154
157
  *
155
158
  * @example
@@ -277,6 +280,11 @@ export interface SessionCreateParamsStreaming extends SessionCreateParamsBase {
277
280
  }
278
281
 
279
282
  export interface SessionUpdateParams {
283
+ /**
284
+ * Model settings for subsequent turns. Omitted fields stay unchanged.
285
+ */
286
+ agent?: SessionUpdateParams.Agent;
287
+
280
288
  /**
281
289
  * Replaces all metadata. Omit to leave unchanged, or pass null or {} to clear it.
282
290
  * Up to 16 string key-value pairs, with keys up to 64 and values up to 512
@@ -285,13 +293,58 @@ export interface SessionUpdateParams {
285
293
  metadata?: { [key: string]: string } | null;
286
294
  }
287
295
 
288
- export interface SessionListParams extends CursorPageParams {
296
+ export namespace SessionUpdateParams {
297
+ /**
298
+ * Model settings for subsequent turns. Omitted fields stay unchanged.
299
+ */
300
+ export interface Agent {
301
+ /**
302
+ * The model for subsequent turns. Omit to keep the current model.
303
+ */
304
+ model?: string;
305
+
306
+ /**
307
+ * Reasoning settings to update. Omit to keep the current effort.
308
+ */
309
+ reasoning?: Agent.Reasoning;
310
+
311
+ /**
312
+ * The service tier used for model requests.
313
+ *
314
+ * - `auto` - Selects the service tier automatically.
315
+ * - `default` - Uses the default service tier.
316
+ * - `flex` - Uses the flex service tier.
317
+ * - `priority` - Uses the priority service tier.
318
+ * - `fast` - Uses the fast service tier.
319
+ */
320
+ service_tier?: 'auto' | 'default' | 'flex' | 'priority' | 'fast' | null;
321
+ }
322
+
323
+ export namespace Agent {
324
+ /**
325
+ * Reasoning settings to update. Omit to keep the current effort.
326
+ */
327
+ export interface Reasoning {
328
+ /**
329
+ * The amount of reasoning effort the model should use.
330
+ */
331
+ effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max' | null;
332
+ }
333
+ }
334
+ }
335
+
336
+ export interface SessionListParams extends Omit<CursorPageParams, 'limit'> {
289
337
  /**
290
338
  * Only return sessions whose root agent has this ID. Omit to return sessions for
291
339
  * all agents.
292
340
  */
293
341
  agent_id?: string;
294
342
 
343
+ /**
344
+ * The maximum number of resources to return.
345
+ */
346
+ limit?: number | null;
347
+
295
348
  /**
296
349
  * Sort order by the `created_at` timestamp. Use `asc` for ascending order or
297
350
  * `desc` for descending order. Defaults to `desc`.
@@ -643,7 +643,13 @@ export interface CredentialUpdateParams {
643
643
  auth: CredentialAuthRotateParam;
644
644
  }
645
645
 
646
- export interface CredentialListParams extends CursorPageParams {
646
+ export interface CredentialListParams extends Omit<CursorPageParams, 'limit'> {
647
+ /**
648
+ * The maximum number of resources to return. Defaults to 20. Values are clamped
649
+ * between 1 and 100.
650
+ */
651
+ limit?: number | null;
652
+
647
653
  /**
648
654
  * Sort order by the `created_at` timestamp. Use `asc` for ascending order or
649
655
  * `desc` for descending order. Defaults to `desc`.
@@ -187,7 +187,13 @@ export interface VaultCreateParams {
187
187
  name?: string;
188
188
  }
189
189
 
190
- export interface VaultListParams extends CursorPageParams {
190
+ export interface VaultListParams extends Omit<CursorPageParams, 'limit'> {
191
+ /**
192
+ * The maximum number of resources to return. Defaults to 20. Values are clamped
193
+ * between 1 and 100.
194
+ */
195
+ limit?: number | null;
196
+
191
197
  /**
192
198
  * Sort order by the `created_at` timestamp. Use `asc` for ascending order or
193
199
  * `desc` for descending order. Defaults to `desc`.
@@ -1194,6 +1194,8 @@ export interface BetaResponse {
1194
1194
  | 'gpt-4o-2024-11-20'
1195
1195
  | 'gpt-4o-2024-08-06'
1196
1196
  | 'gpt-4o-2024-05-13'
1197
+ | 'gpt-audio-mini'
1198
+ | 'gpt-audio-mini-2025-12-15'
1197
1199
  | 'gpt-4o-audio-preview'
1198
1200
  | 'gpt-4o-audio-preview-2024-10-01'
1199
1201
  | 'gpt-4o-audio-preview-2024-12-17'
@@ -11771,6 +11773,8 @@ export namespace BetaResponsesClientEvent {
11771
11773
  | 'gpt-4o-2024-11-20'
11772
11774
  | 'gpt-4o-2024-08-06'
11773
11775
  | 'gpt-4o-2024-05-13'
11776
+ | 'gpt-audio-mini'
11777
+ | 'gpt-audio-mini-2025-12-15'
11774
11778
  | 'gpt-4o-audio-preview'
11775
11779
  | 'gpt-4o-audio-preview-2024-10-01'
11776
11780
  | 'gpt-4o-audio-preview-2024-12-17'
@@ -12178,6 +12182,12 @@ export namespace BetaResponsesClientEvent {
12178
12182
  */
12179
12183
  mode?: 'implicit' | 'explicit';
12180
12184
 
12185
+ /**
12186
+ * Prepares the prompt cache without generating output. Defaults to `false`. When
12187
+ * set to `true`, overrides the `generate` field to `false`.
12188
+ */
12189
+ prewarm?: boolean;
12190
+
12181
12191
  /**
12182
12192
  * The minimum lifetime applied to every implicit and explicit cache breakpoint
12183
12193
  * written by the request. Defaults to `30m`, which is currently the only supported
@@ -13219,11 +13229,15 @@ export namespace BetaTool {
13219
13229
  authorization?: string;
13220
13230
 
13221
13231
  /**
13222
- * Identifier for service connectors, like those available in ChatGPT. One of
13223
- * `server_url`, `connector_id`, or `tunnel_id` must be provided. Learn more about
13224
- * service connectors
13232
+ * @deprecated Identifier for service connectors, like those available in ChatGPT.
13233
+ * One of `server_url`, `connector_id`, or `tunnel_id` must be provided. Learn more
13234
+ * about service connectors
13225
13235
  * [here](https://developers.openai.com/api/docs/guides/tools-connectors-mcp#connectors).
13226
13236
  *
13237
+ * This field is deprecated for models released after September 1, 2026. Use
13238
+ * `server_url` to connect to a remote MCP server, or `tunnel_id` to connect
13239
+ * through a Secure MCP Tunnel.
13240
+ *
13227
13241
  * Currently supported `connector_id` values are:
13228
13242
  *
13229
13243
  * - Dropbox: `connector_dropbox`
@@ -14014,6 +14028,8 @@ export interface ResponseCreateParamsBase {
14014
14028
  | 'gpt-4o-2024-11-20'
14015
14029
  | 'gpt-4o-2024-08-06'
14016
14030
  | 'gpt-4o-2024-05-13'
14031
+ | 'gpt-audio-mini'
14032
+ | 'gpt-audio-mini-2025-12-15'
14017
14033
  | 'gpt-4o-audio-preview'
14018
14034
  | 'gpt-4o-audio-preview-2024-10-01'
14019
14035
  | 'gpt-4o-audio-preview-2024-12-17'
@@ -14422,6 +14438,12 @@ export namespace ResponseCreateParams {
14422
14438
  */
14423
14439
  mode?: 'implicit' | 'explicit';
14424
14440
 
14441
+ /**
14442
+ * Prepares the prompt cache without generating output. Defaults to `false`. When
14443
+ * set to `true`, overrides the `generate` field to `false`.
14444
+ */
14445
+ prewarm?: boolean;
14446
+
14425
14447
  /**
14426
14448
  * The minimum lifetime applied to every implicit and explicit cache breakpoint
14427
14449
  * written by the request. Defaults to `30m`, which is currently the only supported
@@ -14676,6 +14698,8 @@ export interface ResponseCompactParams {
14676
14698
  | 'gpt-4o-2024-11-20'
14677
14699
  | 'gpt-4o-2024-08-06'
14678
14700
  | 'gpt-4o-2024-05-13'
14701
+ | 'gpt-audio-mini'
14702
+ | 'gpt-audio-mini-2025-12-15'
14679
14703
  | 'gpt-4o-audio-preview'
14680
14704
  | 'gpt-4o-audio-preview-2024-10-01'
14681
14705
  | 'gpt-4o-audio-preview-2024-12-17'
@@ -7,6 +7,8 @@ import { type WebSocketLike, ReadyState } from '../../../internal/ws-adapter';
7
7
  import {
8
8
  SendQueue,
9
9
  getMaxBufferedEvents,
10
+ recordWebSocketError,
11
+ rawByteLength,
10
12
  type WebSocketStreamOptions,
11
13
  flattenRawData,
12
14
  isRecoverableClose,
@@ -19,6 +21,19 @@ import * as ResponsesAPI from './responses';
19
21
  import { OpenAI } from '../../../client';
20
22
  import { OpenAIError } from '../../../core/error';
21
23
 
24
+ const webSocketEventPayloads = new WeakMap<object, string>();
25
+ const webSocketEventBytes = new WeakMap<object, number>();
26
+
27
+ /** Original wire size, available only during synchronous event notification. @internal */
28
+ export function getWebSocketEventBytes(event: object): number | undefined {
29
+ return webSocketEventBytes.get(event);
30
+ }
31
+
32
+ /** Original JSON, available only during synchronous event notification. @internal */
33
+ export function getWebSocketEventPayload(event: object): string | undefined {
34
+ return webSocketEventPayloads.get(event);
35
+ }
36
+
22
37
  export interface ResponsesWSReconnectOptions {
23
38
  /**
24
39
  * Called before each reconnect attempt. Return an object with
@@ -457,7 +472,14 @@ export abstract class ResponsesWSBase<TSocket extends WebSocketLike> extends Res
457
472
  return;
458
473
  }
459
474
 
460
- this._emit('event', event);
475
+ webSocketEventBytes.set(event, rawByteLength(data));
476
+ webSocketEventPayloads.set(event, text);
477
+ try {
478
+ this._emit('event', event);
479
+ } finally {
480
+ webSocketEventBytes.delete(event);
481
+ webSocketEventPayloads.delete(event);
482
+ }
461
483
 
462
484
  if (event.type === 'error') {
463
485
  this._onError(event);
@@ -468,6 +490,7 @@ export abstract class ResponsesWSBase<TSocket extends WebSocketLike> extends Res
468
490
  });
469
491
 
470
492
  socket.on('error', (err: Error) => {
493
+ recordWebSocketError(socket, err);
471
494
  // Suppress transient errors during reconnection — the retry loop
472
495
  // already handles them and will surface a close if retries exhaust.
473
496
  if (this._isReconnecting) return;