openai 0.103.0 → 0.104.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +81 -0
  3. data/README.md +23 -1
  4. data/lib/openai/client.rb +3 -386
  5. data/lib/openai/helpers/admin/organization/projects/api_keys.rb +42 -0
  6. data/lib/openai/helpers/agents/session_stream_resource.rb +60 -0
  7. data/lib/openai/helpers/beta/agents/artifacts.rb +18 -0
  8. data/lib/openai/helpers/beta/agents/files.rb +41 -0
  9. data/lib/openai/helpers/client_runtime.rb +391 -0
  10. data/lib/openai/helpers/files.rb +47 -0
  11. data/lib/openai/helpers/live/websocket.rb +8 -57
  12. data/lib/openai/helpers/models/chat/parsed.rb +32 -0
  13. data/lib/openai/helpers/models/responses/parsed.rb +30 -0
  14. data/lib/openai/helpers/models/responses/response.rb +32 -0
  15. data/lib/openai/helpers/models/webhooks/webhook_endpoint_with_secret.rb +20 -0
  16. data/lib/openai/helpers/realtime/client_extension.rb +1 -2
  17. data/lib/openai/helpers/realtime/connection_manager.rb +1 -1
  18. data/lib/openai/helpers/realtime/translation.rb +7 -50
  19. data/lib/openai/helpers/responses_websocket/client_extension.rb +1 -2
  20. data/lib/openai/helpers/streaming/chat_completion_resource.rb +36 -0
  21. data/lib/openai/helpers/streaming/response_stream.rb +1 -16
  22. data/lib/openai/helpers/streaming/response_stream_resource.rb +78 -0
  23. data/lib/openai/helpers/vector_stores/file_batches.rb +188 -0
  24. data/lib/openai/helpers/vector_stores/files.rb +198 -0
  25. data/lib/openai/helpers/websocket/client_request.rb +31 -6
  26. data/lib/openai/helpers/websocket/connection.rb +58 -0
  27. data/lib/openai/helpers/websocket/connection_manager.rb +4 -2
  28. data/lib/openai/helpers/websocket/protocol.rb +2 -1
  29. data/lib/openai/helpers/websocket/resource.rb +54 -0
  30. data/lib/openai/helpers/websocket/typed_connection.rb +95 -0
  31. data/lib/openai/helpers/websocket.rb +4 -0
  32. data/lib/openai/models/admin/organization/audit_log_list_response.rb +5 -3
  33. data/lib/openai/models/admin/organization/external_storage_configuration.rb +5 -3
  34. data/lib/openai/models/admin/organization/external_storage_create_params.rb +33 -3
  35. data/lib/openai/models/admin/organization/oci_external_storage_provider.rb +37 -0
  36. data/lib/openai/models/admin/organization/project_residency.rb +3 -0
  37. data/lib/openai/models/admin/organization/projects/api_key_update_params.rb +64 -0
  38. data/lib/openai/models/admin/organization/projects/api_key_update_scopes_params.rb +34 -0
  39. data/lib/openai/models/admin/organization/usage_decisions_params.rb +177 -0
  40. data/lib/openai/models/admin/organization/usage_decisions_response.rb +351 -0
  41. data/lib/openai/models/audio/speech_create_params.rb +6 -3
  42. data/lib/openai/models/audio/translation_create_response.rb +0 -1
  43. data/lib/openai/models/audio/voice.rb +17 -2
  44. data/lib/openai/models/audio/voice_create_params.rb +100 -3
  45. data/lib/openai/models/beta/agent_create_params.rb +4 -2
  46. data/lib/openai/models/beta/agent_list_params.rb +4 -4
  47. data/lib/openai/models/beta/agent_session.rb +37 -1
  48. data/lib/openai/models/beta/agent_update_params.rb +4 -2
  49. data/lib/openai/models/beta/agents/environment_list_params.rb +7 -7
  50. data/lib/openai/models/beta/agents/session_create_params.rb +39 -3
  51. data/lib/openai/models/beta/agents/session_list_params.rb +7 -10
  52. data/lib/openai/models/beta/agents/session_update_params.rb +33 -1
  53. data/lib/openai/models/beta/agents/sessions/artifact_list_params.rb +11 -11
  54. data/lib/openai/models/beta/agents/vault_list_params.rb +23 -13
  55. data/lib/openai/models/beta/agents/vault_status_filter.rb +1 -3
  56. data/lib/openai/models/beta/agents/vault_update_params.rb +47 -0
  57. data/lib/openai/models/beta/agents/vaults/credential_list_params.rb +23 -13
  58. data/lib/openai/models/beta/beta_response.rb +23 -2
  59. data/lib/openai/models/beta/beta_response_error.rb +19 -1
  60. data/lib/openai/models/beta/beta_response_input_item.rb +107 -1
  61. data/lib/openai/models/beta/beta_response_item.rb +107 -1
  62. data/lib/openai/models/beta/beta_response_output_item.rb +107 -1
  63. data/lib/openai/models/beta/beta_responses_client_event.rb +23 -2
  64. data/lib/openai/models/beta/response_compact_params.rb +21 -0
  65. data/lib/openai/models/beta/response_create_params.rb +23 -2
  66. data/lib/openai/models/beta/session_turn_error.rb +3 -0
  67. data/lib/openai/models/chat/chat_completion_audio_param.rb +3 -3
  68. data/lib/openai/models/chat/chat_completion_message.rb +0 -8
  69. data/lib/openai/models/chat/chat_completion_message_function_tool_call.rb +0 -8
  70. data/lib/openai/models/chat/completion_create_params.rb +5 -12
  71. data/lib/openai/models/chat_model.rb +21 -0
  72. data/lib/openai/models/conversations/conversation_item.rb +107 -1
  73. data/lib/openai/models/decision.rb +17 -2
  74. data/lib/openai/models/decision_create_params.rb +29 -12
  75. data/lib/openai/models/decision_input_image.rb +4 -3
  76. data/lib/openai/models/decision_input_message.rb +4 -4
  77. data/lib/openai/models/decision_input_part.rb +3 -2
  78. data/lib/openai/models/image_edit_completed_event.rb +1 -2
  79. data/lib/openai/models/image_edit_partial_image_event.rb +1 -2
  80. data/lib/openai/models/image_gen_completed_event.rb +1 -2
  81. data/lib/openai/models/image_gen_partial_image_event.rb +1 -2
  82. data/lib/openai/models/images_response.rb +1 -2
  83. data/lib/openai/models/live/built_in_voice.rb +1 -0
  84. data/lib/openai/models/live/client_event.rb +14 -2
  85. data/lib/openai/models/live/decision_create_event.rb +26 -0
  86. data/lib/openai/models/live/decision_event.rb +117 -0
  87. data/lib/openai/models/live/decision_item_create_event.rb +194 -0
  88. data/lib/openai/models/live/decision_item_created_event.rb +202 -0
  89. data/lib/openai/models/live/decision_item_delete_event.rb +38 -0
  90. data/lib/openai/models/live/decision_item_deleted_event.rb +46 -0
  91. data/lib/openai/models/live/decision_trigger.rb +244 -0
  92. data/lib/openai/models/live/decisions_delegation_config.rb +201 -0
  93. data/lib/openai/models/live/decisions_delegation_update_config.rb +208 -0
  94. data/lib/openai/models/live/delegation_created_event.rb +10 -10
  95. data/lib/openai/models/live/fork_client_event.rb +14 -2
  96. data/lib/openai/models/live/fork_server_event.rb +17 -2
  97. data/lib/openai/models/live/media_session_config.rb +47 -11
  98. data/lib/openai/models/live/output_audio_fixture_play_event.rb +48 -0
  99. data/lib/openai/models/live/output_audio_fixture_played_event.rb +42 -0
  100. data/lib/openai/models/live/output_audio_fixture_playing_event.rb +41 -0
  101. data/lib/openai/models/live/server_event.rb +17 -2
  102. data/lib/openai/models/live/session_accept_params.rb +47 -11
  103. data/lib/openai/models/live/session_config.rb +47 -11
  104. data/lib/openai/models/live/session_resource.rb +47 -11
  105. data/lib/openai/models/live/session_update_config.rb +38 -6
  106. data/lib/openai/models/live/session_update_event.rb +8 -8
  107. data/lib/openai/models/live/sideband_client_event.rb +57 -0
  108. data/lib/openai/models/live/sideband_server_event.rb +78 -0
  109. data/lib/openai/models/realtime/realtime_audio_config_output.rb +6 -3
  110. data/lib/openai/models/realtime/realtime_response_create_audio_output.rb +6 -3
  111. data/lib/openai/models/realtime/realtime_response_status.rb +10 -1
  112. data/lib/openai/models/response_format_json_schema.rb +1 -1
  113. data/lib/openai/models/responses/function_tool.rb +8 -6
  114. data/lib/openai/models/responses/response.rb +2 -23
  115. data/lib/openai/models/responses/response_compact_params.rb +21 -0
  116. data/lib/openai/models/responses/response_create_params.rb +3 -6
  117. data/lib/openai/models/responses/response_error.rb +19 -1
  118. data/lib/openai/models/responses/response_format_text_config.rb +0 -4
  119. data/lib/openai/models/responses/response_function_tool_call.rb +0 -8
  120. data/lib/openai/models/responses/response_input_item.rb +107 -1
  121. data/lib/openai/models/responses/response_item.rb +107 -1
  122. data/lib/openai/models/responses/response_output_item.rb +107 -1
  123. data/lib/openai/models/responses/response_output_text.rb +0 -8
  124. data/lib/openai/models/responses/responses_client_event.rb +2 -2
  125. data/lib/openai/models/safety/safety_alert.rb +12 -1
  126. data/lib/openai/models/video_create_error.rb +19 -1
  127. data/lib/openai/models/webhooks/unwrap_webhook_event.rb +4 -4
  128. data/lib/openai/models/webhooks/webhook_endpoint_with_secret.rb +0 -9
  129. data/lib/openai/resources/admin/organization/external_storage.rb +1 -1
  130. data/lib/openai/resources/admin/organization/projects/api_keys.rb +61 -0
  131. data/lib/openai/resources/admin/organization/usage.rb +67 -0
  132. data/lib/openai/resources/audio/speech.rb +2 -1
  133. data/lib/openai/resources/audio/voices.rb +10 -10
  134. data/lib/openai/resources/beta/agents/environments/files.rb +3 -31
  135. data/lib/openai/resources/beta/agents/environments.rb +3 -3
  136. data/lib/openai/resources/beta/agents/sessions/artifacts.rb +5 -11
  137. data/lib/openai/resources/beta/agents/sessions.rb +20 -56
  138. data/lib/openai/resources/beta/agents/vaults/credentials.rb +10 -6
  139. data/lib/openai/resources/beta/agents/vaults.rb +45 -6
  140. data/lib/openai/resources/beta/agents.rb +6 -4
  141. data/lib/openai/resources/beta/responses.rb +2 -2
  142. data/lib/openai/resources/chat/completions.rb +11 -37
  143. data/lib/openai/resources/decisions.rb +9 -15
  144. data/lib/openai/resources/files.rb +0 -39
  145. data/lib/openai/resources/live/forks.rb +19 -0
  146. data/lib/openai/resources/live/sideband.rb +19 -0
  147. data/lib/openai/resources/live.rb +19 -0
  148. data/lib/openai/resources/realtime/translations.rb +19 -0
  149. data/lib/openai/resources/realtime.rb +19 -0
  150. data/lib/openai/resources/responses.rb +44 -95
  151. data/lib/openai/resources/vector_stores/file_batches.rb +0 -178
  152. data/lib/openai/resources/vector_stores/files.rb +0 -188
  153. data/lib/openai/resources/webhooks.rb +13 -29
  154. data/lib/openai/version.rb +1 -1
  155. data/lib/openai.rb +31 -0
  156. data/rbi/openai/client.rbi +0 -103
  157. data/rbi/openai/helpers/admin/organization/projects/api_keys.rbi +25 -0
  158. data/rbi/openai/helpers/beta/agents/artifacts.rbi +25 -0
  159. data/rbi/openai/helpers/beta/agents/files.rbi +48 -0
  160. data/rbi/openai/helpers/client_runtime.rbi +108 -0
  161. data/rbi/openai/helpers/files.rbi +25 -0
  162. data/rbi/openai/helpers/models/chat/parsed.rbi +21 -0
  163. data/rbi/openai/helpers/models/responses/parsed.rbi +19 -0
  164. data/rbi/openai/helpers/models/responses/response.rbi +15 -0
  165. data/rbi/openai/helpers/streaming/response_stream.rbi +301 -0
  166. data/rbi/openai/helpers/vector_stores/file_batches.rbi +102 -0
  167. data/rbi/openai/helpers/vector_stores/files.rbi +122 -0
  168. data/rbi/openai/helpers/websocket.rbi +82 -0
  169. data/rbi/openai/models/admin/organization/audit_log_list_response.rbi +6 -3
  170. data/rbi/openai/models/admin/organization/external_storage_configuration.rbi +4 -2
  171. data/rbi/openai/models/admin/organization/external_storage_create_params.rbi +63 -4
  172. data/rbi/openai/models/admin/organization/oci_external_storage_provider.rbi +71 -0
  173. data/rbi/openai/models/admin/organization/project_residency.rbi +12 -0
  174. data/rbi/openai/models/admin/organization/projects/api_key_update_params.rbi +110 -0
  175. data/rbi/openai/models/admin/organization/projects/api_key_update_scopes_params.rbi +72 -0
  176. data/rbi/openai/models/admin/organization/usage_decisions_params.rbi +229 -0
  177. data/rbi/openai/models/admin/organization/usage_decisions_response.rbi +479 -0
  178. data/rbi/openai/models/audio/speech_create_params.rbi +6 -3
  179. data/rbi/openai/models/audio/voice.rbi +21 -2
  180. data/rbi/openai/models/audio/voice_create_params.rbi +149 -4
  181. data/rbi/openai/models/beta/agent_create_params.rbi +4 -2
  182. data/rbi/openai/models/beta/agent_list_params.rbi +8 -5
  183. data/rbi/openai/models/beta/agent_session.rbi +64 -1
  184. data/rbi/openai/models/beta/agent_update_params.rbi +4 -2
  185. data/rbi/openai/models/beta/agents/environment_list_params.rbi +7 -7
  186. data/rbi/openai/models/beta/agents/session_create_params.rbi +62 -2
  187. data/rbi/openai/models/beta/agents/session_list_params.rbi +11 -11
  188. data/rbi/openai/models/beta/agents/session_update_params.rbi +56 -0
  189. data/rbi/openai/models/beta/agents/sessions/artifact_list_params.rbi +19 -13
  190. data/rbi/openai/models/beta/agents/vault_list_params.rbi +30 -13
  191. data/rbi/openai/models/beta/agents/vault_status_filter.rbi +1 -3
  192. data/rbi/openai/models/beta/agents/vault_update_params.rbi +87 -0
  193. data/rbi/openai/models/beta/agents/vaults/credential_list_params.rbi +30 -13
  194. data/rbi/openai/models/beta/beta_response.rbi +2 -2
  195. data/rbi/openai/models/beta/beta_response_error.rbi +24 -3
  196. data/rbi/openai/models/beta/beta_response_input_item.rbi +191 -0
  197. data/rbi/openai/models/beta/beta_response_item.rbi +189 -0
  198. data/rbi/openai/models/beta/beta_response_output_item.rbi +191 -0
  199. data/rbi/openai/models/beta/beta_responses_client_event.rbi +2 -2
  200. data/rbi/openai/models/beta/response_create_params.rbi +2 -2
  201. data/rbi/openai/models/beta/session_turn_error.rbi +3 -0
  202. data/rbi/openai/models/chat/chat_completion_audio_param.rbi +3 -3
  203. data/rbi/openai/models/chat/chat_completion_message.rbi +0 -4
  204. data/rbi/openai/models/chat/chat_completion_message_function_tool_call.rbi +0 -4
  205. data/rbi/openai/models/chat/completion_create_params.rbi +63 -78
  206. data/rbi/openai/models/conversations/conversation_item.rbi +191 -0
  207. data/rbi/openai/models/decision.rbi +14 -1
  208. data/rbi/openai/models/decision_create_params.rbi +23 -12
  209. data/rbi/openai/models/decision_input_image.rbi +4 -3
  210. data/rbi/openai/models/decision_input_message.rbi +4 -4
  211. data/rbi/openai/models/decision_input_part.rbi +2 -1
  212. data/rbi/openai/models/image_edit_completed_event.rbi +1 -0
  213. data/rbi/openai/models/image_edit_partial_image_event.rbi +1 -0
  214. data/rbi/openai/models/image_gen_completed_event.rbi +1 -0
  215. data/rbi/openai/models/image_gen_partial_image_event.rbi +1 -0
  216. data/rbi/openai/models/images_response.rbi +1 -0
  217. data/rbi/openai/models/live/built_in_voice.rbi +1 -0
  218. data/rbi/openai/models/live/client_event.rbi +4 -0
  219. data/rbi/openai/models/live/decision_create_event.rbi +55 -0
  220. data/rbi/openai/models/live/decision_event.rbi +185 -0
  221. data/rbi/openai/models/live/decision_item_create_event.rbi +338 -0
  222. data/rbi/openai/models/live/decision_item_created_event.rbi +354 -0
  223. data/rbi/openai/models/live/decision_item_delete_event.rbi +66 -0
  224. data/rbi/openai/models/live/decision_item_deleted_event.rbi +77 -0
  225. data/rbi/openai/models/live/decision_trigger.rbi +465 -0
  226. data/rbi/openai/models/live/decisions_delegation_config.rbi +393 -0
  227. data/rbi/openai/models/live/decisions_delegation_update_config.rbi +412 -0
  228. data/rbi/openai/models/live/delegation_created_event.rbi +8 -10
  229. data/rbi/openai/models/live/fork_client_event.rbi +4 -0
  230. data/rbi/openai/models/live/fork_server_event.rbi +5 -0
  231. data/rbi/openai/models/live/media_session_config.rbi +95 -14
  232. data/rbi/openai/models/live/output_audio_fixture_play_event.rbi +76 -0
  233. data/rbi/openai/models/live/output_audio_fixture_played_event.rbi +73 -0
  234. data/rbi/openai/models/live/output_audio_fixture_playing_event.rbi +72 -0
  235. data/rbi/openai/models/live/server_event.rbi +5 -0
  236. data/rbi/openai/models/live/session_accept_params.rbi +88 -12
  237. data/rbi/openai/models/live/session_config.rbi +100 -14
  238. data/rbi/openai/models/live/session_resource.rbi +81 -10
  239. data/rbi/openai/models/live/session_update_config.rbi +86 -9
  240. data/rbi/openai/models/live/session_update_event.rbi +8 -8
  241. data/rbi/openai/models/live/sideband_client_event.rbi +40 -0
  242. data/rbi/openai/models/live/sideband_server_event.rbi +47 -0
  243. data/rbi/openai/models/realtime/realtime_audio_config_output.rbi +6 -3
  244. data/rbi/openai/models/realtime/realtime_response_create_audio_output.rbi +6 -3
  245. data/rbi/openai/models/realtime/realtime_response_status.rbi +13 -1
  246. data/rbi/openai/models/realtime/realtime_translation_input_audio_buffer_append_event.rbi +1 -1
  247. data/rbi/openai/models/realtime/realtime_translation_output_audio_delta_event.rbi +3 -3
  248. data/rbi/openai/models/realtime/realtime_translation_session_close_event.rbi +1 -1
  249. data/rbi/openai/models/realtime/realtime_translation_session_update_event.rbi +5 -1
  250. data/rbi/openai/models/responses/response.rbi +2 -7
  251. data/rbi/openai/models/responses/response_create_params.rbi +5 -9
  252. data/rbi/openai/models/responses/response_error.rbi +24 -3
  253. data/rbi/openai/models/responses/response_function_tool_call.rbi +0 -4
  254. data/rbi/openai/models/responses/response_function_web_search.rbi +21 -17
  255. data/rbi/openai/models/responses/response_input_item.rbi +191 -0
  256. data/rbi/openai/models/responses/response_item.rbi +189 -0
  257. data/rbi/openai/models/responses/response_output_item.rbi +191 -0
  258. data/rbi/openai/models/responses/response_output_text.rbi +0 -4
  259. data/rbi/openai/models/responses/responses_client_event.rbi +2 -2
  260. data/rbi/openai/models/safety/safety_alert.rbi +13 -1
  261. data/rbi/openai/models/video_create_error.rbi +24 -3
  262. data/rbi/openai/models/webhooks/unwrap_webhook_event.rbi +1 -1
  263. data/rbi/openai/resources/admin/organization/external_storage.rbi +2 -1
  264. data/rbi/openai/resources/admin/organization/projects/api_keys.rbi +48 -0
  265. data/rbi/openai/resources/admin/organization/usage.rbi +56 -0
  266. data/rbi/openai/resources/audio/speech.rbi +2 -1
  267. data/rbi/openai/resources/audio/voices.rbi +13 -10
  268. data/rbi/openai/resources/beta/agents/environments/files.rbi +3 -33
  269. data/rbi/openai/resources/beta/agents/environments.rbi +3 -3
  270. data/rbi/openai/resources/beta/agents/sessions/artifacts.rbi +5 -13
  271. data/rbi/openai/resources/beta/agents/sessions.rbi +15 -4
  272. data/rbi/openai/resources/beta/agents/vaults/credentials.rbi +9 -5
  273. data/rbi/openai/resources/beta/agents/vaults.rbi +34 -5
  274. data/rbi/openai/resources/beta/agents.rbi +6 -4
  275. data/rbi/openai/resources/beta/responses.rbi +2 -2
  276. data/rbi/openai/resources/chat/completions.rbi +26 -29
  277. data/rbi/openai/resources/decisions.rbi +9 -15
  278. data/rbi/openai/resources/files.rbi +0 -18
  279. data/rbi/openai/resources/live/forks.rbi +17 -0
  280. data/rbi/openai/resources/live/sideband.rbi +17 -0
  281. data/rbi/openai/resources/live.rbi +17 -0
  282. data/rbi/openai/resources/realtime/translations.rbi +17 -0
  283. data/rbi/openai/resources/realtime.rbi +17 -0
  284. data/rbi/openai/resources/responses.rbi +41 -333
  285. data/rbi/openai/resources/vector_stores/file_batches.rbi +0 -93
  286. data/rbi/openai/resources/vector_stores/files.rbi +0 -113
  287. data/rbi/openai/resources/webhooks.rbi +1 -1
  288. data/sig/openai/client.rbs +0 -50
  289. data/sig/openai/helpers/admin/organization/projects/api_keys.rbs +18 -0
  290. data/sig/openai/helpers/beta/agents/artifacts.rbs +17 -0
  291. data/sig/openai/helpers/beta/agents/files.rbs +30 -0
  292. data/sig/openai/helpers/client_runtime.rbs +53 -0
  293. data/sig/openai/helpers/files.rbs +12 -0
  294. data/sig/openai/helpers/models/responses/response.rbs +9 -0
  295. data/sig/openai/helpers/streaming/response_stream.rbs +37 -0
  296. data/sig/openai/helpers/vector_stores/file_batches.rbs +38 -0
  297. data/sig/openai/helpers/vector_stores/files.rbs +43 -0
  298. data/sig/openai/helpers/websocket.rbs +40 -0
  299. data/sig/openai/models/admin/organization/audit_log_list_response.rbs +1 -0
  300. data/sig/openai/models/admin/organization/external_storage_configuration.rbs +1 -0
  301. data/sig/openai/models/admin/organization/external_storage_create_params.rbs +33 -0
  302. data/sig/openai/models/admin/organization/oci_external_storage_provider.rbs +34 -0
  303. data/sig/openai/models/admin/organization/project_residency.rbs +6 -0
  304. data/sig/openai/models/admin/organization/projects/api_key_update_params.rbs +77 -0
  305. data/sig/openai/models/admin/organization/projects/api_key_update_scopes_params.rbs +38 -0
  306. data/sig/openai/models/admin/organization/usage_decisions_params.rbs +170 -0
  307. data/sig/openai/models/admin/organization/usage_decisions_response.rbs +319 -0
  308. data/sig/openai/models/audio/speech_create_params.rbs +4 -2
  309. data/sig/openai/models/audio/voice.rbs +21 -3
  310. data/sig/openai/models/audio/voice_create_params.rbs +90 -1
  311. data/sig/openai/models/beta/agent_create_params.rbs +4 -2
  312. data/sig/openai/models/beta/agent_list_params.rbs +9 -6
  313. data/sig/openai/models/beta/agent_session.rbs +36 -2
  314. data/sig/openai/models/beta/agent_update_params.rbs +4 -2
  315. data/sig/openai/models/beta/agents/environment_list_params.rbs +9 -9
  316. data/sig/openai/models/beta/agents/session_create_params.rbs +29 -2
  317. data/sig/openai/models/beta/agents/session_list_params.rbs +12 -12
  318. data/sig/openai/models/beta/agents/session_update_params.rbs +23 -0
  319. data/sig/openai/models/beta/agents/sessions/artifact_list_params.rbs +21 -15
  320. data/sig/openai/models/beta/agents/vault_list_params.rbs +32 -14
  321. data/sig/openai/models/beta/agents/vault_update_params.rbs +54 -0
  322. data/sig/openai/models/beta/agents/vaults/credential_list_params.rbs +32 -14
  323. data/sig/openai/models/beta/beta_response.rbs +2 -2
  324. data/sig/openai/models/beta/beta_response_error.rbs +19 -3
  325. data/sig/openai/models/beta/beta_response_input_item.rbs +110 -0
  326. data/sig/openai/models/beta/beta_response_item.rbs +110 -0
  327. data/sig/openai/models/beta/beta_response_output_item.rbs +110 -0
  328. data/sig/openai/models/beta/beta_responses_client_event.rbs +2 -2
  329. data/sig/openai/models/beta/response_create_params.rbs +2 -2
  330. data/sig/openai/models/beta/session_turn_error.rbs +4 -0
  331. data/sig/openai/models/chat/chat_completion_audio_param.rbs +2 -2
  332. data/sig/openai/models/chat/completion_create_params.rbs +2 -2
  333. data/sig/openai/models/conversations/conversation_item.rbs +110 -0
  334. data/sig/openai/models/decision.rbs +13 -0
  335. data/sig/openai/models/decision_create_params.rbs +19 -8
  336. data/sig/openai/models/decision_input_image.rbs +2 -2
  337. data/sig/openai/models/decision_input_message.rbs +2 -2
  338. data/sig/openai/models/live/built_in_voice.rbs +2 -0
  339. data/sig/openai/models/live/client_event.rbs +4 -0
  340. data/sig/openai/models/live/decision_create_event.rbs +18 -0
  341. data/sig/openai/models/live/decision_event.rbs +102 -0
  342. data/sig/openai/models/live/decision_item_create_event.rbs +183 -0
  343. data/sig/openai/models/live/decision_item_created_event.rbs +195 -0
  344. data/sig/openai/models/live/decision_item_delete_event.rbs +33 -0
  345. data/sig/openai/models/live/decision_item_deleted_event.rbs +49 -0
  346. data/sig/openai/models/live/decision_trigger.rbs +234 -0
  347. data/sig/openai/models/live/decisions_delegation_config.rbs +195 -0
  348. data/sig/openai/models/live/decisions_delegation_update_config.rbs +202 -0
  349. data/sig/openai/models/live/delegation_created_event.rbs +6 -7
  350. data/sig/openai/models/live/fork_client_event.rbs +4 -0
  351. data/sig/openai/models/live/fork_server_event.rbs +5 -0
  352. data/sig/openai/models/live/media_session_config.rbs +58 -11
  353. data/sig/openai/models/live/output_audio_fixture_play_event.rbs +42 -0
  354. data/sig/openai/models/live/output_audio_fixture_played_event.rbs +44 -0
  355. data/sig/openai/models/live/output_audio_fixture_playing_event.rbs +44 -0
  356. data/sig/openai/models/live/server_event.rbs +5 -0
  357. data/sig/openai/models/live/session_accept_params.rbs +57 -10
  358. data/sig/openai/models/live/session_config.rbs +58 -11
  359. data/sig/openai/models/live/session_resource.rbs +57 -10
  360. data/sig/openai/models/live/session_update_config.rbs +54 -3
  361. data/sig/openai/models/live/session_update_event.rbs +6 -6
  362. data/sig/openai/models/live/sideband_client_event.rbs +26 -0
  363. data/sig/openai/models/live/sideband_server_event.rbs +33 -0
  364. data/sig/openai/models/realtime/realtime_audio_config_output.rbs +6 -3
  365. data/sig/openai/models/realtime/realtime_response_create_audio_output.rbs +6 -3
  366. data/sig/openai/models/realtime/realtime_response_status.rbs +15 -3
  367. data/sig/openai/models/responses/response.rbs +2 -4
  368. data/sig/openai/models/responses/response_create_params.rbs +2 -2
  369. data/sig/openai/models/responses/response_error.rbs +19 -3
  370. data/sig/openai/models/responses/response_input_item.rbs +110 -0
  371. data/sig/openai/models/responses/response_item.rbs +110 -0
  372. data/sig/openai/models/responses/response_output_item.rbs +110 -0
  373. data/sig/openai/models/responses/responses_client_event.rbs +2 -2
  374. data/sig/openai/models/safety/safety_alert.rbs +12 -2
  375. data/sig/openai/models/video_create_error.rbs +19 -3
  376. data/sig/openai/models/webhooks/unwrap_webhook_event.rbs +1 -1
  377. data/sig/openai/resources/admin/organization/projects/api_keys.rbs +8 -0
  378. data/sig/openai/resources/admin/organization/usage.rbs +15 -0
  379. data/sig/openai/resources/beta/agents/environments/files.rbs +0 -17
  380. data/sig/openai/resources/beta/agents/sessions/artifacts.rbs +2 -6
  381. data/sig/openai/resources/beta/agents/sessions.rbs +4 -1
  382. data/sig/openai/resources/beta/agents/vaults/credentials.rbs +2 -1
  383. data/sig/openai/resources/beta/agents/vaults.rbs +9 -1
  384. data/sig/openai/resources/beta/agents.rbs +1 -1
  385. data/sig/openai/resources/files.rbs +0 -7
  386. data/sig/openai/resources/live/forks.rbs +8 -0
  387. data/sig/openai/resources/live/sideband.rbs +8 -0
  388. data/sig/openai/resources/live.rbs +7 -0
  389. data/sig/openai/resources/realtime/translations.rbs +7 -0
  390. data/sig/openai/resources/realtime.rbs +7 -0
  391. data/sig/openai/resources/responses.rbs +7 -31
  392. data/sig/openai/resources/vector_stores/file_batches.rbs +0 -31
  393. data/sig/openai/resources/vector_stores/files.rbs +0 -36
  394. data/sig/openai/resources/webhooks.rbs +1 -1
  395. metadata +89 -1
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../../models/responses/response"
4
+
5
+ module OpenAI
6
+ module Models
7
+ module Responses
8
+ class Response
9
+ # Convenience property that aggregates all `output_text` items from the `output` list.
10
+ #
11
+ # If no `output_text` content blocks exist, then an empty string is returned.
12
+ #
13
+ # @return [String]
14
+ def output_text
15
+ texts = []
16
+
17
+ output.each do |item|
18
+ next unless item.is_a?(OpenAI::Models::Responses::ResponseOutputMessage)
19
+
20
+ item.content.each do |content|
21
+ next unless content.is_a?(OpenAI::Models::Responses::ResponseOutputText)
22
+
23
+ texts << content.text
24
+ end
25
+ end
26
+
27
+ texts.join
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../../models/webhooks/webhook_endpoint_with_secret"
4
+
5
+ module OpenAI
6
+ module Models
7
+ module Webhooks
8
+ class WebhookEndpointWithSecret
9
+ # Keep diagnostics safe without changing field access or serialization.
10
+ def to_s = deep_to_h.merge(signing_secret: "[REDACTED]").to_s
11
+
12
+ def inspect
13
+ converted = self.class.recursively_to_h(self, convert: true)
14
+ converted[:signing_secret] = "[REDACTED]"
15
+ "#<#{self.class}:0x#{object_id.to_s(16)} #{converted}>"
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -166,8 +166,7 @@ module OpenAI
166
166
  deadline: nil
