class RubyLLM::ErrorMiddleware
Uses provider’s parse_error method to extract meaningful error messages.
Faraday middleware that maps provider-specific API errors to RubyLLM errors.
def call(env)
def call(env) @app.call(env).on_complete do |response| self.class.parse_error(provider: @provider, response: response) end end
def initialize(app, provider:)
def initialize(app, provider:) super(app) @provider = provider end
def parse_error(provider:, response:) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/AbcSize,Metrics/PerceivedComplexity
def parse_error(provider:, response:) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/AbcSize,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