Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .castiron.stats.yml
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions lib/openai.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
32 changes: 32 additions & 0 deletions lib/openai/models/realtime/call_create_params.rb
Original file line number Diff line number Diff line change
@@ -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
53 changes: 53 additions & 0 deletions lib/openai/resources/realtime/calls.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve the call ID from the Location header

When a backend needs to monitor or terminate the newly created WebRTC call, the API supplies its call ID in the Location response header, but this request returns only the decoded StringIO; BaseClient#parse_response attaches response metadata only to BaseModel instances, and there is no raw-response accessor for this value. Consequently, after a successful create, callers cannot obtain the identifier required by hangup or monitoring endpoints. Return a response type or wrapper that retains the headers, and cover that behavior in the focused endpoint test.

AGENTS.md reference: AGENTS.md:L48-L52

Useful? React with 👍 / 👎.

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.
#
Expand Down
71 changes: 71 additions & 0 deletions rbi/openai/models/realtime/call_create_params.rbi
Original file line number Diff line number Diff line change
@@ -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
19 changes: 19 additions & 0 deletions rbi/openai/resources/realtime/calls.rbi
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
34 changes: 34 additions & 0 deletions sig/openai/models/realtime/call_create_params.rbs
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions sig/openai/resources/realtime/calls.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
8 changes: 8 additions & 0 deletions test/openai/resources/realtime/calls_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down