Class: LlmCostTracker::Storage::ActiveRecordInbox

Inherits:
Object
  • Object
show all
Defined in:
lib/llm_cost_tracker/storage/active_record_inbox.rb

Constant Summary collapse

TABLE_NAME =
"llm_cost_tracker_inbox_events"
LEASE_TABLE_NAME =
"llm_cost_tracker_ingestor_leases"
MAX_ATTEMPTS =
5

Class Method Summary collapse

Class Method Details

.enabled?Boolean

Returns:

  • (Boolean)


24
25
26
27
28
29
30
31
32
33
# File 'lib/llm_cost_tracker/storage/active_record_inbox.rb', line 24

def enabled?
  return @enabled unless @enabled.nil?

  model = LlmCostTracker::LlmApiCall
  @enabled = model.columns_hash.key?("event_id") &&
             model.connection.data_source_exists?(TABLE_NAME) &&
             model.connection.data_source_exists?(LEASE_TABLE_NAME)
rescue StandardError
  @enabled = false
end

.event_from_row(row) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/llm_cost_tracker/storage/active_record_inbox.rb', line 49

def event_from_row(row)
  payload = JSON.parse(row.payload)
  cost = payload["cost"] && LlmCostTracker::Cost.new(**symbolize_keys(payload["cost"]))

  LlmCostTracker::Event.new(
    event_id: payload.fetch("event_id"),
    provider: payload.fetch("provider"),
    model: payload.fetch("model"),
    input_tokens: payload.fetch("input_tokens"),
    output_tokens: payload.fetch("output_tokens"),
    total_tokens: payload.fetch("total_tokens"),
    cache_read_input_tokens: payload.fetch("cache_read_input_tokens"),
    cache_write_input_tokens: payload.fetch("cache_write_input_tokens"),
    hidden_output_tokens: payload.fetch("hidden_output_tokens"),
    pricing_mode: payload["pricing_mode"],
    cost: cost,
    tags: payload.fetch("tags"),
    latency_ms: payload["latency_ms"],
    stream: payload.fetch("stream"),
    usage_source: payload["usage_source"],
    provider_response_id: payload["provider_response_id"],
    tracked_at: Time.iso8601(payload.fetch("tracked_at"))
  )
end

.pending_period_totals(periods, time:) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/llm_cost_tracker/storage/active_record_inbox.rb', line 41

def pending_period_totals(periods, time:)
  return periods.to_h { |period| [period, 0.0] } unless enabled?

  periods.to_h do |period|
    [period, pending_period_total(period, time)]
  end
end

.reset!Object



20
21
22
# File 'lib/llm_cost_tracker/storage/active_record_inbox.rb', line 20

def reset!
  remove_instance_variable(:@enabled) if instance_variable_defined?(:@enabled)
end

.save(event) ⇒ Object



35
36
37
38
39
# File 'lib/llm_cost_tracker/storage/active_record_inbox.rb', line 35

def save(event)
  insert_row(row_for(event))
  ActiveRecordIngestor.ensure_started
  event
end