openai 7.9.0 → 7.12.1

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 (522) hide show
  1. package/CHANGELOG.md +208 -0
  2. package/README.md +7 -5
  3. package/_vendor/partial-json-parser/parser.d.mts.map +1 -1
  4. package/_vendor/partial-json-parser/parser.d.ts.map +1 -1
  5. package/_vendor/partial-json-parser/parser.js +4 -3
  6. package/_vendor/partial-json-parser/parser.js.map +1 -1
  7. package/_vendor/partial-json-parser/parser.mjs +4 -3
  8. package/_vendor/partial-json-parser/parser.mjs.map +1 -1
  9. package/_vendor/zod-to-json-schema/parsers/string.js +1 -1
  10. package/_vendor/zod-to-json-schema/parsers/string.js.map +1 -1
  11. package/_vendor/zod-to-json-schema/parsers/string.mjs +1 -1
  12. package/_vendor/zod-to-json-schema/parsers/string.mjs.map +1 -1
  13. package/_vendor/zod-to-json-schema/parsers/tuple.d.mts.map +1 -1
  14. package/_vendor/zod-to-json-schema/parsers/tuple.d.ts.map +1 -1
  15. package/_vendor/zod-to-json-schema/parsers/tuple.js +19 -12
  16. package/_vendor/zod-to-json-schema/parsers/tuple.js.map +1 -1
  17. package/_vendor/zod-to-json-schema/parsers/tuple.mjs +19 -12
  18. package/_vendor/zod-to-json-schema/parsers/tuple.mjs.map +1 -1
  19. package/_vendor/zod-to-json-schema/zodToJsonSchema.d.mts.map +1 -1
  20. package/_vendor/zod-to-json-schema/zodToJsonSchema.d.ts.map +1 -1
  21. package/_vendor/zod-to-json-schema/zodToJsonSchema.js +6 -2
  22. package/_vendor/zod-to-json-schema/zodToJsonSchema.js.map +1 -1
  23. package/_vendor/zod-to-json-schema/zodToJsonSchema.mjs +6 -2
  24. package/_vendor/zod-to-json-schema/zodToJsonSchema.mjs.map +1 -1
  25. package/auth/subject-token-providers.d.mts.map +1 -1
  26. package/auth/subject-token-providers.d.ts.map +1 -1
  27. package/auth/subject-token-providers.js +10 -5
  28. package/auth/subject-token-providers.js.map +1 -1
  29. package/auth/subject-token-providers.mjs +10 -5
  30. package/auth/subject-token-providers.mjs.map +1 -1
  31. package/auth/workload-identity-auth.d.mts.map +1 -1
  32. package/auth/workload-identity-auth.d.ts.map +1 -1
  33. package/auth/workload-identity-auth.js +21 -11
  34. package/auth/workload-identity-auth.js.map +1 -1
  35. package/auth/workload-identity-auth.mjs +21 -11
  36. package/auth/workload-identity-auth.mjs.map +1 -1
  37. package/azure.d.mts.map +1 -1
  38. package/azure.d.ts.map +1 -1
  39. package/azure.js +31 -2
  40. package/azure.js.map +1 -1
  41. package/azure.mjs +32 -3
  42. package/azure.mjs.map +1 -1
  43. package/beta/realtime/internal-base.d.mts.map +1 -1
  44. package/beta/realtime/internal-base.d.ts.map +1 -1
  45. package/beta/realtime/internal-base.js +3 -2
  46. package/beta/realtime/internal-base.js.map +1 -1
  47. package/beta/realtime/internal-base.mjs +3 -2
  48. package/beta/realtime/internal-base.mjs.map +1 -1
  49. package/beta/realtime/websocket.d.mts +2 -0
  50. package/beta/realtime/websocket.d.mts.map +1 -1
  51. package/beta/realtime/websocket.d.ts +2 -0
  52. package/beta/realtime/websocket.d.ts.map +1 -1
  53. package/beta/realtime/websocket.js +12 -7
  54. package/beta/realtime/websocket.js.map +1 -1
  55. package/beta/realtime/websocket.mjs +12 -7
  56. package/beta/realtime/websocket.mjs.map +1 -1
  57. package/beta/realtime/ws.d.mts +2 -0
  58. package/beta/realtime/ws.d.mts.map +1 -1
  59. package/beta/realtime/ws.d.ts +2 -0
  60. package/beta/realtime/ws.d.ts.map +1 -1
  61. package/beta/realtime/ws.js +7 -5
  62. package/beta/realtime/ws.js.map +1 -1
  63. package/beta/realtime/ws.mjs +7 -5
  64. package/beta/realtime/ws.mjs.map +1 -1
  65. package/client.d.mts +12 -1
  66. package/client.d.mts.map +1 -1
  67. package/client.d.ts +12 -1
  68. package/client.d.ts.map +1 -1
  69. package/client.js +20 -4
  70. package/client.js.map +1 -1
  71. package/client.mjs +20 -4
  72. package/client.mjs.map +1 -1
  73. package/core/EventEmitter.d.mts +2 -1
  74. package/core/EventEmitter.d.mts.map +1 -1
  75. package/core/EventEmitter.d.ts +2 -1
  76. package/core/EventEmitter.d.ts.map +1 -1
  77. package/core/EventEmitter.js +2 -1
  78. package/core/EventEmitter.js.map +1 -1
  79. package/core/EventEmitter.mjs +2 -1
  80. package/core/EventEmitter.mjs.map +1 -1
  81. package/core/pagination.js +1 -1
  82. package/core/pagination.js.map +1 -1
  83. package/core/pagination.mjs +1 -1
  84. package/core/pagination.mjs.map +1 -1
  85. package/core/streaming.d.mts +8 -0
  86. package/core/streaming.d.mts.map +1 -1
  87. package/core/streaming.d.ts +8 -0
  88. package/core/streaming.d.ts.map +1 -1
  89. package/core/streaming.js +68 -15
  90. package/core/streaming.js.map +1 -1
  91. package/core/streaming.mjs +68 -15
  92. package/core/streaming.mjs.map +1 -1
  93. package/helpers/audio.d.mts +1 -1
  94. package/helpers/audio.d.mts.map +1 -1
  95. package/helpers/audio.d.ts +1 -1
  96. package/helpers/audio.d.ts.map +1 -1
  97. package/helpers/audio.js +25 -5
  98. package/helpers/audio.js.map +1 -1
  99. package/helpers/audio.mjs +25 -5
  100. package/helpers/audio.mjs.map +1 -1
  101. package/helpers/zod.d.mts +28 -15
  102. package/helpers/zod.d.mts.map +1 -1
  103. package/helpers/zod.d.ts +28 -15
  104. package/helpers/zod.d.ts.map +1 -1
  105. package/helpers/zod.js +30 -23
  106. package/helpers/zod.js.map +1 -1
  107. package/helpers/zod.mjs +30 -23
  108. package/helpers/zod.mjs.map +1 -1
  109. package/index.js +4 -5
  110. package/internal/bedrock.d.mts +11 -0
  111. package/internal/bedrock.d.mts.map +1 -1
  112. package/internal/bedrock.d.ts +11 -0
  113. package/internal/bedrock.d.ts.map +1 -1
  114. package/internal/bedrock.js +71 -55
  115. package/internal/bedrock.js.map +1 -1
  116. package/internal/bedrock.mjs +70 -55
  117. package/internal/bedrock.mjs.map +1 -1
  118. package/internal/detect-platform.js +2 -2
  119. package/internal/detect-platform.js.map +1 -1
  120. package/internal/detect-platform.mjs +2 -2
  121. package/internal/detect-platform.mjs.map +1 -1
  122. package/internal/errors.d.mts.map +1 -1
  123. package/internal/errors.d.ts.map +1 -1
  124. package/internal/errors.js +3 -2
  125. package/internal/errors.js.map +1 -1
  126. package/internal/errors.mjs +3 -2
  127. package/internal/errors.mjs.map +1 -1
  128. package/internal/headers.d.mts.map +1 -1
  129. package/internal/headers.d.ts.map +1 -1
  130. package/internal/headers.js +4 -5
  131. package/internal/headers.js.map +1 -1
  132. package/internal/headers.mjs +4 -5
  133. package/internal/headers.mjs.map +1 -1
  134. package/internal/parse.js +1 -1
  135. package/internal/parse.js.map +1 -1
  136. package/internal/parse.mjs +1 -1
  137. package/internal/parse.mjs.map +1 -1
  138. package/internal/realtime-credentials.d.mts +15 -0
  139. package/internal/realtime-credentials.d.mts.map +1 -0
  140. package/internal/realtime-credentials.d.ts +15 -0
  141. package/internal/realtime-credentials.d.ts.map +1 -0
  142. package/internal/realtime-credentials.js +23 -0
  143. package/internal/realtime-credentials.js.map +1 -0
  144. package/internal/realtime-credentials.mjs +19 -0
  145. package/internal/realtime-credentials.mjs.map +1 -0
  146. package/internal/responses/response-accumulator.d.mts.map +1 -1
  147. package/internal/responses/response-accumulator.d.ts.map +1 -1
  148. package/internal/responses/response-accumulator.js +2 -1
  149. package/internal/responses/response-accumulator.js.map +1 -1
  150. package/internal/responses/response-accumulator.mjs +2 -1
  151. package/internal/responses/response-accumulator.mjs.map +1 -1
  152. package/internal/to-file.d.mts +2 -1
  153. package/internal/to-file.d.mts.map +1 -1
  154. package/internal/to-file.d.ts +2 -1
  155. package/internal/to-file.d.ts.map +1 -1
  156. package/internal/to-file.js +5 -4
  157. package/internal/to-file.js.map +1 -1
  158. package/internal/to-file.mjs +6 -5
  159. package/internal/to-file.mjs.map +1 -1
  160. package/internal/types.d.mts +3 -3
  161. package/internal/types.d.mts.map +1 -1
  162. package/internal/types.d.ts +3 -3
  163. package/internal/types.d.ts.map +1 -1
  164. package/internal/uploads.d.mts +2 -0
  165. package/internal/uploads.d.mts.map +1 -1
  166. package/internal/uploads.d.ts +2 -0
  167. package/internal/uploads.d.ts.map +1 -1
  168. package/internal/uploads.js +12 -1
  169. package/internal/uploads.js.map +1 -1
  170. package/internal/uploads.mjs +11 -1
  171. package/internal/uploads.mjs.map +1 -1
  172. package/internal/utils/base64.d.mts.map +1 -1
  173. package/internal/utils/base64.d.ts.map +1 -1
  174. package/internal/utils/base64.js +3 -0
  175. package/internal/utils/base64.js.map +1 -1
  176. package/internal/utils/base64.mjs +3 -0
  177. package/internal/utils/base64.mjs.map +1 -1
  178. package/lib/AbstractChatCompletionRunner.d.mts +1 -1
  179. package/lib/AbstractChatCompletionRunner.d.mts.map +1 -1
  180. package/lib/AbstractChatCompletionRunner.d.ts +1 -1
  181. package/lib/AbstractChatCompletionRunner.d.ts.map +1 -1
  182. package/lib/AbstractChatCompletionRunner.js +31 -9
  183. package/lib/AbstractChatCompletionRunner.js.map +1 -1
  184. package/lib/AbstractChatCompletionRunner.mjs +31 -9
  185. package/lib/AbstractChatCompletionRunner.mjs.map +1 -1
  186. package/lib/AssistantStream.d.mts +4 -1
  187. package/lib/AssistantStream.d.mts.map +1 -1
  188. package/lib/AssistantStream.d.ts +4 -1
  189. package/lib/AssistantStream.d.ts.map +1 -1
  190. package/lib/AssistantStream.js +23 -8
  191. package/lib/AssistantStream.js.map +1 -1
  192. package/lib/AssistantStream.mjs +24 -9
  193. package/lib/AssistantStream.mjs.map +1 -1
  194. package/lib/ChatCompletionRunner.d.mts +6 -3
  195. package/lib/ChatCompletionRunner.d.mts.map +1 -1
  196. package/lib/ChatCompletionRunner.d.ts +6 -3
  197. package/lib/ChatCompletionRunner.d.ts.map +1 -1
  198. package/lib/ChatCompletionRunner.js +7 -4
  199. package/lib/ChatCompletionRunner.js.map +1 -1
  200. package/lib/ChatCompletionRunner.mjs +7 -4
  201. package/lib/ChatCompletionRunner.mjs.map +1 -1
  202. package/lib/ChatCompletionStream.d.mts.map +1 -1
  203. package/lib/ChatCompletionStream.d.ts.map +1 -1
  204. package/lib/ChatCompletionStream.js +6 -0
  205. package/lib/ChatCompletionStream.js.map +1 -1
  206. package/lib/ChatCompletionStream.mjs +7 -1
  207. package/lib/ChatCompletionStream.mjs.map +1 -1
  208. package/lib/ChatCompletionStreamingRunner.d.mts.map +1 -1
  209. package/lib/ChatCompletionStreamingRunner.d.ts.map +1 -1
  210. package/lib/ChatCompletionStreamingRunner.js +1 -0
  211. package/lib/ChatCompletionStreamingRunner.js.map +1 -1
  212. package/lib/ChatCompletionStreamingRunner.mjs +1 -0
  213. package/lib/ChatCompletionStreamingRunner.mjs.map +1 -1
  214. package/lib/EventEmitter.d.mts +3 -1
  215. package/lib/EventEmitter.d.mts.map +1 -1
  216. package/lib/EventEmitter.d.ts +3 -1
  217. package/lib/EventEmitter.d.ts.map +1 -1
  218. package/lib/EventEmitter.js +2 -1
  219. package/lib/EventEmitter.js.map +1 -1
  220. package/lib/EventEmitter.mjs +2 -1
  221. package/lib/EventEmitter.mjs.map +1 -1
  222. package/lib/EventStream.d.mts +2 -1
  223. package/lib/EventStream.d.mts.map +1 -1
  224. package/lib/EventStream.d.ts +2 -1
  225. package/lib/EventStream.d.ts.map +1 -1
  226. package/lib/EventStream.js +99 -46
  227. package/lib/EventStream.js.map +1 -1
  228. package/lib/EventStream.mjs +99 -46
  229. package/lib/EventStream.mjs.map +1 -1
  230. package/lib/ResponsesParser.d.mts +5 -4
  231. package/lib/ResponsesParser.d.mts.map +1 -1
  232. package/lib/ResponsesParser.d.ts +5 -4
  233. package/lib/ResponsesParser.d.ts.map +1 -1
  234. package/lib/ResponsesParser.js +21 -7
  235. package/lib/ResponsesParser.js.map +1 -1
  236. package/lib/ResponsesParser.mjs +21 -7
  237. package/lib/ResponsesParser.mjs.map +1 -1
  238. package/lib/RunnableFunction.d.mts +2 -2
  239. package/lib/RunnableFunction.d.mts.map +1 -1
  240. package/lib/RunnableFunction.d.ts +2 -2
  241. package/lib/RunnableFunction.d.ts.map +1 -1
  242. package/lib/embeddings.d.mts.map +1 -1
  243. package/lib/embeddings.d.ts.map +1 -1
  244. package/lib/embeddings.js +18 -12
  245. package/lib/embeddings.js.map +1 -1
  246. package/lib/embeddings.mjs +18 -12
  247. package/lib/embeddings.mjs.map +1 -1
  248. package/lib/file-processing.d.mts +3 -2
  249. package/lib/file-processing.d.mts.map +1 -1
  250. package/lib/file-processing.d.ts +3 -2
  251. package/lib/file-processing.d.ts.map +1 -1
  252. package/lib/file-processing.js +5 -4
  253. package/lib/file-processing.js.map +1 -1
  254. package/lib/file-processing.mjs +5 -4
  255. package/lib/file-processing.mjs.map +1 -1
  256. package/lib/parser.d.mts +16 -4
  257. package/lib/parser.d.mts.map +1 -1
  258. package/lib/parser.d.ts +16 -4
  259. package/lib/parser.d.ts.map +1 -1
  260. package/lib/parser.js +1 -1
  261. package/lib/parser.js.map +1 -1
  262. package/lib/parser.mjs +1 -1
  263. package/lib/parser.mjs.map +1 -1
  264. package/lib/polling.d.mts +2 -2
  265. package/lib/polling.d.mts.map +1 -1
  266. package/lib/polling.d.ts +2 -2
  267. package/lib/polling.d.ts.map +1 -1
  268. package/lib/polling.js +5 -4
  269. package/lib/polling.js.map +1 -1
  270. package/lib/polling.mjs +5 -4
  271. package/lib/polling.mjs.map +1 -1
  272. package/lib/responses/EventTypes.d.mts +2 -2
  273. package/lib/responses/EventTypes.d.mts.map +1 -1
  274. package/lib/responses/EventTypes.d.ts +2 -2
  275. package/lib/responses/EventTypes.d.ts.map +1 -1
  276. package/lib/responses/ResponseInputItems.d.mts +3 -2
  277. package/lib/responses/ResponseInputItems.d.mts.map +1 -1
  278. package/lib/responses/ResponseInputItems.d.ts +3 -2
  279. package/lib/responses/ResponseInputItems.d.ts.map +1 -1
  280. package/lib/responses/ResponseInputItems.js +28 -4
  281. package/lib/responses/ResponseInputItems.js.map +1 -1
  282. package/lib/responses/ResponseInputItems.mjs +28 -4
  283. package/lib/responses/ResponseInputItems.mjs.map +1 -1
  284. package/lib/transform.d.mts.map +1 -1
  285. package/lib/transform.d.ts.map +1 -1
  286. package/lib/transform.js +1 -0
  287. package/lib/transform.js.map +1 -1
  288. package/lib/transform.mjs +1 -0
  289. package/lib/transform.mjs.map +1 -1
  290. package/lib/vector-store-polling.d.mts +2 -2
  291. package/lib/vector-store-polling.d.ts +2 -2
  292. package/lib/vector-store-polling.js +3 -3
  293. package/lib/vector-store-polling.js.map +1 -1
  294. package/lib/vector-store-polling.mjs +3 -3
  295. package/lib/vector-store-polling.mjs.map +1 -1
  296. package/lib/vector-store-upload.d.mts +2 -1
  297. package/lib/vector-store-upload.d.mts.map +1 -1
  298. package/lib/vector-store-upload.d.ts +2 -1
  299. package/lib/vector-store-upload.d.ts.map +1 -1
  300. package/lib/vector-store-upload.js +5 -1
  301. package/lib/vector-store-upload.js.map +1 -1
  302. package/lib/vector-store-upload.mjs +5 -1
  303. package/lib/vector-store-upload.mjs.map +1 -1
  304. package/package.json +1 -1
  305. package/providers/bedrock/aws.d.mts.map +1 -1
  306. package/providers/bedrock/aws.d.ts.map +1 -1
  307. package/providers/bedrock/aws.js +14 -16
  308. package/providers/bedrock/aws.js.map +1 -1
  309. package/providers/bedrock/aws.mjs +15 -17
  310. package/providers/bedrock/aws.mjs.map +1 -1
  311. package/realtime/internal-base.d.mts.map +1 -1
  312. package/realtime/internal-base.d.ts.map +1 -1
  313. package/realtime/internal-base.js +3 -5
  314. package/realtime/internal-base.js.map +1 -1
  315. package/realtime/internal-base.mjs +3 -5
  316. package/realtime/internal-base.mjs.map +1 -1
  317. package/realtime/websocket.d.mts +2 -0
  318. package/realtime/websocket.d.mts.map +1 -1
  319. package/realtime/websocket.d.ts +2 -0
  320. package/realtime/websocket.d.ts.map +1 -1
  321. package/realtime/websocket.js +12 -6
  322. package/realtime/websocket.js.map +1 -1
  323. package/realtime/websocket.mjs +12 -6
  324. package/realtime/websocket.mjs.map +1 -1
  325. package/realtime/ws.d.mts +2 -0
  326. package/realtime/ws.d.mts.map +1 -1
  327. package/realtime/ws.d.ts +2 -0
  328. package/realtime/ws.d.ts.map +1 -1
  329. package/realtime/ws.js +7 -4
  330. package/realtime/ws.js.map +1 -1
  331. package/realtime/ws.mjs +7 -4
  332. package/realtime/ws.mjs.map +1 -1
  333. package/resources/admin/organization/projects/service-accounts/api-keys.d.mts +9 -0
  334. package/resources/admin/organization/projects/service-accounts/api-keys.d.mts.map +1 -1
  335. package/resources/admin/organization/projects/service-accounts/api-keys.d.ts +9 -0
  336. package/resources/admin/organization/projects/service-accounts/api-keys.d.ts.map +1 -1
  337. package/resources/admin/organization/usage.d.mts +1 -1
  338. package/resources/admin/organization/usage.d.ts +1 -1
  339. package/resources/batches.d.mts +1 -1
  340. package/resources/batches.d.ts +1 -1
  341. package/resources/beta/beta.d.mts +2 -2
  342. package/resources/beta/beta.d.mts.map +1 -1
  343. package/resources/beta/beta.d.ts +2 -2
  344. package/resources/beta/beta.d.ts.map +1 -1
  345. package/resources/beta/beta.js.map +1 -1
  346. package/resources/beta/beta.mjs.map +1 -1
  347. package/resources/beta/index.d.mts +1 -1
  348. package/resources/beta/index.d.mts.map +1 -1
  349. package/resources/beta/index.d.ts +1 -1
  350. package/resources/beta/index.d.ts.map +1 -1
  351. package/resources/beta/index.js.map +1 -1
  352. package/resources/beta/index.mjs.map +1 -1
  353. package/resources/beta/responses/index.d.mts +1 -1
  354. package/resources/beta/responses/index.d.mts.map +1 -1
  355. package/resources/beta/responses/index.d.ts +1 -1
  356. package/resources/beta/responses/index.d.ts.map +1 -1
  357. package/resources/beta/responses/index.js.map +1 -1
  358. package/resources/beta/responses/index.mjs.map +1 -1
  359. package/resources/beta/responses/responses.d.mts +772 -50
  360. package/resources/beta/responses/responses.d.mts.map +1 -1
  361. package/resources/beta/responses/responses.d.ts +772 -50
  362. package/resources/beta/responses/responses.d.ts.map +1 -1
  363. package/resources/beta/responses/responses.js +1 -1
  364. package/resources/beta/responses/responses.js.map +1 -1
  365. package/resources/beta/responses/responses.mjs +1 -1
  366. package/resources/beta/responses/responses.mjs.map +1 -1
  367. package/resources/chat/completions/completions.d.mts +2 -2
  368. package/resources/chat/completions/completions.d.ts +2 -2
  369. package/resources/conversations/items.d.mts +10 -1
  370. package/resources/conversations/items.d.mts.map +1 -1
  371. package/resources/conversations/items.d.ts +10 -1
  372. package/resources/conversations/items.d.ts.map +1 -1
  373. package/resources/evals/evals.d.mts +4 -4
  374. package/resources/evals/evals.d.ts +4 -4
  375. package/resources/evals/runs/runs.d.mts +1 -1
  376. package/resources/evals/runs/runs.d.ts +1 -1
  377. package/resources/images.d.mts +73 -58
  378. package/resources/images.d.mts.map +1 -1
  379. package/resources/images.d.ts +73 -58
  380. package/resources/images.d.ts.map +1 -1
  381. package/resources/images.js.map +1 -1
  382. package/resources/images.mjs.map +1 -1
  383. package/resources/index.d.mts +1 -0
  384. package/resources/index.d.mts.map +1 -1
  385. package/resources/index.d.ts +1 -0
  386. package/resources/index.d.ts.map +1 -1
  387. package/resources/index.js +3 -1
  388. package/resources/index.js.map +1 -1
  389. package/resources/index.mjs +1 -0
  390. package/resources/index.mjs.map +1 -1
  391. package/resources/responses/responses.d.mts +1279 -581
  392. package/resources/responses/responses.d.mts.map +1 -1
  393. package/resources/responses/responses.d.ts +1279 -581
  394. package/resources/responses/responses.d.ts.map +1 -1
  395. package/resources/responses/responses.js +1 -1
  396. package/resources/responses/responses.js.map +1 -1
  397. package/resources/responses/responses.mjs +1 -1
  398. package/resources/responses/responses.mjs.map +1 -1
  399. package/resources/safety/alerts.d.mts +32 -0
  400. package/resources/safety/alerts.d.mts.map +1 -0
  401. package/resources/safety/alerts.d.ts +32 -0
  402. package/resources/safety/alerts.d.ts.map +1 -0
  403. package/resources/safety/alerts.js +16 -0
  404. package/resources/safety/alerts.js.map +1 -0
  405. package/resources/safety/alerts.mjs +12 -0
  406. package/resources/safety/alerts.mjs.map +1 -0
  407. package/resources/safety/index.d.mts +3 -0
  408. package/resources/safety/index.d.mts.map +1 -0
  409. package/resources/safety/index.d.ts +3 -0
  410. package/resources/safety/index.d.ts.map +1 -0
  411. package/resources/safety/index.js +9 -0
  412. package/resources/safety/index.js.map +1 -0
  413. package/resources/safety/index.mjs +4 -0
  414. package/resources/safety/index.mjs.map +1 -0
  415. package/resources/safety/safety.d.mts +10 -0
  416. package/resources/safety/safety.d.mts.map +1 -0
  417. package/resources/safety/safety.d.ts +10 -0
  418. package/resources/safety/safety.d.ts.map +1 -0
  419. package/resources/safety/safety.js +17 -0
  420. package/resources/safety/safety.js.map +1 -0
  421. package/resources/safety/safety.mjs +12 -0
  422. package/resources/safety/safety.mjs.map +1 -0
  423. package/resources/safety.d.mts +2 -0
  424. package/resources/safety.d.mts.map +1 -0
  425. package/resources/safety.d.ts +2 -0
  426. package/resources/safety.d.ts.map +1 -0
  427. package/resources/safety.js +6 -0
  428. package/resources/safety.js.map +1 -0
  429. package/resources/safety.mjs +3 -0
  430. package/resources/safety.mjs.map +1 -0
  431. package/resources/shared.d.mts +29 -1
  432. package/resources/shared.d.mts.map +1 -1
  433. package/resources/shared.d.ts +29 -1
  434. package/resources/shared.d.ts.map +1 -1
  435. package/resources/videos.d.mts +28 -0
  436. package/resources/videos.d.mts.map +1 -1
  437. package/resources/videos.d.ts +28 -0
  438. package/resources/videos.d.ts.map +1 -1
  439. package/resources/webhooks/webhooks.d.mts +68 -6
  440. package/resources/webhooks/webhooks.d.mts.map +1 -1
  441. package/resources/webhooks/webhooks.d.ts +68 -6
  442. package/resources/webhooks/webhooks.d.ts.map +1 -1
  443. package/src/_vendor/partial-json-parser/parser.ts +4 -3
  444. package/src/_vendor/zod-to-json-schema/parsers/string.ts +1 -1
  445. package/src/_vendor/zod-to-json-schema/parsers/tuple.ts +23 -16
  446. package/src/_vendor/zod-to-json-schema/zodToJsonSchema.ts +11 -6
  447. package/src/auth/subject-token-providers.ts +12 -7
  448. package/src/auth/workload-identity-auth.ts +27 -12
  449. package/src/azure.ts +34 -3
  450. package/src/beta/realtime/internal-base.ts +3 -2
  451. package/src/beta/realtime/websocket.ts +17 -7
  452. package/src/beta/realtime/ws.ts +9 -5
  453. package/src/client.ts +24 -4
  454. package/src/core/EventEmitter.ts +5 -8
  455. package/src/core/pagination.ts +1 -1
  456. package/src/core/streaming.ts +69 -13
  457. package/src/helpers/audio.ts +27 -6
  458. package/src/helpers/zod.ts +78 -29
  459. package/src/internal/bedrock.ts +84 -58
  460. package/src/internal/detect-platform.ts +2 -2
  461. package/src/internal/errors.ts +3 -2
  462. package/src/internal/headers.ts +7 -5
  463. package/src/internal/parse.ts +1 -1
  464. package/src/internal/realtime-credentials.ts +27 -0
  465. package/src/internal/responses/response-accumulator.ts +1 -0
  466. package/src/internal/to-file.ts +6 -5
  467. package/src/internal/uploads.ts +12 -1
  468. package/src/internal/utils/base64.ts +3 -0
  469. package/src/lib/AbstractChatCompletionRunner.ts +31 -6
  470. package/src/lib/AssistantStream.ts +25 -11
  471. package/src/lib/ChatCompletionRunner.ts +8 -4
  472. package/src/lib/ChatCompletionStream.ts +8 -0
  473. package/src/lib/ChatCompletionStreamingRunner.ts +1 -0
  474. package/src/lib/EventEmitter.ts +17 -8
  475. package/src/lib/EventStream.ts +105 -52
  476. package/src/lib/ResponsesParser.ts +33 -12
  477. package/src/lib/RunnableFunction.ts +2 -2
  478. package/src/lib/embeddings.ts +18 -12
  479. package/src/lib/file-processing.ts +5 -4
  480. package/src/lib/parser.ts +35 -11
  481. package/src/lib/polling.ts +5 -4
  482. package/src/lib/responses/EventTypes.ts +3 -69
  483. package/src/lib/responses/ResponseInputItems.ts +30 -4
  484. package/src/lib/transform.ts +1 -0
  485. package/src/lib/vector-store-polling.ts +3 -3
  486. package/src/lib/vector-store-upload.ts +5 -1
  487. package/src/providers/bedrock/aws.ts +23 -24
  488. package/src/realtime/internal-base.ts +3 -5
  489. package/src/realtime/websocket.ts +14 -6
  490. package/src/realtime/ws.ts +9 -4
  491. package/src/resources/admin/organization/projects/service-accounts/api-keys.ts +11 -0
  492. package/src/resources/admin/organization/usage.ts +1 -1
  493. package/src/resources/batches.ts +1 -1
  494. package/src/resources/beta/beta.ts +22 -0
  495. package/src/resources/beta/index.ts +11 -0
  496. package/src/resources/beta/responses/index.ts +11 -0
  497. package/src/resources/beta/responses/responses.ts +944 -39
  498. package/src/resources/chat/completions/completions.ts +2 -2
  499. package/src/resources/conversations/items.ts +12 -0
  500. package/src/resources/evals/evals.ts +4 -4
  501. package/src/resources/evals/runs/runs.ts +1 -1
  502. package/src/resources/images.ts +76 -57
  503. package/src/resources/index.ts +1 -0
  504. package/src/resources/responses/api.md +11 -0
  505. package/src/resources/responses/responses.ts +1395 -520
  506. package/src/resources/safety/alerts.ts +51 -0
  507. package/src/resources/safety/index.ts +4 -0
  508. package/src/resources/safety/safety.ts +15 -0
  509. package/src/resources/safety.ts +3 -0
  510. package/src/resources/shared.ts +39 -0
  511. package/src/resources/videos.ts +38 -0
  512. package/src/resources/webhooks/api.md +2 -0
  513. package/src/resources/webhooks/webhooks.ts +83 -5
  514. package/src/version.ts +1 -1
  515. package/version.d.mts +1 -1
  516. package/version.d.mts.map +1 -1
  517. package/version.d.ts +1 -1
  518. package/version.d.ts.map +1 -1
  519. package/version.js +1 -1
  520. package/version.js.map +1 -1
  521. package/version.mjs +1 -1
  522. package/version.mjs.map +1 -1
