From b9662d99b4049d3b900b846636107a0ac7455b3c Mon Sep 17 00:00:00 2001 From: Kevin Lawver Date: Fri, 24 Apr 2026 15:42:46 -0400 Subject: [PATCH 1/2] Fixes issue #744: nil response bodies in openrouter responses --- lib/ruby_llm/providers/openrouter/chat.rb | 2 +- spec/ruby_llm/providers/open_router/chat_spec.rb | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/ruby_llm/providers/openrouter/chat.rb b/lib/ruby_llm/providers/openrouter/chat.rb index 0c3622bdf..704ed5f44 100644 --- a/lib/ruby_llm/providers/openrouter/chat.rb +++ b/lib/ruby_llm/providers/openrouter/chat.rb @@ -52,7 +52,7 @@ def render_payload(messages, tools:, temperature:, model:, stream: false, schema def parse_completion_response(response) data = response.body - return if data.empty? + return if data.blank? raise Error.new(response, data.dig('error', 'message')) if data.dig('error', 'message') diff --git a/spec/ruby_llm/providers/open_router/chat_spec.rb b/spec/ruby_llm/providers/open_router/chat_spec.rb index be77c5f83..9f034716a 100644 --- a/spec/ruby_llm/providers/open_router/chat_spec.rb +++ b/spec/ruby_llm/providers/open_router/chat_spec.rb @@ -3,8 +3,9 @@ require 'spec_helper' RSpec.describe RubyLLM::Providers::OpenRouter::Chat do + let(:model) { instance_double(RubyLLM::Model::Info, id: 'anthropic/claude-haiku-4.5') } + describe '.render_payload' do - let(:model) { instance_double(RubyLLM::Model::Info, id: 'anthropic/claude-haiku-4.5') } let(:messages) { [RubyLLM::Message.new(role: :user, content: 'Hello')] } before do @@ -63,4 +64,12 @@ expect(payload[:response_format][:json_schema][:strict]).to be(false) end end + + describe '.parse_completion_response' do + let(:response) { instance_double(Faraday::Response, body: nil) } + + it "doesn't throw an error when response is nil" do + expect { described_class.parse_completion_response(response) }.not_to raise_error + end + end end From 8f5c12cd1f7920ab456808d7fd7941935ea3b9d3 Mon Sep 17 00:00:00 2001 From: Kevin Lawver Date: Fri, 1 May 2026 09:35:48 -0400 Subject: [PATCH 2/2] Swaps .blank? check for .nil? || .empty? to remove ActiveSupport dependency --- lib/ruby_llm/providers/openrouter/chat.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ruby_llm/providers/openrouter/chat.rb b/lib/ruby_llm/providers/openrouter/chat.rb index 704ed5f44..6906d4380 100644 --- a/lib/ruby_llm/providers/openrouter/chat.rb +++ b/lib/ruby_llm/providers/openrouter/chat.rb @@ -52,7 +52,7 @@ def render_payload(messages, tools:, temperature:, model:, stream: false, schema def parse_completion_response(response) data = response.body - return if data.blank? + return if data.nil? || data.blank? raise Error.new(response, data.dig('error', 'message')) if data.dig('error', 'message')