openai 7.5.0 → 7.7.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 (597) hide show
  1. package/CHANGELOG.md +117 -0
  2. package/README.md +46 -2
  3. package/auth/index.d.mts +1 -1
  4. package/auth/index.d.mts.map +1 -1
  5. package/auth/index.d.ts +1 -1
  6. package/auth/index.d.ts.map +1 -1
  7. package/auth/index.js.map +1 -1
  8. package/auth/index.mjs.map +1 -1
  9. package/auth/subject-token-providers.d.mts.map +1 -1
  10. package/auth/subject-token-providers.d.ts.map +1 -1
  11. package/auth/subject-token-providers.js +176 -4
  12. package/auth/subject-token-providers.js.map +1 -1
  13. package/auth/subject-token-providers.mjs +176 -4
  14. package/auth/subject-token-providers.mjs.map +1 -1
  15. package/auth/types.d.mts +17 -0
  16. package/auth/types.d.mts.map +1 -1
  17. package/auth/types.d.ts +17 -0
  18. package/auth/types.d.ts.map +1 -1
  19. package/auth/workload-identity-auth.d.mts.map +1 -1
  20. package/auth/workload-identity-auth.d.ts.map +1 -1
  21. package/auth/workload-identity-auth.js +80 -7
  22. package/auth/workload-identity-auth.js.map +1 -1
  23. package/auth/workload-identity-auth.mjs +80 -7
  24. package/auth/workload-identity-auth.mjs.map +1 -1
  25. package/auth/x509-transport.d.mts +5 -0
  26. package/auth/x509-transport.d.mts.map +1 -0
  27. package/auth/x509-transport.d.ts +5 -0
  28. package/auth/x509-transport.d.ts.map +1 -0
  29. package/auth/x509-transport.js +39 -0
  30. package/auth/x509-transport.js.map +1 -0
  31. package/auth/x509-transport.mjs +36 -0
  32. package/auth/x509-transport.mjs.map +1 -0
  33. package/azure.d.mts +11 -2
  34. package/azure.d.mts.map +1 -1
  35. package/azure.d.ts +11 -2
  36. package/azure.d.ts.map +1 -1
  37. package/azure.js +7 -1
  38. package/azure.js.map +1 -1
  39. package/azure.mjs +7 -1
  40. package/azure.mjs.map +1 -1
  41. package/bedrock.d.mts +6 -2
  42. package/bedrock.d.mts.map +1 -1
  43. package/bedrock.d.ts +6 -2
  44. package/bedrock.d.ts.map +1 -1
  45. package/bedrock.js +34 -4
  46. package/bedrock.js.map +1 -1
  47. package/bedrock.mjs +35 -5
  48. package/bedrock.mjs.map +1 -1
  49. package/beta/realtime/internal-base.d.mts +2 -0
  50. package/beta/realtime/internal-base.d.mts.map +1 -1
  51. package/beta/realtime/internal-base.d.ts +2 -0
  52. package/beta/realtime/internal-base.d.ts.map +1 -1
  53. package/beta/realtime/internal-base.js +15 -0
  54. package/beta/realtime/internal-base.js.map +1 -1
  55. package/beta/realtime/internal-base.mjs +14 -0
  56. package/beta/realtime/internal-base.mjs.map +1 -1
  57. package/beta/realtime/websocket.d.mts +11 -5
  58. package/beta/realtime/websocket.d.mts.map +1 -1
  59. package/beta/realtime/websocket.d.ts +11 -5
  60. package/beta/realtime/websocket.d.ts.map +1 -1
  61. package/beta/realtime/websocket.js +106 -31
  62. package/beta/realtime/websocket.js.map +1 -1
  63. package/beta/realtime/websocket.mjs +107 -32
  64. package/beta/realtime/websocket.mjs.map +1 -1
  65. package/beta/realtime/ws.d.mts +0 -2
  66. package/beta/realtime/ws.d.mts.map +1 -1
  67. package/beta/realtime/ws.d.ts +0 -2
  68. package/beta/realtime/ws.d.ts.map +1 -1
  69. package/beta/realtime/ws.js +24 -5
  70. package/beta/realtime/ws.js.map +1 -1
  71. package/beta/realtime/ws.mjs +25 -6
  72. package/beta/realtime/ws.mjs.map +1 -1
  73. package/client.d.mts +17 -2
  74. package/client.d.mts.map +1 -1
  75. package/client.d.ts +17 -2
  76. package/client.d.ts.map +1 -1
  77. package/client.js +422 -70
  78. package/client.js.map +1 -1
  79. package/client.mjs +423 -71
  80. package/client.mjs.map +1 -1
  81. package/core/EventEmitter.d.mts.map +1 -1
  82. package/core/EventEmitter.d.ts.map +1 -1
  83. package/core/EventEmitter.js +67 -9
  84. package/core/EventEmitter.js.map +1 -1
  85. package/core/EventEmitter.mjs +68 -10
  86. package/core/EventEmitter.mjs.map +1 -1
  87. package/core/streaming.d.mts +1 -0
  88. package/core/streaming.d.mts.map +1 -1
  89. package/core/streaming.d.ts +1 -0
  90. package/core/streaming.d.ts.map +1 -1
  91. package/core/streaming.js +216 -26
  92. package/core/streaming.js.map +1 -1
  93. package/core/streaming.mjs +216 -26
  94. package/core/streaming.mjs.map +1 -1
  95. package/helpers/audio.d.mts +5 -5
  96. package/helpers/audio.d.mts.map +1 -1
  97. package/helpers/audio.d.ts +5 -5
  98. package/helpers/audio.d.ts.map +1 -1
  99. package/helpers/audio.js +93 -22
  100. package/helpers/audio.js.map +1 -1
  101. package/helpers/audio.mjs +93 -22
  102. package/helpers/audio.mjs.map +1 -1
  103. package/helpers/standard-schema.d.mts.map +1 -1
  104. package/helpers/standard-schema.d.ts.map +1 -1
  105. package/helpers/standard-schema.js +34 -14
  106. package/helpers/standard-schema.js.map +1 -1
  107. package/helpers/standard-schema.mjs +35 -15
  108. package/helpers/standard-schema.mjs.map +1 -1
  109. package/helpers/zod-v3-strict-schema.d.mts +7 -0
  110. package/helpers/zod-v3-strict-schema.d.mts.map +1 -0
  111. package/helpers/zod-v3-strict-schema.d.ts +7 -0
  112. package/helpers/zod-v3-strict-schema.d.ts.map +1 -0
  113. package/helpers/zod-v3-strict-schema.js +403 -0
  114. package/helpers/zod-v3-strict-schema.js.map +1 -0
  115. package/helpers/zod-v3-strict-schema.mjs +399 -0
  116. package/helpers/zod-v3-strict-schema.mjs.map +1 -0
  117. package/helpers/zod.d.mts.map +1 -1
  118. package/helpers/zod.d.ts.map +1 -1
  119. package/helpers/zod.js +11 -3
  120. package/helpers/zod.js.map +1 -1
  121. package/helpers/zod.mjs +12 -4
  122. package/helpers/zod.mjs.map +1 -1
  123. package/index.d.mts +1 -1
  124. package/index.d.mts.map +1 -1
  125. package/index.d.ts +1 -1
  126. package/index.d.ts.map +1 -1
  127. package/index.js.map +1 -1
  128. package/index.mjs.map +1 -1
  129. package/internal/assistant-stream-delta.d.mts.map +1 -1
  130. package/internal/assistant-stream-delta.d.ts.map +1 -1
  131. package/internal/assistant-stream-delta.js +28 -8
  132. package/internal/assistant-stream-delta.js.map +1 -1
  133. package/internal/assistant-stream-delta.mjs +28 -8
  134. package/internal/assistant-stream-delta.mjs.map +1 -1
  135. package/internal/auth/x509-token-exchange.d.mts +16 -0
  136. package/internal/auth/x509-token-exchange.d.mts.map +1 -0
  137. package/internal/auth/x509-token-exchange.d.ts +16 -0
  138. package/internal/auth/x509-token-exchange.d.ts.map +1 -0
  139. package/internal/auth/x509-token-exchange.js +246 -0
  140. package/internal/auth/x509-token-exchange.js.map +1 -0
  141. package/internal/auth/x509-token-exchange.mjs +243 -0
  142. package/internal/auth/x509-token-exchange.mjs.map +1 -0
  143. package/internal/auth/x509-transport-capability.d.mts +37 -0
  144. package/internal/auth/x509-transport-capability.d.mts.map +1 -0
  145. package/internal/auth/x509-transport-capability.d.ts +37 -0
  146. package/internal/auth/x509-transport-capability.d.ts.map +1 -0
  147. package/internal/auth/x509-transport-capability.js +169 -0
  148. package/internal/auth/x509-transport-capability.js.map +1 -0
  149. package/internal/auth/x509-transport-capability.mjs +164 -0
  150. package/internal/auth/x509-transport-capability.mjs.map +1 -0
  151. package/internal/auth/x509-transport-registry.d.mts +63 -0
  152. package/internal/auth/x509-transport-registry.d.mts.map +1 -0
  153. package/internal/auth/x509-transport-registry.d.ts +63 -0
  154. package/internal/auth/x509-transport-registry.d.ts.map +1 -0
  155. package/internal/auth/x509-transport-registry.js +53 -0
  156. package/internal/auth/x509-transport-registry.js.map +1 -0
  157. package/internal/auth/x509-transport-registry.mjs +48 -0
  158. package/internal/auth/x509-transport-registry.mjs.map +1 -0
  159. package/internal/auth/x509-transport-state-browser.d.mts +21 -0
  160. package/internal/auth/x509-transport-state-browser.d.mts.map +1 -0
  161. package/internal/auth/x509-transport-state-browser.d.ts +21 -0
  162. package/internal/auth/x509-transport-state-browser.d.ts.map +1 -0
  163. package/internal/auth/x509-transport-state-browser.js +30 -0
  164. package/internal/auth/x509-transport-state-browser.js.map +1 -0
  165. package/internal/auth/x509-transport-state-browser.mjs +27 -0
  166. package/internal/auth/x509-transport-state-browser.mjs.map +1 -0
  167. package/internal/auth/x509-transport-state.cjs +30 -0
  168. package/internal/auth/x509-transport-state.cjs.map +1 -0
  169. package/internal/auth/x509-transport-state.d.cts +21 -0
  170. package/internal/auth/x509-transport-state.d.cts.map +1 -0
  171. package/internal/auth/x509-workload-identity-auth.d.mts +128 -0
  172. package/internal/auth/x509-workload-identity-auth.d.mts.map +1 -0
  173. package/internal/auth/x509-workload-identity-auth.d.ts +128 -0
  174. package/internal/auth/x509-workload-identity-auth.d.ts.map +1 -0
  175. package/internal/auth/x509-workload-identity-auth.js +767 -0
  176. package/internal/auth/x509-workload-identity-auth.js.map +1 -0
  177. package/internal/auth/x509-workload-identity-auth.mjs +757 -0
  178. package/internal/auth/x509-workload-identity-auth.mjs.map +1 -0
  179. package/internal/bedrock.d.mts +2 -0
  180. package/internal/bedrock.d.mts.map +1 -1
  181. package/internal/bedrock.d.ts +2 -0
  182. package/internal/bedrock.d.ts.map +1 -1
  183. package/internal/bedrock.js +169 -5
  184. package/internal/bedrock.js.map +1 -1
  185. package/internal/bedrock.mjs +168 -5
  186. package/internal/bedrock.mjs.map +1 -1
  187. package/internal/data-residency.d.mts +12 -0
  188. package/internal/data-residency.d.mts.map +1 -0
  189. package/internal/data-residency.d.ts +12 -0
  190. package/internal/data-residency.d.ts.map +1 -0
  191. package/internal/data-residency.js +34 -0
  192. package/internal/data-residency.js.map +1 -0
  193. package/internal/data-residency.mjs +30 -0
  194. package/internal/data-residency.mjs.map +1 -0
  195. package/internal/multipart-encoding.d.mts +8 -0
  196. package/internal/multipart-encoding.d.mts.map +1 -0
  197. package/internal/multipart-encoding.d.ts +8 -0
  198. package/internal/multipart-encoding.d.ts.map +1 -0
  199. package/internal/multipart-encoding.js +51 -0
  200. package/internal/multipart-encoding.js.map +1 -0
  201. package/internal/multipart-encoding.mjs +48 -0
  202. package/internal/multipart-encoding.mjs.map +1 -0
  203. package/internal/qs/utils.d.mts.map +1 -1
  204. package/internal/qs/utils.d.ts.map +1 -1
  205. package/internal/qs/utils.js +307 -10
  206. package/internal/qs/utils.js.map +1 -1
  207. package/internal/qs/utils.mjs +307 -10
  208. package/internal/qs/utils.mjs.map +1 -1
  209. package/internal/request-options.d.mts +7 -0
  210. package/internal/request-options.d.mts.map +1 -1
  211. package/internal/request-options.d.ts +7 -0
  212. package/internal/request-options.d.ts.map +1 -1
  213. package/internal/request-options.js +43 -1
  214. package/internal/request-options.js.map +1 -1
  215. package/internal/request-options.mjs +42 -1
  216. package/internal/request-options.mjs.map +1 -1
  217. package/internal/responses/canonical-output-text.js +3 -3
  218. package/internal/responses/canonical-output-text.js.map +1 -1
  219. package/internal/responses/canonical-output-text.mjs +3 -3
  220. package/internal/responses/canonical-output-text.mjs.map +1 -1
  221. package/internal/responses/response-accumulator.d.mts +1 -1
  222. package/internal/responses/response-accumulator.d.mts.map +1 -1
  223. package/internal/responses/response-accumulator.d.ts +1 -1
  224. package/internal/responses/response-accumulator.d.ts.map +1 -1
  225. package/internal/responses/response-accumulator.js +331 -25
  226. package/internal/responses/response-accumulator.js.map +1 -1
  227. package/internal/responses/response-accumulator.mjs +331 -25
  228. package/internal/responses/response-accumulator.mjs.map +1 -1
  229. package/internal/tslib.js +6 -0
  230. package/internal/tslib.mjs +6 -1
  231. package/internal/uploads.d.mts +10 -6
  232. package/internal/uploads.d.mts.map +1 -1
  233. package/internal/uploads.d.ts +10 -6
  234. package/internal/uploads.d.ts.map +1 -1
  235. package/internal/uploads.js +65 -24
  236. package/internal/uploads.js.map +1 -1
  237. package/internal/uploads.mjs +65 -24
  238. package/internal/uploads.mjs.map +1 -1
  239. package/internal/utils/env.d.mts.map +1 -1
  240. package/internal/utils/env.d.ts.map +1 -1
  241. package/internal/utils/env.js +9 -4
  242. package/internal/utils/env.js.map +1 -1
  243. package/internal/utils/env.mjs +9 -4
  244. package/internal/utils/env.mjs.map +1 -1
  245. package/internal/ws.d.mts.map +1 -1
  246. package/internal/ws.d.ts.map +1 -1
  247. package/internal/ws.js +23 -1
  248. package/internal/ws.js.map +1 -1
  249. package/internal/ws.mjs +23 -1
  250. package/internal/ws.mjs.map +1 -1
  251. package/lib/AbstractChatCompletionRunner.d.mts.map +1 -1
  252. package/lib/AbstractChatCompletionRunner.d.ts.map +1 -1
  253. package/lib/AbstractChatCompletionRunner.js +32 -7
  254. package/lib/AbstractChatCompletionRunner.js.map +1 -1
  255. package/lib/AbstractChatCompletionRunner.mjs +34 -9
  256. package/lib/AbstractChatCompletionRunner.mjs.map +1 -1
  257. package/lib/AssistantStream.d.mts.map +1 -1
  258. package/lib/AssistantStream.d.ts.map +1 -1
  259. package/lib/AssistantStream.js +211 -23
  260. package/lib/AssistantStream.js.map +1 -1
  261. package/lib/AssistantStream.mjs +211 -23
  262. package/lib/AssistantStream.mjs.map +1 -1
  263. package/lib/ChatCompletionStream.d.mts +1 -1
  264. package/lib/ChatCompletionStream.d.mts.map +1 -1
  265. package/lib/ChatCompletionStream.d.ts +1 -1
  266. package/lib/ChatCompletionStream.d.ts.map +1 -1
  267. package/lib/ChatCompletionStream.js +1118 -67
  268. package/lib/ChatCompletionStream.js.map +1 -1
  269. package/lib/ChatCompletionStream.mjs +1119 -68
  270. package/lib/ChatCompletionStream.mjs.map +1 -1
  271. package/lib/EventEmitter.d.mts.map +1 -1
  272. package/lib/EventEmitter.d.ts.map +1 -1
  273. package/lib/EventEmitter.js +67 -9
  274. package/lib/EventEmitter.js.map +1 -1
  275. package/lib/EventEmitter.mjs +68 -10
  276. package/lib/EventEmitter.mjs.map +1 -1
  277. package/lib/EventStream.d.mts +4 -0
  278. package/lib/EventStream.d.mts.map +1 -1
  279. package/lib/EventStream.d.ts +4 -0
  280. package/lib/EventStream.d.ts.map +1 -1
  281. package/lib/EventStream.js +1096 -11
  282. package/lib/EventStream.js.map +1 -1
  283. package/lib/EventStream.mjs +1097 -12
  284. package/lib/EventStream.mjs.map +1 -1
  285. package/lib/ResponsesParser.d.mts.map +1 -1
  286. package/lib/ResponsesParser.d.ts.map +1 -1
  287. package/lib/ResponsesParser.js +1 -1
  288. package/lib/ResponsesParser.js.map +1 -1
  289. package/lib/ResponsesParser.mjs +1 -1
  290. package/lib/ResponsesParser.mjs.map +1 -1
  291. package/lib/Util.d.mts +2 -0
  292. package/lib/Util.d.mts.map +1 -1
  293. package/lib/Util.d.ts +2 -0
  294. package/lib/Util.d.ts.map +1 -1
  295. package/lib/Util.js +7 -4
  296. package/lib/Util.js.map +1 -1
  297. package/lib/Util.mjs +7 -4
  298. package/lib/Util.mjs.map +1 -1
  299. package/lib/assistant-run-polling.d.mts +12 -0
  300. package/lib/assistant-run-polling.d.mts.map +1 -0
  301. package/lib/assistant-run-polling.d.ts +12 -0
  302. package/lib/assistant-run-polling.d.ts.map +1 -0
  303. package/lib/assistant-run-polling.js +17 -0
  304. package/lib/assistant-run-polling.js.map +1 -0
  305. package/lib/assistant-run-polling.mjs +14 -0
  306. package/lib/assistant-run-polling.mjs.map +1 -0
  307. package/lib/embeddings.d.mts +18 -0
  308. package/lib/embeddings.d.mts.map +1 -0
  309. package/lib/embeddings.d.ts +18 -0
  310. package/lib/embeddings.d.ts.map +1 -0
  311. package/lib/embeddings.js +50 -0
  312. package/lib/embeddings.js.map +1 -0
  313. package/lib/embeddings.mjs +47 -0
  314. package/lib/embeddings.mjs.map +1 -0
  315. package/lib/file-processing.d.mts +10 -0
  316. package/lib/file-processing.d.mts.map +1 -0
  317. package/lib/file-processing.d.ts +10 -0
  318. package/lib/file-processing.d.ts.map +1 -0
  319. package/lib/file-processing.js +30 -0
  320. package/lib/file-processing.js.map +1 -0
  321. package/lib/file-processing.mjs +27 -0
  322. package/lib/file-processing.mjs.map +1 -0
  323. package/lib/parser.d.mts.map +1 -1
  324. package/lib/parser.d.ts.map +1 -1
  325. package/lib/parser.js +16 -4
  326. package/lib/parser.js.map +1 -1
  327. package/lib/parser.mjs +16 -4
  328. package/lib/parser.mjs.map +1 -1
  329. package/lib/polling.d.mts +20 -0
  330. package/lib/polling.d.mts.map +1 -0
  331. package/lib/polling.d.ts +20 -0
  332. package/lib/polling.d.ts.map +1 -0
  333. package/lib/polling.js +130 -0
  334. package/lib/polling.js.map +1 -0
  335. package/lib/polling.mjs +127 -0
  336. package/lib/polling.mjs.map +1 -0
  337. package/lib/responses/ResponseStream.d.mts.map +1 -1
  338. package/lib/responses/ResponseStream.d.ts.map +1 -1
  339. package/lib/responses/ResponseStream.js +21 -11
  340. package/lib/responses/ResponseStream.js.map +1 -1
  341. package/lib/responses/ResponseStream.mjs +21 -11
  342. package/lib/responses/ResponseStream.mjs.map +1 -1
  343. package/lib/vector-store-polling.d.mts +22 -0
  344. package/lib/vector-store-polling.d.mts.map +1 -0
  345. package/lib/vector-store-polling.d.ts +22 -0
  346. package/lib/vector-store-polling.d.ts.map +1 -0
  347. package/lib/vector-store-polling.js +24 -0
  348. package/lib/vector-store-polling.js.map +1 -0
  349. package/lib/vector-store-polling.mjs +20 -0
  350. package/lib/vector-store-polling.mjs.map +1 -0
  351. package/lib/vector-store-upload.d.mts +17 -0
  352. package/lib/vector-store-upload.d.mts.map +1 -0
  353. package/lib/vector-store-upload.d.ts +17 -0
  354. package/lib/vector-store-upload.d.ts.map +1 -0
  355. package/lib/vector-store-upload.js +37 -0
  356. package/lib/vector-store-upload.js.map +1 -0
  357. package/lib/vector-store-upload.mjs +34 -0
  358. package/lib/vector-store-upload.mjs.map +1 -0
  359. package/lib/webhook-signature.d.mts +15 -0
  360. package/lib/webhook-signature.d.mts.map +1 -0
  361. package/lib/webhook-signature.d.ts +15 -0
  362. package/lib/webhook-signature.d.ts.map +1 -0
  363. package/lib/webhook-signature.js +125 -0
  364. package/lib/webhook-signature.js.map +1 -0
  365. package/lib/webhook-signature.mjs +121 -0
  366. package/lib/webhook-signature.mjs.map +1 -0
  367. package/package.json +14 -1
  368. package/realtime/internal-base.d.mts +2 -0
  369. package/realtime/internal-base.d.mts.map +1 -1
  370. package/realtime/internal-base.d.ts +2 -0
  371. package/realtime/internal-base.d.ts.map +1 -1
  372. package/realtime/internal-base.js +15 -0
  373. package/realtime/internal-base.js.map +1 -1
  374. package/realtime/internal-base.mjs +14 -0
  375. package/realtime/internal-base.mjs.map +1 -1
  376. package/realtime/websocket.d.mts +3 -2
  377. package/realtime/websocket.d.mts.map +1 -1
  378. package/realtime/websocket.d.ts +3 -2
  379. package/realtime/websocket.d.ts.map +1 -1
  380. package/realtime/websocket.js +90 -26
  381. package/realtime/websocket.js.map +1 -1
  382. package/realtime/websocket.mjs +91 -27
  383. package/realtime/websocket.mjs.map +1 -1
  384. package/realtime/ws.d.mts.map +1 -1
  385. package/realtime/ws.d.ts.map +1 -1
  386. package/realtime/ws.js +9 -1
  387. package/realtime/ws.js.map +1 -1
  388. package/realtime/ws.mjs +10 -2
  389. package/realtime/ws.mjs.map +1 -1
  390. package/resources/admin/organization/index.d.mts +2 -2
  391. package/resources/admin/organization/index.d.mts.map +1 -1
  392. package/resources/admin/organization/index.d.ts +2 -2
  393. package/resources/admin/organization/index.d.ts.map +1 -1
  394. package/resources/admin/organization/index.js.map +1 -1
  395. package/resources/admin/organization/index.mjs.map +1 -1
  396. package/resources/admin/organization/organization.d.mts +4 -4
  397. package/resources/admin/organization/organization.d.mts.map +1 -1
  398. package/resources/admin/organization/organization.d.ts +4 -4
  399. package/resources/admin/organization/organization.d.ts.map +1 -1
  400. package/resources/admin/organization/organization.js.map +1 -1
  401. package/resources/admin/organization/organization.mjs.map +1 -1
  402. package/resources/admin/organization/projects/index.d.mts +1 -1
  403. package/resources/admin/organization/projects/index.d.mts.map +1 -1
  404. package/resources/admin/organization/projects/index.d.ts +1 -1
  405. package/resources/admin/organization/projects/index.d.ts.map +1 -1
  406. package/resources/admin/organization/projects/index.js.map +1 -1
  407. package/resources/admin/organization/projects/index.mjs.map +1 -1
  408. package/resources/admin/organization/projects/projects.d.mts +22 -5
  409. package/resources/admin/organization/projects/projects.d.mts.map +1 -1
  410. package/resources/admin/organization/projects/projects.d.ts +22 -5
  411. package/resources/admin/organization/projects/projects.d.ts.map +1 -1
  412. package/resources/admin/organization/projects/projects.js.map +1 -1
  413. package/resources/admin/organization/projects/projects.mjs.map +1 -1
  414. package/resources/admin/organization/usage.d.mts +62 -1
  415. package/resources/admin/organization/usage.d.mts.map +1 -1
  416. package/resources/admin/organization/usage.d.ts +62 -1
  417. package/resources/admin/organization/usage.d.ts.map +1 -1
  418. package/resources/admin/organization/usage.js.map +1 -1
  419. package/resources/admin/organization/usage.mjs.map +1 -1
  420. package/resources/beta/responses/internal-base.d.mts.map +1 -1
  421. package/resources/beta/responses/internal-base.d.ts.map +1 -1
  422. package/resources/beta/responses/internal-base.js +2 -0
  423. package/resources/beta/responses/internal-base.js.map +1 -1
  424. package/resources/beta/responses/internal-base.mjs +2 -0
  425. package/resources/beta/responses/internal-base.mjs.map +1 -1
  426. package/resources/beta/responses/responses.d.mts +17 -20
  427. package/resources/beta/responses/responses.d.mts.map +1 -1
  428. package/resources/beta/responses/responses.d.ts +17 -20
  429. package/resources/beta/responses/responses.d.ts.map +1 -1
  430. package/resources/beta/responses/responses.js.map +1 -1
  431. package/resources/beta/responses/responses.mjs.map +1 -1
  432. package/resources/beta/threads/runs/index.d.mts +1 -1
  433. package/resources/beta/threads/runs/index.d.mts.map +1 -1
  434. package/resources/beta/threads/runs/index.d.ts +1 -1
  435. package/resources/beta/threads/runs/index.d.ts.map +1 -1
  436. package/resources/beta/threads/runs/runs.d.mts.map +1 -1
  437. package/resources/beta/threads/runs/runs.d.ts.map +1 -1
  438. package/resources/beta/threads/runs/runs.js +2 -43
  439. package/resources/beta/threads/runs/runs.js.map +1 -1
  440. package/resources/beta/threads/runs/runs.mjs +2 -43
  441. package/resources/beta/threads/runs/runs.mjs.map +1 -1
  442. package/resources/chat/completions/completions.d.mts +6 -0
  443. package/resources/chat/completions/completions.d.mts.map +1 -1
  444. package/resources/chat/completions/completions.d.ts +6 -0
  445. package/resources/chat/completions/completions.d.ts.map +1 -1
  446. package/resources/chat/completions/completions.js.map +1 -1
  447. package/resources/chat/completions/completions.mjs.map +1 -1
  448. package/resources/embeddings.d.mts.map +1 -1
  449. package/resources/embeddings.d.ts.map +1 -1
  450. package/resources/embeddings.js +2 -36
  451. package/resources/embeddings.js.map +1 -1
  452. package/resources/embeddings.mjs +2 -36
  453. package/resources/embeddings.mjs.map +1 -1
  454. package/resources/files.d.mts.map +1 -1
  455. package/resources/files.d.ts.map +1 -1
  456. package/resources/files.js +2 -15
  457. package/resources/files.js.map +1 -1
  458. package/resources/files.mjs +2 -15
  459. package/resources/files.mjs.map +1 -1
  460. package/resources/images.d.mts +12 -22
  461. package/resources/images.d.mts.map +1 -1
  462. package/resources/images.d.ts +12 -22
  463. package/resources/images.d.ts.map +1 -1
  464. package/resources/realtime/calls.d.mts +23 -1
  465. package/resources/realtime/calls.d.mts.map +1 -1
  466. package/resources/realtime/calls.d.ts +23 -1
  467. package/resources/realtime/calls.d.ts.map +1 -1
  468. package/resources/realtime/calls.js +24 -0
  469. package/resources/realtime/calls.js.map +1 -1
  470. package/resources/realtime/calls.mjs +24 -0
  471. package/resources/realtime/calls.mjs.map +1 -1
  472. package/resources/realtime/index.d.mts +1 -1
  473. package/resources/realtime/index.d.mts.map +1 -1
  474. package/resources/realtime/index.d.ts +1 -1
  475. package/resources/realtime/index.d.ts.map +1 -1
  476. package/resources/realtime/index.js.map +1 -1
  477. package/resources/realtime/index.mjs +1 -1
  478. package/resources/realtime/index.mjs.map +1 -1
  479. package/resources/realtime/realtime.d.mts +5 -4
  480. package/resources/realtime/realtime.d.mts.map +1 -1
  481. package/resources/realtime/realtime.d.ts +5 -4
  482. package/resources/realtime/realtime.d.ts.map +1 -1
  483. package/resources/realtime/realtime.js.map +1 -1
  484. package/resources/realtime/realtime.mjs.map +1 -1
  485. package/resources/responses/internal-base.d.mts.map +1 -1
  486. package/resources/responses/internal-base.d.ts.map +1 -1
  487. package/resources/responses/internal-base.js +2 -0
  488. package/resources/responses/internal-base.js.map +1 -1
  489. package/resources/responses/internal-base.mjs +2 -0
  490. package/resources/responses/internal-base.mjs.map +1 -1
  491. package/resources/responses/responses.d.mts +17 -20
  492. package/resources/responses/responses.d.mts.map +1 -1
  493. package/resources/responses/responses.d.ts +17 -20
  494. package/resources/responses/responses.d.ts.map +1 -1
  495. package/resources/responses/responses.js.map +1 -1
  496. package/resources/responses/responses.mjs.map +1 -1
  497. package/resources/vector-stores/file-batches.d.mts.map +1 -1
  498. package/resources/vector-stores/file-batches.d.ts.map +1 -1
  499. package/resources/vector-stores/file-batches.js +4 -61
  500. package/resources/vector-stores/file-batches.js.map +1 -1
  501. package/resources/vector-stores/file-batches.mjs +4 -61
  502. package/resources/vector-stores/file-batches.mjs.map +1 -1
  503. package/resources/vector-stores/files.d.mts +1 -1
  504. package/resources/vector-stores/files.d.mts.map +1 -1
  505. package/resources/vector-stores/files.d.ts +1 -1
  506. package/resources/vector-stores/files.d.ts.map +1 -1
  507. package/resources/vector-stores/files.js +2 -35
  508. package/resources/vector-stores/files.js.map +1 -1
  509. package/resources/vector-stores/files.mjs +2 -35
  510. package/resources/vector-stores/files.mjs.map +1 -1
  511. package/resources/webhooks/webhooks.d.mts.map +1 -1
  512. package/resources/webhooks/webhooks.d.ts.map +1 -1
  513. package/resources/webhooks/webhooks.js +5 -43
  514. package/resources/webhooks/webhooks.js.map +1 -1
  515. package/resources/webhooks/webhooks.mjs +5 -43
  516. package/resources/webhooks/webhooks.mjs.map +1 -1
  517. package/src/auth/index.ts +6 -1
  518. package/src/auth/subject-token-providers.ts +196 -4
  519. package/src/auth/types.ts +24 -0
  520. package/src/auth/workload-identity-auth.ts +104 -7
  521. package/src/auth/x509-transport.ts +49 -0
  522. package/src/azure.ts +22 -1
  523. package/src/bedrock.ts +49 -5
  524. package/src/beta/realtime/internal-base.ts +15 -0
  525. package/src/beta/realtime/websocket.ts +148 -40
  526. package/src/beta/realtime/ws.ts +31 -13
  527. package/src/client.ts +536 -92
  528. package/src/core/EventEmitter.ts +91 -7
  529. package/src/core/streaming.ts +226 -30
  530. package/src/helpers/audio.ts +93 -22
  531. package/src/helpers/standard-schema.ts +50 -16
  532. package/src/helpers/zod-v3-strict-schema.ts +514 -0
  533. package/src/helpers/zod.ts +17 -4
  534. package/src/index.ts +1 -1
  535. package/src/internal/assistant-stream-delta.ts +33 -10
  536. package/src/internal/auth/x509-token-exchange.ts +310 -0
  537. package/src/internal/auth/x509-transport-capability.ts +219 -0
  538. package/src/internal/auth/x509-transport-registry.ts +118 -0
  539. package/src/internal/auth/x509-transport-state-browser.ts +36 -0
  540. package/src/internal/auth/x509-transport-state.cts +36 -0
  541. package/src/internal/auth/x509-workload-identity-auth.ts +958 -0
  542. package/src/internal/bedrock.ts +182 -5
  543. package/src/internal/data-residency.ts +44 -0
  544. package/src/internal/multipart-encoding.ts +53 -0
  545. package/src/internal/qs/utils.ts +375 -13
  546. package/src/internal/request-options.ts +52 -1
  547. package/src/internal/responses/canonical-output-text.ts +3 -3
  548. package/src/internal/responses/response-accumulator.ts +411 -24
  549. package/src/internal/uploads.ts +81 -26
  550. package/src/internal/utils/env.ts +9 -5
  551. package/src/internal/ws.ts +24 -3
  552. package/src/lib/AbstractChatCompletionRunner.ts +33 -6
  553. package/src/lib/AssistantStream.ts +262 -22
  554. package/src/lib/ChatCompletionStream.ts +1467 -103
  555. package/src/lib/EventEmitter.ts +91 -7
  556. package/src/lib/EventStream.ts +1483 -10
  557. package/src/lib/ResponsesParser.ts +4 -1
  558. package/src/lib/Util.ts +7 -5
  559. package/src/lib/assistant-run-polling.ts +27 -0
  560. package/src/lib/embeddings.ts +65 -0
  561. package/src/lib/file-processing.ts +36 -0
  562. package/src/lib/parser.ts +19 -4
  563. package/src/lib/polling.ts +144 -0
  564. package/src/lib/responses/ResponseStream.ts +22 -10
  565. package/src/lib/vector-store-polling.ts +46 -0
  566. package/src/lib/vector-store-upload.ts +53 -0
  567. package/src/lib/webhook-signature.ts +164 -0
  568. package/src/realtime/internal-base.ts +15 -0
  569. package/src/realtime/websocket.ts +130 -27
  570. package/src/realtime/ws.ts +15 -2
  571. package/src/resources/admin/organization/index.ts +2 -0
  572. package/src/resources/admin/organization/organization.ts +4 -0
  573. package/src/resources/admin/organization/projects/index.ts +1 -0
  574. package/src/resources/admin/organization/projects/projects.ts +37 -4
  575. package/src/resources/admin/organization/usage.ts +83 -0
  576. package/src/resources/beta/responses/internal-base.ts +2 -0
  577. package/src/resources/beta/responses/responses.ts +19 -22
  578. package/src/resources/beta/threads/runs/index.ts +1 -1
  579. package/src/resources/beta/threads/runs/runs.ts +2 -45
  580. package/src/resources/chat/completions/completions.ts +7 -0
  581. package/src/resources/embeddings.ts +2 -42
  582. package/src/resources/files.ts +2 -19
  583. package/src/resources/images.ts +12 -22
  584. package/src/resources/realtime/api.md +1 -0
  585. package/src/resources/realtime/calls.ts +46 -0
  586. package/src/resources/realtime/index.ts +7 -1
  587. package/src/resources/realtime/realtime.ts +5 -3
  588. package/src/resources/responses/internal-base.ts +2 -0
  589. package/src/resources/responses/responses.ts +19 -22
  590. package/src/resources/vector-stores/file-batches.ts +8 -77
  591. package/src/resources/vector-stores/files.ts +3 -43
  592. package/src/resources/webhooks/webhooks.ts +5 -61
  593. package/src/version.ts +1 -1
  594. package/version.d.mts +1 -1
  595. package/version.d.ts +1 -1
  596. package/version.js +1 -1
  597. package/version.mjs +1 -1