@@ -290,7 +290,7 @@ export function assertValidBedrockBearerCredential(credential: string): void {
290
290
  }
291
291
  }
292
292
 
293
- interface BedrockBearerSignalFailure {
293
+ interface BedrockAuthSignalFailure {
294
294
  error?: { value: unknown };
295
295
  removeListeners?: () => void;
296
296
  }
@@ -313,13 +313,13 @@ function removeBedrockAbortListener(signal: AbortSignal, listener: () => void):
313
313
  }
314
314
  }
315
315
 
316
- function resolveAbortableBedrockBearerToken(
317
- tokenProvider: ApiKeySetter,
316
+ function resolveAbortableBedrockAuth<T>(
317
+ operation: () => Promise<T>,
318
318
  signals: readonly AbortSignal[],
319
- failure: BedrockBearerSignalFailure,
320
- ): Promise<string> {
319
+ failure: BedrockAuthSignalFailure,
320
+ ): Promise<T> {
321
321
  // oxlint-disable-next-line promise/avoid-new -- AbortSignal events require a Promise callback bridge.
322
- return new Promise<string>((resolve, reject) => {
322
+ return new Promise<T>((resolve, reject) => {
323
323
  let settled = false;
324
324
  const listeners: { signal: AbortSignal; listener: () => void }[] = [];
325
325
 
@@ -333,13 +333,13 @@ function resolveAbortableBedrockBearerToken(
333
333
  };
334
334
  failure.removeListeners = removeListeners;
335
335
 
336
- const settle = (result: { token: string } | { error: unknown }) => {
336
+ const settle = (result: { value: T } | { error: unknown }) => {
337
337
  if (settled) {
338
338
  return;
339
339
  }
340
340
  settled = true;
341
- if ('token' in result) {
342
- resolve(result.token);
341
+ if ('value' in result) {
342
+ resolve(result.value);
343
343
  } else {
344
344
  removeListeners();
345
345
  reject(result.error);
@@ -399,26 +399,75 @@ function resolveAbortableBedrockBearerToken(
399
399
  }
400
400
  }
401
401
 
402
- let token: Promise<string>;
402
+ let pending: Promise<T>;
403
403
  try {
404
- token = tokenProvider();
404
+ pending = operation();
405
405
  } catch (error) {
406
406
  settle({ error });
407
407
  return;
408
408
  }
409
409
 
410
- const observeToken = async () => {
410
+ const observeResult = async () => {
411
411
  try {
412
- settle({ token: await token });
412
+ settle({ value: await pending });
413
413
  } catch (error) {
414
414
  settle({ error });
415
415
  }
416
416
  };
417
417
  // Observe the result even if the provider synchronously triggered cancellation.
418
- void observeToken();
418
+ void observeResult();
419
419
  });
420
420
  }
421
421
 
422
+ /**
423
+ * Resolves Bedrock authentication work with caller cancellation, then applies
424
+ * its result synchronously after the final cancellation checks.
425
+ *
426
+ * @internal
427
+ */
428
+ export async function prepareBedrockAuth<T>(
429
+ request: FinalizedRequestInit,
430
+ context: ProviderRequestContext,
431
+ operation: {
432
+ resolve: () => Promise<T>;
433
+ failureMessage: string;
434
+ apply: (value: T) => void;
435
+ },
436
+ ): Promise<void> {
437
+ const signals: AbortSignal[] = [];
438
+ for (const signal of [context.options.signal, request.signal]) {
439
+ if (signal != null && !signals.includes(signal)) {
440
+ signals.push(signal);
441
+ }
442
+ }
443
+ const signalFailure: BedrockAuthSignalFailure = {};
444
+ let value: T;
445
+ try {
446
+ try {
447
+ value =
448
+ signals.length > 0
449
+ ? await resolveAbortableBedrockAuth(operation.resolve, signals, signalFailure)
450
+ : await operation.resolve();
451
+ } catch (cause) {
452
+ if (signalFailure.error && Object.is(cause, signalFailure.error.value)) {
453
+ throw cause;
454
+ }
455
+ throw errorWithCause(operation.failureMessage, cause);
456
+ }
457
+ if (signalFailure.error) {
458
+ throw signalFailure.error.value;
459
+ }
460
+ for (const signal of signals) {
461
+ if (signal.aborted) {
462
+ throw createBedrockUserAbortError(signal);
463
+ }
464
+ }
465
+ } finally {
466
+ signalFailure.removeListeners?.();
467
+ }
468
+ operation.apply(value);
469
+ }
470
+
422
471
  class BedrockBearerAuth implements BedrockRequestAuth {
423
472
  private readonly tokenProvider: ApiKeySetter;
424
473
 
@@ -430,52 +479,29 @@ class BedrockBearerAuth implements BedrockRequestAuth {
430
479
  const headers = new Headers(request.headers);
431
480
  assertProviderOwnsAuthorization(headers);
432
481
 
433
- const signals: AbortSignal[] = [];
434
- for (const signal of [context.options.signal, request.signal]) {
435
- if (signal != null && !signals.includes(signal)) {
436
- signals.push(signal);
437
- }
438
- }
439
- const signalFailure: BedrockBearerSignalFailure = {};
440
- let token: unknown;
441
- try {
442
- try {
443
- token =
444
- signals.length > 0
445
- ? await resolveAbortableBedrockBearerToken(() => this.tokenProvider(), signals, signalFailure)
446
- : await this.tokenProvider();
447
- } catch (cause) {
448
- if (signalFailure.error && Object.is(cause, signalFailure.error.value)) {
449
- throw cause;
482
+ await prepareBedrockAuth(request, context, {
483
+ resolve: () => this.tokenProvider(),
484
+ failureMessage: 'Failed to resolve a bearer credential for Bedrock.',
485
+ apply: (token) => {
486
+ if (typeof token !== 'string' || !token.trim()) {
487
+ throw new Errors.OpenAIError(
488
+ 'The Bedrock bearer credential provider must return a non-empty string.',
489
+ );
450
490
  }
451
- throw errorWithCause('Failed to resolve a bearer credential for Bedrock.', cause);
452
- }
453
- if (signalFailure.error) {
454
- throw signalFailure.error.value;
455
- }
456
- for (const signal of signals) {
457
- if (signal.aborted) {
458
- throw createBedrockUserAbortError(signal);
491
+ assertValidBedrockBearerCredential(token);
492
+ try {
493
+ headers.set('authorization', `Bearer ${token}`);
494
+ } catch (error) {
495
+ if (error instanceof TypeError) {
496
+ // oxlint-disable-next-line eslint/preserve-caught-error -- The original error contains the bearer credential.
497
+ throw new TypeError('Bedrock bearer credential contains an invalid HTTP header value.');
498
+ }
499
+ throw error;
459
500
  }
460
- }
461
- } finally {
462
- signalFailure.removeListeners?.();
463
- }
464
- if (typeof token !== 'string' || !token.trim()) {
465
- throw new Errors.OpenAIError('The Bedrock bearer credential provider must return a non-empty string.');
466
- }
467
- assertValidBedrockBearerCredential(token);
468
- try {
469
- headers.set('authorization', `Bearer ${token}`);
470
- } catch (error) {
471
- if (error instanceof TypeError) {
472
- // oxlint-disable-next-line eslint/preserve-caught-error -- The original error contains the bearer credential.
473
- throw new TypeError('Bedrock bearer credential contains an invalid HTTP header value.');
474
- }
475
- throw error;
476
- }
477
- request.redirect = 'manual';
478
- request.headers = headers;
501
+ request.redirect = 'manual';
502
+ request.headers = headers;
503
+ },
504
+ });
479
505
  }
480
506
  }
481
507
 
@@ -75,7 +75,7 @@ const getPlatformProperties = (): PlatformProperties => {
75
75
  'X-Stainless-OS': 'Unknown',
76
76
  'X-Stainless-Arch': `other:${EdgeRuntime}`,
77
77
  'X-Stainless-Runtime': 'edge',
78
- 'X-Stainless-Runtime-Version': (globalThis as any).process.version,
78
+ 'X-Stainless-Runtime-Version': (globalThis as any).process?.version ?? 'unknown',
79
79
  };
80
80
  }
81
81
  // Check if Node.js
@@ -128,7 +128,7 @@ function getBrowserInfo(): BrowserInfo | null {
128
128
 
129
129
  // NOTE: The order matters here!
130
130
  const browserPatterns = [
131
- { key: 'edge' as const, pattern: /Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
131
+ { key: 'edge' as const, pattern: /\bEdg(?:e|A|iOS)?\b(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
132
132
  { key: 'ie' as const, pattern: /MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
133
133
  { key: 'ie' as const, pattern: /Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/ },
134
134
  { key: 'chrome' as const, pattern: /Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ },
@@ -14,11 +14,12 @@ export const castToError = (err: any): Error => {
14
14
  if (typeof err === 'object' && err !== null) {
15
15
  try {
16
16
  if (Object.prototype.toString.call(err) === '[object Error]') {
17
+ const hasCause = 'cause' in err;
17
18
  // @ts-ignore - not all envs have native support for cause yet
18
- const error = new Error(err.message, err.cause ? { cause: err.cause } : {});
19
+ const error = new Error(err.message, hasCause ? { cause: err.cause } : {});
19
20
  if (err.stack) error.stack = err.stack;
20
21
  // @ts-ignore - not all envs have native support for cause yet
21
- if (err.cause && !error.cause) error.cause = err.cause;
22
+ if (hasCause && !Object.prototype.hasOwnProperty.call(error, 'cause')) error.cause = err.cause;
22
23
  if (err.name) error.name = err.name;
23
24
  return error;
24
25
  }
@@ -1,6 +1,7 @@
1
1
  import { isReadonlyArray } from './utils/values';
2
2
 
3
3
  type HeaderValue = string | undefined | null;
4
+ type HeaderEntry = readonly (HeaderValue | readonly HeaderValue[])[];
4
5
  export type HeadersLike =
5
6
  | Headers
6
7
  | readonly HeaderValue[][]
@@ -39,11 +40,12 @@ function* iterateHeaders(headers: HeadersLike): IterableIterator<readonly [strin
39
40
  }
40
41
 
41
42
  let shouldClear = false;
42
- let iter: Iterable<readonly (HeaderValue | readonly HeaderValue[])[]>;
43
- if (headers instanceof Headers) {
44
- iter = headers.entries();
45
- } else if (isReadonlyArray(headers)) {
46
- iter = headers;
43
+ let iter: Iterable<HeaderEntry>;
44
+ // Snapshot the iterable protocol across realms without rereading a caller-controlled getter.
45
+ const iterator: (() => Iterator<HeaderEntry>) | undefined =
46
+ Symbol.iterator in headers ? headers[Symbol.iterator] : undefined;
47
+ if (typeof iterator === 'function') {
48
+ iter = { [Symbol.iterator]: () => iterator.call(headers) };
47
49
  } else {
48
50
  shouldClear = true;
49
51
  iter = Object.entries(headers ?? {});
@@ -53,7 +53,7 @@ export async function defaultParseResponse<T>(
53
53
  }
54
54
 
55
55
  const contentType = response.headers.get('content-type');
56
- const mediaType = contentType?.split(';')[0]?.trim();
56
+ const mediaType = contentType?.split(';')[0]?.trim().toLowerCase();
57
57
  const isJSON = mediaType?.includes('application/json') || mediaType?.endsWith('+json');
58
58
  if (isJSON) {
59
59
  const contentLength = response.headers.get('content-length');
@@ -0,0 +1,27 @@
1
+ import type { OpenAI } from '../client';
2
+
3
+ /** Selects a captured credential without treating an explicit null as absent. @internal */
4
+ export function getRealtimeAPIKey(
5
+ client: Pick<OpenAI, 'apiKey'> | undefined,
6
+ captured: string | null | undefined,
7
+ ): string | null | undefined {
8
+ return captured === undefined ? client?.apiKey : captured;
9
+ }
10
+
11
+ /**
12
+ * Captures the key belonging to this factory invocation while retaining the
13
+ * existing boolean credential-hook contract. Legacy overrides that do not
14
+ * capture a key keep their shared-property behavior and remain responsible for
15
+ * synchronizing concurrent credential updates.
16
+ * @internal
17
+ */
18
+ export async function resolveRealtimeAPIKey(client: Pick<OpenAI, 'apiKey' | '_callApiKey'>): Promise<{
19
+ apiKey: string | null;
20
+ isProvider: boolean;
21
+ }> {
22
+ let apiKey: string | null | undefined;
23
+ const isProvider = await client._callApiKey((resolved) => {
24
+ apiKey = resolved;
25
+ });
26
+ return { apiKey: apiKey === undefined ? client.apiKey : apiKey, isProvider };
27
+ }
@@ -153,6 +153,7 @@ function validateArrayIndex(
153
153
  allowAppend = false,
154
154
  ): void {
155
155
  if (
156
+ !Array.isArray(collection) ||
156
157
  !Number.isSafeInteger(index) ||
157
158
  index < 0 ||
158
159
  index > collection.length ||
@@ -1,5 +1,5 @@
1
1
  import type { BlobPart } from './uploads';
2
- import { getName, makeFile, isAsyncIterable, checkFileSupport } from './uploads';
2
+ import { getName, makeFile, isAsyncIterable, isArrayBuffer, checkFileSupport } from './uploads';
3
3
  import type { FilePropertyBag } from './builtin-types';
4
4
 
5
5
  /** Text, binary content, or a Blob-compatible value accepted inside a file stream. */
@@ -106,7 +106,8 @@ export type ToFileInput =
106
106
  * filename and metadata are unchanged. Renamed native files reuse the original
107
107
  * file contents without buffering and retain their MIME type and modification
108
108
  * time unless explicitly overridden. Other filenames are inferred from response
109
- * URLs or input metadata when omitted, falling back to `unknown_file`. Responses,
109
+ * URLs or input metadata when omitted or null, falling back to `unknown_file`.
110
+ * An explicit empty filename is preserved. Responses,
110
111
  * native or compatible `Blob` values, and compatible non-native files supply
111
112
  * their MIME type unless `options.type` provides an explicit override.
112
113
  *
@@ -148,7 +149,7 @@ export async function toFile(
148
149
 
149
150
  if (isResponseLike(value)) {
150
151
  const blob = await value.blob();
151
- name ||= getName(value);
152
+ name ??= getName(value);
152
153
 
153
154
  const responseOptions =
154
155
  options?.type === undefined && blob.type ? { ...options, type: blob.type } : options;
@@ -157,7 +158,7 @@ export async function toFile(
157
158
 
158
159
  const parts = await getBytes(value);
159
160
 
160
- name ||= getName(value);
161
+ name ??= getName(value);
161
162
 
162
163
  if (options?.type === undefined) {
163
164
  const typedPart = parts.find(
@@ -176,7 +177,7 @@ async function getBytes(value: BlobLikePart | AsyncIterable<BlobLikePart>): Prom
176
177
  if (
177
178
  typeof value === 'string' ||
178
179
  ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc.
179
- value instanceof ArrayBuffer
180
+ isArrayBuffer(value)
180
181
  ) {
181
182
  parts.push(value);
182
183
  } else if (isBlobLike(value)) {
@@ -196,6 +196,17 @@ function normalizeFilenamePath(value: string): string {
196
196
  return normalized;
197
197
  }
198
198
 
199
+ const arrayBufferByteLengthGetter = Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, 'byteLength')?.get;
200
+
201
+ /** Recognizes native ArrayBuffers across realms without trusting their prototype or string tag. */
202
+ export function isArrayBuffer(value: unknown): value is ArrayBuffer {
203
+ try {
204
+ return arrayBufferByteLengthGetter?.call(value) !== undefined;
205
+ } catch {
206
+ return false;
207
+ }
208
+ }
209
+
199
210
  /** Identifies objects that expose a callable `Symbol.asyncIterator` method. */
200
211
  export const isAsyncIterable = (value: any): value is AsyncIterable<any> =>
201
212
  value != null && typeof value === 'object' && typeof value[Symbol.asyncIterator] === 'function';
@@ -538,7 +549,7 @@ async function* iterateBytes(value: unknown): AsyncGenerator<Uint8Array> {
538
549
  yield encodeUTF8(value);
539
550
  } else if (ArrayBuffer.isView(value)) {
540
551
  yield new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
541
- } else if (value instanceof ArrayBuffer) {
552
+ } else if (isArrayBuffer(value)) {
542
553
  yield new Uint8Array(value);
543
554
  } else if (value instanceof Response) {
544
555
  yield* iterateBytes(value.body || (await value.blob()));
@@ -46,6 +46,9 @@ export const toFloat32Array = (base64Str: string): Array<number> => {
46
46
  if (typeof Buffer !== 'undefined') {
47
47
  // for Node.js environment
48
48
  const buf = Buffer.from(base64Str, 'base64');
49
+ if (buf.length % Float32Array.BYTES_PER_ELEMENT !== 0) {
50
+ throw new RangeError('Invalid base64-encoded float32 array: byte length must be a multiple of 4');
51
+ }
49
52
  return Array.from(
50
53
  new Float32Array(buf.buffer, buf.byteOffset, buf.length / Float32Array.BYTES_PER_ELEMENT),
51
54
  );
@@ -128,6 +128,7 @@ export class AbstractChatCompletionRunner<
128
128
  > extends EventStream<EventTypes> {
129
129
  protected _chatCompletions: ParsedChatCompletion<ParsedT>[] = [];
130
130
  #completionArrivedBeforeAbort = false;
131
+ #afterCompletionInvoked = false;
131
132
  /** Mutable conversation history, including initial input, assistant replies, and tool results. */
132
133
  messages: ChatCompletionMessageParam[] = [];
133
134
 
@@ -150,8 +151,9 @@ export class AbstractChatCompletionRunner<
150
151
  this: AbstractChatCompletionRunner<AbstractChatCompletionRunnerEvents, ParsedT>,
151
152
  message: ChatCompletionMessageParam,
152
153
  emit = true,
154
+ normalizeContent = true,
153
155
  ) {
154
- if (!('content' in message)) {
156
+ if (normalizeContent && !('content' in message)) {
155
157
  message.content = null;
156
158
  }
157
159
 
@@ -305,6 +307,9 @@ export class AbstractChatCompletionRunner<
305
307
  protected override _emitFinal(
306
308
  this: AbstractChatCompletionRunner<AbstractChatCompletionRunnerEvents, ParsedT>,
307
309
  ) {
310
+ if (this.#afterCompletionInvoked) {
311
+ this.#throwIfAborted();
312
+ }
308
313
  const completion = this._chatCompletions[this._chatCompletions.length - 1];
309
314
  if (completion) {
310
315
  this._emit('finalChatCompletion', completion);
@@ -333,6 +338,18 @@ export class AbstractChatCompletionRunner<
333
338
  }
334
339
  }
335
340
 
341
+ #throwIfAborted() {
342
+ if (this.controller.signal.aborted) {
343
+ const error = new APIUserAbortError();
344
+ Object.defineProperty(error, 'cause', {
345
+ value: this.controller.signal.reason,
346
+ writable: true,
347
+ configurable: true,
348
+ });
349
+ throw error;
350
+ }
351
+ }
352
+
336
353
  static #validateParams(params: ChatCompletionCreateParams): void {
337
354
  if (params.n != null && params.n > 1) {
338
355
  throw new OpenAIError(
@@ -363,7 +380,7 @@ export class AbstractChatCompletionRunner<
363
380
  options?: RequestOptions,
364
381
  ): Promise<ChatCompletion> {
365
382
  for (const message of params.messages) {
366
- this._addMessage(message, false);
383
+ this._addMessage(message, false, false);
367
384
  }
368
385
  return await this._createChatCompletion(client, params, options);
369
386
  }
@@ -384,6 +401,14 @@ export class AbstractChatCompletionRunner<
384
401
  const singleFunctionToCall =
385
402
  typeof tool_choice !== 'string' && tool_choice.type === 'function' && tool_choice?.function?.name;
386
403
  const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS, afterCompletion } = options || {};
404
+ const runAfterCompletion = async (completion: ChatCompletion) => {
405
+ if (afterCompletion == null) {
406
+ return;
407
+ }
408
+ this.#afterCompletionInvoked = true;
409
+ await afterCompletion(completion, runner);
410
+ this.#throwIfAborted();
411
+ };
387
412
 
388
413
  // Normalize tool definitions before invoking callbacks.
389
414
  const inputTools = params.tools.map((tool): RunnableToolFunction<any> => {
@@ -433,7 +458,7 @@ export class AbstractChatCompletionRunner<
433
458
  : (undefined as any);
434
459
 
435
460
  for (const message of params.messages) {
436
- this._addMessage(message, false);
461
+ this._addMessage(message, false, false);
437
462
  }
438
463
 
439
464
  type ToolCallResult = {
@@ -519,7 +544,7 @@ export class AbstractChatCompletionRunner<
519
544
  throw new OpenAIError(`missing message in ChatCompletion response`);
520
545
  }
521
546
  if (!message.tool_calls?.length) {
522
- await afterCompletion?.(chatCompletion, runner);
547
+ await runAfterCompletion(chatCompletion);
523
548
  return;
524
549
  }
525
550
 
@@ -534,7 +559,7 @@ export class AbstractChatCompletionRunner<
534
559
  }
535
560
 
536
561
  if (singleFunctionToCall && result.functionCalled) {
537
- await afterCompletion?.(chatCompletion, runner);
562
+ await runAfterCompletion(chatCompletion);
538
563
  return;
539
564
  }
540
565
  }
@@ -563,7 +588,7 @@ export class AbstractChatCompletionRunner<
563
588
  }
564
589
  }
565
590
 
566
- await afterCompletion?.(chatCompletion, runner);
591
+ await runAfterCompletion(chatCompletion);
567
592
  }
568
593
  }
569
594
 
@@ -20,7 +20,7 @@ import type {
20
20
  } from '../resources/beta/threads/runs/runs';
21
21
  import type { ReadableStream } from '../internal/shim-types';
22
22
  import { Stream } from '../streaming';
23
- import { APIUserAbortError, OpenAIError } from '../error';
23
+ import { APIError, APIUserAbortError, OpenAIError } from '../error';
24
24
  import type {
25
25
  AssistantStreamEvent,
26
26
  MessageStreamEvent,
@@ -322,7 +322,10 @@ export class AssistantStream
322
322
  return Object.values(this.#runStepSnapshots);
323
323
  }
324
324
 
325
- /** Waits for successful completion and returns the final snapshot of every observed message. */
325
+ /**
326
+ * Waits for successful completion and returns the final snapshot of every observed message.
327
+ * Terminal message events replace accumulated snapshots without mutating earlier snapshots.
328
+ */
326
329
  async finalMessages(): Promise<Message[]> {
327
330
  await this.done();
328
331
 
@@ -479,6 +482,9 @@ export class AssistantStream
479
482
  case 'thread.message.delta':
480
483
  case 'thread.message.completed':
481
484
  case 'thread.message.incomplete': {
485
+ if (messageID !== undefined && this.#messageSnapshot) {
486
+ this.#reserveMessageAlias(this.#messageSnapshot, messageID);
487
+ }
482
488
  this.#handleMessage(stableEvent);
483
489
  if (messageID !== undefined) {
484
490
  this.#reserveMessageAlias(stableEvent.data, messageID);
@@ -491,10 +497,7 @@ export class AssistantStream
491
497
  }
492
498
 
493
499
  case 'error': {
494
- //This is included for completeness, but errors are processed in the SSE event processing so this should not occur
495
- throw new Error(
496
- 'Encountered an error event in event processing - errors should be processed earlier',
497
- );
500
+ throw new APIError(undefined, stableEvent.data, undefined, undefined);
498
501
  }
499
502
  default: {
500
503
  assertNever(stableEvent);
@@ -522,6 +525,13 @@ export class AssistantStream
522
525
  throw new OpenAIError('Received assistant run-step event with an invalid run-step ID');
523
526
  }
524
527
 
528
+ if (event.event === 'thread.run.step.delta') {
529
+ const delta = event.data.delta;
530
+ if (delta && hasOwn(delta, 'id')) {
531
+ throw new OpenAIError('Run-step deltas must not contain an id field');
532
+ }
533
+ }
534
+
525
535
  if (event.event === 'thread.run.step.created') {
526
536
  if (this.#activeRunStepID !== undefined) {
527
537
  throw new OpenAIError(
@@ -839,10 +849,14 @@ export class AssistantStream
839
849
  throw new Error('Received a RunStepDelta before creation of a snapshot');
840
850
  }
841
851
 
842
- const data = event.data;
852
+ const delta = event.data.delta;
843
853
 
844
- if (data.delta) {
845
- const accumulated = accumulateAssistantStreamDelta(snapshot, data.delta, true) as Runs.RunStep;
854
+ if (delta) {
855
+ // Raw-event listeners can replace or modify the delta after initial validation.
856
+ if (hasOwn(delta, 'id')) {
857
+ throw new OpenAIError('Run-step deltas must not contain an id field');
858
+ }
859
+ const accumulated = accumulateAssistantStreamDelta(snapshot, delta, true) as Runs.RunStep;
846
860
  this.#runStepSnapshots[runStepID] = accumulated;
847
861
  }
848
862
 
@@ -921,9 +935,9 @@ export class AssistantStream
921
935
  case 'thread.message.in_progress':
922
936
  case 'thread.message.completed':
923
937
  case 'thread.message.incomplete': {
924
- //No changes on other thread events
938
+ //Terminal events provide the authoritative message snapshot.
925
939
  if (snapshot) {
926
- return [snapshot, newContent];
940
+ return [event.event === 'thread.message.in_progress' ? snapshot : event.data, newContent];
927
941
  }
928
942
  throw new Error('Received thread message event with no existing snapshot');
929
943
  }
@@ -11,7 +11,7 @@ import type { AutoParseableTool } from '../lib/parser';
11
11
 
12
12
  /** Events emitted while executing a non-streaming chat completion tool run. */
13
13
  export interface ChatCompletionRunnerEvents extends AbstractChatCompletionRunnerEvents {
14
- /** Called when an assistant message with nonempty text content is received. */
14
+ /** Called when a new assistant message with nonempty text is received; input history is not emitted. */
15
15
  content: (content: string) => void;
16
16
  }
17
17
 
@@ -88,14 +88,18 @@ export class ChatCompletionRunner<ParsedT = null> extends AbstractChatCompletion
88
88
  return runner;
89
89
  }
90
90
 
91
- /** Appends a conversation message and emits text content for assistant replies. */
91
+ /**
92
+ * Appends a conversation message and emits text content for assistant replies.
93
+ * @param normalizeContent Defaults to true; initial history passes false to preserve caller-owned messages.
94
+ */
92
95
  override _addMessage(
93
96
  this: ChatCompletionRunner<ParsedT>,
94
97
  message: ChatCompletionMessageParam,
95
98
  emit = true,
99
+ normalizeContent = true,
96
100
  ) {
97
- super._addMessage(message, emit);
98
- if (isAssistantMessage(message) && message.content) {
101
+ super._addMessage(message, emit, normalizeContent);
102
+ if (emit && isAssistantMessage(message) && message.content) {
99
103
  this._emit('content', message.content as string);
100
104
  }
101
105
  }
@@ -1,5 +1,6 @@
1
1
  import { MalformedJSON, partialParse } from '../_vendor/partial-json-parser/parser';
2
2
  import {
3
+ APIError,
3
4
  APIUserAbortError,
4
5
  ContentFilterFinishReasonError,
5
6
  LengthFinishReasonError,
@@ -1517,6 +1518,9 @@ export class ChatCompletionStream<ParsedT = null>
1517
1518
  );
1518
1519
  }
1519
1520
 
1521
+ if (choiceSnapshot.finish_reason) {
1522
+ state.done_tool_calls.add(toolCallIndex);
1523
+ }
1520
1524
  this._emit('tool_calls.function.arguments.done', {
1521
1525
  name: toolCallSnapshot.function.name,
1522
1526
  index: toolCallIndex,
@@ -1771,6 +1775,10 @@ export class ChatCompletionStream<ParsedT = null>
1771
1775
  );
1772
1776
  let chatId;
1773
1777
  for await (const item of stream) {
1778
+ if ('error' in item && hasOwn(item, 'error') && typeof item.error === 'object' && item.error !== null) {
1779
+ throw new APIError(undefined, item.error, undefined, undefined);
1780
+ }
1781
+
1774
1782
  if (isChatCompletionReadableStreamMessage(item)) {
1775
1783
  const message = getChatCompletionReadableStreamMessage(item);
1776
1784
  if (this.#currentChatCompletionSnapshot) {
@@ -96,6 +96,7 @@ export class ChatCompletionStreamingRunner<ParsedT = null>
96
96
  throw new OpenAIError('cannot serialize a tool message before receiving any chunks');
97
97
  }
98
98
  push(makeChatCompletionReadableStreamMessageChunk(lastChunk, message, toolCallIds));
99
+ toolCallIds = undefined;
99
100
  }
100
101
  };
101
102
  this.on('chunk', onChunk);