Skip to content

Commit c60933d

Browse files
chore(internal): allow streams to also be unwrapped on a per-row basis
1 parent 82e025b commit c60933d

File tree

5 files changed

+27
-5
lines changed

5 files changed

+27
-5
lines changed

lib/openai/internal/stream.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ class Stream
4747
message: message
4848
)
4949
in decoded
50-
y << OpenAI::Internal::Type::Converter.coerce(@model, decoded)
50+
unwrapped = OpenAI::Internal::Util.dig(decoded, @unwrap)
51+
y << OpenAI::Internal::Type::Converter.coerce(@model, unwrapped)
5152
end
5253
else
5354
end

lib/openai/internal/transport/base_client.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ def request(req)
471471
self.class.validate!(req)
472472
model = req.fetch(:model) { OpenAI::Internal::Type::Unknown }
473473
opts = req[:options].to_h
474+
unwrap = req[:unwrap]
474475
OpenAI::RequestOptions.validate!(opts)
475476
request = build_request(req.except(:options), opts)
476477
url = request.fetch(:url)
@@ -487,11 +488,18 @@ def request(req)
487488
decoded = OpenAI::Internal::Util.decode_content(response, stream: stream)
488489
case req
489490
in {stream: Class => st}
490-
st.new(model: model, url: url, status: status, response: response, stream: decoded)
491+
st.new(
492+
model: model,
493+
url: url,
494+
status: status,
495+
response: response,
496+
unwrap: unwrap,
497+
stream: decoded
498+
)
491499
in {page: Class => page}
492500
page.new(client: self, req: req, headers: response, page_data: decoded)
493501
else
494-
unwrapped = OpenAI::Internal::Util.dig(decoded, req[:unwrap])
502+
unwrapped = OpenAI::Internal::Util.dig(decoded, unwrap)
495503
OpenAI::Internal::Type::Converter.coerce(model, unwrapped)
496504
end
497505
end

lib/openai/internal/type/base_stream.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,14 @@ def to_enum = @iterator
6464
# @param url [URI::Generic]
6565
# @param status [Integer]
6666
# @param response [Net::HTTPResponse]
67+
# @param unwrap [Symbol, Integer, Array<Symbol, Integer>, Proc]
6768
# @param stream [Enumerable<Object>]
68-
def initialize(model:, url:, status:, response:, stream:)
69+
def initialize(model:, url:, status:, response:, unwrap:, stream:)
6970
@model = model
7071
@url = url
7172
@status = status
7273
@response = response
74+
@unwrap = unwrap
7375
@stream = stream
7476
@iterator = iterator
7577

rbi/openai/internal/type/base_stream.rbi

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,17 @@ module OpenAI
5252
url: URI::Generic,
5353
status: Integer,
5454
response: Net::HTTPResponse,
55+
unwrap:
56+
T.any(
57+
Symbol,
58+
Integer,
59+
T::Array[T.any(Symbol, Integer)],
60+
T.proc.params(arg0: T.anything).returns(T.anything)
61+
),
5562
stream: T::Enumerable[Message]
5663
).void
5764
end
58-
def initialize(model:, url:, status:, response:, stream:)
65+
def initialize(model:, url:, status:, response:, unwrap:, stream:)
5966
end
6067

6168
# @api private

sig/openai/internal/type/base_stream.rbs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ module OpenAI
2323
url: URI::Generic,
2424
status: Integer,
2525
response: top,
26+
unwrap: Symbol
27+
| Integer
28+
| ::Array[Symbol | Integer]
29+
| ^(top arg0) -> top,
2630
stream: Enumerable[Message]
2731
) -> void
2832

0 commit comments

Comments
 (0)