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

Inherits:
Faraday::Middleware
  • Object
show all
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.



59
60
61
62
# File 'lib/legion/extensions/llm/error.rb', line 59

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

Class Method Details

.parse_error(provider:, response:) ⇒ Object

rubocop:disable Metrics/PerceivedComplexity



83
84
85
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
118
# File 'lib/legion/extensions/llm/error.rb', line 83

def parse_error(provider:, response:) # rubocop:disable Metrics/PerceivedComplexity
  response = response_with_stream_error_body(response)
  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



64
65
66
67
68
# File 'lib/legion/extensions/llm/error.rb', line 64

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