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.



62
63
64
65
# File 'lib/legion/extensions/llm/error.rb', line 62

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

Class Method Details

.parse_error(provider:, response:) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/legion/extensions/llm/error.rb', line 86

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



67
68
69
70
71
# File 'lib/legion/extensions/llm/error.rb', line 67

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