Module: LlmCostTracker::Providers::Gemini::UsageExtractor

Defined in:
lib/llm_cost_tracker/providers/gemini/usage_extractor.rb

Class Method Summary collapse

Class Method Details

.audio_input_tokens(usage) ⇒ Object



46
47
48
49
50
# File 'lib/llm_cost_tracker/providers/gemini/usage_extractor.rb', line 46

def self.audio_input_tokens(usage)
  prompt_audio = modality_tokens(usage["promptTokensDetails"], "AUDIO")
  cache_audio = modality_tokens(usage["cacheTokensDetails"], "AUDIO")
  [prompt_audio - cache_audio, 0].max
end

.audio_output_tokens(usage) ⇒ Object



52
53
54
# File 'lib/llm_cost_tracker/providers/gemini/usage_extractor.rb', line 52

def self.audio_output_tokens(usage)
  modality_tokens(usage["candidatesTokensDetails"], "AUDIO")
end

.gross_output_tokens(usage) ⇒ Object



34
35
36
# File 'lib/llm_cost_tracker/providers/gemini/usage_extractor.rb', line 34

def self.gross_output_tokens(usage)
  usage["candidatesTokenCount"].to_i + usage["thoughtsTokenCount"].to_i
end

.image_input_tokens(usage) ⇒ Object



56
57
58
59
60
# File 'lib/llm_cost_tracker/providers/gemini/usage_extractor.rb', line 56

def self.image_input_tokens(usage)
  prompt_image = modality_tokens(usage["promptTokensDetails"], "IMAGE")
  cache_image = modality_tokens(usage["cacheTokensDetails"], "IMAGE")
  [prompt_image - cache_image, 0].max
end

.image_output_tokens(usage) ⇒ Object



62
63
64
# File 'lib/llm_cost_tracker/providers/gemini/usage_extractor.rb', line 62

def self.image_output_tokens(usage)
  modality_tokens(usage["candidatesTokensDetails"], "IMAGE")
end

.modality_tokens(details, modality) ⇒ Object



66
67
68
69
70
71
72
# File 'lib/llm_cost_tracker/providers/gemini/usage_extractor.rb', line 66

def self.modality_tokens(details, modality)
  Array(details).sum do |detail|
    next 0 unless detail["modality"] == modality

    detail["tokenCount"].to_i
  end
end

.regular_input_tokens(usage:, cache_read:, audio_input:, image_input:) ⇒ Object



38
39
40
# File 'lib/llm_cost_tracker/providers/gemini/usage_extractor.rb', line 38

def self.regular_input_tokens(usage:, cache_read:, audio_input:, image_input:)
  [usage["promptTokenCount"].to_i - cache_read - audio_input - image_input, 0].max
end

.regular_output_tokens(usage:, audio_output:, image_output:) ⇒ Object



42
43
44
# File 'lib/llm_cost_tracker/providers/gemini/usage_extractor.rb', line 42

def self.regular_output_tokens(usage:, audio_output:, image_output:)
  [gross_output_tokens(usage) - audio_output - image_output, 0].max
end

.token_usage(usage) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/llm_cost_tracker/providers/gemini/usage_extractor.rb', line 7

def self.token_usage(usage)
  cache_read = usage["cachedContentTokenCount"].to_i
  tool_use_prompt = usage["toolUsePromptTokenCount"].to_i
  audio_input = audio_input_tokens(usage)
  audio_output = audio_output_tokens(usage)
  image_input = image_input_tokens(usage)
  image_output = image_output_tokens(usage)

  Usage::TokenUsage.build(
    input_tokens: regular_input_tokens(usage: usage,
                                       cache_read: cache_read,
                                       audio_input: audio_input,
                                       image_input: image_input) +
                  tool_use_prompt,
    output_tokens: regular_output_tokens(usage: usage,
                                         audio_output: audio_output,
                                         image_output: image_output),
    total_tokens: usage["totalTokenCount"],
    cache_read_input_tokens: cache_read,
    audio_input_tokens: audio_input,
    audio_output_tokens: audio_output,
    image_input_tokens: image_input,
    image_output_tokens: image_output,
    hidden_output_tokens: usage["thoughtsTokenCount"]
  )
end