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
@@ -7,6 +7,147 @@ import { SubjectTokenProviderError } from '../core/error';
7
7
  const DEFAULT_RESOURCE = 'https://management.azure.com/';
8
8
  const DEFAULT_AZURE_API_VERSION = '2018-02-01';
9
9
  const AZURE_IMDS_BASE_URL = 'http://169.254.169.254/metadata/identity/oauth2/token';
10
+ const MAX_AZURE_IMDS_JSON_ERROR_CAUSES = 32;
11
+ const getOwnErrorDescriptor = Object.getOwnPropertyDescriptor;
12
+ const getErrorPrototype = Object.getPrototypeOf;
13
+ const errorObjectToString = Object.prototype.toString;
14
+ const errorFunctionToString = Function.prototype.toString;
15
+ const nativeErrorSource = errorFunctionToString.call(Error);
16
+ const nativeSyntaxErrorSource = errorFunctionToString.call(SyntaxError);
17
+ const nativeErrorBrandDescriptor = getOwnErrorDescriptor(Error, 'isError');
18
+ const nativeErrorBrand =
19
+ nativeErrorBrandDescriptor &&
20
+ 'value' in nativeErrorBrandDescriptor &&
21
+ typeof nativeErrorBrandDescriptor.value === 'function'
22
+ ? (nativeErrorBrandDescriptor.value as (error: object) => boolean)
23
+ : undefined;
24
+
25
+ type AzureJSONErrorKind = 'error' | 'syntax' | 'tagged-wrapper' | 'unknown' | 'unsafe';
26
+
27
+ function hasNativeErrorPrototype(prototype: object, kind: 'Error' | 'SyntaxError'): boolean {
28
+ const name = getOwnErrorDescriptor(prototype, 'name');
29
+ const constructor = getOwnErrorDescriptor(prototype, 'constructor');
30
+ if (
31
+ !name ||
32
+ !('value' in name) ||
33
+ name.value !== kind ||
34
+ !constructor ||
35
+ !('value' in constructor) ||
36
+ typeof constructor.value !== 'function'
37
+ ) {
38
+ return false;
39
+ }
40
+
41
+ const originalPrototype = getOwnErrorDescriptor(constructor.value, 'prototype');
42
+ const nativeSource = kind === 'Error' ? nativeErrorSource : nativeSyntaxErrorSource;
43
+ return Boolean(
44
+ originalPrototype &&
45
+ 'value' in originalPrototype &&
46
+ originalPrototype.value === prototype &&
47
+ errorFunctionToString.call(constructor.value) === nativeSource,
48
+ );
49
+ }
50
+
51
+ function classifyCrossRealmAzureError(error: object): AzureJSONErrorKind {
52
+ try {
53
+ const prototypes: object[] = [];
54
+ let tagged = false;
55
+ for (
56
+ let prototype: object | null = error;
57
+ prototype !== null;
58
+ prototype = getErrorPrototype(prototype) as object | null
59
+ ) {
60
+ if (prototypes.length >= MAX_AZURE_IMDS_JSON_ERROR_CAUSES) {
61
+ return 'unsafe';
62
+ }
63
+ prototypes.push(prototype);
64
+ if (!nativeErrorBrand && getOwnErrorDescriptor(prototype, Symbol.toStringTag)) {
65
+ tagged = true;
66
+ }
67
+ }
68
+
69
+ if (
70
+ nativeErrorBrand
71
+ ? !nativeErrorBrand(error)
72
+ : !tagged && errorObjectToString.call(error) !== '[object Error]'
73
+ ) {
74
+ return 'unknown';
75
+ }
76
+
77
+ let genericErrorPrototype = false;
78
+ for (let index = 1; index < prototypes.length; index += 1) {
79
+ const prototype = prototypes[index];
80
+ if (!prototype) {
81
+ return 'unsafe';
82
+ }
83
+ if (hasNativeErrorPrototype(prototype, 'SyntaxError')) {
84
+ return tagged ? 'unsafe' : 'syntax';
85
+ }
86
+ if (tagged && hasNativeErrorPrototype(prototype, 'Error')) {
87
+ genericErrorPrototype = true;
88
+ }
89
+ }
90
+
91
+ if (!tagged) {
92
+ return 'error';
93
+ }
94
+ return genericErrorPrototype ? 'tagged-wrapper' : 'unknown';
95
+ } catch {
96
+ return 'unsafe';
97
+ }
98
+ }
99
+
100
+ function inspectAzureJSONErrorCause(error: unknown): boolean {
101
+ const visited = new Set<object>();
102
+ let current = error;
103
+
104
+ for (let depth = 0; depth < MAX_AZURE_IMDS_JSON_ERROR_CAUSES; depth += 1) {
105
+ if (current instanceof SyntaxError) {
106
+ return true;
107
+ }
108
+ if (typeof current !== 'object' || current === null) {
109
+ return false;
110
+ }
111
+ const kind = current instanceof Error ? 'error' : classifyCrossRealmAzureError(current);
112
+ if (kind === 'syntax' || kind === 'unsafe') {
113
+ return true;
114
+ }
115
+ if (kind !== 'error' && kind !== 'tagged-wrapper') {
116
+ return false;
117
+ }
118
+ if (kind === 'error') {
119
+ const parserType = getOwnErrorDescriptor(current, 'type');
120
+ if (parserType && 'value' in parserType && parserType.value === 'invalid-json') {
121
+ return true;
122
+ }
123
+ }
124
+ if (visited.has(current)) {
125
+ return true;
126
+ }
127
+ visited.add(current);
128
+
129
+ let cause: PropertyDescriptor | undefined;
130
+ try {
131
+ cause = getOwnErrorDescriptor(current, 'cause');
132
+ } catch {
133
+ return true;
134
+ }
135
+ if (!cause || !('value' in cause)) {
136
+ return false;
137
+ }
138
+ current = cause.value;
139
+ }
140
+
141
+ return true;
142
+ }
143
+
144
+ function isMalformedAzureJSONError(error: unknown): boolean {
145
+ try {
146
+ return inspectAzureJSONErrorCause(error);
147
+ } catch {
148
+ return true;
149
+ }
150
+ }
10
151
 
