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,198 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../resources/vector_stores/files"
4
+ require_relative "../resource_polling"
5
+
6
+ module OpenAI
7
+ module Resources
8
+ class VectorStores
9
+ class Files
10
+ # Attach a file to a vector store and wait for processing to finish.
11
+ #
12
+ # The returned file may have a `failed` or `cancelled` status; callers should
13
+ # inspect the status and `last_error`. 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, file_id:, attributes: nil, chunking_strategy: 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.
21
+ #
22
+ # @param file_id [String] A File ID to attach to the vector store.
23
+ #
24
+ # @param attributes [Hash{Symbol=>String, Float, Boolean}, nil] Attributes to attach to the vector store file.
25
+ #
26
+ # @param chunking_strategy [OpenAI::Models::AutoFileChunkingStrategyParam, OpenAI::Models::StaticFileChunkingStrategyObjectParam] The chunking strategy used to chunk the file.
27
+ #
28
+ # @param poll_interval [Integer, Float, nil] How often to retrieve the file. When omitted, the SDK honors the server's
29
+ # polling hint and otherwise waits 5 seconds.
30
+ #
31
+ # @param timeout [Integer, Float, nil] Maximum total time to poll. Defaults to 30 minutes. Set to `nil` to wait
32
+ # indefinitely.
33
+ #
34
+ # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}, nil]
35
+ #
36
+ # @raise [ArgumentError, OpenAI::Errors::PollingError]
37
+ # @return [OpenAI::Models::VectorStores::VectorStoreFile]
38
+ def create_and_poll(
39
+ vector_store_id,
40
+ file_id:,
41
+ attributes: nil,
42
+ chunking_strategy: nil,
43
+ poll_interval: nil,
44
+ timeout: OpenAI::Internal::Poller::DEFAULT_TIMEOUT,
45
+ request_options: {}
46
+ )
47
+ OpenAI::Internal::Poller.validate!(poll_interval: poll_interval, timeout: timeout)
48
+
49
+ params = {file_id: file_id, request_options: request_options}
50
+ params[:attributes] = attributes unless attributes.nil?
51
+ params[:chunking_strategy] = chunking_strategy unless chunking_strategy.nil?
52
+ file = create(vector_store_id, params)
53
+ poll(
54
+ file.id,
55
+ vector_store_id: vector_store_id,
56
+ poll_interval: poll_interval,
57
+ timeout: timeout,
58
+ request_options: request_options
59
+ )
60
+ end
61
+
62
+ # Wait for a vector store file to finish processing.
63
+ #
64
+ # The returned file may have a `failed` or `cancelled` status; callers should
65
+ # inspect the status and `last_error`. Polling intervals and the overall timeout
66
+ # are in seconds. Set `timeout` to `nil` to wait indefinitely.
67
+ #
68
+ # @overload poll(file_id, vector_store_id:, poll_interval: nil, timeout: 1800.0, request_options: {})
69
+ #
70
+ # @param file_id [String] The ID of the file being retrieved.
71
+ #
72
+ # @param vector_store_id [String] The ID of the vector store that the file belongs to.
73
+ #
74
+ # @param poll_interval [Integer, Float, nil] How often to retrieve the file. When omitted, the SDK honors the server's
75
+ # polling hint and otherwise waits 5 seconds.
76
+ #
77
+ # @param timeout [Integer, Float, nil] Maximum total time to poll. Defaults to 30 minutes. Set to `nil` to wait
78
+ # indefinitely.
79
+ #
80
+ # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}, nil]
81
+ #
82
+ # @raise [ArgumentError, OpenAI::Errors::PollingError]
83
+ # @return [OpenAI::Models::VectorStores::VectorStoreFile]
84
+ def poll(
85
+ file_id,
86
+ vector_store_id:,
87
+ poll_interval: nil,
88
+ timeout: OpenAI::Internal::Poller::DEFAULT_TIMEOUT,
89
+ request_options: {}
90
+ )
91
+ OpenAI::Helpers::ResourcePolling.poll_vector_store_file(
92
+ self,
93
+ file_id,
94
+ vector_store_id: vector_store_id,
95
+ poll_interval: poll_interval,
96
+ timeout: timeout,
97
+ request_options: request_options
98
+ )
99
+ end
100
+
101
+ # Upload a file and attach it to a vector store.
102
+ #
103
+ # Processing continues asynchronously; use {#upload_and_poll} to wait until the
104
+ # file is ready.
105
+ #
106
+ # @overload upload(vector_store_id, file:, attributes: nil, chunking_strategy: nil, request_options: {})
107
+ #
108
+ # @param vector_store_id [String] The ID of the vector store to attach the file to.
109
+ #
110
+ # @param file [Pathname, StringIO, IO, String, OpenAI::FilePart] The file to upload.
111
+ #
112
+ # @param attributes [Hash{Symbol=>String, Float, Boolean}, nil] Attributes to attach to the vector store file.
113
+ #
114
+ # @param chunking_strategy [OpenAI::Models::AutoFileChunkingStrategyParam, OpenAI::Models::StaticFileChunkingStrategyObjectParam] The chunking strategy used to chunk the file.
115
+ #
116
+ # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}, nil] Applied to the upload and attach
117
+ # requests. Idempotency keys are scoped to each operation.
118
+ #
119
+ # @return [OpenAI::Models::VectorStores::VectorStoreFile]
120
+ def upload(
121
+ vector_store_id,
122
+ file:,
123
+ attributes: nil,
124
+ chunking_strategy: nil,
125
+ request_options: {}
126
+ )
127
+ request_options_scope = OpenAI::Internal::RequestOptionsScope.new(request_options)
128
+ uploaded = @client.files.create(
129
+ file: file,
130
+ purpose: :assistants,
131
+ request_options: request_options_scope.child("file-upload")
132
+ )
133
+ params = {
134
+ file_id: uploaded.id,
135
+ request_options: request_options_scope.child("vector-store-file")
136
+ }
137
+ params[:attributes] = attributes unless attributes.nil?
138
+ params[:chunking_strategy] = chunking_strategy unless chunking_strategy.nil?
139
+ create(vector_store_id, params)
140
+ end
141
+
142
+ # Upload a file, attach it to a vector store, and wait for processing to
143
+ # finish.
144
+ #
145
+ # The returned file may have a `failed` or `cancelled` status; callers should
146
+ # inspect the status and `last_error`.
147
+ #
148
+ # @overload upload_and_poll(vector_store_id, file:, attributes: nil, chunking_strategy: nil, poll_interval: nil, timeout: 1800.0, request_options: {})
149
+ #
150
+ # @param vector_store_id [String] The ID of the vector store to attach the file to.
151
+ #
152
+ # @param file [Pathname, StringIO, IO, String, OpenAI::FilePart] The file to upload.
153
+ #
154
+ # @param attributes [Hash{Symbol=>String, Float, Boolean}, nil] Attributes to attach to the vector store file.
155
+ #
156
+ # @param chunking_strategy [OpenAI::Models::AutoFileChunkingStrategyParam, OpenAI::Models::StaticFileChunkingStrategyObjectParam] The chunking strategy used to chunk the file.
157
+ #
158
+ # @param poll_interval [Integer, Float, nil] How often to retrieve the file. When omitted, the SDK honors the server's
159
+ # polling hint and otherwise waits 5 seconds.
160
+ #
161
+ # @param timeout [Integer, Float, nil] Maximum total time to poll. Defaults to 30 minutes. Set to `nil` to wait
162
+ # indefinitely.
163
+ #
164
+ # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}, nil] Applied to the upload, attach,
165
+ # and polling requests. Idempotency keys are scoped to each write.
166
+ #
167
+ # @raise [ArgumentError, OpenAI::Errors::PollingError]
168
+ # @return [OpenAI::Models::VectorStores::VectorStoreFile]
169
+ def upload_and_poll(
170
+ vector_store_id,
171
+ file:,
172
+ attributes: nil,
173
+ chunking_strategy: nil,
174
+ poll_interval: nil,
175
+ timeout: OpenAI::Internal::Poller::DEFAULT_TIMEOUT,
176
+ request_options: {}
177
+ )
178
+ OpenAI::Internal::Poller.validate!(poll_interval: poll_interval, timeout: timeout)
179
+
180
+ attached = upload(
181
+ vector_store_id,
182
+ file: file,
183
+ attributes: attributes,
184
+ chunking_strategy: chunking_strategy,
185
+ request_options: request_options
186
+ )
187
+ poll(
188
+ attached.id,
189
+ vector_store_id: vector_store_id,
190
+ poll_interval: poll_interval,
191
+ timeout: timeout,
192
+ request_options: request_options
193
+ )
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
@@ -6,6 +6,34 @@ module OpenAI
6
6
  #