@@ -0,0 +1,164 @@
1
+ import { InvalidWebhookSignatureError } from '../error';
2
+ import { fromBase64 } from '../internal/utils/base64';
3
+ import { encodeUTF8 } from '../internal/utils/bytes';
4
+
5
+ const MAX_DIRECT_WEBHOOK_VERIFICATIONS = 32;
6
+ const SHA256_SIGNATURE_LENGTH = 32;
7
+
8
+ /**
9
+ * Checks whether a webhook header requires constant-work HMAC signing without
10
+ * retaining an unbounded number of signature candidates.
11
+ *
12
+ * @internal
13
+ */
14
+ export function webhookSignatureRequiresSigning(signatureHeader: string): boolean {
15
+ return (
16
+ signatureHeader.split(' ', MAX_DIRECT_WEBHOOK_VERIFICATIONS + 1).length > MAX_DIRECT_WEBHOOK_VERIFICATIONS
17
+ );
18
+ }
19
+
20
+ function* signatureCandidates(signatureHeader: string): Generator<string> {
21
+ let start = 0;
22
+
23
+ while (start <= signatureHeader.length) {
24
+ const separator = signatureHeader.indexOf(' ', start);
25
+ const candidate = signatureHeader.slice(start, separator === -1 ? undefined : separator);
26
+ yield candidate.startsWith('v1,') ? candidate.slice(3) : candidate;
27
+
28
+ if (separator === -1) {
29
+ break;
30
+ }
31
+ start = separator + 1;
32
+ }
33
+ }
34
+
35
+ function decodeSignature(signature: string): Uint8Array | undefined {
36
+ try {
37
+ const signatureBytes = fromBase64(signature);
38
+ return signatureBytes.byteLength === SHA256_SIGNATURE_LENGTH ? signatureBytes : undefined;
39
+ } catch {
40
+ // Invalid base64 does not prevent trying the next value.
41
+ return undefined;
42
+ }
43
+ }
44
+
45
+ function firstValidLengthSignature(signatureHeader: string): Uint8Array | undefined {
46
+ for (const signature of signatureCandidates(signatureHeader)) {
47
+ const signatureBytes = decodeSignature(signature);
48
+ if (signatureBytes) {
49
+ return signatureBytes;
50
+ }
51
+ }
52
+
53
+ return undefined;
54
+ }
55
+
56
+ function selectMatchingSignature(
57
+ signatureHeader: string,
58
+ expectedSignature: Uint8Array,
59
+ firstSignature: Uint8Array,
60
+ ): Uint8Array {
61
+ let matchingSignature = firstSignature;
62
+
63
+ for (const signature of signatureCandidates(signatureHeader)) {
64
+ const signatureBytes = decodeSignature(signature);
65
+ if (!signatureBytes) {
66
+ continue;
67
+ }
68
+
69
+ let difference = 0;
70
+ for (const [index, byte] of signatureBytes.entries()) {
71
+ // oxlint-disable-next-line no-bitwise -- Compare every HMAC byte without short-circuiting on shared prefixes.
72
+ difference |= byte ^ (expectedSignature[index] ?? 0);
73
+ }
74
+ if (difference === 0) {
75
+ matchingSignature = signatureBytes;
76
+ }
77
+ }
78
+
79
+ return matchingSignature;
80
+ }
81
+
82
+ /**
83
+ * Checks the timestamp and HMAC signatures after the resource has validated its
84
+ * crypto capabilities, secret, and required headers.
85
+ *
86
+ * @internal
87
+ */
88
+ export async function verifyWebhookSignature(
89
+ payload: string,
90
+ signatureHeader: string,
91
+ timestamp: string,
92
+ webhookId: string,
93
+ secret: string,
94
+ tolerance: number,
95
+ ): Promise<void> {
96
+ // oxlint-disable-next-line unicorn/prefer-number-coercion -- Preserve numeric-prefix parsing while signing the original timestamp text.
97
+ const timestampSeconds = Number.parseInt(timestamp, 10);
98
+ if (Number.isNaN(timestampSeconds)) {
99
+ throw new InvalidWebhookSignatureError('Invalid webhook timestamp format');
100
+ }
101
+
102
+ const nowSeconds = Math.floor(Date.now() / 1000);
103
+ if (nowSeconds - timestampSeconds > tolerance) {
104
+ throw new InvalidWebhookSignatureError('Webhook timestamp is too old');
105
+ }
106
+ if (timestampSeconds > nowSeconds + tolerance) {
107
+ throw new InvalidWebhookSignatureError('Webhook timestamp is too new');
108
+ }
109
+
110
+ // Multiple signatures are space-separated; accept a matching value at any position.
111
+ const useBoundedVerification = webhookSignatureRequiresSigning(signatureHeader);
112
+ const firstSignature = useBoundedVerification ? firstValidLengthSignature(signatureHeader) : undefined;
113
+
114
+ if (useBoundedVerification && !firstSignature) {
115
+ throw new InvalidWebhookSignatureError(
116
+ 'The given webhook signature does not match the expected signature',
117
+ );
118
+ }
119
+
120
+ const decodedSecret = Uint8Array.from(
121
+ secret.startsWith('whsec_') ? fromBase64(secret.slice('whsec_'.length)) : encodeUTF8(secret),
122
+ );
123
+ const signedPayload = webhookId ? `${webhookId}.${timestamp}.${payload}` : `${timestamp}.${payload}`;
124
+ const signedPayloadBytes = Uint8Array.from(encodeUTF8(signedPayload));
125
+ const key = await crypto.subtle.importKey(
126
+ 'raw',
127
+ decodedSecret,
128
+ { name: 'HMAC', hash: 'SHA-256' },
129
+ false,
130
+ useBoundedVerification ? ['sign', 'verify'] : ['verify'],
131
+ );
132
+
133
+ if (useBoundedVerification && firstSignature) {
134
+ const expectedSignature = new Uint8Array(await crypto.subtle.sign('HMAC', key, signedPayloadBytes));
135
+ const signatureToVerify = selectMatchingSignature(signatureHeader, expectedSignature, firstSignature);
136
+
137
+ try {
138
+ if (await crypto.subtle.verify('HMAC', key, Uint8Array.from(signatureToVerify), signedPayloadBytes)) {
139
+ return;
140
+ }
141
+ } catch {
142
+ // Provider verification failures have the same typed mismatch as the direct path.
143
+ }
144
+
145
+ throw new InvalidWebhookSignatureError(
146
+ 'The given webhook signature does not match the expected signature',
147
+ );
148
+ }
149
+
150
+ for (const signature of signatureCandidates(signatureHeader)) {
151
+ try {
152
+ const signatureBytes = Uint8Array.from(fromBase64(signature));
153
+ // oxlint-disable-next-line no-await-in-loop -- Check signatures in order and stop at the first match.
154
+ const isValid = await crypto.subtle.verify('HMAC', key, signatureBytes, signedPayloadBytes);
155
+ if (isValid) {
156
+ return;
157
+ }
158
+ } catch {
159
+ // Invalid base64 or signature format does not prevent trying the next value.
160
+ }
161
+ }
162
+
163
+ throw new InvalidWebhookSignatureError('The given webhook signature does not match the expected signature');
164
+ }
@@ -8,6 +8,20 @@ import { EventEmitter } from '../lib/EventEmitter';
8
8
  import { OpenAIError } from '../error';
