Class: RubyLLM::ErrorMiddleware

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/ruby_llm/error.rb

Overview

Faraday middleware that maps provider-specific API errors to RubyLLM errors.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ ErrorMiddleware



33
34
35
36
# File 'lib/ruby_llm/error.rb', line 33

def initialize(app, options = {})
  super(app)
  @provider = options[:provider]
end

Class Method Details

.parse_error(provider:, response:) ⇒ Object

rubocop:disable Metrics/PerceivedComplexity



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/ruby_llm/error.rb', line 45

def parse_error(provider:, response:) # rubocop:disable Metrics/PerceivedComplexity
  message = provider&.parse_error(response)

  case response.status
  when 200..399
    message
  when 400
    raise BadRequestError.new(response, message || 'Invalid request - please check your input')
  when 401
    raise UnauthorizedError.new(response, message || 'Invalid API key - check your credentials')
  when 402
    raise PaymentRequiredError.new(response, message || 'Payment required - please top up your account')
  when 403
    raise ForbiddenError.new(response,
                             message || 'Forbidden - you do not have permission to access this resource')
  when 429
    raise RateLimitError.new(response, message || 'Rate limit exceeded - please wait a moment')
  when 500
    raise ServerError.new(response, message || 'API server error - please try again')
  when 502..503
    raise ServiceUnavailableError.new(response, message || 'API server unavailable - please try again later')
  when 529
    raise OverloadedError.new(response, message || 'Service overloaded - please try again later')
  else
    raise Error.new(response, message || 'An unknown error occurred')
  end
end

Instance Method Details

#call(env) ⇒ Object



38
39
40
41
42
# File 'lib/ruby_llm/error.rb', line 38

def call(env)
  @app.call(env).on_complete do |response|
    self.class.parse_error(provider: @provider, response: response)
  end
end