Class: LlmCostTracker::Usage::TokenUsage

Inherits:
Data
  • Object
show all
Defined in:
lib/llm_cost_tracker/usage/token_usage.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#hidden_output_tokensObject (readonly)

Returns the value of attribute hidden_output_tokens

Returns:

  • (Object)

    the current value of hidden_output_tokens



7
8
9
# File 'lib/llm_cost_tracker/usage/token_usage.rb', line 7

def hidden_output_tokens
  @hidden_output_tokens
end

#total_tokensObject (readonly)

Returns the value of attribute total_tokens

Returns:

  • (Object)

    the current value of total_tokens



7
8
9
# File 'lib/llm_cost_tracker/usage/token_usage.rb', line 7

def total_tokens
  @total_tokens
end

Class Method Details

.build(**values) ⇒ Object

Raises:

  • (ArgumentError)


12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/llm_cost_tracker/usage/token_usage.rb', line 12

def self.build(**values)
  unknown = values.keys - members
  raise ArgumentError, "unknown token keys: #{unknown.inspect}" if unknown.any?

  priced = Catalog.token_priced.to_h do |dimension|
    [dimension.token_key, non_negative_int(values[dimension.token_key])]
  end
  subtotal = priced.values.sum
  declared_total = values[:total_tokens]
  total = declared_total ? [non_negative_int(declared_total), subtotal].max : subtotal
  new(**priced, total_tokens: total, hidden_output_tokens: non_negative_int(values[:hidden_output_tokens]))
end

.build_from_tokens(tokens) ⇒ Object

Raises:

  • (ArgumentError)


25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/llm_cost_tracker/usage/token_usage.rb', line 25

def self.build_from_tokens(tokens)
  return tokens if tokens.is_a?(self)
  raise ArgumentError, "tokens must be a Hash, got #{tokens.class}" unless tokens.respond_to?(:to_h)

  values = tokens.to_h.transform_keys(&:to_s)
  known = members.map(&:to_s)
  unknown = values.keys - known
  if unknown.any?
    hint = values.keys.intersect?(known) ? "" : ". Did you pass a raw provider response?"
    raise ArgumentError, "unknown token keys: #{unknown.inspect}; expected #{known.inspect}#{hint}"
  end

  build(**values.transform_keys(&:to_sym))
end

.non_negative_int(value) ⇒ Object



40
41
42
# File 'lib/llm_cost_tracker/usage/token_usage.rb', line 40

def self.non_negative_int(value)
  [value.to_i, 0].max
end

Instance Method Details

#priced_quantitiesObject



8
9
10
# File 'lib/llm_cost_tracker/usage/token_usage.rb', line 8

def priced_quantities
  Catalog.token_priced.to_h { |dimension| [dimension.key, public_send(dimension.token_key)] }
end