@@ -21,7 +21,10 @@ def initialize(host:, port:, timeout:, ssl:, persistent: false)
2121 @timeout = timeout
2222 @ssl = ssl
2323 @curl = ::Curl . multi
24- @curl . timeout = timeout if @curl . respond_to? ( :timeout= )
24+ @curl . timeout = timeout
25+ @curl . connect_timeout = timeout
26+ @curl . low_speed_limit = 1
27+ @curl . low_speed_time = timeout
2528 @monitor = Monitor . new
2629 end
2730
@@ -87,7 +90,7 @@ def perform_streaming(request, owner, stream, active)
8790 raw_body = +""
8891 decoder_class = stream . decoder == LLM ::Transport ::StreamDecoder ? LLM ::Transport ::Curl ::StreamDecoder : stream . decoder
8992 decoder = decoder_class . new ( stream . parser . new ( stream . streamer ) )
90- curl_request = @curl . send ( request_url ( request ) , build_http_request ( request ) ) do |header , chunk |
93+ curl_request = send_streaming_request ( request ) do |header , chunk |
9194 raise LLM ::Interrupt , "request interrupted" if interrupted? ( owner )
9295 res ||= LLM ::Transport ::Response . from ( header )
9396 if res . success? && res [ "content-type" ] . to_s . include? ( "text/event-stream" )
@@ -111,6 +114,17 @@ def perform_streaming(request, owner, stream, active)
111114 decoder &.free
112115 end
113116
117+ def send_streaming_request ( request , &block )
118+ previous_timeout = @curl . timeout
119+ previous_timeout_ms = @curl . timeout_ms
120+ @curl . timeout = nil
121+ @curl . timeout_ms = nil
122+ @curl . send ( request_url ( request ) , build_http_request ( request ) , &block )
123+ ensure
124+ @curl . timeout = previous_timeout
125+ @curl . timeout_ms = previous_timeout_ms
126+ end
127+
114128 def perform_until_done ( request , owner )
115129 until request . done?
116130 if interrupted? ( owner )
0 commit comments