7
7
  # @api private
8
8
  module ClientRequest
9
+ # @api private
10
+ def with_websocket_connection_request(request:, websocket_base_url: nil, options: nil, &block)
11
+ build = lambda do |deadline|
12
+ build_shared_websocket_connection_request(
13
+ request: request,
14
+ websocket_base_url: websocket_base_url,
15
+ options: options,
16
+ deadline: deadline,
17
+ validate: lambda do |_value|
18
+ if @provider_runtime || x509_identity?(@copy_options.fetch(:workload_identity))
19
+ raise(
20
+ OpenAI::Errors::Error,
21
+ "This client authentication provider does not support WebSocket connections."
22
+ )
23
+ end
24
+ end,
25
+ invalid_base_url_message: "websocket_base_url must be an absolute HTTP or WebSocket URL without credentials, query, or fragment",
26
+ malformed_base_url_message: "websocket_base_url is not a valid URL",
27
+ preserve_base_url_cause: false,
28
+ extra_query_message: "Use query for WebSocket connection query parameters",
29
+ max_retries_message: "request_options max_retries is not supported for WebSocket connections",
30
+ timeout_error: -> (url, _cause) { BindingConnectionError.new(url: url) }
31
+ )
32
+ end
33
+
34
+ with_websocket_connection_retry(error_class: BindingConnectionError, build: build, &block)
35
+ end
36
+
9
37
  private def with_websocket_connection_retry(error_class:, build:)
