openai 0.77.1 → 0.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +98 -0
  3. data/README.md +341 -10
  4. data/SECURITY.md +6 -22
  5. data/azure.md +110 -0
  6. data/bedrock.md +132 -0
  7. data/examples/mtls_custom_http_client.rb +61 -0
  8. data/lib/openai/auth/workload_identity.rb +13 -2
  9. data/lib/openai/auth/workload_identity_auth.rb +2 -1
  10. data/lib/openai/client.rb +34 -14
  11. data/lib/openai/errors.rb +11 -1
  12. data/lib/openai/helpers/streaming/chat_completion_stream.rb +3 -3
  13. data/lib/openai/helpers/streaming/response_stream.rb +5 -6
  14. data/lib/openai/helpers/structured_output/base_model.rb +20 -19
  15. data/lib/openai/helpers/structured_output/json_schema_converter.rb +12 -5
  16. data/lib/openai/http_client.rb +189 -0
  17. data/lib/openai/internal/conversation_cursor_page.rb +5 -6
  18. data/lib/openai/internal/cursor_page.rb +3 -3
  19. data/lib/openai/internal/logging.rb +419 -0
  20. data/lib/openai/internal/next_cursor_page.rb +5 -6
  21. data/lib/openai/internal/page.rb +2 -2
  22. data/lib/openai/internal/provider.rb +7 -1
  23. data/lib/openai/internal/read_io_adapter.rb +161 -0
  24. data/lib/openai/internal/stream.rb +2 -2
  25. data/lib/openai/internal/transport/base_client.rb +216 -57
  26. data/lib/openai/internal/type/array_of.rb +6 -4
  27. data/lib/openai/internal/type/base_model.rb +39 -1
  28. data/lib/openai/internal/type/base_page.rb +19 -2
  29. data/lib/openai/internal/type/base_stream.rb +40 -8
  30. data/lib/openai/internal/type/hash_of.rb +3 -3
  31. data/lib/openai/internal/util.rb +59 -112
  32. data/lib/openai/models/admin/organization/audit_log_list_params.rb +3 -1
  33. data/lib/openai/models/admin/organization/audit_log_list_response.rb +33 -11
  34. data/lib/openai/models/admin/organization/groups/role_list_response.rb +5 -1
  35. data/lib/openai/models/admin/organization/groups/role_retrieve_response.rb +5 -1
  36. data/lib/openai/models/admin/organization/projects/groups/role_list_response.rb +6 -1
  37. data/lib/openai/models/admin/organization/projects/groups/role_retrieve_response.rb +6 -1
  38. data/lib/openai/models/admin/organization/projects/service_account_create_response.rb +3 -1
  39. data/lib/openai/models/admin/organization/projects/users/role_list_response.rb +6 -1
  40. data/lib/openai/models/admin/organization/projects/users/role_retrieve_response.rb +6 -1
  41. data/lib/openai/models/admin/organization/users/role_list_response.rb +5 -1
  42. data/lib/openai/models/admin/organization/users/role_retrieve_response.rb +5 -1
  43. data/lib/openai/models/all_models.rb +3 -0
  44. data/lib/openai/models/audio/transcription_create_params.rb +7 -1
  45. data/lib/openai/models/audio/translation_create_params.rb +7 -1
  46. data/lib/openai/models/beta/beta_response.rb +9 -0
  47. data/lib/openai/models/beta/beta_response_stream_event.rb +1 -1
  48. data/lib/openai/models/beta/beta_responses_client_event.rb +28 -3
  49. data/lib/openai/models/beta/beta_responses_server_event.rb +1037 -61
  50. data/lib/openai/models/beta/response_compact_params.rb +9 -0
  51. data/lib/openai/models/beta/response_create_params.rb +9 -0
  52. data/lib/openai/models/containers/file_create_params.rb +4 -0
  53. data/lib/openai/models/content_provenance_check_create_params.rb +4 -0
  54. data/lib/openai/models/file_create_params.rb +4 -0
  55. data/lib/openai/models/image_create_variation_params.rb +4 -0
  56. data/lib/openai/models/image_edit_params.rb +8 -0
  57. data/lib/openai/models/responses/response_compact_params.rb +9 -0
  58. data/lib/openai/models/responses/response_stream_event.rb +1 -1
  59. data/lib/openai/models/responses/responses_client_event.rb +13 -1
  60. data/lib/openai/models/responses/responses_server_event.rb +1027 -54
  61. data/lib/openai/models/responses_model.rb +3 -0
  62. data/lib/openai/models/skill_create_params.rb +4 -0
  63. data/lib/openai/models/skills/version_create_params.rb +4 -0
  64. data/lib/openai/models/uploads/part_create_params.rb +4 -0
  65. data/lib/openai/models/vector_store_search_response.rb +3 -1
  66. data/lib/openai/models/video_create_character_params.rb +4 -0
  67. data/lib/openai/models/video_create_params.rb +4 -0
  68. data/lib/openai/models/video_edit_params.rb +4 -0
  69. data/lib/openai/models/video_extend_params.rb +4 -0
  70. data/lib/openai/models.rb +9 -1
  71. data/lib/openai/net_http_client.rb +295 -0
  72. data/lib/openai/providers/azure.rb +216 -0
  73. data/lib/openai/providers/bedrock.rb +3 -1
  74. data/lib/openai/resources/admin/organization/projects/groups/roles.rb +1 -1
  75. data/lib/openai/resources/admin/organization/projects/groups.rb +1 -1
  76. data/lib/openai/resources/admin/organization/projects/users/roles.rb +1 -1
  77. data/lib/openai/resources/admin/organization/projects.rb +4 -2
  78. data/lib/openai/resources/audio/transcriptions.rb +8 -0
  79. data/lib/openai/resources/audio/translations.rb +4 -0
  80. data/lib/openai/resources/beta/responses.rb +1 -1
  81. data/lib/openai/resources/beta/threads/runs/steps.rb +2 -2
  82. data/lib/openai/resources/containers/files.rb +4 -0
  83. data/lib/openai/resources/content_provenance_checks.rb +4 -0
  84. data/lib/openai/resources/conversations/items.rb +1 -1
  85. data/lib/openai/resources/evals/runs/output_items.rb +1 -1
  86. data/lib/openai/resources/files.rb +4 -0
  87. data/lib/openai/resources/images.rb +12 -0
  88. data/lib/openai/resources/responses.rb +3 -2
  89. data/lib/openai/resources/skills/versions.rb +4 -0
  90. data/lib/openai/resources/skills.rb +4 -0
  91. data/lib/openai/resources/uploads/parts.rb +4 -0
  92. data/lib/openai/resources/vector_stores/file_batches.rb +1 -1
  93. data/lib/openai/resources/videos.rb +38 -0
  94. data/lib/openai/resources/webhooks.rb +18 -6
  95. data/lib/openai/version.rb +1 -1
  96. data/lib/openai.rb +113 -108
  97. data/rbi/openai/auth.rbi +4 -4
  98. data/rbi/openai/client.rbi +15 -3
  99. data/rbi/openai/errors.rbi +7 -0
  100. data/rbi/openai/helpers/streaming/events.rbi +12 -0
  101. data/rbi/openai/http_client.rbi +123 -0
  102. data/rbi/openai/internal/logging.rbi +192 -0
  103. data/rbi/openai/internal/provider.rbi +3 -0
  104. data/rbi/openai/internal/read_io_adapter.rbi +52 -0
  105. data/rbi/openai/internal/transport/base_client.rbi +80 -10
  106. data/rbi/openai/internal/type/base_model.rbi +24 -1
  107. data/rbi/openai/internal/type/base_page.rbi +13 -2
  108. data/rbi/openai/internal/type/base_stream.rbi +16 -5
  109. data/rbi/openai/internal/util.rbi +26 -42
  110. data/rbi/openai/models/admin/organization/audit_log_list_params.rbi +5 -0
  111. data/rbi/openai/models/admin/organization/audit_log_list_response.rbi +5 -0
  112. data/rbi/openai/models/all_models.rbi +15 -0
  113. data/rbi/openai/models/audio/transcription_create_params.rbi +14 -2
  114. data/rbi/openai/models/audio/translation_create_params.rbi +14 -2
  115. data/rbi/openai/models/beta/beta_response.rbi +15 -0
  116. data/rbi/openai/models/beta/beta_response_stream_event.rbi +1 -1
  117. data/rbi/openai/models/beta/beta_responses_client_event.rbi +37 -1
  118. data/rbi/openai/models/beta/beta_responses_server_event.rbi +3791 -54
  119. data/rbi/openai/models/beta/response_compact_params.rbi +15 -0
  120. data/rbi/openai/models/beta/response_create_params.rbi +15 -0
  121. data/rbi/openai/models/containers/file_create_params.rbi +8 -0
  122. data/rbi/openai/models/content_provenance_check_create_params.rbi +8 -0
  123. data/rbi/openai/models/file_create_params.rbi +8 -0
  124. data/rbi/openai/models/image_create_variation_params.rbi +8 -0
  125. data/rbi/openai/models/image_edit_params.rbi +16 -0
  126. data/rbi/openai/models/responses/response_compact_params.rbi +15 -0
  127. data/rbi/openai/models/responses/response_stream_event.rbi +1 -1
  128. data/rbi/openai/models/responses/responses_client_event.rbi +19 -0
  129. data/rbi/openai/models/responses/responses_server_event.rbi +3282 -53
  130. data/rbi/openai/models/responses_model.rbi +15 -0
  131. data/rbi/openai/models/skill_create_params.rbi +8 -0
  132. data/rbi/openai/models/skills/version_create_params.rbi +8 -0
  133. data/rbi/openai/models/uploads/part_create_params.rbi +8 -0
  134. data/rbi/openai/models/video_create_character_params.rbi +8 -0
  135. data/rbi/openai/models/video_create_params.rbi +8 -0
  136. data/rbi/openai/models/video_edit_params.rbi +8 -0
  137. data/rbi/openai/models/video_extend_params.rbi +8 -0
  138. data/rbi/openai/net_http_client.rbi +64 -0
  139. data/rbi/openai/providers.rbi +9 -0
  140. data/rbi/openai/resources/audio/transcriptions.rbi +14 -2
  141. data/rbi/openai/resources/audio/translations.rbi +7 -1
  142. data/rbi/openai/resources/containers/files.rbi +4 -0
  143. data/rbi/openai/resources/content_provenance_checks.rbi +4 -0
  144. data/rbi/openai/resources/files.rbi +4 -0
  145. data/rbi/openai/resources/images.rbi +20 -0
  146. data/rbi/openai/resources/skills/versions.rbi +4 -0
  147. data/rbi/openai/resources/skills.rbi +4 -0
  148. data/rbi/openai/resources/uploads/parts.rbi +4 -0
  149. data/rbi/openai/resources/videos.rbi +16 -0
  150. data/sig/openai/client.rbs +7 -2
  151. data/sig/openai/errors.rbs +5 -0
  152. data/sig/openai/http_client.rbs +76 -0
  153. data/sig/openai/internal/logging.rbs +88 -0
  154. data/sig/openai/internal/provider.rbs +3 -1
  155. data/sig/openai/internal/read_io_adapter.rbs +23 -0
  156. data/sig/openai/internal/transport/base_client.rbs +41 -6
  157. data/sig/openai/internal/type/base_model.rbs +13 -0
  158. data/sig/openai/internal/type/base_page.rbs +8 -1
  159. data/sig/openai/internal/type/base_stream.rbs +9 -3
  160. data/sig/openai/internal/util.rbs +12 -16
  161. data/sig/openai/models/admin/organization/audit_log_list_params.rbs +2 -0
  162. data/sig/openai/models/admin/organization/audit_log_list_response.rbs +2 -0
  163. data/sig/openai/models/all_models.rbs +6 -0
  164. data/sig/openai/models/beta/beta_response.rbs +6 -0
  165. data/sig/openai/models/beta/beta_responses_client_event.rbs +13 -0
  166. data/sig/openai/models/beta/beta_responses_server_event.rbs +1946 -54
  167. data/sig/openai/models/beta/response_compact_params.rbs +6 -0
  168. data/sig/openai/models/beta/response_create_params.rbs +6 -0
  169. data/sig/openai/models/responses/response_compact_params.rbs +6 -0
  170. data/sig/openai/models/responses/responses_client_event.rbs +7 -0
  171. data/sig/openai/models/responses/responses_server_event.rbs +1786 -53
  172. data/sig/openai/models/responses_model.rbs +6 -0
  173. data/sig/openai/net_http_client.rbs +34 -0
  174. data/sig/openai/providers.rbs +6 -0
  175. metadata +33 -4
  176. data/lib/openai/internal/transport/pooled_net_requester.rb +0 -210
  177. data/rbi/openai/internal/transport/pooled_net_requester.rbi +0 -82
  178. data/sig/openai/internal/transport/pooled_net_requester.rbs +0 -48
