openai 0.105.0 → 0.107.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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +67 -0
  3. data/README.md +1 -1
  4. data/lib/openai/helpers/live/websocket.rb +12 -141
  5. data/lib/openai/helpers/local_audio/process.rb +13 -3
  6. data/lib/openai/helpers/models/embedding.rb +42 -0
  7. data/lib/openai/helpers/realtime/connection.rb +22 -5
  8. data/lib/openai/helpers/realtime/recovery.rb +11 -5
  9. data/lib/openai/helpers/realtime/translation.rb +37 -169
  10. data/lib/openai/helpers/realtime/unknown_server_event.rb +5 -12
  11. data/lib/openai/helpers/responses_websocket/connection.rb +56 -35
  12. data/lib/openai/helpers/responses_websocket/unknown_server_event.rb +2 -14
  13. data/lib/openai/helpers/websocket/async_websocket_transport.rb +8 -6
  14. data/lib/openai/helpers/websocket/client_request.rb +1 -1
  15. data/lib/openai/helpers/websocket/connection.rb +21 -10
  16. data/lib/openai/helpers/websocket/connection_manager.rb +2 -1
  17. data/lib/openai/helpers/websocket/protocol.rb +160 -0
  18. data/lib/openai/helpers/websocket/typed_connection.rb +22 -16
  19. data/lib/openai/helpers/websocket/typed_resource.rb +15 -0
  20. data/lib/openai/internal/transport/base_client.rb +1 -1
  21. data/lib/openai/models/admin/organization/external_storage_configuration.rb +1 -0
  22. data/lib/openai/models/admin/organization/usage_audio_speeches_response.rb +12 -1
  23. data/lib/openai/models/admin/organization/usage_audio_transcriptions_response.rb +12 -1
  24. data/lib/openai/models/admin/organization/usage_code_interpreter_sessions_response.rb +12 -1
  25. data/lib/openai/models/admin/organization/usage_completions_response.rb +12 -1
  26. data/lib/openai/models/admin/organization/usage_costs_response.rb +12 -1
  27. data/lib/openai/models/admin/organization/usage_decisions_response.rb +12 -1
  28. data/lib/openai/models/admin/organization/usage_embeddings_response.rb +12 -1
  29. data/lib/openai/models/admin/organization/usage_file_search_calls_response.rb +12 -1
  30. data/lib/openai/models/admin/organization/usage_images_response.rb +12 -1
  31. data/lib/openai/models/admin/organization/usage_moderations_response.rb +12 -1
  32. data/lib/openai/models/admin/organization/usage_vector_stores_response.rb +12 -1
  33. data/lib/openai/models/admin/organization/usage_web_search_calls_response.rb +12 -1
  34. data/lib/openai/models/beta/agent_create_params.rb +3 -0
  35. data/lib/openai/models/beta/agent_update_params.rb +3 -0
  36. data/lib/openai/models/beta/agents/session_create_params.rb +3 -0
  37. data/lib/openai/models/beta/agents/session_update_params.rb +3 -0
  38. data/lib/openai/models/beta/assistant_update_params.rb +12 -0
  39. data/lib/openai/models/beta/beta_response.rb +12 -0
  40. data/lib/openai/models/beta/beta_response_input_item.rb +10 -1
  41. data/lib/openai/models/beta/beta_responses_client_event.rb +12 -0
  42. data/lib/openai/models/beta/response_compact_params.rb +12 -0
  43. data/lib/openai/models/beta/response_create_params.rb +12 -0
  44. data/lib/openai/models/chat_model.rb +12 -0
  45. data/lib/openai/models/decision_create_params.rb +112 -1
  46. data/lib/openai/models/decision_input_image.rb +14 -1
  47. data/lib/openai/models/decision_input_text.rb +15 -1
  48. data/lib/openai/models/decision_prompt_cache_breakpoint.rb +21 -0
  49. data/lib/openai/models/live/sideband_server_event.rb +243 -3
  50. data/lib/openai/models/responses/response_compact_params.rb +12 -0
  51. data/lib/openai/models/responses/response_input_item.rb +10 -1
  52. data/lib/openai/models.rb +2 -0
  53. data/lib/openai/resources/beta/responses.rb +19 -0
  54. data/lib/openai/resources/decisions.rb +15 -1
  55. data/lib/openai/version.rb +1 -1
  56. data/lib/openai.rb +2 -0
  57. data/rbi/openai/client.rbi +1 -8
  58. data/rbi/openai/helpers/realtime/translation.rbi +0 -5
  59. data/rbi/openai/helpers/realtime/unknown_server_event.rbi +6 -0
  60. data/rbi/openai/helpers/websocket.rbi +44 -6
  61. data/rbi/openai/internal/transport/base_client.rbi +2 -6
  62. data/rbi/openai/models/admin/organization/external_storage_configuration.rbi +1 -0
  63. data/rbi/openai/models/admin/organization/usage_audio_speeches_response.rbi +12 -0
  64. data/rbi/openai/models/admin/organization/usage_audio_transcriptions_response.rbi +12 -0
  65. data/rbi/openai/models/admin/organization/usage_code_interpreter_sessions_response.rbi +12 -0
  66. data/rbi/openai/models/admin/organization/usage_completions_response.rbi +12 -0
  67. data/rbi/openai/models/admin/organization/usage_costs_response.rbi +12 -0
  68. data/rbi/openai/models/admin/organization/usage_decisions_response.rbi +12 -0
  69. data/rbi/openai/models/admin/organization/usage_embeddings_response.rbi +12 -0
  70. data/rbi/openai/models/admin/organization/usage_file_search_calls_response.rbi +12 -0
  71. data/rbi/openai/models/admin/organization/usage_images_response.rbi +12 -0
  72. data/rbi/openai/models/admin/organization/usage_moderations_response.rbi +12 -0
  73. data/rbi/openai/models/admin/organization/usage_vector_stores_response.rbi +12 -0
  74. data/rbi/openai/models/admin/organization/usage_web_search_calls_response.rbi +12 -0
  75. data/rbi/openai/models/beta/agent_create_params.rbi +3 -0
  76. data/rbi/openai/models/beta/agent_update_params.rbi +3 -0
  77. data/rbi/openai/models/beta/agents/session_create_params.rbi +3 -0
  78. data/rbi/openai/models/beta/agents/session_update_params.rbi +3 -0
  79. data/rbi/openai/models/beta/beta_response_input_item.rbi +14 -1
  80. data/rbi/openai/models/decision_create_params.rbi +146 -0
  81. data/rbi/openai/models/decision_input_image.rbi +22 -1
  82. data/rbi/openai/models/decision_input_text.rbi +21 -1
  83. data/rbi/openai/models/decision_prompt_cache_breakpoint.rbi +48 -0
  84. data/rbi/openai/models/live/output_audio_delta_event.rbi +1 -1
  85. data/rbi/openai/models/live/sideband_server_event.rbi +406 -3
  86. data/rbi/openai/models/responses/response_input_item.rbi +10 -1
  87. data/rbi/openai/models.rbi +2 -0
  88. data/rbi/openai/resources/beta/responses.rbi +17 -0
  89. data/rbi/openai/resources/decisions.rbi +14 -0
  90. data/realtime.md +22 -3
  91. data/sig/openai/client.rbs +1 -1
  92. data/sig/openai/helpers/realtime/translation.rbs +0 -2
  93. data/sig/openai/helpers/realtime/unknown_server_event.rbs +2 -0
  94. data/sig/openai/helpers/websocket.rbs +23 -6
  95. data/sig/openai/models/admin/organization/external_storage_configuration.rbs +2 -1
  96. data/sig/openai/models/admin/organization/usage_audio_speeches_response.rbs +10 -0
  97. data/sig/openai/models/admin/organization/usage_audio_transcriptions_response.rbs +10 -0
  98. data/sig/openai/models/admin/organization/usage_code_interpreter_sessions_response.rbs +10 -0
  99. data/sig/openai/models/admin/organization/usage_completions_response.rbs +10 -0
  100. data/sig/openai/models/admin/organization/usage_costs_response.rbs +10 -0
  101. data/sig/openai/models/admin/organization/usage_decisions_response.rbs +10 -0
  102. data/sig/openai/models/admin/organization/usage_embeddings_response.rbs +10 -0
  103. data/sig/openai/models/admin/organization/usage_file_search_calls_response.rbs +10 -0
  104. data/sig/openai/models/admin/organization/usage_images_response.rbs +10 -0
  105. data/sig/openai/models/admin/organization/usage_moderations_response.rbs +10 -0
  106. data/sig/openai/models/admin/organization/usage_vector_stores_response.rbs +10 -0
  107. data/sig/openai/models/admin/organization/usage_web_search_calls_response.rbs +10 -0
  108. data/sig/openai/models/beta/agent_create_params.rbs +5 -1
  109. data/sig/openai/models/beta/agent_update_params.rbs +5 -1
  110. data/sig/openai/models/beta/agents/session_create_params.rbs +5 -1
  111. data/sig/openai/models/beta/agents/session_update_params.rbs +5 -1
  112. data/sig/openai/models/beta/beta_response_input_item.rbs +8 -0
  113. data/sig/openai/models/decision_create_params.rbs +106 -0
  114. data/sig/openai/models/decision_input_image.rbs +18 -2
  115. data/sig/openai/models/decision_input_text.rbs +29 -3
  116. data/sig/openai/models/decision_prompt_cache_breakpoint.rbs +16 -0
  117. data/sig/openai/models/live/sideband_server_event.rbs +225 -0
  118. data/sig/openai/models/responses/response_input_item.rbs +8 -3
  119. data/sig/openai/models.rbs +2 -0
  120. data/sig/openai/resources/beta/responses.rbs +7 -0
  121. data/sig/openai/resources/decisions.rbs +3 -0
  122. metadata +6 -1
