diff --git a/lib/openai/internal/util.rb b/lib/openai/internal/util.rb index 429fbaf7..3f20340b 100644 --- a/lib/openai/internal/util.rb +++ b/lib/openai/internal/util.rb @@ -535,12 +535,13 @@ class << self # @param key [Symbol, String] # @param val [Object] # @param closing [Array] - private def write_multipart_chunk(y, boundary:, key:, val:, closing:) + private def write_multipart_chunk(y, boundary:, key:, val:, closing:, is_array: false) y << "--#{boundary}\r\n" y << "Content-Disposition: form-data" unless key.nil? name = ERB::Util.url_encode(key.to_s) + name = "#{name}[]" if is_array y << "; name=\"#{name}\"" end @@ -577,7 +578,14 @@ class << self case val in Array if val.all? { primitive?(_1) } val.each do |v| - write_multipart_chunk(y, boundary: boundary, key: key, val: v, closing: closing) + write_multipart_chunk( + y, + boundary: boundary, + key: key, + val: v, + closing: closing, + is_array: true + ) end else write_multipart_chunk(y, boundary: boundary, key: key, val: val, closing: closing) diff --git a/sig/openai/internal/util.rbs b/sig/openai/internal/util.rbs index ec425e9f..98dcf392 100644 --- a/sig/openai/internal/util.rbs +++ b/sig/openai/internal/util.rbs @@ -118,7 +118,8 @@ module OpenAI boundary: String, key: Symbol | String, val: top, - closing: ::Array[^-> void] + closing: ::Array[^-> void], + ?is_array: bool ) -> void def self?.encode_multipart_streaming: ( diff --git a/test/openai/internal/util_test.rb b/test/openai/internal/util_test.rb index 560d786d..289d8922 100644 --- a/test/openai/internal/util_test.rb +++ b/test/openai/internal/util_test.rb @@ -264,7 +264,7 @@ def test_hash_encode cases = { {a: 2, b: 3} => {"a" => "2", "b" => "3"}, {a: 2, b: nil} => {"a" => "2", "b" => "null"}, - {a: 2, b: [1, 2, 3]} => {"a" => "2", "b" => "1"}, + {a: 2, b: [1, 2, 3]} => {"a" => "2", "b[]" => "1"}, {strio: StringIO.new("a")} => {"strio" => "a"}, {strio: OpenAI::FilePart.new("a")} => {"strio" => "a"}, {pathname: Pathname(__FILE__)} => {"pathname" => -> { _1.read in /^class OpenAI/ }},