openai 6.43.0 → 6.45.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 (317) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +85 -102
  3. package/_vendor/zod-to-json-schema/parseDef.d.mts.map +1 -1
  4. package/_vendor/zod-to-json-schema/parseDef.d.ts.map +1 -1
  5. package/_vendor/zod-to-json-schema/parseDef.js +41 -15
  6. package/_vendor/zod-to-json-schema/parseDef.js.map +1 -1
  7. package/_vendor/zod-to-json-schema/parseDef.mjs +41 -15
  8. package/_vendor/zod-to-json-schema/parseDef.mjs.map +1 -1
  9. package/_vendor/zod-to-json-schema/parsers/branded.d.mts +1 -1
  10. package/_vendor/zod-to-json-schema/parsers/branded.d.mts.map +1 -1
  11. package/_vendor/zod-to-json-schema/parsers/branded.d.ts +1 -1
  12. package/_vendor/zod-to-json-schema/parsers/branded.d.ts.map +1 -1
  13. package/_vendor/zod-to-json-schema/parsers/branded.js +2 -2
  14. package/_vendor/zod-to-json-schema/parsers/branded.js.map +1 -1
  15. package/_vendor/zod-to-json-schema/parsers/branded.mjs +2 -2
  16. package/_vendor/zod-to-json-schema/parsers/branded.mjs.map +1 -1
  17. package/_vendor/zod-to-json-schema/parsers/catch.d.mts +1 -1
  18. package/_vendor/zod-to-json-schema/parsers/catch.d.mts.map +1 -1
  19. package/_vendor/zod-to-json-schema/parsers/catch.d.ts +1 -1
  20. package/_vendor/zod-to-json-schema/parsers/catch.d.ts.map +1 -1
  21. package/_vendor/zod-to-json-schema/parsers/catch.js +2 -2
  22. package/_vendor/zod-to-json-schema/parsers/catch.js.map +1 -1
  23. package/_vendor/zod-to-json-schema/parsers/catch.mjs +2 -2
  24. package/_vendor/zod-to-json-schema/parsers/catch.mjs.map +1 -1
  25. package/_vendor/zod-to-json-schema/parsers/default.d.mts +1 -1
  26. package/_vendor/zod-to-json-schema/parsers/default.d.mts.map +1 -1
  27. package/_vendor/zod-to-json-schema/parsers/default.d.ts +1 -1
  28. package/_vendor/zod-to-json-schema/parsers/default.d.ts.map +1 -1
  29. package/_vendor/zod-to-json-schema/parsers/default.js +2 -2
  30. package/_vendor/zod-to-json-schema/parsers/default.js.map +1 -1
  31. package/_vendor/zod-to-json-schema/parsers/default.mjs +2 -2
  32. package/_vendor/zod-to-json-schema/parsers/default.mjs.map +1 -1
  33. package/_vendor/zod-to-json-schema/parsers/nullable.d.mts +1 -1
  34. package/_vendor/zod-to-json-schema/parsers/nullable.d.mts.map +1 -1
  35. package/_vendor/zod-to-json-schema/parsers/nullable.d.ts +1 -1
  36. package/_vendor/zod-to-json-schema/parsers/nullable.d.ts.map +1 -1
  37. package/_vendor/zod-to-json-schema/parsers/nullable.js +2 -2
  38. package/_vendor/zod-to-json-schema/parsers/nullable.js.map +1 -1
  39. package/_vendor/zod-to-json-schema/parsers/nullable.mjs +2 -2
  40. package/_vendor/zod-to-json-schema/parsers/nullable.mjs.map +1 -1
  41. package/_vendor/zod-to-json-schema/parsers/optional.d.mts +1 -1
  42. package/_vendor/zod-to-json-schema/parsers/optional.d.mts.map +1 -1
  43. package/_vendor/zod-to-json-schema/parsers/optional.d.ts +1 -1
  44. package/_vendor/zod-to-json-schema/parsers/optional.d.ts.map +1 -1
  45. package/_vendor/zod-to-json-schema/parsers/optional.js +3 -3
  46. package/_vendor/zod-to-json-schema/parsers/optional.js.map +1 -1
  47. package/_vendor/zod-to-json-schema/parsers/optional.mjs +3 -3
  48. package/_vendor/zod-to-json-schema/parsers/optional.mjs.map +1 -1
  49. package/_vendor/zod-to-json-schema/parsers/pipeline.d.mts +1 -1
  50. package/_vendor/zod-to-json-schema/parsers/pipeline.d.mts.map +1 -1
  51. package/_vendor/zod-to-json-schema/parsers/pipeline.d.ts +1 -1
  52. package/_vendor/zod-to-json-schema/parsers/pipeline.d.ts.map +1 -1
  53. package/_vendor/zod-to-json-schema/parsers/pipeline.js +3 -3
  54. package/_vendor/zod-to-json-schema/parsers/pipeline.js.map +1 -1
  55. package/_vendor/zod-to-json-schema/parsers/pipeline.mjs +3 -3
  56. package/_vendor/zod-to-json-schema/parsers/pipeline.mjs.map +1 -1
  57. package/_vendor/zod-to-json-schema/parsers/promise.d.mts +1 -1
  58. package/_vendor/zod-to-json-schema/parsers/promise.d.mts.map +1 -1
  59. package/_vendor/zod-to-json-schema/parsers/promise.d.ts +1 -1
  60. package/_vendor/zod-to-json-schema/parsers/promise.d.ts.map +1 -1
  61. package/_vendor/zod-to-json-schema/parsers/promise.js +2 -2
  62. package/_vendor/zod-to-json-schema/parsers/promise.js.map +1 -1
  63. package/_vendor/zod-to-json-schema/parsers/promise.mjs +2 -2
  64. package/_vendor/zod-to-json-schema/parsers/promise.mjs.map +1 -1
  65. package/_vendor/zod-to-json-schema/parsers/readonly.d.mts +1 -1
  66. package/_vendor/zod-to-json-schema/parsers/readonly.d.mts.map +1 -1
  67. package/_vendor/zod-to-json-schema/parsers/readonly.d.ts +1 -1
  68. package/_vendor/zod-to-json-schema/parsers/readonly.d.ts.map +1 -1
  69. package/_vendor/zod-to-json-schema/parsers/readonly.js +2 -2
  70. package/_vendor/zod-to-json-schema/parsers/readonly.js.map +1 -1
  71. package/_vendor/zod-to-json-schema/parsers/readonly.mjs +2 -2
  72. package/_vendor/zod-to-json-schema/parsers/readonly.mjs.map +1 -1
  73. package/auth/workload-identity-auth.d.mts.map +1 -1
  74. package/auth/workload-identity-auth.d.ts.map +1 -1
  75. package/auth/workload-identity-auth.js +12 -4
  76. package/auth/workload-identity-auth.js.map +1 -1
  77. package/auth/workload-identity-auth.mjs +13 -5
  78. package/auth/workload-identity-auth.mjs.map +1 -1
  79. package/azure.d.mts +3 -1
  80. package/azure.d.mts.map +1 -1
  81. package/azure.d.ts +3 -1
  82. package/azure.d.ts.map +1 -1
  83. package/azure.js.map +1 -1
  84. package/azure.mjs.map +1 -1
  85. package/beta/realtime/internal-base.d.mts +14 -1
  86. package/beta/realtime/internal-base.d.mts.map +1 -1
  87. package/beta/realtime/internal-base.d.ts +14 -1
  88. package/beta/realtime/internal-base.d.ts.map +1 -1
  89. package/beta/realtime/internal-base.js +21 -5
  90. package/beta/realtime/internal-base.js.map +1 -1
  91. package/beta/realtime/internal-base.mjs +21 -5
  92. package/beta/realtime/internal-base.mjs.map +1 -1
  93. package/beta/realtime/websocket.d.mts +3 -5
  94. package/beta/realtime/websocket.d.mts.map +1 -1
  95. package/beta/realtime/websocket.d.ts +3 -5
  96. package/beta/realtime/websocket.d.ts.map +1 -1
  97. package/beta/realtime/websocket.js +2 -3
  98. package/beta/realtime/websocket.js.map +1 -1
  99. package/beta/realtime/websocket.mjs +3 -4
  100. package/beta/realtime/websocket.mjs.map +1 -1
  101. package/beta/realtime/ws.d.mts +3 -5
  102. package/beta/realtime/ws.d.mts.map +1 -1
  103. package/beta/realtime/ws.d.ts +3 -5
  104. package/beta/realtime/ws.d.ts.map +1 -1
  105. package/beta/realtime/ws.js +2 -3
  106. package/beta/realtime/ws.js.map +1 -1
  107. package/beta/realtime/ws.mjs +3 -4
  108. package/beta/realtime/ws.mjs.map +1 -1
  109. package/client.d.mts +9 -1
  110. package/client.d.mts.map +1 -1
  111. package/client.d.ts +9 -1
  112. package/client.d.ts.map +1 -1
  113. package/client.js +56 -9
  114. package/client.js.map +1 -1
  115. package/client.mjs +56 -9
  116. package/client.mjs.map +1 -1
  117. package/helpers/zod.d.mts.map +1 -1
  118. package/helpers/zod.d.ts.map +1 -1
  119. package/helpers/zod.js +12 -0
  120. package/helpers/zod.js.map +1 -1
  121. package/helpers/zod.mjs +12 -0
  122. package/helpers/zod.mjs.map +1 -1
  123. package/internal/bedrock.d.mts +34 -0
  124. package/internal/bedrock.d.mts.map +1 -0
  125. package/internal/bedrock.d.ts +34 -0
  126. package/internal/bedrock.d.ts.map +1 -0
  127. package/internal/bedrock.js +107 -0
  128. package/internal/bedrock.js.map +1 -0
  129. package/internal/bedrock.mjs +99 -0
  130. package/internal/bedrock.mjs.map +1 -0
  131. package/internal/provider.d.mts +23 -0
  132. package/internal/provider.d.mts.map +1 -0
  133. package/internal/provider.d.ts +23 -0
  134. package/internal/provider.d.ts.map +1 -0
  135. package/internal/provider.js +36 -0
  136. package/internal/provider.js.map +1 -0
  137. package/internal/provider.mjs +32 -0
  138. package/internal/provider.mjs.map +1 -0
  139. package/internal/utils/log.d.mts.map +1 -1
  140. package/internal/utils/log.d.ts.map +1 -1
  141. package/internal/utils/log.js +1 -0
  142. package/internal/utils/log.js.map +1 -1
  143. package/internal/utils/log.mjs +1 -0
  144. package/internal/utils/log.mjs.map +1 -1
  145. package/lib/AbstractChatCompletionRunner.d.mts +15 -4
  146. package/lib/AbstractChatCompletionRunner.d.mts.map +1 -1
  147. package/lib/AbstractChatCompletionRunner.d.ts +15 -4
  148. package/lib/AbstractChatCompletionRunner.d.ts.map +1 -1
  149. package/lib/AbstractChatCompletionRunner.js +63 -40
  150. package/lib/AbstractChatCompletionRunner.js.map +1 -1
  151. package/lib/AbstractChatCompletionRunner.mjs +63 -40
  152. package/lib/AbstractChatCompletionRunner.mjs.map +1 -1
  153. package/lib/AssistantStream.d.mts.map +1 -1
  154. package/lib/AssistantStream.d.ts.map +1 -1
  155. package/lib/AssistantStream.js +4 -24
  156. package/lib/AssistantStream.js.map +1 -1
  157. package/lib/AssistantStream.mjs +4 -24
  158. package/lib/AssistantStream.mjs.map +1 -1
  159. package/lib/ChatCompletionRunner.js +1 -1
  160. package/lib/ChatCompletionRunner.js.map +1 -1
  161. package/lib/ChatCompletionRunner.mjs +1 -1
  162. package/lib/ChatCompletionRunner.mjs.map +1 -1
  163. package/lib/ChatCompletionStream.d.mts.map +1 -1
  164. package/lib/ChatCompletionStream.d.ts.map +1 -1
  165. package/lib/ChatCompletionStream.js +4 -13
  166. package/lib/ChatCompletionStream.js.map +1 -1
  167. package/lib/ChatCompletionStream.mjs +4 -13
  168. package/lib/ChatCompletionStream.mjs.map +1 -1
  169. package/lib/ChatCompletionStreamingRunner.js +1 -1
  170. package/lib/ChatCompletionStreamingRunner.js.map +1 -1
  171. package/lib/ChatCompletionStreamingRunner.mjs +1 -1
  172. package/lib/ChatCompletionStreamingRunner.mjs.map +1 -1
  173. package/lib/EventEmitter.d.mts.map +1 -1
  174. package/lib/EventEmitter.d.ts.map +1 -1
  175. package/lib/EventEmitter.js +12 -2
  176. package/lib/EventEmitter.js.map +1 -1
  177. package/lib/EventEmitter.mjs +12 -2
  178. package/lib/EventEmitter.mjs.map +1 -1
  179. package/lib/EventStream.d.mts +1 -0
  180. package/lib/EventStream.d.mts.map +1 -1
  181. package/lib/EventStream.d.ts +1 -0
  182. package/lib/EventStream.d.ts.map +1 -1
  183. package/lib/EventStream.js +19 -2
  184. package/lib/EventStream.js.map +1 -1
  185. package/lib/EventStream.mjs +19 -2
  186. package/lib/EventStream.mjs.map +1 -1
  187. package/lib/ResponsesParser.d.mts.map +1 -1
  188. package/lib/ResponsesParser.d.ts.map +1 -1
  189. package/lib/ResponsesParser.js +12 -4
  190. package/lib/ResponsesParser.js.map +1 -1
  191. package/lib/ResponsesParser.mjs +12 -4
  192. package/lib/ResponsesParser.mjs.map +1 -1
  193. package/lib/responses/ResponseAccumulator.d.mts +10 -0
  194. package/lib/responses/ResponseAccumulator.d.mts.map +1 -0
  195. package/lib/responses/ResponseAccumulator.d.ts +10 -0
  196. package/lib/responses/ResponseAccumulator.d.ts.map +1 -0
  197. package/lib/responses/ResponseAccumulator.js +402 -0
  198. package/lib/responses/ResponseAccumulator.js.map +1 -0
  199. package/lib/responses/ResponseAccumulator.mjs +399 -0
  200. package/lib/responses/ResponseAccumulator.mjs.map +1 -0
  201. package/lib/responses/ResponseInputItems.d.mts +19 -0
  202. package/lib/responses/ResponseInputItems.d.mts.map +1 -0
  203. package/lib/responses/ResponseInputItems.d.ts +19 -0
  204. package/lib/responses/ResponseInputItems.d.ts.map +1 -0
  205. package/lib/responses/ResponseInputItems.js +102 -0
  206. package/lib/responses/ResponseInputItems.js.map +1 -0
  207. package/lib/responses/ResponseInputItems.mjs +98 -0
  208. package/lib/responses/ResponseInputItems.mjs.map +1 -0
  209. package/lib/responses/ResponseStream.d.mts.map +1 -1
  210. package/lib/responses/ResponseStream.d.ts.map +1 -1
  211. package/lib/responses/ResponseStream.js +5 -90
  212. package/lib/responses/ResponseStream.js.map +1 -1
  213. package/lib/responses/ResponseStream.mjs +5 -90
  214. package/lib/responses/ResponseStream.mjs.map +1 -1
  215. package/package.json +24 -1
  216. package/providers/bedrock/aws.d.mts +24 -0
  217. package/providers/bedrock/aws.d.mts.map +1 -0
  218. package/providers/bedrock/aws.d.ts +24 -0
  219. package/providers/bedrock/aws.d.ts.map +1 -0
  220. package/providers/bedrock/aws.js +170 -0
  221. package/providers/bedrock/aws.js.map +1 -0
  222. package/providers/bedrock/aws.mjs +166 -0
  223. package/providers/bedrock/aws.mjs.map +1 -0
  224. package/providers/bedrock.d.mts +7 -0
  225. package/providers/bedrock.d.mts.map +1 -0
  226. package/providers/bedrock.d.ts +7 -0
  227. package/providers/bedrock.d.ts.map +1 -0
  228. package/providers/bedrock.js +26 -0
  229. package/providers/bedrock.js.map +1 -0
  230. package/providers/bedrock.mjs +22 -0
  231. package/providers/bedrock.mjs.map +1 -0
  232. package/realtime/internal-base.d.mts +28 -1
  233. package/realtime/internal-base.d.mts.map +1 -1
  234. package/realtime/internal-base.d.ts +28 -1
  235. package/realtime/internal-base.d.ts.map +1 -1
  236. package/realtime/internal-base.js +50 -7
  237. package/realtime/internal-base.js.map +1 -1
  238. package/realtime/internal-base.mjs +49 -7
  239. package/realtime/internal-base.mjs.map +1 -1
  240. package/realtime/websocket.d.mts +4 -7
  241. package/realtime/websocket.d.mts.map +1 -1
  242. package/realtime/websocket.d.ts +4 -7
  243. package/realtime/websocket.d.ts.map +1 -1
  244. package/realtime/websocket.js +4 -8
  245. package/realtime/websocket.js.map +1 -1
  246. package/realtime/websocket.mjs +5 -9
  247. package/realtime/websocket.mjs.map +1 -1
  248. package/realtime/ws.d.mts +4 -7
  249. package/realtime/ws.d.mts.map +1 -1
  250. package/realtime/ws.d.ts +4 -7
  251. package/realtime/ws.d.ts.map +1 -1
  252. package/realtime/ws.js +4 -8
  253. package/realtime/ws.js.map +1 -1
  254. package/realtime/ws.mjs +5 -9
  255. package/realtime/ws.mjs.map +1 -1
  256. package/resources/realtime/client-secrets.d.mts +9 -4
  257. package/resources/realtime/client-secrets.d.mts.map +1 -1
  258. package/resources/realtime/client-secrets.d.ts +9 -4
  259. package/resources/realtime/client-secrets.d.ts.map +1 -1
  260. package/resources/realtime/realtime.d.mts +18 -8
  261. package/resources/realtime/realtime.d.mts.map +1 -1
  262. package/resources/realtime/realtime.d.ts +18 -8
  263. package/resources/realtime/realtime.d.ts.map +1 -1
  264. package/resources/realtime/realtime.js.map +1 -1
  265. package/resources/realtime/realtime.mjs.map +1 -1
  266. package/resources/responses/responses.d.mts +9 -4
  267. package/resources/responses/responses.d.mts.map +1 -1
  268. package/resources/responses/responses.d.ts +9 -4
  269. package/resources/responses/responses.d.ts.map +1 -1
  270. package/resources/responses/responses.js.map +1 -1
  271. package/resources/responses/responses.mjs.map +1 -1
  272. package/resources/videos.d.mts +1 -1
  273. package/resources/videos.d.ts +1 -1
  274. package/src/_vendor/zod-to-json-schema/parseDef.ts +44 -16
  275. package/src/_vendor/zod-to-json-schema/parsers/branded.ts +2 -2
  276. package/src/_vendor/zod-to-json-schema/parsers/catch.ts +2 -2
  277. package/src/_vendor/zod-to-json-schema/parsers/default.ts +6 -2
  278. package/src/_vendor/zod-to-json-schema/parsers/nullable.ts +13 -5
  279. package/src/_vendor/zod-to-json-schema/parsers/optional.ts +14 -6
  280. package/src/_vendor/zod-to-json-schema/parsers/pipeline.ts +3 -2
  281. package/src/_vendor/zod-to-json-schema/parsers/promise.ts +6 -2
  282. package/src/_vendor/zod-to-json-schema/parsers/readonly.ts +2 -2
  283. package/src/auth/workload-identity-auth.ts +16 -5
  284. package/src/azure.ts +4 -1
  285. package/src/beta/realtime/internal-base.ts +43 -5
  286. package/src/beta/realtime/websocket.ts +10 -7
  287. package/src/beta/realtime/ws.ts +10 -7
  288. package/src/client.ts +80 -18
  289. package/src/helpers/zod.ts +16 -0
  290. package/src/internal/bedrock.ts +153 -0
  291. package/src/internal/provider.ts +60 -0
  292. package/src/internal/utils/log.ts +1 -0
  293. package/src/lib/AbstractChatCompletionRunner.ts +96 -45
  294. package/src/lib/AssistantStream.ts +4 -20
  295. package/src/lib/ChatCompletionRunner.ts +1 -1
  296. package/src/lib/ChatCompletionStream.ts +4 -11
  297. package/src/lib/ChatCompletionStreamingRunner.ts +1 -1
  298. package/src/lib/EventEmitter.ts +11 -2
  299. package/src/lib/EventStream.ts +20 -0
  300. package/src/lib/ResponsesParser.ts +18 -4
  301. package/src/lib/responses/ResponseAccumulator.ts +412 -0
  302. package/src/lib/responses/ResponseInputItems.ts +127 -0
  303. package/src/lib/responses/ResponseStream.ts +4 -93
  304. package/src/providers/bedrock/aws.ts +255 -0
  305. package/src/providers/bedrock.ts +33 -0
  306. package/src/realtime/internal-base.ts +90 -7
  307. package/src/realtime/websocket.ts +15 -13
  308. package/src/realtime/ws.ts +15 -13
  309. package/src/resources/realtime/client-secrets.ts +10 -4
  310. package/src/resources/realtime/realtime.ts +20 -8
  311. package/src/resources/responses/responses.ts +10 -4
  312. package/src/resources/videos.ts +1 -1
  313. package/src/version.ts +1 -1
  314. package/version.d.mts +1 -1
  315. package/version.d.ts +1 -1
  316. package/version.js +1 -1
  317. package/version.mjs +1 -1
