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.
Files changed (239) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +99 -0
  3. data/README.md +241 -8
  4. data/SECURITY.md +6 -22
  5. data/azure.md +110 -0
  6. data/bedrock.md +197 -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 +29 -6
  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 +99 -7
  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 +42 -18
  24. data/lib/openai/internal/stream.rb +2 -2
  25. data/lib/openai/internal/transport/base_client.rb +137 -37
  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 +39 -7
  30. data/lib/openai/internal/type/hash_of.rb +3 -3
  31. data/lib/openai/internal/util.rb +52 -27
  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 +5 -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_mcp_tool_call_error.rb +84 -0
  47. data/lib/openai/models/beta/beta_response.rb +27 -0
  48. data/lib/openai/models/beta/beta_response_input_item.rb +3 -3
  49. data/lib/openai/models/beta/beta_response_item.rb +3 -3
  50. data/lib/openai/models/beta/beta_response_output_item.rb +3 -3
  51. data/lib/openai/models/beta/beta_response_output_item_added_event.rb +5 -2
  52. data/lib/openai/models/beta/beta_response_output_text_annotation_added_event.rb +201 -4
  53. data/lib/openai/models/beta/beta_response_reasoning_item.rb +5 -0
  54. data/lib/openai/models/beta/beta_response_stream_event.rb +1 -1
  55. data/lib/openai/models/beta/beta_responses_client_event.rb +46 -3
  56. data/lib/openai/models/beta/beta_responses_server_event.rb +1143 -63
  57. data/lib/openai/models/beta/beta_web_search_tool.rb +11 -1
  58. data/lib/openai/models/beta/response_compact_params.rb +18 -0
  59. data/lib/openai/models/beta/response_create_params.rb +27 -0
  60. data/lib/openai/models/chat_model.rb +1 -0
  61. data/lib/openai/models/completion_usage.rb +26 -2
  62. data/lib/openai/models/containers/file_create_params.rb +4 -0
  63. data/lib/openai/models/content_provenance_check_create_params.rb +4 -0
  64. data/lib/openai/models/conversations/conversation_item.rb +3 -3
  65. data/lib/openai/models/file_create_params.rb +4 -0
  66. data/lib/openai/models/image_create_variation_params.rb +4 -0
  67. data/lib/openai/models/image_edit_params.rb +8 -0
  68. data/lib/openai/models/model.rb +9 -1
  69. data/lib/openai/models/responses/mcp_tool_call_error.rb +82 -0
  70. data/lib/openai/models/responses/response.rb +9 -0
  71. data/lib/openai/models/responses/response_compact_params.rb +18 -0
  72. data/lib/openai/models/responses/response_create_params.rb +9 -0
  73. data/lib/openai/models/responses/response_input_item.rb +3 -3
  74. data/lib/openai/models/responses/response_item.rb +3 -3
  75. data/lib/openai/models/responses/response_output_item.rb +3 -3
  76. data/lib/openai/models/responses/response_output_item_added_event.rb +5 -2
  77. data/lib/openai/models/responses/response_output_text_annotation_added_event.rb +201 -4
  78. data/lib/openai/models/responses/response_reasoning_item.rb +5 -0
  79. data/lib/openai/models/responses/response_stream_event.rb +1 -1
  80. data/lib/openai/models/responses/responses_client_event.rb +22 -1
  81. data/lib/openai/models/responses/responses_server_event.rb +1107 -56
  82. data/lib/openai/models/responses/web_search_tool.rb +11 -1
  83. data/lib/openai/models/responses_model.rb +5 -0
  84. data/lib/openai/models/skill_create_params.rb +4 -0
  85. data/lib/openai/models/skills/version_create_params.rb +4 -0
  86. data/lib/openai/models/uploads/part_create_params.rb +4 -0
  87. data/lib/openai/models/vector_store_search_response.rb +3 -1
  88. data/lib/openai/models/video_create_character_params.rb +4 -0
  89. data/lib/openai/models/video_create_params.rb +4 -0
  90. data/lib/openai/models/video_edit_params.rb +4 -0
  91. data/lib/openai/models/video_extend_params.rb +4 -0
  92. data/lib/openai/models.rb +9 -1
  93. data/lib/openai/net_http_client.rb +20 -6
  94. data/lib/openai/providers/azure.rb +216 -0
  95. data/lib/openai/providers/bedrock.rb +130 -17
  96. data/lib/openai/resources/admin/organization/projects/groups/roles.rb +1 -1
  97. data/lib/openai/resources/admin/organization/projects/groups.rb +1 -1
  98. data/lib/openai/resources/admin/organization/projects/users/roles.rb +1 -1
  99. data/lib/openai/resources/admin/organization/projects.rb +4 -2
  100. data/lib/openai/resources/audio/transcriptions.rb +8 -0
  101. data/lib/openai/resources/audio/translations.rb +4 -0
  102. data/lib/openai/resources/beta/responses.rb +1 -1
  103. data/lib/openai/resources/beta/threads/runs/steps.rb +2 -2
  104. data/lib/openai/resources/containers/files.rb +4 -0
  105. data/lib/openai/resources/content_provenance_checks.rb +4 -0
  106. data/lib/openai/resources/conversations/items.rb +1 -1
  107. data/lib/openai/resources/evals/runs/output_items.rb +1 -1
  108. data/lib/openai/resources/files.rb +5 -1
  109. data/lib/openai/resources/images.rb +12 -0
  110. data/lib/openai/resources/responses.rb +3 -2
  111. data/lib/openai/resources/skills/versions.rb +4 -0
  112. data/lib/openai/resources/skills.rb +4 -0
  113. data/lib/openai/resources/uploads/parts.rb +4 -0
  114. data/lib/openai/resources/vector_stores/file_batches.rb +1 -1
  115. data/lib/openai/resources/videos.rb +38 -0
  116. data/lib/openai/resources/webhooks.rb +18 -6
  117. data/lib/openai/version.rb +1 -1
  118. data/lib/openai.rb +111 -105
  119. data/rbi/openai/auth.rbi +4 -4
  120. data/rbi/openai/client.rbi +13 -3
  121. data/rbi/openai/errors.rbi +7 -0
  122. data/rbi/openai/helpers/streaming/events.rbi +12 -0
  123. data/rbi/openai/http_client.rbi +62 -2
  124. data/rbi/openai/internal/logging.rbi +192 -0
  125. data/rbi/openai/internal/provider.rbi +3 -0
  126. data/rbi/openai/internal/read_io_adapter.rbi +6 -1
  127. data/rbi/openai/internal/transport/base_client.rbi +61 -7
  128. data/rbi/openai/internal/type/base_model.rbi +24 -1
  129. data/rbi/openai/internal/type/base_page.rbi +13 -2
  130. data/rbi/openai/internal/type/base_stream.rbi +15 -4
  131. data/rbi/openai/internal/util.rbi +26 -2
  132. data/rbi/openai/models/admin/organization/audit_log_list_params.rbi +5 -0
  133. data/rbi/openai/models/admin/organization/audit_log_list_response.rbi +5 -0
  134. data/rbi/openai/models/all_models.rbi +25 -0
  135. data/rbi/openai/models/audio/transcription_create_params.rbi +14 -2
  136. data/rbi/openai/models/audio/translation_create_params.rbi +14 -2
  137. data/rbi/openai/models/beta/beta_mcp_tool_call_error.rbi +122 -0
  138. data/rbi/openai/models/beta/beta_response.rbi +47 -0
  139. data/rbi/openai/models/beta/beta_response_input_item.rbi +27 -3
  140. data/rbi/openai/models/beta/beta_response_item.rbi +27 -3
  141. data/rbi/openai/models/beta/beta_response_output_item.rbi +27 -3
  142. data/rbi/openai/models/beta/beta_response_output_item_added_event.rbi +8 -2
  143. data/rbi/openai/models/beta/beta_response_output_text_annotation_added_event.rbi +297 -5
  144. data/rbi/openai/models/beta/beta_response_reasoning_item.rbi +10 -0
  145. data/rbi/openai/models/beta/beta_response_stream_event.rbi +1 -1
  146. data/rbi/openai/models/beta/beta_responses_client_event.rbi +69 -1
  147. data/rbi/openai/models/beta/beta_responses_server_event.rbi +3945 -54
  148. data/rbi/openai/models/beta/beta_web_search_tool.rbi +15 -0
  149. data/rbi/openai/models/beta/response_compact_params.rbi +30 -0
  150. data/rbi/openai/models/beta/response_create_params.rbi +47 -0
  151. data/rbi/openai/models/chat_model.rbi +2 -0
  152. data/rbi/openai/models/completion_usage.rbi +39 -6
  153. data/rbi/openai/models/containers/file_create_params.rbi +8 -0
  154. data/rbi/openai/models/content_provenance_check_create_params.rbi +8 -0
  155. data/rbi/openai/models/conversations/conversation_item.rbi +12 -3
  156. data/rbi/openai/models/file_create_params.rbi +8 -0
  157. data/rbi/openai/models/image_create_variation_params.rbi +8 -0
  158. data/rbi/openai/models/image_edit_params.rbi +16 -0
  159. data/rbi/openai/models/model.rbi +14 -1
  160. data/rbi/openai/models/responses/mcp_tool_call_error.rbi +120 -0
  161. data/rbi/openai/models/responses/response.rbi +17 -0
  162. data/rbi/openai/models/responses/response_compact_params.rbi +30 -0
  163. data/rbi/openai/models/responses/response_create_params.rbi +17 -0
  164. data/rbi/openai/models/responses/response_input_item.rbi +27 -3
  165. data/rbi/openai/models/responses/response_item.rbi +27 -3
  166. data/rbi/openai/models/responses/response_output_item.rbi +27 -3
  167. data/rbi/openai/models/responses/response_output_item_added_event.rbi +8 -2
  168. data/rbi/openai/models/responses/response_output_text_annotation_added_event.rbi +297 -5
  169. data/rbi/openai/models/responses/response_reasoning_item.rbi +10 -0
  170. data/rbi/openai/models/responses/response_stream_event.rbi +1 -1
  171. data/rbi/openai/models/responses/responses_client_event.rbi +36 -0
  172. data/rbi/openai/models/responses/responses_server_event.rbi +3385 -53
  173. data/rbi/openai/models/responses/web_search_tool.rbi +15 -0
  174. data/rbi/openai/models/responses_model.rbi +25 -0
  175. data/rbi/openai/models/skill_create_params.rbi +8 -0
  176. data/rbi/openai/models/skills/version_create_params.rbi +8 -0
  177. data/rbi/openai/models/uploads/part_create_params.rbi +8 -0
  178. data/rbi/openai/models/video_create_character_params.rbi +8 -0
  179. data/rbi/openai/models/video_create_params.rbi +8 -0
  180. data/rbi/openai/models/video_edit_params.rbi +8 -0
  181. data/rbi/openai/models/video_extend_params.rbi +8 -0
  182. data/rbi/openai/net_http_client.rbi +2 -2
  183. data/rbi/openai/providers.rbi +11 -0
  184. data/rbi/openai/resources/audio/transcriptions.rbi +14 -2
  185. data/rbi/openai/resources/audio/translations.rbi +7 -1
  186. data/rbi/openai/resources/beta/responses.rbi +8 -0
  187. data/rbi/openai/resources/containers/files.rbi +4 -0
  188. data/rbi/openai/resources/content_provenance_checks.rbi +4 -0
  189. data/rbi/openai/resources/files.rbi +5 -1
  190. data/rbi/openai/resources/images.rbi +20 -0
  191. data/rbi/openai/resources/responses.rbi +8 -0
  192. data/rbi/openai/resources/skills/versions.rbi +4 -0
  193. data/rbi/openai/resources/skills.rbi +4 -0
  194. data/rbi/openai/resources/uploads/parts.rbi +4 -0
  195. data/rbi/openai/resources/videos.rbi +16 -0
  196. data/sig/openai/client.rbs +6 -2
  197. data/sig/openai/errors.rbs +5 -0
  198. data/sig/openai/http_client.rbs +37 -2
  199. data/sig/openai/internal/logging.rbs +88 -0
  200. data/sig/openai/internal/provider.rbs +3 -1
  201. data/sig/openai/internal/read_io_adapter.rbs +3 -1
  202. data/sig/openai/internal/transport/base_client.rbs +33 -5
  203. data/sig/openai/internal/type/base_model.rbs +13 -0
  204. data/sig/openai/internal/type/base_page.rbs +8 -1
  205. data/sig/openai/internal/type/base_stream.rbs +8 -2
  206. data/sig/openai/internal/util.rbs +12 -0
  207. data/sig/openai/models/admin/organization/audit_log_list_params.rbs +2 -0
  208. data/sig/openai/models/admin/organization/audit_log_list_response.rbs +2 -0
  209. data/sig/openai/models/all_models.rbs +10 -0
  210. data/sig/openai/models/beta/beta_mcp_tool_call_error.rbs +75 -0
  211. data/sig/openai/models/beta/beta_response.rbs +14 -1
  212. data/sig/openai/models/beta/beta_response_input_item.rbs +4 -4
  213. data/sig/openai/models/beta/beta_response_item.rbs +4 -4
  214. data/sig/openai/models/beta/beta_response_output_item.rbs +4 -4
  215. data/sig/openai/models/beta/beta_response_output_text_annotation_added_event.rbs +149 -4
  216. data/sig/openai/models/beta/beta_responses_client_event.rbs +21 -1
  217. data/sig/openai/models/beta/beta_responses_server_event.rbs +2005 -53
  218. data/sig/openai/models/beta/beta_web_search_tool.rbs +7 -0
  219. data/sig/openai/models/beta/response_compact_params.rbs +12 -0
  220. data/sig/openai/models/beta/response_create_params.rbs +14 -1
  221. data/sig/openai/models/chat_model.rbs +2 -0
  222. data/sig/openai/models/completion_usage.rbs +27 -6
  223. data/sig/openai/models/conversations/conversation_item.rbs +4 -4
  224. data/sig/openai/models/model.rbs +12 -2
  225. data/sig/openai/models/responses/mcp_tool_call_error.rbs +73 -0
  226. data/sig/openai/models/responses/response.rbs +2 -1
  227. data/sig/openai/models/responses/response_compact_params.rbs +12 -0
  228. data/sig/openai/models/responses/response_create_params.rbs +2 -1
  229. data/sig/openai/models/responses/response_input_item.rbs +4 -4
  230. data/sig/openai/models/responses/response_item.rbs +4 -4
  231. data/sig/openai/models/responses/response_output_item.rbs +4 -4
  232. data/sig/openai/models/responses/response_output_text_annotation_added_event.rbs +149 -4
  233. data/sig/openai/models/responses/responses_client_event.rbs +9 -1
  234. data/sig/openai/models/responses/responses_server_event.rbs +1834 -53
  235. data/sig/openai/models/responses/web_search_tool.rbs +7 -0
  236. data/sig/openai/models/responses_model.rbs +10 -0
  237. data/sig/openai/net_http_client.rbs +2 -2
  238. data/sig/openai/providers.rbs +7 -0
  239. metadata +30 -1
@@ -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
@@ -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
@@ -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
- 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,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
- status: Integer,
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
- status:,
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(%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
+ )
268
271
  JSONL_CONTENT =
269
- 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
+ )
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(