diff --git a/.castiron.stats.yml b/.castiron.stats.yml index bc0277f12..9c913466b 100644 --- a/.castiron.stats.yml +++ b/.castiron.stats.yml @@ -1,8 +1,8 @@ schema_version: 1 -generation_id: 8def2c80-1858-4c9d-9b9b-dc3c6676fea6 +generation_id: 65ac1096-1b69-42d4-af23-93b0e7162026 openapi_spec_hash: b2c62b342b04685226037c980f2b5a7a openapi_transformed_spec_hash: ba44bf31326f01a1d886b7510dd9da8a -config_hash: 1e11a5becf7bc1c2e9e07b8654872dc4 -codegen_sha: 5f2f7e6d049ccc5916ffd6fea8e0794ae3c0cbd9 -codegen_hash: 663402af14642770c879417eb667124b7f3d9737fd077e484448afc7a3962e78 -public_codegen_sha: 285ffa3e3e167b59861e8c5d88e9030b1ca6c9d4 +config_hash: 4fbbbcf377bcc17646cccb9fcfbac14a +codegen_sha: 32f76782eedd98393c94fd2cd5bed4107dc87e5e +codegen_hash: be1aa8c106030d90566a9da15b7103ad484d28b79b102e764fdc757e60330835 +public_codegen_sha: 676d0f7a10c647c011d998f6c603e47791af8261 diff --git a/lib/openai.rb b/lib/openai.rb index 0e2d67b12..43d5ba827 100644 --- a/lib/openai.rb +++ b/lib/openai.rb @@ -871,6 +871,7 @@ require_relative "openai/models/other_file_chunking_strategy_object" require_relative "openai/models/realtime/audio_transcription" require_relative "openai/models/realtime/call_accept_params" +require_relative "openai/models/realtime/call_create_params" require_relative "openai/models/realtime/call_hangup_params" require_relative "openai/models/realtime/call_refer_params" require_relative "openai/models/realtime/call_reject_params" diff --git a/lib/openai/models/realtime/call_create_params.rb b/lib/openai/models/realtime/call_create_params.rb new file mode 100644 index 000000000..092bbc69c --- /dev/null +++ b/lib/openai/models/realtime/call_create_params.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module OpenAI + module Models + module Realtime + # @see OpenAI::Resources::Realtime::Calls#create + class CallCreateParams < OpenAI::Internal::Type::BaseModel + extend OpenAI::Internal::Type::RequestParameters::Converter + include OpenAI::Internal::Type::RequestParameters + + # @!attribute sdp + # WebRTC Session Description Protocol (SDP) offer generated by the caller. + # + # @return [String] + required :sdp, String + + # @!attribute session + # Realtime session object configuration. + # + # @return [OpenAI::Models::Realtime::RealtimeSessionCreateRequest, nil] + optional :session, -> { OpenAI::Realtime::RealtimeSessionCreateRequest } + + # @!method initialize(sdp:, session: nil, request_options: {}) + # @param sdp [String] WebRTC Session Description Protocol (SDP) offer generated by the caller. + # + # @param session [OpenAI::Models::Realtime::RealtimeSessionCreateRequest] Realtime session object configuration. + # + # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}] + end + end + end +end diff --git a/lib/openai/resources/realtime/calls.rb b/lib/openai/resources/realtime/calls.rb index a0cfb6f4d..c607ab571 100644 --- a/lib/openai/resources/realtime/calls.rb +++ b/lib/openai/resources/realtime/calls.rb @@ -4,6 +4,59 @@ module OpenAI module Resources class Realtime class Calls + # Create a new Realtime API call over WebRTC and receive the SDP answer needed to + # complete the peer connection. + # + # @overload create(sdp:, session: nil, request_options: {}) + # + # @param sdp [String] WebRTC Session Description Protocol (SDP) offer generated by the caller. + # + # @param session [OpenAI::Models::Realtime::RealtimeSessionCreateRequest] Realtime session object configuration. + # + # @param request_options [OpenAI::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [StringIO] + # + # @see OpenAI::Models::Realtime::CallCreateParams + def create(params) + parsed, options = OpenAI::Realtime::CallCreateParams.dump_request(params) + normalize_keys = lambda do |value| + case value + when Hash + value.to_h { |key, child| [key.to_s, normalize_keys.call(child)] } + when Array + value.map { |child| normalize_keys.call(child) } + else + value + end + end + + multipart_body = OpenAI::Internal::Util.deep_merge( + normalize_keys.call(parsed), + normalize_keys.call(options[:extra_body] || {}) + ) + options = options.except(:extra_body) + if multipart_body.key?("sdp") + multipart_body["sdp"] = OpenAI::FilePart.new(multipart_body["sdp"], content_type: "application/sdp") + end + + if multipart_body.key?("session") + multipart_body["session"] = OpenAI::FilePart.new( + JSON.generate(multipart_body["session"]), + content_type: "application/json" + ) + end + + @client.request( + method: :post, + path: "realtime/calls", + headers: {"content-type" => "multipart/form-data", "accept" => "application/sdp"}, + body: multipart_body, + security: {bearer_auth: true}, + options: options + ) + end + # Some parameter documentations has been truncated, see # {OpenAI::Models::Realtime::CallAcceptParams} for more details. # diff --git a/rbi/openai/models/realtime/call_create_params.rbi b/rbi/openai/models/realtime/call_create_params.rbi new file mode 100644 index 000000000..107bb60d9 --- /dev/null +++ b/rbi/openai/models/realtime/call_create_params.rbi @@ -0,0 +1,71 @@ +# typed: strong + +module OpenAI + module Models + + module Realtime + + class CallCreateParams < OpenAI::Internal::Type::BaseModel + + extend OpenAI::Internal::Type::RequestParameters::Converter + include OpenAI::Internal::Type::RequestParameters + + OrHash = T.type_alias do + T.any( + OpenAI::Realtime::CallCreateParams, + OpenAI::Internal::AnyHash + ) + end + + # WebRTC Session Description Protocol (SDP) offer generated by the caller. + sig { returns(String) } + attr_accessor :sdp + + # Realtime session object configuration. + sig { returns(T.nilable(OpenAI::Realtime::RealtimeSessionCreateRequest)) } + attr_reader :session + + sig { params(session: OpenAI::Realtime::RealtimeSessionCreateRequest::OrHash).void } + attr_writer :session + + sig do + params( + + sdp: String, + + session: OpenAI::Realtime::RealtimeSessionCreateRequest::OrHash, + + request_options: OpenAI::RequestOptions::OrHash + ) + .returns(T.attached_class) + end + def self.new( + + # WebRTC Session Description Protocol (SDP) offer generated by the caller. + sdp:, + + # Realtime session object configuration. + session: nil, + + request_options: {} + ) + end + + sig do + override.returns( + { + sdp: String, + session: OpenAI::Realtime::RealtimeSessionCreateRequest, + request_options: OpenAI::RequestOptions + } + ) + end + def to_hash + end + + end + + end + + end +end diff --git a/rbi/openai/resources/realtime/calls.rbi b/rbi/openai/resources/realtime/calls.rbi index 9e3c7f407..a9fe16c67 100644 --- a/rbi/openai/resources/realtime/calls.rbi +++ b/rbi/openai/resources/realtime/calls.rbi @@ -7,6 +7,25 @@ module OpenAI class Calls + # Create a new Realtime API call over WebRTC and receive the SDP answer needed to + # complete the peer connection. + sig { + params( + sdp: String, + session: OpenAI::Realtime::RealtimeSessionCreateRequest::OrHash, + request_options: OpenAI::RequestOptions::OrHash + ) + .returns(StringIO) + } + def create( + # WebRTC Session Description Protocol (SDP) offer generated by the caller. + sdp:, + # Realtime session object configuration. + session: nil, + request_options: {} + ) + end + # Accept an incoming SIP call and configure the realtime session that will handle # it. sig { diff --git a/sig/openai/models/realtime/call_create_params.rbs b/sig/openai/models/realtime/call_create_params.rbs new file mode 100644 index 000000000..2483b8170 --- /dev/null +++ b/sig/openai/models/realtime/call_create_params.rbs @@ -0,0 +1,34 @@ +module OpenAI + module Models + module Realtime + type call_create_params = + { sdp: String, session: OpenAI::Realtime::RealtimeSessionCreateRequest } + & OpenAI::Internal::Type::request_parameters + + class CallCreateParams < OpenAI::Internal::Type::BaseModel + extend OpenAI::Internal::Type::RequestParameters::Converter + include OpenAI::Internal::Type::RequestParameters + + attr_accessor sdp: String + + attr_reader session: OpenAI::Realtime::RealtimeSessionCreateRequest? + + def session=: ( + OpenAI::Realtime::RealtimeSessionCreateRequest + ) -> OpenAI::Realtime::RealtimeSessionCreateRequest + + def initialize: ( + sdp: String, + ?session: OpenAI::Realtime::RealtimeSessionCreateRequest, + ?request_options: OpenAI::request_opts + ) -> void + + def to_hash: -> { + sdp: String, + session: OpenAI::Realtime::RealtimeSessionCreateRequest, + request_options: OpenAI::RequestOptions + } + end + end + end +end diff --git a/sig/openai/resources/realtime/calls.rbs b/sig/openai/resources/realtime/calls.rbs index 7f89f2417..67a6acb09 100644 --- a/sig/openai/resources/realtime/calls.rbs +++ b/sig/openai/resources/realtime/calls.rbs @@ -2,6 +2,12 @@ module OpenAI module Resources class Realtime class Calls + def create: ( + sdp: String, + ?session: OpenAI::Realtime::RealtimeSessionCreateRequest, + ?request_options: OpenAI::request_opts + ) -> StringIO + def accept: ( String call_id, ?audio: OpenAI::Realtime::RealtimeAudioConfig, diff --git a/test/openai/resources/realtime/calls_test.rb b/test/openai/resources/realtime/calls_test.rb index 938be40ed..30f1b77e7 100644 --- a/test/openai/resources/realtime/calls_test.rb +++ b/test/openai/resources/realtime/calls_test.rb @@ -3,6 +3,14 @@ require_relative "../../test_helper" class OpenAI::Test::Resources::Realtime::CallsTest < OpenAI::Test::ResourceTest + def test_create_required_params + response = @openai.realtime.calls.create(sdp: "sdp") + + assert_pattern do + response => Object + end + end + def test_accept_required_params response = @openai.realtime.calls.accept("call_id", type: :realtime)