module RubyLLM::Providers::OpenRouter::Streaming
Streaming methods of the OpenRouter API integration
Public Instance Methods
Source
# File lib/ruby_llm/providers/openrouter/streaming.rb, line 14 def build_chunk(data) usage = data['usage'] || {} delta = data.dig('choices', 0, 'delta') || {} Chunk.new( role: :assistant, model_id: data['model'], content: delta['content'], thinking: Thinking.build( text: extract_thinking_text(delta), signature: extract_thinking_signature(delta) ), tool_calls: OpenAI::Tools.parse_tool_calls(delta['tool_calls'], parse_arguments: false), input_tokens: OpenRouter::Chat.input_tokens(usage), output_tokens: OpenRouter::Chat.output_tokens(usage), cached_tokens: OpenRouter::Chat.cache_read_tokens(usage), cache_creation_tokens: OpenRouter::Chat.cache_write_tokens(usage), thinking_tokens: OpenRouter::Chat.thinking_tokens(usage) ) end
# File lib/ruby_llm/providers/openrouter/streaming.rb, line 58 def extract_thinking_signature(delta) details = delta['reasoning_details'] return nil unless details.is_a?(Array) signature = details.filter_map do |detail| detail['signature'] if detail['signature'].is_a?(String) end.first return signature if signature encrypted = details.find { |detail| detail['type'] == 'reasoning.encrypted' && detail['data'].is_a?(String) } encrypted&.dig('data') end
# File lib/ruby_llm/providers/openrouter/streaming.rb, line 39 def extract_thinking_text(delta) candidate = delta['reasoning'] return candidate if candidate.is_a?(String) details = delta['reasoning_details'] return nil unless details.is_a?(Array) text = details.filter_map do |detail| case detail['type'] when 'reasoning.text' detail['text'] when 'reasoning.summary' detail['summary'] end end.join text.empty? ? nil : text end
Source
# File lib/ruby_llm/providers/openrouter/streaming.rb, line 35 def parse_streaming_error(data) OpenAI::Streaming.parse_streaming_error(data) end
Source
# File lib/ruby_llm/providers/openrouter/streaming.rb, line 10 def stream_url completion_url end