@@ -0,0 +1,412 @@
1
+ import {
2
+ type Response,
3
+ type ResponseOutputText,
4
+ type ResponseStreamEvent,
5
+ } from '../../resources/responses/responses';
6
+ import { OpenAIError } from '../../error';
7
+ import { addOutputText } from '../ResponsesParser';
8
+
9
+ /**
10
+ * Applies a streaming event to a response snapshot.
11
+ *
12
+ * Always use the returned snapshot. Incremental events update the supplied snapshot
13
+ * in place, while response lifecycle events return a detached replacement. Event
14
+ * payloads are cloned, so retaining or replaying the raw events is safe.
15
+ */
16
+ export function accumulateResponse(event: ResponseStreamEvent, snapshot?: Response): Response {
17
+ if (!snapshot) {
18
+ if (event.type !== 'response.created') {
19
+ throw new OpenAIError(
20
+ `When snapshot hasn't been set yet, expected 'response.created' event, got ${event.type}`,
21
+ );
22
+ }
23
+ return cloneResponse(event.response);
24
+ }
25
+
26
+ switch (event.type) {
27
+ case 'response.output_item.added': {
28
+ snapshot.output.push(structuredClone(event.item));
29
+ if (event.item.type === 'message') {
30
+ addOutputText(snapshot);
31
+ }
32
+ break;
33
+ }
34
+ case 'response.output_item.done': {
35
+ getOutput(snapshot, event.output_index);
36
+ snapshot.output[event.output_index] = structuredClone(event.item);
37
+ if (event.item.type === 'message') {
38
+ addOutputText(snapshot);
39
+ }
40
+ break;
41
+ }
42
+ case 'response.content_part.added': {
43
+ const output = getOutput(snapshot, event.output_index);
44
+ const type = output.type;
45
+ const part = event.part;
46
+ if (type === 'message' && part.type !== 'reasoning_text') {
47
+ output.content.push(structuredClone(part));
48
+ if (part.type === 'output_text') {
49
+ addOutputText(snapshot);
50
+ }
51
+ } else if (type === 'reasoning' && part.type === 'reasoning_text') {
52
+ if (!output.content) {
53
+ output.content = [];
54
+ }
55
+ output.content.push(structuredClone(part));
56
+ }
57
+ break;
58
+ }
59
+ case 'response.content_part.done': {
60
+ const output = getOutput(snapshot, event.output_index);
61
+ const part = event.part;
62
+ if (output.type === 'message' && part.type !== 'reasoning_text') {
63
+ getContent(output.content, event.content_index);
64
+ output.content[event.content_index] = structuredClone(part);
65
+ if (part.type === 'output_text') {
66
+ addOutputText(snapshot);
67
+ }
68
+ } else if (output.type === 'reasoning' && part.type === 'reasoning_text') {
69
+ const content = output.content;
70
+ if (!content) {
71
+ throw new OpenAIError(`missing content at index ${event.content_index}`);
72
+ }
73
+ getContent(content, event.content_index);
74
+ content[event.content_index] = structuredClone(part);
75
+ }
76
+ break;
77
+ }
78
+ case 'response.output_text.delta': {
79
+ const output = getOutput(snapshot, event.output_index);
80
+ if (output.type === 'message') {
81
+ const content = getContent(output.content, event.content_index);
82
+ if (content.type !== 'output_text') {
83
+ throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);
84
+ }
85
+ content.text += event.delta;
86
+ snapshot.output_text += event.delta;
87
+ }
88
+ break;
89
+ }
90
+ case 'response.output_text.done': {
91
+ const output = getOutput(snapshot, event.output_index);
92
+ if (output.type === 'message') {
93
+ const content = getContent(output.content, event.content_index);
94
+ if (content.type !== 'output_text') {
95
+ throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);
96
+ }
97
+ content.text = event.text;
98
+ addOutputText(snapshot);
99
+ }
100
+ break;
101
+ }
102
+ case 'response.output_text.annotation.added': {
103
+ const output = getOutput(snapshot, event.output_index);
104
+ if (output.type === 'message') {
105
+ const content = getContent(output.content, event.content_index);
106
+ if (content.type !== 'output_text') {
107
+ throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);
108
+ }
109
+ content.annotations[event.annotation_index] = structuredClone(
110
+ event.annotation,
111
+ ) as ResponseOutputText['annotations'][number];
112
+ }
113
+ break;
114
+ }
115
+ case 'response.refusal.delta': {
116
+ const output = getOutput(snapshot, event.output_index);
117
+ if (output.type === 'message') {
118
+ const content = getContent(output.content, event.content_index);
119
+ if (content.type !== 'refusal') {
120
+ throw new OpenAIError(`expected content to be 'refusal', got ${content.type}`);
121
+ }
122
+ content.refusal += event.delta;
123
+ }
124
+ break;
125
+ }
126
+ case 'response.refusal.done': {
127
+ const output = getOutput(snapshot, event.output_index);
128
+ if (output.type === 'message') {
129
+ const content = getContent(output.content, event.content_index);
130
+ if (content.type !== 'refusal') {
131
+ throw new OpenAIError(`expected content to be 'refusal', got ${content.type}`);
132
+ }
133
+ content.refusal = event.refusal;
134
+ }
135
+ break;
136
+ }
137
+ case 'response.function_call_arguments.delta': {
138
+ const output = getOutput(snapshot, event.output_index);
139
+ if (output.type === 'function_call') {
140
+ output.arguments += event.delta;
141
+ }
142
+ break;
143
+ }
144
+ case 'response.function_call_arguments.done': {
145
+ const output = getOutput(snapshot, event.output_index);
146
+ if (output.type === 'function_call') {
147
+ output.arguments = event.arguments;
148
+ }
149
+ break;
150
+ }
151
+ case 'response.reasoning_text.delta': {
152
+ const output = getOutput(snapshot, event.output_index);
153
+ if (output.type === 'reasoning') {
154
+ if (!output.content) {
155
+ throw new OpenAIError(`missing content at index ${event.content_index}`);
156
+ }
157
+ const content = getContent(output.content, event.content_index);
158
+ if (content.type !== 'reasoning_text') {
159
+ throw new OpenAIError(`expected content to be 'reasoning_text', got ${content.type}`);
160
+ }
161
+ content.text += event.delta;
162
+ }
163
+ break;
164
+ }
165
+ case 'response.reasoning_text.done': {
166
+ const output = getOutput(snapshot, event.output_index);
167
+ if (output.type === 'reasoning') {
168
+ if (!output.content) {
169
+ throw new OpenAIError(`missing content at index ${event.content_index}`);
170
+ }
171
+ const content = getContent(output.content, event.content_index);
172
+ if (content.type !== 'reasoning_text') {
173
+ throw new OpenAIError(`expected content to be 'reasoning_text', got ${content.type}`);
174
+ }
175
+ content.text = event.text;
176
+ }
177
+ break;
178
+ }
179
+ case 'response.reasoning_summary_part.added': {
180
+ const output = getOutput(snapshot, event.output_index);
181
+ if (output.type === 'reasoning') {
182
+ output.summary.push(structuredClone(event.part));
183
+ }
184
+ break;
185
+ }
186
+ case 'response.reasoning_summary_part.done': {
187
+ const output = getOutput(snapshot, event.output_index);
188
+ if (output.type === 'reasoning') {
189
+ getContent(output.summary, event.summary_index);
190
+ output.summary[event.summary_index] = structuredClone(event.part);
191
+ }
192
+ break;
193
+ }
194
+ case 'response.reasoning_summary_text.delta': {
195
+ const output = getOutput(snapshot, event.output_index);
196
+ if (output.type === 'reasoning') {
197
+ const part = getContent(output.summary, event.summary_index);
198
+ part.text += event.delta;
199
+ }
200
+ break;
201
+ }
202
+ case 'response.reasoning_summary_text.done': {
203
+ const output = getOutput(snapshot, event.output_index);
204
+ if (output.type === 'reasoning') {
205
+ const part = getContent(output.summary, event.summary_index);
206
+ part.text = event.text;
207
+ }
208
+ break;
209
+ }
210
+ case 'response.custom_tool_call_input.delta': {
211
+ const output = getOutput(snapshot, event.output_index);
212
+ if (output.type === 'custom_tool_call') {
213
+ output.input += event.delta;
214
+ }
215
+ break;
216
+ }
217
+ case 'response.custom_tool_call_input.done': {
218
+ const output = getOutput(snapshot, event.output_index);
219
+ if (output.type === 'custom_tool_call') {
220
+ output.input = event.input;
221
+ }
222
+ break;
223
+ }
224
+ case 'response.mcp_call_arguments.delta': {
225
+ const output = getOutput(snapshot, event.output_index);
226
+ if (output.type === 'mcp_call') {
227
+ output.arguments += event.delta;
228
+ }
229
+ break;
230
+ }
231
+ case 'response.mcp_call_arguments.done': {
232
+ const output = getOutput(snapshot, event.output_index);
233
+ if (output.type === 'mcp_call') {
234
+ output.arguments = event.arguments;
235
+ }
236
+ break;
237
+ }
238
+ case 'response.code_interpreter_call_code.delta': {
239
+ const output = getOutput(snapshot, event.output_index);
240
+ if (output.type === 'code_interpreter_call') {
241
+ output.code = (output.code ?? '') + event.delta;
242
+ }
243
+ break;
244
+ }
245
+ case 'response.code_interpreter_call_code.done': {
246
+ const output = getOutput(snapshot, event.output_index);
247
+ if (output.type === 'code_interpreter_call') {
248
+ output.code = event.code;
249
+ }
250
+ break;
251
+ }
252
+ case 'response.code_interpreter_call.in_progress': {
253
+ const output = getOutput(snapshot, event.output_index);
254
+ if (output.type === 'code_interpreter_call') {
255
+ output.status = 'in_progress';
256
+ }
257
+ break;
258
+ }
259
+ case 'response.code_interpreter_call.interpreting': {
260
+ const output = getOutput(snapshot, event.output_index);
261
+ if (output.type === 'code_interpreter_call') {
262
+ output.status = 'interpreting';
263
+ }
264
+ break;
265
+ }
266
+ case 'response.code_interpreter_call.completed': {
267
+ const output = getOutput(snapshot, event.output_index);
268
+ if (output.type === 'code_interpreter_call') {
269
+ output.status = 'completed';
270
+ }
271
+ break;
272
+ }
273
+ case 'response.file_search_call.in_progress': {
274
+ const output = getOutput(snapshot, event.output_index);
275
+ if (output.type === 'file_search_call') {
276
+ output.status = 'in_progress';
277
+ }
278
+ break;
279
+ }
280
+ case 'response.file_search_call.searching': {
281
+ const output = getOutput(snapshot, event.output_index);
282
+ if (output.type === 'file_search_call') {
283
+ output.status = 'searching';
284
+ }
285
+ break;
286
+ }
287
+ case 'response.file_search_call.completed': {
288
+ const output = getOutput(snapshot, event.output_index);
289
+ if (output.type === 'file_search_call') {
290
+ output.status = 'completed';
291
+ }
292
+ break;
293
+ }
294
+ case 'response.web_search_call.in_progress': {
295
+ const output = getOutput(snapshot, event.output_index);
296
+ if (output.type === 'web_search_call') {
297
+ output.status = 'in_progress';
298
+ }
299
+ break;
300
+ }
301
+ case 'response.web_search_call.searching': {
302
+ const output = getOutput(snapshot, event.output_index);
303
+ if (output.type === 'web_search_call') {
304
+ output.status = 'searching';
305
+ }
306
+ break;
307
+ }
308
+ case 'response.web_search_call.completed': {
309
+ const output = getOutput(snapshot, event.output_index);
310
+ if (output.type === 'web_search_call') {
311
+ output.status = 'completed';
312
+ }
313
+ break;
314
+ }
315
+ case 'response.image_generation_call.in_progress': {
316
+ const output = getOutput(snapshot, event.output_index);
317
+ if (output.type === 'image_generation_call') {
318
+ output.status = 'in_progress';
319
+ }
320
+ break;
321
+ }
322
+ case 'response.image_generation_call.generating': {
323
+ const output = getOutput(snapshot, event.output_index);
324
+ if (output.type === 'image_generation_call') {
325
+ output.status = 'generating';
326
+ }
327
+ break;
328
+ }
329
+ case 'response.image_generation_call.completed': {
330
+ const output = getOutput(snapshot, event.output_index);
331
+ if (output.type === 'image_generation_call') {
332
+ output.status = 'completed';
333
+ }
334
+ break;
335
+ }
336
+ case 'response.mcp_call.in_progress': {
337
+ const output = getOutput(snapshot, event.output_index);
338
+ if (output.type === 'mcp_call') {
339
+ output.status = 'in_progress';
340
+ }
341
+ break;
342
+ }
343
+ case 'response.mcp_call.completed': {
344
+ const output = getOutput(snapshot, event.output_index);
345
+ if (output.type === 'mcp_call') {
346
+ output.status = 'completed';
347
+ }
348
+ break;
349
+ }
350
+ case 'response.mcp_call.failed': {
351
+ const output = getOutput(snapshot, event.output_index);
352
+ if (output.type === 'mcp_call') {
353
+ output.status = 'failed';
354
+ }
355
+ break;
356
+ }
357
+ case 'response.created':
358
+ case 'response.queued':
359
+ case 'response.in_progress':
360
+ case 'response.completed':
361
+ case 'response.failed':
362
+ case 'response.incomplete': {
363
+ snapshot = cloneResponse(event.response);
364
+ break;
365
+ }
366
+ case 'response.audio.delta':
367
+ case 'response.audio.done':
368
+ case 'response.audio.transcript.delta':
369
+ case 'response.audio.transcript.done':
370
+ case 'response.image_generation_call.partial_image':
371
+ case 'response.mcp_list_tools.in_progress':
372
+ case 'response.mcp_list_tools.completed':
373
+ case 'response.mcp_list_tools.failed':
374
+ case 'error': {
375
+ // These events do not contain state represented by the Response object.
376
+ break;
377
+ }
378
+ default: {
379
+ assertNever(event);
380
+ }
381
+ }
382
+
383
+ return snapshot;
384
+ }
385
+
386
+ function cloneResponse(response: Response): Response {
387
+ const snapshot = structuredClone(response);
388
+ if (!Object.getOwnPropertyDescriptor(snapshot, 'output_text') || snapshot.output_text == null) {
389
+ addOutputText(snapshot);
390
+ }
391
+ return snapshot;
392
+ }
393
+
394
+ function getOutput(snapshot: Response, outputIndex: number): Response['output'][number] {
395
+ const output = snapshot.output[outputIndex];
396
+ if (!output) {
397
+ throw new OpenAIError(`missing output at index ${outputIndex}`);
398
+ }
399
+ return output;
400
+ }
401
+
402
+ function getContent<T>(content: Array<T>, contentIndex: number): T {
403
+ const part = content[contentIndex];
404
+ if (!part) {
405
+ throw new OpenAIError(`missing content at index ${contentIndex}`);
406
+ }
407
+ return part;
408
+ }
409
+
410
+ function assertNever(value: never): never {
411
+ throw new OpenAIError(`Unhandled response stream event: ${JSON.stringify(value)}`);
412
+ }
@@ -0,0 +1,127 @@
1
+ import type {
2
+ ResponseFunctionShellCallOutputContent,
3
+ ResponseInputItem,
4
+ ResponseOutputItem,
5
+ } from '../../resources/responses/responses';
6
+
7
+ export type ResponseInputItemLike = ResponseInputItem | ResponseOutputItem;
8
+
9
+ type ResponseShellCallOutputInputItem = Extract<ResponseInputItem, { type: 'shell_call_output' }>;
10
+ type ResponseComputerCallOutputInputItem = Extract<ResponseInputItem, { type: 'computer_call_output' }>;
11
+ type ResponseCustomToolCallOutputInputItem = Extract<ResponseInputItem, { type: 'custom_tool_call_output' }>;
12
+ type ResponseAdditionalToolsInputItem = Extract<ResponseInputItem, { type: 'additional_tools' }>;
13
+
14
+ /**
15
+ * Normalizes a mixed array of stored response history items into clean
16
+ * `ResponseInputItem`s that can be sent back to `responses.create()`. Known items
17
+ * that cannot be replayed without changing their meaning are omitted.
18
+ *
19
+ * @throws {TypeError} If an item type is not supported by the installed SDK.
20
+ */
21
+ export function toResponseInputItems(items: Iterable<ResponseInputItemLike>): ResponseInputItem[] {
22
+ const inputItems: ResponseInputItem[] = [];
23
+ for (const item of items) {
24
+ const inputItem = toResponseInputItem(item);
25
+ if (inputItem) {
26
+ inputItems.push(inputItem);
27
+ }
28
+ }
29
+ return inputItems;
30
+ }
31
+
32
+ /**
33
+ * Normalizes a stored response history item into a clean `ResponseInputItem`, or
34
+ * returns `null` when a known item cannot be replayed without changing its
35
+ * meaning.
36
+ *
37
+ * @throws {TypeError} If the item type is not supported by the installed SDK.
38
+ */
39
+ export function toResponseInputItem(item: ResponseInputItemLike): ResponseInputItem | null {
40
+ switch (item.type) {
41
+ case 'additional_tools': {
42
+ if (item.role !== 'developer') {
43
+ return null;
44
+ }
45
+ return stripCreatedBy(item) as ResponseAdditionalToolsInputItem;
46
+ }
47
+
48
+ case 'shell_call_output': {
49
+ const output: ResponseShellCallOutputInputItem['output'] = item.output.map(
50
+ (chunk) => stripCreatedBy(chunk) as ResponseFunctionShellCallOutputContent,
51
+ );
52
+ return {
53
+ ...(stripCreatedBy(item) as ResponseShellCallOutputInputItem),
54
+ output,
55
+ };
56
+ }
57
+
58
+ case 'computer_call_output': {
59
+ const { created_by: _createdBy, ...withoutCreatedBy } = item as typeof item & {
60
+ created_by?: string;
61
+ };
62
+ if (withoutCreatedBy.status === 'failed') {
63
+ return null;
64
+ }
65
+ return withoutCreatedBy as ResponseComputerCallOutputInputItem;
66
+ }
67
+
68
+ case 'custom_tool_call_output': {
69
+ if ('status' in item && item.status !== 'completed') {
70
+ return null;
71
+ }
72
+ const {
73
+ created_by: _createdBy,
74
+ status: _status,
75
+ ...inputItem
76
+ } = item as typeof item & { created_by?: string; status?: string };
77
+ return inputItem as ResponseCustomToolCallOutputInputItem;
78
+ }
79
+
80
+ case 'apply_patch_call':
81
+ case 'apply_patch_call_output':
82
+ case 'code_interpreter_call':
83
+ case 'compaction':
84
+ case 'compaction_trigger':
85
+ case 'computer_call':
86
+ case 'custom_tool_call':
87
+ case 'file_search_call':
88
+ case 'function_call':
89
+ case 'function_call_output':
90
+ case 'image_generation_call':
91
+ case 'item_reference':
92
+ case 'local_shell_call':
93
+ case 'local_shell_call_output':
94
+ case 'mcp_approval_request':
95
+ case 'mcp_approval_response':
96
+ case 'mcp_call':
97
+ case 'mcp_list_tools':
98
+ case 'message':
99
+ case 'reasoning':
100
+ case 'shell_call':
101
+ case 'tool_search_call':
102
+ case 'tool_search_output':
103
+ case 'web_search_call':
104
+ case null:
105
+ case undefined: {
106
+ return stripCreatedBy(item) as ResponseInputItem;
107
+ }
108
+
109
+ default: {
110
+ return assertNever(item);
111
+ }
112
+ }
113
+ }
114
+
115
+ function stripCreatedBy<T extends object>(item: T): T {
116
+ if (!('created_by' in item)) {
117
+ return item;
118
+ }
119
+
120
+ const { created_by: _createdBy, ...rest } = item as T & { created_by?: string };
121
+ return rest as T;
122
+ }
123
+
124
+ function assertNever(value: never): never {
125
+ const type = (value as { type?: unknown }).type;
126
+ throw new TypeError(`Unsupported response item type: ${String(type)}`);
127
+ }
@@ -11,6 +11,7 @@ import { APIUserAbortError, OpenAIError } from '../../error';
11
11
  import OpenAI from '../../index';
