Module: RubyLLM::Providers::Bedrock::Streaming::ContentExtraction

Defined in:
lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb

Overview

Module for handling content extraction from AWS Bedrock streaming responses.

Instance Method Summary collapse

Instance Method Details

#extract_cache_creation_tokens(data) ⇒ Object



64
65
66
67
68
69
70
71
72
73
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 64

def extract_cache_creation_tokens(data)
  direct = data.dig('message', 'usage',
                    'cache_creation_input_tokens') || data.dig('usage', 'cache_creation_input_tokens')
  return direct if direct

  breakdown = data.dig('message', 'usage', 'cache_creation') || data.dig('usage', 'cache_creation')
  return unless breakdown.is_a?(Hash)

  breakdown.values.compact.sum
end

#extract_cached_tokens(data) ⇒ Object



60
61
62
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 60

def extract_cached_tokens(data)
  data.dig('message', 'usage', 'cache_read_input_tokens') || data.dig('usage', 'cache_read_input_tokens')
end

#extract_input_tokens(data) ⇒ Object



52
53
54
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 52

def extract_input_tokens(data)
  data.dig('message', 'usage', 'input_tokens')
end

#extract_model_id(data) ⇒ Object



48
49
50
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 48

def extract_model_id(data)
  data.dig('message', 'model') || @model_id
end

#extract_output_tokens(data) ⇒ Object



56
57
58
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 56

def extract_output_tokens(data)
  data.dig('message', 'usage', 'output_tokens') || data.dig('usage', 'output_tokens')
end

#extract_signature_delta(data) ⇒ Object



33
34
35
36
37
38
39
40
41
42
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 33

def extract_signature_delta(data)
  return nil unless data.is_a?(Hash)

  signature = extract_signature_from_delta(data)
  return signature if signature

  return nil unless data['type'] == 'content_block_start'

  extract_signature_from_block(data['content_block'])
end

#extract_streaming_content(data) ⇒ Object



13
14
15
16
17
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 13

def extract_streaming_content(data)
  return '' unless data.is_a?(Hash)

  extract_content_by_type(data)
end

#extract_thinking_delta(data) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 19

def extract_thinking_delta(data)
  return nil unless data.is_a?(Hash)

  if data['type'] == 'content_block_delta' && data.dig('delta', 'type') == 'thinking_delta'
    return data.dig('delta', 'thinking')
  end

  if data['type'] == 'content_block_start' && data.dig('content_block', 'type') == 'thinking'
    return data.dig('content_block', 'thinking') || data.dig('content_block', 'text')
  end

  nil
end

#extract_thinking_tokens(data) ⇒ Object



75
76
77
78
79
80
81
82
83
84
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 75

def extract_thinking_tokens(data)
  data.dig('message', 'usage', 'thinking_tokens') ||
    data.dig('message', 'usage', 'output_tokens_details', 'thinking_tokens') ||
    data.dig('usage', 'thinking_tokens') ||
    data.dig('usage', 'output_tokens_details', 'thinking_tokens') ||
    data.dig('message', 'usage', 'reasoning_tokens') ||
    data.dig('message', 'usage', 'output_tokens_details', 'reasoning_tokens') ||
    data.dig('usage', 'reasoning_tokens') ||
    data.dig('usage', 'output_tokens_details', 'reasoning_tokens')
end

#extract_tool_calls(data) ⇒ Object



44
45
46
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 44

def extract_tool_calls(data)
  data.dig('message', 'tool_calls') || data['tool_calls']
end

#json_delta?(data) ⇒ Boolean

Returns:

  • (Boolean)


9
10
11
# File 'lib/ruby_llm/providers/bedrock/streaming/content_extraction.rb', line 9

def json_delta?(data)
  data['type'] == 'content_block_delta' && data.dig('delta', 'type') == 'input_json_delta'
end