openai 0.95.0 → 0.97.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 (197) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +51 -0
  3. data/README.md +5 -2
  4. data/docs/architecture/security-model.md +2 -2
  5. data/examples/audio/record_and_play.rb +1 -1
  6. data/lib/openai/helpers/live/transcript_grouper.rb +264 -0
  7. data/lib/openai/helpers/live/transcript_grouping.rb +309 -0
  8. data/lib/openai/helpers/live/websocket.rb +454 -0
  9. data/lib/openai/helpers/realtime/translation.rb +440 -0
  10. data/lib/openai/helpers/realtime.rb +1 -0
  11. data/lib/openai/helpers/responses_websocket/incremental.rb +246 -0
  12. data/lib/openai/helpers/responses_websocket/transports/async_websocket.rb +183 -0
  13. data/lib/openai/helpers/responses_websocket.rb +1 -0
  14. data/lib/openai/helpers/streaming/response_stream.rb +19 -11
  15. data/lib/openai/helpers/structured_output/chat_completion_parser.rb +0 -2
  16. data/lib/openai/helpers/structured_output/response_parser.rb +1 -2
  17. data/lib/openai/helpers/structured_output/union_of.rb +0 -2
  18. data/lib/openai/helpers/websocket/async_websocket_transport.rb +11 -6
  19. data/lib/openai/helpers/websocket/connection_manager.rb +9 -0
  20. data/lib/openai/internal/read_io_adapter.rb +0 -2
  21. data/lib/openai/internal/stream.rb +0 -2
  22. data/lib/openai/internal/type/base_model.rb +4 -6
  23. data/lib/openai/internal/type/converter.rb +5 -3
  24. data/lib/openai/internal/type/enum.rb +0 -2
  25. data/lib/openai/internal/type/union.rb +0 -6
  26. data/lib/openai/internal/type/unknown.rb +34 -6
  27. data/lib/openai/internal/util.rb +0 -4
  28. data/lib/openai/models/audio/speech_create_params.rb +9 -0
  29. data/lib/openai/models/audio/transcription_create_response.rb +4 -1
  30. data/lib/openai/models/audio/translation_create_response.rb +4 -1
  31. data/lib/openai/models/beta/agent.rb +3 -2
  32. data/lib/openai/models/beta/agent_browser_authentication_cancel_param.rb +23 -0
  33. data/lib/openai/models/beta/agent_browser_authentication_submit_param.rb +70 -0
  34. data/lib/openai/models/beta/agent_browser_origin_access_param.rb +45 -0
  35. data/lib/openai/models/beta/agent_create_params.rb +5 -2
  36. data/lib/openai/models/beta/agent_output_item.rb +276 -1
  37. data/lib/openai/models/beta/agent_session.rb +252 -5
  38. data/lib/openai/models/beta/agent_session_input_param.rb +64 -1
  39. data/lib/openai/models/beta/agent_session_item.rb +391 -1
  40. data/lib/openai/models/beta/agent_session_turn_item_added_event.rb +2 -2
  41. data/lib/openai/models/beta/agent_session_turn_item_done_event.rb +2 -2
  42. data/lib/openai/models/beta/agent_tool.rb +27 -1
  43. data/lib/openai/models/beta/agent_tool_param.rb +27 -1
  44. data/lib/openai/models/beta/agent_update_params.rb +5 -2
  45. data/lib/openai/models/beta/agents/environments/environment_template.rb +26 -2
  46. data/lib/openai/models/beta/agents/environments/template_create_params.rb +51 -6
  47. data/lib/openai/models/beta/agents/environments/template_update_params.rb +51 -9
  48. data/lib/openai/models/beta/agents/session_create_params.rb +5 -2
  49. data/lib/openai/models/beta/agents/session_update_params.rb +3 -0
  50. data/lib/openai/models/beta/agents/sessions/event_create_params.rb +2 -2
  51. data/lib/openai/models/beta/agents/vaults/credential.rb +10 -1
  52. data/lib/openai/models/beta/agents/vaults/credential_create_params.rb +12 -1
  53. data/lib/openai/models/beta/agents/vaults/credential_update_params.rb +14 -3
  54. data/lib/openai/models/beta/beta_response.rb +38 -1
  55. data/lib/openai/models/beta/beta_responses_client_event.rb +73 -1
  56. data/lib/openai/models/beta/beta_web_search_preview_tool.rb +9 -3
  57. data/lib/openai/models/beta/beta_web_search_tool.rb +9 -3
  58. data/lib/openai/models/beta/environment.rb +26 -2
  59. data/lib/openai/models/beta/environment_param.rb +46 -6
  60. data/lib/openai/models/beta/persisted_agent_tool.rb +27 -1
  61. data/lib/openai/models/beta/persisted_agent_tool_param.rb +27 -1
  62. data/lib/openai/models/beta/response_compact_params.rb +3 -0
  63. data/lib/openai/models/beta/response_create_params.rb +68 -1
  64. data/lib/openai/models/beta/session_turn_error.rb +3 -0
  65. data/lib/openai/models/chat_model.rb +1 -0
  66. data/lib/openai/models/responses/response.rb +35 -1
  67. data/lib/openai/models/responses/response_compact_params.rb +3 -0
  68. data/lib/openai/models/responses/response_create_params.rb +65 -1
  69. data/lib/openai/models/responses/responses_client_event.rb +70 -1
  70. data/lib/openai/models/responses/web_search_preview_tool.rb +9 -3
  71. data/lib/openai/models/responses/web_search_tool.rb +9 -3
  72. data/lib/openai/net_http_client.rb +0 -2
  73. data/lib/openai/resources/audio/transcriptions.rb +5 -3
  74. data/lib/openai/resources/audio/translations.rb +1 -1
  75. data/lib/openai/resources/beta/agents/environments/templates.rb +12 -5
  76. data/lib/openai/resources/beta/agents/sessions/events.rb +1 -1
  77. data/lib/openai/resources/beta/agents/sessions/items.rb +1 -1
  78. data/lib/openai/resources/beta/agents/sessions/subagents/items.rb +1 -1
  79. data/lib/openai/resources/beta/agents/sessions/subagents/turns/items.rb +1 -1
  80. data/lib/openai/resources/beta/agents/vaults/credentials.rb +12 -4
  81. data/lib/openai/resources/beta/agents.rb +2 -2
  82. data/lib/openai/resources/beta/responses.rb +8 -2
  83. data/lib/openai/resources/responses.rb +8 -1
  84. data/lib/openai/version.rb +1 -1
  85. data/lib/openai.rb +4 -0
  86. data/rbi/openai/helpers/live/transcript_grouper.rbi +67 -0
  87. data/rbi/openai/helpers/live/websocket.rbi +299 -0
  88. data/rbi/openai/helpers/realtime/translation.rbi +137 -0
  89. data/rbi/openai/helpers/responses_websocket/incremental.rbi +32 -0
  90. data/rbi/openai/helpers/responses_websocket/transports/async_websocket.rbi +24 -0
  91. data/rbi/openai/helpers/streaming/response_stream.rbi +5 -0
  92. data/rbi/openai/internal/type/converter.rbi +3 -2
  93. data/rbi/openai/models/audio/speech_create_params.rbi +3 -0
  94. data/rbi/openai/models/audio/transcription_create_response.rbi +2 -1
  95. data/rbi/openai/models/audio/translation_create_response.rbi +2 -1
  96. data/rbi/openai/models/beta/agent.rbi +3 -1
  97. data/rbi/openai/models/beta/agent_browser_authentication_cancel_param.rbi +53 -0
  98. data/rbi/openai/models/beta/agent_browser_authentication_submit_param.rbi +125 -0
  99. data/rbi/openai/models/beta/agent_browser_origin_access_param.rbi +76 -0
  100. data/rbi/openai/models/beta/agent_create_params.rbi +9 -3
  101. data/rbi/openai/models/beta/agent_output_item.rbi +422 -0
  102. data/rbi/openai/models/beta/agent_session.rbi +374 -1
  103. data/rbi/openai/models/beta/agent_session_input_param.rbi +102 -0
  104. data/rbi/openai/models/beta/agent_session_item.rbi +614 -0
  105. data/rbi/openai/models/beta/agent_session_turn_item_added_event.rbi +3 -0
  106. data/rbi/openai/models/beta/agent_session_turn_item_done_event.rbi +2 -0
  107. data/rbi/openai/models/beta/agent_tool.rbi +49 -1
  108. data/rbi/openai/models/beta/agent_tool_param.rbi +52 -1
  109. data/rbi/openai/models/beta/agent_update_params.rbi +9 -3
  110. data/rbi/openai/models/beta/agents/environments/environment_template.rbi +53 -2
  111. data/rbi/openai/models/beta/agents/environments/template_create_params.rbi +77 -7
  112. data/rbi/openai/models/beta/agents/environments/template_update_params.rbi +77 -10
  113. data/rbi/openai/models/beta/agents/session_create_params.rbi +9 -3
  114. data/rbi/openai/models/beta/agents/session_update_params.rbi +3 -0
  115. data/rbi/openai/models/beta/agents/sessions/event_create_params.rbi +3 -0
  116. data/rbi/openai/models/beta/agents/vaults/credential.rbi +10 -0
  117. data/rbi/openai/models/beta/agents/vaults/credential_create_params.rbi +15 -0
  118. data/rbi/openai/models/beta/agents/vaults/credential_update_params.rbi +35 -6
  119. data/rbi/openai/models/beta/beta_response.rbi +64 -0
  120. data/rbi/openai/models/beta/beta_responses_client_event.rbi +128 -0
  121. data/rbi/openai/models/beta/beta_web_search_preview_tool.rbi +9 -3
  122. data/rbi/openai/models/beta/beta_web_search_tool.rbi +9 -3
  123. data/rbi/openai/models/beta/environment.rbi +53 -2
  124. data/rbi/openai/models/beta/environment_param.rbi +75 -7
  125. data/rbi/openai/models/beta/persisted_agent_tool.rbi +49 -1
  126. data/rbi/openai/models/beta/persisted_agent_tool_param.rbi +52 -1
  127. data/rbi/openai/models/beta/response_compact_params.rbi +1 -0
  128. data/rbi/openai/models/beta/response_create_params.rbi +100 -0
  129. data/rbi/openai/models/beta/session_turn_error.rbi +6 -0
  130. data/rbi/openai/models/chat_model.rbi +1 -0
  131. data/rbi/openai/models/responses/response.rbi +63 -0
  132. data/rbi/openai/models/responses/response_compact_params.rbi +1 -0
  133. data/rbi/openai/models/responses/response_create_params.rbi +106 -0
  134. data/rbi/openai/models/responses/responses_client_event.rbi +125 -0
  135. data/rbi/openai/models/responses/web_search_preview_tool.rbi +9 -3
  136. data/rbi/openai/models/responses/web_search_tool.rbi +9 -3
  137. data/rbi/openai/resources/audio/transcriptions.rbi +4 -2
  138. data/rbi/openai/resources/beta/agents/environments/templates.rbi +10 -3
  139. data/rbi/openai/resources/beta/agents/sessions/events.rbi +1 -0
  140. data/rbi/openai/resources/beta/agents/vaults/credentials.rbi +11 -3
  141. data/rbi/openai/resources/beta/agents.rbi +4 -2
  142. data/rbi/openai/resources/beta/responses.rbi +6 -0
  143. data/rbi/openai/resources/responses.rbi +11 -0
  144. data/responses-websocket.md +55 -0
  145. data/sig/openai/helpers/live/transcript_grouper.rbs +42 -0
  146. data/sig/openai/helpers/live/websocket.rbs +152 -0
  147. data/sig/openai/helpers/realtime/translation.rbs +81 -0
  148. data/sig/openai/helpers/responses_websocket/incremental.rbs +14 -0
  149. data/sig/openai/helpers/responses_websocket/transports/async_websocket.rbs +21 -0
  150. data/sig/openai/helpers/streaming/response_stream.rbs +9 -0
  151. data/sig/openai/internal/type/converter.rbs +3 -1
  152. data/sig/openai/models/audio/speech_create_params.rbs +6 -0
  153. data/sig/openai/models/audio/transcription_create_response.rbs +1 -0
  154. data/sig/openai/models/audio/translation_create_response.rbs +3 -1
  155. data/sig/openai/models/beta/agent.rbs +3 -1
  156. data/sig/openai/models/beta/agent_browser_authentication_cancel_param.rbs +21 -0
  157. data/sig/openai/models/beta/agent_browser_authentication_submit_param.rbs +63 -0
  158. data/sig/openai/models/beta/agent_browser_origin_access_param.rbs +47 -0
  159. data/sig/openai/models/beta/agent_create_params.rbs +5 -1
  160. data/sig/openai/models/beta/agent_output_item.rbs +254 -0
  161. data/sig/openai/models/beta/agent_session.rbs +218 -2
  162. data/sig/openai/models/beta/agent_session_input_param.rbs +51 -1
  163. data/sig/openai/models/beta/agent_session_item.rbs +362 -0
  164. data/sig/openai/models/beta/agent_tool.rbs +22 -0
  165. data/sig/openai/models/beta/agent_tool_param.rbs +25 -0
  166. data/sig/openai/models/beta/agent_update_params.rbs +5 -1
  167. data/sig/openai/models/beta/agents/environments/environment_template.rbs +29 -3
  168. data/sig/openai/models/beta/agents/environments/template_create_params.rbs +41 -6
  169. data/sig/openai/models/beta/agents/environments/template_update_params.rbs +41 -8
  170. data/sig/openai/models/beta/agents/session_create_params.rbs +5 -1
  171. data/sig/openai/models/beta/agents/session_update_params.rbs +5 -1
  172. data/sig/openai/models/beta/agents/vaults/credential.rbs +8 -0
  173. data/sig/openai/models/beta/agents/vaults/credential_create_params.rbs +14 -0
  174. data/sig/openai/models/beta/agents/vaults/credential_update_params.rbs +23 -4
  175. data/sig/openai/models/beta/beta_response.rbs +37 -0
  176. data/sig/openai/models/beta/beta_responses_client_event.rbs +79 -0
  177. data/sig/openai/models/beta/beta_web_search_preview_tool.rbs +6 -2
  178. data/sig/openai/models/beta/beta_web_search_tool.rbs +6 -2
  179. data/sig/openai/models/beta/environment.rbs +29 -3
  180. data/sig/openai/models/beta/environment_param.rbs +41 -6
  181. data/sig/openai/models/beta/persisted_agent_tool.rbs +22 -0
  182. data/sig/openai/models/beta/persisted_agent_tool_param.rbs +25 -0
  183. data/sig/openai/models/beta/response_compact_params.rbs +2 -0
  184. data/sig/openai/models/beta/response_create_params.rbs +79 -0
  185. data/sig/openai/models/beta/session_turn_error.rbs +4 -0
  186. data/sig/openai/models/chat_model.rbs +2 -0
  187. data/sig/openai/models/responses/response.rbs +35 -0
  188. data/sig/openai/models/responses/response_compact_params.rbs +2 -0
  189. data/sig/openai/models/responses/response_create_params.rbs +77 -0
  190. data/sig/openai/models/responses/responses_client_event.rbs +77 -0
  191. data/sig/openai/models/responses/web_search_preview_tool.rbs +6 -2
  192. data/sig/openai/models/responses/web_search_tool.rbs +6 -2
  193. data/sig/openai/resources/beta/agents/environments/templates.rbs +2 -0
  194. data/sig/openai/resources/beta/agents/vaults/credentials.rbs +3 -1
  195. data/sig/openai/resources/beta/responses.rbs +2 -0
  196. data/sig/openai/resources/responses.rbs +4 -0
  197. metadata +23 -1