@@ -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
@@ -23,6 +23,9 @@ module OpenAI
23
23
  )
24
24
  end
25
25
  attr_accessor :prepare_request
26
+
27
+ sig { returns(T::Array[String]) }
28
+ attr_accessor :authentication_headers
26
29
  end
27
30
 
28
31
  class << self
@@ -0,0 +1,52 @@
1
+ # typed: strong
2
+
3
+ module OpenAI
4
+ module Internal
5
+ module Util
6
+ # @api private
7
+ #
8
+ # An adapter that satisfies the IO interface required by `::IO.copy_stream`
9
+ class ReadIOAdapter
10
+ # @api private
11
+ sig { returns(T.nilable(T::Boolean)) }
12
+ def close?
13
+ end
14
+
15
+ # @api private
16
+ sig { void }
17
+ def close
18
+ end
19
+
20
+ # @api private
21
+ sig { params(max_len: T.nilable(Integer)).returns(T.nilable(String)) }
22
+ private def read_enum(max_len)
23
+ end
24
+
25
+ # @api private
26
+ sig { params(max_len: Integer).returns(String) }
27
+ private def read_buffer(max_len)
28
+ end
29
+
30
+ # @api private
31
+ sig do
32
+ params(
33
+ max_len: T.nilable(Integer),
34
+ out_string: T.nilable(String)
35
+ ).returns(T.nilable(String))
36
+ end
37
+ def read(max_len = nil, out_string = nil)
38
+ end
39
+
40
+ # @api private
41
+ sig do
42
+ params(
43
+ src: T.any(String, Pathname, StringIO, T::Enumerable[String]),
44
+ blk: T.proc.params(arg0: String).void
45
+ ).returns(T.attached_class)
46
+ end
47
+ def self.new(src, &blk)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -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
 