9
9
  import type OpenAI from '../index';
10
10
  import { AzureOpenAI } from '../index';
11
+ import { assertX509WebSocketSupported } from '../internal/auth/x509-workload-identity-auth';
12
+
13
+ /** Parses frame data without exposing malformed payloads through JSON syntax errors. */
14
+ export function parseRealtimeEvent(data: string): RealtimeServerEvent {
15
+ try {
16
+ return JSON.parse(data) as RealtimeServerEvent;
17
+ } catch (error) {
18
+ if (error instanceof SyntaxError) {
19
+ throw new SyntaxError('Could not parse Realtime WebSocket event data as JSON.');
20
+ }
21
+
22
+ throw error;
23
+ }
24
+ }
11
25
 
12
26
  function safeErrorValue(value: unknown): string {
13
27
  try {
@@ -239,6 +253,7 @@ export function buildRealtimeURL(
239
253
  client: Pick<OpenAI, 'apiKey' | 'baseURL'>,
240
254
  connection: string | RealtimeConnectionConfig,
241
255
  ): URL {
256
+ assertX509WebSocketSupported(client);
242
257
  const config: RealtimeConnectionConfig =
243
258
  typeof connection === 'string' ? { model: connection } : connection;
244
259
  const baseURL = client.baseURL;
@@ -2,12 +2,13 @@ import type { AzureOpenAI } from '../index';
2
2
  import { assertBedrockWebSocketOrigin } from '../internal/bedrock';
3
3
  import { OpenAI } from '../index';
4
4
  import { OpenAIError } from '../error';
5
- import type { RealtimeClientEvent, RealtimeServerEvent } from '../resources/realtime/realtime';
5
+ import type { RealtimeClientEvent } from '../resources/realtime/realtime';
6
6
  import {
7
7
  OpenAIRealtimeEmitter,
8
8
  buildRealtimeURL,
9
9
  getAzureRealtimeConnection,
10
10
  isAzure,
11
+ parseRealtimeEvent,
11
12
  } from './internal-base';
12
13
  import type { AzureRealtimeConnectionConfig, RealtimeConnectionConfig } from './internal-base';
13
14
  import { isRunningInBrowser } from '../internal/detect-platform';
@@ -25,10 +26,82 @@ type _WebSocket = typeof globalThis extends {
25
26
  InstanceType<ws>
26
27
  : any;
27
28
 
28
- /** Removes Azure credential query values from the publicly exposed connection URL. */
29
- function redactAzureCredentials(url: URL): void {
30
- const hasAuthorization = url.searchParams.has('Authorization');
31
- if (url.searchParams.has('api-key') || !hasAuthorization) {
29
+ type RuntimeScope = typeof globalThis & {
30
+ process?: { versions?: { node?: string } };
31
+ WorkerGlobalScope?: typeof Object;
32
+ WorkerNavigator?: typeof Object;
33
+ Deno?: { version?: { deno?: string } };
34
+ Bun?: { version?: string };
35
+ EdgeRuntime?: unknown;
36
+ WebSocketPair?: unknown;
37
+ };
38
+
39
+ /** Identifies browser pages and workers without blocking trusted server runtimes. */
40
+ function isRunningInBrowserOrBrowserWorker(): boolean {
41
+ if (isRunningInBrowser()) {
42
+ return true;
43
+ }
44
+
45
+ const scope = globalThis as RuntimeScope;
46
+ return (
47
+ typeof scope.WorkerGlobalScope === 'function' &&
48
+ scope instanceof scope.WorkerGlobalScope &&
49
+ typeof scope.WorkerNavigator === 'function' &&
50
+ scope.navigator instanceof scope.WorkerNavigator &&
51
+ typeof scope.navigator?.userAgent === 'string' &&
52
+ scope.navigator.userAgent !== 'Cloudflare-Workers' &&
53
+ scope.process?.versions?.node === undefined &&
54
+ scope.Deno === undefined &&
55
+ scope.Bun === undefined &&
56
+ scope.EdgeRuntime === undefined &&
57
+ scope.WebSocketPair === undefined
58
+ );
59
+ }
60
+
61
+ /** Reports whether the runtime supports request headers in native WebSocket options. */
62
+ function supportsWebSocketRequestHeaders(): boolean {
63
+ const scope = globalThis as RuntimeScope;
64
+ if (
65
+ isRunningInBrowserOrBrowserWorker() ||
66
+ scope.EdgeRuntime !== undefined ||
67
+ scope.WebSocketPair !== undefined ||
68
+ scope.navigator?.userAgent === 'Cloudflare-Workers'
69
+ ) {
70
+ return false;
71
+ }
72
+
73
+ if (scope.Deno !== undefined) {
74
+ const [major, minor] = (scope.Deno.version?.deno ?? '').split('.').map(Number);
75
+ return major !== undefined && minor !== undefined && (major > 2 || (major === 2 && minor >= 5));
76
+ }
77
+
78
+ if (typeof scope.Bun?.version === 'string') {
79
+ return true;
80
+ }
81
+
82
+ return (
83
+ Object.prototype.toString.call(scope.process) === '[object process]' &&
84
+ typeof scope.process?.versions?.node === 'string'
85
+ );
86
+ }
87
+
88
+ /** Removes Azure credentials while preserving the existing public URL redaction contract. */
89
+ function redactAzureCredentials(url: URL, isBearerToken: boolean): void {
90
+ let hasApiKey = !isBearerToken;
91
+ let hasAuthorization = isBearerToken;
92
+ const parameterNames = [...url.searchParams.keys()];
93
+
94
+ for (const name of parameterNames) {
95
+ if (name.toLowerCase() === 'api-key') {
96
+ hasApiKey = true;
97
+ url.searchParams.delete(name);
98
+ } else if (name.toLowerCase() === 'authorization') {
99
+ hasAuthorization = true;
100
+ url.searchParams.delete(name);
101
+ }
102
+ }
103
+
104
+ if (hasApiKey) {
32
105
  url.searchParams.set('api-key', '<REDACTED>');
33
106
  }
34
107
  if (hasAuthorization) {
@@ -36,6 +109,32 @@ function redactAzureCredentials(url: URL): void {
36
109
  }
37
110
  }
38
111
 
112
+ /** Opens an Azure native socket with header authentication and a credential-free URL. */
113
+ function createAzureWebSocket(
114
+ url: URL,
115
+ apiKey: string | null,
116
+ isBearerToken: boolean,
117
+ protocols: string[],
118
+ ): _WebSocket {
119
+ if (!supportsWebSocketRequestHeaders()) {
120
+ throw new OpenAIError(
121
+ 'Azure OpenAI Realtime credentials require a WebSocket transport that supports request headers; use openai/realtime/ws or a server-side authentication proxy.',
122
+ );
123
+ }
124
+ if (!apiKey) {
125
+ throw new Error('Azure OpenAI Realtime requires an API key');
126
+ }
127
+
128
+ redactAzureCredentials(url, isBearerToken);
129
+ const socketURL = new URL(url);
130
+ socketURL.searchParams.delete('api-key');
131
+ socketURL.searchParams.delete('Authorization');
132
+ const headers = isBearerToken ? { Authorization: `Bearer ${apiKey}` } : { 'api-key': apiKey };
133
+
134
+ // @ts-ignore
135
+ return new WebSocket(socketURL.toString(), { protocols, headers });
136
+ }
137
+
39
138
  /**
40
139
  * Connects to the Realtime API using the runtime's native `WebSocket` implementation.
41
140
  *
@@ -85,7 +184,7 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
85
184
  props.dangerouslyAllowBrowser ??
86
185
  (client as any)?._options?.dangerouslyAllowBrowser ??
87
186
  (client?.apiKey?.startsWith('ek_') ? true : null);
88
- if (!dangerouslyAllowBrowser && isRunningInBrowser()) {
187
+ if (!dangerouslyAllowBrowser && isRunningInBrowserOrBrowserWorker()) {
89
188
  throw new OpenAIError(
90
189
  "It looks like you're running in a browser-like environment.\n\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\n\nYou can avoid this error by creating an ephemeral session token:\nhttps://platform.openai.com/docs/api-reference/realtime-sessions\n",
91
190
  );
@@ -104,18 +203,34 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
104
203
 
105
204
  this.url = buildRealtimeURL(client, props);
106
205
  props.onURL?.(this.url);
206
+ if (this.url.protocol !== 'wss:') {
207
+ throw new OpenAIError('Realtime WebSocket URLs must use the wss: protocol.');
208
+ }
107
209
  assertBedrockWebSocketOrigin(client, this.url);
108
210
 
109
- // @ts-ignore
110
- this.socket = new WebSocket(this.url.toString(), [
111
- 'realtime',
112
- ...(isAzure(client) ? [] : [`openai-insecure-api-key.${client.apiKey}`]),
113
- ]);
211
+ const azure = isAzure(client);
212
+ const protocols = ['realtime', ...(azure ? [] : [`openai-insecure-api-key.${client.apiKey}`])];
213
+
214
+ this.socket = azure
215
+ ? createAzureWebSocket(this.url, client.apiKey, props.__resolvedApiKey === true, protocols)
216
+ : new WebSocket(this.url.toString(), protocols);
114
217
 
115
218
  this.socket.addEventListener('message', (websocketEvent: MessageEvent) => {
116
219
  const event = (() => {
117
220
  try {
118
- return JSON.parse(websocketEvent.data.toString()) as RealtimeServerEvent;
221
+ const parsedEvent = parseRealtimeEvent(websocketEvent.data.toString());
222
+
223
+ if (
224
+ typeof parsedEvent !== 'object' ||
225
+ parsedEvent === null ||
226
+ Array.isArray(parsedEvent) ||
227
+ !Object.getOwnPropertyDescriptor(parsedEvent, 'type') ||
228
+ typeof parsedEvent.type !== 'string'
229
+ ) {
230
+ throw new TypeError('Realtime WebSocket event must be an object with a string type.');
231
+ }
232
+
233
+ return parsedEvent;
119
234
  } catch (err) {
120
235
  this._onError(null, 'could not parse websocket event', err);
121
236
  return null;
@@ -137,10 +252,6 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
137
252
  this.socket.addEventListener('error', (event: any) => {
138
253
  this._onError(null, event.message, null);
139
254
  });
140
-
141
- if (isAzure(client)) {
142
- redactAzureCredentials(this.url);
143
- }
144
255
  }
145
256
 
146
257
  /**
@@ -174,8 +285,9 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
174
285
  /**
175
286
  * Opens a native Azure deployment or transcription session, or an existing sideband call.
176
287
  *
177
- * Azure credentials are included only in the initial connection URL and are
178
- * redacted from the exposed `url` property immediately after connection setup.
288
+ * Azure credentials are sent in WebSocket handshake headers and never appear
289
+ * in the native socket URL. Browser WebSockets cannot set these headers;
290
+ * use a server-side authentication proxy or the Node.js `ws` transport.
179
291
  *
180
292
  * @param client Azure OpenAI client that supplies the endpoint and credential.
181
293
  * @param options Deployment, transcription intent, or call ID, plus browser-safety settings.
@@ -194,19 +306,10 @@ export class OpenAIRealtimeWebSocket extends OpenAIRealtimeEmitter {
194
306
  if (!apiKey) {
195
307
  throw new Error('Azure OpenAI Realtime requires an API key');
196
308
  }
197
- const azureApiKey = apiKey;
198
- function onURL(url: URL) {
199
- if (isApiKeyProvider) {
200
- url.searchParams.set('Authorization', `Bearer ${azureApiKey}`);
201
- } else {
202
- url.searchParams.set('api-key', azureApiKey);
203
- }
204
- }
205
309
  const { dangerouslyAllowBrowser } = options;
206
310
  return new OpenAIRealtimeWebSocket(
207
311
  {
208
312
  ...connection,
209
- onURL,
210
313
  ...(dangerouslyAllowBrowser === undefined ? {} : { dangerouslyAllowBrowser }),
211
314
  __resolvedApiKey: isApiKeyProvider,
212
315
  },
@@ -3,12 +3,13 @@ import { assertBedrockWebSocketOrigin } from '../internal/bedrock';
3
3
  import { protectWebSocketOptionsFromCredentialRedirects } from '../internal/ws';
4
4
  import type { AzureOpenAI } from '../index';
5
5
  import { OpenAI } from '../index';
6
- import type { RealtimeClientEvent, RealtimeServerEvent } from '../resources/realtime/realtime';
6
+ import type { RealtimeClientEvent } from '../resources/realtime/realtime';
7
7
  import {
8
8
  OpenAIRealtimeEmitter,
9
9
  buildRealtimeURL,
10
10
  getAzureRealtimeConnection,
11
11
  isAzure,
12
+ parseRealtimeEvent,
12
13
  } from './internal-base';
13
14
  import type { AzureRealtimeConnectionConfig, RealtimeConnectionConfig } from './internal-base';
14
15
 
@@ -76,7 +77,19 @@ export class OpenAIRealtimeWS extends OpenAIRealtimeEmitter {
76
77
  this.socket.on('message', (wsEvent) => {
77
78
  const event = (() => {
78
79
  try {
79
- return JSON.parse(wsEvent.toString()) as RealtimeServerEvent;
80
+ const parsedEvent = parseRealtimeEvent(wsEvent.toString());
81
+
82
+ if (
83
+ typeof parsedEvent !== 'object' ||
84
+ parsedEvent === null ||
85
+ Array.isArray(parsedEvent) ||
86
+ !Object.getOwnPropertyDescriptor(parsedEvent, 'type') ||
87
+ typeof parsedEvent.type !== 'string'
88
+ ) {
89
+ throw new TypeError('Realtime WebSocket event must be an object with a string type.');
90
+ }
91
+
92
+ return parsedEvent;
80
93
  } catch (err) {
81
94
  this._onError(null, 'could not parse websocket event', err);
82
95
  return null;
@@ -59,6 +59,7 @@ export { Organization } from './organization';
59
59
  export {
60
60
  Projects,
61
61
  type Project,
62
+ type ProjectResidency,
62
63
  type ProjectCreateParams,
63
64
  type ProjectUpdateParams,
64
65
  type ProjectListParams,
@@ -90,6 +91,7 @@ export {
90
91
  } from './spend-limit';
91
92
  export {
92
93
  Usage,
94
+ type CostQuantityUnit,
93
95
  type UsageAudioSpeechesResponse,
94
96
  type UsageAudioTranscriptionsResponse,
95
97
  type UsageCodeInterpreterSessionsResponse,
@@ -71,6 +71,7 @@ import {
71
71
  } from './spend-limit';
72
72
  import * as UsageAPI from './usage';
73
73
  import {
74
+ CostQuantityUnit,
74
75
  Usage,
75
76
  UsageAudioSpeechesParams,
76
77
  UsageAudioSpeechesResponse,
@@ -111,6 +112,7 @@ import {
111
112
  Project,
112
113
  ProjectCreateParams,
113
114
  ProjectListParams,
115
+ ProjectResidency,
114
116
  ProjectUpdateParams,
115
117
  Projects,
116
118
  ProjectsPage,
@@ -173,6 +175,7 @@ export declare namespace Organization {
173
175
 
174
176
  export {
175
177
  Usage as Usage,
178
+ type CostQuantityUnit as CostQuantityUnit,
176
179
  type UsageAudioSpeechesResponse as UsageAudioSpeechesResponse,
177
180
  type UsageAudioTranscriptionsResponse as UsageAudioTranscriptionsResponse,
178
181
  type UsageCodeInterpreterSessionsResponse as UsageCodeInterpreterSessionsResponse,
@@ -280,6 +283,7 @@ export declare namespace Organization {
280
283
  export {
281
284
  Projects as Projects,
282
285
  type Project as Project,
286
+ type ProjectResidency as ProjectResidency,
283
287
  type ProjectsPage as ProjectsPage,
284
288
  type ProjectCreateParams as ProjectCreateParams,
285
289
  type ProjectUpdateParams as ProjectUpdateParams,
@@ -46,6 +46,7 @@ export {
46
46
  export {
47
47
  Projects,
48
48
  type Project,
49
+ type ProjectResidency,
49
50
  type ProjectCreateParams,
50
51
  type ProjectUpdateParams,
51
52
  type ProjectListParams,
@@ -273,12 +273,31 @@ export interface Project {
273
273
  */
274
274
  name?: string | null;
275
275
 
276
+ /**
277
+ * The residency configuration for the project.
278
+ */
279
+ residency?: ProjectResidency;
280
+
276
281
  /**
277
282
  * `active` or `archived`
278
283
  */
279
284
  status?: string | null;
280
285
  }
281
286
 
287
+ export type ProjectResidency =
288
+ | 'GLOBAL'
289
+ | 'US_STORAGE_PROCESSING'
290
+ | 'EU_STORAGE_PROCESSING'
291
+ | 'JP_STORAGE'
292
+ | 'KR_STORAGE'
293
+ | 'CA_STORAGE'
294
+ | 'SG_STORAGE'
295
+ | 'IN_STORAGE'
296
+ | 'AU_STORAGE'
297
+ | 'GB_STORAGE'
298
+ | 'AE_STORAGE'
299
+ | 'AE_STORAGE_PROCESSING';
300
+
282
301
  export interface ProjectCreateParams {
283
302
  /**
284
303
  * The friendly name of the project, this name appears in reports.
@@ -291,12 +310,23 @@ export interface ProjectCreateParams {
291
310
  external_key_id?: string | null;
292
311
 
293
312
  /**
294
- * Create the project with the specified data residency region. Your organization
295
- * must have access to Data residency functionality in order to use. See
313
+ * @deprecated Create the project with the specified data residency region. Your
314
+ * organization must have access to Data residency functionality in order to use.
315
+ * See
296
316
  * [data residency controls](https://platform.openai.com/docs/guides/your-data#data-residency-controls)
297
- * to review the functionality and limitations of setting this field.
317
+ * to review the functionality and limitations of setting this field. Deprecated:
318
+ * use `residency` instead. Do not provide both `geography` and `residency`.
298
319
  */
299
320
  geography?: string | null;
321
+
322
+ /**
323
+ * Create the project with the specified residency configuration. Your organization
324
+ * must have access to the requested residency configuration in order to use it.
325
+ * See
326
+ * [data residency controls](https://platform.openai.com/docs/guides/your-data#data-residency-controls)
327
+ * to review the functionality and limitations of setting this field.
328
+ */
329
+ residency?: ProjectResidency | null;
300
330
  }
301
331
 
302
332
  export interface ProjectUpdateParams {
@@ -306,7 +336,9 @@ export interface ProjectUpdateParams {
306
336
  external_key_id?: string | null;
307
337
 
308
338
  /**
309
- * Geography for the project.
339
+ * @deprecated Geography for the project. Deprecated: use `residency` when creating
340
+ * a project to configure data residency. This field is retained for backward
341
+ * compatibility.
310
342
  */
311
343
  geography?: string | null;
312
344
 
@@ -340,6 +372,7 @@ Projects.Certificates = Certificates;
340
372
  export declare namespace Projects {
341
373
  export {
342
374
  type Project as Project,
375
+ type ProjectResidency as ProjectResidency,
343
376
  type ProjectsPage as ProjectsPage,
344
377
  type ProjectCreateParams as ProjectCreateParams,
345
378
  type ProjectUpdateParams as ProjectUpdateParams,