Class: Legion::Extensions::Llm::ErrorMiddleware

Inherits:
Faraday::Middleware
  • Object
show all
Extended by:
Logging::Helper
Defined in:
lib/legion/extensions/llm/error.rb

Overview

Faraday middleware that maps provider-specific API errors to Legion::Extensions::Llm errors.

Defined Under Namespace

Classes: ResponseWithBody

Constant Summary collapse

STREAM_ERROR_BODY_KEY =
:legion_llm_stream_error_body
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.



76
77
78
79
# File 'lib/legion/extensions/llm/error.rb', line 76

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

Class Method Details

.parse_error(provider:, response:) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/legion/extensions/llm/error.rb', line 100

def parse_error(provider:, response:)
  response = response_with_stream_error_body(response)
  message = provider&.parse_error(response)

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

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

    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



81
82
83
84
85
# File 'lib/legion/extensions/llm/error.rb', line 81

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