@@ -103,6 +103,11 @@ module OpenAI
103
103
  def should_retry?(status, headers:)
104
104
  end
105
105
 
106
+ # @api private
107
+ sig { params(body: T.untyped).returns(T::Boolean) }
108
+ def request_body_replayable?(body)
109
+ end
110
+
106
111
  # @api private
107
112
  sig do
108
113
  params(
@@ -128,7 +133,7 @@ module OpenAI
128
133
  sig { returns(URI::Generic) }
129
134
  attr_reader :base_url
130
135
 
131
- sig { returns(Float) }
136
+ sig { returns(T.nilable(Float)) }
132
137
  attr_reader :timeout
133
138
 
134
139
  sig { returns(Integer) }
@@ -146,15 +151,24 @@ module OpenAI
146
151
  sig { returns(T.nilable(String)) }
147
152
  attr_reader :idempotency_header
148
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
+
149
163
  # @api private
150
- sig { returns(OpenAI::Internal::Transport::PooledNetRequester) }
164
+ sig { returns(T.untyped) }
151
165
  attr_reader :requester
152
166
 
153
167
  # @api private
154
168
  sig do
155
169
  params(
156
170
  base_url: String,
157
- timeout: Float,
171
+ timeout: T.nilable(Float),
158
172
  max_retries: Integer,
159
173
  initial_retry_delay: Float,
160
174
  max_retry_delay: Float,
@@ -169,7 +183,11 @@ module OpenAI
169
183
  )
170
184
  )
