openai 0.96.0 → 0.98.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 (176) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/README.md +76 -1
  4. data/lib/openai/helpers/agents/session_stream.rb +60 -3
  5. data/lib/openai/helpers/beta/agents/artifacts.rb +72 -0
  6. data/lib/openai/helpers/beta/agents/creation_stream.rb +69 -0
  7. data/lib/openai/helpers/beta/agents/files.rb +236 -0
  8. data/lib/openai/helpers/beta/agents/function_tool.rb +65 -0
  9. data/lib/openai/helpers/beta/agents/model_adapter.rb +27 -0
  10. data/lib/openai/helpers/beta/agents/result.rb +170 -0
  11. data/lib/openai/helpers/beta/agents/typed_output.rb +191 -0
  12. data/lib/openai/helpers/live/websocket.rb +7 -1
  13. data/lib/openai/helpers/realtime/conversation_item_variant_resolver.rb +1 -1
  14. data/lib/openai/helpers/responses_websocket/connection.rb +7 -1
  15. data/lib/openai/helpers/responses_websocket/session.rb +5 -1
  16. data/lib/openai/helpers/responses_websocket/transports/async_websocket.rb +12 -2
  17. data/lib/openai/internal/transport/base_client.rb +18 -0
  18. data/lib/openai/internal/type/array_of.rb +1 -1
  19. data/lib/openai/internal/type/base_model.rb +6 -3
  20. data/lib/openai/internal/type/converter.rb +50 -3
  21. data/lib/openai/internal/type/hash_of.rb +1 -1
  22. data/lib/openai/internal/type/union.rb +6 -6
  23. data/lib/openai/models/beta/agent.rb +2 -2
  24. data/lib/openai/models/beta/agent_browser_authentication_cancel_param.rb +23 -0
  25. data/lib/openai/models/beta/agent_browser_authentication_submit_param.rb +70 -0
  26. data/lib/openai/models/beta/agent_browser_origin_access_param.rb +45 -0
  27. data/lib/openai/models/beta/agent_create_params.rb +2 -2
  28. data/lib/openai/models/beta/agent_output_item.rb +276 -1
  29. data/lib/openai/models/beta/agent_session.rb +251 -5
  30. data/lib/openai/models/beta/agent_session_input_param.rb +64 -1
  31. data/lib/openai/models/beta/agent_session_item.rb +391 -1
  32. data/lib/openai/models/beta/agent_session_turn_item_added_event.rb +2 -2
  33. data/lib/openai/models/beta/agent_session_turn_item_done_event.rb +2 -2
  34. data/lib/openai/models/beta/agent_tool.rb +27 -1
  35. data/lib/openai/models/beta/agent_tool_param.rb +27 -1
  36. data/lib/openai/models/beta/agent_update_params.rb +2 -2
  37. data/lib/openai/models/beta/agents/environments/environment_template.rb +26 -2
  38. data/lib/openai/models/beta/agents/environments/template_create_params.rb +48 -3
  39. data/lib/openai/models/beta/agents/environments/template_update_params.rb +45 -3
  40. data/lib/openai/models/beta/agents/session_create_params.rb +2 -2
  41. data/lib/openai/models/beta/agents/sessions/event_create_params.rb +2 -2
  42. data/lib/openai/models/beta/agents/sessions/session_trace.rb +64 -0
  43. data/lib/openai/models/beta/agents/sessions/trace_list_params.rb +68 -0
  44. data/lib/openai/models/beta/agents/vaults/credential.rb +8 -4
  45. data/lib/openai/models/beta/beta_response_output_text.rb +2 -2
  46. data/lib/openai/models/beta/beta_response_output_text_annotation_added_event.rb +2 -2
  47. data/lib/openai/models/beta/environment.rb +58 -2
  48. data/lib/openai/models/beta/environment_param.rb +66 -3
  49. data/lib/openai/models/beta/persisted_agent_tool.rb +27 -1
  50. data/lib/openai/models/beta/persisted_agent_tool_param.rb +27 -1
  51. data/lib/openai/models/beta/session_turn_error.rb +3 -0
  52. data/lib/openai/models/chat/chat_completion_content_part_image.rb +1 -0
  53. data/lib/openai/models/live/fork_server_event.rb +14 -3
  54. data/lib/openai/models/live/server_event.rb +14 -3
  55. data/lib/openai/models/realtime/translations/client_secret_create_params.rb +28 -0
  56. data/lib/openai/models/responses/response_output_text.rb +2 -2
  57. data/lib/openai/models/responses/response_output_text_annotation_added_event.rb +2 -2
  58. data/lib/openai/resources/beta/agents/environments/files.rb +31 -0
  59. data/lib/openai/resources/beta/agents/environments/templates.rb +9 -2
  60. data/lib/openai/resources/beta/agents/sessions/artifacts.rb +8 -0
  61. data/lib/openai/resources/beta/agents/sessions/events.rb +7 -6
  62. data/lib/openai/resources/beta/agents/sessions/items.rb +1 -1
  63. data/lib/openai/resources/beta/agents/sessions/subagents/items.rb +1 -1
  64. data/lib/openai/resources/beta/agents/sessions/subagents/turns/items.rb +1 -1
  65. data/lib/openai/resources/beta/agents/sessions/traces.rb +58 -0
  66. data/lib/openai/resources/beta/agents/sessions.rb +18 -5
  67. data/lib/openai/resources/beta/agents.rb +2 -2
  68. data/lib/openai/resources/evals/runs.rb +1 -1
  69. data/lib/openai/resources/realtime/translations/client_secrets.rb +58 -0
  70. data/lib/openai/resources/realtime/translations.rb +20 -0
  71. data/lib/openai/resources/realtime.rb +4 -0
  72. data/lib/openai/version.rb +1 -1
  73. data/lib/openai.rb +12 -1
  74. data/rbi/openai/helpers/agents.rbi +20 -1
  75. data/rbi/openai/helpers/beta/agents/artifacts.rbi +29 -0
  76. data/rbi/openai/helpers/beta/agents/files.rbi +65 -0
  77. data/rbi/openai/helpers/beta/agents/function_tool.rbi +40 -0
  78. data/rbi/openai/helpers/beta/agents/model_adapter.rbi +22 -0
  79. data/rbi/openai/helpers/beta/agents.rbi +146 -0
  80. data/rbi/openai/internal/transport/base_client.rbi +12 -0
  81. data/rbi/openai/internal/type/base_model.rbi +2 -2
  82. data/rbi/openai/internal/type/converter.rbi +21 -3
  83. data/rbi/openai/internal/type/union.rbi +6 -2
  84. data/rbi/openai/models/beta/agent.rbi +2 -1
  85. data/rbi/openai/models/beta/agent_browser_authentication_cancel_param.rbi +53 -0
  86. data/rbi/openai/models/beta/agent_browser_authentication_submit_param.rbi +125 -0
  87. data/rbi/openai/models/beta/agent_browser_origin_access_param.rbi +76 -0
  88. data/rbi/openai/models/beta/agent_create_params.rbi +6 -3
  89. data/rbi/openai/models/beta/agent_output_item.rbi +422 -0
  90. data/rbi/openai/models/beta/agent_session.rbi +373 -1
  91. data/rbi/openai/models/beta/agent_session_input_param.rbi +102 -0
  92. data/rbi/openai/models/beta/agent_session_item.rbi +614 -0
  93. data/rbi/openai/models/beta/agent_session_turn_item_added_event.rbi +3 -0
  94. data/rbi/openai/models/beta/agent_session_turn_item_done_event.rbi +2 -0
  95. data/rbi/openai/models/beta/agent_tool.rbi +49 -1
  96. data/rbi/openai/models/beta/agent_tool_param.rbi +52 -1
  97. data/rbi/openai/models/beta/agent_update_params.rbi +6 -3
  98. data/rbi/openai/models/beta/agents/environments/environment_template.rbi +53 -2
  99. data/rbi/openai/models/beta/agents/environments/template_create_params.rbi +74 -4
  100. data/rbi/openai/models/beta/agents/environments/template_update_params.rbi +71 -4
  101. data/rbi/openai/models/beta/agents/session_create_params.rbi +6 -3
  102. data/rbi/openai/models/beta/agents/sessions/event_create_params.rbi +3 -0
  103. data/rbi/openai/models/beta/agents/sessions/session_trace.rbi +97 -0
  104. data/rbi/openai/models/beta/agents/sessions/trace_list_params.rbi +121 -0
  105. data/rbi/openai/models/beta/agents/vaults/credential.rbi +5 -5
  106. data/rbi/openai/models/beta/beta_response_output_text.rbi +2 -2
  107. data/rbi/openai/models/beta/beta_response_output_text_annotation_added_event.rbi +2 -2
  108. data/rbi/openai/models/beta/environment.rbi +82 -2
  109. data/rbi/openai/models/beta/environment_param.rbi +103 -4
  110. data/rbi/openai/models/beta/persisted_agent_tool.rbi +49 -1
  111. data/rbi/openai/models/beta/persisted_agent_tool_param.rbi +52 -1
  112. data/rbi/openai/models/beta/session_turn_error.rbi +3 -0
  113. data/rbi/openai/models/chat/chat_completion_content_part_image.rbi +1 -0
  114. data/rbi/openai/models/live/fork_server_event.rbi +14 -2
  115. data/rbi/openai/models/live/server_event.rbi +14 -2
  116. data/rbi/openai/models/realtime/translations/client_secret_create_params.rbi +68 -0
  117. data/rbi/openai/models/responses/response_output_text.rbi +2 -2
  118. data/rbi/openai/models/responses/response_output_text_annotation_added_event.rbi +2 -2
  119. data/rbi/openai/resources/beta/agents/environments/files.rbi +31 -0
  120. data/rbi/openai/resources/beta/agents/environments/templates.rbi +7 -0
  121. data/rbi/openai/resources/beta/agents/sessions/artifacts.rbi +8 -0
  122. data/rbi/openai/resources/beta/agents/sessions/events.rbi +7 -5
  123. data/rbi/openai/resources/beta/agents/sessions/traces.rbi +54 -0
  124. data/rbi/openai/resources/beta/agents/sessions.rbi +6 -1
  125. data/rbi/openai/resources/beta/agents.rbi +4 -2
  126. data/rbi/openai/resources/realtime/translations/client_secrets.rbi +54 -0
  127. data/rbi/openai/resources/realtime/translations.rbi +22 -0
  128. data/rbi/openai/resources/realtime.rbi +3 -0
  129. data/sig/openai/helpers/agents.rbs +7 -0
  130. data/sig/openai/helpers/beta/agents/artifacts.rbs +20 -0
  131. data/sig/openai/helpers/beta/agents/files.rbs +41 -0
  132. data/sig/openai/helpers/beta/agents/function_tool.rbs +24 -0
  133. data/sig/openai/helpers/beta/agents/model_adapter.rbs +16 -0
  134. data/sig/openai/helpers/beta/agents.rbs +71 -0
  135. data/sig/openai/helpers/structured_output.rbs +12 -0
  136. data/sig/openai/internal/transport/base_client.rbs +8 -0
  137. data/sig/openai/internal/type/base_model.rbs +3 -1
  138. data/sig/openai/internal/type/converter.rbs +16 -2
  139. data/sig/openai/internal/type/union.rbs +2 -1
  140. data/sig/openai/models/beta/agent_browser_authentication_cancel_param.rbs +21 -0
  141. data/sig/openai/models/beta/agent_browser_authentication_submit_param.rbs +63 -0
  142. data/sig/openai/models/beta/agent_browser_origin_access_param.rbs +47 -0
  143. data/sig/openai/models/beta/agent_output_item.rbs +254 -0
  144. data/sig/openai/models/beta/agent_session.rbs +215 -1
  145. data/sig/openai/models/beta/agent_session_input_param.rbs +51 -1
  146. data/sig/openai/models/beta/agent_session_item.rbs +362 -0
  147. data/sig/openai/models/beta/agent_tool.rbs +22 -0
  148. data/sig/openai/models/beta/agent_tool_param.rbs +25 -0
  149. data/sig/openai/models/beta/agents/environments/environment_template.rbs +29 -3
  150. data/sig/openai/models/beta/agents/environments/template_create_params.rbs +39 -4
  151. data/sig/openai/models/beta/agents/environments/template_update_params.rbs +37 -4
  152. data/sig/openai/models/beta/agents/sessions/session_trace.rbs +65 -0
  153. data/sig/openai/models/beta/agents/sessions/trace_list_params.rbs +81 -0
  154. data/sig/openai/models/beta/agents/vaults/credential.rbs +5 -5
  155. data/sig/openai/models/beta/beta_response_output_text.rbs +2 -2
  156. data/sig/openai/models/beta/beta_response_output_text_annotation_added_event.rbs +2 -2
  157. data/sig/openai/models/beta/environment.rbs +51 -3
  158. data/sig/openai/models/beta/environment_param.rbs +64 -4
  159. data/sig/openai/models/beta/persisted_agent_tool.rbs +22 -0
  160. data/sig/openai/models/beta/persisted_agent_tool_param.rbs +25 -0
  161. data/sig/openai/models/beta/session_turn_error.rbs +4 -0
  162. data/sig/openai/models/chat/chat_completion_content_part_image.rbs +2 -1
  163. data/sig/openai/models/live/fork_server_event.rbs +17 -2
  164. data/sig/openai/models/live/server_event.rbs +17 -2
  165. data/sig/openai/models/realtime/translations/client_secret_create_params.rbs +39 -0
  166. data/sig/openai/models/responses/response_output_text.rbs +2 -2
  167. data/sig/openai/models/responses/response_output_text_annotation_added_event.rbs +2 -2
  168. data/sig/openai/resources/beta/agents/environments/files.rbs +17 -0
  169. data/sig/openai/resources/beta/agents/environments/templates.rbs +2 -0
  170. data/sig/openai/resources/beta/agents/sessions/artifacts.rbs +4 -0
  171. data/sig/openai/resources/beta/agents/sessions/traces.rbs +21 -0
  172. data/sig/openai/resources/beta/agents/sessions.rbs +4 -1
  173. data/sig/openai/resources/realtime/translations/client_secrets.rbs +17 -0
  174. data/sig/openai/resources/realtime/translations.rbs +11 -0
  175. data/sig/openai/resources/realtime.rbs +2 -0
  176. metadata +46 -1