@@ -3,8 +3,8 @@
3
3
  module OpenAI
4
4
  module Models
5
5
  module Live
6
- # Server events received by an attached Live sideband WebSocket. Audio deltas are
7
- # delivered over the primary connection.
6
+ # Server events received by an attached Live sideband WebSocket, including
7
+ # reflected input and output audio and transport notifications.
8
8
  module SidebandServerEvent
9
9
  extend OpenAI::Internal::Type::Union
10
10
 
@@ -70,8 +70,248 @@ module OpenAI
70
70
  # An informational notice about the Live session, such as the event permissions applied to a frontend data channel.
71
71
  variant :info, -> { OpenAI::Live::InfoEvent }
72
72
 
73
+ # Input audio received from the primary transport and reflected to a Live sideband connection before model-input muting.
74
+ variant :"session.input_audio.append", -> { OpenAI::Live::SidebandServerEvent::SessionInputAudioAppend }
75
+
76
+ # An audio chunk generated by the Live model. Decode and play primary WebSocket chunks in delivery order using the configured session audio format. Sideband connections receive reflected output audio with timestamps.
77
+ variant :"session.output_audio.delta", -> { OpenAI::Live::OutputAudioDeltaEvent }
78
+
79
+ # A SIP DTMF keypress received from the caller. Delivered only to sideband observers.
80
+ variant :"transport.dtmf.received", -> { OpenAI::Live::SidebandServerEvent::TransportDtmfReceived }
81
+
82
+ # A SIP DTMF keypress successfully sent to the SIP trunk. Delivered only to sideband observers; this is not a client command.
83
+ variant :"transport.dtmf.send", -> { OpenAI::Live::SidebandServerEvent::TransportDtmfSend }
84
+
85
+ # The outbound SIP provider leg is ringing or providing early media. Delivered only to sideband observers.
86
+ variant :"transport.ringing", -> { OpenAI::Live::SidebandServerEvent::TransportRinging }
87
+
88
+ # The outbound SIP provider leg answered and media is established. Delivered only to sideband observers.
89
+ variant :"transport.answered", -> { OpenAI::Live::SidebandServerEvent::TransportAnswered }
90
+
91
+ # An asynchronous outbound SIP setup failure. Delivered only to sideband observers.
92
+ variant :"transport.failed", -> { OpenAI::Live::SidebandServerEvent::TransportFailed }
93
+
94
+ class SessionInputAudioAppend < OpenAI::Internal::Type::BaseModel
95
+ # @!attribute audio
96
+ # Base64-encoded raw mono PCM16LE at 24 kHz received from the primary transport,
97
+ # reflected to the sideband before model-input muting. This server event uses the
98
+ # same audio key as the client command, but is not an acknowledgment of it.
99
+ #
100
+ # @return [String]
101
+ required :audio, String
102
+
103
+ # @!attribute type
104
+ # The event type, always `session.input_audio.append`.
105
+ #
106
+ # @return [Symbol, :"session.input_audio.append"]
107
+ required :type, const: :"session.input_audio.append"
108
+
109
+ # @!method initialize(audio:, type: :"session.input_audio.append")
110
+ # Input audio received from the primary transport and reflected to a Live sideband
111
+ # connection before model-input muting.
112
+ #
113
+ # @param audio [String]
114
+ # Base64-encoded raw mono PCM16LE at 24 kHz received from the primary transport,
115
+ # reflected to the sideband before model-input muting. This server event uses the
116
+ # same audio key as the client command, but is not an acknowledgment of it.
117
+ #
118
+ # @param type [Symbol, :"session.input_audio.append"]
119
+ # The event type, always `session.input_audio.append`.
120
+ end
121
+
122
+ class TransportDtmfReceived < OpenAI::Internal::Type::BaseModel
123
+ # @!attribute event
124
+ #
125
+ # @return [String]
126
+ required :event, String
127
+
128
+ # @!attribute event_id
129
+ #
130
+ # @return [String]
131
+ required :event_id, String
132
+
133
+ # @!attribute type
134
+ #
135
+ # @return [Symbol, :"transport.dtmf.received"]
136
+ required :type, const: :"transport.dtmf.received"
137
+
138
+ # @!method initialize(event:, event_id:, type: :"transport.dtmf.received")
139
+ # A SIP DTMF keypress received from the caller. Delivered only to sideband
140
+ # observers.
141
+ #
142
+ # @param event [String]
143
+ # @param event_id [String]
144
+ # @param type [Symbol, :"transport.dtmf.received"]
145
+ end
146
+
147
+ class TransportDtmfSend < OpenAI::Internal::Type::BaseModel
148
+ # @!attribute event
149
+ #
150
+ # @return [String]
151
+ required :event, String
152
+
153
+ # @!attribute event_id
154
+ #
155
+ # @return [String]
156
+ required :event_id, String
157
+
158
+ # @!attribute type
159
+ #
160
+ # @return [Symbol, :"transport.dtmf.send"]
161
+ required :type, const: :"transport.dtmf.send"
162
+
163
+ # @!attribute client_event_id
164
+ # The event_id of the client command, when supplied.
165
+ #
166
+ # @return [String, nil]
167
+ optional :client_event_id, String
168
+
169
+ # @!method initialize(event:, event_id:, client_event_id: nil, type: :"transport.dtmf.send")
170
+ # A SIP DTMF keypress successfully sent to the SIP trunk. Delivered only to
171
+ # sideband observers; this is not a client command.
172
+ #
173
+ # @param event [String]
174
+ #
175
+ # @param event_id [String]
176
+ #
177
+ # @param client_event_id [String]
178
+ # The event_id of the client command, when supplied.
179
+ #
180
+ # @param type [Symbol, :"transport.dtmf.send"]
181
+ end
182
+
183
+ class TransportRinging < OpenAI::Internal::Type::BaseModel
184
+ # @!attribute event_id
185
+ #
186
+ # @return [String]
187
+ required :event_id, String
188
+
189
+ # @!attribute session_id
190
+ # The canonical Live session ID.
191
+ #
192
+ # @return [String]
193
+ required :session_id, String
194
+
195
+ # @!attribute type
196
+ #
197
+ # @return [Symbol, :"transport.ringing"]
198
+ required :type, const: :"transport.ringing"
199
+
200
+ # @!method initialize(event_id:, session_id:, type: :"transport.ringing")
201
+ # The outbound SIP provider leg is ringing or providing early media. Delivered
202
+ # only to sideband observers.
203
+ #
204
+ # @param event_id [String]
205
+ #
206
+ # @param session_id [String]
207
+ # The canonical Live session ID.
208
+ #
209
+ # @param type [Symbol, :"transport.ringing"]
210
+ end
211
+
212
+ class TransportAnswered < OpenAI::Internal::Type::BaseModel
213
+ # @!attribute event_id
214
+ #
215
+ # @return [String]
216
+ required :event_id, String
217
+
218
+ # @!attribute session_id
219
+ # The canonical Live session ID.
220
+ #
221
+ # @return [String]
222
+ required :session_id, String
223
+
224
+ # @!attribute type
225
+ #
226
+ # @return [Symbol, :"transport.answered"]
227
+ required :type, const: :"transport.answered"
228
+
229
+ # @!method initialize(event_id:, session_id:, type: :"transport.answered")
230
+ # The outbound SIP provider leg answered and media is established. Delivered only
231
+ # to sideband observers.
232
+ #
233
+ # @param event_id [String]
234
+ #
235
+ # @param session_id [String]
236
+ # The canonical Live session ID.
237
+ #
238
+ # @param type [Symbol, :"transport.answered"]
239
+ end
240
+
241
+ class TransportFailed < OpenAI::Internal::Type::BaseModel
242
+ # @!attribute error
243
+ #
244
+ # @return [OpenAI::Models::Live::SidebandServerEvent::TransportFailed::Error]
245
+ required :error, -> { OpenAI::Live::SidebandServerEvent::TransportFailed::Error }
246
+
247
+ # @!attribute event_id
248
+ #
249
+ # @return [String]
250
+ required :event_id, String
251
+
252
+ # @!attribute session_id
253
+ # The canonical Live session ID.
254
+ #
255
+ # @return [String]
256
+ required :session_id, String
257
+
258
+ # @!attribute type
259
+ #
260
+ # @return [Symbol, :"transport.failed"]
261
+ required :type, const: :"transport.failed"
262
+
263
+ # @!method initialize(error:, event_id:, session_id:, type: :"transport.failed")
264
+ # An asynchronous outbound SIP setup failure. Delivered only to sideband
265
+ # observers.
266
+ #
267
+ # @param error [OpenAI::Models::Live::SidebandServerEvent::TransportFailed::Error]
268
+ #
269
+ # @param event_id [String]
270
+ #
271
+ # @param session_id [String]
272
+ # The canonical Live session ID.
273
+ #
274
+ # @param type [Symbol, :"transport.failed"]
275
+
276
+ # @see OpenAI::Models::Live::SidebandServerEvent::TransportFailed#error
277
+ class Error < OpenAI::Internal::Type::BaseModel
278
+ # @!attribute code
279
+ # The call setup failure code.
280
+ #
281
+ # @return [String]
282
+ required :code, String
283
+
284
+ # @!attribute message
285
+ #
286
+ # @return [String]
287
+ required :message, String
288
+
289
+ # @!attribute type
290
+ #
291
+ # @return [Symbol, :call_error]
292
+ required :type, const: :call_error
293
+
294
+ # @!attribute param
295
+ # The parameter related to the error, if any. Empty when no parameter applies.
296
+ #
297
+ # @return [String, nil]
298
+ optional :param, String
299
+
300
+ # @!method initialize(code:, message:, param: nil, type: :call_error)
301
+ # @param code [String]
302
+ # The call setup failure code.
303
+ #
304
+ # @param message [String]
305
+ #
306
+ # @param param [String]
307
+ # The parameter related to the error, if any. Empty when no parameter applies.
308
+ #
309
+ # @param type [Symbol, :call_error]
310
+ end
311
+ end
312
+
73
313
  # @!method self.variants
