Module: LlmCostTracker::Providers::Anthropic::UsageExtractor

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

Class Method Summary collapse

Class Method Details

.cache_writes(usage) ⇒ Object



57
58
59
60
61
62
63
64
65
# File 'lib/llm_cost_tracker/providers/anthropic/usage_extractor.rb', line 57

def self.cache_writes(usage)
  cache_creation = usage[:cache_creation]
  if cache_creation.is_a?(Hash)
    [cache_creation[:ephemeral_5m_input_tokens].to_i, cache_creation[:ephemeral_1h_input_tokens].to_i]
  else
    warn_unexpected_cache_creation(cache_creation, usage)
    [usage[:cache_creation_input_tokens].to_i, 0]
  end
end

.pricing_mode(request:, usage:) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'lib/llm_cost_tracker/providers/anthropic/usage_extractor.rb', line 29

def self.pricing_mode(request:, usage:)
  speed = request&.dig(:speed)
  service_tier = usage&.dig(:service_tier) || request&.dig(:service_tier)
  geo = (usage&.dig(:inference_geo) || request&.dig(:inference_geo)).to_s.downcase

  modes = [Pricing::Mode.normalize(speed), Pricing::Mode.normalize(service_tier)]
  modes << "data_residency" if DATA_RESIDENCY_GEOS.include?(geo)
  Pricing::Mode.compose(modes)
end

.service_line_items(usage) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/llm_cost_tracker/providers/anthropic/usage_extractor.rb', line 39

def self.service_line_items(usage)
  server_tool_use = usage[:server_tool_use]
  return [] unless server_tool_use.is_a?(Hash)

  SERVER_TOOL_LINE_ITEMS.filter_map do |dimension_key, count_key|
    quantity = server_tool_use[count_key].to_i
    next if quantity.zero?

    Charges::LineItem.build(
      dimension_key: dimension_key,
      quantity: quantity,
      cost_status: Charges::CostStatus::UNKNOWN,
      pricing_basis: "provider_usage",
      provider_field: "usage.server_tool_use.#{count_key}"
    )
  end
end

.token_usage(usage) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/llm_cost_tracker/providers/anthropic/usage_extractor.rb', line 14

def self.token_usage(usage)
  input = usage[:input_tokens].to_i
  output = usage[:output_tokens].to_i
  cache_read = usage[:cache_read_input_tokens].to_i
  cache_write, cache_write_extended = cache_writes(usage)

  Usage::TokenUsage.build(
    input_tokens: input,
    output_tokens: output,
    cache_read_input_tokens: cache_read,
    cache_write_input_tokens: cache_write,
    cache_write_extended_input_tokens: cache_write_extended
  )
end

.warn_unexpected_cache_creation(cache_creation, usage) ⇒ Object



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

def self.warn_unexpected_cache_creation(cache_creation, usage)
  return if cache_creation.nil?
  return if usage.key?(:cache_creation_input_tokens)

  Logging.warn("Anthropic usage.cache_creation has unexpected shape: #{cache_creation.class}")
end