11
152
  /** Reads the UTF-8 contents of a Kubernetes service-account token file. */
12
153
  type ReadFile = (path: string) => Promise<string>;
@@ -147,13 +288,43 @@ export function azureManagedIdentityTokenProvider(
147
288
  });
148
289
 
149
290
  if (!response.ok) {
291
+ let abortListener: (() => void) | undefined;
292
+
293
+ try {
294
+ // oxlint-disable-next-line promise/avoid-new -- AbortSignal is callback-only across supported runtimes.
295
+ const requestAborted = new Promise<void>((resolve) => {
296
+ abortListener = () => resolve();
297
+ if (controller.signal.aborted) {
298
+ abortListener();
299
+ } else {
300
+ controller.signal.addEventListener('abort', abortListener, { once: true });
301
+ }
302
+ });
303
+
304
+ await Promise.race([Shims.CancelReadableStream(response.body), requestAborted]);
305
+ } catch {
306
+ controller.abort();
307
+ } finally {
308
+ if (abortListener) {
309
+ controller.signal.removeEventListener('abort', abortListener);
310
+ }
311
+ }
312
+
150
313
  throw new SubjectTokenProviderError(
151
314
  `Failed to fetch token from Azure IMDS: status ${response.status}`,
152
315
  'azure-imds',
153
316
  );
154
317
  }
155
318
 
156
- const data = (await response.json()) as { access_token?: string };
319
+ let data: { access_token?: string };
320
+ try {
321
+ data = (await response.json()) as { access_token?: string };
322
+ } catch (error) {
323
+ if (isMalformedAzureJSONError(error)) {
324
+ throw new SyntaxError('IMDS response contains invalid JSON');
325
+ }
326
+ throw error;
327
+ }
157
328
 