74
- # @return [Array(OpenAI::Models::Live::SessionStartedEvent, OpenAI::Models::Live::SessionUpdatedEvent, OpenAI::Models::Live::InputAudioMutedEvent, OpenAI::Models::Live::InputAudioUnmutedEvent, OpenAI::Models::Live::OutputAudioFixturePlayingEvent, OpenAI::Models::Live::OutputAudioFixturePlayedEvent, OpenAI::Models::Live::InstructionsAppendedEvent, OpenAI::Models::Live::ThinkingAppendedEvent, OpenAI::Models::Live::CommentaryAppendedEvent, OpenAI::Models::Live::InputTranscriptDeltaEvent, OpenAI::Models::Live::OutputTranscriptDeltaEvent, OpenAI::Models::Live::DelegationCreatedEvent, OpenAI::Models::Live::DecisionEvent, OpenAI::Models::Live::DecisionItemCreatedEvent, OpenAI::Models::Live::DecisionItemDeletedEvent, OpenAI::Models::Live::ResponseEvent, OpenAI::Models::Live::SessionUsageUpdatedEvent, OpenAI::Models::Live::SessionClosedEvent, OpenAI::Models::Live::ErrorEvent, OpenAI::Models::Live::InfoEvent)]
314
+ # @return [Array(OpenAI::Models::Live::SessionStartedEvent, OpenAI::Models::Live::SessionUpdatedEvent, OpenAI::Models::Live::InputAudioMutedEvent, OpenAI::Models::Live::InputAudioUnmutedEvent, OpenAI::Models::Live::OutputAudioFixturePlayingEvent, OpenAI::Models::Live::OutputAudioFixturePlayedEvent, OpenAI::Models::Live::InstructionsAppendedEvent, OpenAI::Models::Live::ThinkingAppendedEvent, OpenAI::Models::Live::CommentaryAppendedEvent, OpenAI::Models::Live::InputTranscriptDeltaEvent, OpenAI::Models::Live::OutputTranscriptDeltaEvent, OpenAI::Models::Live::DelegationCreatedEvent, OpenAI::Models::Live::DecisionEvent, OpenAI::Models::Live::DecisionItemCreatedEvent, OpenAI::Models::Live::DecisionItemDeletedEvent, OpenAI::Models::Live::ResponseEvent, OpenAI::Models::Live::SessionUsageUpdatedEvent, OpenAI::Models::Live::SessionClosedEvent, OpenAI::Models::Live::ErrorEvent, OpenAI::Models::Live::InfoEvent, OpenAI::Models::Live::SidebandServerEvent::SessionInputAudioAppend, OpenAI::Models::Live::OutputAudioDeltaEvent, OpenAI::Models::Live::SidebandServerEvent::TransportDtmfReceived, OpenAI::Models::Live::SidebandServerEvent::TransportDtmfSend, OpenAI::Models::Live::SidebandServerEvent::TransportRinging, OpenAI::Models::Live::SidebandServerEvent::TransportAnswered, OpenAI::Models::Live::SidebandServerEvent::TransportFailed)]
75
315
  end
