Module: Legion::Extensions::Llm::Gateway::Helpers::UsageQueries

Defined in:
lib/legion/extensions/llm/gateway/helpers/usage_queries.rb

Class Method Summary collapse

Class Method Details

.aggregate_by_column(dataset, column, limit) ⇒ Object



34
35
36
37
38
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 34

def aggregate_by_column(dataset, column, limit)
  grouped_query(dataset, column).limit(limit).all.map do |row|
    format_grouped_row(row, column)
  end
end

.aggregate_totals(dataset) ⇒ Object



19
20
21
22
23
24
25
26
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 19

def aggregate_totals(dataset)
  {
    total_requests: dataset.count,
    total_cost_usd: dataset.sum(:cost_usd).to_f.round(4),
    total_input:    dataset.sum(:input_tokens).to_i,
    total_output:   dataset.sum(:output_tokens).to_i
  }
end

.append_aggregates(query) ⇒ Object



45
46
47
48
49
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 45

def append_aggregates(query)
  query.select_append { sum(cost_usd).as(total_cost) }
       .select_append { sum(input_tokens).as(total_input) }
       .select_append { sum(output_tokens).as(total_output) }
end

.day_start(time) ⇒ Object



72
73
74
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 72

def day_start(time)
  Time.utc(time.year, time.month, time.day)
end

.format_grouped_row(row, column, name_key: false) ⇒ Object



51
52
53
54
55
56
57
58
59
60
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 51

def format_grouped_row(row, column, name_key: false)
  key = name_key ? :name : column
  {
    key => row[column],
    total_cost: row[:total_cost].to_f.round(4),
    total_input: row[:total_input].to_i,
    total_output: row[:total_output].to_i,
    requests: row[:count].to_i
  }
end

.grouped_query(dataset, column) ⇒ Object



40
41
42
43
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 40

def grouped_query(dataset, column)
  base = dataset.exclude(column => nil).group_and_count(column)
  append_aggregates(base).order(::Sequel.desc(:total_cost))
end

.grouped_rows(dataset, column) ⇒ Object



28
29
30
31
32
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 28

def grouped_rows(dataset, column)
  grouped_query(dataset, column).limit(20).all.map do |row|
    format_grouped_row(row, column, name_key: true)
  end
end

.metering_recordsObject



11
12
13
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 11

def metering_records
  Legion::Data.connection[:metering_records]
end

.metering_since(since) ⇒ Object



15
16
17
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 15

def metering_since(since)
  metering_records.where { recorded_at >= since }
end

.period_start(period) ⇒ Object



62
63
64
65
66
67
68
69
70
# File 'lib/legion/extensions/llm/gateway/helpers/usage_queries.rb', line 62

def period_start(period)
  now = Time.now.utc
  case period.to_sym
  when :hour  then now - 3600
  when :week  then day_start(now) - ((now.wday % 7) * 86_400)
  when :month then Time.utc(now.year, now.month, 1)
  else day_start(now)
  end
end