openai 7.5.0 → 7.6.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 +105 -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 +58 -19
  92. package/core/streaming.js.map +1 -1
  93. package/core/streaming.mjs +58 -19
  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 +9 -12
  427. package/resources/beta/responses/responses.d.mts.map +1 -1
  428. package/resources/beta/responses/responses.d.ts +9 -12
  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 +9 -12
  492. package/resources/responses/responses.d.mts.map +1 -1
  493. package/resources/responses/responses.d.ts +9 -12
  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 +71 -20
  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 +9 -12
  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 +9 -12
  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
@@ -4,6 +4,8 @@ type EventListener<Events, EventType extends keyof Events> = Events[EventType];
4
4
  type EventListeners<Events, EventType extends keyof Events> = {
5
5
  listener: EventListener<Events, EventType>;
6
6
  once?: boolean;
7
+ removed?: boolean;
8
+ detached?: boolean;
7
9
  }[];
8
10
 
9
11
  /** Extracts the ordered listener-argument tuple for one named event. */
@@ -17,6 +19,12 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
17
19
  #listeners: {
18
20
  [Event in keyof EventTypes]?: EventListeners<EventTypes, Event>;
19
21
  } = Object.create(null);
22
+ #emittedListenerRegistrations = new WeakMap<
23
+ object,
24
+ { event: PropertyKey; registration: { removed?: boolean; detached?: boolean } }
25
+ >();
26
+ #pendingListenerCleanup = new Set<PropertyKey>();
27
+ #listenerDispatchDepth = 0;
20
28
 