76
316
  end
77
317
  end
@@ -486,7 +486,13 @@ module OpenAI
486
486
  # https://developers.openai.com/api/docs/deprecations for details and recommended
487
487
  # replacements.
488
488
  GPT_5_CHAT_LATEST = :"gpt-5-chat-latest"
489
+ # @deprecated Announced shutdown date: 2027-01-14. See
490
+ # https://developers.openai.com/api/docs/deprecations for details and recommended
491
+ # replacements.
489
492
  GPT_4_1 = :"gpt-4.1"
493
+ # @deprecated Announced shutdown date: 2027-01-14. See
494
+ # https://developers.openai.com/api/docs/deprecations for details and recommended
495
+ # replacements.
490
496
  GPT_4_1_MINI = :"gpt-4.1-mini"
491
497
  # @deprecated Announced shutdown date: 2026-10-23. See
492
498
  # https://developers.openai.com/api/docs/deprecations for details and recommended
@@ -552,6 +558,9 @@ module OpenAI
552
558
  # https://developers.openai.com/api/docs/deprecations for details and recommended
553
559
  # replacements.
554
560
  O1_MINI_2024_09_12 = :"o1-mini-2024-09-12"
561
+ # @deprecated Announced shutdown date: 2027-01-14. See
562
+ # https://developers.openai.com/api/docs/deprecations for details and recommended
563
+ # replacements.
555
564
  GPT_4O = :"gpt-4o"
