summaryrefslogtreecommitdiffhomepage
path: root/lib/dispatch/adapter/claude/errors.rb
blob: f509df8214f2aeb250e675fb956d6e4cd35303d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# frozen_string_literal: true

module Dispatch
  module Adapter
    class OverloadedError < RateLimitError; end

    module ClaudeErrors
      module_function

      PROVIDER = "Anthropic (Claude)"

      def handle_response!(response)
        return if response.is_a?(Net::HTTPSuccess)

        code = response.code.to_i
        msg  = parse_message(response.body)
        retry_after = response["Retry-After"]&.to_i

        case code
        when 401, 403 then raise AuthenticationError.new(msg, status_code: code, provider: PROVIDER)
        when 429      then raise RateLimitError.new(msg, status_code: code, provider: PROVIDER, retry_after:)
        when 529      then raise OverloadedError.new(msg, status_code: code, provider: PROVIDER, retry_after:)
        when 400, 422 then raise RequestError.new(msg, status_code: code, provider: PROVIDER)
        when 500..599 then raise ServerError.new(msg, status_code: code, provider: PROVIDER)
        else raise Error.new(msg, status_code: code, provider: PROVIDER)
        end
      end

      def parse_message(body)
        JSON.parse(body.to_s).dig("error", "message") || body.to_s
      rescue JSON::ParserError
        body.to_s
      end
    end
  end
end