21
29
  /**
22
30
  * Adds the listener function to the end of the listeners array for the event.
@@ -43,7 +51,22 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
43
51
  if (!listeners) {
44
52
  return this;
45
53
  }
46
- const index = listeners.findIndex((l) => l.listener === listener);
54
+
55
+ const emittedRegistration = this.#emittedListenerRegistrations.get(listener as object);
56
+ if (
57
+ emittedRegistration?.event === event &&
58
+ !emittedRegistration.registration.removed &&
59
+ !emittedRegistration.registration.detached
60
+ ) {
61
+ this.#removeEmittedListener(
62
+ event,
63
+ emittedRegistration.registration as EventListeners<EventTypes, Event>[number],
64
+ );
65
+ return this;
66
+ }
67
+ const index = listeners.findIndex(
68
+ (registration) => !registration.removed && registration.listener === listener,
69
+ );
47
70
  if (index !== -1) {
48
71
  listeners.splice(index, 1);
49
72
  }
@@ -61,6 +84,52 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
61
84
  return this;
62
85
  }
63
86
 
87
+ #onceForEmitted<Event extends keyof EventTypes>(
88
+ event: Event,
89
+ listener: EventListener<EventTypes, Event>,
90
+ ): void {
91
+ const previousListeners = this.#listeners[event];
92
+ const previousLength = previousListeners?.length ?? 0;
93
+ this.once(event, listener);
94
+ const listeners = this.#listeners[event];
95
+ const [registration] = listeners?.slice(-1) ?? [];
96
+ if (
97
+ (previousListeners === undefined || listeners === previousListeners) &&
98
+ listeners?.length === previousLength + 1 &&
99
+ registration?.listener === listener &&
100
+ registration.once
101
+ ) {
102
+ this.#emittedListenerRegistrations.set(listener as object, { event, registration });
103
+ }
104
+ }
105
+
106
+ #removeEmittedListener<Event extends keyof EventTypes>(
107
+ event: Event,
108
+ registration: EventListeners<EventTypes, Event>[number],
109
+ ): void {
110
+ if (registration.removed) {
111
+ return;
112
+ }
113
+
114
+ registration.removed = true;
115
+ this.#emittedListenerRegistrations.delete(registration.listener as object);
116
+ this.#pendingListenerCleanup.add(event);
117
+ if (this.#listenerDispatchDepth === 0) {
118
+ this.#cleanupEmittedListeners();
119
+ }
120
+ }
121
+
122
+ #cleanupEmittedListeners(): void {
123
+ for (const event of this.#pendingListenerCleanup) {
124
+ const eventType = event as keyof EventTypes;
125
+ const listeners = this.#listeners[eventType];
126
+ if (listeners) {
127
+ this.#listeners[eventType] = listeners.filter((listener) => !listener.removed) as any;
128
+ }
129
+ }
130
+ this.#pendingListenerCleanup.clear();
131
+ }
132
+
64
133
  /**
65
134
  * This is similar to `.once()`, but returns a Promise that resolves the next time
66
135
  * the event is triggered, instead of calling a listener callback.
@@ -98,9 +167,9 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
98
167
  };
99
168
 
100
169
  if (event !== 'error') {
101
- this.once('error', listeners.onError as any);
170
+ this.#onceForEmitted('error', listeners.onError as any);
102
171
  }
103
- this.once(event, listeners.onEvent as any);
172
+ this.#onceForEmitted(event, listeners.onEvent as any);
104
173
  });
105
174
  }
106
175
 
@@ -111,16 +180,31 @@ export class EventEmitter<EventTypes extends Record<string, (...args: any) => an
111
180
  ) {
112
181
  const listeners: EventListeners<EventTypes, Event> | undefined = this.#listeners[event];
113
182
  if (listeners) {
114
- this.#listeners[event] = listeners.filter((l) => !l.once) as any;
115
- for (const { listener } of listeners as any) {
116
- listener(...(args as any));
183
+ this.#listeners[event] = listeners.filter((listener) => {
184
+ if (listener.once) {
185
+ listener.detached = true;
186
+ }
187
+ return !listener.once && !listener.removed;
188
+ }) as any;
189
+ this.#listenerDispatchDepth += 1;
190
+ try {
191
+ for (const registration of listeners as any) {
192
+ if (!registration.removed) {
193
+ registration.listener(...(args as any));
194
+ }
195
+ }
196
+ } finally {
197
+ this.#listenerDispatchDepth -= 1;
198
+ if (this.#listenerDispatchDepth === 0) {
199
+ this.#cleanupEmittedListeners();
200
+ }
117
201
  }
118
202
  }
119
203
  }
120
204
 
121
205
  protected _hasListener(event: keyof EventTypes): boolean {
122
206
  const listeners = this.#listeners[event];
123
- return listeners && listeners.length > 0;
207
+ return listeners && listeners.some((listener) => !listener.removed);
124
208
  }
125
209
  }
126
210
 
@@ -9,6 +9,45 @@ import type { OpenAI } from '../client';
9
9
 
10
10
  type Bytes = string | ArrayBuffer | Uint8Array | null | undefined;
11
11
 
12
+ type StreamTeeQueue<Item> = {
13
+ readonly length: number;
14
+ enqueue: (value: Promise<IteratorResult<Item>>) => void;
15
+ dequeue: () => Promise<IteratorResult<Item>> | undefined;
16
+ };
17
+
18
+ function createStreamTeeQueue<Item>(): StreamTeeQueue<Item> {
19
+ let entries: (Promise<IteratorResult<Item>> | undefined)[] = [];
20
+ let head = 0;
21
+
22
+ return {
23
+ get length() {
24
+ return entries.length - head;
25
+ },
26
+ enqueue(value) {
27
+ entries.push(value);
28
+ },
29
+ dequeue() {
30
+ if (head === entries.length) {
31
+ return undefined;
32
+ }
33
+
34
+ const value = entries[head];
35
+ entries[head] = undefined;
36
+ head += 1;
37
+
38
+ if (head === entries.length) {
39
+ entries = [];
40
+ head = 0;
41
+ } else if (head >= 1024 && head * 2 >= entries.length) {
42
+ entries = entries.slice(head);
43
+ head = 0;
44
+ }
45
+
46
+ return value;
47
+ },
48
+ };
49
+ }
50
+
12
51
  /** A decoded server-sent event before its JSON payload has been parsed. */