556
565
  # @deprecated Announced shutdown date: 2027-01-14. See
557
566
  # https://developers.openai.com/api/docs/deprecations for details and recommended
@@ -621,6 +630,9 @@ module OpenAI
621
630
  # https://developers.openai.com/api/docs/deprecations for details and recommended
622
631
  # replacements.
623
632
  CODEX_MINI_LATEST = :"codex-mini-latest"
633
+ # @deprecated Announced shutdown date: 2027-01-14. See
634
+ # https://developers.openai.com/api/docs/deprecations for details and recommended
635
+ # replacements.
624
636
  GPT_4O_MINI = :"gpt-4o-mini"
625
637
  # @deprecated Announced shutdown date: 2027-01-14. See
626
638
  # https://developers.openai.com/api/docs/deprecations for details and recommended
@@ -2177,9 +2177,18 @@ module OpenAI
2177
2177
  # @return [Symbol, :compaction_trigger]
2178
2178
  required :type, const: :compaction_trigger
2179
2179
 
2180
- # @!method initialize(type: :compaction_trigger)
2180
+ # @!attribute id
2181
+ # The unique ID of this compaction trigger.
2182
+ #
2183
+ # @return [String, nil]
2184
+ optional :id, String, nil?: true
2185
+
2186
+ # @!method initialize(id: nil, type: :compaction_trigger)
2181
2187
  # Compacts the current context. Must be the final input item.
