openai 0.78.0 → 0.80.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 +99 -0
- data/README.md +241 -8
- data/SECURITY.md +6 -22
- data/azure.md +110 -0
- data/bedrock.md +197 -0
- data/examples/mtls_custom_http_client.rb +61 -0
- data/lib/openai/auth/workload_identity.rb +13 -2
- data/lib/openai/auth/workload_identity_auth.rb +2 -1
- data/lib/openai/client.rb +29 -6
- data/lib/openai/errors.rb +11 -1
- data/lib/openai/helpers/streaming/chat_completion_stream.rb +3 -3
- data/lib/openai/helpers/streaming/response_stream.rb +5 -6
- data/lib/openai/helpers/structured_output/base_model.rb +20 -19
- data/lib/openai/helpers/structured_output/json_schema_converter.rb +12 -5
- data/lib/openai/http_client.rb +99 -7
- data/lib/openai/internal/conversation_cursor_page.rb +5 -6
- data/lib/openai/internal/cursor_page.rb +3 -3
- data/lib/openai/internal/logging.rb +419 -0
- data/lib/openai/internal/next_cursor_page.rb +5 -6
- data/lib/openai/internal/page.rb +2 -2
- data/lib/openai/internal/provider.rb +7 -1
- data/lib/openai/internal/read_io_adapter.rb +42 -18
- data/lib/openai/internal/stream.rb +2 -2
- data/lib/openai/internal/transport/base_client.rb +137 -37
- data/lib/openai/internal/type/array_of.rb +6 -4
- data/lib/openai/internal/type/base_model.rb +39 -1
- data/lib/openai/internal/type/base_page.rb +19 -2
- data/lib/openai/internal/type/base_stream.rb +39 -7
- data/lib/openai/internal/type/hash_of.rb +3 -3
- data/lib/openai/internal/util.rb +52 -27
- data/lib/openai/models/admin/organization/audit_log_list_params.rb +3 -1
- data/lib/openai/models/admin/organization/audit_log_list_response.rb +33 -11
- data/lib/openai/models/admin/organization/groups/role_list_response.rb +5 -1
- data/lib/openai/models/admin/organization/groups/role_retrieve_response.rb +5 -1
- data/lib/openai/models/admin/organization/projects/groups/role_list_response.rb +6 -1
- data/lib/openai/models/admin/organization/projects/groups/role_retrieve_response.rb +6 -1
- data/lib/openai/models/admin/organization/projects/service_account_create_response.rb +3 -1
- data/lib/openai/models/admin/organization/projects/users/role_list_response.rb +6 -1
- data/lib/openai/models/admin/organization/projects/users/role_retrieve_response.rb +6 -1
- data/lib/openai/models/admin/organization/users/role_list_response.rb +5 -1
- data/lib/openai/models/admin/organization/users/role_retrieve_response.rb +5 -1
- data/lib/openai/models/all_models.rb +5 -0
- data/lib/openai/models/audio/transcription_create_params.rb +7 -1
- data/lib/openai/models/audio/translation_create_params.rb +7 -1
- data/lib/openai/models/beta/beta_mcp_tool_call_error.rb +84 -0
- data/lib/openai/models/beta/beta_response.rb +27 -0
- data/lib/openai/models/beta/beta_response_input_item.rb +3 -3
- data/lib/openai/models/beta/beta_response_item.rb +3 -3
- data/lib/openai/models/beta/beta_response_output_item.rb +3 -3
- data/lib/openai/models/beta/beta_response_output_item_added_event.rb +5 -2
- data/lib/openai/models/beta/beta_response_output_text_annotation_added_event.rb +201 -4
- data/lib/openai/models/beta/beta_response_reasoning_item.rb +5 -0
- data/lib/openai/models/beta/beta_response_stream_event.rb +1 -1
- data/lib/openai/models/beta/beta_responses_client_event.rb +46 -3
- data/lib/openai/models/beta/beta_responses_server_event.rb +1143 -63
- data/lib/openai/models/beta/beta_web_search_tool.rb +11 -1
- data/lib/openai/models/beta/response_compact_params.rb +18 -0
- data/lib/openai/models/beta/response_create_params.rb +27 -0
- data/lib/openai/models/chat_model.rb +1 -0
- data/lib/openai/models/completion_usage.rb +26 -2
- data/lib/openai/models/containers/file_create_params.rb +4 -0
- data/lib/openai/models/content_provenance_check_create_params.rb +4 -0
- data/lib/openai/models/conversations/conversation_item.rb +3 -3
- data/lib/openai/models/file_create_params.rb +4 -0
- data/lib/openai/models/image_create_variation_params.rb +4 -0
- data/lib/openai/models/image_edit_params.rb +8 -0
- data/lib/openai/models/model.rb +9 -1
- data/lib/openai/models/responses/mcp_tool_call_error.rb +82 -0
- data/lib/openai/models/responses/response.rb +9 -0
- data/lib/openai/models/responses/response_compact_params.rb +18 -0
- data/lib/openai/models/responses/response_create_params.rb +9 -0
- data/lib/openai/models/responses/response_input_item.rb +3 -3
- data/lib/openai/models/responses/response_item.rb +3 -3
- data/lib/openai/models/responses/response_output_item.rb +3 -3
- data/lib/openai/models/responses/response_output_item_added_event.rb +5 -2
- data/lib/openai/models/responses/response_output_text_annotation_added_event.rb +201 -4
- data/lib/openai/models/responses/response_reasoning_item.rb +5 -0
- data/lib/openai/models/responses/response_stream_event.rb +1 -1
- data/lib/openai/models/responses/responses_client_event.rb +22 -1
- data/lib/openai/models/responses/responses_server_event.rb +1107 -56
- data/lib/openai/models/responses/web_search_tool.rb +11 -1
- data/lib/openai/models/responses_model.rb +5 -0
- data/lib/openai/models/skill_create_params.rb +4 -0
- data/lib/openai/models/skills/version_create_params.rb +4 -0
- data/lib/openai/models/uploads/part_create_params.rb +4 -0
- data/lib/openai/models/vector_store_search_response.rb +3 -1
- data/lib/openai/models/video_create_character_params.rb +4 -0
- data/lib/openai/models/video_create_params.rb +4 -0
- data/lib/openai/models/video_edit_params.rb +4 -0
- data/lib/openai/models/video_extend_params.rb +4 -0
- data/lib/openai/models.rb +9 -1
- data/lib/openai/net_http_client.rb +20 -6
- data/lib/openai/providers/azure.rb +216 -0
- data/lib/openai/providers/bedrock.rb +130 -17
- data/lib/openai/resources/admin/organization/projects/groups/roles.rb +1 -1
- data/lib/openai/resources/admin/organization/projects/groups.rb +1 -1
- data/lib/openai/resources/admin/organization/projects/users/roles.rb +1 -1
- data/lib/openai/resources/admin/organization/projects.rb +4 -2
- data/lib/openai/resources/audio/transcriptions.rb +8 -0
- data/lib/openai/resources/audio/translations.rb +4 -0
- data/lib/openai/resources/beta/responses.rb +1 -1
- data/lib/openai/resources/beta/threads/runs/steps.rb +2 -2
- data/lib/openai/resources/containers/files.rb +4 -0
- data/lib/openai/resources/content_provenance_checks.rb +4 -0
- data/lib/openai/resources/conversations/items.rb +1 -1
- data/lib/openai/resources/evals/runs/output_items.rb +1 -1
- data/lib/openai/resources/files.rb +5 -1
- data/lib/openai/resources/images.rb +12 -0
- data/lib/openai/resources/responses.rb +3 -2
- data/lib/openai/resources/skills/versions.rb +4 -0
- data/lib/openai/resources/skills.rb +4 -0
- data/lib/openai/resources/uploads/parts.rb +4 -0
- data/lib/openai/resources/vector_stores/file_batches.rb +1 -1
- data/lib/openai/resources/videos.rb +38 -0
- data/lib/openai/resources/webhooks.rb +18 -6
- data/lib/openai/version.rb +1 -1
- data/lib/openai.rb +111 -105
- data/rbi/openai/auth.rbi +4 -4
- data/rbi/openai/client.rbi +13 -3
- data/rbi/openai/errors.rbi +7 -0
- data/rbi/openai/helpers/streaming/events.rbi +12 -0
- data/rbi/openai/http_client.rbi +62 -2
- data/rbi/openai/internal/logging.rbi +192 -0
- data/rbi/openai/internal/provider.rbi +3 -0
- data/rbi/openai/internal/read_io_adapter.rbi +6 -1
- data/rbi/openai/internal/transport/base_client.rbi +61 -7
- data/rbi/openai/internal/type/base_model.rbi +24 -1
- data/rbi/openai/internal/type/base_page.rbi +13 -2
- data/rbi/openai/internal/type/base_stream.rbi +15 -4
- data/rbi/openai/internal/util.rbi +26 -2
- data/rbi/openai/models/admin/organization/audit_log_list_params.rbi +5 -0
- data/rbi/openai/models/admin/organization/audit_log_list_response.rbi +5 -0
- data/rbi/openai/models/all_models.rbi +25 -0
- data/rbi/openai/models/audio/transcription_create_params.rbi +14 -2
- data/rbi/openai/models/audio/translation_create_params.rbi +14 -2
- data/rbi/openai/models/beta/beta_mcp_tool_call_error.rbi +122 -0
- data/rbi/openai/models/beta/beta_response.rbi +47 -0
- data/rbi/openai/models/beta/beta_response_input_item.rbi +27 -3
- data/rbi/openai/models/beta/beta_response_item.rbi +27 -3
- data/rbi/openai/models/beta/beta_response_output_item.rbi +27 -3
- data/rbi/openai/models/beta/beta_response_output_item_added_event.rbi +8 -2
- data/rbi/openai/models/beta/beta_response_output_text_annotation_added_event.rbi +297 -5
- data/rbi/openai/models/beta/beta_response_reasoning_item.rbi +10 -0
- data/rbi/openai/models/beta/beta_response_stream_event.rbi +1 -1
- data/rbi/openai/models/beta/beta_responses_client_event.rbi +69 -1
- data/rbi/openai/models/beta/beta_responses_server_event.rbi +3945 -54
- data/rbi/openai/models/beta/beta_web_search_tool.rbi +15 -0
- data/rbi/openai/models/beta/response_compact_params.rbi +30 -0
- data/rbi/openai/models/beta/response_create_params.rbi +47 -0
- data/rbi/openai/models/chat_model.rbi +2 -0
- data/rbi/openai/models/completion_usage.rbi +39 -6
- data/rbi/openai/models/containers/file_create_params.rbi +8 -0
- data/rbi/openai/models/content_provenance_check_create_params.rbi +8 -0
- data/rbi/openai/models/conversations/conversation_item.rbi +12 -3
- data/rbi/openai/models/file_create_params.rbi +8 -0
- data/rbi/openai/models/image_create_variation_params.rbi +8 -0
- data/rbi/openai/models/image_edit_params.rbi +16 -0
- data/rbi/openai/models/model.rbi +14 -1
- data/rbi/openai/models/responses/mcp_tool_call_error.rbi +120 -0
- data/rbi/openai/models/responses/response.rbi +17 -0
- data/rbi/openai/models/responses/response_compact_params.rbi +30 -0
- data/rbi/openai/models/responses/response_create_params.rbi +17 -0
- data/rbi/openai/models/responses/response_input_item.rbi +27 -3
- data/rbi/openai/models/responses/response_item.rbi +27 -3
- data/rbi/openai/models/responses/response_output_item.rbi +27 -3
- data/rbi/openai/models/responses/response_output_item_added_event.rbi +8 -2
- data/rbi/openai/models/responses/response_output_text_annotation_added_event.rbi +297 -5
- data/rbi/openai/models/responses/response_reasoning_item.rbi +10 -0
- data/rbi/openai/models/responses/response_stream_event.rbi +1 -1
- data/rbi/openai/models/responses/responses_client_event.rbi +36 -0
- data/rbi/openai/models/responses/responses_server_event.rbi +3385 -53
- data/rbi/openai/models/responses/web_search_tool.rbi +15 -0
- data/rbi/openai/models/responses_model.rbi +25 -0
- data/rbi/openai/models/skill_create_params.rbi +8 -0
- data/rbi/openai/models/skills/version_create_params.rbi +8 -0
- data/rbi/openai/models/uploads/part_create_params.rbi +8 -0
- data/rbi/openai/models/video_create_character_params.rbi +8 -0
- data/rbi/openai/models/video_create_params.rbi +8 -0
- data/rbi/openai/models/video_edit_params.rbi +8 -0
- data/rbi/openai/models/video_extend_params.rbi +8 -0
- data/rbi/openai/net_http_client.rbi +2 -2
- data/rbi/openai/providers.rbi +11 -0
- data/rbi/openai/resources/audio/transcriptions.rbi +14 -2
- data/rbi/openai/resources/audio/translations.rbi +7 -1
- data/rbi/openai/resources/beta/responses.rbi +8 -0
- data/rbi/openai/resources/containers/files.rbi +4 -0
- data/rbi/openai/resources/content_provenance_checks.rbi +4 -0
- data/rbi/openai/resources/files.rbi +5 -1
- data/rbi/openai/resources/images.rbi +20 -0
- data/rbi/openai/resources/responses.rbi +8 -0
- data/rbi/openai/resources/skills/versions.rbi +4 -0
- data/rbi/openai/resources/skills.rbi +4 -0
- data/rbi/openai/resources/uploads/parts.rbi +4 -0
- data/rbi/openai/resources/videos.rbi +16 -0
- data/sig/openai/client.rbs +6 -2
- data/sig/openai/errors.rbs +5 -0
- data/sig/openai/http_client.rbs +37 -2
- data/sig/openai/internal/logging.rbs +88 -0
- data/sig/openai/internal/provider.rbs +3 -1
- data/sig/openai/internal/read_io_adapter.rbs +3 -1
- data/sig/openai/internal/transport/base_client.rbs +33 -5
- data/sig/openai/internal/type/base_model.rbs +13 -0
- data/sig/openai/internal/type/base_page.rbs +8 -1
- data/sig/openai/internal/type/base_stream.rbs +8 -2
- data/sig/openai/internal/util.rbs +12 -0
- data/sig/openai/models/admin/organization/audit_log_list_params.rbs +2 -0
- data/sig/openai/models/admin/organization/audit_log_list_response.rbs +2 -0
- data/sig/openai/models/all_models.rbs +10 -0
- data/sig/openai/models/beta/beta_mcp_tool_call_error.rbs +75 -0
- data/sig/openai/models/beta/beta_response.rbs +14 -1
- data/sig/openai/models/beta/beta_response_input_item.rbs +4 -4
- data/sig/openai/models/beta/beta_response_item.rbs +4 -4
- data/sig/openai/models/beta/beta_response_output_item.rbs +4 -4
- data/sig/openai/models/beta/beta_response_output_text_annotation_added_event.rbs +149 -4
- data/sig/openai/models/beta/beta_responses_client_event.rbs +21 -1
- data/sig/openai/models/beta/beta_responses_server_event.rbs +2005 -53
- data/sig/openai/models/beta/beta_web_search_tool.rbs +7 -0
- data/sig/openai/models/beta/response_compact_params.rbs +12 -0
- data/sig/openai/models/beta/response_create_params.rbs +14 -1
- data/sig/openai/models/chat_model.rbs +2 -0
- data/sig/openai/models/completion_usage.rbs +27 -6
- data/sig/openai/models/conversations/conversation_item.rbs +4 -4
- data/sig/openai/models/model.rbs +12 -2
- data/sig/openai/models/responses/mcp_tool_call_error.rbs +73 -0
- data/sig/openai/models/responses/response.rbs +2 -1
- data/sig/openai/models/responses/response_compact_params.rbs +12 -0
- data/sig/openai/models/responses/response_create_params.rbs +2 -1
- data/sig/openai/models/responses/response_input_item.rbs +4 -4
- data/sig/openai/models/responses/response_item.rbs +4 -4
- data/sig/openai/models/responses/response_output_item.rbs +4 -4
- data/sig/openai/models/responses/response_output_text_annotation_added_event.rbs +149 -4
- data/sig/openai/models/responses/responses_client_event.rbs +9 -1
- data/sig/openai/models/responses/responses_server_event.rbs +1834 -53
- data/sig/openai/models/responses/web_search_tool.rbs +7 -0
- data/sig/openai/models/responses_model.rbs +10 -0
- data/sig/openai/net_http_client.rbs +2 -2
- data/sig/openai/providers.rbs +7 -0
- metadata +30 -1
data/rbi/openai/http_client.rbi
CHANGED
|
@@ -1,6 +1,63 @@
|
|
|
1
1
|
# typed: strong
|
|
2
2
|
|
|
3
3
|
module OpenAI
|
|
4
|
+
class ResponseMetadata
|
|
5
|
+
sig { returns(Integer) }
|
|
6
|
+
attr_reader :status
|
|
7
|
+
|
|
8
|
+
sig { returns(T::Hash[String, String]) }
|
|
9
|
+
attr_reader :headers
|
|
10
|
+
|
|
11
|
+
sig { returns(T.nilable(String)) }
|
|
12
|
+
attr_reader :request_id
|
|
13
|
+
|
|
14
|
+
# @api private
|
|
15
|
+
sig do
|
|
16
|
+
params(status: Integer, headers: T::Hash[String, String]).returns(
|
|
17
|
+
T.attached_class
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
def self.new(status:, headers:)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class RetryEvent
|
|
25
|
+
sig { returns(Integer) }
|
|
26
|
+
attr_reader :attempt
|
|
27
|
+
|
|
28
|
+
sig { returns(Integer) }
|
|
29
|
+
attr_reader :max_attempts
|
|
30
|
+
|
|
31
|
+
sig { returns(Float) }
|
|
32
|
+
attr_reader :delay
|
|
33
|
+
|
|
34
|
+
sig { returns(T.nilable(OpenAI::ResponseMetadata)) }
|
|
35
|
+
attr_reader :response
|
|
36
|
+
|
|
37
|
+
sig { returns(T.nilable(OpenAI::Errors::APIConnectionError)) }
|
|
38
|
+
attr_reader :error
|
|
39
|
+
|
|
40
|
+
sig do
|
|
41
|
+
params(
|
|
42
|
+
attempt: Integer,
|
|
43
|
+
max_attempts: Integer,
|
|
44
|
+
delay: Float,
|
|
45
|
+
response: T.nilable(OpenAI::ResponseMetadata),
|
|
46
|
+
error: T.nilable(OpenAI::Errors::APIConnectionError)
|
|
47
|
+
).returns(T.attached_class)
|
|
48
|
+
end
|
|
49
|
+
def self.new(attempt:, max_attempts:, delay:, response:, error:)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
sig { returns(T.nilable(Integer)) }
|
|
53
|
+
def status
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
sig { returns(T.nilable(String)) }
|
|
57
|
+
def request_id
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
4
61
|
class HTTPClient
|
|
5
62
|
class Request
|
|
6
63
|
sig { returns(Symbol) }
|
|
@@ -15,7 +72,7 @@ module OpenAI
|
|
|
15
72
|
sig { returns(T.anything) }
|
|
16
73
|
attr_reader :body
|
|
17
74
|
|
|
18
|
-
sig { returns(Float) }
|
|
75
|
+
sig { returns(T.nilable(Float)) }
|
|
19
76
|
attr_reader :timeout
|
|
20
77
|
|
|
21
78
|
sig do
|
|
@@ -24,7 +81,7 @@ module OpenAI
|
|
|
24
81
|
url: URI::Generic,
|
|
25
82
|
headers: T::Hash[String, String],
|
|
26
83
|
body: T.anything,
|
|
27
|
-
timeout: Float
|
|
84
|
+
timeout: T.nilable(Float)
|
|
28
85
|
).returns(T.attached_class)
|
|
29
86
|
end
|
|
30
87
|
def self.new(method:, url:, headers:, body:, timeout:)
|
|
@@ -41,6 +98,9 @@ module OpenAI
|
|
|
41
98
|
sig { returns(T::Enumerable[String]) }
|
|
42
99
|
attr_reader :body
|
|
43
100
|
|
|
101
|
+
sig { returns(OpenAI::ResponseMetadata) }
|
|
102
|
+
attr_reader :metadata
|
|
103
|
+
|
|
44
104
|
sig do
|
|
45
105
|
params(
|
|
46
106
|
status: Integer,
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module OpenAI
|
|
4
|
+
module Internal
|
|
5
|
+
module Logging
|
|
6
|
+
LOG_LEVELS = T.let(T.unsafe(nil), T::Hash[Symbol, Integer])
|
|
7
|
+
REDACTED_HEADERS = T.let(T.unsafe(nil), T::Array[String])
|
|
8
|
+
MAX_BODY_BYTES = T.let(T.unsafe(nil), Integer)
|
|
9
|
+
MAX_ARRAY_ITEMS = T.let(T.unsafe(nil), Integer)
|
|
10
|
+
OPAQUE_STRING_BYTES = T.let(T.unsafe(nil), Integer)
|
|
11
|
+
SENSITIVE_BODY_KEY = T.let(T.unsafe(nil), Regexp)
|
|
12
|
+
SENSITIVE_QUERY_KEY = T.let(T.unsafe(nil), Regexp)
|
|
13
|
+
URL_HEADER_KEY = T.let(T.unsafe(nil), Regexp)
|
|
14
|
+
|
|
15
|
+
class Context
|
|
16
|
+
sig do
|
|
17
|
+
params(
|
|
18
|
+
logger: T.untyped,
|
|
19
|
+
log_level: Symbol,
|
|
20
|
+
on_retry: T.nilable(T.proc.params(event: OpenAI::RetryEvent).void),
|
|
21
|
+
method: Symbol,
|
|
22
|
+
url: URI::Generic
|
|
23
|
+
).returns(T.attached_class)
|
|
24
|
+
end
|
|
25
|
+
def self.new(logger:, log_level:, on_retry:, method:, url:)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
sig do
|
|
29
|
+
params(
|
|
30
|
+
request: OpenAI::HTTPClient::Request,
|
|
31
|
+
redirect_count: Integer
|
|
32
|
+
).void
|
|
33
|
+
end
|
|
34
|
+
def request_started(request, redirect_count:)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
sig do
|
|
38
|
+
params(response: OpenAI::HTTPClient::Response).returns(
|
|
39
|
+
OpenAI::HTTPClient::Response
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
def response_received(response)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
sig { params(error: OpenAI::Errors::APIConnectionError).void }
|
|
46
|
+
def attempt_failed(error)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
sig do
|
|
50
|
+
params(
|
|
51
|
+
cause: T.any(Integer, OpenAI::Errors::APIConnectionError),
|
|
52
|
+
delay: Float,
|
|
53
|
+
response: T.nilable(OpenAI::ResponseMetadata),
|
|
54
|
+
retry_count: Integer,
|
|
55
|
+
max_retries: Integer
|
|
56
|
+
).void
|
|
57
|
+
end
|
|
58
|
+
def retry_scheduled(
|
|
59
|
+
cause,
|
|
60
|
+
delay:,
|
|
61
|
+
response:,
|
|
62
|
+
retry_count:,
|
|
63
|
+
max_retries:
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
sig { params(response: OpenAI::HTTPClient::Response).void }
|
|
68
|
+
def completed(response)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
sig do
|
|
72
|
+
params(
|
|
73
|
+
stream: T.untyped,
|
|
74
|
+
response: OpenAI::HTTPClient::Response
|
|
75
|
+
).returns(T.untyped)
|
|
76
|
+
end
|
|
77
|
+
def observe_stream(stream, response:)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
sig { params(error: StandardError).void }
|
|
81
|
+
def request_failed(error)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
sig do
|
|
85
|
+
params(
|
|
86
|
+
body: String,
|
|
87
|
+
headers: T::Hash[String, String],
|
|
88
|
+
complete: T::Boolean,
|
|
89
|
+
total_bytes: Integer,
|
|
90
|
+
attempt: Integer
|
|
91
|
+
).void
|
|
92
|
+
end
|
|
93
|
+
def response_body(body, headers:, complete:, total_bytes:, attempt:)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
class ObservedBody
|
|
98
|
+
include Enumerable
|
|
99
|
+
|
|
100
|
+
Elem = type_member { { fixed: String } }
|
|
101
|
+
|
|
102
|
+
sig do
|
|
103
|
+
params(
|
|
104
|
+
body: T::Enumerable[String],
|
|
105
|
+
headers: T::Hash[String, String],
|
|
106
|
+
context: OpenAI::Internal::Logging::Context,
|
|
107
|
+
attempt: Integer
|
|
108
|
+
).returns(T.attached_class)
|
|
109
|
+
end
|
|
110
|
+
def self.new(body:, headers:, context:, attempt:)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
sig { params(blk: T.untyped).returns(T.untyped) }
|
|
114
|
+
def each(&blk)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
sig { void }
|
|
118
|
+
def close
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
class << self
|
|
123
|
+
sig { params(value: T.any(Symbol, String)).returns(Symbol) }
|
|
124
|
+
def normalize_level(value)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
sig { params(logger: T.untyped).void }
|
|
128
|
+
def validate_logger!(logger)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
sig { returns(Logger) }
|
|
132
|
+
def default_logger
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
sig do
|
|
136
|
+
params(configured_level: Symbol, event_level: Symbol).returns(
|
|
137
|
+
T::Boolean
|
|
138
|
+
)
|
|
139
|
+
end
|
|
140
|
+
def enabled?(configured_level, event_level)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
sig { params(url: URI::Generic).returns(String) }
|
|
144
|
+
def safe_path(url)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
sig { params(url: URI::Generic).returns(String) }
|
|
148
|
+
def safe_url(url)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
sig { params(value: T.untyped).returns(String) }
|
|
152
|
+
def safe_field(value)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
sig { params(name: T.any(String, Symbol)).returns(T::Boolean) }
|
|
156
|
+
def sensitive_header?(name)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
sig { params(name: T.any(String, Symbol)).returns(T::Boolean) }
|
|
160
|
+
def credential_header?(name)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
sig { params(headers: T::Hash[String, String]).returns(String) }
|
|
164
|
+
def format_headers(headers)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
sig do
|
|
168
|
+
params(body: T.untyped, headers: T::Hash[String, String]).returns(
|
|
169
|
+
String
|
|
170
|
+
)
|
|
171
|
+
end
|
|
172
|
+
def format_body(body, headers:)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
sig { params(headers: T::Hash[String, String]).returns(T::Boolean) }
|
|
176
|
+
def capture_response_body?(headers)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
sig do
|
|
180
|
+
params(
|
|
181
|
+
body: String,
|
|
182
|
+
headers: T::Hash[String, String],
|
|
183
|
+
complete: T::Boolean,
|
|
184
|
+
total_bytes: Integer
|
|
185
|
+
).returns(String)
|
|
186
|
+
end
|
|
187
|
+
def format_observed_body(body, headers:, complete:, total_bytes:)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
end
|
|
@@ -18,10 +18,15 @@ module OpenAI
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
# @api private
|
|
21
|
-
sig { params(max_len: T.nilable(Integer)).returns(String) }
|
|
21
|
+
sig { params(max_len: T.nilable(Integer)).returns(T.nilable(String)) }
|
|
22
22
|
private def read_enum(max_len)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
+
# @api private
|
|
26
|
+
sig { params(max_len: Integer).returns(String) }
|
|
27
|
+
private def read_buffer(max_len)
|
|
28
|
+
end
|
|
29
|
+
|
|
25
30
|
# @api private
|
|
26
31
|
sig do
|
|
27
32
|
params(
|
|
@@ -75,7 +75,7 @@ module OpenAI
|
|
|
75
75
|
headers: T::Hash[String, String],
|
|
76
76
|
body: T.anything,
|
|
77
77
|
max_retries: Integer,
|
|
78
|
-
timeout: Float
|
|
78
|
+
timeout: T.nilable(Float)
|
|
79
79
|
}
|
|
80
80
|
end
|
|
81
81
|
|
|
@@ -133,7 +133,7 @@ module OpenAI
|
|
|
133
133
|
sig { returns(URI::Generic) }
|
|
134
134
|
attr_reader :base_url
|
|
135
135
|
|
|
136
|
-
sig { returns(Float) }
|
|
136
|
+
sig { returns(T.nilable(Float)) }
|
|
137
137
|
attr_reader :timeout
|
|
138
138
|
|
|
139
139
|
sig { returns(Integer) }
|
|
@@ -151,6 +151,15 @@ module OpenAI
|
|
|
151
151
|
sig { returns(T.nilable(String)) }
|
|
152
152
|
attr_reader :idempotency_header
|
|
153
153
|
|
|
154
|
+
sig { returns(T.untyped) }
|
|
155
|
+
attr_reader :logger
|
|
156
|
+
|
|
157
|
+
sig { returns(Symbol) }
|
|
158
|
+
attr_reader :log_level
|
|
159
|
+
|
|
160
|
+
sig { returns(T.nilable(T.proc.params(event: OpenAI::RetryEvent).void)) }
|
|
161
|
+
attr_reader :on_retry
|
|
162
|
+
|
|
154
163
|
# @api private
|
|
155
164
|
sig { returns(T.untyped) }
|
|
156
165
|
attr_reader :requester
|
|
@@ -159,7 +168,7 @@ module OpenAI
|
|
|
159
168
|
sig do
|
|
160
169
|
params(
|
|
161
170
|
base_url: String,
|
|
162
|
-
timeout: Float,
|
|
171
|
+
timeout: T.nilable(Float),
|
|
163
172
|
max_retries: Integer,
|
|
164
173
|
initial_retry_delay: Float,
|
|
165
174
|
max_retry_delay: Float,
|
|
@@ -175,7 +184,10 @@ module OpenAI
|
|
|
175
184
|
)
|
|
176
185
|
],
|
|
177
186
|
idempotency_header: T.nilable(String),
|
|
178
|
-
http_client: T.untyped
|
|
187
|
+
http_client: T.untyped,
|
|
188
|
+
logger: T.untyped,
|
|
189
|
+
log_level: T.nilable(T.any(Symbol, String)),
|
|
190
|
+
on_retry: T.nilable(T.proc.params(event: OpenAI::RetryEvent).void)
|
|
179
191
|
).returns(T.attached_class)
|
|
180
192
|
end
|
|
181
193
|
def self.new(
|
|
@@ -186,7 +198,10 @@ module OpenAI
|
|
|
186
198
|
max_retry_delay: 0.0,
|
|
187
199
|
headers: {},
|
|
188
200
|
idempotency_header: nil,
|
|
189
|
-
http_client: nil
|
|
201
|
+
http_client: nil,
|
|
202
|
+
logger: nil,
|
|
203
|
+
log_level: nil,
|
|
204
|
+
on_retry: nil
|
|
190
205
|
)
|
|
191
206
|
end
|
|
192
207
|
|
|
@@ -274,14 +289,16 @@ module OpenAI
|
|
|
274
289
|
request: OpenAI::Internal::Transport::BaseClient::RequestInput,
|
|
275
290
|
redirect_count: Integer,
|
|
276
291
|
retry_count: Integer,
|
|
277
|
-
send_retry_header: T::Boolean
|
|
292
|
+
send_retry_header: T::Boolean,
|
|
293
|
+
context_provider: T.proc.returns(OpenAI::Internal::Logging::Context)
|
|
278
294
|
).returns(OpenAI::HTTPClient::Response)
|
|
279
295
|
end
|
|
280
296
|
def send_request(
|
|
281
297
|
request,
|
|
282
298
|
redirect_count:,
|
|
283
299
|
retry_count:,
|
|
284
|
-
send_retry_header
|
|
300
|
+
send_retry_header:,
|
|
301
|
+
&context_provider
|
|
285
302
|
)
|
|
286
303
|
end
|
|
287
304
|
|
|
@@ -360,6 +377,43 @@ module OpenAI
|
|
|
360
377
|
)
|
|
361
378
|
end
|
|
362
379
|
|
|
380
|
+
# @api private
|
|
381
|
+
sig do
|
|
382
|
+
params(
|
|
383
|
+
req: OpenAI::Internal::Transport::BaseClient::RequestComponents
|
|
384
|
+
).returns(
|
|
385
|
+
[
|
|
386
|
+
URI::Generic,
|
|
387
|
+
OpenAI::HTTPClient::Response,
|
|
388
|
+
OpenAI::Internal::Logging::Context
|
|
389
|
+
]
|
|
390
|
+
)
|
|
391
|
+
end
|
|
392
|
+
private def perform_request(req)
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
# @api private
|
|
396
|
+
sig do
|
|
397
|
+
params(
|
|
398
|
+
log_context: OpenAI::Internal::Logging::Context,
|
|
399
|
+
response: OpenAI::HTTPClient::Response,
|
|
400
|
+
blk: T.proc.returns(T.anything)
|
|
401
|
+
).returns(T.anything)
|
|
402
|
+
end
|
|
403
|
+
private def finish_request(log_context, response, &blk)
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
# @api private
|
|
407
|
+
sig do
|
|
408
|
+
params(
|
|
409
|
+
req: OpenAI::Internal::Transport::BaseClient::RequestComponents,
|
|
410
|
+
url: URI::Generic,
|
|
411
|
+
response: OpenAI::HTTPClient::Response
|
|
412
|
+
).returns(T.anything)
|
|
413
|
+
end
|
|
414
|
+
private def parse_response(req, url:, response:)
|
|
415
|
+
end
|
|
416
|
+
|
|
363
417
|
# @api private
|
|
364
418
|
sig { returns(String) }
|
|
365
419
|
def inspect
|
|
@@ -29,7 +29,7 @@ module OpenAI
|
|
|
29
29
|
# Assumes superclass fields are totally defined before fields are accessed /
|
|
30
30
|
# defined on subclasses.
|
|
31
31
|
sig { params(child: OpenAI::Internal::Type::BaseModel).void }
|
|
32
|
-
def inherited(child)
|
|
32
|
+
def inherited(child) # rubocop:disable Lint/MissingSuper -- RBI declarations cannot contain executable bodies.
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
# @api private
|
|
@@ -161,6 +161,24 @@ module OpenAI
|
|
|
161
161
|
def hash
|
|
162
162
|
end
|
|
163
163
|
|
|
164
|
+
# The ID of the API request, returned via the `x-request-id` response
|
|
165
|
+
# header. This is only populated on top-level response objects returned
|
|
166
|
+
# by the client.
|
|
167
|
+
sig { returns(T.nilable(String)) }
|
|
168
|
+
def _request_id
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Metadata from the HTTP response that produced this model. This is
|
|
172
|
+
# only populated on top-level response objects returned by the client.
|
|
173
|
+
sig { returns(T.nilable(OpenAI::ResponseMetadata)) }
|
|
174
|
+
def last_response
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# @api private
|
|
178
|
+
sig { params(response: OpenAI::ResponseMetadata).returns(T.self_type) }
|
|
179
|
+
def _set_last_response(response)
|
|
180
|
+
end
|
|
181
|
+
|
|
164
182
|
class << self
|
|
165
183
|
# @api private
|
|
166
184
|
sig do
|
|
@@ -265,6 +283,11 @@ module OpenAI
|
|
|
265
283
|
def to_yaml(*a)
|
|
266
284
|
end
|
|
267
285
|
|
|
286
|
+
# @api private
|
|
287
|
+
sig { params(coder: T.untyped).void }
|
|
288
|
+
def encode_with(coder)
|
|
289
|
+
end
|
|
290
|
+
|
|
268
291
|
# Create a new instance of a model.
|
|
269
292
|
sig do
|
|
270
293
|
params(
|
|
@@ -9,6 +9,17 @@ module OpenAI
|
|
|
9
9
|
module BasePage
|
|
10
10
|
Elem = type_member(:out)
|
|
11
11
|
|
|
12
|
+
# The ID of the API request, returned via the `x-request-id` response
|
|
13
|
+
# header. This is only populated on top-level response objects returned
|
|
14
|
+
# by the client.
|
|
15
|
+
sig { returns(T.nilable(String)) }
|
|
16
|
+
def _request_id
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
sig { returns(OpenAI::ResponseMetadata) }
|
|
20
|
+
def last_response
|
|
21
|
+
end
|
|
22
|
+
|
|
12
23
|
sig { overridable.returns(T::Boolean) }
|
|
13
24
|
def next_page?
|
|
14
25
|
end
|
|
@@ -30,11 +41,11 @@ module OpenAI
|
|
|
30
41
|
params(
|
|
31
42
|
client: OpenAI::Internal::Transport::BaseClient,
|
|
32
43
|
req: OpenAI::Internal::Transport::BaseClient::RequestComponents,
|
|
33
|
-
|
|
44
|
+
response_metadata: OpenAI::ResponseMetadata,
|
|
34
45
|
page_data: T.anything
|
|
35
46
|
).void
|
|
36
47
|
end
|
|
37
|
-
def initialize(client:, req:,
|
|
48
|
+
def initialize(client:, req:, response_metadata:, page_data:)
|
|
38
49
|
end
|
|
39
50
|
end
|
|
40
51
|
end
|
|
@@ -18,10 +18,23 @@ module OpenAI
|
|
|
18
18
|
sig { returns(T::Hash[String, String]) }
|
|
19
19
|
attr_reader :headers
|
|
20
20
|
|
|
21
|
+
sig { returns(OpenAI::ResponseMetadata) }
|
|
22
|
+
attr_reader :last_response
|
|
23
|
+
|
|
21
24
|
sig { void }
|
|
22
25
|
def close
|
|
23
26
|
end
|
|
24
27
|
|
|
28
|
+
# @api private
|
|
29
|
+
sig do
|
|
30
|
+
params(
|
|
31
|
+
context: OpenAI::Internal::Logging::Context,
|
|
32
|
+
response: OpenAI::HTTPClient::Response
|
|
33
|
+
).returns(T.self_type)
|
|
34
|
+
end
|
|
35
|
+
def observe(context:, response:)
|
|
36
|
+
end
|
|
37
|
+
|
|
25
38
|
# @api private
|
|
26
39
|
sig { overridable.returns(T::Enumerable[Elem]) }
|
|
27
40
|
private def iterator
|
|
@@ -41,8 +54,7 @@ module OpenAI
|
|
|
41
54
|
model:
|
|
42
55
|
T.any(T::Class[T.anything], OpenAI::Internal::Type::Converter),
|
|
43
56
|
url: URI::Generic,
|
|
44
|
-
|
|
45
|
-
headers: T::Hash[String, String],
|
|
57
|
+
response_metadata: OpenAI::ResponseMetadata,
|
|
46
58
|
response: OpenAI::HTTPClient::Response,
|
|
47
59
|
unwrap:
|
|
48
60
|
T.any(
|
|
@@ -57,8 +69,7 @@ module OpenAI
|
|
|
57
69
|
def initialize(
|
|
58
70
|
model:,
|
|
59
71
|
url:,
|
|
60
|
-
|
|
61
|
-
headers:,
|
|
72
|
+
response_metadata:,
|
|
62
73
|
response:,
|
|
63
74
|
unwrap:,
|
|
64
75
|
stream:
|
|
@@ -264,9 +264,15 @@ module OpenAI
|
|
|
264
264
|
end
|
|
265
265
|
|
|
266
266
|
JSON_CONTENT =
|
|
267
|
-
T.let(
|
|
267
|
+
T.let(
|
|
268
|
+
%r{\Aapplication/(?:[a-z0-9.-]+\+)?json[ \t]*(?:;|\z)}i,
|
|
269
|
+
Regexp
|
|
270
|
+
)
|
|
268
271
|
JSONL_CONTENT =
|
|
269
|
-
T.let(
|
|
272
|
+
T.let(
|
|
273
|
+
%r{\Aapplication/(?:x-[nl]djson|(?:x-)?jsonl)[ \t]*(?:;|\z)}i,
|
|
274
|
+
Regexp
|
|
275
|
+
)
|
|
270
276
|
|
|
271
277
|
class << self
|
|
272
278
|
# @api private
|
|
@@ -306,6 +312,11 @@ module OpenAI
|
|
|
306
312
|
)
|
|
307
313
|
end
|
|
308
314
|
|
|
315
|
+
# @api private
|
|
316
|
+
sig { params(value: T.any(Pathname, String, Symbol)).returns(String) }
|
|
317
|
+
private def escape_multipart_header_param(value)
|
|
318
|
+
end
|
|
319
|
+
|
|
309
320
|
# @api private
|
|
310
321
|
sig do
|
|
311
322
|
params(
|
|
@@ -319,6 +330,19 @@ module OpenAI
|
|
|
319
330
|
private def write_multipart_chunk(y, boundary:, key:, val:, closing:)
|
|
320
331
|
end
|
|
321
332
|
|
|
333
|
+
# @api private
|
|
334
|
+
sig do
|
|
335
|
+
params(
|
|
336
|
+
y: Enumerator::Yielder,
|
|
337
|
+
boundary: String,
|
|
338
|
+
key: T.any(Symbol, String),
|
|
339
|
+
val: T.anything,
|
|
340
|
+
closing: T::Array[T.proc.void]
|
|
341
|
+
).void
|
|
342
|
+
end
|
|
343
|
+
private def write_multipart_value(y, boundary:, key:, val:, closing:)
|
|
344
|
+
end
|
|
345
|
+
|
|
322
346
|
# @api private
|
|
323
347
|
#
|
|
324
348
|
# https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.1.md#special-considerations-for-multipart-content
|
|
@@ -646,6 +646,11 @@ module OpenAI
|
|
|
646
646
|
:"tenant.workload_identity.principal.provisioned",
|
|
647
647
|
OpenAI::Admin::Organization::AuditLogListParams::EventType::TaggedSymbol
|
|
648
648
|
)
|
|
649
|
+
TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED =
|
|
650
|
+
T.let(
|
|
651
|
+
:"tenant.workload_identity.access_token.issued",
|
|
652
|
+
OpenAI::Admin::Organization::AuditLogListParams::EventType::TaggedSymbol
|
|
653
|
+
)
|
|
649
654
|
TENANT_ADMIN_API_KEY_CREATED =
|
|
650
655
|
T.let(
|
|
651
656
|
:"tenant.admin_api_key.created",
|
|
@@ -1778,6 +1778,11 @@ module OpenAI
|
|
|
1778
1778
|
:"tenant.workload_identity.principal.provisioned",
|
|
1779
1779
|
OpenAI::Models::Admin::Organization::AuditLogListResponse::Type::TaggedSymbol
|
|
1780
1780
|
)
|
|
1781
|
+
TENANT_WORKLOAD_IDENTITY_ACCESS_TOKEN_ISSUED =
|
|
1782
|
+
T.let(
|
|
1783
|
+
:"tenant.workload_identity.access_token.issued",
|
|
1784
|
+
OpenAI::Models::Admin::Organization::AuditLogListResponse::Type::TaggedSymbol
|
|
1785
|
+
)
|
|
1781
1786
|
TENANT_ADMIN_API_KEY_CREATED =
|
|
1782
1787
|
T.let(
|
|
1783
1788
|
:"tenant.admin_api_key.created",
|
|
@@ -65,6 +65,16 @@ module OpenAI
|
|
|
65
65
|
:"computer-use-preview-2025-03-11",
|
|
66
66
|
OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
|
|
67
67
|
)
|
|
68
|
+
GPT_5_5_PRO =
|
|
69
|
+
T.let(
|
|
70
|
+
:"gpt-5.5-pro",
|
|
71
|
+
OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
|
|
72
|
+
)
|
|
73
|
+
GPT_5_5_PRO_2026_04_23 =
|
|
74
|
+
T.let(
|
|
75
|
+
:"gpt-5.5-pro-2026-04-23",
|
|
76
|
+
OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
|
|
77
|
+
)
|
|
68
78
|
GPT_5_CODEX =
|
|
69
79
|
T.let(
|
|
70
80
|
:"gpt-5-codex",
|
|
@@ -85,6 +95,21 @@ module OpenAI
|
|
|
85
95
|
:"gpt-5.1-codex-max",
|
|
86
96
|
OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
|
|
87
97
|
)
|
|
98
|
+
GPT_DAYBREAK_BLUE_LATEST =
|
|
99
|
+
T.let(
|
|
100
|
+
:"gpt-daybreak-blue-latest",
|
|
101
|
+
OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
|
|
102
|
+
)
|
|
103
|
+
GPT_DAYBREAK_RED_LATEST =
|
|
104
|
+
T.let(
|
|
105
|
+
:"gpt-daybreak-red-latest",
|
|
106
|
+
OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
|
|
107
|
+
)
|
|
108
|
+
GPT_5_6_CYBER =
|
|
109
|
+
T.let(
|
|
110
|
+
:"gpt-5.6-cyber",
|
|
111
|
+
OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
|
|
112
|
+
)
|
|
88
113
|
|
|
89
114
|
sig do
|
|
90
115
|
override.returns(
|