@@ -135,17 +135,26 @@ module OpenAI
135
135
  # @param request_only [Boolean] Exclude fields omitted by the request serializer.
136
136
  #
137
137
  # @return [Hash{Symbol=>Object}]
138
- def new_coerce_state(translate_names: true, request_only: false)
138
+ def new_coerce_state(translate_names: true, request_only: false, memoize: false)
139
139
  {
140
140
  translate_names: translate_names,
141
141
  request_only: request_only,
142
142
  strictness: true,
143
143
  exactness: {yes: 0, no: 0, maybe: 0},
144
144
  error: nil,
145
- branched: 0
145
+ branched: 0,
146
+ memo: memoize ? {}.compare_by_identity : nil
146
147
  }
147
148
  end
148
149
 
150
+ # @api private
151
+ # Resolve lazy schema types once within an opted-in parse.
152
+ def resolve_type(type_fn, state: nil)
153
+ return type_fn.call unless state && state[:memo]
154
+ cache = state[:memo][:resolved_types] ||= {}.compare_by_identity
155
+ cache.fetch(type_fn) { cache[type_fn] = type_fn.call }
156
+ end
157
+
149
158
  # @api private
150
159
  #
151
160
  # Based on `target`, transform `value` into `target`, to the extent possible:
@@ -191,6 +200,12 @@ module OpenAI
191
200
  #