2182
2188
  #
2189
+ # @param id [String, nil]
2190
+ # The unique ID of this compaction trigger.
2191
+ #
2183
2192
  # @param type [Symbol, :compaction_trigger]
2184
2193
  # The type of the item. Always `compaction_trigger`.
2185
2194
  end
data/lib/openai/models.rb CHANGED
@@ -125,6 +125,8 @@ module OpenAI
125
125
 
126
126
  DecisionInputText = OpenAI::Models::DecisionInputText
127
127
 
128
+ DecisionPromptCacheBreakpoint = OpenAI::Models::DecisionPromptCacheBreakpoint
129
+
128
130
  DeletedSkill = OpenAI::Models::DeletedSkill
129
131
 
130
132
  Embedding = OpenAI::Models::Embedding
@@ -1,10 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "../../helpers/websocket/resource"
4
+
3
5
  module OpenAI
4
6
  module Resources
5
7
  class Beta
6
8
  # Create and manage model responses.
7
9
  class Responses
10
+ include OpenAI::WebSocket::Resource
11
+
12
+ # @api private
13
+ def __websocket_request(query: {})
14
+ {method: :get, path: "responses", query: query, security: {bearer_auth: true}}
15
+ end
16
+
17
+ # @api private
18
+ def __websocket_client_event
19
+ OpenAI::Models::Beta::BetaResponsesClientEvent
20
+ end
21
+
22
+ # @api private
23
+ def __websocket_server_event
24
+ OpenAI::Models::Beta::BetaResponsesServerEvent
25
+ end
26
+
8
27
  # Create and manage model responses.
9
28
  # @return [OpenAI::Resources::Beta::Responses::InputItems]
10
29
  attr_reader :input_items
@@ -6,7 +6,7 @@ module OpenAI
6
6
  # Use this endpoint to quickly answer classification or scoring questions about
7
7
  # some input. You can ask multiple questions in one request.
8
8
  #
9
- # @overload create(input:, model:, questions:, safety_identifier: nil, request_options: {})
9
+ # @overload create(input:, model:, questions:, prompt_cache_key: nil, prompt_cache_options: nil, safety_identifier: nil, request_options: {})
10
10
  #
11
11
  # @param input [String, Array<OpenAI::Models::DecisionInputMessage>]
12
12
  # The text or images to evaluate for every question. Provide a text string or user
@@ -21,6 +21,20 @@ module OpenAI
21
21
  # Ask 1–200 questions about the input. Each question can be a predicate, choice,
22
22
  # or score. Answers come back in the same order.
23
23
  #
24
+ # @param prompt_cache_key [String, nil]
25
+ # Partition prompt cache reuse by caller-provided key.
26
+ #
27
+ # @param prompt_cache_options [OpenAI::Models::DecisionCreateParams::PromptCacheOptions, nil]
28
+ # Options for prompt caching. Supported for `gpt-5.6` and later models. By
29
+ # default, OpenAI automatically chooses one implicit cache breakpoint. You can add
30
+ # explicit breakpoints to content blocks with `prompt_cache_breakpoint`. Each
31
+ # request can write up to four breakpoints. For cache matching, OpenAI considers
32
+ # up to the latest 80 breakpoints in the conversation, without a content-block
33
+ # lookback limit. Set `mode` to `explicit` to disable the implicit breakpoint. The
34
+ # `ttl` defaults to `30m`, which is currently the only supported value. See the
35
+ # [prompt caching guide](https://developers.openai.com/api/docs/guides/prompt-caching)
36
+ # for current details.
37
+ #
24
38
  # @param safety_identifier [String, nil]
25
39
  # Opaque caller-provided end-user identifier, scoped by the verified org. Match
26
40
  # Responses' limit; this is never the authenticated user identity.
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OpenAI
4
- VERSION = "0.105.0"
4
+ VERSION = "0.107.0"
5
5
  end
data/lib/openai.rb CHANGED
@@ -973,6 +973,7 @@ require_relative "openai/models/decision_input_image"
973
973
  require_relative "openai/models/decision_input_message"
974
974
  require_relative "openai/models/decision_input_part"
975
975
  require_relative "openai/models/decision_input_text"
976
+ require_relative "openai/models/decision_prompt_cache_breakpoint"
976
977
  require_relative "openai/models/deleted_skill"
977
978
  require_relative "openai/models/embedding"
978
979
  require_relative "openai/models/embedding_create_params"