171
185
  ],
172
- idempotency_header: T.nilable(String)
186
+ idempotency_header: T.nilable(String),
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)
173
191
  ).returns(T.attached_class)
174
192
  end
175
193
  def self.new(
@@ -179,7 +197,11 @@ module OpenAI
179
197
  initial_retry_delay: 0.0,
180
198
  max_retry_delay: 0.0,
181
199
  headers: {},
182
- idempotency_header: nil
200
+ idempotency_header: nil,
201
+ http_client: nil,
202
+ logger: nil,
203
+ log_level: nil,
204
+ on_retry: nil
183
205
  )
184
206
  end
185
207
 
@@ -223,6 +245,15 @@ module OpenAI
223
245
  private def build_request(req, opts)
224
246
  end
225
247
 
248
+ # @api private
249
+ sig do
250
+ params(
251
+ request: OpenAI::Internal::Transport::BaseClient::RequestInput
252
+ ).returns(T::Boolean)
253
+ end
254
+ private def request_replayable?(request)
255
+ end
256
+
226
257
  # @api private
227
258
  sig do
228
259
  params(
@@ -239,7 +270,7 @@ module OpenAI
239
270
  url: URI::Generic,
240
271
  status: Integer,
241
272
  headers: T::Hash[String, String],
242
- response: Net::HTTPResponse,
273
+ response: OpenAI::HTTPClient::Response,
243
274
  stream: T::Enumerable[String]
244
275
  ).returns(T.noreturn)