192
201
  # @return [Object]
193
202
  def coerce(target, value, state: OpenAI::Internal::Type::Converter.new_coerce_state)
203
+ if state[:memo] &&
204
+ target.is_a?(OpenAI::Internal::Type::Converter) &&
205
+ (value.is_a?(Hash) || value.is_a?(Array))
206
+ return coerce_cached(target, value, state: state)
207
+ end
208
+
194
209
  exactness = state.fetch(:exactness)
195
210
 
196
211
  case target
@@ -248,6 +263,12 @@ module OpenAI
248
263
  state[:error] = TypeError.new("#{value.class} can't be coerced into #{String}")
249
264
  end
250
265
 
266
+ in -> { _1 <= Symbol }
267
+ if value.is_a?(String)
268
+ exactness[:yes] += 1
269
+ return value.to_sym
270
+ end
271
+
251
272
  in -> { _1 <= Date || _1 <= Time }
252
273
  Kernel.then do
253
274
  return target.parse(value).tap { exactness[:yes] += 1 }
@@ -282,6 +303,31 @@ module OpenAI
282
303
  value
283
304
  end
284
305
 
306
+ # @api private
307
+ # Reuse converter/value pairs within one parse, including recursive collections.
308
+ # Identity keys avoid recursively hashing model and converter definitions.
309
+ def coerce_cached(target, value, state:)
310
+ converters = state.fetch(:memo)
311
+ values = converters[target] ||= {}.compare_by_identity
312
+ outcomes = values[value] ||= {}
313
+ key = state.values_at(:translate_names, :request_only, :strictness, :error)
314
+ exactness = state.fetch(:exactness)
315
+ if (cached = outcomes[key])
316
+ parsed, delta, error, branched = cached
317
+ delta.each { exactness[_1] += _2 }
318
+ state[:error] = error
319
+ state[:branched] += branched
320
+ return parsed
321
+ end
322
+
323
+ before = exactness.dup
324
+ branched = state.fetch(:branched)
325
+ parsed = target.coerce(value, state: state)
326
+ delta = exactness.to_h { |name, count| [name, count - before.fetch(name)] }
327
+ outcomes[key] = [parsed, delta, state[:error], state[:branched] - branched]
328
+ parsed
329
+ end
330
+
285
331
  # @api private