@@ -0,0 +1,299 @@
1
+ # typed: strong
2
+
3
+ module OpenAI
4
+ class Client < OpenAI::Internal::Transport::BaseClient
5
+ # @api private
6
+ sig do
7
+ params(
8
+ path: T.any(String, T::Array[String]),
9
+ query: T::Hash[String, String],
10
+ websocket_base_url: T.nilable(String),
11
+ options: T.nilable(OpenAI::RequestOptions::OrHash),
12
+ block: T
13
+ .proc
14
+ .params(
15
+ request: OpenAI::Internal::Transport::BaseClient::RequestInput,
16
+ mark_handshake_completed: T.proc.void
17
+ )
18
+ .returns(T.anything)
19
+ )
20
+ .returns(T.anything)
21
+ end
22
+ def with_live_websocket_connection_request(
23
+ path: "live/sessions",
24
+ query: {},
25
+ websocket_base_url: nil,
26
+ options: nil,
27
+ &block
28
+ )
29
+ end
30
+ end
31
+
32
+ module Errors
33
+ class LiveConnectionError < OpenAI::Errors::WebSocketConnectionError
34
+ end
35
+
36
+ class LiveProtocolError < OpenAI::Errors::WebSocketProtocolError
37
+ sig { returns(T.attached_class) }
38
+ def self.new
39
+ end
40
+ end
41
+ end
42
+
43
+ module Models
44
+ module Live
45
+ class UnknownServerEvent
46
+ sig { returns(Symbol) }
47
+ attr_reader :type
48
+ sig { returns(T::Hash[T.any(String, Symbol), T.anything]) }
49
+ attr_reader :data
50
+ sig { params(data: T::Hash[T.any(String, Symbol), T.anything]).returns(T.attached_class) }
51
+ def self.new(data:)
52
+ end
53
+
54
+ sig { returns(T::Hash[T.any(String, Symbol), T.anything]) }
55
+ def to_h
56
+ end
57
+
58
+ sig { returns(String) }
59
+ def inspect
60
+ end
61
+
62
+ alias to_s inspect
63
+ end
64
+
65
+ class Connection
66
+ include Enumerable
67
+ ServerEvent = T.type_alias { T.any(OpenAI::Live::ServerEvent::Variants, OpenAI::Live::UnknownServerEvent) }
68
+ ClientEvent = T.type_alias do
69
+ T.any(OpenAI::Live::ClientEvent::Variants, T::Hash[T.any(String, Symbol), T.anything])
70
+ end
71
+
72
+ Elem = type_member { {fixed: ServerEvent} }
73
+ sig { returns(URI::Generic) }
74
+ attr_reader :url
75
+ sig { params(socket: T.anything, url: URI::Generic).returns(T.attached_class) }
76
+ def self.new(socket:, url:)
77
+ end
78
+
79
+ sig do
80
+ params(block: T.nilable(T.proc.params(event: ServerEvent).void)).returns(
81
+ T.any(OpenAI::Live::Connection, T::Enumerator[ServerEvent])
82
+ )
83
+ end
84
+ def each(&block)
85
+ end
86
+
87
+ sig { returns(T.nilable(ServerEvent)) }
88
+ def receive
89
+ end
90
+
91
+ sig { returns(T.nilable(String)) }
92
+ def receive_raw
93
+ end
94
+
95
+ sig { params(event: ClientEvent).void }
96
+ def send_event(event)
97
+ end
98
+
99
+ sig { params(data: String).void }
100
+ def send_raw(data)
101
+ end
102
+
103
+ sig { params(code: Integer, reason: String).void }
104
+ def close(code: 1000, reason: "")
105
+ end
106
+
107
+ sig { void }
108
+ def abort
109
+ end
110
+
111
+ sig { returns(T::Boolean) }
112
+ def closed?
113
+ end
114
+ end
115
+
116
+ class SidebandConnection
117
+ include Enumerable
118
+ ClientEvent = T.type_alias do
119
+ T.any(
120
+ OpenAI::Live::SessionUpdateEvent,
121
+ OpenAI::Live::InputAudioMuteEvent,
122
+ OpenAI::Live::InputAudioUnmuteEvent,
123
+ OpenAI::Live::InstructionsAppendEvent,
124
+ OpenAI::Live::ThinkingAppendEvent,
125
+ OpenAI::Live::CommentaryAppendEvent,
126
+ OpenAI::Live::ResponseItemCreateEvent,
127
+ OpenAI::Live::ResponseCreateEvent,
128
+ OpenAI::Live::SessionCloseEvent,
129
+ T::Hash[T.any(String, Symbol), T.anything]
130
+ )
131
+ end
132
+
133
+ Elem = type_member { {fixed: Connection::ServerEvent} }
134
+ sig { returns(URI::Generic) }
135
+ attr_reader :url
136
+ sig { params(socket: T.anything, url: URI::Generic).returns(T.attached_class) }
137
+ def self.new(socket:, url:)
138
+ end
139
+
140
+ sig do
141
+ params(block: T.nilable(T.proc.params(event: Connection::ServerEvent).void)).returns(
142
+ T.any(OpenAI::Live::SidebandConnection, T::Enumerator[Connection::ServerEvent])
143
+ )
144
+ end
145
+ def each(&block)
146
+ end
147
+
148
+ sig { returns(T.nilable(Connection::ServerEvent)) }
149
+ def receive
150
+ end
151
+
152
+ sig { returns(T.nilable(String)) }
153
+ def receive_raw
154
+ end
155
+
156
+ sig { params(event: ClientEvent).void }
157
+ def send_event(event)
158
+ end
159
+
160
+ sig { params(data: String).void }
161
+ def send_raw(data)
162
+ end
163
+
164
+ sig { params(code: Integer, reason: String).void }
165
+ def close(code: 1000, reason: "")
166
+ end
167
+
168
+ sig { void }
169
+ def abort
170
+ end
171
+
172
+ sig { returns(T::Boolean) }
173
+ def closed?
174
+ end
175
+ end
176
+
177
+ # Fork sessions use distinct input/output variants; expose that protocol
178
+ # directly so the primary Connection's shipped signatures stay precise.
179
+ class ForkConnection
180
+ include Enumerable
181
+ ServerEvent = T.type_alias { T.any(OpenAI::Live::ForkServerEvent::Variants, OpenAI::Live::UnknownServerEvent) }
182
+ ClientEvent = T.type_alias do
183
+ T.any(OpenAI::Live::ForkClientEvent::Variants, T::Hash[T.any(String, Symbol), T.anything])
184
+ end
185
+
186
+ Elem = type_member { {fixed: ServerEvent} }
187
+ sig { returns(URI::Generic) }
188
+ attr_reader :url
189
+ sig { params(socket: T.anything, url: URI::Generic).returns(T.attached_class) }
190
+ def self.new(socket:, url:)
191
+ end
192
+
193
+ sig do
194
+ params(block: T.nilable(T.proc.params(event: ServerEvent).void)).returns(
195
+ T.any(OpenAI::Live::ForkConnection, T::Enumerator[ServerEvent])
196
+ )
197
+ end
198
+ def each(&block)
199
+ end
200
+
201
+ sig { returns(T.nilable(ServerEvent)) }
202
+ def receive
203
+ end
204
+
205
+ sig { returns(T.nilable(String)) }
206
+ def receive_raw
207
+ end
208
+
209
+ sig { params(event: ClientEvent).void }
210
+ def send_event(event)
211
+ end
212
+
213
+ sig { params(data: String).void }
214
+ def send_raw(data)
215
+ end
216
+
217
+ sig { params(code: Integer, reason: String).void }
218
+ def close(code: 1000, reason: "")
219
+ end
220
+
221
+ sig { void }
222
+ def abort
223
+ end
224
+
225
+ sig { returns(T::Boolean) }
226
+ def closed?
227
+ end
228
+ end
229
+ end
230
+ end
231
+
232
+ module Resources
233
+ class Live
234
+ sig do
235
+ type_parameters(:T)
236
+ .params(
237
+ websocket_base_url: T.nilable(String),
238
+ request_options: T.nilable(OpenAI::RequestOptions::OrHash),
239
+ transport: T.untyped,
240
+ transport_options: T::Hash[Symbol, T.anything],
241
+ block: T.proc.params(connection: OpenAI::Live::Connection).returns(T.type_parameter(:T))
242
+ )
243
+ .returns(T.type_parameter(:T))
244
+ end
245
+ def connect(websocket_base_url: nil, request_options: nil, transport: nil, transport_options: {}, &block)
246
+ end
247
+
248
+ class Sideband
249
+ sig do
250
+ type_parameters(:T)
251
+ .params(
252
+ session_id: String,
253
+ graceful_close: T.nilable(T::Boolean),
254
+ websocket_base_url: T.nilable(String),
255
+ request_options: T.nilable(OpenAI::RequestOptions::OrHash),
256
+ transport: T.untyped,
257
+ transport_options: T::Hash[Symbol, T.anything],
258
+ block: T.proc.params(connection: OpenAI::Live::SidebandConnection).returns(T.type_parameter(:T))
259
+ )
260
+ .returns(T.type_parameter(:T))
261
+ end
262
+ def connect(
263
+ session_id,
264
+ graceful_close: nil,
265
+ websocket_base_url: nil,
266
+ request_options: nil,
267
+ transport: nil,
268
+ transport_options: {},
269
+ &block
270
+ )
271
+ end
272
+ end
273
+
274
+ class Forks
275
+ sig do
276
+ type_parameters(:T)
277
+ .params(
278
+ session_id: String,
279
+ websocket_base_url: T.nilable(String),
280
+ request_options: T.nilable(OpenAI::RequestOptions::OrHash),
281
+ transport: T.untyped,
282
+ transport_options: T::Hash[Symbol, T.anything],
283
+ block: T.proc.params(connection: OpenAI::Live::ForkConnection).returns(T.type_parameter(:T))
284
+ )
285
+ .returns(T.type_parameter(:T))
286
+ end
287
+ def connect(
288
+ session_id,
289
+ websocket_base_url: nil,
290
+ request_options: nil,
291
+ transport: nil,
292
+ transport_options: {},
293
+ &block
294
+ )
295
+ end
296
+ end
297
+ end
298
+ end
299
+ end
@@ -0,0 +1,137 @@
1
+ # typed: strong
2
+
3
+ module OpenAI
4
+ class Client < OpenAI::Internal::Transport::BaseClient
5
+ # @api private
6
+ sig do
7
+ params(
8
+ model: String,
9
+ websocket_base_url: T.nilable(String),
10
+ options: T.nilable(OpenAI::RequestOptions::OrHash),
11
+ block: T
12
+ .proc
13
+ .params(
14
+ request: OpenAI::Internal::Transport::BaseClient::RequestInput,
15
+ mark_handshake_completed: T.proc.void
16
+ )
17
+ .returns(T.anything)
18
+ )
19
+ .returns(T.anything)
20
+ end
21
+ def with_translation_connection_request(model:, websocket_base_url: nil, options: nil, &block)
22
+ end
23
+ end
24
+
25
+ module Errors
26
+ class TranslationConnectionError < OpenAI::Errors::WebSocketConnectionError
27
+ end
28
+
29
+ class TranslationProtocolError < OpenAI::Errors::WebSocketProtocolError
30
+ sig { returns(T.attached_class) }
31
+ def self.new
32
+ end
33
+ end
34
+ end
35
+
36
+ module Models
37
+ module Realtime
38
+ class UnknownTranslationServerEvent < OpenAI::Realtime::UnknownServerEvent
39
+ sig { returns(String) }
40
+ def inspect
41
+ end
42
+
43
+ alias to_s inspect
44
+ end
45
+
46
+ class TranslationConnection
47
+ include Enumerable
48
+ ServerEvent = T.type_alias do
49
+ T.any(
50
+ OpenAI::Realtime::RealtimeTranslationServerEvent::Variants,
51
+ OpenAI::Realtime::UnknownTranslationServerEvent
52
+ )
53
+ end
54
+
55
+ ClientEvent = T.type_alias do
56
+ T.any(OpenAI::Realtime::RealtimeTranslationClientEvent::Variants, T::Hash[T.any(String, Symbol), T.anything])
57
+ end
58
+
59
+ Elem = type_member { {fixed: ServerEvent} }
60
+ sig { returns(URI::Generic) }
61
+ attr_reader :url
62
+ sig { params(socket: T.anything, url: URI::Generic).returns(T.attached_class) }
63
+ def self.new(socket:, url:)
64
+ end
65
+
66
+ sig do
67
+ params(block: T.nilable(T.proc.params(event: ServerEvent).void)).returns(
68
+ T.any(OpenAI::Realtime::TranslationConnection, T::Enumerator[ServerEvent])
69
+ )
70
+ end
71
+ def each(&block)
72
+ end
73
+
74
+ sig { returns(T.nilable(ServerEvent)) }
75
+ def receive
76
+ end
77
+
78
+ sig { returns(T.nilable(String)) }
79
+ def receive_raw
80
+ end
81
+
82
+ sig { params(event: ClientEvent).void }
83
+ def send_event(event)
84
+ end
85
+
86
+ sig do
87
+ params(timeout: Numeric, block: T.proc.params(event: ServerEvent).void)
88
+ .returns(OpenAI::Realtime::RealtimeTranslationSessionClosedEvent)
89
+ end
90
+ def finish(timeout:, &block)
91
+ end
92
+
93
+ sig { params(data: String).void }
94
+ def send_raw(data)
95
+ end
96
+
97
+ sig { params(code: Integer, reason: String).void }
98
+ def close(code: 1000, reason: "")
99
+ end
100
+
101
+ sig { void }
102
+ def abort
103
+ end
104
+
105
+ sig { returns(T::Boolean) }
106
+ def closed?
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ module Resources
113
+ class Realtime
114
+ sig do
115
+ type_parameters(:T)
116
+ .params(
117
+ model: String,
118
+ websocket_base_url: T.nilable(String),
119
+ request_options: T.nilable(OpenAI::RequestOptions::OrHash),
120
+ transport: T.untyped,
121
+ transport_options: T::Hash[Symbol, T.anything],
122
+ block: T.proc.params(connection: OpenAI::Realtime::TranslationConnection).returns(T.type_parameter(:T))
123
+ )
124
+ .returns(T.type_parameter(:T))
125
+ end
126
+ def connect_translation(
127
+ model:,
128
+ websocket_base_url: nil,
129
+ request_options: nil,
130
+ transport: nil,
131
+ transport_options: {},
132
+ &block
133
+ )
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,32 @@
1
+ # typed: strong
2
+
3
+ module OpenAI
4
+ module Models
5
+ module Responses
6
+ class IncrementalResponse
7
+ sig { returns(T.attached_class) }
8
+ def self.new
9
+ end
10
+
11
+ sig { returns(T.nilable(Symbol)) }
12
+ attr_reader :phase
13
+
14
+ sig { returns(T.nilable(T::Array[T.any(ResponseOutputItem::Variants, T::Hash[Symbol, T.untyped])])) }
15
+ def output
16
+ end
17
+
18
+ sig { returns(T.nilable(Connection::ServerEvent)) }
19
+ def terminal_event
20
+ end
21
+
22
+ sig { params(event: Connection::ServerEvent).void }
23
+ def add(event)
24
+ end
25
+
26
+ sig { void }
27
+ def reset
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -5,6 +5,30 @@ module OpenAI
5
5
  module Responses