245
276
  end
@@ -258,14 +289,16 @@ module OpenAI
258
289
  request: OpenAI::Internal::Transport::BaseClient::RequestInput,
259
290
  redirect_count: Integer,
260
291
  retry_count: Integer,
261
- send_retry_header: T::Boolean
262
- ).returns([Integer, Net::HTTPResponse, T::Enumerable[String]])
292
+ send_retry_header: T::Boolean,
293
+ context_provider: T.proc.returns(OpenAI::Internal::Logging::Context)
294
+ ).returns(OpenAI::HTTPClient::Response)
263
295
  end
264
296
  def send_request(
265
297
  request,
266
298
  redirect_count:,
267
299
  retry_count:,
268
- send_retry_header:
300
+ send_retry_header:,
301
+ &context_provider
269
302
  )
270
303
  end
271
304
 
@@ -344,6 +377,43 @@ module OpenAI
344
377
  )
345
378
  end
346
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
+
347
417
  # @api private
348
418
  sig { returns(String) }
349
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
- headers: T::Hash[String, String],
44
+ response_metadata: OpenAI::ResponseMetadata,
34
45
  page_data: T.anything
35
46
  ).void
36
47
  end
37
- def initialize(client:, req:, headers:, page_data:)
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,9 +54,8 @@ module OpenAI
41
54
  model:
42
55
  T.any(T::Class[T.anything], OpenAI::Internal::Type::Converter),
43
56
  url: URI::Generic,