12
12
  import { type BaseEvents, EventStream } from '../EventStream';
13
13
  import { type ResponseFunctionCallArgumentsDeltaEvent, type ResponseTextDeltaEvent } from './EventTypes';
14
+ import { accumulateResponse } from './ResponseAccumulator';
14
15
  import { maybeParseResponse, ParseableToolsParams } from '../ResponsesParser';
15
16
  import { Stream } from '../../streaming';
16
17
 
@@ -103,7 +104,8 @@ export class ResponseStream<ParsedT = null>
103
104
  }
104
105
  };
105
106
 
106
- const response = this.#accumulateResponse(event);
107
+ const response = accumulateResponse(event, this.#currentResponseSnapshot);
108
+ this.#currentResponseSnapshot = response;
107
109
  maybeEmit('event', event);
108
110
 
109
111
  switch (event.type) {
@@ -167,11 +169,7 @@ export class ResponseStream<ParsedT = null>
167
169
  params: ResponseStreamParams,
168
170
  options?: RequestOptions,
169
171
  ): Promise<ParsedResponse<ParsedT>> {
170
- const signal = options?.signal;
171
- if (signal) {
172
- if (signal.aborted) this.controller.abort();
173
- signal.addEventListener('abort', () => this.controller.abort());
174
- }
172
+ this._listenForAbort(options?.signal);
175
173
  this.#beginRequest();
176
174
 
177
175
  let stream: Stream<ResponseStreamEvent> | undefined;
@@ -200,93 +198,6 @@ export class ResponseStream<ParsedT = null>
200
198
  return this.#endRequest();
201
199
  }
202
200
 
203
- #accumulateResponse(event: ResponseStreamEvent): Response {
204
- let snapshot = this.#currentResponseSnapshot;
205
- if (!snapshot) {
206
- if (event.type !== 'response.created') {
207
- throw new OpenAIError(
208
- `When snapshot hasn't been set yet, expected 'response.created' event, got ${event.type}`,
209
- );
210
- }
211
- snapshot = this.#currentResponseSnapshot = event.response;
212
- return snapshot;
213
- }
214
-
215
- switch (event.type) {
216
- case 'response.output_item.added': {
217
- snapshot.output.push(event.item);
218
- break;
219
- }
220
- case 'response.content_part.added': {
221
- const output = snapshot.output[event.output_index];
222
- if (!output) {
223
- throw new OpenAIError(`missing output at index ${event.output_index}`);
224
- }
225
- const type = output.type;
226
- const part = event.part;
227
- if (type === 'message' && part.type !== 'reasoning_text') {
228
- output.content.push(part);
229
- } else if (type === 'reasoning' && part.type === 'reasoning_text') {
230
- if (!output.content) {
231
- output.content = [];
232
- }
233
- output.content.push(part);
234
- }
235
- break;
236
- }
237
- case 'response.output_text.delta': {
238
- const output = snapshot.output[event.output_index];
239
- if (!output) {
240
- throw new OpenAIError(`missing output at index ${event.output_index}`);
241
- }
242
- if (output.type === 'message') {
243
- const content = output.content[event.content_index];
244
- if (!content) {
245
- throw new OpenAIError(`missing content at index ${event.content_index}`);
246
- }
247
- if (content.type !== 'output_text') {
248
- throw new OpenAIError(`expected content to be 'output_text', got ${content.type}`);
249
- }
250
- content.text += event.delta;
251
- }
252
- break;
253
- }
254
- case 'response.function_call_arguments.delta': {
255
- const output = snapshot.output[event.output_index];
256
- if (!output) {
257
- throw new OpenAIError(`missing output at index ${event.output_index}`);
258
- }
259
- if (output.type === 'function_call') {
260
- output.arguments += event.delta;
261
- }
262
- break;
263
- }
264
- case 'response.reasoning_text.delta': {
265
- const output = snapshot.output[event.output_index];
266
- if (!output) {
267
- throw new OpenAIError(`missing output at index ${event.output_index}`);
268
- }
269
- if (output.type === 'reasoning') {
270
- const content = output.content?.[event.content_index];
271
- if (!content) {
272
- throw new OpenAIError(`missing content at index ${event.content_index}`);
273
- }
274
- if (content.type !== 'reasoning_text') {
275
- throw new OpenAIError(`expected content to be 'reasoning_text', got ${content.type}`);
276
- }
277
- content.text += event.delta;
278
- }
279
- break;
280
- }
281
- case 'response.completed': {
282
- this.#currentResponseSnapshot = event.response;
283
- break;
284
- }
285
- }
286
-
287
- return snapshot;
288
- }
289
-
290
201
  [Symbol.asyncIterator](this: ResponseStream<ParsedT>): AsyncIterator<ResponseStreamEvent> {
291
202
  const pushQueue: ResponseStreamEvent[] = [];
292
203
  const readQueue: {