openai 7.14.0 → 7.15.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 (320) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/client.d.mts +3 -1
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +3 -1
  5. package/client.d.ts.map +1 -1
  6. package/client.js.map +1 -1
  7. package/client.mjs.map +1 -1
  8. package/core/pagination.d.mts +19 -1
  9. package/core/pagination.d.mts.map +1 -1
  10. package/core/pagination.d.ts +19 -1
  11. package/core/pagination.d.ts.map +1 -1
  12. package/core/pagination.js +32 -1
  13. package/core/pagination.js.map +1 -1
  14. package/core/pagination.mjs +30 -0
  15. package/core/pagination.mjs.map +1 -1
  16. package/lib/agents/agent-session-stream.d.mts +41 -0
  17. package/lib/agents/agent-session-stream.d.mts.map +1 -0
  18. package/lib/agents/agent-session-stream.d.ts +41 -0
  19. package/lib/agents/agent-session-stream.d.ts.map +1 -0
  20. package/lib/agents/agent-session-stream.js +271 -0
  21. package/lib/agents/agent-session-stream.js.map +1 -0
  22. package/lib/agents/agent-session-stream.mjs +267 -0
  23. package/lib/agents/agent-session-stream.mjs.map +1 -0
  24. package/lib/agents/output-text.d.mts +4 -0
  25. package/lib/agents/output-text.d.mts.map +1 -0
  26. package/lib/agents/output-text.d.ts +4 -0
  27. package/lib/agents/output-text.d.ts.map +1 -0
  28. package/lib/agents/output-text.js +8 -0
  29. package/lib/agents/output-text.js.map +1 -0
  30. package/lib/agents/output-text.mjs +5 -0
  31. package/lib/agents/output-text.mjs.map +1 -0
  32. package/lib/agents/turn-state.d.mts +14 -0
  33. package/lib/agents/turn-state.d.mts.map +1 -0
  34. package/lib/agents/turn-state.d.ts +14 -0
  35. package/lib/agents/turn-state.d.ts.map +1 -0
  36. package/lib/agents/turn-state.js +62 -0
  37. package/lib/agents/turn-state.js.map +1 -0
  38. package/lib/agents/turn-state.mjs +58 -0
  39. package/lib/agents/turn-state.mjs.map +1 -0
  40. package/package.json +1 -1
  41. package/resources/beta/agents/agents.d.mts +3678 -0
  42. package/resources/beta/agents/agents.d.mts.map +1 -0
  43. package/resources/beta/agents/agents.d.ts +3678 -0
  44. package/resources/beta/agents/agents.d.ts.map +1 -0
  45. package/resources/beta/agents/agents.js +118 -0
  46. package/resources/beta/agents/agents.js.map +1 -0
  47. package/resources/beta/agents/agents.mjs +113 -0
  48. package/resources/beta/agents/agents.mjs.map +1 -0
  49. package/resources/beta/agents/environments/environments.d.mts +65 -0
  50. package/resources/beta/agents/environments/environments.d.mts.map +1 -0
  51. package/resources/beta/agents/environments/environments.d.ts +65 -0
  52. package/resources/beta/agents/environments/environments.d.ts.map +1 -0
  53. package/resources/beta/agents/environments/environments.js +43 -0
  54. package/resources/beta/agents/environments/environments.js.map +1 -0
  55. package/resources/beta/agents/environments/environments.mjs +38 -0
  56. package/resources/beta/agents/environments/environments.mjs.map +1 -0
  57. package/resources/beta/agents/environments/files.d.mts +111 -0
  58. package/resources/beta/agents/environments/files.d.mts.map +1 -0
  59. package/resources/beta/agents/environments/files.d.ts +111 -0
  60. package/resources/beta/agents/environments/files.d.ts.map +1 -0
  61. package/resources/beta/agents/environments/files.js +61 -0
  62. package/resources/beta/agents/environments/files.js.map +1 -0
  63. package/resources/beta/agents/environments/files.mjs +57 -0
  64. package/resources/beta/agents/environments/files.mjs.map +1 -0
  65. package/resources/beta/agents/environments/index.d.mts +4 -0
  66. package/resources/beta/agents/environments/index.d.mts.map +1 -0
  67. package/resources/beta/agents/environments/index.d.ts +4 -0
  68. package/resources/beta/agents/environments/index.d.ts.map +1 -0
  69. package/resources/beta/agents/environments/index.js +11 -0
  70. package/resources/beta/agents/environments/index.js.map +1 -0
  71. package/resources/beta/agents/environments/index.mjs +5 -0
  72. package/resources/beta/agents/environments/index.mjs.map +1 -0
  73. package/resources/beta/agents/environments/templates.d.mts +415 -0
  74. package/resources/beta/agents/environments/templates.d.mts.map +1 -0
  75. package/resources/beta/agents/environments/templates.d.ts +415 -0
  76. package/resources/beta/agents/environments/templates.d.ts.map +1 -0
  77. package/resources/beta/agents/environments/templates.js +112 -0
  78. package/resources/beta/agents/environments/templates.js.map +1 -0
  79. package/resources/beta/agents/environments/templates.mjs +108 -0
  80. package/resources/beta/agents/environments/templates.mjs.map +1 -0
  81. package/resources/beta/agents/environments.d.mts +2 -0
  82. package/resources/beta/agents/environments.d.mts.map +1 -0
  83. package/resources/beta/agents/environments.d.ts +2 -0
  84. package/resources/beta/agents/environments.d.ts.map +1 -0
  85. package/resources/beta/agents/environments.js +6 -0
  86. package/resources/beta/agents/environments.js.map +1 -0
  87. package/resources/beta/agents/environments.mjs +3 -0
  88. package/resources/beta/agents/environments.mjs.map +1 -0
  89. package/resources/beta/agents/index.d.mts +5 -0
  90. package/resources/beta/agents/index.d.mts.map +1 -0
  91. package/resources/beta/agents/index.d.ts +5 -0
  92. package/resources/beta/agents/index.d.ts.map +1 -0
  93. package/resources/beta/agents/index.js +13 -0
  94. package/resources/beta/agents/index.js.map +1 -0
  95. package/resources/beta/agents/index.mjs +6 -0
  96. package/resources/beta/agents/index.mjs.map +1 -0
  97. package/resources/beta/agents/sessions/artifacts.d.mts +158 -0
  98. package/resources/beta/agents/sessions/artifacts.d.mts.map +1 -0
  99. package/resources/beta/agents/sessions/artifacts.d.ts +158 -0
  100. package/resources/beta/agents/sessions/artifacts.d.ts.map +1 -0
  101. package/resources/beta/agents/sessions/artifacts.js +106 -0
  102. package/resources/beta/agents/sessions/artifacts.js.map +1 -0
  103. package/resources/beta/agents/sessions/artifacts.mjs +102 -0
  104. package/resources/beta/agents/sessions/artifacts.mjs.map +1 -0
  105. package/resources/beta/agents/sessions/events.d.mts +61 -0
  106. package/resources/beta/agents/sessions/events.d.mts.map +1 -0
  107. package/resources/beta/agents/sessions/events.d.ts +61 -0
  108. package/resources/beta/agents/sessions/events.d.ts.map +1 -0
  109. package/resources/beta/agents/sessions/events.js +72 -0
  110. package/resources/beta/agents/sessions/events.js.map +1 -0
  111. package/resources/beta/agents/sessions/events.mjs +68 -0
  112. package/resources/beta/agents/sessions/events.mjs.map +1 -0
  113. package/resources/beta/agents/sessions/index.d.mts +7 -0
  114. package/resources/beta/agents/sessions/index.d.mts.map +1 -0
  115. package/resources/beta/agents/sessions/index.d.ts +7 -0
  116. package/resources/beta/agents/sessions/index.d.ts.map +1 -0
  117. package/resources/beta/agents/sessions/index.js +17 -0
  118. package/resources/beta/agents/sessions/index.js.map +1 -0
  119. package/resources/beta/agents/sessions/index.mjs +8 -0
  120. package/resources/beta/agents/sessions/index.mjs.map +1 -0
  121. package/resources/beta/agents/sessions/items.d.mts +37 -0
  122. package/resources/beta/agents/sessions/items.d.mts.map +1 -0
  123. package/resources/beta/agents/sessions/items.d.ts +37 -0
  124. package/resources/beta/agents/sessions/items.d.ts.map +1 -0
  125. package/resources/beta/agents/sessions/items.js +35 -0
  126. package/resources/beta/agents/sessions/items.js.map +1 -0
  127. package/resources/beta/agents/sessions/items.mjs +31 -0
  128. package/resources/beta/agents/sessions/items.mjs.map +1 -0
  129. package/resources/beta/agents/sessions/sessions.d.mts +220 -0
  130. package/resources/beta/agents/sessions/sessions.d.mts.map +1 -0
  131. package/resources/beta/agents/sessions/sessions.d.ts +220 -0
  132. package/resources/beta/agents/sessions/sessions.d.ts.map +1 -0
  133. package/resources/beta/agents/sessions/sessions.js +124 -0
  134. package/resources/beta/agents/sessions/sessions.js.map +1 -0
  135. package/resources/beta/agents/sessions/sessions.mjs +119 -0
  136. package/resources/beta/agents/sessions/sessions.mjs.map +1 -0
  137. package/resources/beta/agents/sessions/subagents/index.d.mts +4 -0
  138. package/resources/beta/agents/sessions/subagents/index.d.mts.map +1 -0
  139. package/resources/beta/agents/sessions/subagents/index.d.ts +4 -0
  140. package/resources/beta/agents/sessions/subagents/index.d.ts.map +1 -0
  141. package/resources/beta/agents/sessions/subagents/index.js +11 -0
  142. package/resources/beta/agents/sessions/subagents/index.js.map +1 -0
  143. package/resources/beta/agents/sessions/subagents/index.mjs +5 -0
  144. package/resources/beta/agents/sessions/subagents/index.mjs.map +1 -0
  145. package/resources/beta/agents/sessions/subagents/items.d.mts +41 -0
  146. package/resources/beta/agents/sessions/subagents/items.d.mts.map +1 -0
  147. package/resources/beta/agents/sessions/subagents/items.d.ts +41 -0
  148. package/resources/beta/agents/sessions/subagents/items.d.ts.map +1 -0
  149. package/resources/beta/agents/sessions/subagents/items.js +36 -0
  150. package/resources/beta/agents/sessions/subagents/items.js.map +1 -0
  151. package/resources/beta/agents/sessions/subagents/items.mjs +32 -0
  152. package/resources/beta/agents/sessions/subagents/items.mjs.map +1 -0
  153. package/resources/beta/agents/sessions/subagents/subagents.d.mts +65 -0
  154. package/resources/beta/agents/sessions/subagents/subagents.d.mts.map +1 -0
  155. package/resources/beta/agents/sessions/subagents/subagents.d.ts +65 -0
  156. package/resources/beta/agents/sessions/subagents/subagents.d.ts.map +1 -0
  157. package/resources/beta/agents/sessions/subagents/subagents.js +67 -0
  158. package/resources/beta/agents/sessions/subagents/subagents.js.map +1 -0
  159. package/resources/beta/agents/sessions/subagents/subagents.mjs +62 -0
  160. package/resources/beta/agents/sessions/subagents/subagents.mjs.map +1 -0
  161. package/resources/beta/agents/sessions/subagents/turns/index.d.mts +3 -0
  162. package/resources/beta/agents/sessions/subagents/turns/index.d.mts.map +1 -0
  163. package/resources/beta/agents/sessions/subagents/turns/index.d.ts +3 -0
  164. package/resources/beta/agents/sessions/subagents/turns/index.d.ts.map +1 -0
  165. package/resources/beta/agents/sessions/subagents/turns/index.js +9 -0
  166. package/resources/beta/agents/sessions/subagents/turns/index.js.map +1 -0
  167. package/resources/beta/agents/sessions/subagents/turns/index.mjs +4 -0
  168. package/resources/beta/agents/sessions/subagents/turns/index.mjs.map +1 -0
  169. package/resources/beta/agents/sessions/subagents/turns/items.d.mts +45 -0
  170. package/resources/beta/agents/sessions/subagents/turns/items.d.mts.map +1 -0
  171. package/resources/beta/agents/sessions/subagents/turns/items.d.ts +45 -0
  172. package/resources/beta/agents/sessions/subagents/turns/items.d.ts.map +1 -0
  173. package/resources/beta/agents/sessions/subagents/turns/items.js +36 -0
  174. package/resources/beta/agents/sessions/subagents/turns/items.js.map +1 -0
  175. package/resources/beta/agents/sessions/subagents/turns/items.mjs +32 -0
  176. package/resources/beta/agents/sessions/subagents/turns/items.mjs.map +1 -0
  177. package/resources/beta/agents/sessions/subagents/turns/turns.d.mts +73 -0
  178. package/resources/beta/agents/sessions/subagents/turns/turns.d.mts.map +1 -0
  179. package/resources/beta/agents/sessions/subagents/turns/turns.d.ts +73 -0
  180. package/resources/beta/agents/sessions/subagents/turns/turns.d.ts.map +1 -0
  181. package/resources/beta/agents/sessions/subagents/turns/turns.js +68 -0
  182. package/resources/beta/agents/sessions/subagents/turns/turns.js.map +1 -0
  183. package/resources/beta/agents/sessions/subagents/turns/turns.mjs +63 -0
  184. package/resources/beta/agents/sessions/subagents/turns/turns.mjs.map +1 -0
  185. package/resources/beta/agents/sessions/subagents/turns.d.mts +2 -0
  186. package/resources/beta/agents/sessions/subagents/turns.d.mts.map +1 -0
  187. package/resources/beta/agents/sessions/subagents/turns.d.ts +2 -0
  188. package/resources/beta/agents/sessions/subagents/turns.d.ts.map +1 -0
  189. package/resources/beta/agents/sessions/subagents/turns.js +6 -0
  190. package/resources/beta/agents/sessions/subagents/turns.js.map +1 -0
  191. package/resources/beta/agents/sessions/subagents/turns.mjs +3 -0
  192. package/resources/beta/agents/sessions/subagents/turns.mjs.map +1 -0
  193. package/resources/beta/agents/sessions/subagents.d.mts +2 -0
  194. package/resources/beta/agents/sessions/subagents.d.mts.map +1 -0
  195. package/resources/beta/agents/sessions/subagents.d.ts +2 -0
  196. package/resources/beta/agents/sessions/subagents.d.ts.map +1 -0
  197. package/resources/beta/agents/sessions/subagents.js +6 -0
  198. package/resources/beta/agents/sessions/subagents.js.map +1 -0
  199. package/resources/beta/agents/sessions/subagents.mjs +3 -0
  200. package/resources/beta/agents/sessions/subagents.mjs.map +1 -0
  201. package/resources/beta/agents/sessions/turns.d.mts +116 -0
  202. package/resources/beta/agents/sessions/turns.d.mts.map +1 -0
  203. package/resources/beta/agents/sessions/turns.d.ts +116 -0
  204. package/resources/beta/agents/sessions/turns.d.ts.map +1 -0
  205. package/resources/beta/agents/sessions/turns.js +57 -0
  206. package/resources/beta/agents/sessions/turns.js.map +1 -0
  207. package/resources/beta/agents/sessions/turns.mjs +53 -0
  208. package/resources/beta/agents/sessions/turns.mjs.map +1 -0
  209. package/resources/beta/agents/sessions.d.mts +2 -0
  210. package/resources/beta/agents/sessions.d.mts.map +1 -0
  211. package/resources/beta/agents/sessions.d.ts +2 -0
  212. package/resources/beta/agents/sessions.d.ts.map +1 -0
  213. package/resources/beta/agents/sessions.js +6 -0
  214. package/resources/beta/agents/sessions.js.map +1 -0
  215. package/resources/beta/agents/sessions.mjs +3 -0
  216. package/resources/beta/agents/sessions.mjs.map +1 -0
  217. package/resources/beta/agents/vaults/credentials.d.mts +526 -0
  218. package/resources/beta/agents/vaults/credentials.d.mts.map +1 -0
  219. package/resources/beta/agents/vaults/credentials.d.ts +526 -0
  220. package/resources/beta/agents/vaults/credentials.d.ts.map +1 -0
  221. package/resources/beta/agents/vaults/credentials.js +132 -0
  222. package/resources/beta/agents/vaults/credentials.js.map +1 -0
  223. package/resources/beta/agents/vaults/credentials.mjs +128 -0
  224. package/resources/beta/agents/vaults/credentials.mjs.map +1 -0
  225. package/resources/beta/agents/vaults/index.d.mts +3 -0
  226. package/resources/beta/agents/vaults/index.d.mts.map +1 -0
  227. package/resources/beta/agents/vaults/index.d.ts +3 -0
  228. package/resources/beta/agents/vaults/index.d.ts.map +1 -0
  229. package/resources/beta/agents/vaults/index.js +9 -0
  230. package/resources/beta/agents/vaults/index.js.map +1 -0
  231. package/resources/beta/agents/vaults/index.mjs +4 -0
  232. package/resources/beta/agents/vaults/index.mjs.map +1 -0
  233. package/resources/beta/agents/vaults/vaults.d.mts +145 -0
  234. package/resources/beta/agents/vaults/vaults.d.mts.map +1 -0
  235. package/resources/beta/agents/vaults/vaults.d.ts +145 -0
  236. package/resources/beta/agents/vaults/vaults.d.ts.map +1 -0
  237. package/resources/beta/agents/vaults/vaults.js +93 -0
  238. package/resources/beta/agents/vaults/vaults.js.map +1 -0
  239. package/resources/beta/agents/vaults/vaults.mjs +88 -0
  240. package/resources/beta/agents/vaults/vaults.mjs.map +1 -0
  241. package/resources/beta/agents/vaults.d.mts +2 -0
  242. package/resources/beta/agents/vaults.d.mts.map +1 -0
  243. package/resources/beta/agents/vaults.d.ts +2 -0
  244. package/resources/beta/agents/vaults.d.ts.map +1 -0
  245. package/resources/beta/agents/vaults.js +6 -0
  246. package/resources/beta/agents/vaults.js.map +1 -0
  247. package/resources/beta/agents/vaults.mjs +3 -0
  248. package/resources/beta/agents/vaults.mjs.map +1 -0
  249. package/resources/beta/agents.d.mts +2 -0
  250. package/resources/beta/agents.d.mts.map +1 -0
  251. package/resources/beta/agents.d.ts +2 -0
  252. package/resources/beta/agents.d.ts.map +1 -0
  253. package/resources/beta/agents.js +6 -0
  254. package/resources/beta/agents.js.map +1 -0
  255. package/resources/beta/agents.mjs +3 -0
  256. package/resources/beta/agents.mjs.map +1 -0
  257. package/resources/beta/beta.d.mts +4 -1
  258. package/resources/beta/beta.d.mts.map +1 -1
  259. package/resources/beta/beta.d.ts +4 -1
  260. package/resources/beta/beta.d.ts.map +1 -1
  261. package/resources/beta/beta.js +4 -0
  262. package/resources/beta/beta.js.map +1 -1
  263. package/resources/beta/beta.mjs +4 -0
  264. package/resources/beta/beta.mjs.map +1 -1
  265. package/resources/beta/index.d.mts +1 -0
  266. package/resources/beta/index.d.mts.map +1 -1
  267. package/resources/beta/index.d.ts +1 -0
  268. package/resources/beta/index.d.ts.map +1 -1
  269. package/resources/beta/index.js +11 -9
  270. package/resources/beta/index.js.map +1 -1
  271. package/resources/beta/index.mjs +1 -0
  272. package/resources/beta/index.mjs.map +1 -1
  273. package/resources/live/sessions.d.mts +10 -4
  274. package/resources/live/sessions.d.mts.map +1 -1
  275. package/resources/live/sessions.d.ts +10 -4
  276. package/resources/live/sessions.d.ts.map +1 -1
  277. package/resources/live/sessions.js +10 -4
  278. package/resources/live/sessions.js.map +1 -1
  279. package/resources/live/sessions.mjs +10 -4
  280. package/resources/live/sessions.mjs.map +1 -1
  281. package/src/client.ts +5 -0
  282. package/src/core/pagination.ts +63 -1
  283. package/src/lib/agents/agent-session-stream.ts +326 -0
  284. package/src/lib/agents/output-text.ts +6 -0
  285. package/src/lib/agents/turn-state.ts +61 -0
  286. package/src/resources/beta/agents/agents.ts +4621 -0
  287. package/src/resources/beta/agents/environments/environments.ts +111 -0
  288. package/src/resources/beta/agents/environments/files.ts +164 -0
  289. package/src/resources/beta/agents/environments/index.ts +19 -0
  290. package/src/resources/beta/agents/environments/templates.ts +537 -0
  291. package/src/resources/beta/agents/environments.ts +3 -0
  292. package/src/resources/beta/agents/index.ts +127 -0
  293. package/src/resources/beta/agents/sessions/artifacts.ts +239 -0
  294. package/src/resources/beta/agents/sessions/events.ts +91 -0
  295. package/src/resources/beta/agents/sessions/index.ts +24 -0
  296. package/src/resources/beta/agents/sessions/items.ts +59 -0
  297. package/src/resources/beta/agents/sessions/sessions.ts +350 -0
  298. package/src/resources/beta/agents/sessions/subagents/index.ts +5 -0
  299. package/src/resources/beta/agents/sessions/subagents/items.ts +65 -0
  300. package/src/resources/beta/agents/sessions/subagents/subagents.ts +113 -0
  301. package/src/resources/beta/agents/sessions/subagents/turns/index.ts +4 -0
  302. package/src/resources/beta/agents/sessions/subagents/turns/items.ts +70 -0
  303. package/src/resources/beta/agents/sessions/subagents/turns/turns.ts +111 -0
  304. package/src/resources/beta/agents/sessions/subagents/turns.ts +3 -0
  305. package/src/resources/beta/agents/sessions/subagents.ts +3 -0
  306. package/src/resources/beta/agents/sessions/turns.ts +159 -0
  307. package/src/resources/beta/agents/sessions.ts +3 -0
  308. package/src/resources/beta/agents/vaults/credentials.ts +687 -0
  309. package/src/resources/beta/agents/vaults/index.ts +29 -0
  310. package/src/resources/beta/agents/vaults/vaults.ts +237 -0
  311. package/src/resources/beta/agents/vaults.ts +3 -0
  312. package/src/resources/beta/agents.ts +3 -0
  313. package/src/resources/beta/beta.ts +207 -0
  314. package/src/resources/beta/index.ts +106 -0
  315. package/src/resources/live/sessions.ts +10 -4
  316. package/src/version.ts +1 -1
  317. package/version.d.mts +1 -1
  318. package/version.d.ts +1 -1
  319. package/version.js +1 -1
  320. package/version.mjs +1 -1
