diff --git a/lib/openai/responses.rb b/lib/openai/responses.rb index 15b86e41..97133d73 100644 --- a/lib/openai/responses.rb +++ b/lib/openai/responses.rb @@ -4,20 +4,24 @@ def initialize(client:) @client = client end - def create(parameters: {}) - @client.json_post(path: "/responses", parameters: parameters) + def create(parameters: {}, extra_headers: {}) + @client.json_post(path: "/responses", parameters: parameters, extra_headers: extra_headers) end - def retrieve(response_id:) - @client.get(path: "/responses/#{response_id}") + def retrieve(response_id:, extra_headers: {}) + @client.get(path: "/responses/#{response_id}", extra_headers: extra_headers) end - def delete(response_id:) - @client.delete(path: "/responses/#{response_id}") + def delete(response_id:, extra_headers: {}) + @client.delete(path: "/responses/#{response_id}", extra_headers: extra_headers) end - def input_items(response_id:, parameters: {}) - @client.get(path: "/responses/#{response_id}/input_items", parameters: parameters) + def input_items(response_id:, parameters: {}, extra_headers: {}) + @client.get( + path: "/responses/#{response_id}/input_items", + parameters: parameters, + extra_headers: extra_headers + ) end end end diff --git a/spec/openai/client/responses_spec.rb b/spec/openai/client/responses_spec.rb index 80f57cf2..376da00d 100644 --- a/spec/openai/client/responses_spec.rb +++ b/spec/openai/client/responses_spec.rb @@ -1,14 +1,19 @@ RSpec.describe OpenAI::Client do describe "#responses" do + let(:custom_headers) { { "X-Custom-Header" => "custom-value" } } + let(:extra_headers) { {} } + describe "#create", :vcr do + let(:client) { OpenAI::Client.new({ uri_base: uri_base }) } let(:model) { "gpt-4o" } let(:input) { "Hello!" } let(:stream) { false } let(:uri_base) { nil } let(:parameters) { { model: model, input: input, stream: stream } } let(:response) do - OpenAI::Client.new({ uri_base: uri_base }).responses.create( - parameters: parameters + client.responses.create( + parameters: parameters, + extra_headers: extra_headers ) end let(:content) { response.dig("output", 0, "content", 0, "text") } @@ -20,6 +25,20 @@ end end + context "with extra_headers" do + let(:extra_headers) { custom_headers } + + it "passes extra_headers to the request" do + expect(client).to receive(:json_post).with( + path: "/responses", + parameters: parameters, + extra_headers: custom_headers + ).and_return({ "ok" => true }) + + expect(response).to eq({ "ok" => true }) + end + end + context "with followup message" do let(:input) { "Hello! My name is Szymon." } let(:input_followup) { "Remind me, what is my name?" } @@ -153,6 +172,7 @@ def call(chunk, event) end describe "#retrieve" do + let(:client) { OpenAI::Client.new } let(:model) { "gpt-4o" } let(:response_id) do VCR.use_cassette("responses retrieve setup") do @@ -164,8 +184,13 @@ def call(chunk, event) )["id"] end end - let(:response) { OpenAI::Client.new.responses.retrieve(response_id: response_id) } let(:cassette) { "responses retrieve" } + let(:response) do + client.responses.retrieve( + response_id: response_id, + extra_headers: extra_headers + ) + end it "succeeds" do VCR.use_cassette(cassette) do @@ -173,9 +198,24 @@ def call(chunk, event) expect(response["id"]).to eq(response_id) end end + + context "with extra_headers" do + let(:extra_headers) { custom_headers } + let(:response_id) { "resp_123" } + + it "passes extra_headers to the request" do + expect(client).to receive(:get).with( + path: "/responses/#{response_id}", + extra_headers: custom_headers + ).and_return({ "id" => response_id }) + + expect(response["id"]).to eq(response_id) + end + end end describe "#delete" do + let(:client) { OpenAI::Client.new } let(:model) { "gpt-4o" } let(:response_id) do VCR.use_cassette("responses delete setup") do @@ -187,8 +227,13 @@ def call(chunk, event) )["id"] end end - let(:response) { OpenAI::Client.new.responses.delete(response_id: response_id) } let(:cassette) { "responses delete" } + let(:response) do + client.responses.delete( + response_id: response_id, + extra_headers: extra_headers + ) + end it "succeeds" do VCR.use_cassette(cassette) do @@ -196,10 +241,26 @@ def call(chunk, event) expect(response["id"]).to eq(response_id) end end + + context "with extra_headers" do + let(:extra_headers) { custom_headers } + let(:response_id) { "resp_123" } + + it "passes extra_headers to the request" do + expect(client).to receive(:delete).with( + path: "/responses/#{response_id}", + extra_headers: custom_headers + ).and_return({ "deleted" => true }) + + expect(response["deleted"]).to eq(true) + end + end end describe "#input_items" do + let(:client) { OpenAI::Client.new } let(:model) { "gpt-4o" } + let(:parameters) { {} } let(:response_id) do VCR.use_cassette("responses input_items setup") do OpenAI::Client.new.responses.create( @@ -210,8 +271,14 @@ def call(chunk, event) )["id"] end end - let(:response) { OpenAI::Client.new.responses.input_items(response_id: response_id) } let(:cassette) { "responses input_items" } + let(:response) do + client.responses.input_items( + response_id: response_id, + parameters: parameters, + extra_headers: extra_headers + ) + end it "succeeds" do VCR.use_cassette(cassette) do @@ -219,6 +286,21 @@ def call(chunk, event) expect(response["data"]).to be_an(Array) end end + + context "with extra_headers" do + let(:extra_headers) { custom_headers } + let(:response_id) { "resp_123" } + + it "passes extra_headers to the request" do + expect(client).to receive(:get).with( + path: "/responses/#{response_id}/input_items", + parameters: parameters, + extra_headers: custom_headers + ).and_return({ "data" => [] }) + + expect(response["data"]).to eq([]) + end + end end end end