@@ -1646,6 +1647,7 @@ require_relative "openai/resources/vector_stores/files"
1646
1647
  require_relative "openai/resources/videos"
1647
1648
  require_relative "openai/resources/webhooks"
1648
1649
  require_relative "openai/resources/webhooks/event_types"
1650
+ require_relative "openai/helpers/models/embedding"
1649
1651
  require_relative "openai/helpers/models/responses/response"
1650
1652
  require_relative "openai/helpers/files"
1651
1653
  require_relative "openai/helpers/vector_stores/file_batches"
@@ -127,14 +127,7 @@ module OpenAI
127
127
 
128
128
  # @api private
129
129
  sig do
130
- override
131
- .params(
132
- security: {
133
- bearer_auth?: T::Boolean,
134
- admin_api_key_auth?: T::Boolean
135
- }
136
- )
137
- .returns(T::Hash[String, String])
130
+ override.params(security: T::Hash[Symbol, T::Boolean]).returns(T::Hash[String, String])
138
131
  end
139
132
  private def auth_headers(security:)
140
133
  end
@@ -36,11 +36,6 @@ module OpenAI
36
36
  module Models
37
37
  module Realtime
38
38
  class UnknownTranslationServerEvent < OpenAI::Realtime::UnknownServerEvent
39
- sig { returns(String) }
40
- def inspect
41
- end
42
-
43
- alias to_s inspect
44
39
  end
45
40
 
46
41
  class TranslationConnection
@@ -20,6 +20,12 @@ module OpenAI
20
20
  sig { returns(T::Hash[Symbol, T.untyped]) }
21
21
  def to_h
22
22
  end
23
+
24
+ sig { returns(String) }
25
+ def inspect
26
+ end
27
+
28
+ alias to_s inspect
23
29
  end
24
30
  end
25
31
  end
@@ -33,7 +33,42 @@ module OpenAI
33
33
  request_options: T.untyped,
34
34
  transport: T.untyped,
35
35
  transport_options: T::Hash[T.untyped, T.untyped],
36
- block: T.proc.params(connection: TypedConnection).returns(T.untyped)
36
+ block: T.proc.params(connection: TypedConnection[T.untyped, T.untyped]).returns(T.untyped)
37
+ )
38
+ .returns(T.untyped)
39
+ end
40
+ def connect(
41
+ *path_arguments,
42
+ query: {},
43
+ websocket_base_url: nil,
44
+ request_options: nil,
45
+ transport: nil,
46
+ transport_options: {},
47
+ &block
48
+ )
49
+ end
50
+ end
51
+
52
+ # @api private
53
+ module TypedResource
54
+ extend T::Generic
55
+ include Resource
56
+
57
+ WebSocketClientEvent = type_member
58
+ WebSocketServerEvent = type_member
59
+
60
+ sig do
61
+ params(
62
+ path_arguments: T.untyped,
63
+ query: T::Hash[T.untyped, T.untyped],
64
+ websocket_base_url: T.nilable(String),
65
+ request_options: T.untyped,
66
+ transport: T.untyped,
67
+ transport_options: T::Hash[T.untyped, T.untyped],
68
+ block: T
69
+ .proc
70
+ .params(connection: TypedConnection[WebSocketClientEvent, WebSocketServerEvent])
71
+ .returns(T.untyped)
37
72
  )
38
73
  .returns(T.untyped)
39
74
  end
@@ -51,23 +86,26 @@ module OpenAI
51
86
 
52
87
  # @api private
53
88
  class TypedConnection
89
+ extend T::Generic
54
90
  include Enumerable
55
- Elem = type_member { {fixed: T.untyped} }
91
+
92
+ ClientEvent = type_member(:in)
93
+ Elem = type_member(:out)
56
94
 
57
95
  sig { returns(URI::Generic) }
58
96
  attr_reader :url
59
97
 
60
- sig { returns(T.untyped) }
98
+ sig { returns(T.nilable(Elem)) }
61
99
  def receive
62
100
  end
63
101
 
64
- sig { params(event: T.untyped).void }
102
+ sig { params(event: T.any(ClientEvent, T::Hash[T.any(String, Symbol), T.untyped])).void }
65
103
  def send_event(event)
66
104
  end
67
105
 
68
106
  sig do
69
- params(block: T.nilable(T.proc.params(event: T.untyped).void)).returns(
70
- T.any(TypedConnection, T::Enumerator[T.untyped])
107
+ params(block: T.nilable(T.proc.params(event: Elem).void)).returns(
108
+ T.any(TypedConnection[ClientEvent, Elem], T::Enumerator[Elem])
71
109
  )
72
110
  end
73
111
  def each(&block)
@@ -53,9 +53,7 @@ module OpenAI
53
53
  ]
54
54
  ),
55
55
  model: T.nilable(OpenAI::Internal::Type::Converter::Input),
56
- security: T.nilable(
57
- {bearer_auth?: T::Boolean, admin_api_key_auth?: T::Boolean}
58
- ),
56
+ security: T.nilable(T::Hash[Symbol, T::Boolean]),
59
57
  options: T.nilable(OpenAI::RequestOptions::OrHash)
