Class: RubyLLM::ErrorMiddleware

Inherits:
Faraday::Middleware
  • Object
show all
Defined in:
lib/ruby_llm/error_middleware.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,
  /prompt is too long/i
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of ErrorMiddleware.



9
10
11
12
# File 'lib/ruby_llm/error_middleware.rb', line 9

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

Class Method Details

.parse_error(provider:, response:) ⇒ Object

rubocop:disable Metrics/PerceivedComplexity



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/ruby_llm/error_middleware.rb', line 34

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



14
15
16
17
18
# File 'lib/ruby_llm/error_middleware.rb', line 14

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