158
329
  if (!data.access_token) {
159
330
  throw new SubjectTokenProviderError("IMDS response missing 'access_token' field", 'azure-imds');
@@ -199,7 +370,7 @@ export function gcpIDTokenProvider(
199
370
  fetch?: Fetch;
200
371
  },
201
372
  ): SubjectTokenProvider {
202
- const timeout = config?.timeout || 10_000;
373
+ const timeout = config?.timeout ?? 10_000;
203
374
 
204
375
  return {
205
376
  tokenType: 'id',
@@ -221,8 +392,29 @@ export function gcpIDTokenProvider(
221
392
  });
222
393
 
223
394
  if (!response.ok) {
224
- const errorText = await response.text();
225
- throw new Error(`GCP Metadata Server returned ${response.status}: ${errorText}`);
395
+ let abortListener: (() => void) | undefined;
396
+
397
+ try {
398
+ // oxlint-disable-next-line promise/avoid-new -- AbortSignal is callback-only across supported runtimes.
399
+ const requestAborted = new Promise<void>((resolve) => {
400
+ abortListener = () => resolve();
401
+ if (controller.signal.aborted) {
402
+ abortListener();
403
+ } else {
404
+ controller.signal.addEventListener('abort', abortListener, { once: true });
405
+ }
406
+ });
407
+
408
+ await Promise.race([Shims.CancelReadableStream(response.body), requestAborted]);
409
+ } catch {
410
+ controller.abort();
411
+ } finally {
412
+ if (abortListener) {
413
+ controller.signal.removeEventListener('abort', abortListener);
414
+ }
415
+ }
416
+
417
+ throw new Error(`GCP Metadata Server returned ${response.status}`);
226
418
  }
227
419
 
228
420
  const tokenText = await response.text();
package/src/auth/types.ts CHANGED
@@ -25,6 +25,30 @@ export interface WorkloadIdentity {
25
25
  refreshBufferSeconds?: number;
26
26
  }
27
27
 
28
+ /** Configures OpenAI-only federation from an explicitly attested X.509 client certificate. */
29
+ export interface X509WorkloadIdentity {
30
+ /** Selects certificate-authenticated OAuth federation without an external subject token. */
31
+ type: 'x509';
32
+
33
+ /** Identity-provider resource enrolled for the caller-owned client certificate. */
34
+ identityProviderId: string;
35
+
36
+ /** OpenAI service account authorized for the verified certificate identity. */
37
+ serviceAccountId: string;
38
+
39
+ /** Optional milliseconds before expiry when the certificate-backed token should refresh. */
40
+ refreshBufferMs?: number;
41
+
42
+ /** X.509 federation proves certificate possession instead of supplying a subject token. */
43
+ provider?: never;
44
+
45
+ /** X.509 federation does not send an OAuth client identifier. */
46
+ clientId?: never;
47
+
48
+ /** X.509 federation does not accept subject-token refresh configuration. */
49
+ refreshBufferSeconds?: never;
50
+ }
51
+
28
52
  /** OAuth token-exchange response returned by the OpenAI workload-identity endpoint. */
29
53
  export interface TokenExchangeResponse {
30
54
  /** OpenAI access token to use as the request's bearer credential. */
@@ -14,6 +14,102 @@ const SUBJECT_TOKEN_TYPES: Record<WorkloadIdentity['provider']['tokenType'], str
14
14
  };
15
15
 
16
16
  const TOKEN_EXCHANGE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:token-exchange';
17
+ const NATIVE_RESPONSE_PROTOTYPE = Response.prototype;
18
+ const READ_NATIVE_RESPONSE_BODY = NATIVE_RESPONSE_PROTOTYPE.arrayBuffer;
19
+
20
+ function isResponsePrototype(response: Response, prototype: object): boolean {
21
+ const constructor = Object.getOwnPropertyDescriptor(prototype, 'constructor')?.value;
22
+ if (
23
+ prototype === response ||
24
+ typeof constructor !== 'function' ||
25
+ Object.getOwnPropertyDescriptor(constructor, 'name')?.value !== 'Response' ||
26
+ Object.getOwnPropertyDescriptor(constructor, 'prototype')?.value !== prototype
27
+ ) {
28
+ return false;
29
+ }
30
+
31
+ const tag = Object.getOwnPropertyDescriptor(prototype, Symbol.toStringTag);
32
+ return (
33
+ (tag?.value === 'Response' || typeof tag?.get === 'function') &&
34
+ typeof Object.getOwnPropertyDescriptor(prototype, 'headers')?.get === 'function' &&
35
+ typeof Object.getOwnPropertyDescriptor(prototype, 'ok')?.get === 'function' &&
36
+ typeof Object.getOwnPropertyDescriptor(prototype, 'status')?.get === 'function'
37
+ );
38
+ }
39
+
40
+ function isResponseBodyPrototype(prototype: object, responsePrototype: object | null): boolean {
41
+ if (prototype === responsePrototype) {
42
+ return true;
43
+ }
44
+
45
+ const constructor = Object.getOwnPropertyDescriptor(prototype, 'constructor')?.value;
46
+ return (
47
+ responsePrototype !== null &&
48
+ Object.getPrototypeOf(responsePrototype) === prototype &&
49
+ typeof constructor === 'function' &&
50
+ Object.getOwnPropertyDescriptor(constructor, 'name')?.value === 'Body' &&
51
+ Object.getOwnPropertyDescriptor(constructor, 'prototype')?.value === prototype
52
+ );
53
+ }
54
+
55
+ function decodeNativeResponseBody(body: ArrayBuffer): string {
56
+ const scope = globalThis as typeof globalThis & { Bun?: { version?: unknown } };
57
+ return new TextDecoder('utf-8', { ignoreBOM: typeof scope.Bun?.version === 'string' }).decode(body);
58
+ }
59
+
60
+ async function parseOAuthTokenResponse(response: Response): Promise<unknown> {
61
+ let readText: ((this: Response) => Promise<string>) | undefined;
62
+ let responsePrototype: object | null = null;
63
+ for (
64
+ let depth = 0, prototype: object | null = response;
65
+ prototype !== null && depth < 16;
66
+ prototype = Object.getPrototypeOf(prototype), depth += 1
67
+ ) {
68
+ if (prototype === NATIVE_RESPONSE_PROTOTYPE) {
69
+ break;
70
+ }
71
+
72
+ if (isResponsePrototype(response, prototype)) {
73
+ responsePrototype = prototype;
74
+ }
75
+
76
+ const parser = Object.getOwnPropertyDescriptor(prototype, 'json');
77
+ if (!parser) {
78
+ continue;
79
+ }
80
+
81
+ if (typeof parser.value !== 'function') {
82
+ break;
83
+ }
84
+
85
+ const bodyReader = Object.getOwnPropertyDescriptor(prototype, 'text')?.value;
86
+ if (typeof bodyReader === 'function' && isResponseBodyPrototype(prototype, responsePrototype)) {
87
+ readText = bodyReader;
88
+ break;
89
+ }
90
+
91
+ // Custom parsers own their results and failures; rejection provenance cannot be inferred.
92
+ return parser.value.call(response);
93
+ }
94
+
95
+ const body =
96
+ readText === undefined
97
+ ? decodeNativeResponseBody(await READ_NATIVE_RESPONSE_BODY.call(response))
98
+ : await readText.call(response);
99
+ try {
100
+ return JSON.parse(body);
101
+ } catch {
102
+ throw new SyntaxError('Token exchange response contains invalid JSON');
103
+ }
104
+ }
105
+
106
+ function isUnsafeAccessToken(accessToken: string): boolean {
107
+ const scope = globalThis as typeof globalThis & { Bun?: { version?: unknown } };
108
+ if (typeof scope.Bun?.version === 'string') {
109
+ return /[^\t\u0020-\u007E]|^[\t ]|[\t ]$/u.test(accessToken);
110
+ }
111
+ return /[^\t\u0020-\u007E\u0080-\u00FF]|^[\t ]|[\t ]$/u.test(accessToken);
112
+ }
17
113
 
18
114
  /**
19
115
  * Exchanges external workload-identity tokens for cached OpenAI access tokens.
@@ -126,18 +222,19 @@ export class WorkloadIdentityAuth {
126
222
  );
127
223
  }
128
224
 
129
- const tokenResponse: unknown = await response.json();
225
+ const tokenResponse: unknown = await parseOAuthTokenResponse(response);
226
+ const accessToken =
227
+ typeof tokenResponse === 'object' && tokenResponse !== null && 'access_token' in tokenResponse
228
+ ? tokenResponse.access_token
229
+ : undefined;
130
230
  if (
131
- typeof tokenResponse !== 'object' ||
132
- tokenResponse === null ||
133
- !('access_token' in tokenResponse) ||
134
- typeof tokenResponse.access_token !== 'string' ||
135
- tokenResponse.access_token.trim().length === 0
231
+ typeof accessToken !== 'string' ||
232
+ accessToken.trim().length === 0 ||
233
+ isUnsafeAccessToken(accessToken)
136
234
  ) {
137
235
  throw new OpenAIError("Token exchange response missing 'access_token' field");
138
236
  }
139
237
 
140
- const accessToken = tokenResponse.access_token;
141
238
  const expiresIn = (tokenResponse as Partial<TokenExchangeResponse>).expires_in ?? 3600;
142
239
  if (typeof expiresIn !== 'number' || !Number.isFinite(expiresIn) || expiresIn <= 0) {
143
240
  throw new OpenAIError("Token exchange response has invalid 'expires_in' field");
@@ -0,0 +1,49 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { setTimeout as delay } from 'node:timers/promises';
3
+ import {
4
+ createX509Transport as createCapability,
5
+ registerX509Transport,
6
+ sendX509Request,
7
+ } from '../internal/auth/x509-transport-capability';
8
+ import type { X509Transport, X509TransportOptions } from '../internal/auth/x509-transport-capability';
9
+ import { exchangeX509Token } from '../internal/auth/x509-token-exchange';
10
+ import { isRetryableX509TransportFailure } from '../internal/auth/x509-transport-registry';
11
+ import type { X509RequestScope } from '../internal/auth/x509-transport-registry';
12
+ import { markTransientX509ConnectionError } from '#x509-transport-state';
13
+
14
+ /** Creates one frozen, caller-attested Node.js transport for X.509 workload authentication. */
15
+ export function createX509Transport(options: X509TransportOptions): X509Transport {
16
+ const capability = createCapability(options);
17
+ const scopes = new AsyncLocalStorage<X509RequestScope>();
18
+ registerX509Transport(capability, {
19
+ dispatch: async (target, requestOptions) => {
20
+ try {
21
+ return await sendX509Request(capability, target, requestOptions);
22
+ } catch (error) {
23
+ if (error instanceof Error && isRetryableX509TransportFailure(error)) {
24
+ markTransientX509ConnectionError(error);
25
+ }
26
+ throw error;
27
+ }
28
+ },
29
+ exchange: async (identityProviderId, serviceAccountId, signal) =>
30
+ await exchangeX509Token({
31
+ transport: capability,
32
+ identityProviderId,
33
+ serviceAccountId,
34
+ ...(signal ? { signal } : {}),
35
+ }),
36
+ run: (operation) =>
37
+ scopes.run({ wallStartedAt: Date.now(), monotonicStartedAt: performance.now() }, operation),
38
+ current: () => scopes.getStore(),
39
+ resume: (scope, operation) => scopes.run(scope, operation),
40
+ sleep: async (duration, signal) => await delay(duration, undefined, { signal: signal ?? undefined }),
41
+ });
42
+ return capability;
43
+ }
44
+
45
+ export type {
46
+ X509ProxyMode,
47
+ X509Transport,
48
+ X509TransportOptions,
49
+ } from '../internal/auth/x509-transport-capability';
package/src/azure.ts CHANGED
@@ -7,12 +7,26 @@ import { isObj, readEnv } from './internal/utils';
7
7
  import { path } from './internal/utils/path';
8
8
  import { OpenAI } from './client';
9
9
  import type { ClientOptions } from './client';
10
+ import type { WorkloadIdentity } from './auth/types';
11
+ import { assertNoDataResidency } from './internal/data-residency';
10
12
 
11
13
  /** API Client for interfacing with the Azure OpenAI API. */
12
- export interface AzureClientOptions extends Omit<ClientOptions, 'provider'> {
14
+ export interface AzureClientOptions extends Omit<
15
+ ClientOptions,
16
+ 'provider' | 'dataResidency' | 'workloadIdentity' | 'x509Transport'
17
+ > {
13
18
  /** AzureOpenAI does not support third-party provider configuration. */
14
19
  provider?: never;
15
20
 
21
+ /** OpenAI data residency cannot be combined with Azure routing. */
22
+ dataResidency?: never;
23
+
24
+ /** Azure cannot receive OpenAI X.509 workload-identity certificate transports. */
25
+ x509Transport?: never;
26
+
27
+ /** Existing subject-token workload-identity configuration remains unchanged. */
28
+ workloadIdentity?: WorkloadIdentity | undefined;
29
+
16
30
  /**
17
31
  * Defaults to process.env['OPENAI_API_VERSION'].
18
32
  */
@@ -74,8 +88,10 @@ export class AzureOpenAI extends OpenAI {
74
88
  deployment,
75
89
  azureADTokenProvider,
76
90
  dangerouslyAllowBrowser,
91
+ dataResidency,
77
92
  ...opts
78
93
  }: AzureClientOptions = {}) {
94
+ assertNoDataResidency(dataResidency, 'AzureOpenAI');
79
95
  if (!apiVersion) {
80
96
  throw new Errors.OpenAIError(
81
97
  "The OPENAI_API_VERSION environment variable is missing or empty; either provide it, or instantiate the AzureOpenAI client with an apiVersion option, like new AzureOpenAI({ apiVersion: 'My API Version' }).",
@@ -131,6 +147,11 @@ export class AzureOpenAI extends OpenAI {
131
147
  this.deploymentName = deployment;
132
148
  }
133
149
 
150
+ /** Clones this client with Azure options; OpenAI data residency remains unsupported. */
151
+ override withOptions(options: Partial<AzureClientOptions>): this {
152
+ return super.withOptions(options);
153
+ }
154
+
134
155
  /** Builds an Azure request and inserts its deployment into model-scoped endpoint paths. */
135
156
  override async buildRequest(
136
157
  options: FinalRequestOptions,
package/src/bedrock.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  import * as Errors from './error';
2
2
  import { OpenAI } from './client';
3
3
  import type { ApiKeySetter, ClientOptions } from './client';
4
- import { assertBedrockRequestOrigin, brand_privateBedrockClient } from './internal/bedrock';
4
+ import { assertNoDataResidency } from './internal/data-residency';
5
+ import {
6
+ assertBedrockRequestOrigin,
7
+ assertValidBedrockBearerCredential,
8
+ brand_privateBedrockClient,
9
+ } from './internal/bedrock';
5
10
  import type { RequestInit } from './internal/builtin-types';
6
11
  import type { NullableHeaders } from './internal/headers';
7
12
  import { buildHeaders } from './internal/headers';
@@ -15,7 +20,7 @@ import type * as ResponsesAPI from './resources/responses/responses';
15
20
  /** Configures Amazon Bedrock's OpenAI-compatible endpoint and bearer-token authentication. */
16
21
  export interface BedrockClientOptions extends Omit<
17
22
  ClientOptions,
18
- 'apiKey' | 'adminAPIKey' | 'baseURL' | 'workloadIdentity'
23
+ 'apiKey' | 'adminAPIKey' | 'baseURL' | 'workloadIdentity' | 'x509Transport' | 'dataResidency'
19
24
  > {
20
25
  /**
21
26
  * Bedrock bearer token used for authentication.
@@ -38,11 +43,17 @@ export interface BedrockClientOptions extends Omit<
38
43
  */
39
44
  adminAPIKey?: never;
40
45
 
46
+ /** OpenAI data residency cannot be combined with Bedrock routing. */
47
+ dataResidency?: never;
48
+
41
49
  /**
42
50
  * BedrockOpenAI only supports Bedrock bearer token authentication.
43
51
  */
44
52
  workloadIdentity?: never;
45
53
 
54
+ /** Bedrock cannot receive OpenAI X.509 workload-identity certificate transports. */
55
+ x509Transport?: never;
56
+
46
57
  /**
47
58
  * AWS region used to derive the default Bedrock Mantle endpoint.
48
59
  *
@@ -64,6 +75,11 @@ function deriveBedrockBaseURL(awsRegion: string | undefined): string {
64
75
  'Must provide one of the `baseURL` or `awsRegion` arguments, or set the `AWS_BEDROCK_BASE_URL`, `AWS_REGION`, or `AWS_DEFAULT_REGION` environment variable.',
65
76
  );
66
77
  }
78
+ if (!/^[a-z]{2,8}(?:-[a-z0-9]+)+-\d+$/u.test(region)) {
79
+ throw new Errors.OpenAIError(
80
+ 'The Bedrock AWS `region` is invalid. Use a standard AWS region such as `us-east-1`.',
81
+ );
82
+ }
67
83
 
68
84
  return `https://bedrock-mantle.${region}.api.aws/openai/v1`;
69
85
  }
@@ -129,9 +145,12 @@ export class BedrockOpenAI extends OpenAI {
129
145
  bedrockTokenProvider,
130
146
  adminAPIKey,
131
147
  workloadIdentity,
148
+ x509Transport,
149
+ dataResidency,
132
150
  ...opts
133
151
  }: BedrockClientOptions = {}) {
134
- if (adminAPIKey || workloadIdentity) {
152
+ assertNoDataResidency(dataResidency, 'BedrockOpenAI');
153
+ if (adminAPIKey || workloadIdentity || x509Transport) {
135
154
  throw new Errors.OpenAIError('BedrockOpenAI only supports Bedrock bearer token authentication.');
136
155
  }
137
156
 
@@ -166,6 +185,21 @@ export class BedrockOpenAI extends OpenAI {
166
185
  ...opts,
167
186
  });
168
187
 
188
+ let currentApiKey = this.apiKey;
189
+ Object.defineProperty(this, 'apiKey', {
190
+ enumerable: true,
191
+ configurable: true,
192
+ get() {
193
+ if (currentApiKey !== null) {
194
+ assertValidBedrockBearerCredential(currentApiKey);
195
+ }
196
+ return currentApiKey;
197
+ },
198
+ set(nextApiKey: string | null) {
199
+ currentApiKey = nextApiKey;
200
+ },
201
+ });
202
+
169
203
  const trustedBaseURL = this.baseURL;
170
204
  let currentBaseURL = trustedBaseURL;
171
205
  Object.defineProperty(this, 'baseURL', {
@@ -211,8 +245,18 @@ export class BedrockOpenAI extends OpenAI {
211
245
  schemes?: { bearerAuth?: boolean; adminAPIKeyAuth?: boolean },
212
246
  ): Promise<NullableHeaders | undefined> {
213
247
  const security = schemes ?? { bearerAuth: true, adminAPIKeyAuth: true };
214
- if ((security.bearerAuth || security.adminAPIKeyAuth) && this.apiKey !== null) {
215
- return buildHeaders([{ Authorization: `Bearer ${this.apiKey}` }]);
248
+ const credential = this.apiKey;
249
+ if ((security.bearerAuth || security.adminAPIKeyAuth) && credential !== null) {
250
+ assertValidBedrockBearerCredential(credential);
251
+ try {
252
+ return buildHeaders([{ Authorization: `Bearer ${credential}` }]);
253
+ } catch (error) {
254
+ if (error instanceof TypeError) {
255
+ // oxlint-disable-next-line eslint/preserve-caught-error -- The original error contains the bearer credential.
256
+ throw new TypeError('Bedrock bearer credential contains an invalid HTTP header value.');
257
+ }
258
+ throw error;
259
+ }
216
260
  }
217
261
 
218
262
  return super.authHeaders(opts, security);
@@ -7,6 +7,20 @@ import { EventEmitter } from '../../lib/EventEmitter';
7
7
  import { OpenAIError } from '../../error';
8
8
  import type OpenAI from '../../index';
9
9
  import { AzureOpenAI } from '../../index';
10
+ import { assertX509WebSocketSupported } from '../../internal/auth/x509-workload-identity-auth';
11
+
12
+ /** Parses frame data without exposing malformed payloads through JSON syntax errors. */
13
+ export function parseRealtimeEvent(data: string): RealtimeServerEvent {
14
+ try {
15
+ return JSON.parse(data) as RealtimeServerEvent;
16
+ } catch (error) {
17
+ if (error instanceof SyntaxError) {
18
+ throw new SyntaxError('Could not parse Realtime WebSocket event data as JSON.');
19
+ }
20
+
21
+ throw error;
22
+ }
23
+ }
10
24
 
11
25
  function safeErrorValue(value: unknown): string {
12
26
  try {
@@ -164,6 +178,7 @@ export function buildRealtimeURL(
164
178
  client: Pick<OpenAI, 'apiKey' | 'baseURL'>,
165
179
  connection: string | RealtimeConnectionConfig,
166
180
  ): URL {
181
+ assertX509WebSocketSupported(client);
167
182
  const config: RealtimeConnectionConfig =
168
183
  typeof connection === 'string' ? { model: connection } : connection;
169
184
  const baseURL = client.baseURL;