60
58
  }
61
59
  end
@@ -387,9 +385,7 @@ module OpenAI
387
385
  ]
388
386
  ),
389
387
  model: T.nilable(OpenAI::Internal::Type::Converter::Input),
390
- security: T.nilable(
391
- {bearer_auth?: T::Boolean, admin_api_key_auth?: T::Boolean}
392
- ),
388
+ security: T.nilable(T::Hash[Symbol, T::Boolean]),
393
389
  options: T.nilable(OpenAI::RequestOptions::OrHash)
394
390
  )
395
391
  .returns(T.anything)
@@ -128,6 +128,7 @@ module OpenAI
128
128
  :validated,
129
129
  OpenAI::Admin::Organization::ExternalStorageConfiguration::Status::TaggedSymbol
130
130
  )
131
+ DEGRADED = T.let(:degraded, OpenAI::Admin::Organization::ExternalStorageConfiguration::Status::TaggedSymbol)
131
132
  UNHEALTHY = T.let(
132
133
  :unhealthy,
133
134
  OpenAI::Admin::Organization::ExternalStorageConfiguration::Status::TaggedSymbol
@@ -227,6 +227,11 @@ module OpenAI
227
227
  sig { params(input_cache_write_12h_tokens: Integer).void }
228
228
  attr_writer :input_cache_write_12h_tokens
229
229
 
230
+ # The aggregated number of input tokens written to the cache with a 30-minute
231
+ # retention period. May be absent or null for older responses.
232
+ sig { returns(T.nilable(Integer)) }
233
+ attr_accessor :input_cache_write_30m_tokens
234
+
230
235
  # The aggregated number of input tokens written to the cache with a 30-minute
231
236
  # retention period.
232
237
  sig { returns(T.nilable(Integer)) }
@@ -350,6 +355,8 @@ module OpenAI
350
355
 
351
356
  input_cache_write_12h_tokens: Integer,
352
357
 
358
+ input_cache_write_30m_tokens: T.nilable(Integer),
359
+
353
360
  input_cache_write_tokens: Integer,
354
361
 
355
362
  input_cached_audio_tokens: Integer,
@@ -420,6 +427,10 @@ module OpenAI
420
427
  # retention period.
421
428
  input_cache_write_12h_tokens: nil,
422
429
 
430
+ # The aggregated number of input tokens written to the cache with a 30-minute
431
+ # retention period. May be absent or null for older responses.
432
+ input_cache_write_30m_tokens: nil,
433
+
423
434
  # The aggregated number of input tokens written to the cache with a 30-minute
424
435
  # retention period.
425
436
  input_cache_write_tokens: nil,
@@ -491,6 +502,7 @@ module OpenAI
491
502
  batch: T.nilable(T::Boolean),
492
503
  input_audio_tokens: Integer,
493
504
  input_cache_write_12h_tokens: Integer,
505
+ input_cache_write_30m_tokens: T.nilable(Integer),
494
506
  input_cache_write_tokens: Integer,
495
507
  input_cached_audio_tokens: Integer,
496
508
  input_cached_image_tokens: Integer,
@@ -229,6 +229,11 @@ module OpenAI
229
229
  sig { params(input_cache_write_12h_tokens: Integer).void }
230
230
  attr_writer :input_cache_write_12h_tokens
231
231
 
232
+ # The aggregated number of input tokens written to the cache with a 30-minute
233
+ # retention period. May be absent or null for older responses.
234
+ sig { returns(T.nilable(Integer)) }
235
+ attr_accessor :input_cache_write_30m_tokens
236
+
232
237
  # The aggregated number of input tokens written to the cache with a 30-minute
233
238
  # retention period.
234
239
  sig { returns(T.nilable(Integer)) }
@@ -352,6 +357,8 @@ module OpenAI
352
357
 
353
358
  input_cache_write_12h_tokens: Integer,
354
359
 
360
+ input_cache_write_30m_tokens: T.nilable(Integer),
361
+
355
362
  input_cache_write_tokens: Integer,
356
363
 
357
364
  input_cached_audio_tokens: Integer,
@@ -422,6 +429,10 @@ module OpenAI
422
429
  # retention period.
423
430
  input_cache_write_12h_tokens: nil,
424
431
 
432
+ # The aggregated number of input tokens written to the cache with a 30-minute
433
+ # retention period. May be absent or null for older responses.
434
+ input_cache_write_30m_tokens: nil,
435
+
425
436
  # The aggregated number of input tokens written to the cache with a 30-minute
426
437
  # retention period.
427
438
  input_cache_write_tokens: nil,
@@ -493,6 +504,7 @@ module OpenAI
493
504
  batch: T.nilable(T::Boolean),
494
505
  input_audio_tokens: Integer,
495
506
  input_cache_write_12h_tokens: Integer,
507
+ input_cache_write_30m_tokens: T.nilable(Integer),
496
508
  input_cache_write_tokens: Integer,
497
509
  input_cached_audio_tokens: Integer,
498
510
  input_cached_image_tokens: Integer,