@@ -0,0 +1,326 @@
1
+ import { TurnState } from './turn-state';
2
+ import { APIUserAbortError, BadRequestError, OpenAIError } from '../../core/error';
3
+ import type { Stream } from '../../core/streaming';
4
+ import { buildHeaders } from '../../internal/headers';
5
+ import type { RequestOptions } from '../../internal/request-options';
6
+ import { uuid4 } from '../../internal/utils/uuid';
7
+ import { hasOwn, isObj } from '../../internal/utils/values';
8
+ import type {
9
+ AgentFunctionCallItem,
10
+ AgentFunctionCallOutputParam,
11
+ AgentSessionEvent,
12
+ AgentSessionInputMessageParam,
13
+ AgentSessionInputParam,
14
+ InputContentParam,
15
+ } from '../../resources/beta/agents/agents';
16
+ import type { Sessions } from '../../resources/beta/agents/sessions/sessions';
17
+
18
+ /** A function result; object results are serialized as JSON text. */
19
+ export type AgentToolOutput = AgentFunctionCallOutputParam | object | null;
20
+ /** Receives a detached JSON object and may return a result asynchronously. */
21
+ export type AgentToolHandler = (
22
+ arguments_: Record<string, unknown>,
23
+ ) => AgentToolOutput | PromiseLike<AgentToolOutput>;
24
+
25
+ /** Input and optional sequential tool handlers for one turn on an idle session. */
26
+ export interface AgentSessionStreamParams {
27
+ /** User messages, or text normalized to a single user message. Must not be empty. */
28
+ input: string | AgentSessionInputMessageParam[];
29
+ /** Registered functions run after their call event is yielded; unknown functions remain manual. */
30
+ toolHandlers?: Record<string, AgentToolHandler>;
31
+ /** Key for the input submission only; request headers take precedence, case-insensitively. */
32
+ idempotencyKey?: string;
33
+ }
34
+
35
+ type ToolResult = AgentSessionInputParam.SessionInputParamAgentSessionInputToolResult;
36
+
37
+ function isInputContent(value: unknown): value is InputContentParam {
38
+ if (!isObj(value)) {
39
+ return false;
40
+ }
41
+ const content = value;
42
+ let field: string;
43
+ if (content['type'] === 'input_text') {
44
+ field = 'text';
45
+ } else if (content['type'] === 'input_image') {
46
+ field = 'image_url';
47
+ } else {
48
+ return false;
49
+ }
50
+ return hasOwn(content, 'type') && hasOwn(content, field) && typeof content[field] === 'string';
51
+ }
52
+
53
+ function normalizedOutput(value: unknown): AgentFunctionCallOutputParam | null {
54
+ if (value === null) {
55
+ return null;
56
+ }
57
+ if (typeof value === 'string' || (Array.isArray(value) && value.every(isInputContent))) {
58
+ return value;
59
+ }
60
+ throw new OpenAIError('Tool output must be text, content, a JSON object, or null');
61
+ }
62
+
63
+ function toolResult(call: AgentFunctionCallItem, value: AgentToolOutput): ToolResult {
64
+ const output =
65
+ value !== null && typeof value === 'object' && !Array.isArray(value) ? JSON.stringify(value) : value;
66
+ // Detect unserializable callback results inside the redacted failure boundary.
67
+ const serialized = JSON.stringify(output);
68
+ if (serialized === undefined) {
69
+ throw new OpenAIError('Tool output must be JSON serializable');
70
+ }
71
+ return {
72
+ type: 'agent.session.input.tool_result',
73
+ turn_id: call.turn_id,
74
+ call_id: call.call_id,
75
+ success: true,
76
+ output: normalizedOutput(typeof output === 'string' ? output : JSON.parse(serialized)),
77
+ };
78
+ }
79
+
80
+ async function cancelBody(response: Response | undefined): Promise<void> {
81
+ try {
82
+ await response?.body?.cancel();
83
+ } catch {
84
+ // The response may already be cancelled or owned by its stream reader.
85
+ }
86
+ }
87
+
88
+ /**
89
+ * A single-use, lazy async iterable of original session events for one turn.
90
+ * Requires an idle session and a single input writer: the input endpoint does not
91
+ * return a turn ID. Subscribe-before-input avoids losing events; the first
92
+ * coordinator turn selects the turn to follow. Initial idle events and subagent
93
+ * completion do not end iteration. A selected turn's terminal event followed by
94
+ * session.idle, or session.failed, ends iteration. Unexpected EOF throws.
95
+ *
96
+ * Tool handlers run sequentially during iteration. Handler failures submit a
97
+ * generic error without exception text. Each submission has a distinct retry-safe
98
+ * idempotency key. Breaking iteration or calling abort closes local requests;
99
+ * neither cancels the backend turn. No work starts until iteration begins.
100
+ */
101
+ export class AgentSessionStream implements AsyncIterable<AgentSessionEvent> {
102
+ /** Aborts local requests and iteration without cancelling the backend turn. */
103
+ readonly controller = new AbortController();
104
+ #consumed = false;
105
+ #stream: Stream<AgentSessionEvent> | undefined;
106
+ #response: Response | undefined;
107
+ #reading = false;
108
+ #sessions: Sessions;
109
+ #sessionID: string;
110
+ #input: AgentSessionInputParam.SessionInputParamAgentSessionInputMessage;
111
+ #handlers: Map<string, AgentToolHandler>;
112
+ #inputKey: string | undefined;
113
+ #options: RequestOptions;
114
+
115
+ /** Creates an unstarted helper. Prefer client.beta.agents.sessions.stream(). */
116
+ constructor(
117
+ sessions: Sessions,
118
+ sessionID: string,
119
+ params: AgentSessionStreamParams,
120
+ options?: RequestOptions,
121
+ ) {
122
+ const input: AgentSessionInputMessageParam[] =
123
+ typeof params.input === 'string'
124
+ ? [{ role: 'user', content: [{ type: 'input_text', text: params.input }] }]
125
+ : params.input;
126
+ if (params.input.length === 0) {
127
+ throw new OpenAIError('input must not be empty');
128
+ }
129
+ this.#sessions = sessions;
130
+ this.#sessionID = sessionID;
131
+ this.#input = { type: 'agent.session.input.message', input };
132
+ this.#handlers = new Map(Object.entries(params.toolHandlers ?? {}));
133
+ const headers = buildHeaders([options?.headers]);
134
+ this.#inputKey = headers.nulls.has('idempotency-key')
135
+ ? undefined
136
+ : (headers.values.get('idempotency-key') ??
137
+ params.idempotencyKey ??
138
+ options?.idempotencyKey ??
139
+ uuid4());
140
+ headers.values.delete('idempotency-key');
141
+ headers.nulls.delete('idempotency-key');
142
+ const { idempotencyKey: _key, ...rest } = options ?? {};
143
+ this.#options = { ...rest, headers };
144
+ }
145
+
146
+ /** Closes local requests without cancelling the turn; an optional reason becomes the abort error's cause. */
147
+ abort(reason?: unknown): void {
148
+ this.controller.abort(reason);
149
+ this.#stream?.controller.abort(this.controller.signal.reason);
150
+ if (!this.#reading) {
151
+ void cancelBody(this.#response);
152
+ }
153
+ }
154
+
155
+ /** Starts iteration once; use for await to ensure early exits close the connection. */
156
+ [Symbol.asyncIterator](): AsyncIterator<AgentSessionEvent> {
157
+ if (this.#consumed) {
158
+ throw new OpenAIError('An AgentSessionStream can only be consumed once');
159
+ }
160
+ this.#consumed = true;
161
+ return this.#iterate();
162
+ }
163
+
164
+ async *#iterate(): AsyncGenerator<AgentSessionEvent> {
165
+ const externalSignal = this.#options.signal;
166
+ const abort = () =>
167
+ this.abort(externalSignal?.aborted ? externalSignal.reason : this.controller.signal.reason);
168
+ externalSignal?.addEventListener('abort', abort, { once: true });
169
+ this.controller.signal.addEventListener('abort', abort, { once: true });
170
+ const options = { ...this.#options, signal: this.controller.signal };
171
+ const state = new TurnState();
172
+ try {
173
+ if (externalSignal?.aborted) {
174
+ this.abort(externalSignal.reason);
175
+ }
176
+ this.#checkAbort();
177
+ const session = await this.#sessions.retrieve(this.#sessionID, options);
178
+ if (session.status !== 'idle') {
179
+ throw new OpenAIError(
180
+ 'sessions.stream requires an idle session; use sessions.events.stream for active sessions',
181
+ );
182
+ }
183
+ const subscription = await this.#sessions.events.stream(this.#sessionID, options).withResponse();
184
+ this.#stream = subscription.data;
185
+ this.#response = subscription.response;
186
+ this.#checkAbort();
187
+ await this.#sessions.events.create(
188
+ this.#sessionID,
189
+ {
190
+ events: [this.#input],
191
+ ...(this.#inputKey === undefined ? {} : { 'Idempotency-Key': this.#inputKey }),
192
+ },
193
+ {
194
+ ...options,
195
+ headers: buildHeaders([options.headers, { 'Idempotency-Key': this.#inputKey ?? null }]),
196
+ },
197
+ );
198
+ this.#checkAbort();
199
+ this.#reading = true;
200
+ for await (const event of this.#stream) {
201
+ this.#checkAbort();
202
+ if (!state.accept(event)) {
203
+ continue;
204
+ }
205
+ const terminal = state.terminal(event);
206
+ const pendingCall = state.call(event);
207
+ const handler = pendingCall && this.#handlers.get(pendingCall.name);
208
+ // Freeze dispatch identity and arguments before exposing the original event.
209
+ const call = pendingCall && handler ? structuredClone(pendingCall) : undefined;
210
+ if (terminal) {
211
+ this.#stream.controller.abort();
212
+ }
213
+ yield event;
214
+ if (terminal) {
215
+ return;
216
+ }
217
+ this.#checkAbort();
218
+ if (!call || !handler) {
219
+ continue;
220
+ }
221
+ const result = await this.#result(call, handler);
222
+ this.#checkAbort();
223
+ await this.#submit(result, options);
224
+ }
225
+ this.#checkAbort();
226
+ throw new OpenAIError('Session event stream ended before the turn reached idle or failed');
227
+ } finally {
228
+ externalSignal?.removeEventListener('abort', abort);
229
+ this.controller.signal.removeEventListener('abort', abort);
230
+ this.abort();
231
+ }
232
+ }
233
+
234
+ async #result(call: AgentFunctionCallItem, handler: AgentToolHandler): Promise<ToolResult> {
235
+ try {
236
+ const args: unknown = typeof call.arguments === 'string' ? JSON.parse(call.arguments) : call.arguments;
237
+ if (args === null || typeof args !== 'object' || Array.isArray(args)) {
238
+ throw new OpenAIError('Function arguments must be a JSON object');
239
+ }
240
+ return toolResult(call, await this.#wait(() => handler(args as Record<string, unknown>)));
241
+ } catch {
242
+ this.#checkAbort();
243
+ return {
244
+ type: 'agent.session.input.tool_result',
245
+ turn_id: call.turn_id,
246
+ call_id: call.call_id,
247
+ success: false,
248
+ error: 'Tool handler failed.',
249
+ };
250
+ }
251
+ }
252
+
253
+ #checkAbort(): void {
254
+ if (this.controller.signal.aborted) {
255
+ throw this.#abortError();
256
+ }
257
+ }
258
+
259
+ #abortError(): APIUserAbortError {
260
+ const error = new APIUserAbortError();
261
+ Object.defineProperty(error, 'cause', {
262
+ value: this.controller.signal.reason,
263
+ writable: true,
264
+ configurable: true,
265
+ });
266
+ return error;
267
+ }
268
+
269
+ async #wait<T>(action: () => T | PromiseLike<T>): Promise<T> {
270
+ let onAbort: (() => void) | undefined;
271
+ // oxlint-disable-next-line promise/avoid-new -- Bridge the caller's AbortSignal while a handler or registration delay is pending.
272
+ const aborted = new Promise<never>((_resolve, reject) => {
273
+ onAbort = () => reject(this.#abortError());
274
+ this.controller.signal.addEventListener('abort', onAbort, { once: true });
275
+ });
276
+ try {
277
+ this.#checkAbort();
278
+ // Capture synchronous throws before racing cancellation, so both promises
279
+ // always have rejection handlers even if the callback aborts and throws.
280
+ const invoke = async () => await action();
281
+ return await Promise.race([invoke(), aborted]);
282
+ } finally {
283
+ if (onAbort) {
284
+ this.controller.signal.removeEventListener('abort', onAbort);
285
+ }
286
+ }
287
+ }
288
+
289
+ async #submit(result: ToolResult, options: RequestOptions, key = uuid4(), attempt = 0): Promise<void> {
290
+ this.#checkAbort();
291
+ try {
292
+ await this.#sessions.events.create(
293
+ this.#sessionID,
294
+ { events: [result], 'Idempotency-Key': key },
295
+ options,
296
+ );
297
+ } catch (error) {
298
+ const delay = [100, 300, 600][attempt];
299
+ if (
300
+ delay === undefined ||
301
+ !(error instanceof BadRequestError) ||
302
+ error.code !== 'invalid_request_error' ||
303
+ !error.error ||
304
+ !('message' in error.error) ||
305
+ error.error.message !== `Unknown pending tool call: ${result.call_id}`
306
+ ) {
307
+ throw error;
308
+ }
309
+ let timer: ReturnType<typeof setTimeout> | undefined;
310
+ try {
311
+ await this.#wait(
312
+ () =>
313
+ // oxlint-disable-next-line promise/avoid-new -- Own the registration timer so cancellation clears it promptly.
314
+ new Promise<void>((resolve) => {
315
+ timer = setTimeout(resolve, delay);
316
+ }),
317
+ );
318
+ } finally {
319
+ if (timer !== undefined) {
320
+ clearTimeout(timer);
321
+ }
322
+ }
323
+ await this.#submit(result, options, key, attempt + 1);
324
+ }
325
+ }
326
+ }
@@ -0,0 +1,6 @@
1
+ import type { AgentSessionMessage } from '../../resources/beta/agents/agents';
2
+
3
+ /** Joins output_text blocks in content order, without filtering phase, fetching, or mutating the message. */
4
+ export function outputText(message: AgentSessionMessage): string {
5
+ return message.content.map((block) => (block.type === 'output_text' ? block.text : '')).join('');
6
+ }
@@ -0,0 +1,61 @@
1
+ import type { AgentSessionEvent, AgentFunctionCallItem } from '../../resources/beta/agents/agents';
2
+
3
+ /** Tracks one helper invocation's coordinator turn and duplicate deliveries.
4
+ * @internal
5
+ */
6
+ export class TurnState {
7
+ #turnID: string | undefined;
8
+ #turnEnded = false;
9
+ #eventIDs = new Set<string>();
10
+ #calls = new Set<string>();
11
+
12
+ /** Records a delivery unless its event ID is in the bounded recent window. */
13
+ accept(event: AgentSessionEvent): boolean {
14
+ if (this.#eventIDs.has(event.event_id)) {
15
+ return false;
16
+ }
17
+ if (this.#eventIDs.size === 1024) {
18
+ const oldest = this.#eventIDs.values().next();
19
+ if (!oldest.done) {
20
+ this.#eventIDs.delete(oldest.value);
21
+ }
22
+ }
23
+ this.#eventIDs.add(event.event_id);
24
+ if (
25
+ event.type === 'agent.session.turn.created' &&
26
+ event.turn.subagent_id === null &&
27
+ this.#turnID === undefined
28
+ ) {
29
+ this.#turnID = event.turn_id;
30
+ }
31
+ if (
32
+ (event.type === 'agent.session.turn.completed' ||
33
+ event.type === 'agent.session.turn.failed' ||
34
+ event.type === 'agent.session.turn.cancelled') &&
35
+ this.#turnID !== undefined &&
36
+ event.turn_id === this.#turnID
37
+ ) {
38
+ this.#turnEnded = true;
39
+ }
40
+ return true;
41
+ }
42
+
43
+ /** Checks session termination after updating the selected turn state. */
44
+ terminal(event: AgentSessionEvent): boolean {
45
+ return event.type === 'agent.session.failed' || (event.type === 'agent.session.idle' && this.#turnEnded);
46
+ }
47
+
48
+ /** Returns each tool call once for the full invocation, including subagent turns. */
49
+ call(event: AgentSessionEvent): AgentFunctionCallItem | undefined {
50
+ if (event.type !== 'agent.session.turn.item.added' || event.item.type !== 'function_call') {
51
+ return;
52
+ }
53
+ const call = event.item;
54
+ const key = JSON.stringify([call.turn_id, call.call_id]);
55
+ if (this.#calls.has(key)) {
56
+ return;
57
+ }
58
+ this.#calls.add(key);
59
+ return call;
60
+ }
61
+ }