10
38
  request, deadline = build.call(nil)
11
39
  handshake_completed = false
@@ -60,8 +88,7 @@ module OpenAI
60
88
  end
61
89
 
62
90
  private def build_shared_websocket_connection_request(
63
- path:,
64
- query:,
91
+ request:,
65
92
  websocket_base_url:,
66
93
  options:,
67
94
  deadline: nil,
@@ -73,6 +100,7 @@ module OpenAI
73
100
  max_retries_message:,
74
101
  timeout_error:
75
102
  )
103
+ path = request.fetch(:path)
76
104
  validate.call(websocket_base_url)
77
105
  websocket_uri = parse_shared_websocket_base_url(
78
106
  websocket_base_url,
@@ -86,10 +114,7 @@ module OpenAI
86
114
  max_retries_message: max_retries_message
87
115
  )
88
116
 
89
- request = build_request(
90
- {method: :get, path: path, query: query, security: {bearer_auth: true}},
91
- opts
92
- )
117
+ request = build_request(request, opts)
93
118
  error_request = websocket_uri ? with_shared_websocket_base_url(request, path:, base_url: websocket_uri) : request
94
119
  error_url = shared_websocket_url(error_request.fetch(:url))
95
120
 
@@ -2,6 +2,64 @@
2
2
 
3
3
  module OpenAI
4
4
  module WebSocket
5
+ # Retire failed sockets and uncertain writes without changing the raw connection contract.
6
+ #
7
+ # @api private
8
+ module GuardedConnection
9
+ def closed? = @poisoned || @closed || super
10
+
11
+ def close(code: 1000, reason: "")
12
+ @poisoned || @closed ? abort : super
13
+ @closed = true
14
+ nil
15
+ rescue StandardError
16
+ @poisoned = true
17
+ raise transport_error, cause: nil
18
+ end
19
+
20
+ # @api private
21
+ def abort
22
+ super
23
+ @closed = true
24
+ nil
25
+ rescue StandardError
26
+ @poisoned = true
27
+ raise transport_error, cause: nil
28
+ end
29
+
30
+ private def write_text(text)
31
+ complete = false
32
+ super
33
+ complete = true
34
+ nil
35
+ rescue StandardError
36
+ raise transport_error, cause: nil
37
+ ensure
38
+ # Also retire a possibly buffered write when cancellation bypasses
39
+ # StandardError, before another sender or normal cleanup can flush it.
40
+ @poisoned = true unless complete
41
+ end
42
+
43
+ private def read_raw_message
44
+ raise connection_error(failed_read_message) if @poisoned
45
+ return nil if @closed
46
+ text = super
47
+ @closed = text.nil?
48
+ text
49
+ rescue StandardError
50
+ @poisoned = true
51
+ raise transport_error, cause: nil
52
+ end
53
+
54
+ private def socket_closed?
55
+ super
56
+ rescue StandardError
57
+ @poisoned = true
58
+ raise transport_error, cause: nil
59
+ end
60
+
61
+ end
62
+
5
63
  # Product-neutral socket lifecycle and text I/O.
6
64
  #
7
65
  # @api private
@@ -29,11 +29,13 @@ module OpenAI
29
29
  abort_after_block:,