13
52
  export type ServerSentEvent = {
14
53
  /** Explicit SSE event name, or `null` when the event has no `event:` field. */
@@ -64,7 +103,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
64
103
  let receivedCompletionSentinel = false;
65
104
  try {
66
105
  for await (const sse of _iterSSEMessages(response, controller)) {
67
- if (sse.data.startsWith('[DONE]')) {
106
+ if (sse.data === '[DONE]') {
68
107
  receivedCompletionSentinel = true;
69
108
  break;
70
109
  }
@@ -74,10 +113,14 @@ export class Stream<Item> implements AsyncIterable<Item> {
74
113
 
75
114
  try {
76
115
  data = JSON.parse(sse.data) as any;
77
- } catch (e) {
78
- logger.error(`Could not parse message into JSON:`, sse.data);
79
- logger.error(`From chunk:`, sse.raw);
80
- throw e;
116
+ } catch {
117
+ logger.error(`Could not parse message into JSON:`);
118
+ logger.error(`From chunk:`);
119
+ throw new SyntaxError('Error reading response: malformed server-sent event JSON.');
120
+ }
121
+
122
+ if (sse.event === 'error') {
123
+ throw new APIError(undefined, data?.error ?? data, undefined, response.headers);
81
124
  }
82
125
 
83
126
  if (data && data.error) {
@@ -89,14 +132,10 @@ export class Stream<Item> implements AsyncIterable<Item> {
89
132
  let data;
90
133
  try {
91
134
  data = JSON.parse(sse.data);
92
- } catch (e) {
93
- console.error(`Could not parse message into JSON:`, sse.data);
94
- console.error(`From chunk:`, sse.raw);
95
- throw e;
96
- }
97
- // SSE error events surface as APIError instances.
98
- if (sse.event === 'error') {
99
- throw new APIError(undefined, data.error, data.message, undefined);
135
+ } catch {
136
+ logger.error(`Could not parse message into JSON:`);
137
+ logger.error(`From chunk:`);
138
+ throw new SyntaxError('Error reading response: malformed server-sent event JSON.');
100
139
  }
101
140
  yield { event: sse.event, data } as any;
102
141
  }
@@ -199,7 +238,18 @@ export class Stream<Item> implements AsyncIterable<Item> {
199
238
  continue;
200
239
  }
201
240
  if (line) {
202
- yield JSON.parse(line) as Item;
241
+ let data: Item;
242
+ try {
243
+ data = JSON.parse(line) as Item;
244
+ } catch (error) {
245
+ if (error instanceof SyntaxError) {
246
+ throw new SyntaxError('Error reading response: malformed newline-delimited JSON.');
247
+ }
248
+
249
+ throw error;
250
+ }
251
+
252
+ yield data;
203
253
  }
204
254
  }
205
255
  done = true;
@@ -230,18 +280,18 @@ export class Stream<Item> implements AsyncIterable<Item> {
230
280
  * independently read from at different speeds.
231
281
  */
232
282
  tee(): [Stream<Item>, Stream<Item>] {
233
- const left: Promise<IteratorResult<Item>>[] = [];
234
- const right: Promise<IteratorResult<Item>>[] = [];
283
+ const left = createStreamTeeQueue<Item>();
284
+ const right = createStreamTeeQueue<Item>();
235
285
  const iterator = this.iterator();
236
286
 
237
- const teeIterator = (queue: Promise<IteratorResult<Item>>[]): AsyncIterator<Item> => ({
287
+ const teeIterator = (queue: StreamTeeQueue<Item>): AsyncIterator<Item> => ({
238
288
  next: () => {
239
289
  if (queue.length === 0) {
240
290
  const result = iterator.next();
241
- left.push(result);
242
- right.push(result);
291
+ left.enqueue(result);
292
+ right.enqueue(result);
243
293
  }
244
- return queue.shift()!;
294
+ return queue.dequeue()!;
245
295
  },
246
296
  });
247
297
 
@@ -286,6 +336,7 @@ export class Stream<Item> implements AsyncIterable<Item> {
286
336
 
287
337
  /**
288
338
  * Decodes complete SSE records from a response and aborts when its body is absent.
339
+ * Complete events are decoded on demand without imposing a line or event size limit.
289
340
  *
290
341
  * @yields {ServerSentEvent} Each decoded server-sent event in wire order.
291
342
  */
@@ -100,7 +100,7 @@ export async function playAudio(input: NodeJS.ReadableStream | Response | File):
100
100
 
101
101
  /** Controls microphone selection and when an in-progress recording is finalized. */
102
102
  type RecordAudioOptions = {
103
- /** Stops recording when aborted and resolves with the audio captured so far. */
103
+ /** Stops recording when aborted; successful termination returns the captured audio. */
104
104
  signal?: AbortSignal;
105
105
 
106
106
  /** Zero-based audio-input device number passed to FFmpeg; defaults to `0`. */
@@ -110,6 +110,14 @@ type RecordAudioOptions = {
110
110
  timeout?: number;
111
111
  };
112
112
 
113
+ function removeRecordingAbortListener(signal: AbortSignal | undefined, listener: () => void): void {
114
+ try {
115
+ signal?.removeEventListener('abort', listener);
116
+ } catch {
117
+ // A cleanup callback must not replace the recording's terminal outcome.
118
+ }
119
+ }
120
+
113
121
  function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {}): Promise<File> {
114
122
  checkFileSupport();
115
123
  return new Promise((resolve, reject) => {
@@ -119,27 +127,48 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
119
127
  let internalSignal: AbortSignal | undefined;
120
128
  let wasStopped = false;
121
129
  let settled = false;
130
+ let callerAbortObserved = false;
131
+ let timeoutAbortObserved = false;
132
+ let rejectRecording: (error: unknown) => void = reject;
122
133
 
123
134
  const collectData = (chunk: Buffer) => {
124
- data.push(chunk);
135
+ if (!settled) {
136
+ data.push(chunk);
137
+ }
125
138
  };
126
139
  const stopRecording = () => {
127
140
  if (!settled && ffmpeg) {
128
- wasStopped ||= ffmpeg.kill('SIGTERM');
141
+ try {
142
+ wasStopped ||= ffmpeg.kill('SIGTERM');
143
+ } catch (error) {
144
+ rejectRecording(error);
145
+ }
129
146
  }
130
147
  };
148
+ const stopCallerRecording = () => {
149
+ callerAbortObserved = true;
150
+ stopRecording();
151
+ };
152
+ const stopTimeoutRecording = () => {
153
+ timeoutAbortObserved = true;
154
+ stopRecording();
155
+ };
131
156
  const cleanup = () => {
132
157
  if (settled) {
133
158
  return false;
134
159
  }
135
160
 
136
161
  settled = true;
137
- signal?.removeEventListener('abort', stopRecording);
138
- internalSignal?.removeEventListener('abort', stopRecording);
139
- ffmpeg?.stdout?.removeListener('data', collectData);
162
+ removeRecordingAbortListener(signal, stopCallerRecording);
163
+ removeRecordingAbortListener(internalSignal, stopTimeoutRecording);
164
+ try {
165
+ ffmpeg?.stdout?.removeListener('data', collectData);
166
+ } catch {
167
+ // Continue settling even when the output stream rejects cleanup.
168
+ }
140
169
  return true;
141
170
  };
142
- const rejectRecording = (error: unknown) => {
171
+ rejectRecording = (error: unknown) => {
143
172
  if (cleanup()) {
144
173
  reject(error);
145
174
  }
@@ -154,6 +183,35 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
154
183
  resolve(audioFile);
155
184
  };
156
185
 
186
+ const observeTimeout = () => {
187
+ internalSignal?.addEventListener('abort', stopTimeoutRecording, { once: true });
188
+ if (settled) {
189
+ removeRecordingAbortListener(internalSignal, stopTimeoutRecording);
190
+ return false;
191
+ }
192
+
193
+ if (internalSignal && !timeoutAbortObserved && internalSignal.aborted) {
194
+ stopTimeoutRecording();
195
+ }
196
+ return !settled;
197
+ };
198
+ const observeCaller = () => {
199
+ if (!signal) {
200
+ return;
201
+ }
202
+ if (signal.aborted) {
203
+ stopRecording();
204
+ return;
205
+ }
206
+
207
+ signal.addEventListener('abort', stopCallerRecording, { once: true });
208
+ if (settled) {
209
+ removeRecordingAbortListener(signal, stopCallerRecording);
210
+ } else if (!callerAbortObserved && signal.aborted) {
211
+ stopCallerRecording();
212
+ }
213
+ };
214
+
157
215
  try {
158
216
  if (typeof timeout === 'number' && (timeout > 0 || Number.isNaN(timeout))) {
159
217
  internalSignal = AbortSignal.timeout(timeout);
@@ -182,8 +240,16 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
182
240
  ffmpeg.stdout?.on('data', collectData);
183
241
 
184
242
  ffmpeg.on('error', (error) => {
185
- console.error(error);
186
- rejectRecording(error);
243
+ if (!cleanup()) {
244
+ return;
245
+ }
246
+
247
+ try {
248
+ console.error(error);
249
+ } catch {
250
+ // A custom logger must not hide the original process failure.
251
+ }
252
+ reject(error);
187
253
  });
188
254
 
189
255
  ffmpeg.on('close', (code) => {
@@ -194,18 +260,23 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
194
260
  returnData();
195
261
  });
196
262
 
197
- internalSignal?.addEventListener('abort', stopRecording, { once: true });
263
+ if (settled || !observeTimeout()) {
264
+ return;
265
+ }
266
+ observeCaller();
267
+ } catch (error) {
268
+ if (!cleanup()) {
269
+ return;
270
+ }
198
271
 
199
- if (signal) {
200
- if (signal.aborted) {
201
- stopRecording();
202
- } else {
203
- signal.addEventListener('abort', stopRecording, { once: true });
272
+ try {
273
+ if (!wasStopped) {
274
+ ffmpeg?.kill('SIGTERM');
204
275
  }
276
+ } catch {
277
+ // Preserve the original setup error when process termination also fails.
205
278
  }
206
- } catch (error) {
207
- stopRecording();
208
- rejectRecording(error);
279
+ reject(error);
209
280
  }
210
281
  });
211
282
  }
@@ -216,13 +287,13 @@ function nodejsRecordAudio({ signal, device, timeout }: RecordAudioOptions = {})
216
287
  * This helper is supported only in Node.js-compatible runtimes and requires
217
288
  * the `ffmpeg` executable from FFmpeg to be available on `PATH`. Recording
218
289
  * continues until the FFmpeg process exits, the supplied signal is aborted, or
219
- * a positive timeout elapses. Aborting or timing out finalizes and returns the
220
- * audio captured so far instead of rejecting.
290
+ * a positive timeout elapses. Successful cancellation returns the audio captured
291
+ * so far; if sending `SIGTERM` throws, recording rejects with that error.
221
292
  *
222
293
  * @param options Audio-input device, optional abort signal, and recording timeout.
223
294
  * @returns The captured WAV file with MIME type `audio/wav`.
224
- * @throws {Error} If recording is unsupported, `ffmpeg` cannot start, or the
225
- * recording process exits unsuccessfully before an intentional stop.
295
+ * @throws {Error} If recording is unsupported, `ffmpeg` cannot start or exits
296
+ * unsuccessfully before an intentional stop, or sending it `SIGTERM` throws.
226
297
  */
227
298
  export async function recordAudio(options: RecordAudioOptions = {}): Promise<File> {
228
299
  if (isNode) {
@@ -1,6 +1,11 @@
1
1
  import { OpenAIError } from '../error';
2
2
  import type { AutoParseableResponseFormat, AutoParseableTextFormat, AutoParseableTool } from '../lib/parser';
3
- import { makeParseableResponseFormat, makeParseableTextFormat, makeParseableTool } from '../lib/parser';
3
+ import {
4
+ makeParseableResponseFormat,
5
+ makeParseableTextFormat,
6
+ makeParseableTool,
7
+ parseResponseFormatContent,
8
+ } from '../lib/parser';
4
9
  import type { AutoParseableResponseTool } from '../lib/ResponsesParser';
5
10
  import { makeParseableResponseTool } from '../lib/ResponsesParser';
6
11
  import type { JSONSchema } from '../lib/jsonschema';
@@ -500,11 +505,30 @@ function normalizeStructuredOutputSchema(schema: JSONSchema): JSONSchema {
500
505
  return normalizedSchema;
501
506
  }
502
507
 
508
+ type StandardSchemaBinding<Schema extends StandardSchemaLike> = {
509
+ standard: Schema['~standard'];
510
+ validate: Schema['~standard']['validate'];
511
+ };
512
+
513
+ function bindStandardSchema<Schema extends StandardSchemaLike>(standardSchema: Schema) {
514
+ let binding: StandardSchemaBinding<Schema> | undefined;
515
+
516
+ return (): StandardSchemaBinding<Schema> => {
517
+ if (!binding) {
518
+ const standard = standardSchema['~standard'];
519
+ binding = { standard, validate: standard.validate };
520
+ }
521
+ return binding;
522
+ };
523
+ }
524
+
503
525
  function parseStandardSchema<Schema extends StandardSchemaLike>(
504
- standardSchema: Schema,
526
+ getBinding: () => StandardSchemaBinding<Schema>,
505
527
  content: string,
506
528
  ): InferStandardOutput<Schema> {
507
- const result = standardSchema['~standard'].validate(JSON.parse(content));
529
+ const parsed = parseResponseFormatContent({ type: 'json_schema', $parseRaw: undefined }, content);
530
+ const { standard, validate } = getBinding();
531
+ const result = Reflect.apply(validate, standard, [parsed]);
508
532
 
509
533
  if (isPromiseLike(result)) {
510
534
  void Promise.resolve(result).catch(() => undefined);
@@ -520,11 +544,11 @@ function parseStandardSchema<Schema extends StandardSchemaLike>(
520
544
  return result.value as InferStandardOutput<Schema>;
521
545
  }
522
546
 
523
- function resolveStandardJSONSchema(
524
- standardSchema: StandardSchemaLike,
547
+ function resolveStandardJSONSchema<Schema extends StandardSchemaLike>(
548
+ getBinding: () => StandardSchemaBinding<Schema>,
525
549
  schemaOverride?: JSONSchema | Record<string, unknown> | undefined,
526
550
  ): Record<string, unknown> {
527
- const schema = (schemaOverride ?? standardSchema['~standard'].jsonSchema?.input({ target: 'draft-07' })) as
551
+ const schema = (schemaOverride ?? getBinding().standard.jsonSchema?.input({ target: 'draft-07' })) as
528
552
  | JSONSchema
529
553
  | undefined;
530
554
 
@@ -564,6 +588,7 @@ export function standardResponseFormat<Schema extends StandardSchemaLike>(
564
588
  props?: StandardResponseFormatProps,
565
589
  ): AutoParseableResponseFormat<InferStandardOutput<Schema>> {
566
590
  const { schema, ...formatProps } = props ?? {};
591
+ const getBinding = bindStandardSchema(standardSchema);
567
592
 
568
593
  return makeParseableResponseFormat<InferStandardOutput<Schema>>(
569
594
  {
@@ -572,10 +597,10 @@ export function standardResponseFormat<Schema extends StandardSchemaLike>(
572
597
  ...formatProps,
573
598
  name,
574
599
  strict: true,
575
- schema: resolveStandardJSONSchema(standardSchema, schema),
600
+ schema: resolveStandardJSONSchema(getBinding, schema),
576
601
  },
577
602
  },
578
- (content) => parseStandardSchema(standardSchema, content),
603
+ (content) => parseStandardSchema(getBinding, content),
579
604
  );
580
605
  }
581
606
 
@@ -602,6 +627,7 @@ export function standardTextFormat<Schema extends StandardSchemaLike>(
602
627
  props?: StandardTextFormatProps,
603
628
  ): AutoParseableTextFormat<InferStandardOutput<Schema>> {
604
629
  const { schema, ...formatProps } = props ?? {};
630
+ const getBinding = bindStandardSchema(standardSchema);
605
631
 
606
632
  return makeParseableTextFormat<InferStandardOutput<Schema>>(
607
633
  {
@@ -609,9 +635,9 @@ export function standardTextFormat<Schema extends StandardSchemaLike>(
609
635
  ...formatProps,
610
636
  name,
611
637
  strict: true,
612
- schema: resolveStandardJSONSchema(standardSchema, schema),
638
+ schema: resolveStandardJSONSchema(getBinding, schema),
613
639
  },
614
- (content) => parseStandardSchema(standardSchema, content),
640
+ (content) => parseStandardSchema(getBinding, content),
615
641
  );
616
642
  }
617
643
 
@@ -678,19 +704,23 @@ export function standardFunction<Parameters extends StandardSchemaLike>(
678
704
  export function standardFunction<Parameters extends StandardSchemaLike>(
679
705
  options: StandardToolOptions<Parameters>,
680
706
  ) {
707
+ const name = options.name;
708
+ const parameters = options.parameters;
709
+ const getBinding = bindStandardSchema(parameters);
710
+
681
711
  return makeParseableTool<any>(
682
712
  {
683
713
  type: 'function',
684
714
  function: {
685
- name: options.name,
686
- parameters: resolveStandardJSONSchema(options.parameters, options.schema),
715
+ name,
716
+ parameters: resolveStandardJSONSchema(getBinding, options.schema),
687
717
  strict: true,
688
718
  ...(options.description ? { description: options.description } : undefined),
689
719
  },
690
720
  },
691
721
  {
692
722
  callback: options.function,
693
- parser: (args) => parseStandardSchema(options.parameters, args),
723
+ parser: (args) => parseStandardSchema(getBinding, args),
694
724
  },
695
725
  );
696
726
  }
@@ -757,17 +787,21 @@ export function standardResponsesFunction<Parameters extends StandardSchemaLike>
757
787
  export function standardResponsesFunction<Parameters extends StandardSchemaLike>(
758
788
  options: StandardToolOptions<Parameters>,
759
789
  ) {
790
+ const name = options.name;
791
+ const parameters = options.parameters;
792
+ const getBinding = bindStandardSchema(parameters);
793
+
760
794
  return makeParseableResponseTool<any>(
761
795
  {
762
796
  type: 'function',
763
- name: options.name,
764
- parameters: resolveStandardJSONSchema(options.parameters, options.schema),
797
+ name,
798
+ parameters: resolveStandardJSONSchema(getBinding, options.schema),
765
799
  strict: true,
766
800
  ...(options.description ? { description: options.description } : undefined),
767
801
  },
768
802
  {
769
803
  callback: options.function,
770
- parser: (args) => parseStandardSchema(options.parameters, args),
804
+ parser: (args) => parseStandardSchema(getBinding, args),
771
805
  },
772
806
  );
773
807
  }