Class: LlmCostTracker::Dashboard::TopModels

Inherits:
Object
  • Object
show all
Defined in:
app/services/llm_cost_tracker/dashboard/top_models.rb

Constant Summary collapse

DEFAULT_LIMIT =
5
SORT_OPTIONS =
%w[cost calls avg_cost latency].freeze
DEFAULT_SORT =
"cost"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(scope:, limit:, sort: DEFAULT_SORT) ⇒ TopModels

Returns a new instance of TopModels.



27
28
29
30
31
# File 'app/services/llm_cost_tracker/dashboard/top_models.rb', line 27

def initialize(scope:, limit:, sort: DEFAULT_SORT)
  @scope = scope
  @limit = limit
  @sort = SORT_OPTIONS.include?(sort.to_s) ? sort.to_s : DEFAULT_SORT
end

Class Method Details

.call(scope: LlmCostTracker::LlmApiCall.all, limit: DEFAULT_LIMIT, sort: DEFAULT_SORT) ⇒ Object



22
23
24
# File 'app/services/llm_cost_tracker/dashboard/top_models.rb', line 22

def call(scope: LlmCostTracker::LlmApiCall.all, limit: DEFAULT_LIMIT, sort: DEFAULT_SORT)
  new(scope: scope, limit: limit, sort: sort).rows
end

Instance Method Details

#rowsObject



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'app/services/llm_cost_tracker/dashboard/top_models.rb', line 33

def rows
  grouped_rows.map do |row|
    calls = row.calls_count.to_i
    total_cost = row.total_cost_sum.to_f

    TopModel.new(
      provider: row.provider,
      model: row.model,
      calls: calls,
      total_cost: total_cost,
      average_cost_per_call: calls.positive? ? total_cost / calls : 0.0,
      input_tokens: row.input_tokens_sum.to_i,
      output_tokens: row.output_tokens_sum.to_i,
      average_latency_ms: average_latency(row)
    )
  end
end