openai 0.89.0 → 0.91.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 +26 -0
- data/README.md +1 -1
- data/examples/realtime/README.md +8 -0
- data/examples/realtime/browser/README.md +167 -0
- data/examples/realtime/browser/index.html +19 -0
- data/examples/realtime/browser/page.js +21 -0
- data/examples/realtime/browser/peer.js +180 -0
- data/examples/realtime/browser/server.rb +281 -0
- data/examples/responses/websocket_workflows.rb +66 -6
- data/lib/openai/auth/workload_identity.rb +5 -1
- data/lib/openai/auth/workload_identity_auth.rb +2 -2
- data/lib/openai/auth/x509_token_exchange.rb +1 -1
- data/lib/openai/helpers/agents/message.rb +20 -0
- data/lib/openai/helpers/agents/session_stream.rb +168 -0
- data/lib/openai/helpers/agents/tools.rb +65 -0
- data/lib/openai/helpers/local_audio/process.rb +1 -1
- data/lib/openai/helpers/responses_websocket/connection.rb +2 -1
- data/lib/openai/helpers/responses_websocket/session.rb +551 -0
- data/lib/openai/helpers/responses_websocket.rb +1 -0
- data/lib/openai/helpers/sorbet.rb +1 -1
- data/lib/openai/helpers/websocket/async_websocket_transport.rb +6 -1
- data/lib/openai/internal/poller.rb +2 -2
- data/lib/openai/internal/token_page.rb +91 -0
- data/lib/openai/internal/transport/base_client.rb +1 -1
- data/lib/openai/internal/util.rb +1 -1
- data/lib/openai/models/beta/agent.rb +148 -0
- data/lib/openai/models/beta/agent_close_subagent_call_item.rb +66 -0
- data/lib/openai/models/beta/agent_command_execution_item.rb +93 -0
- data/lib/openai/models/beta/agent_content.rb +46 -0
- data/lib/openai/models/beta/agent_create_params.rb +128 -0
- data/lib/openai/models/beta/agent_create_subagent_call_item.rb +84 -0
- data/lib/openai/models/beta/agent_delete_params.rb +22 -0
- data/lib/openai/models/beta/agent_deleted.rb +40 -0
- data/lib/openai/models/beta/agent_function_call_item.rb +75 -0
- data/lib/openai/models/beta/agent_function_call_output.rb +22 -0
- data/lib/openai/models/beta/agent_function_call_output_param.rb +22 -0
- data/lib/openai/models/beta/agent_function_call_status.rb +27 -0
- data/lib/openai/models/beta/agent_interrupt_subagent_call_item.rb +67 -0
- data/lib/openai/models/beta/agent_list_params.rb +57 -0
- data/lib/openai/models/beta/agent_mcp_call_item.rb +93 -0
- data/lib/openai/models/beta/agent_output_command_execution_output_delta_event.rb +75 -0
- data/lib/openai/models/beta/agent_output_item.rb +53 -0
- data/lib/openai/models/beta/agent_output_item_status.rb +24 -0
- data/lib/openai/models/beta/agent_reasoning.rb +67 -0
- data/lib/openai/models/beta/agent_reasoning_item.rb +57 -0
- data/lib/openai/models/beta/agent_reasoning_param.rb +67 -0
- data/lib/openai/models/beta/agent_resume_subagent_call_item.rb +66 -0
- data/lib/openai/models/beta/agent_retrieve_params.rb +22 -0
- data/lib/openai/models/beta/agent_send_subagent_input_call_item.rb +75 -0
- data/lib/openai/models/beta/agent_session.rb +339 -0
- data/lib/openai/models/beta/agent_session_assistant_message.rb +91 -0
- data/lib/openai/models/beta/agent_session_created_event.rb +39 -0
- data/lib/openai/models/beta/agent_session_deleted.rb +42 -0
- data/lib/openai/models/beta/agent_session_environment_connected_event.rb +57 -0
- data/lib/openai/models/beta/agent_session_environment_disconnected_event.rb +57 -0
- data/lib/openai/models/beta/agent_session_environment_failed_event.rb +57 -0
- data/lib/openai/models/beta/agent_session_environment_pending_event.rb +57 -0
- data/lib/openai/models/beta/agent_session_environment_ready_event.rb +57 -0
- data/lib/openai/models/beta/agent_session_environment_state.rb +106 -0
- data/lib/openai/models/beta/agent_session_error_event.rb +48 -0
- data/lib/openai/models/beta/agent_session_event.rb +128 -0
- data/lib/openai/models/beta/agent_session_failed_event.rb +39 -0
- data/lib/openai/models/beta/agent_session_idle_event.rb +39 -0
- data/lib/openai/models/beta/agent_session_in_progress_event.rb +39 -0
- data/lib/openai/models/beta/agent_session_input_message_param.rb +51 -0
- data/lib/openai/models/beta/agent_session_input_param.rb +131 -0
- data/lib/openai/models/beta/agent_session_item.rb +186 -0
- data/lib/openai/models/beta/agent_session_message.rb +106 -0
- data/lib/openai/models/beta/agent_session_message_content.rb +97 -0
- data/lib/openai/models/beta/agent_session_requires_action_event.rb +39 -0
- data/lib/openai/models/beta/agent_session_subagent_active_event.rb +39 -0
- data/lib/openai/models/beta/agent_session_subagent_closed_event.rb +39 -0
- data/lib/openai/models/beta/agent_session_subagent_created_event.rb +39 -0
- data/lib/openai/models/beta/agent_session_turn_cancelled_event.rb +66 -0
- data/lib/openai/models/beta/agent_session_turn_completed_event.rb +66 -0
- data/lib/openai/models/beta/agent_session_turn_content_part_added_event.rb +84 -0
- data/lib/openai/models/beta/agent_session_turn_content_part_done_event.rb +84 -0
- data/lib/openai/models/beta/agent_session_turn_created_event.rb +57 -0
- data/lib/openai/models/beta/agent_session_turn_failed_event.rb +66 -0
- data/lib/openai/models/beta/agent_session_turn_in_progress_event.rb +57 -0
- data/lib/openai/models/beta/agent_session_turn_item_added_event.rb +66 -0
- data/lib/openai/models/beta/agent_session_turn_item_done_event.rb +66 -0
- data/lib/openai/models/beta/agent_session_turn_output_text_delta_event.rb +84 -0
- data/lib/openai/models/beta/agent_session_turn_output_text_done_event.rb +84 -0
- data/lib/openai/models/beta/agent_session_turn_reasoning_summary_part_added_event.rb +86 -0
- data/lib/openai/models/beta/agent_session_turn_reasoning_summary_part_done_event.rb +93 -0
- data/lib/openai/models/beta/agent_session_turn_reasoning_summary_text_delta_event.rb +86 -0
- data/lib/openai/models/beta/agent_session_turn_reasoning_summary_text_done_event.rb +84 -0
- data/lib/openai/models/beta/agent_text.rb +44 -0
- data/lib/openai/models/beta/agent_text_param.rb +49 -0
- data/lib/openai/models/beta/agent_tool.rb +314 -0
- data/lib/openai/models/beta/agent_tool_param.rb +359 -0
- data/lib/openai/models/beta/agent_update_params.rb +137 -0
- data/lib/openai/models/beta/agent_wait_for_subagents_call_item.rb +66 -0
- data/lib/openai/models/beta/agent_web_search_call_item.rb +57 -0
- data/lib/openai/models/beta/agents/environment_info.rb +107 -0
- data/lib/openai/models/beta/agents/environment_retrieve_params.rb +24 -0
- data/lib/openai/models/beta/agents/environments/environment_file.rb +55 -0
- data/lib/openai/models/beta/agents/environments/environment_template.rb +368 -0
- data/lib/openai/models/beta/agents/environments/environment_template_deleted.rb +46 -0
- data/lib/openai/models/beta/agents/environments/file_create_params.rb +26 -0
- data/lib/openai/models/beta/agents/environments/file_list_params.rb +77 -0
- data/lib/openai/models/beta/agents/environments/template_create_params.rb +209 -0
- data/lib/openai/models/beta/agents/environments/template_delete_params.rb +26 -0
- data/lib/openai/models/beta/agents/environments/template_list_params.rb +61 -0
- data/lib/openai/models/beta/agents/environments/template_retrieve_params.rb +26 -0
- data/lib/openai/models/beta/agents/environments/template_update_params.rb +212 -0
- data/lib/openai/models/beta/agents/session_create_params.rb +203 -0
- data/lib/openai/models/beta/agents/session_delete_params.rb +24 -0
- data/lib/openai/models/beta/agents/session_list_params.rb +73 -0
- data/lib/openai/models/beta/agents/session_retrieve_params.rb +24 -0
- data/lib/openai/models/beta/agents/session_update_params.rb +145 -0
- data/lib/openai/models/beta/agents/sessions/artifact_content_params.rb +32 -0
- data/lib/openai/models/beta/agents/sessions/artifact_delete_params.rb +32 -0
- data/lib/openai/models/beta/agents/sessions/artifact_list_params.rb +77 -0
- data/lib/openai/models/beta/agents/sessions/artifact_retrieve_params.rb +32 -0
- data/lib/openai/models/beta/agents/sessions/event_create_params.rb +43 -0
- data/lib/openai/models/beta/agents/sessions/event_stream_params.rb +26 -0
- data/lib/openai/models/beta/agents/sessions/item_list_params.rb +68 -0
- data/lib/openai/models/beta/agents/sessions/session_artifact.rb +91 -0
- data/lib/openai/models/beta/agents/sessions/session_artifact_deleted.rb +46 -0
- data/lib/openai/models/beta/agents/sessions/subagent_list_params.rb +68 -0
- data/lib/openai/models/beta/agents/sessions/subagent_retrieve_params.rb +32 -0
- data/lib/openai/models/beta/agents/sessions/subagents/item_list_params.rb +77 -0
- data/lib/openai/models/beta/agents/sessions/subagents/turn_list_params.rb +77 -0
- data/lib/openai/models/beta/agents/sessions/subagents/turn_retrieve_params.rb +40 -0
- data/lib/openai/models/beta/agents/sessions/subagents/turns/item_list_params.rb +86 -0
- data/lib/openai/models/beta/agents/sessions/turn.rb +148 -0
- data/lib/openai/models/beta/agents/sessions/turn_list_params.rb +68 -0
- data/lib/openai/models/beta/agents/sessions/turn_retrieve_params.rb +32 -0
- data/lib/openai/models/beta/agents/vault.rb +63 -0
- data/lib/openai/models/beta/agents/vault_create_params.rb +40 -0
- data/lib/openai/models/beta/agents/vault_delete_params.rb +24 -0
- data/lib/openai/models/beta/agents/vault_deleted.rb +42 -0
- data/lib/openai/models/beta/agents/vault_list_params.rb +75 -0
- data/lib/openai/models/beta/agents/vault_retrieve_params.rb +24 -0
- data/lib/openai/models/beta/agents/vault_status.rb +20 -0
- data/lib/openai/models/beta/agents/vault_status_filter.rb +27 -0
- data/lib/openai/models/beta/agents/vaults/credential.rb +80 -0
- data/lib/openai/models/beta/agents/vaults/credential_auth.rb +155 -0
- data/lib/openai/models/beta/agents/vaults/credential_auth_create_param.rb +184 -0
- data/lib/openai/models/beta/agents/vaults/credential_auth_rotate_param.rb +147 -0
- data/lib/openai/models/beta/agents/vaults/credential_create_params.rb +47 -0
- data/lib/openai/models/beta/agents/vaults/credential_delete_params.rb +32 -0
- data/lib/openai/models/beta/agents/vaults/credential_deleted.rb +44 -0
- data/lib/openai/models/beta/agents/vaults/credential_list_params.rb +84 -0
- data/lib/openai/models/beta/agents/vaults/credential_retrieve_params.rb +32 -0
- data/lib/openai/models/beta/agents/vaults/credential_update_params.rb +43 -0
- data/lib/openai/models/beta/agents/vaults/mcp_oauth_token_endpoint_auth.rb +78 -0
- data/lib/openai/models/beta/agents/vaults/mcp_oauth_token_endpoint_auth_create_param.rb +96 -0
- data/lib/openai/models/beta/agents/vaults/mcp_oauth_token_endpoint_auth_rotate_param.rb +84 -0
- data/lib/openai/models/beta/beta_response.rb +9 -3
- data/lib/openai/models/beta/beta_response_compaction_compacting_event.rb +75 -0
- data/lib/openai/models/beta/beta_response_stream_event.rb +4 -1
- data/lib/openai/models/beta/beta_responses_client_event.rb +25 -4
- data/lib/openai/models/beta/beta_responses_server_event.rb +39 -1
- data/lib/openai/models/beta/environment.rb +246 -0
- data/lib/openai/models/beta/environment_param.rb +269 -0
- data/lib/openai/models/beta/hosted_environment_file.rb +64 -0
- data/lib/openai/models/beta/hosted_environment_file_id.rb +57 -0
- data/lib/openai/models/beta/hosted_environment_file_param.rb +87 -0
- data/lib/openai/models/beta/hosted_plugin.rb +39 -0
- data/lib/openai/models/beta/hosted_plugin_param.rb +48 -0
- data/lib/openai/models/beta/hosted_skill.rb +55 -0
- data/lib/openai/models/beta/hosted_skill_param.rb +96 -0
- data/lib/openai/models/beta/hosted_skill_reference.rb +57 -0
- data/lib/openai/models/beta/inline_capability_source_param.rb +39 -0
- data/lib/openai/models/beta/input_content.rb +71 -0
- data/lib/openai/models/beta/input_content_param.rb +69 -0
- data/lib/openai/models/beta/mcp_transport.rb +96 -0
- data/lib/openai/models/beta/mcp_transport_param.rb +123 -0
- data/lib/openai/models/beta/multi_agent_config.rb +32 -0
- data/lib/openai/models/beta/multi_agent_config_param.rb +30 -0
- data/lib/openai/models/beta/output_text.rb +30 -0
- data/lib/openai/models/beta/persisted_agent_tool.rb +329 -0
- data/lib/openai/models/beta/persisted_agent_tool_param.rb +355 -0
- data/lib/openai/models/beta/persisted_mcp_transport.rb +105 -0
- data/lib/openai/models/beta/persisted_mcp_transport_param.rb +105 -0
- data/lib/openai/models/beta/response_compact_params.rb +9 -3
- data/lib/openai/models/beta/response_create_params.rb +21 -4
- data/lib/openai/models/beta/session_error.rb +48 -0
- data/lib/openai/models/beta/session_turn_error.rb +91 -0
- data/lib/openai/models/beta/setup_command_param.rb +30 -0
- data/lib/openai/models/beta/subagent.rb +121 -0
- data/lib/openai/models/beta/summary_text.rb +30 -0
- data/lib/openai/models/beta/text_format.rb +60 -0
- data/lib/openai/models/beta/text_format_param.rb +60 -0
- data/lib/openai/models/beta/token_usage.rb +87 -0
- data/lib/openai/models/beta/web_search_action.rb +130 -0
- data/lib/openai/models/chat/completion_create_params.rb +1 -1
- data/lib/openai/models/chat_model.rb +3 -1
- data/lib/openai/models/responses/response_compact_params.rb +9 -3
- data/lib/openai/models/responses/response_compaction_compacting_event.rb +49 -0
- data/lib/openai/models/responses/response_create_params.rb +12 -1
- data/lib/openai/models/responses/response_stream_event.rb +4 -1
- data/lib/openai/models/responses/responses_client_event.rb +12 -1
- data/lib/openai/models/responses/responses_server_event.rb +36 -1
- data/lib/openai/models/webhooks/realtime_call_incoming_webhook_event.rb +6 -8
- data/lib/openai/resources/beta/agents/environments/files.rb +89 -0
- data/lib/openai/resources/beta/agents/environments/templates.rb +206 -0
- data/lib/openai/resources/beta/agents/environments.rb +50 -0
- data/lib/openai/resources/beta/agents/sessions/artifacts.rb +155 -0
- data/lib/openai/resources/beta/agents/sessions/events.rb +80 -0
- data/lib/openai/resources/beta/agents/sessions/items.rb +57 -0
- data/lib/openai/resources/beta/agents/sessions/subagents/items.rb +66 -0
- data/lib/openai/resources/beta/agents/sessions/subagents/turns/items.rb +82 -0
- data/lib/openai/resources/beta/agents/sessions/subagents/turns.rb +108 -0
- data/lib/openai/resources/beta/agents/sessions/subagents.rb +95 -0
- data/lib/openai/resources/beta/agents/sessions/turns.rb +89 -0
- data/lib/openai/resources/beta/agents/sessions.rb +298 -0
- data/lib/openai/resources/beta/agents/vaults/credentials.rb +195 -0
- data/lib/openai/resources/beta/agents/vaults.rb +137 -0
- data/lib/openai/resources/beta/agents.rb +213 -0
- data/lib/openai/resources/beta/responses.rb +2 -2
- data/lib/openai/resources/beta.rb +4 -0
- data/lib/openai/resources/live/sessions.rb +10 -4
- data/lib/openai/resources/responses.rb +2 -2
- data/lib/openai/version.rb +1 -1
- data/lib/openai.rb +178 -0
- data/rbi/openai/helpers/agents.rbi +71 -0
- data/rbi/openai/helpers/responses_websocket/connection.rbi +5 -0
- data/rbi/openai/helpers/responses_websocket/session.rbi +206 -0
- data/rbi/openai/internal/token_page.rbi +25 -0
- data/rbi/openai/models/beta/agent.rbi +209 -0
- data/rbi/openai/models/beta/agent_close_subagent_call_item.rbi +102 -0
- data/rbi/openai/models/beta/agent_command_execution_item.rbi +132 -0
- data/rbi/openai/models/beta/agent_content.rbi +75 -0
- data/rbi/openai/models/beta/agent_create_params.rbi +212 -0
- data/rbi/openai/models/beta/agent_create_subagent_call_item.rbi +124 -0
- data/rbi/openai/models/beta/agent_delete_params.rbi +53 -0
- data/rbi/openai/models/beta/agent_deleted.rbi +68 -0
- data/rbi/openai/models/beta/agent_function_call_item.rbi +112 -0
- data/rbi/openai/models/beta/agent_function_call_output.rbi +33 -0
- data/rbi/openai/models/beta/agent_function_call_output_param.rbi +33 -0
- data/rbi/openai/models/beta/agent_function_call_status.rbi +35 -0
- data/rbi/openai/models/beta/agent_interrupt_subagent_call_item.rbi +103 -0
- data/rbi/openai/models/beta/agent_list_params.rbi +102 -0
- data/rbi/openai/models/beta/agent_mcp_call_item.rbi +132 -0
- data/rbi/openai/models/beta/agent_output_command_execution_output_delta_event.rbi +112 -0
- data/rbi/openai/models/beta/agent_output_item.rbi +38 -0
- data/rbi/openai/models/beta/agent_output_item_status.rbi +32 -0
- data/rbi/openai/models/beta/agent_reasoning.rbi +103 -0
- data/rbi/openai/models/beta/agent_reasoning_item.rbi +92 -0
- data/rbi/openai/models/beta/agent_reasoning_param.rbi +103 -0
- data/rbi/openai/models/beta/agent_resume_subagent_call_item.rbi +102 -0
- data/rbi/openai/models/beta/agent_retrieve_params.rbi +53 -0
- data/rbi/openai/models/beta/agent_send_subagent_input_call_item.rbi +114 -0
- data/rbi/openai/models/beta/agent_session.rbi +494 -0
- data/rbi/openai/models/beta/agent_session_assistant_message.rbi +130 -0
- data/rbi/openai/models/beta/agent_session_created_event.rbi +71 -0
- data/rbi/openai/models/beta/agent_session_deleted.rbi +71 -0
- data/rbi/openai/models/beta/agent_session_environment_connected_event.rbi +95 -0
- data/rbi/openai/models/beta/agent_session_environment_disconnected_event.rbi +95 -0
- data/rbi/openai/models/beta/agent_session_environment_failed_event.rbi +95 -0
- data/rbi/openai/models/beta/agent_session_environment_pending_event.rbi +95 -0
- data/rbi/openai/models/beta/agent_session_environment_ready_event.rbi +95 -0
- data/rbi/openai/models/beta/agent_session_environment_state.rbi +168 -0
- data/rbi/openai/models/beta/agent_session_error_event.rbi +80 -0
- data/rbi/openai/models/beta/agent_session_event.rbi +56 -0
- data/rbi/openai/models/beta/agent_session_failed_event.rbi +71 -0
- data/rbi/openai/models/beta/agent_session_idle_event.rbi +71 -0
- data/rbi/openai/models/beta/agent_session_in_progress_event.rbi +71 -0
- data/rbi/openai/models/beta/agent_session_input_message_param.rbi +100 -0
- data/rbi/openai/models/beta/agent_session_input_param.rbi +232 -0
- data/rbi/openai/models/beta/agent_session_item.rbi +239 -0
- data/rbi/openai/models/beta/agent_session_message.rbi +153 -0
- data/rbi/openai/models/beta/agent_session_message_content.rbi +172 -0
- data/rbi/openai/models/beta/agent_session_requires_action_event.rbi +71 -0
- data/rbi/openai/models/beta/agent_session_subagent_active_event.rbi +71 -0
- data/rbi/openai/models/beta/agent_session_subagent_closed_event.rbi +71 -0
- data/rbi/openai/models/beta/agent_session_subagent_created_event.rbi +71 -0
- data/rbi/openai/models/beta/agent_session_turn_cancelled_event.rbi +108 -0
- data/rbi/openai/models/beta/agent_session_turn_completed_event.rbi +108 -0
- data/rbi/openai/models/beta/agent_session_turn_content_part_added_event.rbi +125 -0
- data/rbi/openai/models/beta/agent_session_turn_content_part_done_event.rbi +125 -0
- data/rbi/openai/models/beta/agent_session_turn_created_event.rbi +95 -0
- data/rbi/openai/models/beta/agent_session_turn_failed_event.rbi +108 -0
- data/rbi/openai/models/beta/agent_session_turn_in_progress_event.rbi +95 -0
- data/rbi/openai/models/beta/agent_session_turn_item_added_event.rbi +117 -0
- data/rbi/openai/models/beta/agent_session_turn_item_done_event.rbi +115 -0
- data/rbi/openai/models/beta/agent_session_turn_output_text_delta_event.rbi +122 -0
- data/rbi/openai/models/beta/agent_session_turn_output_text_done_event.rbi +122 -0
- data/rbi/openai/models/beta/agent_session_turn_reasoning_summary_part_added_event.rbi +127 -0
- data/rbi/openai/models/beta/agent_session_turn_reasoning_summary_part_done_event.rbi +135 -0
- data/rbi/openai/models/beta/agent_session_turn_reasoning_summary_text_delta_event.rbi +124 -0
- data/rbi/openai/models/beta/agent_session_turn_reasoning_summary_text_done_event.rbi +122 -0
- data/rbi/openai/models/beta/agent_text.rbi +75 -0
- data/rbi/openai/models/beta/agent_text_param.rbi +87 -0
- data/rbi/openai/models/beta/agent_tool.rbi +467 -0
- data/rbi/openai/models/beta/agent_tool_param.rbi +530 -0
- data/rbi/openai/models/beta/agent_update_params.rbi +225 -0
- data/rbi/openai/models/beta/agent_wait_for_subagents_call_item.rbi +102 -0
- data/rbi/openai/models/beta/agent_web_search_call_item.rbi +99 -0
- data/rbi/openai/models/beta/agents/environment_info.rbi +156 -0
- data/rbi/openai/models/beta/agents/environment_retrieve_params.rbi +57 -0
- data/rbi/openai/models/beta/agents/environments/environment_file.rbi +87 -0
- data/rbi/openai/models/beta/agents/environments/environment_template.rbi +582 -0
- data/rbi/openai/models/beta/agents/environments/environment_template_deleted.rbi +78 -0
- data/rbi/openai/models/beta/agents/environments/file_create_params.rbi +61 -0
- data/rbi/openai/models/beta/agents/environments/file_list_params.rbi +130 -0
- data/rbi/openai/models/beta/agents/environments/template_create_params.rbi +350 -0
- data/rbi/openai/models/beta/agents/environments/template_delete_params.rbi +61 -0
- data/rbi/openai/models/beta/agents/environments/template_list_params.rbi +117 -0
- data/rbi/openai/models/beta/agents/environments/template_retrieve_params.rbi +61 -0
- data/rbi/openai/models/beta/agents/environments/template_update_params.rbi +354 -0
- data/rbi/openai/models/beta/agents/session_create_params.rbi +336 -0
- data/rbi/openai/models/beta/agents/session_delete_params.rbi +57 -0
- data/rbi/openai/models/beta/agents/session_list_params.rbi +124 -0
- data/rbi/openai/models/beta/agents/session_retrieve_params.rbi +57 -0
- data/rbi/openai/models/beta/agents/session_update_params.rbi +252 -0
- data/rbi/openai/models/beta/agents/sessions/artifact_content_params.rbi +68 -0
- data/rbi/openai/models/beta/agents/sessions/artifact_delete_params.rbi +68 -0
- data/rbi/openai/models/beta/agents/sessions/artifact_list_params.rbi +127 -0
- data/rbi/openai/models/beta/agents/sessions/artifact_retrieve_params.rbi +68 -0
- data/rbi/openai/models/beta/agents/sessions/event_create_params.rbi +107 -0
- data/rbi/openai/models/beta/agents/sessions/event_stream_params.rbi +61 -0
- data/rbi/openai/models/beta/agents/sessions/item_list_params.rbi +121 -0
- data/rbi/openai/models/beta/agents/sessions/session_artifact.rbi +132 -0
- data/rbi/openai/models/beta/agents/sessions/session_artifact_deleted.rbi +78 -0
- data/rbi/openai/models/beta/agents/sessions/subagent_list_params.rbi +123 -0
- data/rbi/openai/models/beta/agents/sessions/subagent_retrieve_params.rbi +68 -0
- data/rbi/openai/models/beta/agents/sessions/subagents/item_list_params.rbi +139 -0
- data/rbi/openai/models/beta/agents/sessions/subagents/turn_list_params.rbi +139 -0
- data/rbi/openai/models/beta/agents/sessions/subagents/turn_retrieve_params.rbi +79 -0
- data/rbi/openai/models/beta/agents/sessions/subagents/turns/item_list_params.rbi +161 -0
- data/rbi/openai/models/beta/agents/sessions/turn.rbi +200 -0
- data/rbi/openai/models/beta/agents/sessions/turn_list_params.rbi +121 -0
- data/rbi/openai/models/beta/agents/sessions/turn_retrieve_params.rbi +68 -0
- data/rbi/openai/models/beta/agents/vault.rbi +99 -0
- data/rbi/openai/models/beta/agents/vault_create_params.rbi +75 -0
- data/rbi/openai/models/beta/agents/vault_delete_params.rbi +57 -0
- data/rbi/openai/models/beta/agents/vault_deleted.rbi +72 -0
- data/rbi/openai/models/beta/agents/vault_list_params.rbi +149 -0
- data/rbi/openai/models/beta/agents/vault_retrieve_params.rbi +57 -0
- data/rbi/openai/models/beta/agents/vault_status.rbi +30 -0
- data/rbi/openai/models/beta/agents/vault_status_filter.rbi +39 -0
- data/rbi/openai/models/beta/agents/vaults/credential.rbi +123 -0
- data/rbi/openai/models/beta/agents/vaults/credential_auth.rbi +248 -0
- data/rbi/openai/models/beta/agents/vaults/credential_auth_create_param.rbi +293 -0
- data/rbi/openai/models/beta/agents/vaults/credential_auth_rotate_param.rbi +252 -0
- data/rbi/openai/models/beta/agents/vaults/credential_create_params.rbi +99 -0
- data/rbi/openai/models/beta/agents/vaults/credential_delete_params.rbi +68 -0
- data/rbi/openai/models/beta/agents/vaults/credential_deleted.rbi +76 -0
- data/rbi/openai/models/beta/agents/vaults/credential_list_params.rbi +163 -0
- data/rbi/openai/models/beta/agents/vaults/credential_retrieve_params.rbi +68 -0
- data/rbi/openai/models/beta/agents/vaults/credential_update_params.rbi +95 -0
- data/rbi/openai/models/beta/agents/vaults/mcp_oauth_token_endpoint_auth.rbi +151 -0
- data/rbi/openai/models/beta/agents/vaults/mcp_oauth_token_endpoint_auth_create_param.rbi +171 -0
- data/rbi/openai/models/beta/agents/vaults/mcp_oauth_token_endpoint_auth_rotate_param.rbi +137 -0
- data/rbi/openai/models/beta/beta_response.rbi +6 -1
- data/rbi/openai/models/beta/beta_response_compaction_compacting_event.rbi +136 -0
- data/rbi/openai/models/beta/beta_response_stream_event.rbi +1 -0
- data/rbi/openai/models/beta/beta_responses_client_event.rbi +27 -4
- data/rbi/openai/models/beta/beta_responses_server_event.rbi +77 -0
- data/rbi/openai/models/beta/environment.rbi +400 -0
- data/rbi/openai/models/beta/environment_param.rbi +448 -0
- data/rbi/openai/models/beta/hosted_environment_file.rbi +93 -0
- data/rbi/openai/models/beta/hosted_environment_file_id.rbi +86 -0
- data/rbi/openai/models/beta/hosted_environment_file_param.rbi +140 -0
- data/rbi/openai/models/beta/hosted_plugin.rbi +68 -0
- data/rbi/openai/models/beta/hosted_plugin_param.rbi +80 -0
- data/rbi/openai/models/beta/hosted_skill.rbi +84 -0
- data/rbi/openai/models/beta/hosted_skill_param.rbi +152 -0
- data/rbi/openai/models/beta/hosted_skill_reference.rbi +86 -0
- data/rbi/openai/models/beta/inline_capability_source_param.rbi +68 -0
- data/rbi/openai/models/beta/input_content.rbi +124 -0
- data/rbi/openai/models/beta/input_content_param.rbi +122 -0
- data/rbi/openai/models/beta/mcp_transport.rbi +149 -0
- data/rbi/openai/models/beta/mcp_transport_param.rbi +188 -0
- data/rbi/openai/models/beta/multi_agent_config.rbi +61 -0
- data/rbi/openai/models/beta/multi_agent_config_param.rbi +62 -0
- data/rbi/openai/models/beta/output_text.rbi +59 -0
- data/rbi/openai/models/beta/persisted_agent_tool.rbi +507 -0
- data/rbi/openai/models/beta/persisted_agent_tool_param.rbi +546 -0
- data/rbi/openai/models/beta/persisted_mcp_transport.rbi +158 -0
- data/rbi/openai/models/beta/persisted_mcp_transport_param.rbi +164 -0
- data/rbi/openai/models/beta/response_compact_params.rbi +6 -1
- data/rbi/openai/models/beta/response_create_params.rbi +21 -1
- data/rbi/openai/models/beta/session_error.rbi +77 -0
- data/rbi/openai/models/beta/session_turn_error.rbi +131 -0
- data/rbi/openai/models/beta/setup_command_param.rbi +59 -0
- data/rbi/openai/models/beta/subagent.rbi +158 -0
- data/rbi/openai/models/beta/summary_text.rbi +59 -0
- data/rbi/openai/models/beta/text_format.rbi +113 -0
- data/rbi/openai/models/beta/text_format_param.rbi +113 -0
- data/rbi/openai/models/beta/token_usage.rbi +174 -0
- data/rbi/openai/models/beta/web_search_action.rbi +227 -0
- data/rbi/openai/models/chat_model.rbi +3 -1
- data/rbi/openai/models/responses/response_compact_params.rbi +6 -1
- data/rbi/openai/models/responses/response_compaction_compacting_event.rbi +78 -0
- data/rbi/openai/models/responses/response_create_params.rbi +15 -0
- data/rbi/openai/models/responses/response_stream_event.rbi +1 -0
- data/rbi/openai/models/responses/responses_client_event.rbi +15 -0
- data/rbi/openai/models/responses/responses_server_event.rbi +71 -0
- data/rbi/openai/models/webhooks/realtime_call_incoming_webhook_event.rbi +6 -8
- data/rbi/openai/resources/beta/agents/environments/files.rbi +79 -0
- data/rbi/openai/resources/beta/agents/environments/templates.rbi +194 -0
- data/rbi/openai/resources/beta/agents/environments.rbi +44 -0
- data/rbi/openai/resources/beta/agents/sessions/artifacts.rbi +105 -0
- data/rbi/openai/resources/beta/agents/sessions/events.rbi +71 -0
- data/rbi/openai/resources/beta/agents/sessions/items.rbi +53 -0
- data/rbi/openai/resources/beta/agents/sessions/subagents/items.rbi +60 -0
- data/rbi/openai/resources/beta/agents/sessions/subagents/turns/items.rbi +67 -0
- data/rbi/openai/resources/beta/agents/sessions/subagents/turns.rbi +85 -0
- data/rbi/openai/resources/beta/agents/sessions/subagents.rbi +74 -0
- data/rbi/openai/resources/beta/agents/sessions/turns.rbi +70 -0
- data/rbi/openai/resources/beta/agents/sessions.rbi +212 -0
- data/rbi/openai/resources/beta/agents/vaults/credentials.rbi +148 -0
- data/rbi/openai/resources/beta/agents/vaults.rbi +106 -0
- data/rbi/openai/resources/beta/agents.rbi +180 -0
- data/rbi/openai/resources/beta.rbi +3 -0
- data/rbi/openai/resources/live/sessions.rbi +10 -4
- data/rbi/openai/resources/responses.rbi +8 -8
- data/responses-websocket.md +117 -10
- data/sig/openai/helpers/agents.rbs +50 -0
- data/sig/openai/helpers/responses_websocket/connection.rbs +5 -0
- data/sig/openai/helpers/responses_websocket/session.rbs +123 -0
- data/sig/openai/internal/token_page.rbs +15 -0
- data/sig/openai/models/beta/agent.rbs +96 -0
- data/sig/openai/models/beta/agent_close_subagent_call_item.rbs +47 -0
- data/sig/openai/models/beta/agent_command_execution_item.rbs +62 -0
- data/sig/openai/models/beta/agent_content.rbs +33 -0
- data/sig/openai/models/beta/agent_create_params.rbs +91 -0
- data/sig/openai/models/beta/agent_create_subagent_call_item.rbs +57 -0
- data/sig/openai/models/beta/agent_delete_params.rbs +25 -0
- data/sig/openai/models/beta/agent_deleted.rbs +24 -0
- data/sig/openai/models/beta/agent_function_call_item.rbs +52 -0
- data/sig/openai/models/beta/agent_function_call_output.rbs +16 -0
- data/sig/openai/models/beta/agent_function_call_output_param.rbs +16 -0
- data/sig/openai/models/beta/agent_function_call_status.rbs +26 -0
- data/sig/openai/models/beta/agent_interrupt_subagent_call_item.rbs +47 -0
- data/sig/openai/models/beta/agent_list_params.rbs +58 -0
- data/sig/openai/models/beta/agent_mcp_call_item.rbs +62 -0
- data/sig/openai/models/beta/agent_output_command_execution_output_delta_event.rbs +52 -0
- data/sig/openai/models/beta/agent_output_item.rbs +25 -0
- data/sig/openai/models/beta/agent_output_item_status.rbs +22 -0
- data/sig/openai/models/beta/agent_reasoning.rbs +60 -0
- data/sig/openai/models/beta/agent_reasoning_item.rbs +42 -0
- data/sig/openai/models/beta/agent_reasoning_param.rbs +60 -0
- data/sig/openai/models/beta/agent_resume_subagent_call_item.rbs +47 -0
- data/sig/openai/models/beta/agent_retrieve_params.rbs +25 -0
- data/sig/openai/models/beta/agent_send_subagent_input_call_item.rbs +52 -0
- data/sig/openai/models/beta/agent_session.rbs +234 -0
- data/sig/openai/models/beta/agent_session_assistant_message.rbs +66 -0
- data/sig/openai/models/beta/agent_session_created_event.rbs +32 -0
- data/sig/openai/models/beta/agent_session_deleted.rbs +28 -0
- data/sig/openai/models/beta/agent_session_environment_connected_event.rbs +42 -0
- data/sig/openai/models/beta/agent_session_environment_disconnected_event.rbs +42 -0
- data/sig/openai/models/beta/agent_session_environment_failed_event.rbs +42 -0
- data/sig/openai/models/beta/agent_session_environment_pending_event.rbs +42 -0
- data/sig/openai/models/beta/agent_session_environment_ready_event.rbs +42 -0
- data/sig/openai/models/beta/agent_session_environment_state.rbs +74 -0
- data/sig/openai/models/beta/agent_session_error_event.rbs +37 -0
- data/sig/openai/models/beta/agent_session_event.rbs +43 -0
- data/sig/openai/models/beta/agent_session_failed_event.rbs +32 -0
- data/sig/openai/models/beta/agent_session_idle_event.rbs +32 -0
- data/sig/openai/models/beta/agent_session_in_progress_event.rbs +32 -0
- data/sig/openai/models/beta/agent_session_input_message_param.rbs +46 -0
- data/sig/openai/models/beta/agent_session_input_param.rbs +91 -0
- data/sig/openai/models/beta/agent_session_item.rbs +116 -0
- data/sig/openai/models/beta/agent_session_message.rbs +77 -0
- data/sig/openai/models/beta/agent_session_message_content.rbs +52 -0
- data/sig/openai/models/beta/agent_session_requires_action_event.rbs +32 -0
- data/sig/openai/models/beta/agent_session_subagent_active_event.rbs +32 -0
- data/sig/openai/models/beta/agent_session_subagent_closed_event.rbs +32 -0
- data/sig/openai/models/beta/agent_session_subagent_created_event.rbs +32 -0
- data/sig/openai/models/beta/agent_session_turn_cancelled_event.rbs +47 -0
- data/sig/openai/models/beta/agent_session_turn_completed_event.rbs +47 -0
- data/sig/openai/models/beta/agent_session_turn_content_part_added_event.rbs +57 -0
- data/sig/openai/models/beta/agent_session_turn_content_part_done_event.rbs +57 -0
- data/sig/openai/models/beta/agent_session_turn_created_event.rbs +42 -0
- data/sig/openai/models/beta/agent_session_turn_failed_event.rbs +47 -0
- data/sig/openai/models/beta/agent_session_turn_in_progress_event.rbs +42 -0
- data/sig/openai/models/beta/agent_session_turn_item_added_event.rbs +47 -0
- data/sig/openai/models/beta/agent_session_turn_item_done_event.rbs +47 -0
- data/sig/openai/models/beta/agent_session_turn_output_text_delta_event.rbs +57 -0
- data/sig/openai/models/beta/agent_session_turn_output_text_done_event.rbs +57 -0
- data/sig/openai/models/beta/agent_session_turn_reasoning_summary_part_added_event.rbs +57 -0
- data/sig/openai/models/beta/agent_session_turn_reasoning_summary_part_done_event.rbs +64 -0
- data/sig/openai/models/beta/agent_session_turn_reasoning_summary_text_delta_event.rbs +57 -0
- data/sig/openai/models/beta/agent_session_turn_reasoning_summary_text_done_event.rbs +57 -0
- data/sig/openai/models/beta/agent_text.rbs +39 -0
- data/sig/openai/models/beta/agent_text_param.rbs +44 -0
- data/sig/openai/models/beta/agent_tool.rbs +226 -0
- data/sig/openai/models/beta/agent_tool_param.rbs +251 -0
- data/sig/openai/models/beta/agent_update_params.rbs +98 -0
- data/sig/openai/models/beta/agent_wait_for_subagents_call_item.rbs +47 -0
- data/sig/openai/models/beta/agent_web_search_call_item.rbs +42 -0
- data/sig/openai/models/beta/agents/environment_info.rbs +80 -0
- data/sig/openai/models/beta/agents/environment_retrieve_params.rbs +27 -0
- data/sig/openai/models/beta/agents/environments/environment_file.rbs +43 -0
- data/sig/openai/models/beta/agents/environments/environment_template.rbs +255 -0
- data/sig/openai/models/beta/agents/environments/environment_template_deleted.rbs +38 -0
- data/sig/openai/models/beta/agents/environments/file_create_params.rbs +29 -0
- data/sig/openai/models/beta/agents/environments/file_list_params.rbs +72 -0
- data/sig/openai/models/beta/agents/environments/template_create_params.rbs +138 -0
- data/sig/openai/models/beta/agents/environments/template_delete_params.rbs +32 -0
- data/sig/openai/models/beta/agents/environments/template_list_params.rbs +64 -0
- data/sig/openai/models/beta/agents/environments/template_retrieve_params.rbs +32 -0
- data/sig/openai/models/beta/agents/environments/template_update_params.rbs +143 -0
- data/sig/openai/models/beta/agents/session_create_params.rbs +144 -0
- data/sig/openai/models/beta/agents/session_delete_params.rbs +27 -0
- data/sig/openai/models/beta/agents/session_list_params.rbs +67 -0
- data/sig/openai/models/beta/agents/session_retrieve_params.rbs +27 -0
- data/sig/openai/models/beta/agents/session_update_params.rbs +134 -0
- data/sig/openai/models/beta/agents/sessions/artifact_content_params.rbs +37 -0
- data/sig/openai/models/beta/agents/sessions/artifact_delete_params.rbs +37 -0
- data/sig/openai/models/beta/agents/sessions/artifact_list_params.rbs +70 -0
- data/sig/openai/models/beta/agents/sessions/artifact_retrieve_params.rbs +37 -0
- data/sig/openai/models/beta/agents/sessions/event_create_params.rbs +44 -0
- data/sig/openai/models/beta/agents/sessions/event_stream_params.rbs +29 -0
- data/sig/openai/models/beta/agents/sessions/item_list_params.rbs +69 -0
- data/sig/openai/models/beta/agents/sessions/session_artifact.rbs +63 -0
- data/sig/openai/models/beta/agents/sessions/session_artifact_deleted.rbs +38 -0
- data/sig/openai/models/beta/agents/sessions/subagent_list_params.rbs +69 -0
- data/sig/openai/models/beta/agents/sessions/subagent_retrieve_params.rbs +37 -0
- data/sig/openai/models/beta/agents/sessions/subagents/item_list_params.rbs +76 -0
- data/sig/openai/models/beta/agents/sessions/subagents/turn_list_params.rbs +76 -0
- data/sig/openai/models/beta/agents/sessions/subagents/turn_retrieve_params.rbs +44 -0
- data/sig/openai/models/beta/agents/sessions/subagents/turns/item_list_params.rbs +83 -0
- data/sig/openai/models/beta/agents/sessions/turn.rbs +108 -0
- data/sig/openai/models/beta/agents/sessions/turn_list_params.rbs +69 -0
- data/sig/openai/models/beta/agents/sessions/turn_retrieve_params.rbs +37 -0
- data/sig/openai/models/beta/agents/vault.rbs +44 -0
- data/sig/openai/models/beta/agents/vault_create_params.rbs +37 -0
- data/sig/openai/models/beta/agents/vault_delete_params.rbs +27 -0
- data/sig/openai/models/beta/agents/vault_deleted.rbs +30 -0
- data/sig/openai/models/beta/agents/vault_list_params.rbs +69 -0
- data/sig/openai/models/beta/agents/vault_retrieve_params.rbs +27 -0
- data/sig/openai/models/beta/agents/vault_status.rbs +18 -0
- data/sig/openai/models/beta/agents/vault_status_filter.rbs +19 -0
- data/sig/openai/models/beta/agents/vaults/credential.rbs +56 -0
- data/sig/openai/models/beta/agents/vaults/credential_auth.rbs +104 -0
- data/sig/openai/models/beta/agents/vaults/credential_auth_create_param.rbs +121 -0
- data/sig/openai/models/beta/agents/vaults/credential_auth_rotate_param.rbs +90 -0
- data/sig/openai/models/beta/agents/vaults/credential_create_params.rbs +42 -0
- data/sig/openai/models/beta/agents/vaults/credential_delete_params.rbs +37 -0
- data/sig/openai/models/beta/agents/vaults/credential_deleted.rbs +32 -0
- data/sig/openai/models/beta/agents/vaults/credential_list_params.rbs +76 -0
- data/sig/openai/models/beta/agents/vaults/credential_retrieve_params.rbs +37 -0
- data/sig/openai/models/beta/agents/vaults/credential_update_params.rbs +42 -0
- data/sig/openai/models/beta/agents/vaults/mcp_oauth_token_endpoint_auth.rbs +50 -0
- data/sig/openai/models/beta/agents/vaults/mcp_oauth_token_endpoint_auth_create_param.rbs +68 -0
- data/sig/openai/models/beta/agents/vaults/mcp_oauth_token_endpoint_auth_rotate_param.rbs +57 -0
- data/sig/openai/models/beta/beta_response.rbs +6 -2
- data/sig/openai/models/beta/beta_response_compaction_compacting_event.rbs +58 -0
- data/sig/openai/models/beta/beta_response_stream_event.rbs +1 -0
- data/sig/openai/models/beta/beta_responses_client_event.rbs +13 -2
- data/sig/openai/models/beta/beta_responses_server_event.rbs +35 -0
- data/sig/openai/models/beta/environment.rbs +181 -0
- data/sig/openai/models/beta/environment_param.rbs +183 -0
- data/sig/openai/models/beta/hosted_environment_file.rbs +42 -0
- data/sig/openai/models/beta/hosted_environment_file_id.rbs +42 -0
- data/sig/openai/models/beta/hosted_environment_file_param.rbs +47 -0
- data/sig/openai/models/beta/hosted_plugin.rbs +23 -0
- data/sig/openai/models/beta/hosted_plugin_param.rbs +37 -0
- data/sig/openai/models/beta/hosted_skill.rbs +32 -0
- data/sig/openai/models/beta/hosted_skill_param.rbs +70 -0
- data/sig/openai/models/beta/hosted_skill_reference.rbs +42 -0
- data/sig/openai/models/beta/inline_capability_source_param.rbs +28 -0
- data/sig/openai/models/beta/input_content.rbs +39 -0
- data/sig/openai/models/beta/input_content_param.rbs +39 -0
- data/sig/openai/models/beta/mcp_transport.rbs +63 -0
- data/sig/openai/models/beta/mcp_transport_param.rbs +89 -0
- data/sig/openai/models/beta/multi_agent_config.rbs +21 -0
- data/sig/openai/models/beta/multi_agent_config_param.rbs +23 -0
- data/sig/openai/models/beta/output_text.rbs +17 -0
- data/sig/openai/models/beta/persisted_agent_tool.rbs +237 -0
- data/sig/openai/models/beta/persisted_agent_tool_param.rbs +251 -0
- data/sig/openai/models/beta/persisted_mcp_transport.rbs +75 -0
- data/sig/openai/models/beta/persisted_mcp_transport_param.rbs +79 -0
- data/sig/openai/models/beta/response_compact_params.rbs +6 -2
- data/sig/openai/models/beta/response_create_params.rbs +13 -2
- data/sig/openai/models/beta/session_error.rbs +32 -0
- data/sig/openai/models/beta/session_turn_error.rbs +100 -0
- data/sig/openai/models/beta/setup_command_param.rbs +17 -0
- data/sig/openai/models/beta/subagent.rbs +76 -0
- data/sig/openai/models/beta/summary_text.rbs +17 -0
- data/sig/openai/models/beta/text_format.rbs +39 -0
- data/sig/openai/models/beta/text_format_param.rbs +40 -0
- data/sig/openai/models/beta/token_usage.rbs +62 -0
- data/sig/openai/models/beta/web_search_action.rbs +85 -0
- data/sig/openai/models/chat_model.rbs +6 -2
- data/sig/openai/models/responses/response_compact_params.rbs +6 -2
- data/sig/openai/models/responses/response_compaction_compacting_event.rbs +37 -0
- data/sig/openai/models/responses/response_create_params.rbs +7 -0
- data/sig/openai/models/responses/response_stream_event.rbs +1 -0
- data/sig/openai/models/responses/responses_client_event.rbs +7 -0
- data/sig/openai/models/responses/responses_server_event.rbs +32 -0
- data/sig/openai/resources/beta/agents/environments/files.rbs +28 -0
- data/sig/openai/resources/beta/agents/environments/templates.rbs +57 -0
- data/sig/openai/resources/beta/agents/environments.rbs +20 -0
- data/sig/openai/resources/beta/agents/sessions/artifacts.rbs +40 -0
- data/sig/openai/resources/beta/agents/sessions/events.rbs +25 -0
- data/sig/openai/resources/beta/agents/sessions/items.rbs +21 -0
- data/sig/openai/resources/beta/agents/sessions/subagents/items.rbs +24 -0
- data/sig/openai/resources/beta/agents/sessions/subagents/turns/items.rbs +27 -0
- data/sig/openai/resources/beta/agents/sessions/subagents/turns.rbs +33 -0
- data/sig/openai/resources/beta/agents/sessions/subagents.rbs +31 -0
- data/sig/openai/resources/beta/agents/sessions/turns.rbs +27 -0
- data/sig/openai/resources/beta/agents/sessions.rbs +66 -0
- data/sig/openai/resources/beta/agents/vaults/credentials.rbs +48 -0
- data/sig/openai/resources/beta/agents/vaults.rbs +37 -0
- data/sig/openai/resources/beta/agents.rbs +59 -0
- data/sig/openai/resources/beta.rbs +2 -0
- metadata +540 -2
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OpenAI
|
|
4
|
+
module Responses
|
|
5
|
+
class SessionError < OpenAI::Errors::Error
|
|
6
|
+
def cause = nil
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class BufferError < SessionError
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class StateLostError < SessionError
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class RequestError < SessionError
|
|
16
|
+
attr_reader :event
|
|
17
|
+
|
|
18
|
+
# @api private
|
|
19
|
+
def initialize(event)
|
|
20
|
+
@event = event
|
|
21
|
+
super("The Responses WebSocket request returned an error event.")
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Explicit application budgets for an opt-in session, not service limits.
|
|
26
|
+
# Bytes count serialized event data, not Ruby object or transport overhead.
|
|
27
|
+
# max_lanes counts all registered IDs, including detached IDs, until reconnect.
|
|
28
|
+
class SessionLimits
|
|
29
|
+
attr_reader(
|
|
30
|
+
:max_lanes,
|
|
31
|
+
:max_events_per_lane,
|
|
32
|
+
:max_events,
|
|
33
|
+
:max_bytes_per_lane,
|
|
34
|
+
:max_bytes,
|
|
35
|
+
:max_response_bytes
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
def initialize(
|
|
39
|
+
max_lanes:,
|
|
40
|
+
max_events_per_lane:,
|
|
41
|
+
max_events:,
|
|
42
|
+
max_bytes_per_lane:,
|
|
43
|
+
max_bytes:,
|
|
44
|
+
max_response_bytes:
|
|
45
|
+
)
|
|
46
|
+
values = [max_lanes, max_events_per_lane, max_events, max_bytes_per_lane, max_bytes, max_response_bytes]
|
|
47
|
+
unless values.all? { |value| value.is_a?(Integer) && value.positive? }
|
|
48
|
+
raise ArgumentError, "Responses session limits must be positive integers."
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
@max_lanes, @max_events_per_lane, @max_events, @max_bytes_per_lane, @max_bytes, @max_response_bytes = values
|
|
52
|
+
freeze
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @api private
|
|
57
|
+
class SessionAccumulator
|
|
58
|
+
attr_reader :final_response, :error
|
|
59
|
+
|
|
60
|
+
def initialize(limit)
|
|
61
|
+
@limit = limit
|
|
62
|
+
@bytes = 0
|
|
63
|
+
@items = {}
|
|
64
|
+
@state = OpenAI::Helpers::Streaming::ResponseStreamState.new(text_format: nil, starting_after: 0)
|
|
65
|
+
@decoder = OpenAI::Helpers::Streaming::ResponseEventDecoder.new(model: OpenAI::Responses::ResponseStreamEvent)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def add(event, bytes)
|
|
69
|
+
type = event.type.to_s
|
|
70
|
+
if type == "response.created"
|
|
71
|
+
@bytes = 0
|
|
72
|
+
@items.clear
|
|
73
|
+
@final_response = nil
|
|
74
|
+
@error = nil
|
|
75
|
+
@state = OpenAI::Helpers::Streaming::ResponseStreamState.new(text_format: nil, starting_after: 0)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
if type == "error"
|
|
79
|
+
@error = RequestError.new(event)
|
|
80
|
+
clear
|
|
81
|
+
return
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
return if @error
|
|
85
|
+
unless %w[response.created response.output_item.done response.completed response.failed response.incomplete]
|
|
86
|
+
.include?(type)
|
|
87
|
+
return
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
@bytes += bytes
|
|
91
|
+
raise BufferError, "Response collection exceeded max_response_bytes." if @bytes > @limit
|
|
92
|
+
|
|
93
|
+
if type == "response.output_item.done"
|
|
94
|
+
# Retain wire data independently of the mutable event returned by receive.
|
|
95
|
+
completed_item = OpenAI::Internal::Type::BaseModel.recursively_to_h(event.item, convert: false)
|
|
96
|
+
@items[event.output_index] = JSON.parse(JSON.generate(completed_item), symbolize_names: true)
|
|
97
|
+
elsif %w[response.completed response.failed response.incomplete].include?(type)
|
|
98
|
+
data = OpenAI::Internal::Type::BaseModel.recursively_to_h(event, convert: false)
|
|
99
|
+
data = JSON.parse(JSON.generate(data), symbolize_names: true)
|
|
100
|
+
response = data.fetch(:response)
|
|
101
|
+
if response[:output].nil?
|
|
102
|
+
response = response.merge(output: @items.sort.map { |_index, item| item.to_h })
|
|
103
|
+
data = data.merge(response: response)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
decoded = @decoder.decode(data)
|
|
107
|
+
if type == "response.completed"
|
|
108
|
+
@state.handle_event(decoded)
|
|
109
|
+
@final_response = @state.completed_response
|
|
110
|
+
else
|
|
111
|
+
@final_response = decoded.response
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
clear
|
|
115
|
+
else
|
|
116
|
+
data = OpenAI::Internal::Type::BaseModel.recursively_to_h(event, convert: false)
|
|
117
|
+
@state.handle_event(@decoder.decode(data))
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
rescue StandardError => error
|
|
121
|
+
@error = error.is_a?(SessionError) ? error : SessionError.new("Could not collect the Responses final response.")
|
|
122
|
+
clear
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
private def clear
|
|
126
|
+
@state = nil
|
|
127
|
+
@items.clear
|
|
128
|
+
@bytes = 0
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# One routed consumer. Canceling its wait never cancels the socket reader.
|
|
133
|
+
class SessionLane
|
|
134
|
+
attr_reader :stream_id
|
|
135
|
+
|
|
136
|
+
# @api private
|
|
137
|
+
def initialize(session, stream_id, pending_steers)
|
|
138
|
+
@session = session
|
|
139
|
+
@stream_id = stream_id
|
|
140
|
+
@queue = []
|
|
141
|
+
@bytes = 0
|
|
142
|
+
@closed = false
|
|
143
|
+
@receiving = false
|
|
144
|
+
@in_flight = false
|
|
145
|
+
@pending_steers = pending_steers
|
|
146
|
+
@response_id = nil
|
|
147
|
+
@changed = Async::Condition.new
|
|
148
|
+
@accumulator = SessionAccumulator.new(session.limits.max_response_bytes)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def send_event(event)
|
|
152
|
+
@session.assert_owner!
|
|
153
|
+
raise @detached_error if @detached_error
|
|
154
|
+
raise SessionError, "The Responses lane is detached." if @closed
|
|
155
|
+
|
|
156
|
+
data = @session.encode_client_event(event)
|
|
157
|
+
type = data[:type]
|
|
158
|
+
if type.to_s == "response.create"
|
|
159
|
+
key = data.key?("stream_id") ? "stream_id" : :stream_id
|
|
160
|
+
if data.key?(key) && data[key] != @stream_id
|
|
161
|
+
raise ArgumentError, "The command stream_id does not match its lane."
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
data[key] = @stream_id unless @stream_id.nil?
|
|
165
|
+
queued_response = @queue.any? do |queued_event, _bytes|
|
|
166
|
+
queued_event.type.to_s == "response.created" && queued_event.to_h[:stream_id] == @stream_id
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
pending = @pending_steers[@response_id]
|
|
170
|
+
if @in_flight || queued_response || (pending && pending[:count].positive?)
|
|
171
|
+
raise SessionError, "Consume the current response before sending another create on this lane."
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
@accumulator = SessionAccumulator.new(@session.limits.max_response_bytes)
|
|
175
|
+
@in_flight = true
|
|
176
|
+
elsif type.to_s == "response.steer" &&
|
|
177
|
+
(steer_parent = data[:previous_response_id]).is_a?(String) &&
|
|
178
|
+
!steer_parent.empty?
|
|
179
|
+
pending = (@pending_steers[steer_parent] ||= {count: 0, outcomes: {}})
|
|
180
|
+
pending[:count] += 1
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
@session.send_event(data)
|
|
184
|
+
rescue OpenAI::Errors::ResponsesClientEventError
|
|
185
|
+
@in_flight = false if type.to_s == "response.create"
|
|
186
|
+
if type.to_s == "response.steer" && pending
|
|
187
|
+
pending[:count] -= 1
|
|
188
|
+
@pending_steers.delete(steer_parent) if pending[:count].zero? && pending[:outcomes].empty?
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
raise
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def receive
|
|
195
|
+
@session.assert_owner!
|
|
196
|
+
raise SessionError, "This Responses lane already has a consumer." if @receiving
|
|
197
|
+
|
|
198
|
+
@receiving = true
|
|
199
|
+
begin
|
|
200
|
+
loop do
|
|
201
|
+
raise @detached_error if @detached_error
|
|
202
|
+
raise SessionError, "The Responses lane is detached." if @closed
|
|
203
|
+
|
|
204
|
+
unless @queue.empty?
|
|
205
|
+
event, bytes, raw_command_sent = @queue.shift
|
|
206
|
+
@bytes -= bytes
|
|
207
|
+
@session.consumed(bytes)
|
|
208
|
+
if %w[response.steer.pending response.steer.failed].include?(event.type.to_s)
|
|
209
|
+
parent = event.steer.previous_response_id
|
|
210
|
+
pending = @pending_steers[parent]
|
|
211
|
+
id = event.steer.id
|
|
212
|
+
if pending
|
|
213
|
+
previously_pending = pending[:outcomes].delete(id)
|
|
214
|
+
if event.type.to_s == "response.steer.pending" && !id.nil?
|
|
215
|
+
pending[:outcomes][id] = true
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
unless previously_pending
|
|
219
|
+
pending[:count] -= 1
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
@pending_steers.delete(parent) if pending[:count].zero? && pending[:outcomes].empty?
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
# Unregistered named streams remain available for raw inspection,
|
|
226
|
+
# without changing the default lane's response state.
|
|
227
|
+
if event.to_h[:stream_id] == @stream_id
|
|
228
|
+
# Prior raw commands leave generic errors uncorrelated. Use the
|
|
229
|
+
# receipt-time snapshot, so later commands cannot change attribution.
|
|
230
|
+
if event.type.to_s == "error" &&
|
|
231
|
+
@stream_id.nil? &&
|
|
232
|
+
@in_flight &&
|
|
233
|
+
event.to_h[:sequence_number].nil? &&
|
|
234
|
+
raw_command_sent
|
|
235
|
+
discard(RequestError.new(event))
|
|
236
|
+
@session.detach(self)
|
|
237
|
+
return event
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
@accumulator.add(event, bytes)
|
|
241
|
+
if event.type.to_s == "response.created"
|
|
242
|
+
@in_flight = true
|
|
243
|
+
@pending_steers.delete(@response_id) if @response_id != event.response.id
|
|
244
|
+
@response_id = event.response.id.dup.freeze
|
|
245
|
+
elsif %w[response.completed response.failed response.incomplete error].include?(event.type.to_s)
|
|
246
|
+
@in_flight = false
|
|
247
|
+
@response_id = event.response.id.dup.freeze unless event.type.to_s == "error"
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
return event
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
@session.check_reader!
|
|
255
|
+
@changed.wait
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
ensure
|
|
259
|
+
@receiving = false
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def get_final_response
|
|
264
|
+
@session.assert_owner!
|
|
265
|
+
loop do
|
|
266
|
+
raise @accumulator.error if @accumulator.error
|
|
267
|
+
if (response = @accumulator.final_response)
|
|
268
|
+
@accumulator = SessionAccumulator.new(@session.limits.max_response_bytes)
|
|
269
|
+
return response
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
receive
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def close
|
|
277
|
+
@session.assert_owner!
|
|
278
|
+
@session.detach(self)
|
|
279
|
+
nil
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
# @api private
|
|
283
|
+
def enqueue(event, bytes, raw_command_sent = false)
|
|
284
|
+
return if @closed
|
|
285
|
+
|
|
286
|
+
limits = @session.limits
|
|
287
|
+
if @queue.length >= limits.max_events_per_lane || @bytes + bytes > limits.max_bytes_per_lane
|
|
288
|
+
raise BufferError, "The Responses lane exceeded its buffered event budget."
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
@queue << [event, bytes, raw_command_sent]
|
|
292
|
+
@bytes += bytes
|
|
293
|
+
@changed.signal
|
|
294
|
+
true
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# @api private
|
|
298
|
+
def discard(error = nil)
|
|
299
|
+
return if @closed
|
|
300
|
+
|
|
301
|
+
@closed = true
|
|
302
|
+
@detached_error = error
|
|
303
|
+
@queue.each { |_event, bytes| @session.consumed(bytes) }
|
|
304
|
+
@queue.clear
|
|
305
|
+
@bytes = 0
|
|
306
|
+
@accumulator = SessionAccumulator.new(@session.limits.max_response_bytes)
|
|
307
|
+
@changed.signal
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
# @api private
|
|
311
|
+
def wake = @changed.signal
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
# Owns one connection and one Async reader. Use only its lanes to receive.
|
|
315
|
+
class Session
|
|
316
|
+
attr_reader :limits, :default
|
|
317
|
+
|
|
318
|
+
def self.open(
|
|
319
|
+
client:,
|
|
320
|
+
limits:,
|
|
321
|
+
request_options: nil,
|
|
322
|
+
websocket_base_url: nil,
|
|
323
|
+
transport: nil,
|
|
324
|
+
transport_options: {}
|
|
325
|
+
)
|
|
326
|
+
raise ArgumentError, "A block is required to open a Responses session." unless block_given?
|
|
327
|
+
|
|
328
|
+
begin
|
|
329
|
+
require "async"
|
|
330
|
+
require "async/queue"
|
|
331
|
+
require "async/condition"
|
|
332
|
+
|
|
333
|
+
rescue LoadError
|
|
334
|
+
raise OpenAI::Errors::Error, "Responses sessions require the async gem.", cause: nil
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
Sync do |task|
|
|
338
|
+
session = new(
|
|
339
|
+
task: task,
|
|
340
|
+
client: client,
|
|
341
|
+
limits: limits,
|
|
342
|
+
request_options: request_options,
|
|
343
|
+
websocket_base_url: websocket_base_url,
|
|
344
|
+
transport: transport,
|
|
345
|
+
transport_options: transport_options
|
|
346
|
+
)
|
|
347
|
+
begin
|
|
348
|
+
session.start
|
|
349
|
+
yield(session)
|
|
350
|
+
ensure
|
|
351
|
+
pending_error = $ERROR_INFO
|
|
352
|
+
begin
|
|
353
|
+
session.close
|
|
354
|
+
rescue StandardError
|
|
355
|
+
raise if pending_error.nil?
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
# @api private
|
|
362
|
+
def initialize(task:, client:, limits:, request_options:, websocket_base_url:, transport:, transport_options:)
|
|
363
|
+
@task = task
|
|
364
|
+
@client = client
|
|
365
|
+
@limits = limits
|
|
366
|
+
@request_options = request_options
|
|
367
|
+
@websocket_base_url = websocket_base_url
|
|
368
|
+
@transport = transport
|
|
369
|
+
@transport_options = transport_options
|
|
370
|
+
@owner = Thread.current
|
|
371
|
+
@lanes = {}
|
|
372
|
+
@lane_ids = {}
|
|
373
|
+
# Steering targets a response ID, independently of the lane sending the command.
|
|
374
|
+
@pending_steers = {}
|
|
375
|
+
@events = 0
|
|
376
|
+
@bytes = 0
|
|
377
|
+
@closed = false
|
|
378
|
+
@default = lane(nil)
|
|
379
|
+
end
|
|
380
|
+
|
|
381
|
+
def lane(stream_id)
|
|
382
|
+
assert_owner!
|
|
383
|
+
raise SessionError, "The Responses session is closed." if @closed
|
|
384
|
+
|
|
385
|
+
unless stream_id.nil? || (stream_id.is_a?(String) && /\A[A-Za-z0-9_.-]{1,256}\z/.match?(stream_id))
|
|
386
|
+
raise ArgumentError, "Invalid Responses WebSocket stream ID."
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
stream_id = stream_id&.dup&.freeze
|
|
390
|
+
raise ArgumentError, "The Responses lane is already registered." if @lane_ids.key?(stream_id)
|
|
391
|
+
raise BufferError, "The Responses session exceeded max_lanes." if @lane_ids.length >= @limits.max_lanes
|
|
392
|
+
|
|
393
|
+
value = SessionLane.new(self, stream_id, @pending_steers)
|
|
394
|
+
@lane_ids[stream_id] = true
|
|
395
|
+
@lanes[stream_id] = value
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
# Replace the transport explicitly; old lane state is lost, never replayed.
|
|
399
|
+
# The restore callback registers new lanes and supplies application state.
|
|
400
|
+
def reconnect(restore:, client: @client, request_options: @request_options)
|
|
401
|
+
assert_owner!
|
|
402
|
+
raise SessionError, "The Responses session is closed." if @closed
|
|
403
|
+
raise SessionError, "The Responses session is already reconnecting." if @reconnecting
|
|
404
|
+
|
|
405
|
+
@reconnecting = true
|
|
406
|
+
restored = false
|
|
407
|
+
begin
|
|
408
|
+
@lanes.each_value { |value|
|
|
409
|
+
value.discard(
|
|
410
|
+
StateLostError.new("The Responses connection was replaced; restore application state explicitly.")
|
|
411
|
+
)
|
|
412
|
+
}
|
|
413
|
+
stop_reader
|
|
414
|
+
@lanes.clear
|
|
415
|
+
@lane_ids.clear
|
|
416
|
+
@pending_steers.clear
|
|
417
|
+
@default = lane(nil)
|
|
418
|
+
@client = client
|
|
419
|
+
@request_options = request_options
|
|
420
|
+
start
|
|
421
|
+
restore.call(self)
|
|
422
|
+
restored = true
|
|
423
|
+
self
|
|
424
|
+
ensure
|
|
425
|
+
close unless restored
|
|
426
|
+
@reconnecting = false
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
def close
|
|
431
|
+
assert_owner!
|
|
432
|
+
return if @closed
|
|
433
|
+
|
|
434
|
+
@closed = true
|
|
435
|
+
stop_reader
|
|
436
|
+
@lanes.each_value(&:discard)
|
|
437
|
+
@lanes.clear
|
|
438
|
+
@lane_ids.clear
|
|
439
|
+
@pending_steers.clear
|
|
440
|
+
nil
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
# @api private
|
|
444
|
+
def start
|
|
445
|
+
@ended = false
|
|
446
|
+
@error = nil
|
|
447
|
+
@raw_command_sent = false
|
|
448
|
+
generation = @generation = Object.new
|
|
449
|
+
ready = Async::Queue.new
|
|
450
|
+
opened = false
|
|
451
|
+
@reader = @task.async do
|
|
452
|
+
begin
|
|
453
|
+
@client
|
|
454
|
+
.responses
|
|
455
|
+
.connect(
|
|
456
|
+
request_options: @request_options,
|
|
457
|
+
websocket_base_url: @websocket_base_url,
|
|
458
|
+
transport: @transport,
|
|
459
|
+
transport_options: @transport_options
|
|
460
|
+
) do |connection|
|
|
461
|
+
@connection = connection
|
|
462
|
+
opened = true
|
|
463
|
+
ready.enqueue(true)
|
|
464
|
+
connection.each { |event| dispatch(event) }
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
rescue StandardError => error
|
|
468
|
+
@error = error if @generation.equal?(generation)
|
|
469
|
+
ensure
|
|
470
|
+
@ended = true if @generation.equal?(generation)
|
|
471
|
+
ready.enqueue(false) unless opened
|
|
472
|
+
@lanes.each_value(&:wake)
|
|
473
|
+
end
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
raise @error || SessionError.new("The Responses connection did not open.") unless ready.dequeue
|
|
477
|
+
nil
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
# @api private
|
|
481
|
+
def encode_client_event(event)
|
|
482
|
+
assert_owner!
|
|
483
|
+
@connection.encode_client_event(event)
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
# @api private
|
|
487
|
+
def send_event(event)
|
|
488
|
+
assert_owner!
|
|
489
|
+
check_reader!
|
|
490
|
+
prior_raw_command_sent = @raw_command_sent
|
|
491
|
+
@raw_command_sent = true unless event[:type].to_s == "response.create"
|
|
492
|
+
@connection.send_event(event)
|
|
493
|
+
rescue OpenAI::Errors::ResponsesClientEventError
|
|
494
|
+
@raw_command_sent = prior_raw_command_sent
|
|
495
|
+
raise
|
|
496
|
+
rescue OpenAI::Errors::ResponsesSendError => error
|
|
497
|
+
@error = error
|
|
498
|
+
stop_reader
|
|
499
|
+
raise
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
# @api private
|
|
503
|
+
def check_reader!
|
|
504
|
+
raise @error if @error
|
|
505
|
+
raise SessionError, "The Responses connection closed before another event arrived." if @closed || @ended
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
# @api private
|
|
509
|
+
def assert_owner!
|
|
510
|
+
raise SessionError, "Responses sessions are single-thread owned." unless Thread.current.equal?(@owner)
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
# @api private
|
|
514
|
+
def consumed(bytes)
|
|
515
|
+
@events -= 1
|
|
516
|
+
@bytes -= bytes
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
# @api private
|
|
520
|
+
def detach(value)
|
|
521
|
+
@lanes.delete(value.stream_id) if @lanes[value.stream_id].equal?(value)
|
|
522
|
+
value.discard
|
|
523
|
+
end
|
|
524
|
+
|
|
525
|
+
private def dispatch(event)
|
|
526
|
+
data = event.to_h
|
|
527
|
+
value = @lanes.fetch(data[:stream_id], @lanes[nil])
|
|
528
|
+
return unless value
|
|
529
|
+
|
|
530
|
+
bytes = JSON.generate(data).bytesize
|
|
531
|
+
if @events >= @limits.max_events || @bytes + bytes > @limits.max_bytes
|
|
532
|
+
raise BufferError, "The Responses session exceeded its buffered event budget."
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
@events += 1
|
|
536
|
+
@bytes += bytes
|
|
537
|
+
begin
|
|
538
|
+
consumed(bytes) unless value.enqueue(event, bytes, @raw_command_sent)
|
|
539
|
+
rescue StandardError
|
|
540
|
+
consumed(bytes)
|
|
541
|
+
raise
|
|
542
|
+
end
|
|
543
|
+
end
|
|
544
|
+
|
|
545
|
+
private def stop_reader
|
|
546
|
+
@reader&.stop
|
|
547
|
+
@reader&.wait
|
|
548
|
+
end
|
|
549
|
+
end
|
|
550
|
+
end
|
|
551
|
+
end
|
|
@@ -10,3 +10,4 @@ require_relative "responses_websocket/connection_manager"
|
|
|
10
10
|
require_relative "responses_websocket/transports/async_websocket"
|
|
11
11
|
require_relative "responses_websocket/client_extension"
|
|
12
12
|
require_relative "responses_websocket/resources/responses_extension"
|
|
13
|
+
require_relative "responses_websocket/session"
|
|
@@ -202,7 +202,7 @@ module OpenAI
|
|
|
202
202
|
|
|
203
203
|
value
|
|
204
204
|
in :scalar
|
|
205
|
-
value = value
|
|
205
|
+
value = Float(value) if node.value == Float && value.is_a?(Integer)
|
|
206
206
|
|
|
207
207
|
unless value.is_a?(node.value) && (node.value != Float || value.finite?)
|
|
208
208
|
fail_hydration(path, expected: node.value.name, actual: value)
|
|
@@ -343,7 +343,12 @@ module OpenAI
|
|
|
343
343
|
|
|
344
344
|
private def close_resources(connection, client, proxy_client, connection_aborted:, pending_error:)
|
|
345
345
|
cleanup_error = nil
|
|
346
|
-
resources = [client
|
|
346
|
+
resources = [client]
|
|
347
|
+
# These tunnels belong to this connection. A peer may keep its read side
|
|
348
|
+
# open after a failed TLS handshake, so retire them before draining the
|
|
349
|
+
# proxy pool instead of waiting indefinitely for a remote EOF.
|
|
350
|
+
resources.concat(proxy_client.pool.resources.keys) if proxy_client
|
|
351
|
+
resources << proxy_client
|
|
347
352
|
resources.unshift(connection) unless connection_aborted
|
|
348
353
|
resources.compact.each do |resource|
|
|
349
354
|
resource.close
|
|
@@ -85,7 +85,7 @@ module OpenAI
|
|
|
85
85
|
bounded = {**options, extra_headers: headers}
|
|
86
86
|
unless remaining.nil?
|
|
87
87
|
request_timeout = options[:timeout]
|
|
88
|
-
request_timeout = request_timeout.
|
|
88
|
+
request_timeout = Float(request_timeout).clamp(0..) unless request_timeout.nil?
|
|
89
89
|
bounded[:timeout] = [request_timeout, remaining].compact.min
|
|
90
90
|
|
|
91
91
|
# The transport applies `timeout` to every retry attempt independently.
|
|
@@ -147,7 +147,7 @@ module OpenAI
|
|
|
147
147
|
return invalid_duration!(name: name, allow_zero: allow_zero)
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
duration = value
|
|
150
|
+
duration = Float(value)
|
|
151
151
|
valid = duration.finite? && (allow_zero ? duration >= 0 : duration.positive?)
|
|
152
152
|
return duration if valid
|
|
153
153
|
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OpenAI
|
|
4
|
+
module Internal
|
|
5
|
+
# @generic Elem
|
|
6
|
+
#
|
|
7
|
+
# @example
|
|
8
|
+
# if token_page.next_page?
|
|
9
|
+
# token_page = token_page.next_page
|
|
10
|
+
# end
|
|
11
|
+
#
|
|
12
|
+
# @example
|
|
13
|
+
# token_page.auto_paging_each do |role|
|
|
14
|
+
# puts(role)
|
|
15
|
+
# end
|
|
16
|
+
class TokenPage
|
|
17
|
+
include OpenAI::Internal::Type::BasePage
|
|
18
|
+
|
|
19
|
+
# @return [Array<generic<Elem>>, nil]
|
|
20
|
+
attr_accessor :data
|
|
21
|
+
|
|
22
|
+
# @return [Boolean]
|
|
23
|
+
attr_accessor :has_more
|
|
24
|
+
|
|
25
|
+
# @return [String, nil]
|
|
26
|
+
attr_accessor :next_
|
|
27
|
+
|
|
28
|
+
# @return [Boolean]
|
|
29
|
+
def next_page?
|
|
30
|
+
has_more
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @raise [OpenAI::HTTP::Error]
|
|
34
|
+
# @return [self]
|
|
35
|
+
def next_page
|
|
36
|
+
unless next_page?
|
|
37
|
+
message = "No more pages available. Please check #next_page? before calling ##{__method__}"
|
|
38
|
+
raise message
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
req = OpenAI::Internal::Util.deep_merge(@req, {query: {page: next_}})
|
|
42
|
+
@client.request(req)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @param blk [Proc]
|
|
46
|
+
#
|
|
47
|
+
# @yieldparam [generic<Elem>]
|
|
48
|
+
def auto_paging_each(&blk)
|
|
49
|
+
unless block_given?
|
|
50
|
+
raise ArgumentError.new("A block must be given to ##{__method__}")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
page = self
|
|
54
|
+
loop do
|
|
55
|
+
page.data&.each(&blk)
|
|
56
|
+
|
|
57
|
+
break unless page.next_page?
|
|
58
|
+
page = page.next_page
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @api private
|
|
63
|
+
#
|
|
64
|
+
# @param client [OpenAI::Internal::Transport::BaseClient]
|
|
65
|
+
# @param req [Hash{Symbol=>Object}]
|
|
66
|
+
# @param response_metadata [OpenAI::ResponseMetadata]
|
|
67
|
+
# @param page_data [Hash{Symbol=>Object}]
|
|
68
|
+
def initialize(client:, req:, response_metadata:, page_data:)
|
|
69
|
+
super
|
|
70
|
+
|
|
71
|
+
case page_data
|
|
72
|
+
in {data: Array => data}
|
|
73
|
+
@data = data.map { OpenAI::Internal::Type::Converter.coerce(@model, _1) }
|
|
74
|
+
else
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
@has_more = page_data[:has_more]
|
|
78
|
+
@next_ = page_data[:next]
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# @api private
|
|
82
|
+
#
|
|
83
|
+
# @return [String]
|
|
84
|
+
def inspect
|
|
85
|
+
model = OpenAI::Internal::Type::Converter.inspect(@model, depth: 1)
|
|
86
|
+
|
|
87
|
+
"#<#{self.class}[#{model}]:0x#{object_id.to_s(16)} has_more=#{has_more.inspect} next_=#{next_.inspect}>"
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -466,7 +466,7 @@ module OpenAI
|
|
|
466
466
|
end
|
|
467
467
|
|
|
468
468
|
timeout = opts.fetch(:timeout, @timeout)
|
|
469
|
-
timeout = timeout.
|
|
469
|
+
timeout = Float(timeout).clamp(0..) unless timeout.nil?
|
|
470
470
|
unless headers.key?("x-stainless-timeout") || timeout.nil? || timeout.zero?
|
|
471
471
|
headers["x-stainless-timeout"] = timeout.to_s
|
|
472
472
|
end
|