286
332
  #
287
333
  # Coerces a value while isolating its error from sibling coercions.
@@ -350,7 +396,8 @@ module OpenAI
350
396
  strictness: T::Boolean,
351
397
  exactness: {yes: Integer, no: Integer, maybe: Integer},
352
398
  error: T.nilable(StandardError),
353
- branched: Integer
399
+ branched: Integer,
400
+ memo: T.nilable(T::Hash[T.untyped, T.untyped])
354
401
  }
355
402
  end
356
403
  end
@@ -97,7 +97,7 @@ module OpenAI
97
97
  return value
98
98
  end
99
99
 
100
- target = item_type
100
+ target = OpenAI::Internal::Type::Converter.resolve_type(@item_type_fn, state: state)
101
101
  exactness[:yes] += 1
102
102
  previous_error = state.fetch(:error)
103
103
  last_error = nil
@@ -88,7 +88,7 @@ module OpenAI
88
88
  # @param value [Object]
89
89
  #
90
90
  # @return [OpenAI::Internal::Type::Converter, Class, nil]
91
- private def resolve_variant(value)
91
+ private def resolve_variant(value, state: nil)
92
92
  case [@discriminator, value]
93
93
  in [_, OpenAI::Internal::Type::BaseModel]
94
94
  value.class
@@ -101,18 +101,18 @@ module OpenAI
101
101
 
102
102
  key = key.to_sym if key.is_a?(String)
103
103
  _, found = known_variants.find { |k,| !k.nil? && k == key }
104
- return found.call if found
104
+ return OpenAI::Internal::Type::Converter.resolve_type(found, state: state) if found
105
105
 
106
106
  known_variants.each do |variant_key, variant_fn|
107
107
  next unless variant_key.nil?
108
108
 
109
- target = variant_fn.call
109
+ target = OpenAI::Internal::Type::Converter.resolve_type(variant_fn, state: state)
110
110
  next unless target.is_a?(Class) && target <= OpenAI::Internal::Type::BaseModel
111
111
 
112
112
  field = target.known_fields[@discriminator]
113
113
  next unless field
114
114
 
115
- type = field.fetch(:type_fn).call
115
+ type = OpenAI::Internal::Type::Converter.resolve_type(field.fetch(:type_fn), state: state)
116
116
  next unless OpenAI::Internal::Type::Enum === type
117
117
 
118
118
  return target if type === key
@@ -174,7 +174,7 @@ module OpenAI
174
174
  def coerce(value, state:)
175
175
  strictness = state.fetch(:strictness)
176
176
  previous_error = state.fetch(:error)
177
- if (target = resolve_variant(value))
177
+ if (target = resolve_variant(value, state: state))
178
178
  return OpenAI::Internal::Type::Converter.coerce(target, value, state: state)
179
179
  end
180
180
 
@@ -182,7 +182,7 @@ module OpenAI
182
182
 
183
183
  alternatives = []
184
184
  known_variants.each_with_index do |(_, variant_fn), index|
185
- target = variant_fn.call
185
+ target = OpenAI::Internal::Type::Converter.resolve_type(variant_fn, state: state)
186
186
  exact = state[:exactness] = {yes: 0, no: 0, maybe: 0}
187
187
  state[:branched] += 1
188
188
 
@@ -75,7 +75,7 @@ module OpenAI
75
75
  # @!attribute tools
76
76
  # Tools available to the agent.
77
77
  #
78
- # @return [Array<OpenAI::Models::Beta::PersistedAgentTool::Function, OpenAI::Models::Beta::PersistedAgentTool::ToolSearch, OpenAI::Models::Beta::PersistedAgentTool::ProgrammaticToolCalling, OpenAI::Models::Beta::PersistedAgentTool::Mcp, OpenAI::Models::Beta::PersistedAgentTool::WebSearch>]
78
+ # @return [Array<OpenAI::Models::Beta::PersistedAgentTool::Function, OpenAI::Models::Beta::PersistedAgentTool::ToolSearch, OpenAI::Models::Beta::PersistedAgentTool::ProgrammaticToolCalling, OpenAI::Models::Beta::PersistedAgentTool::Mcp, OpenAI::Models::Beta::PersistedAgentTool::WebSearch, OpenAI::Models::Beta::PersistedAgentTool::ComputerUse>]
79
79
  required :tools, -> { OpenAI::Internal::Type::ArrayOf[union: OpenAI::Beta::PersistedAgentTool] }