44
- status: Integer,
45
- headers: T::Hash[String, String],
46
- response: Net::HTTPResponse,
57
+ response_metadata: OpenAI::ResponseMetadata,
58
+ response: OpenAI::HTTPClient::Response,
47
59
  unwrap:
48
60
  T.any(
49
61
  Symbol,
@@ -57,8 +69,7 @@ module OpenAI
57
69
  def initialize(
58
70
  model:,
59
71
  url:,
60
- status:,
61
- headers:,
72
+ response_metadata:,
62
73
  response:,
63
74
  unwrap:,
64
75
  stream:
@@ -253,46 +253,6 @@ module OpenAI
253
253
  end
254
254
  end
255
255
 
256
- # @api private
257
- #
258
- # An adapter that satisfies the IO interface required by `::IO.copy_stream`
259
- class ReadIOAdapter
260
- # @api private
261
- sig { returns(T.nilable(T::Boolean)) }
262
- def close?
263
- end
264
-
265
- # @api private
266
- sig { void }
267
- def close
268
- end
269
-
270
- # @api private
271
- sig { params(max_len: T.nilable(Integer)).returns(String) }
272
- private def read_enum(max_len)
273
- end
274
-
275
- # @api private
276
- sig do
277
- params(
278
- max_len: T.nilable(Integer),
279
- out_string: T.nilable(String)
280
- ).returns(T.nilable(String))
281
- end
282
- def read(max_len = nil, out_string = nil)
283
- end
284
-
285
- # @api private
286
- sig do
287
- params(
288
- src: T.any(String, Pathname, StringIO, T::Enumerable[String]),
289
- blk: T.proc.params(arg0: String).void
290
- ).returns(T.attached_class)
291
- end
292
- def self.new(src, &blk)
293
- end
294
- end
295
-
296
256
  class << self
297
257
  sig do
298
258
  params(blk: T.proc.params(y: Enumerator::Yielder).void).returns(
@@ -304,9 +264,15 @@ module OpenAI
304
264
  end
305
265
 
306
266
  JSON_CONTENT =
307
- T.let(%r{^application/(?:[a-zA-Z0-9.-]+\+)?json(?!l)}, Regexp)
267
+ T.let(
268
+ %r{\Aapplication/(?:[a-z0-9.-]+\+)?json[ \t]*(?:;|\z)}i,
269
+ Regexp
270
+ )
308
271
  JSONL_CONTENT =
309
- T.let(%r{^application/(:?x-(?:n|l)djson)|(:?(?:x-)?jsonl)}, Regexp)
272
+ T.let(
273
+ %r{\Aapplication/(?:x-[nl]djson|(?:x-)?jsonl)[ \t]*(?:;|\z)}i,
274
+ Regexp
275
+ )
310
276
 
311
277
  class << self
312
278
  # @api private
@@ -346,6 +312,11 @@ module OpenAI
346
312
  )
347
313
  end
348
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
+
349
320
  # @api private
350
321
  sig do
351
322
  params(
@@ -359,6 +330,19 @@ module OpenAI
359
330
  private def write_multipart_chunk(y, boundary:, key:, val:, closing:)
360
331
  end
361
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
+
362
346
  # @api private
363
347
  #
364
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",
@@ -85,6 +85,21 @@ module OpenAI
85
85
  :"gpt-5.1-codex-max",
86
86
  OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
87
87
  )
88
+ GPT_DAYBREAK_BLUE_LATEST =
89
+ T.let(
90
+ :"gpt-daybreak-blue-latest",
91
+ OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
92
+ )
93
+ GPT_DAYBREAK_RED_LATEST =
94
+ T.let(
95
+ :"gpt-daybreak-red-latest",
96
+ OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
97
+ )
98
+ GPT_5_6_CYBER =
99
+ T.let(
100
+ :"gpt-5.6-cyber",
101
+ OpenAI::AllModels::ResponsesOnlyModel::TaggedSymbol
102
+ )
88
103
 
89
104
  sig do
90
105
  override.returns(