30
30
  transport_error_factory: nil,
31
31
  transport_error_message: "transport must respond to open",
32
- reserved_options_error_message: nil
32
+ reserved_options_error_message: nil,
33
+ connection_options: {}
33
34
  )
34
35
  @transport = transport
35
36
  @default_transport = default_transport
36
37
  @connection_class = connection_class
38
+ @connection_options = connection_options.dup.freeze
37
39
  @request = request
38
40
  @block_error_message = block_error_message
39
41
  @abort_after_block = abort_after_block
@@ -60,7 +62,7 @@ module OpenAI
60
62
  **@transport_options
61
63
  ) do |socket|
62
64
  mark_handshake_completed.call
63
- connection = @connection_class.new(socket: socket, url: request.fetch(:url))
65
+ connection = @connection_class.new(socket: socket, url: request.fetch(:url), **@connection_options)
64
66
  begin
65
67
  yield(connection)
66
68
  ensure
@@ -15,8 +15,9 @@ module OpenAI
15
15
 
16
16
  private def event_type(event, message:)
17
17
  raise ArgumentError, message unless event.is_a?(Hash)
18
+ raise ArgumentError, message if event.key?(:type) && event.key?("type")
18
19
 
19
- type = event[:type]
20
+ type = event[:type] || event["type"]
20
21
  return type if type.is_a?(String) || type.is_a?(Symbol)
21
22
 
22
23
  raise ArgumentError, message
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenAI
4
+ module WebSocket
5
+ # Connects generated request and event bindings to the SDK-owned runtime.
6
+ # Existing API helpers retain their more specific connection methods.
7
+ #
8
+ # @api private
9
+ module Resource
10
+ def connect(
11
+ *path_arguments,
12
+ query: {},
13
+ websocket_base_url: nil,
14
+ request_options: nil,
15
+ transport: nil,
16
+ transport_options: {},
17
+ &block
18
+ )
19
+ request = __websocket_request(*path_arguments, query: query.dup)
20
+ base_url = websocket_base_url&.to_s&.dup&.freeze
21
+ error_factory = -> (url:, **options) { BindingConnectionError.new(url: url, **options) }
22
+ ConnectionManager
23
+ .new(
24
+ transport: transport,
25
+ transport_options: transport_options,
26
+ default_transport: lambda do
27
+ AsyncWebSocketTransport.new(
28
+ product_name: "WebSocket",
29
+ error_class: BindingConnectionError,
30
+ error_factory: error_factory
31
+ )
32
+ end,
33
+ connection_class: TypedConnection,
34
+ connection_options: {client_event: __websocket_client_event, server_event: __websocket_server_event},
35
+ request: lambda do |&request_block|
36
+ @client.with_websocket_connection_request(
37
+ request: request,
38
+ websocket_base_url: base_url,
39
+ options: request_options,
40
+ &request_block
41
+ )
42
+ end,
43
+ block_error_message: "A block is required to open a WebSocket.",
44
+ abort_after_block: -> (_connection, error) { !error.nil? },
45
+ transport_error_factory: -> (url:, error:) {
46
+ status = error.http_status if error.is_a?(OpenAI::Errors::WebSocketConnectionError)
47
+ BindingConnectionError.new(url: url, http_status: status)
48
+ }
49
+ )
50
+ .open(&block)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenAI
4
+ module WebSocket
5
+ # Generic event codec for APIs with generated bindings and no specialized helper.
6
+ #
7
+ # @api private
8
+ class TypedConnection < Connection
9
+ include GuardedConnection
10
+ include Protocol
11
+
12
+ def initialize(socket:, url:, client_event:, server_event:)
13
+ super(socket: socket, url: url)
14
+ @client_event = client_event
15
+ @server_event = server_event
16
+ variants = client_event.respond_to?(:variants) ? client_event.variants : [client_event]
17
+ @client_event_types = variants.map do |variant|
18
+ variant.fields.dig(:type, :type) if variant.respond_to?(:fields)
19
+ end
20
+
21
+ variants = server_event.respond_to?(:variants) ? server_event.variants : [server_event]
22
+ @server_event_types = variants.filter_map do |variant|
23
+ type = variant&.fields&.dig(:type, :type)
24
+ [type, variant] if type
25
+ end
26
+ end
27
+
28
+ def send_event(event)
29
+ send_raw(encode_client_event(event))
30
+ end
31
+
32
+ private def encode_client_event(event)
33
+ event_type(event, message: "Invalid WebSocket client event.") if event.is_a?(Hash)
34
+ payload = @client_event ? OpenAI::Internal::Type::Converter.dump(@client_event, event) : event
35
+ type = event_type(payload, message: "Invalid WebSocket client event.")
36
+ if @client_event && !@client_event_types.any? { _1.nil? || _1 === type.to_sym || _1 === type.to_s }
37
+ raise ArgumentError, "Invalid WebSocket client event."
38
+ end
39
+
40
+ payload = coerce(@client_event, payload) if @client_event
41
+ payload = OpenAI::Internal::Type::Converter.dump(@client_event, payload) if @client_event
42
+ JSON.generate(payload, max_nesting: false)
43
+ rescue StandardError, SystemStackError
44
+ raise ArgumentError, "Invalid WebSocket client event.", cause: nil
45
+ end
46
+
47
+ def parse_event(data)
48
+ parsed = JSON.parse(data, symbolize_names: true, max_nesting: false)
49
+ type = event_type(parsed, message: "WebSocket server event must be an object with a string type")
50
+ _, model = @server_event_types.find { |event_type,| event_type === type.to_sym }
51
+ return parsed unless model
52
+
53
+ # Unknown wire fields must not overwrite a known field's Ruby name.
54
+ model.fields.each do |name, field|
55
+ raise ArgumentError if name != field.fetch(:api_name) && parsed.key?(name)
56
+ end
57
+
58
+ coerce(@server_event, parsed)
59
+ rescue StandardError, SystemStackError
60
+ raise OpenAI::Errors::WebSocketProtocolError, "Invalid WebSocket server event.", cause: nil
61
+ end
62
+
63
+ private def coerce(type, value)
64
+ state = OpenAI::Internal::Type::Converter.new_coerce_state
65
+ result = OpenAI::Internal::Type::Converter.coerce(type, value, state: state)
66
+ if state[:error] || !state.fetch(:exactness).fetch(:no).zero?
67
+ raise ArgumentError, "Invalid WebSocket event."
68
+ end
69
+
70
+ result
71
+ end
72
+
73
+ private def connection_error(message) = BindingConnectionError.new(url: @url, message: message)
74
+
75
+ private def transport_error = connection_error("WebSocket transport failed.")
76
+
77
+ private def failed_read_message = "Cannot read from a failed WebSocket."
78
+ end
79
+
80
+ # @api private
81
+ class BindingConnectionError < OpenAI::Errors::WebSocketConnectionError
82
+ def initialize(url:, message: nil, http_status: nil, **_options)
83
+ super(url: url, message: message, http_status: http_status)
84
+ end
85
+
86
+ private def sanitized_error_url(url)
87
+ url&.dup&.tap do |value|
88
+ value.userinfo = nil
89
+ value.query = nil
90
+ value.fragment = nil
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -8,3 +8,7 @@ require_relative "websocket/connection_manager"
8
8
  require_relative "websocket/protocol"
