openai 0.113.0 → 0.115.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 +54 -0
- data/README.md +17 -2
- data/docs/architecture/security-model.md +11 -16
- data/examples/responses/websocket_workflows.rb +78 -3
- data/lib/openai/auth/subject_token_providers/azure_managed_identity_token_provider.rb +10 -8
- data/lib/openai/auth/subject_token_providers/gcp_id_token_provider.rb +8 -7
- data/lib/openai/helpers/chat/tool_runner.rb +1 -1
- data/lib/openai/helpers/live/websocket.rb +31 -0
- data/lib/openai/helpers/realtime/connection.rb +33 -0
- data/lib/openai/helpers/realtime/connection_manager.rb +1 -0
- data/lib/openai/helpers/realtime/conversation_item_variant_resolver.rb +5 -0
- data/lib/openai/helpers/realtime/recovery.rb +5 -1
- data/lib/openai/helpers/realtime/translation.rb +5 -0
- data/lib/openai/helpers/realtime/transports/async_websocket.rb +19 -0
- data/lib/openai/helpers/responses_websocket/connection.rb +53 -15
- data/lib/openai/helpers/responses_websocket/connection_manager.rb +1 -0
- data/lib/openai/helpers/responses_websocket/connection_resources.rb +1 -1
- data/lib/openai/helpers/structured_output/response_parser.rb +1 -0
- data/lib/openai/helpers/structured_output.rb +58 -0
- data/lib/openai/helpers/websocket/connection_manager.rb +11 -0
- data/lib/openai/helpers/websocket/resource.rb +1 -0
- data/lib/openai/helpers/websocket/typed_connection.rb +1 -0
- data/lib/openai/internal/type/array_of.rb +1 -1
- data/lib/openai/internal/type/hash_of.rb +1 -1
- data/lib/openai/internal/type/request_parameters.rb +2 -1
- data/lib/openai/internal/type/union.rb +18 -6
- data/lib/openai/models/admin/organization/external_key.rb +169 -0
- data/lib/openai/models/admin/organization/external_key_create_params.rb +311 -0
- data/lib/openai/models/admin/organization/external_key_delete_params.rb +24 -0
- data/lib/openai/models/admin/organization/external_key_list_params.rb +69 -0
- data/lib/openai/models/admin/organization/external_key_retrieve_params.rb +24 -0
- data/lib/openai/models/admin/organization/external_key_validate_params.rb +24 -0
- data/lib/openai/models/admin/organization/external_key_validate_response.rb +20 -0
- data/lib/openai/models/audio/speech_model.rb +12 -0
- data/lib/openai/models/audio_model.rb +15 -0
- data/lib/openai/models/beta/agent.rb +49 -1
- data/lib/openai/models/beta/agent_create_params.rb +51 -1
- data/lib/openai/models/beta/agent_session.rb +75 -2
- data/lib/openai/models/beta/agent_update_params.rb +62 -1
- data/lib/openai/models/beta/agents/session_create_params.rb +94 -2
- data/lib/openai/models/beta/agents/session_list_params.rb +16 -1
- data/lib/openai/models/beta/agents/session_update_params.rb +50 -5
- data/lib/openai/models/beta/assistant_update_params.rb +18 -0
- data/lib/openai/models/beta/beta_response.rb +224 -1
- data/lib/openai/models/beta/beta_response_configuration_update_item.rb +64 -3
- data/lib/openai/models/beta/beta_response_configuration_update_item_param.rb +64 -4
- data/lib/openai/models/beta/beta_response_input_file.rb +9 -9
- data/lib/openai/models/beta/beta_response_input_file_content.rb +9 -9
- data/lib/openai/models/beta/beta_response_input_image.rb +9 -9
- data/lib/openai/models/beta/beta_response_input_image_content.rb +9 -9
- data/lib/openai/models/beta/beta_response_input_item.rb +2 -3
- data/lib/openai/models/beta/beta_response_input_text.rb +9 -9
- data/lib/openai/models/beta/beta_response_input_text_content.rb +9 -9
- data/lib/openai/models/beta/beta_response_item.rb +11 -11
- data/lib/openai/models/beta/beta_response_output_item.rb +9 -9
- data/lib/openai/models/beta/beta_response_tool_search_output_item_param.rb +6 -6
- data/lib/openai/models/beta/beta_responses_client_event.rb +20 -1
- data/lib/openai/models/beta/beta_tool.rb +6 -6
- data/lib/openai/models/beta/response_compact_params.rb +6 -0
- data/lib/openai/models/beta/response_create_params.rb +6 -0
- data/lib/openai/models/chat/chat_completion_content_part.rb +9 -9
- data/lib/openai/models/chat/chat_completion_content_part_image.rb +9 -9
- data/lib/openai/models/chat/chat_completion_content_part_input_audio.rb +9 -9
- data/lib/openai/models/chat/chat_completion_content_part_text.rb +9 -9
- data/lib/openai/models/chat_model.rb +6 -0
- data/lib/openai/models/conversations/computer_screenshot_content.rb +9 -9
- data/lib/openai/models/conversations/conversation_item.rb +2 -2
- data/lib/openai/models/image_edit_params.rb +46 -25
- data/lib/openai/models/live/fork_server_event.rb +43 -3
- data/lib/openai/models/live/server_event.rb +43 -3
- data/lib/openai/models/live/sideband_client_event.rb +40 -1
- data/lib/openai/models/live/sideband_server_event.rb +43 -3
- data/lib/openai/models/realtime/audio_transcription.rb +15 -0
- data/lib/openai/models/realtime/conversation_item_added.rb +2 -2
- data/lib/openai/models/realtime/conversation_item_create_event.rb +2 -2
- data/lib/openai/models/realtime/conversation_item_created_event.rb +2 -2
- data/lib/openai/models/realtime/conversation_item_done.rb +2 -2
- data/lib/openai/models/realtime/realtime_response.rb +2 -2
- data/lib/openai/models/realtime/realtime_response_create_params.rb +2 -2
- data/lib/openai/models/realtime/realtime_server_event.rb +2 -2
- data/lib/openai/models/realtime/realtime_session.rb +18 -0
- data/lib/openai/models/realtime/realtime_session_create_request.rb +18 -0
- data/lib/openai/models/realtime/realtime_session_create_response.rb +18 -0
- data/lib/openai/models/realtime/response_output_item_added_event.rb +2 -2
- data/lib/openai/models/realtime/response_output_item_done_event.rb +2 -2
- data/lib/openai/models/responses/response.rb +221 -1
- data/lib/openai/models/responses/response_compact_params.rb +6 -0
- data/lib/openai/models/responses/response_configuration_update_item.rb +50 -3
- data/lib/openai/models/responses/response_configuration_update_item_param.rb +50 -4
- data/lib/openai/models/responses/response_input_file.rb +9 -9
- data/lib/openai/models/responses/response_input_file_content.rb +9 -9
- data/lib/openai/models/responses/response_input_image.rb +9 -9
- data/lib/openai/models/responses/response_input_image_content.rb +9 -9
- data/lib/openai/models/responses/response_input_item.rb +2 -3
- data/lib/openai/models/responses/response_input_text.rb +9 -9
- data/lib/openai/models/responses/response_input_text_content.rb +9 -9
- data/lib/openai/models/responses/response_item.rb +2 -2
- data/lib/openai/models/responses/response_tool_search_output_item_param.rb +6 -6
- data/lib/openai/models/responses/responses_client_event.rb +14 -1
- data/lib/openai/models/responses/tool.rb +6 -6
- data/lib/openai/net_http_client.rb +6 -0
- data/lib/openai/providers/vertex.rb +0 -10
- data/lib/openai/resources/admin/organization/external_keys.rb +132 -0
- data/lib/openai/resources/admin/organization.rb +4 -0
- data/lib/openai/resources/audio/speech.rb +8 -0
- data/lib/openai/resources/audio/translations.rb +8 -0
- data/lib/openai/resources/beta/agents/sessions.rb +22 -6
- data/lib/openai/resources/beta/agents.rb +17 -2
- data/lib/openai/resources/images.rb +36 -18
- data/lib/openai/version.rb +1 -1
- data/lib/openai.rb +8 -0
- data/rbi/openai/helpers/live/websocket.rbi +1 -12
- data/rbi/openai/helpers/realtime/connection.rbi +5 -0
- data/rbi/openai/helpers/realtime/transports/async_websocket.rbi +5 -0
- data/rbi/openai/helpers/responses_websocket/connection.rbi +7 -2
- data/rbi/openai/helpers/structured_output.rbi +10 -0
- data/rbi/openai/internal/type/array_of.rbi +1 -1
- data/rbi/openai/internal/type/hash_of.rbi +1 -1
- data/rbi/openai/internal/type/union.rbi +5 -0
- data/rbi/openai/models/admin/organization/external_key.rbi +301 -0
- data/rbi/openai/models/admin/organization/external_key_create_params.rbi +532 -0
- data/rbi/openai/models/admin/organization/external_key_delete_params.rbi +57 -0
- data/rbi/openai/models/admin/organization/external_key_list_params.rbi +129 -0
- data/rbi/openai/models/admin/organization/external_key_retrieve_params.rbi +57 -0
- data/rbi/openai/models/admin/organization/external_key_validate_params.rbi +57 -0
- data/rbi/openai/models/admin/organization/external_key_validate_response.rbi +50 -0
- data/rbi/openai/models/beta/agent.rbi +103 -1
- data/rbi/openai/models/beta/agent_create_params.rbi +109 -0
- data/rbi/openai/models/beta/agent_session.rbi +136 -3
- data/rbi/openai/models/beta/agent_update_params.rbi +120 -0
- data/rbi/openai/models/beta/agents/session_create_params.rbi +153 -0
- data/rbi/openai/models/beta/agents/session_list_params.rbi +19 -0
- data/rbi/openai/models/beta/agents/session_update_params.rbi +94 -6
- data/rbi/openai/models/beta/beta_response.rbi +394 -0
- data/rbi/openai/models/beta/beta_response_configuration_update_item.rbi +113 -3
- data/rbi/openai/models/beta/beta_response_configuration_update_item_param.rbi +125 -4
- data/rbi/openai/models/beta/beta_response_input_file.rbi +9 -9
- data/rbi/openai/models/beta/beta_response_input_file_content.rbi +9 -9
- data/rbi/openai/models/beta/beta_response_input_image.rbi +9 -9
- data/rbi/openai/models/beta/beta_response_input_image_content.rbi +9 -9
- data/rbi/openai/models/beta/beta_response_input_text.rbi +9 -9
- data/rbi/openai/models/beta/beta_response_input_text_content.rbi +9 -9
- data/rbi/openai/models/beta/beta_response_item.rbi +9 -9
- data/rbi/openai/models/beta/beta_response_output_item.rbi +9 -9
- data/rbi/openai/models/beta/beta_response_tool_search_output_item_param.rbi +6 -6
- data/rbi/openai/models/beta/beta_responses_client_event.rbi +17 -0
- data/rbi/openai/models/beta/beta_tool.rbi +6 -6
- data/rbi/openai/models/chat/chat_completion_content_part.rbi +9 -9
- data/rbi/openai/models/chat/chat_completion_content_part_image.rbi +9 -9
- data/rbi/openai/models/chat/chat_completion_content_part_input_audio.rbi +9 -9
- data/rbi/openai/models/chat/chat_completion_content_part_text.rbi +9 -9
- data/rbi/openai/models/conversations/computer_screenshot_content.rbi +9 -9
- data/rbi/openai/models/decision_create_params.rbi +4 -1
- data/rbi/openai/models/image_edit_params.rbi +49 -24
- data/rbi/openai/models/live/fork_server_event.rbi +65 -1
- data/rbi/openai/models/live/server_event.rbi +65 -1
- data/rbi/openai/models/live/sideband_client_event.rbi +60 -0
- data/rbi/openai/models/live/sideband_server_event.rbi +65 -1
- data/rbi/openai/models/realtime/conversation_item_added.rbi +6 -3
- data/rbi/openai/models/realtime/conversation_item_create_event.rbi +6 -3
- data/rbi/openai/models/realtime/conversation_item_created_event.rbi +6 -3
- data/rbi/openai/models/realtime/conversation_item_done.rbi +6 -3
- data/rbi/openai/models/realtime/realtime_response.rbi +8 -4
- data/rbi/openai/models/realtime/realtime_response_create_params.rbi +8 -4
- data/rbi/openai/models/realtime/realtime_server_event.rbi +6 -3
- data/rbi/openai/models/realtime/response_output_item_added_event.rbi +6 -3
- data/rbi/openai/models/realtime/response_output_item_done_event.rbi +6 -3
- data/rbi/openai/models/responses/response.rbi +394 -0
- data/rbi/openai/models/responses/response_configuration_update_item.rbi +76 -3
- data/rbi/openai/models/responses/response_configuration_update_item_param.rbi +74 -4
- data/rbi/openai/models/responses/response_input_file.rbi +9 -9
- data/rbi/openai/models/responses/response_input_file_content.rbi +9 -9
- data/rbi/openai/models/responses/response_input_image.rbi +9 -9
- data/rbi/openai/models/responses/response_input_image_content.rbi +9 -9
- data/rbi/openai/models/responses/response_input_text.rbi +9 -9
- data/rbi/openai/models/responses/response_input_text_content.rbi +9 -9
- data/rbi/openai/models/responses/response_tool_search_output_item_param.rbi +6 -6
- data/rbi/openai/models/responses/responses_client_event.rbi +17 -0
- data/rbi/openai/models/responses/tool.rbi +6 -6
- data/rbi/openai/net_http_client.rbi +5 -0
- data/rbi/openai/resources/admin/organization/external_keys.rbi +86 -0
- data/rbi/openai/resources/admin/organization.rbi +3 -0
- data/rbi/openai/resources/audio/speech.rbi +8 -0
- data/rbi/openai/resources/audio/translations.rbi +6 -0
- data/rbi/openai/resources/beta/agents/sessions.rbi +18 -2
- data/rbi/openai/resources/beta/agents.rbi +15 -0
- data/rbi/openai/resources/images.rbi +34 -16
- data/rbi/openai/resources/responses.rbi +2 -0
- data/realtime.md +6 -0
- data/responses-websocket.md +53 -0
- data/sig/openai/helpers/live/websocket.rbs +1 -9
- data/sig/openai/helpers/realtime/connection.rbs +3 -0
- data/sig/openai/helpers/realtime/transports/async_websocket.rbs +3 -0
- data/sig/openai/helpers/responses_websocket/connection.rbs +7 -1
- data/sig/openai/helpers/structured_output.rbs +9 -0
- data/sig/openai/internal/type/union.rbs +4 -0
- data/sig/openai/models/admin/organization/external_key.rbs +186 -0
- data/sig/openai/models/admin/organization/external_key_create_params.rbs +423 -0
- data/sig/openai/models/admin/organization/external_key_delete_params.rbs +27 -0
- data/sig/openai/models/admin/organization/external_key_list_params.rbs +81 -0
- data/sig/openai/models/admin/organization/external_key_retrieve_params.rbs +27 -0
- data/sig/openai/models/admin/organization/external_key_validate_params.rbs +27 -0
- data/sig/openai/models/admin/organization/external_key_validate_response.rbs +17 -0
- data/sig/openai/models/admin/organization/external_storage_create_params.rbs +72 -2
- data/sig/openai/models/audio/speech_create_params.rbs +15 -2
- data/sig/openai/models/audio/transcription_create_params.rbs +30 -2
- data/sig/openai/models/audio/voice_create_params.rbs +47 -2
- data/sig/openai/models/beta/agent.rbs +54 -2
- data/sig/openai/models/beta/agent_create_params.rbs +54 -0
- data/sig/openai/models/beta/agent_session.rbs +82 -3
- data/sig/openai/models/beta/agent_update_params.rbs +64 -0
- data/sig/openai/models/beta/agents/session_create_params.rbs +91 -0
- data/sig/openai/models/beta/agents/session_list_params.rbs +20 -0
- data/sig/openai/models/beta/agents/session_update_params.rbs +48 -6
- data/sig/openai/models/beta/assistant_create_params.rbs +5 -2
- data/sig/openai/models/beta/beta_response.rbs +223 -0
- data/sig/openai/models/beta/beta_response_configuration_update_item.rbs +58 -2
- data/sig/openai/models/beta/beta_response_configuration_update_item_param.rbs +58 -2
- data/sig/openai/models/beta/beta_response_input_file.rbs +9 -9
- data/sig/openai/models/beta/beta_response_input_file_content.rbs +6 -6
- data/sig/openai/models/beta/beta_response_input_image.rbs +9 -9
- data/sig/openai/models/beta/beta_response_input_image_content.rbs +6 -6
- data/sig/openai/models/beta/beta_response_input_text.rbs +9 -9
- data/sig/openai/models/beta/beta_response_input_text_content.rbs +6 -6
- data/sig/openai/models/beta/beta_response_item.rbs +9 -9
- data/sig/openai/models/beta/beta_response_output_item.rbs +9 -9
- data/sig/openai/models/beta/beta_response_tool_search_output_item_param.rbs +4 -4
- data/sig/openai/models/beta/beta_responses_client_event.rbs +17 -0
- data/sig/openai/models/beta/beta_tool.rbs +4 -4
- data/sig/openai/models/beta/response_create_params.rbs +5 -2
- data/sig/openai/models/beta/responses/input_token_count_params.rbs +10 -2
- data/sig/openai/models/beta/thread_create_and_run_params.rbs +11 -5
- data/sig/openai/models/beta/thread_create_params.rbs +11 -5
- data/sig/openai/models/beta/threads/message_create_params.rbs +6 -3
- data/sig/openai/models/beta/threads/run_create_params.rbs +6 -3
- data/sig/openai/models/chat/chat_completion_content_part.rbs +9 -9
- data/sig/openai/models/chat/chat_completion_content_part_image.rbs +9 -9
- data/sig/openai/models/chat/chat_completion_content_part_input_audio.rbs +9 -9
- data/sig/openai/models/chat/chat_completion_content_part_text.rbs +9 -9
- data/sig/openai/models/conversations/computer_screenshot_content.rbs +9 -9
- data/sig/openai/models/decision_create_params.rbs +27 -2
- data/sig/openai/models/eval_create_params.rbs +25 -4
- data/sig/openai/models/evals/run_create_params.rbs +52 -8
- data/sig/openai/models/image_edit_params.rbs +47 -16
- data/sig/openai/models/live/fork_server_event.rbs +39 -0
- data/sig/openai/models/live/server_event.rbs +39 -0
- data/sig/openai/models/live/session_accept_params.rbs +39 -2
- data/sig/openai/models/live/sideband_client_event.rbs +32 -0
- data/sig/openai/models/live/sideband_server_event.rbs +39 -0
- data/sig/openai/models/realtime/conversation_item.rbs +1 -0
- data/sig/openai/models/responses/input_token_count_params.rbs +10 -2
- data/sig/openai/models/responses/response.rbs +223 -0
- data/sig/openai/models/responses/response_configuration_update_item.rbs +45 -2
- data/sig/openai/models/responses/response_configuration_update_item_param.rbs +45 -2
- data/sig/openai/models/responses/response_create_params.rbs +5 -2
- data/sig/openai/models/responses/response_input_file.rbs +9 -9
- data/sig/openai/models/responses/response_input_file_content.rbs +6 -6
- data/sig/openai/models/responses/response_input_image.rbs +9 -9
- data/sig/openai/models/responses/response_input_image_content.rbs +6 -6
- data/sig/openai/models/responses/response_input_text.rbs +9 -9
- data/sig/openai/models/responses/response_input_text_content.rbs +6 -6
- data/sig/openai/models/responses/response_tool_search_output_item_param.rbs +4 -4
- data/sig/openai/models/responses/responses_client_event.rbs +17 -0
- data/sig/openai/models/responses/tool.rbs +4 -4
- data/sig/openai/models/video_edit_params.rbs +11 -2
- data/sig/openai/models/video_extend_params.rbs +11 -2
- data/sig/openai/net_http_client.rbs +3 -0
- data/sig/openai/resources/admin/organization/external_keys.rbs +70 -0
- data/sig/openai/resources/admin/organization/external_storage.rbs +23 -1
- data/sig/openai/resources/admin/organization.rbs +2 -0
- data/sig/openai/resources/audio/speech.rbs +2 -1
- data/sig/openai/resources/audio/transcriptions.rbs +14 -2
- data/sig/openai/resources/audio/voices.rbs +14 -1
- data/sig/openai/resources/beta/agents/sessions.rbs +4 -0
- data/sig/openai/resources/beta/agents.rbs +4 -0
- data/sig/openai/resources/beta/responses/input_tokens.rbs +2 -1
- data/sig/openai/resources/beta/responses.rbs +4 -2
- data/sig/openai/resources/decisions.rbs +7 -1
- data/sig/openai/resources/images.rbs +2 -0
- data/sig/openai/resources/responses/input_tokens.rbs +2 -1
- data/sig/openai/resources/responses.rbs +5 -2
- data/sig/openai/resources/videos.rbs +2 -2
- metadata +25 -1
|
@@ -48,11 +48,20 @@ module OpenAI
|
|
|
48
48
|
#
|
|
49
49
|
# @return [nil]
|
|
50
50
|
def send_event(event)
|
|
51
|
+
send_client_event(event)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @api private
|
|
55
|
+
def send_response_create(event)
|
|
56
|
+
send_client_event(event, response_create: true)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private def send_client_event(event, response_create: false)
|
|
51
60
|
assert_owner!
|
|
52
61
|
raise connection_error("Cannot send on a closed Responses WebSocket.") if poisoned? || closed?
|
|
53
62
|
|
|
54
63
|
encoded = begin
|
|
55
|
-
generate_json(encode_client_event(event))
|
|
64
|
+
generate_json(encode_client_event(event, response_create: response_create))
|
|
56
65
|
rescue SystemStackError
|
|
57
66
|
raise OpenAI::Errors::ResponsesClientEventError.new, cause: nil
|
|
58
67
|
end
|
|
@@ -162,9 +171,12 @@ module OpenAI
|
|
|
162
171
|
end
|
|
163
172
|
|
|
164
173
|
# @api private
|
|
165
|
-
def encode_client_event(event)
|
|
166
|
-
|
|
167
|
-
|
|
174
|
+
def encode_client_event(event, response_create: false)
|
|
175
|
+
create_type = OpenAI::Responses::ResponsesClientEvent::ResponseCreate if response_create
|
|
176
|
+
validate_event_tree!(event, target: create_type)
|
|
177
|
+
payload = if response_create
|
|
178
|
+
OpenAI::Internal::Type::Converter.dump(create_type, event)
|
|
179
|
+
elsif event.is_a?(Hash)
|
|
168
180
|
OpenAI::Internal::Type::Unknown.dump(event, state: {can_retry: true})
|
|
169
181
|
else
|
|
170
182
|
OpenAI::Internal::Type::Converter.dump(OpenAI::Responses::ResponsesClientEvent, event)
|
|
@@ -172,7 +184,7 @@ module OpenAI
|
|
|
172
184
|
|
|
173
185
|
raise OpenAI::Errors::ResponsesClientEventError.new unless payload.is_a?(Hash)
|
|
174
186
|
|
|
175
|
-
normalize_event_keys(payload)
|
|
187
|
+
OpenAI::Helpers::StructuredOutput.prepare_configuration_updates!(normalize_event_keys(payload))
|
|
176
188
|
rescue OpenAI::Errors::ResponsesClientEventError
|
|
177
189
|
raise
|
|
178
190
|
rescue StandardError
|
|
@@ -216,42 +228,68 @@ module OpenAI
|
|
|
216
228
|
raise connection_error("Responses WebSocket connections are single-owner.")
|
|
217
229
|
end
|
|
218
230
|
|
|
219
|
-
private def validate_event_tree!(value)
|
|
231
|
+
private def validate_event_tree!(value, target: nil)
|
|
220
232
|
active = {}.compare_by_identity
|
|
221
|
-
pending = [[value, false]]
|
|
233
|
+
pending = [[value, false, target]]
|
|
222
234
|
until pending.empty?
|
|
223
|
-
value, exiting = pending.pop
|
|
235
|
+
value, exiting, target = pending.pop
|
|
224
236
|
if exiting
|
|
225
237
|
active.delete(value)
|
|
226
238
|
next
|
|
227
239
|
end
|
|
228
240
|
|
|
241
|
+
# Use the serializer's selected type, so unknown extension hashes keep their
|
|
242
|
+
# wire keys even when they resemble Ruby aliases in another model.
|
|
243
|
+
while target.is_a?(OpenAI::Internal::Type::Union)
|
|
244
|
+
target = target.variant_for_dump(value)
|
|
245
|
+
end
|
|
246
|
+
|
|
229
247
|
children = case value
|
|
230
248
|
when OpenAI::Internal::Type::BaseModel
|
|
231
249
|
data = value.to_h
|
|
232
250
|
reject_duplicate_serialized_model_keys!(value.class, data)
|
|
233
|
-
|
|
251
|
+
unless target.is_a?(Class) && target <= OpenAI::Internal::Type::BaseModel
|
|
252
|
+
target = value.class
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
[[data, target]]
|
|
234
256
|
when Hash
|
|
235
257
|
reject_duplicate_semantic_keys!(value)
|
|
236
|
-
|
|
258
|
+
if target.is_a?(Class) && target <= OpenAI::Internal::Type::BaseModel
|
|
259
|
+
reject_duplicate_serialized_model_keys!(target, value, skip_coerce: true)
|
|
260
|
+
value.map do |key, child|
|
|
261
|
+
name = key.is_a?(String) ? key.to_sym : key
|
|
262
|
+
field = target.known_fields[name]
|
|
263
|
+
field = nil if field && field.fetch(:mode) == :coerce
|
|
264
|
+
[child, field && field.fetch(:type_fn).call]
|
|
265
|
+
end
|
|
266
|
+
elsif target.is_a?(OpenAI::Internal::Type::HashOf)
|
|
267
|
+
item_type = target.item_type
|
|
268
|
+
value.values.map { [_1, item_type] }
|
|
269
|
+
else
|
|
270
|
+
value.values.map { [_1, nil] }
|
|
271
|
+
end
|
|
272
|
+
|
|
237
273
|
when Array
|
|
238
|
-
|
|
274
|
+
item_type = target.is_a?(OpenAI::Internal::Type::ArrayOf) ? target.item_type : nil
|
|
275
|
+
value.map { [_1, item_type] }
|
|
239
276
|
else
|
|
240
277
|
next
|
|
241
278
|
end
|
|
242
279
|
|
|
243
280
|
guard_cycle!(value, active)
|
|
244
|
-
pending << [value, true]
|
|
245
|
-
children.reverse_each { |child| pending << [child, false] }
|
|
281
|
+
pending << [value, true, nil]
|
|
282
|
+
children.reverse_each { |child, child_type| pending << [child, false, child_type] }
|
|
246
283
|
end
|
|
247
284
|
|
|
248
285
|
nil
|
|
249
286
|
end
|
|
250
287
|
|
|
251
|
-
private def reject_duplicate_serialized_model_keys!(model, data)
|
|
252
|
-
serialized_keys = data.keys.
|
|
288
|
+
private def reject_duplicate_serialized_model_keys!(model, data, skip_coerce: false)
|
|
289
|
+
serialized_keys = data.keys.filter_map do |key|
|
|
253
290
|
name = key.is_a?(String) ? key.to_sym : key
|
|
254
291
|
field = model.known_fields[name]
|
|
292
|
+
next if skip_coerce && field && field.fetch(:mode) == :coerce
|
|
255
293
|
field ? field.fetch(:api_name) : name
|
|
256
294
|
end
|
|
257
295
|
|
|
@@ -14,7 +14,7 @@ module OpenAI
|
|
|
14
14
|
# @return [nil]
|
|
15
15
|
def create(**params)
|
|
16
16
|
event_params = params.reject { |key, _value| key == :type || key == "type" }
|
|
17
|
-
@connection.
|
|
17
|
+
@connection.send_response_create(**event_params, type: :"response.create")
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
end
|
|
@@ -11,6 +11,64 @@ module OpenAI
|
|
|
11
11
|
#
|
|
12
12
|
# Supported types: {NilClass} {String} {Symbol} {Integer} {Float} {OpenAI::Boolean}, {OpenAI::EnumOf}, {OpenAI::UnionOf}, {OpenAI::ArrayOf}, {OpenAI::BaseModel}
|
|
13
13
|
module StructuredOutput
|
|
14
|
+
# Carries a visible format update's local parser without adding a wire field.
|
|
15
|
+
# A nil model means the update explicitly cleared typed parsing.
|
|
16
|
+
# @api private
|
|
17
|
+
module RequestWithFormatUpdate
|
|
18
|
+
attr_accessor :text_model
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private_constant :RequestWithFormatUpdate
|
|
22
|
+
|
|
23
|
+
# Convert schemas in input items after the SDK has copied the request or event.
|
|
24
|
+
#
|
|
25
|
+
# @api private
|
|
26
|
+
def self.prepare_configuration_updates!(request)
|
|
27
|
+
input = request[:input] || request["input"]
|
|
28
|
+
items = request[:items] || request["items"]
|
|
29
|
+
if input.is_a?(Array)
|
|
30
|
+
input.each do |item|
|
|
31
|
+
prepare_configuration_update!(item) do |model|
|
|
32
|
+
request.extend(RequestWithFormatUpdate) unless request.is_a?(RequestWithFormatUpdate)
|
|
33
|
+
request.text_model = model
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
items.each { |item| prepare_configuration_update!(item) } if items.is_a?(Array)
|
|
39
|
+
prepare_configuration_update!(request[:item] || request["item"])
|
|
40
|
+
request
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.prepare_configuration_update!(item)
|
|
44
|
+
return unless item.is_a?(Hash)
|
|
45
|
+
type = item[:type] || item["type"]
|
|
46
|
+
return unless type == :configuration_update || type == "configuration_update"
|
|
47
|
+
|
|
48
|
+
text = item[:text] || item["text"]
|
|
49
|
+
return unless text.is_a?(Hash)
|
|
50
|
+
unless text.key?(:format) || text.key?("format")
|
|
51
|
+
key = text.key?(:format_) ? :format_ : "format_"
|
|
52
|
+
text[:format] = text.delete(key) if text.key?(key)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
format = text[:format] || text["format"]
|
|
56
|
+
return unless format.is_a?(Hash)
|
|
57
|
+
type = format[:type] || format["type"]
|
|
58
|
+
model = nil
|
|
59
|
+
if type == :json_schema || type == "json_schema"
|
|
60
|
+
key = format.key?(:schema) ? :schema : "schema"
|
|
61
|
+
schema = format[key]
|
|
62
|
+
if schema.is_a?(JsonSchemaConverter)
|
|
63
|
+
model = schema
|
|
64
|
+
format[key] = JsonSchemaConverter.to_json_schema(schema)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
yield model if block_given?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
private_class_method :prepare_configuration_update!
|
|
14
72
|
end
|
|
15
73
|
end
|
|
16
74
|
end
|
|
@@ -20,6 +20,7 @@ module OpenAI
|
|
|
20
20
|
|
|
21
21
|
# @api private
|
|
22
22
|
def initialize(
|
|
23
|
+
client:,
|
|
23
24
|
transport:,
|
|
24
25
|
transport_options:,
|
|
25
26
|
default_transport:,
|
|
@@ -32,6 +33,7 @@ module OpenAI
|
|
|
32
33
|
reserved_options_error_message: nil,
|
|
33
34
|
connection_options: {}
|
|
34
35
|
)
|
|
36
|
+
@client = client
|
|
35
37
|
@transport = transport
|
|
36
38
|
@default_transport = default_transport
|
|
37
39
|
@connection_class = connection_class
|
|
@@ -52,6 +54,15 @@ module OpenAI
|
|
|
52
54
|
transport = @transport || @default_transport.call
|
|
53
55
|
raise ArgumentError, @transport_error_message unless transport.respond_to?(:open)
|
|
54
56
|
|
|
57
|
+
requester = @client.requester
|
|
58
|
+
unless @transport || (requester.instance_of?(OpenAI::NetHTTPClient) && requester.default_configuration?)
|
|
59
|
+
raise(
|
|
60
|
+
ArgumentError,
|
|
61
|
+
"This HTTP transport's connection policy cannot be used by the default WebSocket " \
|
|
62
|
+
"transport. Pass a compatible WebSocket transport with its own connection settings."
|
|
63
|
+
)
|
|
64
|
+
end
|
|
65
|
+
|
|
55
66
|
@request.call do |request, mark_handshake_completed|
|
|
56
67
|
block_error = nil
|
|
57
68
|
transport
|
|
@@ -38,6 +38,7 @@ module OpenAI
|
|
|
38
38
|
raise ArgumentError, client_event_error_message
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
OpenAI::Helpers::StructuredOutput.prepare_configuration_updates!(payload) if @client_event
|
|
41
42
|
payload = coerce_client_event(payload) if @client_event
|
|
42
43
|
payload = OpenAI::Internal::Type::Converter.dump(@client_event, payload) if @client_event
|
|
43
44
|
validate_event_tree!(payload, json_only: true)
|
|
@@ -30,7 +30,8 @@ module OpenAI
|
|
|
30
30
|
in Hash
|
|
31
31
|
options = OpenAI::Internal::Util.coerce_hash!(dumped[:request_options]).to_h
|
|
32
32
|
request_options = state.fetch(:can_retry) ? options : {**options, max_retries: 0}
|
|
33
|
-
|
|
33
|
+
body = OpenAI::Helpers::StructuredOutput.prepare_configuration_updates!(dumped.except(:request_options))
|
|
34
|
+
[body, request_options]
|
|
34
35
|
else
|
|
35
36
|
[dumped, nil]
|
|
36
37
|
end
|
|
@@ -216,6 +216,23 @@ module OpenAI
|
|
|
216
216
|
state[:strictness] = strictness
|
|
217
217
|
end
|
|
218
218
|
|
|
219
|
+
# @api private
|
|
220
|
+
#
|
|
221
|
+
# @param value [Object]
|
|
222
|
+
#
|
|
223
|
+
# @return [OpenAI::Internal::Type::Converter, Class, nil]
|
|
224
|
+
def variant_for_dump(value)
|
|
225
|
+
target = resolve_variant(value)
|
|
226
|
+
return target if target
|
|
227
|
+
|
|
228
|
+
known_variants.each do
|
|
229
|
+
target = _2.call
|
|
230
|
+
return target if target === value
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
nil
|
|
234
|
+
end
|
|
235
|
+
|
|
219
236
|
# @api private
|
|
220
237
|
#
|
|
221
238
|
# @param value [Object]
|
|
@@ -226,15 +243,10 @@ module OpenAI
|
|
|
226
243
|
#
|
|
227
244
|
# @return [Object]
|
|
228
245
|
def dump(value, state:)
|
|
229
|
-
if (target =
|
|
246
|
+
if (target = variant_for_dump(value))
|
|
230
247
|
return OpenAI::Internal::Type::Converter.dump(target, value, state: state)
|
|
231
248
|
end
|
|
232
249
|
|
|
233
|
-
known_variants.each do
|
|
234
|
-
target = _2.call
|
|
235
|
-
return OpenAI::Internal::Type::Converter.dump(target, value, state: state) if target === value
|
|
236
|
-
end
|
|
237
|
-
|
|
238
250
|
super
|
|
239
251
|
end
|
|
240
252
|
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OpenAI
|
|
4
|
+
module Models
|
|
5
|
+
module Admin
|
|
6
|
+
module Organization
|
|
7
|
+
# @see OpenAI::Resources::Admin::Organization::ExternalKeys#create
|
|
8
|
+
class ExternalKey < OpenAI::Internal::Type::BaseModel
|
|
9
|
+
# @!attribute id
|
|
10
|
+
#
|
|
11
|
+
# @return [String]
|
|
12
|
+
required :id, String
|
|
13
|
+
|
|
14
|
+
# @!attribute api_project_ids
|
|
15
|
+
#
|
|
16
|
+
# @return [Array<String>]
|
|
17
|
+
required :api_project_ids, OpenAI::Internal::Type::ArrayOf[String]
|
|
18
|
+
|
|
19
|
+
# @!attribute created_at
|
|
20
|
+
#
|
|
21
|
+
# @return [Integer]
|
|
22
|
+
required :created_at, Integer
|
|
23
|
+
|
|
24
|
+
# @!attribute name
|
|
25
|
+
#
|
|
26
|
+
# @return [String]
|
|
27
|
+
required :name, String
|
|
28
|
+
|
|
29
|
+
# @!attribute object
|
|
30
|
+
#
|
|
31
|
+
# @return [String]
|
|
32
|
+
required :object, String
|
|
33
|
+
|
|
34
|
+
# @!attribute type
|
|
35
|
+
#
|
|
36
|
+
# @return [String]
|
|
37
|
+
required :type, String
|
|
38
|
+
|
|
39
|
+
# @!attribute workspace_id
|
|
40
|
+
#
|
|
41
|
+
# @return [String]
|
|
42
|
+
required :workspace_id, String
|
|
43
|
+
|
|
44
|
+
# @!attribute audience
|
|
45
|
+
#
|
|
46
|
+
# @return [String, nil]
|
|
47
|
+
optional :audience, String
|
|
48
|
+
|
|
49
|
+
# @!attribute external_id
|
|
50
|
+
#
|
|
51
|
+
# @return [String, nil]
|
|
52
|
+
optional :external_id, String
|
|
53
|
+
|
|
54
|
+
# @!attribute key_name
|
|
55
|
+
#
|
|
56
|
+
# @return [String, nil]
|
|
57
|
+
optional :key_name, String
|
|
58
|
+
|
|
59
|
+
# @!attribute key_version
|
|
60
|
+
#
|
|
61
|
+
# @return [String, nil]
|
|
62
|
+
optional :key_version, String
|
|
63
|
+
|
|
64
|
+
# @!attribute kms_arn
|
|
65
|
+
#
|
|
66
|
+
# @return [String, nil]
|
|
67
|
+
optional :kms_arn, String
|
|
68
|
+
|
|
69
|
+
# @!attribute kms_key_location
|
|
70
|
+
#
|
|
71
|
+
# @return [String, nil]
|
|
72
|
+
optional :kms_key_location, String
|
|
73
|
+
|
|
74
|
+
# @!attribute kms_key_name
|
|
75
|
+
#
|
|
76
|
+
# @return [String, nil]
|
|
77
|
+
optional :kms_key_name, String
|
|
78
|
+
|
|
79
|
+
# @!attribute kms_key_ring_name
|
|
80
|
+
#
|
|
81
|
+
# @return [String, nil]
|
|
82
|
+
optional :kms_key_ring_name, String
|
|
83
|
+
|
|
84
|
+
# @!attribute kms_key_version
|
|
85
|
+
#
|
|
86
|
+
# @return [String, nil]
|
|
87
|
+
optional :kms_key_version, String
|
|
88
|
+
|
|
89
|
+
# @!attribute kms_project_id
|
|
90
|
+
#
|
|
91
|
+
# @return [String, nil]
|
|
92
|
+
optional :kms_project_id, String
|
|
93
|
+
|
|
94
|
+
# @!attribute purpose
|
|
95
|
+
#
|
|
96
|
+
# @return [Symbol, OpenAI::Models::Admin::Organization::ExternalKey::Purpose, nil]
|
|
97
|
+
optional :purpose, enum: -> { OpenAI::Admin::Organization::ExternalKey::Purpose }
|
|
98
|
+
|
|
99
|
+
# @!attribute role_arn
|
|
100
|
+
#
|
|
101
|
+
# @return [String, nil]
|
|
102
|
+
optional :role_arn, String
|
|
103
|
+
|
|
104
|
+
# @!attribute tenant_id
|
|
105
|
+
#
|
|
106
|
+
# @return [String, nil]
|
|
107
|
+
optional :tenant_id, String
|
|
108
|
+
|
|
109
|
+
# @!attribute vault_uri
|
|
110
|
+
#
|
|
111
|
+
# @return [String, nil]
|
|
112
|
+
optional :vault_uri, String
|
|
113
|
+
|
|
114
|
+
# @!attribute workload_identity_pool_id
|
|
115
|
+
#
|
|
116
|
+
# @return [String, nil]
|
|
117
|
+
optional :workload_identity_pool_id, String
|
|
118
|
+
|
|
119
|
+
# @!attribute workload_identity_project_number
|
|
120
|
+
#
|
|
121
|
+
# @return [String, nil]
|
|
122
|
+
optional :workload_identity_project_number, String
|
|
123
|
+
|
|
124
|
+
# @!attribute workload_identity_provider_id
|
|
125
|
+
#
|
|
126
|
+
# @return [String, nil]
|
|
127
|
+
optional :workload_identity_provider_id, String
|
|
128
|
+
|
|
129
|
+
# @!method initialize(id:, api_project_ids:, created_at:, name:, object:, type:, workspace_id:, audience: nil, external_id: nil, key_name: nil, key_version: nil, kms_arn: nil, kms_key_location: nil, kms_key_name: nil, kms_key_ring_name: nil, kms_key_version: nil, kms_project_id: nil, purpose: nil, role_arn: nil, tenant_id: nil, vault_uri: nil, workload_identity_pool_id: nil, workload_identity_project_number: nil, workload_identity_provider_id: nil)
|
|
130
|
+
# @param id [String]
|
|
131
|
+
# @param api_project_ids [Array<String>]
|
|
132
|
+
# @param created_at [Integer]
|
|
133
|
+
# @param name [String]
|
|
134
|
+
# @param object [String]
|
|
135
|
+
# @param type [String]
|
|
136
|
+
# @param workspace_id [String]
|
|
137
|
+
# @param audience [String]
|
|
138
|
+
# @param external_id [String]
|
|
139
|
+
# @param key_name [String]
|
|
140
|
+
# @param key_version [String]
|
|
141
|
+
# @param kms_arn [String]
|
|
142
|
+
# @param kms_key_location [String]
|
|
143
|
+
# @param kms_key_name [String]
|
|
144
|
+
# @param kms_key_ring_name [String]
|
|
145
|
+
# @param kms_key_version [String]
|
|
146
|
+
# @param kms_project_id [String]
|
|
147
|
+
# @param purpose [Symbol, OpenAI::Models::Admin::Organization::ExternalKey::Purpose]
|
|
148
|
+
# @param role_arn [String]
|
|
149
|
+
# @param tenant_id [String]
|
|
150
|
+
# @param vault_uri [String]
|
|
151
|
+
# @param workload_identity_pool_id [String]
|
|
152
|
+
# @param workload_identity_project_number [String]
|
|
153
|
+
# @param workload_identity_provider_id [String]
|
|
154
|
+
|
|
155
|
+
# @see OpenAI::Models::Admin::Organization::ExternalKey#purpose
|
|
156
|
+
module Purpose
|
|
157
|
+
extend OpenAI::Internal::Type::Enum
|
|
158
|
+
|
|
159
|
+
EKM = :ekm
|
|
160
|
+
PSP_DECRYPTION = :psp_decryption
|
|
161
|
+
|
|
162
|
+
# @!method self.values
|
|
163
|
+
# @return [Array<Symbol>]
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|