6
6
  module Transports
7
7
  class AsyncWebSocket
8
+ # @api private
9
+ module PeekableFramer
10
+ # @api private
11
+ sig { returns(T::Boolean) }
12
+ def next_frame_compressed?
13
+ end
14
+ end
15
+
16
+ # @api private
17
+ class BoundedFramer
18
+ # @api private
19
+ sig { params(value: T::Boolean).returns(T::Boolean) }
20
+ def compression_negotiated=(value)
21
+ end
22
+ end
23
+
24
+ # @api private
25
+ module BoundedInflate
26
+ # @api private
27
+ sig { params(max_bytes: Integer, framer: BoundedFramer).void }
28
+ def bound_decoded_messages(max_bytes, framer)
29
+ end
30
+ end
31
+
8
32
  sig { void }
9
33
  def initialize
10
34
  end
@@ -96,6 +96,11 @@ module OpenAI
96
96
  def accumulate_event(event:, current_snapshot:)
97
97
  end
98
98
 
99
+ # @api private
100
+ sig { params(event: T.untyped, items: T::Array[T.untyped]).void }
101
+ def accumulate_output(event, items)
102
+ end
103
+
99
104
  private
100
105
 
101
106
  sig { params(value: String, delta: String).returns(String) }
@@ -14,6 +14,7 @@ module OpenAI
14
14
  CoerceState = T.type_alias do
