Module: RubyLLM::Agents::Execution::Metrics

Extended by:
ActiveSupport::Concern
Included in:
RubyLLM::Agents::Execution
Defined in:
app/models/ruby_llm/agents/execution/metrics.rb

Overview

Metrics concern for cost calculations and performance metrics

Provides instance methods for calculating costs from token usage, formatting durations, and computing performance metrics.

See Also:

Cost Display Helpers collapse

Instance Method Summary collapse

Instance Method Details

#calculate_costs!(model_info = nil) ⇒ void

Note:

Requires input_tokens and output_tokens to be set

This method returns an undefined value.

Calculates and sets input/output costs from token usage

Uses RubyLLM’s built-in pricing data to calculate costs. Sets input_cost and output_cost attributes (total_cost is calculated by callback).

Parameters:

  • model_info (RubyLLM::Model, nil) (defaults to: nil)

    Optional pre-resolved model info



24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'app/models/ruby_llm/agents/execution/metrics.rb', line 24

def calculate_costs!(model_info = nil)
  return unless input_tokens && output_tokens

  model_info ||= resolve_model_info
  return unless model_info

  # Get pricing from RubyLLM (prices per million tokens in dollars)
  input_price_per_million = model_info.pricing&.text_tokens&.input || 0
  output_price_per_million = model_info.pricing&.text_tokens&.output || 0

  # Calculate costs in dollars (with 6 decimal precision for micro-dollars)
  self.input_cost = ((input_tokens / 1_000_000.0) * input_price_per_million).round(6)
  self.output_cost = ((output_tokens / 1_000_000.0) * output_price_per_million).round(6)
end

#cost_per_1k_tokensFloat?

Calculates cost efficiency as cost per 1,000 tokens

Useful for comparing cost efficiency across different models.

Returns:

  • (Float, nil)

    Cost per 1K tokens in USD, or nil if data unavailable



59
60
61
62
# File 'app/models/ruby_llm/agents/execution/metrics.rb', line 59

def cost_per_1k_tokens
  return nil unless total_tokens && total_tokens > 0 && total_cost
  (total_cost / total_tokens.to_f * 1000).round(6)
end

#duration_secondsFloat?

Returns execution duration in seconds

Returns:

  • (Float, nil)

    Duration in seconds with 2 decimal places, or nil



42
43
44
# File 'app/models/ruby_llm/agents/execution/metrics.rb', line 42

def duration_seconds
  duration_ms ? (duration_ms / 1000.0).round(2) : nil
end

#formatted_input_costString?

Returns input_cost formatted as currency

Returns:

  • (String, nil)

    Formatted cost (e.g., “$0.000045”) or nil



69
70
71
# File 'app/models/ruby_llm/agents/execution/metrics.rb', line 69

def formatted_input_cost
  format_cost(input_cost)
end

#formatted_output_costString?

Returns output_cost formatted as currency

Returns:

  • (String, nil)

    Formatted cost (e.g., “$0.000045”) or nil



76
77
78
# File 'app/models/ruby_llm/agents/execution/metrics.rb', line 76

def formatted_output_cost
  format_cost(output_cost)
end

#formatted_total_costString?

Returns total_cost formatted as currency

Returns:

  • (String, nil)

    Formatted cost (e.g., “$0.000045”) or nil



83
84
85
# File 'app/models/ruby_llm/agents/execution/metrics.rb', line 83

def formatted_total_cost
  format_cost(total_cost)
end

#tokens_per_secondFloat?

Calculates throughput as tokens processed per second

Returns:

  • (Float, nil)

    Tokens per second, or nil if data unavailable



49
50
51
52
# File 'app/models/ruby_llm/agents/execution/metrics.rb', line 49

def tokens_per_second
  return nil unless duration_ms && duration_ms > 0 && total_tokens
  (total_tokens / duration_seconds.to_f).round(2)
end