Class: LlmCostTracker::Call

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/llm_cost_tracker/call.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.already_recorded?(provider:, provider_response_id:) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
47
48
# File 'app/models/llm_cost_tracker/call.rb', line 44

def already_recorded?(provider:, provider_response_id:)
  return false if provider_response_id.to_s.empty?

  where(provider: provider, provider_response_id: provider_response_id).exists?
end

.average_latency_msObject



81
# File 'app/models/llm_cost_tracker/call.rb', line 81

def average_latency_ms = average(:latency_ms)&.to_f

.by_tag(key, value) ⇒ Object



50
# File 'app/models/llm_cost_tracker/call.rb', line 50

def by_tag(key, value) = by_tags(key => value)

.by_tags(tags) ⇒ Object



52
# File 'app/models/llm_cost_tracker/call.rb', line 52

def by_tags(tags) = Ledger::Tags::Query.apply(tags)

.cost_by_model(limit: nil) ⇒ Object



58
# File 'app/models/llm_cost_tracker/call.rb', line 58

def cost_by_model(limit: nil) = cost_by_column(:model, limit: limit)

.cost_by_provider(limit: nil) ⇒ Object



60
# File 'app/models/llm_cost_tracker/call.rb', line 60

def cost_by_provider(limit: nil) = cost_by_column(:provider, limit: limit)

.cost_by_tag(key, limit: nil) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'app/models/llm_cost_tracker/call.rb', line 66

def cost_by_tag(key, limit: nil)
  label = Ledger::Tags::Breakdown.label_sql(connection)
  raw_value = Ledger::Tags::Breakdown.raw_value_sql(connection)
  relation = Ledger::Tags::Breakdown.join_relation(self, key)
                                    .select("#{label} AS name", "COALESCE(SUM(total_cost), 0) AS total_cost")
                                    .group(Arel.sql(label))
                                    .order(
                                      Arel.sql("COALESCE(SUM(total_cost), 0) DESC"),
                                      Arel.sql("MAX(CASE WHEN #{raw_value} IS NULL THEN 1 ELSE 0 END) ASC"),
                                      Arel.sql("#{label} DESC")
                                    )
  relation = relation.limit(limit) if limit
  relation
end

.daily_costs(days: 30) ⇒ Object



91
92
93
94
95
# File 'app/models/llm_cost_tracker/call.rb', line 91

def daily_costs(days: 30)
  where(tracked_at: days.days.ago..)
    .group_by_period(:day)
    .sum(:total_cost)
end

.group_by_period(period, column: :tracked_at) ⇒ Object



87
88
89
# File 'app/models/llm_cost_tracker/call.rb', line 87

def group_by_period(period, column: :tracked_at)
  group(Arel.sql(period_group_expression(period, column: column)))
end

.group_by_tag(key) ⇒ Object



62
63
64
# File 'app/models/llm_cost_tracker/call.rb', line 62

def group_by_tag(key)
  Ledger::Tags::Breakdown.join_relation(self, key).group(Ledger::Tags::Breakdown.value_arel)
end

.latency_by_modelObject



83
# File 'app/models/llm_cost_tracker/call.rb', line 83

def latency_by_model = group(:model).average(:latency_ms).transform_values(&:to_f)

.latency_by_providerObject



85
# File 'app/models/llm_cost_tracker/call.rb', line 85

def latency_by_provider = group(:provider).average(:latency_ms).transform_values(&:to_f)

.total_costObject



54
# File 'app/models/llm_cost_tracker/call.rb', line 54

def total_cost = sum(:total_cost).to_f

.total_tokensObject



56
# File 'app/models/llm_cost_tracker/call.rb', line 56

def total_tokens = sum(:total_tokens).to_i

Instance Method Details

#tag_pairsObject



119
120
121
122
123
# File 'app/models/llm_cost_tracker/call.rb', line 119

def tag_pairs
  tag_records.to_h do |record|
    [record.key, record.value]
  end
end