167
167
  )
168
168
  build_shared_websocket_connection_request(
169
- path: path,
170
- query: query,
169
+ request: realtime.__websocket_request(query: query).merge(path: path),
171
170
  websocket_base_url: websocket_base_url,
172
171
  options: options,
173
172
  deadline: deadline,
@@ -25,7 +25,7 @@ module OpenAI
25
25
  base_url = websocket_base_url&.to_s&.dup&.freeze
26
26
  request = lambda do |&request_block|
27
27
  client.with_realtime_connection_request(
28
- path: "realtime",
28
+ path: client.realtime.__websocket_request.fetch(:path),
29
29
  query: query,
30
30
  websocket_base_url: base_url,
31
31
  options: request_options,
@@ -53,6 +53,7 @@ module OpenAI
53
53
  # read through session.closed before leaving the block to consume it.
54
54
  class TranslationConnection < OpenAI::WebSocket::Connection
55
55
  include OpenAI::WebSocket::Protocol
56
+ include OpenAI::WebSocket::GuardedConnection
56
57
 
57
58
  # Timeout implementations before Ruby 4 raise StandardError through the
58
59
  # scheduler. Cross transport error wrappers without changing raw callers.
@@ -135,27 +136,6 @@ module OpenAI
135
136
  end
136
137
  end
137
138
 
138
- def closed? = @poisoned || @closed || super
139
-
140
- def close(code: 1000, reason: "")
141
- @poisoned || @closed ? abort : super
142
- @closed = true
143
- nil
144
- rescue StandardError
145
- @poisoned = true
146
- raise OpenAI::Errors::TranslationConnectionError.new(url: @url), cause: nil
147
- end
148
-
149
- # @api private
150
- def abort
151
- super
152
- @closed = true
153
- nil
154
- rescue StandardError
155
- @poisoned = true
156
- raise OpenAI::Errors::TranslationConnectionError.new(url: @url), cause: nil
157
- end
158
-
159
139
  private def write_text(text, finish: false)
160
140
  @write_mutex.synchronize do
161
141
  if @finish_requested || (@finish_owner && !finish)
@@ -164,18 +144,7 @@ module OpenAI
164
144
 
165
145
  raise connection_error("Cannot send on a closed Realtime Translation WebSocket.") if closed?
166
146
  @finish_requested = true if finish
167
- complete = false
168
- begin
169
- super(text)
170
- complete = true
171
- nil
172
- rescue StandardError
173
- raise OpenAI::Errors::TranslationConnectionError.new(url: @url), cause: nil
174
- ensure
175
- # Ruby's Timeout and task cancellation may bypass StandardError.
176
- # Do not let ordinary cleanup flush an uncertain buffered write.
177
- @poisoned = true unless complete
178
- end
147
+ super(text)
179
148
  end
180
149
  end
181
150
 
@@ -189,26 +158,12 @@ module OpenAI
189
158
  end
190
159
 
191
160
  begin
192
- raise connection_error("Cannot read from a failed Realtime Translation WebSocket.") if @poisoned
193
- return nil if @closed
194
- text = super
195
- @closed = text.nil?
196
- text
197
- rescue StandardError
198
- @poisoned = true
199
- raise OpenAI::Errors::TranslationConnectionError.new(url: @url), cause: nil
161
+ super
200
162
  ensure
201
163
  @read_state_mutex.synchronize { @active_reads -= 1 }
202
164
  end
203
165
  end
204
166
 
205
- private def socket_closed?
206
- super
207
- rescue StandardError
208
- @poisoned = true
209
- raise OpenAI::Errors::TranslationConnectionError.new(url: @url), cause: nil
210
- end
211
-
212
167
  private def encode_client_event(event)
213
168
  validate_client_tree!(event)
214
169
  union = OpenAI::Realtime::RealtimeTranslationClientEvent
@@ -337,6 +292,9 @@ module OpenAI
337
292
  event
338
293
  end
339
294
 
295
+ private def transport_error = OpenAI::Errors::TranslationConnectionError.new(url: @url)
296
+ private def failed_read_message = "Cannot read from a failed Realtime Translation WebSocket."
297
+
340
298
  private def connection_error(message)
341
299
  OpenAI::Errors::TranslationConnectionError.new(url: @url, message: message)
342
300
  end
@@ -352,8 +310,7 @@ module OpenAI
352
310
  query = {"model" => model.to_s.dup.freeze}.freeze
353
311
  build = lambda do |deadline|
354
312
  build_shared_websocket_connection_request(
355
- path: "realtime/translations",
356
- query: query,
313
+ request: realtime.translations.__websocket_request(query: query),
357
314
  websocket_base_url: websocket_base_url,
358
315
  options: options,
359
316
  deadline: deadline,
@@ -29,8 +29,7 @@ module OpenAI
29
29
  deadline: nil
30
30
  )
31
31
  build_shared_websocket_connection_request(
32
- path: "responses",
33
- query: {},
32
+ request: responses.__websocket_request,
34
33
  websocket_base_url: websocket_base_url,
35
34
  options: options,
36
35
  deadline: deadline,
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenAI
4
+ module Resources
5
+ class Chat
6
+ class Completions
7
+ def stream(params)
8
+ parsed, options = OpenAI::Chat::CompletionCreateParams.dump_request(params)
9
+
10
+ parsed.store(:stream, true)
11
+
12
+ response_format, tool_models = get_structured_output_models(parsed)
13
+
14
+ input_tools = build_tools_with_models(parsed[:tools], tool_models)
15
+
16
+ raw_stream = @client.request(
17
+ method: :post,
18
+ path: "chat/completions",
19
+ headers: {"accept" => "text/event-stream"},
20
+ body: parsed,
21
+ stream: OpenAI::Internal::Stream,
22
+ model: OpenAI::Chat::ChatCompletionChunk,
23
+ security: {bearer_auth: true},
24
+ options: options
25
+ )
26
+
27
+ OpenAI::Helpers::Streaming::ChatCompletionStream.new(
28
+ raw_stream: raw_stream,
29
+ response_format: response_format,
30
+ input_tools: input_tools
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -49,22 +49,7 @@ module OpenAI
49
49
  response
50
50
  end
51
51
 
52
- def get_output_text
53
- response = get_final_response
54
- text_parts = []
55
-
56
- response.output.each do |output|
57
- next unless output.is_a?(OpenAI::Models::Responses::ResponseOutputMessage)
58
-
59
- output.content.each do |content|
60
- next unless content.is_a?(OpenAI::Models::Responses::ResponseOutputText)
61
-
62
- text_parts << content.text
63
- end
64
- end
65
-
66
- text_parts.join
67
- end
52
+ def get_output_text = get_final_response.output_text
68
53
 
69
54
  private
70
55
 
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenAI
4
+ module Resources
5
+ class Responses
6
+ # Creates or resumes a streaming response and parses structured outputs.
7
+ # @overload stream(access_programs: nil, **params)
8
+ # @param access_programs [OpenAI::Models::Responses::ResponseCreateParams::AccessPrograms]
9
+ # Domain-specific access programs to use for this request.
10
+ # @param params [Hash{Symbol=>Object}] Other response creation or retrieval parameters.
11
+ def stream(params)
12
+ parsed, options = OpenAI::Responses::ResponseCreateParams.dump_request(params)
13
+ starting_after, response_id = parsed.values_at(:starting_after, :response_id)
14
+
15
+ if starting_after && !response_id
16
+ raise ArgumentError, "starting_after can only be used with response_id"
17
+ end
18
+
19
+ model, tool_models = get_structured_output_models(parsed)
20
+
21
+ unwrap = -> (raw) do
22
+ if raw[:type] == "response.completed" && raw[:response]
23
+ parse_structured_outputs!(raw[:response], model, tool_models)
24
+ end
25
+
26
+ raw
27
+ end
28
+
29
+ if response_id
30
+ retrieve_params = parsed.slice(:include, :starting_after)
31
+ retrieve_params[:request_options] = options
32
+
33
+ raw_stream = retrieve_streaming_internal(
34
+ response_id,
35
+ params: retrieve_params,
36
+ unwrap: unwrap
37
+ )
38
+ else
39
+ parsed[:stream] = true
40
+
41
+ raw_stream = @client.request(
42
+ method: :post,
43
+ path: "responses",
44
+ headers: {"accept" => "text/event-stream"},
45
+ body: parsed,
46
+ stream: OpenAI::Internal::Stream,
47
+ model: OpenAI::Models::Responses::ResponseStreamEvent,
48
+ unwrap: unwrap,
49
+ security: {bearer_auth: true},
50
+ options: options
51
+ )
52
+ end
53
+
54
+ OpenAI::Streaming::ResponseStream.new(
55
+ raw_stream: raw_stream,
56
+ text_format: model,
57
+ starting_after: starting_after
58
+ )
59
+ end
60
+
61
+ private def retrieve_streaming_internal(response_id, params:, unwrap:)
62
+ parsed, options = OpenAI::Responses::ResponseRetrieveParams.dump_request(params)
63
+ parsed.store(:stream, true)
64
+ @client.request(
65
+ method: :get,
66
+ path: ["responses/%1$s", response_id],
67
+ query: parsed,
68
+ headers: {"accept" => "text/event-stream"},
69
+ stream: OpenAI::Internal::Stream,
70
+ model: OpenAI::Responses::ResponseStreamEvent,
71
+ security: {bearer_auth: true},
72
+ options: options,
73
+ unwrap: unwrap
74
+ )
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../resources/vector_stores/file_batches"
4
+ require_relative "../resource_polling"
5
+
6
+ module OpenAI
7
+ module Resources
8
+ class VectorStores
9
+ class FileBatches
10
+ # Create a vector store file batch and wait for processing to finish.
11
+ #
12
+ # The returned batch may have a `failed` or `cancelled` status; callers should
13
+ # inspect its status and file counts. Polling intervals and the overall timeout
14
+ # are in seconds. Finite timeouts include authentication and request replay
15
+ # time and disable transport retries so the deadline remains strict. Set
16
+ # `timeout` to `nil` to wait indefinitely and retain configured transport retries.
17
+ #
18
+ # @overload create_and_poll(vector_store_id, attributes: nil, chunking_strategy: nil, file_ids: nil, files: nil, poll_interval: nil, timeout: 1800.0, request_options: {})
19
+ #
20
+ # @param vector_store_id [String] The ID of the vector store for which to create a File Batch.
21
+ #
22
+ # @param attributes [Hash{Symbol=>String, Float, Boolean}, nil] Attributes to apply to each file in `file_ids`.
23
+ #
24
+ # @param chunking_strategy [OpenAI::Models::AutoFileChunkingStrategyParam, OpenAI::Models::StaticFileChunkingStrategyObjectParam] The chunking strategy used to chunk the files.
25
+ #
26
+ # @param file_ids [Array<String>] File IDs to add to the vector store.
27
+ #
28
+ # @param files [Array<OpenAI::Models::VectorStores::FileBatchCreateParams::File>] File IDs with per-file attributes or chunking strategies.
29
+ #
30
+ # @param poll_interval [Integer, Float, nil] How often to retrieve the batch. When omitted, the SDK honors the server's
31
+ # polling hint and otherwise waits 5 seconds.
32
+ #
33
+ # @param timeout [Integer, Float, nil] Maximum total time to poll. Defaults to 30 minutes. Set to `nil` to wait
34
+ # indefinitely.
35
+ #
36
+ # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}, nil]
37
+ #
38
+ # @raise [ArgumentError, OpenAI::Errors::PollingError]
39
+ # @return [OpenAI::Models::VectorStores::VectorStoreFileBatch]
40
+ def create_and_poll(
41
+ vector_store_id,
42
+ attributes: nil,
43
+ chunking_strategy: nil,
44
+ file_ids: nil,
45
+ files: nil,
46
+ poll_interval: nil,
47
+ timeout: OpenAI::Internal::Poller::DEFAULT_TIMEOUT,
48
+ request_options: {}
49
+ )
50
+ OpenAI::Internal::Poller.validate!(poll_interval: poll_interval, timeout: timeout)
51
+
52
+ params = {request_options: request_options}
53
+ params[:attributes] = attributes unless attributes.nil?
54
+ params[:chunking_strategy] = chunking_strategy unless chunking_strategy.nil?
55
+ params[:file_ids] = file_ids unless file_ids.nil?
56
+ params[:files] = files unless files.nil?
57
+ batch = create(vector_store_id, params)
58
+ poll(
59
+ batch.id,
60
+ vector_store_id: vector_store_id,
61
+ poll_interval: poll_interval,
62
+ timeout: timeout,
63
+ request_options: request_options
64
+ )
65
+ end
66
+
67
+ # Wait for a vector store file batch to finish processing.
68
+ #
69
+ # The returned batch may have a `failed` or `cancelled` status; callers should
70
+ # inspect its status and file counts. Polling intervals and the overall timeout
71
+ # are in seconds. Set `timeout` to `nil` to wait indefinitely.
72
+ #
73
+ # @overload poll(batch_id, vector_store_id:, poll_interval: nil, timeout: 1800.0, request_options: {})
74
+ #
75
+ # @param batch_id [String] The ID of the file batch being retrieved.
76
+ #
77
+ # @param vector_store_id [String] The ID of the vector store that the file batch belongs to.
78
+ #
79
+ # @param poll_interval [Integer, Float, nil] How often to retrieve the batch. When omitted, the SDK honors the server's
80
+ # polling hint and otherwise waits 5 seconds.
81
+ #
82
+ # @param timeout [Integer, Float, nil] Maximum total time to poll. Defaults to 30 minutes. Set to `nil` to wait
83
+ # indefinitely.
84
+ #
85
+ # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}, nil]
86
+ #
87
+ # @raise [ArgumentError, OpenAI::Errors::PollingError]
88
+ # @return [OpenAI::Models::VectorStores::VectorStoreFileBatch]
89
+ def poll(
90
+ batch_id,
91
+ vector_store_id:,
92
+ poll_interval: nil,
93
+ timeout: OpenAI::Internal::Poller::DEFAULT_TIMEOUT,
94
+ request_options: {}
95
+ )
96
+ OpenAI::Helpers::ResourcePolling.poll_vector_store_file_batch(
97
+ self,
98
+ batch_id,
99
+ vector_store_id: vector_store_id,
100
+ poll_interval: poll_interval,
101
+ timeout: timeout,
102
+ request_options: request_options
103
+ )
104
+ end
105
+
106
+ # Upload files concurrently, create a vector store file batch, and wait for
107
+ # processing to finish.
108
+ #
109
+ # Existing file IDs can be included alongside new uploads. Upload concurrency is
110
+ # bounded and defaults to 5. Set `max_concurrency` to 1 for sequential uploads.
111
+ # Inputs are enumerated before requests begin so the 2,000-file API limit can be
112
+ # checked without orphaning uploads. Stream-backed inputs are safely spooled during
113
+ # enumeration, including IO objects yielded from block-scoped enumerators.
114
+ #
115
+ # @overload upload_and_poll(vector_store_id, files:, file_ids: [], max_concurrency: 5, attributes: nil, chunking_strategy: nil, poll_interval: nil, timeout: 1800.0, request_options: {})
116
+ #
117
+ # @param vector_store_id [String] The ID of the vector store for which to create a File Batch.
118
+ #
119
+ # @param files [Enumerable<Pathname, StringIO, IO, String, OpenAI::FilePart>] Files to upload.
120
+ #
121
+ # @param file_ids [Array<String>] IDs of files that have already been uploaded.
122
+ #
123
+ # @param max_concurrency [Integer] Maximum number of simultaneous file uploads.
124
+ #
125
+ # @param attributes [Hash{Symbol=>String, Float, Boolean}, nil] Attributes to apply to every file.
126
+ #
127
+ # @param chunking_strategy [OpenAI::Models::AutoFileChunkingStrategyParam, OpenAI::Models::StaticFileChunkingStrategyObjectParam] The chunking strategy used to chunk the files.
128
+ #
129
+ # @param poll_interval [Integer, Float, nil] How often to retrieve the batch. When omitted, the SDK honors the server's
130
+ # polling hint and otherwise waits 5 seconds.
131
+ #
132
+ # @param timeout [Integer, Float, nil] Maximum total time to poll. Defaults to 30 minutes. Set to `nil` to wait
133
+ # indefinitely.
134
+ #
135
+ # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}, nil] Applied to every upload and to the
136
+ # batch creation and polling requests. Idempotency keys are scoped to each
137
+ # upload and the batch creation.
138
+ #
139
+ # @raise [ArgumentError, OpenAI::Errors::PollingError]
140
+ # @return [OpenAI::Models::VectorStores::VectorStoreFileBatch]
141
+ def upload_and_poll(
142
+ vector_store_id,
143
+ files:,
144
+ file_ids: [],
145
+ max_concurrency: 5,
146
+ attributes: nil,
147
+ chunking_strategy: nil,
148
+ poll_interval: nil,
149
+ timeout: OpenAI::Internal::Poller::DEFAULT_TIMEOUT,
150
+ request_options: {}
151
+ )
152
+ OpenAI::Internal::Poller.validate!(poll_interval: poll_interval, timeout: timeout)
153
+ request_options_scope = OpenAI::Internal::RequestOptionsScope.new(request_options)
154
+
155
+ max_files = OpenAI::Internal::VectorStoreFileUploader::MAX_FILES_PER_BATCH
156
+ if file_ids.length > max_files
157
+ raise ArgumentError, "`file_ids` cannot contain more than #{max_files} entries"
158
+ end
159
+
160
+ uploaded = OpenAI::Internal::VectorStoreFileUploader
161
+ .new(
162
+ client: @client,
163
+ max_concurrency: max_concurrency,
164
+ request_options: request_options
165
+ )
166
+ .upload(files, max_files: max_files - file_ids.length)
167
+
168
+ if uploaded.empty?
169
+ raise(
170
+ ArgumentError,
171
+ "No `files` provided. Use `create_and_poll` when all files are already uploaded."
172
+ )
173
+ end
174
+
175
+ create_and_poll(
176
+ vector_store_id,
177
+ file_ids: [*file_ids, *uploaded.map(&:id)],
178
+ attributes: attributes,
179
+ chunking_strategy: chunking_strategy,
180
+ poll_interval: poll_interval,
181
+ timeout: timeout,
182
+ request_options: request_options_scope.child("file-batch")
183
+ )
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end