diff --git a/lib/ruby_llm/error.rb b/lib/ruby_llm/error.rb index 6768ab943..f182dfda1 100644 --- a/lib/ruby_llm/error.rb +++ b/lib/ruby_llm/error.rb @@ -69,7 +69,8 @@ class << self /token count exceeds/i, /input[_\s-]?token/i, /input or output tokens? must be reduced/i, - /reduce the length of messages/i + /reduce the length of messages/i, + /prompt is too long/i ].freeze def parse_error(provider:, response:) # rubocop:disable Metrics/PerceivedComplexity diff --git a/spec/ruby_llm/error_middleware_spec.rb b/spec/ruby_llm/error_middleware_spec.rb index 9437c9c79..ae957989a 100644 --- a/spec/ruby_llm/error_middleware_spec.rb +++ b/spec/ruby_llm/error_middleware_spec.rb @@ -58,6 +58,16 @@ end.to raise_error(RubyLLM::ContextLengthExceededError) end + it "maps Anthropic's 'prompt is too long' 400 error to ContextLengthExceededError" do + msg = 'prompt is too long: 209025 tokens > 200000 maximum' + response = Struct.new(:status, :body).new(400, %({"error":{"message":"#{msg}"}})) + provider = instance_double(RubyLLM::Provider, parse_error: msg) + + expect do + described_class.parse_error(provider: provider, response: response) + end.to raise_error(RubyLLM::ContextLengthExceededError) + end + it 'keeps regular 400 errors as BadRequestError' do response = Struct.new(:status, :body).new(400, '{"error":{"message":"Invalid model specified"}}') provider = instance_double(RubyLLM::Provider, parse_error: 'Invalid model specified')