From c5aa510b9f502e43bfd96c212e4c7d7a465036a7 Mon Sep 17 00:00:00 2001 From: yasming Date: Tue, 12 May 2026 07:34:49 -0300 Subject: [PATCH] Handle 'prompt is too long' error as ContextLengthExceededError --- lib/ruby_llm/error.rb | 3 ++- spec/ruby_llm/error_middleware_spec.rb | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/ruby_llm/error.rb b/lib/ruby_llm/error.rb index 04ec8c466..cf7272271 100644 --- a/lib/ruby_llm/error.rb +++ b/lib/ruby_llm/error.rb @@ -59,7 +59,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')