9
9
  require_relative "websocket/async_websocket_transport"
10
10
  require_relative "websocket/client_request"
11
+ require_relative "websocket/typed_connection"
12
+ require_relative "websocket/resource"
13
+
14
+ OpenAI::Client.include(OpenAI::WebSocket::ClientRequest)
@@ -1549,7 +1549,7 @@ module OpenAI
1549
1549
  # @!attribute provider
1550
1550
  # The external storage provider configuration.
1551
1551
  #
1552
- # @return [OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider, nil]
1552
+ # @return [OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider, OpenAI::Models::Admin::Organization::OciExternalStorageProvider, nil]
1553
1553
  optional(
1554
1554
  :provider,
1555
1555
  union: -> {
@@ -1563,7 +1563,7 @@ module OpenAI
1563
1563
  # @param geography [String]
1564
1564
  # The OpenAI geography derived from the storage region.
1565
1565
  #
1566
- # @param provider [OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider]
1566
+ # @param provider [OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider, OpenAI::Models::Admin::Organization::OciExternalStorageProvider]
1567
1567
  # The external storage provider configuration.
1568
1568
 
1569
1569
  # The external storage provider configuration.
@@ -1580,8 +1580,10 @@ module OpenAI
1580
1580
 
1581
1581
  variant :gcp, -> { OpenAI::Admin::Organization::GcpExternalStorageProvider }
1582
1582
 
1583
+ variant :oci, -> { OpenAI::Admin::Organization::OciExternalStorageProvider }
1584
+
1583
1585
  # @!method self.variants
1584
- # @return [Array(OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider)]
1586
+ # @return [Array(OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider, OpenAI::Models::Admin::Organization::OciExternalStorageProvider)]
1585
1587
  end
1586
1588
  end
1587
1589
  end
@@ -33,7 +33,7 @@ module OpenAI
33
33
 
34
34
  # @!attribute provider
35
35
  #
36
- # @return [OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider]
36
+ # @return [OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider, OpenAI::Models::Admin::Organization::OciExternalStorageProvider]
37
37
  required :provider, union: -> { OpenAI::Admin::Organization::ExternalStorageConfiguration::Provider }
38
38
 
39
39
  # @!attribute status
@@ -46,7 +46,7 @@ module OpenAI
46
46
  # @param created_at [Integer]
47
47
  # @param geography [String]
48
48
  # @param project_id [String]
49
- # @param provider [OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider]
49
+ # @param provider [OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider, OpenAI::Models::Admin::Organization::OciExternalStorageProvider]
50
50
  # @param status [Symbol, OpenAI::Models::Admin::Organization::ExternalStorageConfiguration::Status]
51
51
  # @param object [Symbol, :"organization.external_storage"]
52
52
 
@@ -62,8 +62,10 @@ module OpenAI
62
62
 
63
63
  variant :gcp, -> { OpenAI::Admin::Organization::GcpExternalStorageProvider }
64
64
 
65
+ variant :oci, -> { OpenAI::Admin::Organization::OciExternalStorageProvider }
66
+
65
67
  # @!method self.variants
66
- # @return [Array(OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider)]
68
+ # @return [Array(OpenAI::Models::Admin::Organization::AwsExternalStorageProvider, OpenAI::Models::Admin::Organization::AzureExternalStorageProvider, OpenAI::Models::Admin::Organization::GcpExternalStorageProvider, OpenAI::Models::Admin::Organization::OciExternalStorageProvider)]
67
69
  end
68
70
 
69
71
  # @see OpenAI::Models::Admin::Organization::ExternalStorageConfiguration#status
@@ -16,12 +16,12 @@ module OpenAI
16
16
 
17
17
  # @!attribute provider
18
18
  #
19
- # @return [OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Aws, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Azure, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Gcp]
19
+ # @return [OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Aws, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Azure, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Gcp, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Oci]
20
20
  required :provider, union: -> { OpenAI::Admin::Organization::ExternalStorageCreateParams::Provider }
21
21
 
22
22
  # @!method initialize(project_id:, provider:, request_options: {})
23
23
  # @param project_id [String]
24
- # @param provider [OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Aws, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Azure, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Gcp]
24
+ # @param provider [OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Aws, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Azure, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Gcp, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Oci]
25
25
  # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}]
26
26
 
27
27
  module Provider
@@ -35,6 +35,8 @@ module OpenAI
35
35
 
36
36
  variant :gcp, -> { OpenAI::Admin::Organization::ExternalStorageCreateParams::Provider::Gcp }
37
37
 
38
+ variant :oci, -> { OpenAI::Admin::Organization::ExternalStorageCreateParams::Provider::Oci }
39
+
38
40
  class Aws < OpenAI::Internal::Type::BaseModel
39
41
  # @!attribute bucket
40
42
  #
@@ -131,8 +133,36 @@ module OpenAI
131
133
  # @param type [Symbol, :gcp]
132
134
  end
133
135
 
136
+ class Oci < OpenAI::Internal::Type::BaseModel
137
+ # @!attribute bucket
138
+ #
139
+ # @return [String]
140
+ required :bucket, String
141
+
142
+ # @!attribute region
143
+ #
144
+ # @return [String]
145
+ required :region, String
146
+
147
+ # @!attribute tenancy_ocid
148
+ #
149
+ # @return [String]
150
+ required :tenancy_ocid, String
151
+
152
+ # @!attribute type
153
+ #
154
+ # @return [Symbol, :oci]
155
+ required :type, const: :oci
156
+
157
+ # @!method initialize(bucket:, region:, tenancy_ocid:, type: :oci)
158
+ # @param bucket [String]
159
+ # @param region [String]
160
+ # @param tenancy_ocid [String]
161
+ # @param type [Symbol, :oci]
162
+ end
163
+
134
164
  # @!method self.variants
135
- # @return [Array(OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Aws, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Azure, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Gcp)]
165
+ # @return [Array(OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Aws, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Azure, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Gcp, OpenAI::Models::Admin::Organization::ExternalStorageCreateParams::Provider::Oci)]
136
166
  end
137
167
  end
138
168
  end