15
15
  {
16
16
  translate_names: T::Boolean,
17
+ request_only: T::Boolean,
17
18
  strictness: T::Boolean,
18
19
  exactness: {
19
20
  yes: Integer,
@@ -122,11 +123,11 @@ module OpenAI
122
123
 
123
124
  # @api private
124
125
  sig do
125
- params(translate_names: T::Boolean).returns(
126
+ params(translate_names: T::Boolean, request_only: T::Boolean).returns(
126
127
  OpenAI::Internal::Type::Converter::CoerceState
127
128
  )
128
129
  end
129
- def self.new_coerce_state(translate_names: true)
130
+ def self.new_coerce_state(translate_names: true, request_only: false)
130
131
  end
131
132
 
132
133
  # @api private
@@ -249,6 +249,9 @@ module OpenAI
249
249
  VERSE = T.let(:verse, OpenAI::Audio::SpeechCreateParams::Voice::TaggedSymbol)
250
250
  MARIN = T.let(:marin, OpenAI::Audio::SpeechCreateParams::Voice::TaggedSymbol)
251
251
  CEDAR = T.let(:cedar, OpenAI::Audio::SpeechCreateParams::Voice::TaggedSymbol)
252
+ FABLE = T.let(:fable, OpenAI::Audio::SpeechCreateParams::Voice::TaggedSymbol)
253
+ ONYX = T.let(:onyx, OpenAI::Audio::SpeechCreateParams::Voice::TaggedSymbol)
254
+ NOVA = T.let(:nova, OpenAI::Audio::SpeechCreateParams::Voice::TaggedSymbol)
252
255
 
253
256
  end
254
257
 
@@ -14,7 +14,8 @@ module OpenAI
14
14
  T.any(
15
15
  OpenAI::Audio::Transcription,
16
16
  OpenAI::Audio::TranscriptionDiarized,
17
- OpenAI::Audio::TranscriptionVerbose
17
+ OpenAI::Audio::TranscriptionVerbose,
18
+ StringIO
18
19
  )
19
20
  end
20
21
 
@@ -11,7 +11,8 @@ module OpenAI
11
11
  Variants = T.type_alias do
12
12
  T.any(
13
13
  OpenAI::Audio::Translation,
14
- OpenAI::Audio::TranslationVerbose
14
+ OpenAI::Audio::TranslationVerbose,
15
+ StringIO
15
16
  )
16
17
  end
17
18
 
@@ -106,7 +106,8 @@ module OpenAI
106
106
  OpenAI::Beta::PersistedAgentTool::ToolSearch::OrHash,
107
107
  OpenAI::Beta::PersistedAgentTool::ProgrammaticToolCalling::OrHash,
108
108
  OpenAI::Beta::PersistedAgentTool::Mcp::OrHash,
109
- OpenAI::Beta::PersistedAgentTool::WebSearch::OrHash
109
+ OpenAI::Beta::PersistedAgentTool::WebSearch::OrHash,
110
+ OpenAI::Beta::PersistedAgentTool::ComputerUse::OrHash
110
111
  )
111
112
  ],
112
113
 
@@ -195,6 +196,7 @@ module OpenAI
195
196
  FLEX = T.let(:flex, OpenAI::Beta::Agent::ServiceTier::TaggedSymbol)
196
197
  PRIORITY = T.let(:priority, OpenAI::Beta::Agent::ServiceTier::TaggedSymbol)
197
198
  FAST = T.let(:fast, OpenAI::Beta::Agent::ServiceTier::TaggedSymbol)
199
+ ULTRAFAST = T.let(:ultrafast, OpenAI::Beta::Agent::ServiceTier::TaggedSymbol)
198
200
 
199
201
  sig { override.returns(T::Array[OpenAI::Beta::Agent::ServiceTier::TaggedSymbol]) }
200
202
  def self.values
@@ -0,0 +1,53 @@
1
+ # typed: strong
2
+
3
+ module OpenAI
4
+ module Models
5
+
6
+ module Beta
7
+
8
+ class AgentBrowserAuthenticationCancelParam < OpenAI::Internal::Type::BaseModel
9
+
10
+ OrHash = T.type_alias do
11
+ T.any(
12
+ OpenAI::Beta::AgentBrowserAuthenticationCancelParam,
13
+ OpenAI::Internal::AnyHash
14
+ )
15
+ end
16
+
17
+ sig { returns(Symbol) }
18
+ attr_accessor :action
19
+
20
+ sig { returns(Symbol) }
21
+ attr_accessor :type
22
+
23
+ sig do
24
+ params(
25
+
26
+ action: Symbol,
27
+
28
+ type: Symbol
29
+ )
30
+ .returns(T.attached_class)
31
+ end
32
+ def self.new(
33
+
34
+ action: :cancel,
35
+
36
+ type: :browser_authentication
37
+ )
38
+ end
39
+
40
+ sig do
41
+ override.returns(
42
+ {action: Symbol, type: Symbol}
43
+ )
44
+ end
45
+ def to_hash
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+ end