80
80
 
81
81
  # @!attribute updated_at
@@ -118,7 +118,7 @@ module OpenAI
118
118
  # @param text [OpenAI::Models::Beta::AgentText]
119
119
  # The resolved configuration for text generated by the agent.
120
120
  #
121
- # @param tools [Array<OpenAI::Models::Beta::PersistedAgentTool::Function, OpenAI::Models::Beta::PersistedAgentTool::ToolSearch, OpenAI::Models::Beta::PersistedAgentTool::ProgrammaticToolCalling, OpenAI::Models::Beta::PersistedAgentTool::Mcp, OpenAI::Models::Beta::PersistedAgentTool::WebSearch>]
121
+ # @param tools [Array<OpenAI::Models::Beta::PersistedAgentTool::Function, OpenAI::Models::Beta::PersistedAgentTool::ToolSearch, OpenAI::Models::Beta::PersistedAgentTool::ProgrammaticToolCalling, OpenAI::Models::Beta::PersistedAgentTool::Mcp, OpenAI::Models::Beta::PersistedAgentTool::WebSearch, OpenAI::Models::Beta::PersistedAgentTool::ComputerUse>]
122
122
  # Tools available to the agent.
123
123
  #
124
124
  # @param updated_at [Integer]
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenAI
4
+ module Models
5
+ module Beta
6
+ class AgentBrowserAuthenticationCancelParam < OpenAI::Internal::Type::BaseModel
7
+ # @!attribute action
8
+ #
9
+ # @return [Symbol, :cancel]
10
+ required :action, const: :cancel
11
+
12
+ # @!attribute type
13
+ #
14
+ # @return [Symbol, :browser_authentication]
15
+ required :type, const: :browser_authentication
16
+
17
+ # @!method initialize(action: :cancel, type: :browser_authentication)
18
+ # @param action [Symbol, :cancel]
19
+ # @param type [Symbol, :browser_authentication]
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenAI
4
+ module Models
5
+ module Beta
6
+ class AgentBrowserAuthenticationSubmitParam < OpenAI::Internal::Type::BaseModel
7
+ # @!attribute action
8
+ #
9
+ # @return [Symbol, :submit]
10
+ required :action, const: :submit
11
+
12
+ # @!attribute fields
13
+ # Values for up to six active fields in the required action. The submitted
14
+ # field-value mapping and selected option must fit within 120 KiB of JSON.
15
+ #
16
+ # @return [Array<OpenAI::Models::Beta::AgentBrowserAuthenticationSubmitParam::Field>]
17
+ required(
18
+ :fields,
19
+ -> { OpenAI::Internal::Type::ArrayOf[OpenAI::Beta::AgentBrowserAuthenticationSubmitParam::Field] }
20
+ )
21
+
22
+ # @!attribute type
23
+ #
24
+ # @return [Symbol, :browser_authentication]
25
+ required :type, const: :browser_authentication
26
+
27
+ # @!attribute selected_option
28
+ # The chosen method. Required when the required action contains options.
29
+ #
30
+ # @return [String, nil]
31
+ optional :selected_option, String, nil?: true
32
+
33
+ # @!method initialize(fields:, selected_option: nil, action: :submit, type: :browser_authentication)
34
+ # @param fields [Array<OpenAI::Models::Beta::AgentBrowserAuthenticationSubmitParam::Field>]
35
+ # Values for up to six active fields in the required action. The submitted
36
+ # field-value mapping and selected option must fit within 120 KiB of JSON.
37
+ #
38
+ # @param selected_option [String, nil]
39
+ # The chosen method. Required when the required action contains options.
40
+ #
41
+ # @param action [Symbol, :submit]
42
+ #
43
+ # @param type [Symbol, :browser_authentication]
44
+
45
+ class Field < OpenAI::Internal::Type::BaseModel
46
+ # @!attribute field_id
47
+ # The field ID from the required action.
48
+ #
49
+ # @return [String]
50
+ required :field_id, String
51
+
52
+ # @!attribute value
53
+ # The value to enter into the registered control.
54
+ #
55
+ # @return [String]
56
+ required :value, String
57
+
58
+ # @!method initialize(field_id:, value:)
59
+ # One user-entered value, including non-password fields such as an email address.
60
+ #
61
+ # @param field_id [String]
62
+ # The field ID from the required action.
63
+ #
64
+ # @param value [String]
65
+ # The value to enter into the registered control.
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenAI
4
+ module Models
5
+ module Beta
6
+ class AgentBrowserOriginAccessParam < OpenAI::Internal::Type::BaseModel
7
+ # @!attribute decision
8
+ # Whether to allow, deny, or cancel the requested origin access.
9
+ #
10
+ # @return [Symbol, OpenAI::Models::Beta::AgentBrowserOriginAccessParam::Decision]
11
+ required :decision, enum: -> { OpenAI::Beta::AgentBrowserOriginAccessParam::Decision }
12
+
13
+ # @!attribute type
14
+ #
15
+ # @return [Symbol, :browser_origin_access]
16
+ required :type, const: :browser_origin_access
17
+
18
+ # @!method initialize(decision:, type: :browser_origin_access)
19
+ # @param decision [Symbol, OpenAI::Models::Beta::AgentBrowserOriginAccessParam::Decision]
20
+ # Whether to allow, deny, or cancel the requested origin access.
21
+ #
22
+ # @param type [Symbol, :browser_origin_access]
23
+
24
+ # Whether to allow, deny, or cancel the requested origin access.
25
+ #
26
+ # @see OpenAI::Models::Beta::AgentBrowserOriginAccessParam#decision
27
+ module Decision
28
+ extend OpenAI::Internal::Type::Enum
29
+
30
+ # Allow the browser to access this origin.
31
+ APPROVE = :approve
32
+
33
+ # Deny access to this origin.
34
+ DENY = :deny
35
+
36
+ # Dismiss this request without approving access.
37
+ CANCEL = :cancel
38
+
39
+ # @!method self.values
40
+ # @return [Array<Symbol>]
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -63,7 +63,7 @@ module OpenAI
63
63
  # @!attribute tools
