openai 0.103.0 → 0.105.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +98 -0
- data/README.md +23 -1
- data/lib/openai/client.rb +3 -386
- data/lib/openai/helpers/admin/organization/projects/api_keys.rb +42 -0
- data/lib/openai/helpers/agents/session_stream_resource.rb +60 -0
- data/lib/openai/helpers/beta/agents/artifacts.rb +18 -0
- data/lib/openai/helpers/beta/agents/files.rb +41 -0
- data/lib/openai/helpers/client_runtime.rb +391 -0
- data/lib/openai/helpers/files.rb +47 -0
- data/lib/openai/helpers/live/websocket.rb +8 -57
- data/lib/openai/helpers/models/chat/parsed.rb +32 -0
- data/lib/openai/helpers/models/responses/parsed.rb +30 -0
- data/lib/openai/helpers/models/responses/response.rb +32 -0
- data/lib/openai/helpers/models/webhooks/webhook_endpoint_with_secret.rb +20 -0
- data/lib/openai/helpers/realtime/client_extension.rb +1 -2
- data/lib/openai/helpers/realtime/connection_manager.rb +1 -1
- data/lib/openai/helpers/realtime/translation.rb +7 -50
- data/lib/openai/helpers/responses_websocket/client_extension.rb +1 -2
- data/lib/openai/helpers/streaming/chat_completion_resource.rb +36 -0
- data/lib/openai/helpers/streaming/response_stream.rb +1 -16
- data/lib/openai/helpers/streaming/response_stream_resource.rb +78 -0
- data/lib/openai/helpers/vector_stores/file_batches.rb +188 -0
- data/lib/openai/helpers/vector_stores/files.rb +198 -0
- data/lib/openai/helpers/websocket/client_request.rb +31 -6
- data/lib/openai/helpers/websocket/connection.rb +58 -0
- data/lib/openai/helpers/websocket/connection_manager.rb +4 -2
- data/lib/openai/helpers/websocket/protocol.rb +2 -1
- data/lib/openai/helpers/websocket/resource.rb +54 -0
- data/lib/openai/helpers/websocket/typed_connection.rb +95 -0
- data/lib/openai/helpers/websocket.rb +4 -0
- data/lib/openai/models/admin/organization/audit_log_list_response.rb +5 -3
- data/lib/openai/models/admin/organization/external_storage_configuration.rb +5 -3
- data/lib/openai/models/admin/organization/external_storage_create_params.rb +33 -3
- data/lib/openai/models/admin/organization/oci_external_storage_provider.rb +37 -0
- data/lib/openai/models/admin/organization/project_residency.rb +3 -0
- data/lib/openai/models/admin/organization/projects/api_key_update_params.rb +64 -0
- data/lib/openai/models/admin/organization/projects/api_key_update_scopes_params.rb +34 -0
- data/lib/openai/models/admin/organization/usage_decisions_params.rb +177 -0
- data/lib/openai/models/admin/organization/usage_decisions_response.rb +351 -0
- data/lib/openai/models/audio/speech_create_params.rb +6 -3
- data/lib/openai/models/audio/translation_create_response.rb +0 -1
- data/lib/openai/models/audio/voice.rb +17 -2
- data/lib/openai/models/audio/voice_create_params.rb +100 -3
- data/lib/openai/models/beta/agent_create_params.rb +4 -2
- data/lib/openai/models/beta/agent_list_params.rb +4 -4
- data/lib/openai/models/beta/agent_session.rb +37 -1
- data/lib/openai/models/beta/agent_update_params.rb +4 -2
- data/lib/openai/models/beta/agents/environment_list_params.rb +7 -7
- data/lib/openai/models/beta/agents/session_create_params.rb +39 -3
- data/lib/openai/models/beta/agents/session_list_params.rb +7 -10
- data/lib/openai/models/beta/agents/session_update_params.rb +33 -1
- data/lib/openai/models/beta/agents/sessions/artifact_list_params.rb +11 -11
- data/lib/openai/models/beta/agents/vault_list_params.rb +23 -13
- data/lib/openai/models/beta/agents/vault_status_filter.rb +1 -3
- data/lib/openai/models/beta/agents/vault_update_params.rb +47 -0
- data/lib/openai/models/beta/agents/vaults/credential_list_params.rb +23 -13
- data/lib/openai/models/beta/beta_response.rb +23 -2
- data/lib/openai/models/beta/beta_response_error.rb +19 -1
- data/lib/openai/models/beta/beta_response_input_item.rb +107 -1
- data/lib/openai/models/beta/beta_response_item.rb +107 -1
- data/lib/openai/models/beta/beta_response_output_item.rb +107 -1
- data/lib/openai/models/beta/beta_responses_client_event.rb +23 -2
- data/lib/openai/models/beta/response_compact_params.rb +21 -0
- data/lib/openai/models/beta/response_create_params.rb +23 -2
- data/lib/openai/models/beta/session_turn_error.rb +3 -0
- data/lib/openai/models/chat/chat_completion_audio_param.rb +3 -3
- data/lib/openai/models/chat/chat_completion_message.rb +0 -8
- data/lib/openai/models/chat/chat_completion_message_function_tool_call.rb +0 -8
- data/lib/openai/models/chat/completion_create_params.rb +5 -12
- data/lib/openai/models/chat_model.rb +21 -0
- data/lib/openai/models/conversations/conversation_item.rb +107 -1
- data/lib/openai/models/decision.rb +17 -2
- data/lib/openai/models/decision_create_params.rb +29 -12
- data/lib/openai/models/decision_input_image.rb +4 -3
- data/lib/openai/models/decision_input_message.rb +4 -4
- data/lib/openai/models/decision_input_part.rb +3 -2
- data/lib/openai/models/image_edit_completed_event.rb +15 -3
- data/lib/openai/models/image_edit_params.rb +28 -5
- data/lib/openai/models/image_edit_partial_image_event.rb +1 -2
- data/lib/openai/models/image_gen_completed_event.rb +15 -3
- data/lib/openai/models/image_gen_partial_image_event.rb +1 -2
- data/lib/openai/models/image_generate_params.rb +28 -5
- data/lib/openai/models/images_response.rb +15 -3
- data/lib/openai/models/live/built_in_voice.rb +1 -0
- data/lib/openai/models/live/client_event.rb +14 -2
- data/lib/openai/models/live/decision_create_event.rb +26 -0
- data/lib/openai/models/live/decision_event.rb +117 -0
- data/lib/openai/models/live/decision_item_create_event.rb +194 -0
- data/lib/openai/models/live/decision_item_created_event.rb +202 -0
- data/lib/openai/models/live/decision_item_delete_event.rb +38 -0
- data/lib/openai/models/live/decision_item_deleted_event.rb +46 -0
- data/lib/openai/models/live/decision_trigger.rb +244 -0
- data/lib/openai/models/live/decisions_delegation_config.rb +201 -0
- data/lib/openai/models/live/decisions_delegation_update_config.rb +208 -0
- data/lib/openai/models/live/delegation_created_event.rb +10 -10
- data/lib/openai/models/live/fork_client_event.rb +14 -2
- data/lib/openai/models/live/fork_server_event.rb +17 -2
- data/lib/openai/models/live/media_session_config.rb +47 -11
- data/lib/openai/models/live/output_audio_fixture_play_event.rb +48 -0
- data/lib/openai/models/live/output_audio_fixture_played_event.rb +42 -0
- data/lib/openai/models/live/output_audio_fixture_playing_event.rb +41 -0
- data/lib/openai/models/live/server_event.rb +17 -2
- data/lib/openai/models/live/session_accept_params.rb +47 -11
- data/lib/openai/models/live/session_config.rb +47 -11
- data/lib/openai/models/live/session_resource.rb +47 -11
- data/lib/openai/models/live/session_update_config.rb +38 -6
- data/lib/openai/models/live/session_update_event.rb +8 -8
- data/lib/openai/models/live/sideband_client_event.rb +57 -0
- data/lib/openai/models/live/sideband_server_event.rb +78 -0
- data/lib/openai/models/realtime/realtime_audio_config_output.rb +6 -3
- data/lib/openai/models/realtime/realtime_response_create_audio_output.rb +6 -3
- data/lib/openai/models/realtime/realtime_response_status.rb +10 -1
- data/lib/openai/models/response_format_json_schema.rb +1 -1
- data/lib/openai/models/responses/function_tool.rb +8 -6
- data/lib/openai/models/responses/response.rb +2 -23
- data/lib/openai/models/responses/response_compact_params.rb +21 -0
- data/lib/openai/models/responses/response_create_params.rb +3 -6
- data/lib/openai/models/responses/response_error.rb +19 -1
- data/lib/openai/models/responses/response_format_text_config.rb +0 -4
- data/lib/openai/models/responses/response_function_tool_call.rb +0 -8
- data/lib/openai/models/responses/response_input_item.rb +107 -1
- data/lib/openai/models/responses/response_item.rb +107 -1
- data/lib/openai/models/responses/response_output_item.rb +107 -1
- data/lib/openai/models/responses/response_output_text.rb +0 -8
- data/lib/openai/models/responses/responses_client_event.rb +2 -2
- data/lib/openai/models/safety/safety_alert.rb +12 -1
- data/lib/openai/models/video_create_error.rb +19 -1
- data/lib/openai/models/webhooks/unwrap_webhook_event.rb +4 -4
- data/lib/openai/models/webhooks/webhook_endpoint_with_secret.rb +0 -9
- data/lib/openai/resources/admin/organization/external_storage.rb +1 -1
- data/lib/openai/resources/admin/organization/projects/api_keys.rb +61 -0
- data/lib/openai/resources/admin/organization/usage.rb +67 -0
- data/lib/openai/resources/audio/speech.rb +2 -1
- data/lib/openai/resources/audio/voices.rb +10 -10
- data/lib/openai/resources/beta/agents/environments/files.rb +3 -31
- data/lib/openai/resources/beta/agents/environments.rb +3 -3
- data/lib/openai/resources/beta/agents/sessions/artifacts.rb +5 -11
- data/lib/openai/resources/beta/agents/sessions.rb +20 -56
- data/lib/openai/resources/beta/agents/vaults/credentials.rb +10 -6
- data/lib/openai/resources/beta/agents/vaults.rb +45 -6
- data/lib/openai/resources/beta/agents.rb +6 -4
- data/lib/openai/resources/beta/responses.rb +2 -2
- data/lib/openai/resources/chat/completions.rb +11 -37
- data/lib/openai/resources/decisions.rb +9 -15
- data/lib/openai/resources/files.rb +0 -39
- data/lib/openai/resources/images.rb +50 -12
- data/lib/openai/resources/live/forks.rb +19 -0
- data/lib/openai/resources/live/sideband.rb +19 -0
- data/lib/openai/resources/live.rb +19 -0
- data/lib/openai/resources/realtime/translations.rb +19 -0
- data/lib/openai/resources/realtime.rb +19 -0
- data/lib/openai/resources/responses.rb +44 -95
- data/lib/openai/resources/vector_stores/file_batches.rb +0 -178
- data/lib/openai/resources/vector_stores/files.rb +0 -188
- data/lib/openai/resources/webhooks.rb +13 -29
- data/lib/openai/version.rb +1 -1
- data/lib/openai.rb +31 -0
- data/rbi/openai/client.rbi +0 -103
- data/rbi/openai/helpers/admin/organization/projects/api_keys.rbi +25 -0
- data/rbi/openai/helpers/beta/agents/artifacts.rbi +25 -0
- data/rbi/openai/helpers/beta/agents/files.rbi +48 -0
- data/rbi/openai/helpers/client_runtime.rbi +108 -0
- data/rbi/openai/helpers/files.rbi +25 -0
- data/rbi/openai/helpers/models/chat/parsed.rbi +21 -0
- data/rbi/openai/helpers/models/responses/parsed.rbi +19 -0
- data/rbi/openai/helpers/models/responses/response.rbi +15 -0
- data/rbi/openai/helpers/streaming/response_stream.rbi +301 -0
- data/rbi/openai/helpers/vector_stores/file_batches.rbi +102 -0
- data/rbi/openai/helpers/vector_stores/files.rbi +122 -0
- data/rbi/openai/helpers/websocket.rbi +82 -0
- data/rbi/openai/models/admin/organization/audit_log_list_response.rbi +6 -3
- data/rbi/openai/models/admin/organization/external_storage_configuration.rbi +4 -2
- data/rbi/openai/models/admin/organization/external_storage_create_params.rbi +63 -4
- data/rbi/openai/models/admin/organization/oci_external_storage_provider.rbi +71 -0
- data/rbi/openai/models/admin/organization/project_residency.rbi +12 -0
- data/rbi/openai/models/admin/organization/projects/api_key_update_params.rbi +110 -0
- data/rbi/openai/models/admin/organization/projects/api_key_update_scopes_params.rbi +72 -0
- data/rbi/openai/models/admin/organization/usage_decisions_params.rbi +229 -0
- data/rbi/openai/models/admin/organization/usage_decisions_response.rbi +479 -0
- data/rbi/openai/models/audio/speech_create_params.rbi +6 -3
- data/rbi/openai/models/audio/voice.rbi +21 -2
- data/rbi/openai/models/audio/voice_create_params.rbi +149 -4
- data/rbi/openai/models/beta/agent_create_params.rbi +4 -2
- data/rbi/openai/models/beta/agent_list_params.rbi +8 -5
- data/rbi/openai/models/beta/agent_session.rbi +64 -1
- data/rbi/openai/models/beta/agent_update_params.rbi +4 -2
- data/rbi/openai/models/beta/agents/environment_list_params.rbi +7 -7
- data/rbi/openai/models/beta/agents/session_create_params.rbi +62 -2
- data/rbi/openai/models/beta/agents/session_list_params.rbi +11 -11
- data/rbi/openai/models/beta/agents/session_update_params.rbi +56 -0
- data/rbi/openai/models/beta/agents/sessions/artifact_list_params.rbi +19 -13
- data/rbi/openai/models/beta/agents/vault_list_params.rbi +30 -13
- data/rbi/openai/models/beta/agents/vault_status_filter.rbi +1 -3
- data/rbi/openai/models/beta/agents/vault_update_params.rbi +87 -0
- data/rbi/openai/models/beta/agents/vaults/credential_list_params.rbi +30 -13
- data/rbi/openai/models/beta/beta_response.rbi +2 -2
- data/rbi/openai/models/beta/beta_response_error.rbi +24 -3
- data/rbi/openai/models/beta/beta_response_input_item.rbi +191 -0
- data/rbi/openai/models/beta/beta_response_item.rbi +189 -0
- data/rbi/openai/models/beta/beta_response_output_item.rbi +191 -0
- data/rbi/openai/models/beta/beta_responses_client_event.rbi +2 -2
- data/rbi/openai/models/beta/response_create_params.rbi +2 -2
- data/rbi/openai/models/beta/session_turn_error.rbi +3 -0
- data/rbi/openai/models/chat/chat_completion_audio_param.rbi +3 -3
- data/rbi/openai/models/chat/chat_completion_message.rbi +0 -4
- data/rbi/openai/models/chat/chat_completion_message_function_tool_call.rbi +0 -4
- data/rbi/openai/models/chat/completion_create_params.rbi +63 -78
- data/rbi/openai/models/conversations/conversation_item.rbi +191 -0
- data/rbi/openai/models/decision.rbi +14 -1
- data/rbi/openai/models/decision_create_params.rbi +23 -12
- data/rbi/openai/models/decision_input_image.rbi +4 -3
- data/rbi/openai/models/decision_input_message.rbi +4 -4
- data/rbi/openai/models/decision_input_part.rbi +2 -1
- data/rbi/openai/models/image_edit_completed_event.rbi +16 -1
- data/rbi/openai/models/image_edit_params.rbi +26 -4
- data/rbi/openai/models/image_edit_partial_image_event.rbi +1 -0
- data/rbi/openai/models/image_gen_completed_event.rbi +16 -1
- data/rbi/openai/models/image_gen_partial_image_event.rbi +1 -0
- data/rbi/openai/models/image_generate_params.rbi +26 -4
- data/rbi/openai/models/images_response.rbi +15 -0
- data/rbi/openai/models/live/built_in_voice.rbi +1 -0
- data/rbi/openai/models/live/client_event.rbi +4 -0
- data/rbi/openai/models/live/decision_create_event.rbi +55 -0
- data/rbi/openai/models/live/decision_event.rbi +185 -0
- data/rbi/openai/models/live/decision_item_create_event.rbi +338 -0
- data/rbi/openai/models/live/decision_item_created_event.rbi +354 -0
- data/rbi/openai/models/live/decision_item_delete_event.rbi +66 -0
- data/rbi/openai/models/live/decision_item_deleted_event.rbi +77 -0
- data/rbi/openai/models/live/decision_trigger.rbi +465 -0
- data/rbi/openai/models/live/decisions_delegation_config.rbi +393 -0
- data/rbi/openai/models/live/decisions_delegation_update_config.rbi +412 -0
- data/rbi/openai/models/live/delegation_created_event.rbi +8 -10
- data/rbi/openai/models/live/fork_client_event.rbi +4 -0
- data/rbi/openai/models/live/fork_server_event.rbi +5 -0
- data/rbi/openai/models/live/media_session_config.rbi +95 -14
- data/rbi/openai/models/live/output_audio_fixture_play_event.rbi +76 -0
- data/rbi/openai/models/live/output_audio_fixture_played_event.rbi +73 -0
- data/rbi/openai/models/live/output_audio_fixture_playing_event.rbi +72 -0
- data/rbi/openai/models/live/server_event.rbi +5 -0
- data/rbi/openai/models/live/session_accept_params.rbi +88 -12
- data/rbi/openai/models/live/session_config.rbi +100 -14
- data/rbi/openai/models/live/session_resource.rbi +81 -10
- data/rbi/openai/models/live/session_update_config.rbi +86 -9
- data/rbi/openai/models/live/session_update_event.rbi +8 -8
- data/rbi/openai/models/live/sideband_client_event.rbi +40 -0
- data/rbi/openai/models/live/sideband_server_event.rbi +47 -0
- data/rbi/openai/models/realtime/realtime_audio_config_output.rbi +6 -3
- data/rbi/openai/models/realtime/realtime_response_create_audio_output.rbi +6 -3
- data/rbi/openai/models/realtime/realtime_response_status.rbi +13 -1
- data/rbi/openai/models/realtime/realtime_translation_input_audio_buffer_append_event.rbi +1 -1
- data/rbi/openai/models/realtime/realtime_translation_output_audio_delta_event.rbi +3 -3
- data/rbi/openai/models/realtime/realtime_translation_session_close_event.rbi +1 -1
- data/rbi/openai/models/realtime/realtime_translation_session_update_event.rbi +5 -1
- data/rbi/openai/models/responses/response.rbi +2 -7
- data/rbi/openai/models/responses/response_create_params.rbi +5 -9
- data/rbi/openai/models/responses/response_error.rbi +24 -3
- data/rbi/openai/models/responses/response_function_tool_call.rbi +0 -4
- data/rbi/openai/models/responses/response_function_web_search.rbi +21 -17
- data/rbi/openai/models/responses/response_input_item.rbi +191 -0
- data/rbi/openai/models/responses/response_item.rbi +189 -0
- data/rbi/openai/models/responses/response_output_item.rbi +191 -0
- data/rbi/openai/models/responses/response_output_text.rbi +0 -4
- data/rbi/openai/models/responses/responses_client_event.rbi +2 -2
- data/rbi/openai/models/safety/safety_alert.rbi +13 -1
- data/rbi/openai/models/video_create_error.rbi +24 -3
- data/rbi/openai/models/webhooks/unwrap_webhook_event.rbi +1 -1
- data/rbi/openai/resources/admin/organization/external_storage.rbi +2 -1
- data/rbi/openai/resources/admin/organization/projects/api_keys.rbi +48 -0
- data/rbi/openai/resources/admin/organization/usage.rbi +56 -0
- data/rbi/openai/resources/audio/speech.rbi +2 -1
- data/rbi/openai/resources/audio/voices.rbi +13 -10
- data/rbi/openai/resources/beta/agents/environments/files.rbi +3 -33
- data/rbi/openai/resources/beta/agents/environments.rbi +3 -3
- data/rbi/openai/resources/beta/agents/sessions/artifacts.rbi +5 -13
- data/rbi/openai/resources/beta/agents/sessions.rbi +15 -4
- data/rbi/openai/resources/beta/agents/vaults/credentials.rbi +9 -5
- data/rbi/openai/resources/beta/agents/vaults.rbi +34 -5
- data/rbi/openai/resources/beta/agents.rbi +6 -4
- data/rbi/openai/resources/beta/responses.rbi +2 -2
- data/rbi/openai/resources/chat/completions.rbi +26 -29
- data/rbi/openai/resources/decisions.rbi +9 -15
- data/rbi/openai/resources/files.rbi +0 -18
- data/rbi/openai/resources/images.rbi +44 -8
- data/rbi/openai/resources/live/forks.rbi +17 -0
- data/rbi/openai/resources/live/sideband.rbi +17 -0
- data/rbi/openai/resources/live.rbi +17 -0
- data/rbi/openai/resources/realtime/translations.rbi +17 -0
- data/rbi/openai/resources/realtime.rbi +17 -0
- data/rbi/openai/resources/responses.rbi +41 -333
- data/rbi/openai/resources/vector_stores/file_batches.rbi +0 -93
- data/rbi/openai/resources/vector_stores/files.rbi +0 -113
- data/rbi/openai/resources/webhooks.rbi +1 -1
- data/sig/openai/client.rbs +0 -50
- data/sig/openai/helpers/admin/organization/projects/api_keys.rbs +18 -0
- data/sig/openai/helpers/beta/agents/artifacts.rbs +17 -0
- data/sig/openai/helpers/beta/agents/files.rbs +30 -0
- data/sig/openai/helpers/client_runtime.rbs +53 -0
- data/sig/openai/helpers/files.rbs +12 -0
- data/sig/openai/helpers/models/responses/response.rbs +9 -0
- data/sig/openai/helpers/streaming/response_stream.rbs +37 -0
- data/sig/openai/helpers/vector_stores/file_batches.rbs +38 -0
- data/sig/openai/helpers/vector_stores/files.rbs +43 -0
- data/sig/openai/helpers/websocket.rbs +40 -0
- data/sig/openai/models/admin/organization/audit_log_list_response.rbs +1 -0
- data/sig/openai/models/admin/organization/external_storage_configuration.rbs +1 -0
- data/sig/openai/models/admin/organization/external_storage_create_params.rbs +33 -0
- data/sig/openai/models/admin/organization/oci_external_storage_provider.rbs +34 -0
- data/sig/openai/models/admin/organization/project_residency.rbs +6 -0
- data/sig/openai/models/admin/organization/projects/api_key_update_params.rbs +77 -0
- data/sig/openai/models/admin/organization/projects/api_key_update_scopes_params.rbs +38 -0
- data/sig/openai/models/admin/organization/usage_decisions_params.rbs +170 -0
- data/sig/openai/models/admin/organization/usage_decisions_response.rbs +319 -0
- data/sig/openai/models/audio/speech_create_params.rbs +4 -2
- data/sig/openai/models/audio/voice.rbs +21 -3
- data/sig/openai/models/audio/voice_create_params.rbs +90 -1
- data/sig/openai/models/beta/agent_create_params.rbs +4 -2
- data/sig/openai/models/beta/agent_list_params.rbs +9 -6
- data/sig/openai/models/beta/agent_session.rbs +36 -2
- data/sig/openai/models/beta/agent_update_params.rbs +4 -2
- data/sig/openai/models/beta/agents/environment_list_params.rbs +9 -9
- data/sig/openai/models/beta/agents/session_create_params.rbs +29 -2
- data/sig/openai/models/beta/agents/session_list_params.rbs +12 -12
- data/sig/openai/models/beta/agents/session_update_params.rbs +23 -0
- data/sig/openai/models/beta/agents/sessions/artifact_list_params.rbs +21 -15
- data/sig/openai/models/beta/agents/vault_list_params.rbs +32 -14
- data/sig/openai/models/beta/agents/vault_update_params.rbs +54 -0
- data/sig/openai/models/beta/agents/vaults/credential_list_params.rbs +32 -14
- data/sig/openai/models/beta/beta_response.rbs +2 -2
- data/sig/openai/models/beta/beta_response_error.rbs +19 -3
- data/sig/openai/models/beta/beta_response_input_item.rbs +110 -0
- data/sig/openai/models/beta/beta_response_item.rbs +110 -0
- data/sig/openai/models/beta/beta_response_output_item.rbs +110 -0
- data/sig/openai/models/beta/beta_responses_client_event.rbs +2 -2
- data/sig/openai/models/beta/response_create_params.rbs +2 -2
- data/sig/openai/models/beta/session_turn_error.rbs +4 -0
- data/sig/openai/models/chat/chat_completion_audio_param.rbs +2 -2
- data/sig/openai/models/chat/completion_create_params.rbs +2 -2
- data/sig/openai/models/conversations/conversation_item.rbs +110 -0
- data/sig/openai/models/decision.rbs +13 -0
- data/sig/openai/models/decision_create_params.rbs +19 -8
- data/sig/openai/models/decision_input_image.rbs +2 -2
- data/sig/openai/models/decision_input_message.rbs +2 -2
- data/sig/openai/models/image_edit_completed_event.rbs +14 -2
- data/sig/openai/models/image_edit_params.rbs +27 -6
- data/sig/openai/models/image_gen_completed_event.rbs +14 -2
- data/sig/openai/models/image_generate_params.rbs +27 -6
- data/sig/openai/models/images_response.rbs +12 -0
- data/sig/openai/models/live/built_in_voice.rbs +2 -0
- data/sig/openai/models/live/client_event.rbs +4 -0
- data/sig/openai/models/live/decision_create_event.rbs +18 -0
- data/sig/openai/models/live/decision_event.rbs +102 -0
- data/sig/openai/models/live/decision_item_create_event.rbs +183 -0
- data/sig/openai/models/live/decision_item_created_event.rbs +195 -0
- data/sig/openai/models/live/decision_item_delete_event.rbs +33 -0
- data/sig/openai/models/live/decision_item_deleted_event.rbs +49 -0
- data/sig/openai/models/live/decision_trigger.rbs +234 -0
- data/sig/openai/models/live/decisions_delegation_config.rbs +195 -0
- data/sig/openai/models/live/decisions_delegation_update_config.rbs +202 -0
- data/sig/openai/models/live/delegation_created_event.rbs +6 -7
- data/sig/openai/models/live/fork_client_event.rbs +4 -0
- data/sig/openai/models/live/fork_server_event.rbs +5 -0
- data/sig/openai/models/live/media_session_config.rbs +58 -11
- data/sig/openai/models/live/output_audio_fixture_play_event.rbs +42 -0
- data/sig/openai/models/live/output_audio_fixture_played_event.rbs +44 -0
- data/sig/openai/models/live/output_audio_fixture_playing_event.rbs +44 -0
- data/sig/openai/models/live/server_event.rbs +5 -0
- data/sig/openai/models/live/session_accept_params.rbs +57 -10
- data/sig/openai/models/live/session_config.rbs +58 -11
- data/sig/openai/models/live/session_resource.rbs +57 -10
- data/sig/openai/models/live/session_update_config.rbs +54 -3
- data/sig/openai/models/live/session_update_event.rbs +6 -6
- data/sig/openai/models/live/sideband_client_event.rbs +26 -0
- data/sig/openai/models/live/sideband_server_event.rbs +33 -0
- data/sig/openai/models/realtime/realtime_audio_config_output.rbs +6 -3
- data/sig/openai/models/realtime/realtime_response_create_audio_output.rbs +6 -3
- data/sig/openai/models/realtime/realtime_response_status.rbs +15 -3
- data/sig/openai/models/responses/response.rbs +2 -4
- data/sig/openai/models/responses/response_create_params.rbs +2 -2
- data/sig/openai/models/responses/response_error.rbs +19 -3
- data/sig/openai/models/responses/response_input_item.rbs +110 -0
- data/sig/openai/models/responses/response_item.rbs +110 -0
- data/sig/openai/models/responses/response_output_item.rbs +110 -0
- data/sig/openai/models/responses/responses_client_event.rbs +2 -2
- data/sig/openai/models/safety/safety_alert.rbs +12 -2
- data/sig/openai/models/video_create_error.rbs +19 -3
- data/sig/openai/models/webhooks/unwrap_webhook_event.rbs +1 -1
- data/sig/openai/resources/admin/organization/projects/api_keys.rbs +8 -0
- data/sig/openai/resources/admin/organization/usage.rbs +15 -0
- data/sig/openai/resources/beta/agents/environments/files.rbs +0 -17
- data/sig/openai/resources/beta/agents/sessions/artifacts.rbs +2 -6
- data/sig/openai/resources/beta/agents/sessions.rbs +4 -1
- data/sig/openai/resources/beta/agents/vaults/credentials.rbs +2 -1
- data/sig/openai/resources/beta/agents/vaults.rbs +9 -1
- data/sig/openai/resources/beta/agents.rbs +1 -1
- data/sig/openai/resources/files.rbs +0 -7
- data/sig/openai/resources/images.rbs +4 -0
- data/sig/openai/resources/live/forks.rbs +8 -0
- data/sig/openai/resources/live/sideband.rbs +8 -0
- data/sig/openai/resources/live.rbs +7 -0
- data/sig/openai/resources/realtime/translations.rbs +7 -0
- data/sig/openai/resources/realtime.rbs +7 -0
- data/sig/openai/resources/responses.rbs +7 -31
- data/sig/openai/resources/vector_stores/file_batches.rbs +0 -31
- data/sig/openai/resources/vector_stores/files.rbs +0 -36
- data/sig/openai/resources/webhooks.rbs +1 -1
- 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
|
-
|
|
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
|