Skip to content

Commit eaef87f

Browse files
committed
Expose response header metadata on SDK responses
1 parent c86923e commit eaef87f

15 files changed

Lines changed: 163 additions & 1 deletion

File tree

lib/openai/helpers/streaming/chat_completion_stream.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ class ChatCompletionStream
88

99
def initialize(raw_stream:, response_format: nil, input_tools: nil)
1010
@raw_stream = raw_stream
11+
@headers = raw_stream.headers
12+
@status = raw_stream.status
1113
@state = ChatCompletionStreamState.new(
1214
response_format: response_format,
1315
input_tools: input_tools

lib/openai/helpers/streaming/response_stream.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ def initialize(raw_stream:, text_format: nil, starting_after: nil)
1010
@text_format = text_format
1111
@starting_after = starting_after
1212
@raw_stream = raw_stream
13+
@headers = raw_stream.headers
14+
@status = raw_stream.status
1315
@iterator = iterator
1416
@state = ResponseStreamState.new(
1517
text_format: text_format

lib/openai/internal/transport/base_client.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,10 +510,24 @@ def request(req)
510510
page.new(client: self, req: req, headers: headers, page_data: decoded)
511511
else
512512
unwrapped = OpenAI::Internal::Util.dig(decoded, unwrap)
513-
OpenAI::Internal::Type::Converter.coerce(model, unwrapped)
513+
attach_response_metadata(OpenAI::Internal::Type::Converter.coerce(model, unwrapped), headers)
514514
end
515515
end
516516

517+
# @api private
518+
#
519+
# @param result [Object]
520+
# @param headers [Hash{String=>String}]
521+
#
522+
# @return [Object]
523+
private
524+
525+
def attach_response_metadata(result, headers)
526+
return result unless result.respond_to?(:__set_response_headers)
527+
528+
result.__set_response_headers(headers)
529+
end
530+
517531
# @api private
518532
#
519533
# @return [String]

lib/openai/internal/type/base_model.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ class BaseModel
88
extend OpenAI::Internal::Type::Converter
99
extend OpenAI::Internal::Util::SorbetRuntimeSupport
1010

11+
# @api public
12+
#
13+
# @return [Hash{String=>String}, nil]
14+
attr_reader :response_headers
15+
1116
class << self
1217
# @api private
1318
#
@@ -486,6 +491,15 @@ def initialize(data = {})
486491
end
487492
end
488493

494+
# @api private
495+
#
496+
# @param headers [Hash{String=>String}]
497+
# @return [self]
498+
def __set_response_headers(headers)
499+
@response_headers = headers
500+
self
501+
end
502+
489503
class << self
490504
# @api private
491505
#

lib/openai/internal/type/base_page.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ module Type
99
#
1010
# This module provides a base implementation for paginated responses in the SDK.
1111
module BasePage
12+
# @api public
13+
#
14+
# @return [Hash{String=>String}, nil]
15+
attr_reader :response_headers
16+
1217
# rubocop:disable Lint/UnusedMethodArgument
1318

1419
# @api public
@@ -45,9 +50,19 @@ def initialize(client:, req:, headers:, page_data:)
4550
@client = client
4651
@req = req
4752
@model = req.fetch(:model)
53+
@response_headers = headers
4854
super()
4955
end
5056

57+
# @api private
58+
#
59+
# @param headers [Hash{String=>String}]
60+
# @return [self]
61+
def __set_response_headers(headers)
62+
@response_headers = headers
63+
self
64+
end
65+
5166
# rubocop:enable Lint/UnusedMethodArgument
5267
end
5368
end

lib/openai/internal/type/base_stream.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ module BaseStream
1919
# @return [Hash{String=>String}]
2020
attr_reader :headers
2121

22+
# @api public
23+
#
24+
# @return [Hash{String=>String}]
25+
def response_headers = @headers
26+
2227
# @api public
2328
#
2429
# @return [void]

rbi/openai/internal/type/base_model.rbi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ module OpenAI
219219
def [](key)
220220
end
221221

222+
sig { returns(T.nilable(T::Hash[String, String])) }
223+
attr_reader :response_headers
224+
end
225+
222226
# Returns a Hash of the data underlying this object. O(1)
223227
#
224228
# Keys are Symbols and values are the raw values from the response. The return
@@ -278,6 +282,10 @@ module OpenAI
278282
def self.new(data = {})
279283
end
280284

285+
sig { params(headers: T::Hash[String, String]).returns(T.self_type) }
286+
def __set_response_headers(headers)
287+
end
288+
281289
class << self
282290
# @api private
283291
sig { params(depth: Integer).returns(String) }

rbi/openai/internal/type/base_page.rbi

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ module OpenAI
2525
def to_enum
2626
end
2727

28+
sig { returns(T.nilable(T::Hash[String, String])) }
29+
attr_reader :response_headers
30+
end
31+
2832
# @api private
2933
sig do
3034
params(
@@ -36,6 +40,10 @@ module OpenAI
3640
end
3741
def initialize(client:, req:, headers:, page_data:)
3842
end
43+
44+
sig { params(headers: T::Hash[String, String]).returns(T.self_type) }
45+
def __set_response_headers(headers)
46+
end
3947
end
4048
end
4149
end

rbi/openai/internal/type/base_stream.rbi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ module OpenAI
1818
sig { returns(T::Hash[String, String]) }
1919
attr_reader :headers
2020

21+
sig { returns(T::Hash[String, String]) }
22+
def response_headers
23+
end
24+
2125
sig { void }
2226
def close
2327
end

sig/openai/internal/type/base_model.rbs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ module OpenAI
7777

7878
def []: (Symbol key) -> top?
7979

80+
def response_headers: -> ::Hash[String, String]?
81+
8082
def to_h: -> ::Hash[Symbol, top]
8183

8284
alias to_hash to_h
@@ -91,6 +93,8 @@ module OpenAI
9193

9294
def initialize: (?::Hash[Symbol, top] | instance data) -> void
9395

96+
def __set_response_headers: (::Hash[String, String] headers) -> self
97+
9498
def self.inspect: (?depth: Integer) -> String
9599

96100
def to_s: -> String

0 commit comments

Comments
 (0)