64
64
  # Tools available to the agent. Defaults to an empty list.
65
65
  #
66
- # @return [Array<OpenAI::Models::Beta::PersistedAgentToolParam::Function, OpenAI::Models::Beta::PersistedAgentToolParam::ToolSearch, OpenAI::Models::Beta::PersistedAgentToolParam::ProgrammaticToolCalling, OpenAI::Models::Beta::PersistedAgentToolParam::Mcp, OpenAI::Models::Beta::PersistedAgentToolParam::WebSearch>, nil]
66
+ # @return [Array<OpenAI::Models::Beta::PersistedAgentToolParam::Function, OpenAI::Models::Beta::PersistedAgentToolParam::ToolSearch, OpenAI::Models::Beta::PersistedAgentToolParam::ProgrammaticToolCalling, OpenAI::Models::Beta::PersistedAgentToolParam::Mcp, OpenAI::Models::Beta::PersistedAgentToolParam::WebSearch, OpenAI::Models::Beta::PersistedAgentToolParam::ComputerUse>, nil]
67
67
  optional(
68
68
  :tools,
69
69
  -> { OpenAI::Internal::Type::ArrayOf[union: OpenAI::Beta::PersistedAgentToolParam] },
@@ -99,7 +99,7 @@ module OpenAI
99
99
  # Configuration for generated text. Defaults to the `text` format and medium
100
100
  # verbosity.
101
101
  #
102
- # @param tools [Array<OpenAI::Models::Beta::PersistedAgentToolParam::Function, OpenAI::Models::Beta::PersistedAgentToolParam::ToolSearch, OpenAI::Models::Beta::PersistedAgentToolParam::ProgrammaticToolCalling, OpenAI::Models::Beta::PersistedAgentToolParam::Mcp, OpenAI::Models::Beta::PersistedAgentToolParam::WebSearch>, nil]
102
+ # @param tools [Array<OpenAI::Models::Beta::PersistedAgentToolParam::Function, OpenAI::Models::Beta::PersistedAgentToolParam::ToolSearch, OpenAI::Models::Beta::PersistedAgentToolParam::ProgrammaticToolCalling, OpenAI::Models::Beta::PersistedAgentToolParam::Mcp, OpenAI::Models::Beta::PersistedAgentToolParam::WebSearch, OpenAI::Models::Beta::PersistedAgentToolParam::ComputerUse>, nil]
103
103
  # Tools available to the agent. Defaults to an empty list.
104
104
  #
105
105
  # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}]
@@ -21,6 +21,12 @@ module OpenAI
21
21
  # A call to a tool on an MCP server.
22
22
  variant :mcp_call, -> { OpenAI::Beta::AgentMcpCallItem }
23
23
 
24
+ # One execution of the platform-provided computer-use capability.
25
+ variant :computer_use_call, -> { OpenAI::Beta::AgentOutputItem::ComputerUseCall }
26
+
27
+ # A credential-free history record of the emitted login request.
28
+ variant :computer_use_approval_request, -> { OpenAI::Beta::AgentOutputItem::ComputerUseApprovalRequest }
29
+
24
30
  # A web search call produced by the agent.
25
31
  variant :web_search_call, -> { OpenAI::Beta::AgentWebSearchCallItem }
26
32
 
@@ -45,8 +51,277 @@ module OpenAI
45
51
  # A request to close a subagent.
46
52
  variant :close_subagent_call, -> { OpenAI::Beta::AgentCloseSubagentCallItem }
47
53
 
54
+ class ComputerUseCall < OpenAI::Internal::Type::BaseModel
55
+ # @!attribute id
56
+ # The ID of the activity item.
57
+ #
58
+ # @return [String]
59
+ required :id, String
60
+
61
+ # @!attribute output
62
+ # The last screenshot emitted by the model. Null when screenshot inclusion is
63
+ # disabled or the call emitted no screenshot.
64
+ #
65
+ # @return [OpenAI::Models::Beta::AgentOutputItem::ComputerUseCall::Output, nil]
66
+ required :output, -> { OpenAI::Beta::AgentOutputItem::ComputerUseCall::Output }, nil?: true
67
+
68
+ # @!attribute status
69
+ # The execution status of the activity.
70
+ #
71
+ # @return [Symbol, OpenAI::Models::Beta::AgentFunctionCallStatus]
72
+ required :status, enum: -> { OpenAI::Beta::AgentFunctionCallStatus }
73
+
74
+ # @!attribute title
75
+ # A model-generated description of the activity, when available.
76
+ #
77
+ # @return [String, nil]
78
+ required :title, String, nil?: true
79
+
80
+ # @!attribute turn_id
81
+ # The ID of the turn that contains this item.
82
+ #
83
+ # @return [String]
84
+ required :turn_id, String
85
+
86
+ # @!attribute type
87
+ # The item type. Always `computer_use_call`.
88
+ #
89
+ # @return [Symbol, :computer_use_call]
90
+ required :type, const: :computer_use_call
91
+
92
+ # @!method initialize(id:, output:, status:, title:, turn_id:, type: :computer_use_call)
93
+ # One execution of the platform-provided computer-use capability.
94
+ #
95
+ # @param id [String]
96
+ # The ID of the activity item.
97
+ #
98
+ # @param output [OpenAI::Models::Beta::AgentOutputItem::ComputerUseCall::Output, nil]
99
+ # The last screenshot emitted by the model. Null when screenshot inclusion is
100
+ # disabled or the call emitted no screenshot.
101
+ #
102
+ # @param status [Symbol, OpenAI::Models::Beta::AgentFunctionCallStatus]
103
+ # The execution status of the activity.
104
+ #
105
+ # @param title [String, nil]
106
+ # A model-generated description of the activity, when available.
107
+ #
108
+ # @param turn_id [String]
109
+ # The ID of the turn that contains this item.
110
+ #
111
+ # @param type [Symbol, :computer_use_call]
112
+ # The item type. Always `computer_use_call`.
113
+
114
+ # @see OpenAI::Models::Beta::AgentOutputItem::ComputerUseCall#output
115
+ class Output < OpenAI::Internal::Type::BaseModel
116
+ # @!attribute image_url
117
+ # The complete JPEG image as a base64 data URL.
118
+ #
119
+ # @return [String]
120
+ required :image_url, String
121
+
122
+ # @!attribute type
123
+ # The content type. Always `computer_screenshot`.
124
+ #
125
+ # @return [Symbol, :computer_screenshot]
126
+ required :type, const: :computer_screenshot
127
+
128
+ # @!method initialize(image_url:, type: :computer_screenshot)
129
+ # The last screenshot emitted by the model. Null when screenshot inclusion is
130
+ # disabled or the call emitted no screenshot.
131
+ #
132
+ # @param image_url [String]
133
+ # The complete JPEG image as a base64 data URL.
134
+ #
135
+ # @param type [Symbol, :computer_screenshot]
136
+ # The content type. Always `computer_screenshot`.
137
+ end
138
+ end
139
+
140
+ class ComputerUseApprovalRequest < OpenAI::Internal::Type::BaseModel
141
+ # @!attribute id
142
+ # The stable history item ID.
143
+ #
144
+ # @return [String]
145
+ required :id, String
146
+
147
+ # @!attribute request
148
+ # A registered form awaiting the application's response.
149
+ #
150
+ # @return [OpenAI::Models::Beta::AgentOutputItem::ComputerUseApprovalRequest::Request]
151
+ required :request, -> { OpenAI::Beta::AgentOutputItem::ComputerUseApprovalRequest::Request }
152
+
153
+ # @!attribute request_id
154
+ #
155
+ # @return [String]
156
+ required :request_id, String
157
+
158
+ # @!attribute turn_id
159
+ #
160
+ # @return [String]
161
+ required :turn_id, String
162
+
163
+ # @!attribute type
164
+ # The item type. Always computer_use_approval_request.
165
+ #
166
+ # @return [Symbol, :computer_use_approval_request]
167
+ required :type, const: :computer_use_approval_request
168
+
169
+ # @!method initialize(id:, request:, request_id:, turn_id:, type: :computer_use_approval_request)
170
+ # A credential-free history record of the emitted login request.
171
+ #
172
+ # @param id [String]
173
+ # The stable history item ID.
174
+ #
175
+ # @param request [OpenAI::Models::Beta::AgentOutputItem::ComputerUseApprovalRequest::Request]
176
+ # A registered form awaiting the application's response.
177
+ #
178
+ # @param request_id [String]
179
+ #
180
+ # @param turn_id [String]
181
+ #
182
+ # @param type [Symbol, :computer_use_approval_request]
183
+ # The item type. Always computer_use_approval_request.
184
+
185
+ # @see OpenAI::Models::Beta::AgentOutputItem::ComputerUseApprovalRequest#request
186
+ class Request < OpenAI::Internal::Type::BaseModel
187
+ # @!attribute credential_origin
188
+ # The registered form or frame origin where values will be entered.
189
+ #
190
+ # @return [String, nil]
191
+ required :credential_origin, String, nil?: true
192
+
193
+ # @!attribute fields
194
+ # Controls to render. All submitted values are sensitive.
195
+ #
196
+ # @return [Array<OpenAI::Models::Beta::AgentOutputItem::ComputerUseApprovalRequest::Request::Field>]
197
+ required(
198
+ :fields,
199
+ -> {
200
+ OpenAI::Internal::Type::ArrayOf[
201
+ OpenAI::Beta::AgentOutputItem::ComputerUseApprovalRequest::Request::Field
202
+ ]
203
+ }
204
+ )
205
+
206
+ # @!attribute options
207
+ # Sign-in methods. Empty for a plain form.
208
+ #
209
+ # @return [Array<OpenAI::Models::Beta::AgentOutputItem::ComputerUseApprovalRequest::Request::Option>]
210
+ required(
211
+ :options,
212
+ -> {
213
+ OpenAI::Internal::Type::ArrayOf[
214
+ OpenAI::Beta::AgentOutputItem::ComputerUseApprovalRequest::Request::Option
215
+ ]
216
+ }
217
+ )
218
+
219
+ # @!attribute reason
220
+ # Why the agent needs the user to sign in.
221
+ #
222
+ # @return [String, nil]
223
+ required :reason, String, nil?: true
224
+
225
+ # @!attribute type
226
+ # The type of the object. Always `browser_authentication`.
227
+ #
228
+ # @return [Symbol, :browser_authentication]
229
+ required :type, const: :browser_authentication
230
+
231
+ # @!method initialize(credential_origin:, fields:, options:, reason:, type: :browser_authentication)
232
+ # A registered form awaiting the application's response.
233
+ #
234
+ # @param credential_origin [String, nil]
235
+ # The registered form or frame origin where values will be entered.
236
+ #
237
+ # @param fields [Array<OpenAI::Models::Beta::AgentOutputItem::ComputerUseApprovalRequest::Request::Field>]
238
+ # Controls to render. All submitted values are sensitive.
239
+ #
240
+ # @param options [Array<OpenAI::Models::Beta::AgentOutputItem::ComputerUseApprovalRequest::Request::Option>]
241
+ # Sign-in methods. Empty for a plain form.
242
+ #
243
+ # @param reason [String, nil]
244
+ # Why the agent needs the user to sign in.
245
+ #
246
+ # @param type [Symbol, :browser_authentication]
247
+ # The type of the object. Always `browser_authentication`.
248
+ class Field < OpenAI::Internal::Type::BaseModel
249
+ # @!attribute id
250
+ # The field ID to submit as field_id in a fields entry.
251
+ #
252
+ # @return [String]
253
+ required :id, String
254
+
255
+ # @!attribute label
256
+ # The label to display beside the control.
257
+ #
258
+ # @return [String]
259
+ required :label, String
260
+
261
+ # @!attribute required
262
+ # Whether this control requires a nonempty value.
263
+ #
264
+ # @return [Boolean]
265
+ required :required, OpenAI::Internal::Type::Boolean
266
+
267
+ # @!attribute type
268
+ # The rendering type, such as email, password, or text.
269
+ #
270
+ # @return [String]
271
+ required :type, String
272
+
273
+ # @!method initialize(id:, label:, required:, type:)
274
+ # A control in a registered browser-login form.
275
+ #
276
+ # @param id [String]
277
+ # The field ID to submit as field_id in a fields entry.
278
+ #
279
+ # @param label [String]
280
+ # The label to display beside the control.
281
+ #
282
+ # @param required [Boolean]
283
+ # Whether this control requires a nonempty value.
284
+ #
285
+ # @param type [String]
286
+ # The rendering type, such as email, password, or text.
287
+ end
288
+
289
+ class Option < OpenAI::Internal::Type::BaseModel
290
+ # @!attribute id
291
+ # The option ID to submit as selected_option.
292
+ #
293
+ # @return [String]
294
+ required :id, String
295
+
296
+ # @!attribute field_ids
297
+ # IDs from the registered fields that this method accepts.
298
+ #
299
+ # @return [Array<String>]
300
+ required :field_ids, OpenAI::Internal::Type::ArrayOf[String]
301
+
302
+ # @!attribute label
303
+ # The method label to display.
304
+ #
305
+ # @return [String]
306
+ required :label, String
307
+
308
+ # @!method initialize(id:, field_ids:, label:)
309
+ # A sign-in method and the fields that belong to it.
310
+ #
311
+ # @param id [String]
312
+ # The option ID to submit as selected_option.
313
+ #
314
+ # @param field_ids [Array<String>]
315
+ # IDs from the registered fields that this method accepts.
316
+ #
317
+ # @param label [String]
318
+ # The method label to display.
319
+ end
320
+ end
321
+ end
322
+
48
323
  # @!method self.variants
49
- # @return [Array(OpenAI::Models::Beta::AgentSessionAssistantMessage, OpenAI::Models::Beta::AgentReasoningItem, OpenAI::Models::Beta::AgentFunctionCallItem, OpenAI::Models::Beta::AgentMcpCallItem, OpenAI::Models::Beta::AgentWebSearchCallItem, OpenAI::Models::Beta::AgentCommandExecutionItem, OpenAI::Models::Beta::AgentCreateSubagentCallItem, OpenAI::Models::Beta::AgentSendSubagentInputCallItem, OpenAI::Models::Beta::AgentResumeSubagentCallItem, OpenAI::Models::Beta::AgentWaitForSubagentsCallItem, OpenAI::Models::Beta::AgentInterruptSubagentCallItem, OpenAI::Models::Beta::AgentCloseSubagentCallItem)]
324
+ # @return [Array(OpenAI::Models::Beta::AgentSessionAssistantMessage, OpenAI::Models::Beta::AgentReasoningItem, OpenAI::Models::Beta::AgentFunctionCallItem, OpenAI::Models::Beta::AgentMcpCallItem, OpenAI::Models::Beta::AgentOutputItem::ComputerUseCall, OpenAI::Models::Beta::AgentOutputItem::ComputerUseApprovalRequest, OpenAI::Models::Beta::AgentWebSearchCallItem, OpenAI::Models::Beta::AgentCommandExecutionItem, OpenAI::Models::Beta::AgentCreateSubagentCallItem, OpenAI::Models::Beta::AgentSendSubagentInputCallItem, OpenAI::Models::Beta::AgentResumeSubagentCallItem, OpenAI::Models::Beta::AgentWaitForSubagentsCallItem, OpenAI::Models::Beta::AgentInterruptSubagentCallItem, OpenAI::Models::Beta::AgentCloseSubagentCallItem)]
50
325
  end
51
326
  end
52
327
  end