Sha256: a426ef3e596d8bbf857b19eeb4bd0d8a3f46c41f0105ba185c0873bc1d200bef

Contents?: true

Size: 885 Bytes

Versions: 6

Compression:

Stored size: 885 Bytes

Contents

# ai_client/retry_middleware.rb

class AiClient

  # AiClient.use(
  #   AiClient::RetryMiddleware.new(
  #     max_retries:  5,
  #     base_delay:   2,
  #     max_delay:    30
  #   )
  # )
  #
  class RetryMiddleware
    def initialize(max_retries: 3, base_delay: 2, max_delay: 16)
      @max_retries  = max_retries
      @base_delay   = base_delay
      @max_delay    = max_delay
    end

    def call(client, next_middleware, *args)
      retries = 0
      begin
        next_middleware.call
      rescue OmniAI::RateLimitError, OmniAI::NetworkError => e
        if retries < @max_retries
          retries += 1
          delay = [@base_delay * (2 ** (retries - 1)), @max_delay].min
          client.logger.warn("Retrying in #{delay} seconds due to error: #{e.message}")
          sleep(delay)
          retry
        else
          raise
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
ai_client-0.2.4 lib/ai_client/retry_middleware.rb
ai_client-0.2.3 lib/ai_client/retry_middleware.rb
ai_client-0.2.2 lib/ai_client/retry_middleware.rb
ai_client-0.2.1 lib/ai_client/retry_middleware.rb
ai_client-0.2.0 lib/ai_client/retry_middleware.rb
ai_client-0.1.0 lib/ai_client/retry_middleware.rb