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.

Constant Summary collapse

CONTEXT_LENGTH_PATTERNS =
[
  /context length/i,
  /context window/i,
  /maximum context/i,
  /request too large/i,
  /too many tokens/i,
  /token count exceeds/i,
  /input[_\s-]?token/i,
  /input or output tokens? must be reduced/i,
  /reduce the length of messages/i
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of ErrorMiddleware.



41
42
43
44
# File 'lib/ruby_llm/error.rb', line 41

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

Class Method Details

.parse_error(provider:, response:) ⇒ Object

rubocop:disable Metrics/PerceivedComplexity



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/ruby_llm/error.rb', line 65

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

  case response.status
  when 200..399
    message
  when 400
    if context_length_exceeded?(message)
      raise ContextLengthExceededError.new(response, message || 'Context length exceeded')
    end

    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
    if context_length_exceeded?(message)
      raise ContextLengthExceededError.new(response, message || 'Context length exceeded')
    end

    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..504
    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



46
47
48
49
50
# File 'lib/ruby_llm/error.rb', line 46

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