llm_cost_tracker 0.5.3 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/app/controllers/llm_cost_tracker/calls_controller.rb +35 -21
- data/app/services/llm_cost_tracker/dashboard/overview_stats.rb +3 -1
- data/app/services/llm_cost_tracker/dashboard/tag_key_explorer.rb +4 -5
- data/docs/architecture.md +1 -1
- data/docs/configuration.md +1 -1
- data/docs/technical/data-flow.md +8 -5
- data/docs/technical/operational-notes.md +21 -1
- data/docs/upgrading.md +1 -0
- data/lib/llm_cost_tracker/active_record_adapter.rb +49 -0
- data/lib/llm_cost_tracker/doctor/ingestion_check.rb +117 -0
- data/lib/llm_cost_tracker/doctor.rb +2 -0
- data/lib/llm_cost_tracker/event.rb +1 -0
- data/lib/llm_cost_tracker/generators/llm_cost_tracker/add_ingestion_generator.rb +29 -0
- data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/add_ingestion_to_llm_cost_tracker.rb.erb +33 -0
- data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/add_period_totals_to_llm_cost_tracker.rb.erb +14 -6
- data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/add_streaming_to_llm_api_calls.rb.erb +0 -4
- data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/create_llm_api_calls.rb.erb +30 -3
- data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/initializer.rb.erb +1 -1
- data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_llm_api_call_tags_to_jsonb.rb.erb +3 -1
- data/lib/llm_cost_tracker/inbox_event.rb +9 -0
- data/lib/llm_cost_tracker/ingestor_lease.rb +9 -0
- data/lib/llm_cost_tracker/period_grouping.rb +4 -3
- data/lib/llm_cost_tracker/pricing/lookup.rb +44 -11
- data/lib/llm_cost_tracker/railtie.rb +1 -0
- data/lib/llm_cost_tracker/storage/active_record_backend.rb +54 -3
- data/lib/llm_cost_tracker/storage/active_record_connection_cleanup.rb +13 -0
- data/lib/llm_cost_tracker/storage/active_record_inbox.rb +165 -0
- data/lib/llm_cost_tracker/storage/active_record_inbox_batch.rb +92 -0
- data/lib/llm_cost_tracker/storage/active_record_ingestor.rb +174 -0
- data/lib/llm_cost_tracker/storage/active_record_ingestor_lease.rb +38 -0
- data/lib/llm_cost_tracker/storage/active_record_period_totals.rb +84 -0
- data/lib/llm_cost_tracker/storage/active_record_periods.rb +31 -0
- data/lib/llm_cost_tracker/storage/active_record_rollup_batch.rb +41 -0
- data/lib/llm_cost_tracker/storage/active_record_rollup_upsert_sql.rb +42 -0
- data/lib/llm_cost_tracker/storage/active_record_rollups.rb +31 -69
- data/lib/llm_cost_tracker/storage/active_record_store.rb +42 -9
- data/lib/llm_cost_tracker/stream_collector.rb +18 -7
- data/lib/llm_cost_tracker/tag_sql.rb +3 -3
- data/lib/llm_cost_tracker/tags_column.rb +7 -1
- data/lib/llm_cost_tracker/tracker.rb +3 -0
- data/lib/llm_cost_tracker/version.rb +1 -1
- data/lib/llm_cost_tracker.rb +36 -1
- metadata +17 -2
data/lib/llm_cost_tracker.rb
CHANGED
|
@@ -31,6 +31,7 @@ require_relative "llm_cost_tracker/unknown_pricing"
|
|
|
31
31
|
require_relative "llm_cost_tracker/event_metadata"
|
|
32
32
|
require_relative "llm_cost_tracker/tag_context"
|
|
33
33
|
require_relative "llm_cost_tracker/tag_sanitizer"
|
|
34
|
+
require_relative "llm_cost_tracker/active_record_adapter"
|
|
34
35
|
require_relative "llm_cost_tracker/tags_column"
|
|
35
36
|
require_relative "llm_cost_tracker/tag_key"
|
|
36
37
|
require_relative "llm_cost_tracker/tag_sql"
|
|
@@ -53,6 +54,10 @@ module LlmCostTracker
|
|
|
53
54
|
CONFIGURATION_MUTEX.synchronize { @configuration ||= Configuration.new }
|
|
54
55
|
end
|
|
55
56
|
|
|
57
|
+
def configuration_generation
|
|
58
|
+
CONFIGURATION_MUTEX.synchronize { @configuration_generation ||= 0 }
|
|
59
|
+
end
|
|
60
|
+
|
|
56
61
|
def configure
|
|
57
62
|
config = CONFIGURATION_MUTEX.synchronize do
|
|
58
63
|
current = @configuration || Configuration.new
|
|
@@ -61,6 +66,7 @@ module LlmCostTracker
|
|
|
61
66
|
yield(current)
|
|
62
67
|
current.openai_compatible_providers = current.openai_compatible_providers.dup
|
|
63
68
|
current.finalize!
|
|
69
|
+
@configuration_generation = @configuration_generation.to_i + 1
|
|
64
70
|
current
|
|
65
71
|
end
|
|
66
72
|
Integrations.install!
|
|
@@ -68,12 +74,39 @@ module LlmCostTracker
|
|
|
68
74
|
end
|
|
69
75
|
|
|
70
76
|
def reset_configuration!
|
|
71
|
-
|
|
77
|
+
Storage::ActiveRecordInbox.reset! if defined?(Storage::ActiveRecordInbox)
|
|
78
|
+
Storage::ActiveRecordIngestor.shutdown!(drain: false) if defined?(Storage::ActiveRecordIngestor)
|
|
79
|
+
CONFIGURATION_MUTEX.synchronize do
|
|
80
|
+
@configuration = Configuration.new
|
|
81
|
+
@configuration_generation = @configuration_generation.to_i + 1
|
|
82
|
+
end
|
|
72
83
|
UnknownPricing.reset! if defined?(UnknownPricing)
|
|
73
84
|
Storage::ActiveRecordStore.reset! if defined?(Storage::ActiveRecordStore)
|
|
85
|
+
Storage::ActiveRecordInbox.reset! if defined?(Storage::ActiveRecordInbox)
|
|
86
|
+
Storage::ActiveRecordIngestor.reset! if defined?(Storage::ActiveRecordIngestor)
|
|
74
87
|
TagContext.clear! if defined?(TagContext)
|
|
75
88
|
end
|
|
76
89
|
|
|
90
|
+
def flush!(timeout: nil)
|
|
91
|
+
return true unless defined?(Storage::ActiveRecordIngestor)
|
|
92
|
+
|
|
93
|
+
if timeout
|
|
94
|
+
Storage::ActiveRecordIngestor.flush!(timeout: timeout)
|
|
95
|
+
else
|
|
96
|
+
Storage::ActiveRecordIngestor.flush!
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def shutdown!(timeout: nil, drain: true)
|
|
101
|
+
return true unless defined?(Storage::ActiveRecordIngestor)
|
|
102
|
+
|
|
103
|
+
if timeout
|
|
104
|
+
Storage::ActiveRecordIngestor.shutdown!(timeout: timeout, drain: drain)
|
|
105
|
+
else
|
|
106
|
+
Storage::ActiveRecordIngestor.shutdown!(drain: drain)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
77
110
|
def enforce_budget!
|
|
78
111
|
Tracker.enforce_budget!
|
|
79
112
|
end
|
|
@@ -140,3 +173,5 @@ if defined?(Faraday)
|
|
|
140
173
|
llm_cost_tracker: LlmCostTracker::Middleware::Faraday
|
|
141
174
|
)
|
|
142
175
|
end
|
|
176
|
+
|
|
177
|
+
at_exit { LlmCostTracker.shutdown!(drain: false) if defined?(LlmCostTracker) }
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: llm_cost_tracker
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sergii Khomenko
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-04-
|
|
11
|
+
date: 2026-04-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -301,6 +301,7 @@ files:
|
|
|
301
301
|
- docs/technical/operational-notes.md
|
|
302
302
|
- docs/upgrading.md
|
|
303
303
|
- lib/llm_cost_tracker.rb
|
|
304
|
+
- lib/llm_cost_tracker/active_record_adapter.rb
|
|
304
305
|
- lib/llm_cost_tracker/assets.rb
|
|
305
306
|
- lib/llm_cost_tracker/budget.rb
|
|
306
307
|
- lib/llm_cost_tracker/capture_verifier.rb
|
|
@@ -310,11 +311,13 @@ files:
|
|
|
310
311
|
- lib/llm_cost_tracker/cost.rb
|
|
311
312
|
- lib/llm_cost_tracker/doctor.rb
|
|
312
313
|
- lib/llm_cost_tracker/doctor/capture_check.rb
|
|
314
|
+
- lib/llm_cost_tracker/doctor/ingestion_check.rb
|
|
313
315
|
- lib/llm_cost_tracker/engine.rb
|
|
314
316
|
- lib/llm_cost_tracker/engine_compatibility.rb
|
|
315
317
|
- lib/llm_cost_tracker/errors.rb
|
|
316
318
|
- lib/llm_cost_tracker/event.rb
|
|
317
319
|
- lib/llm_cost_tracker/event_metadata.rb
|
|
320
|
+
- lib/llm_cost_tracker/generators/llm_cost_tracker/add_ingestion_generator.rb
|
|
318
321
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/add_latency_ms_generator.rb
|
|
319
322
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/add_period_totals_generator.rb
|
|
320
323
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/add_provider_response_id_generator.rb
|
|
@@ -322,6 +325,7 @@ files:
|
|
|
322
325
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/add_usage_breakdown_generator.rb
|
|
323
326
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/install_generator.rb
|
|
324
327
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/prices_generator.rb
|
|
328
|
+
- lib/llm_cost_tracker/generators/llm_cost_tracker/templates/add_ingestion_to_llm_cost_tracker.rb.erb
|
|
325
329
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/templates/add_latency_ms_to_llm_api_calls.rb.erb
|
|
326
330
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/templates/add_period_totals_to_llm_cost_tracker.rb.erb
|
|
327
331
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/templates/add_provider_response_id_to_llm_api_calls.rb.erb
|
|
@@ -333,6 +337,8 @@ files:
|
|
|
333
337
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_llm_api_call_tags_to_jsonb.rb.erb
|
|
334
338
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_cost_precision_generator.rb
|
|
335
339
|
- lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_tags_to_jsonb_generator.rb
|
|
340
|
+
- lib/llm_cost_tracker/inbox_event.rb
|
|
341
|
+
- lib/llm_cost_tracker/ingestor_lease.rb
|
|
336
342
|
- lib/llm_cost_tracker/integrations/anthropic.rb
|
|
337
343
|
- lib/llm_cost_tracker/integrations/base.rb
|
|
338
344
|
- lib/llm_cost_tracker/integrations/object_reader.rb
|
|
@@ -375,6 +381,15 @@ files:
|
|
|
375
381
|
- lib/llm_cost_tracker/request_url.rb
|
|
376
382
|
- lib/llm_cost_tracker/retention.rb
|
|
377
383
|
- lib/llm_cost_tracker/storage/active_record_backend.rb
|
|
384
|
+
- lib/llm_cost_tracker/storage/active_record_connection_cleanup.rb
|
|
385
|
+
- lib/llm_cost_tracker/storage/active_record_inbox.rb
|
|
386
|
+
- lib/llm_cost_tracker/storage/active_record_inbox_batch.rb
|
|
387
|
+
- lib/llm_cost_tracker/storage/active_record_ingestor.rb
|
|
388
|
+
- lib/llm_cost_tracker/storage/active_record_ingestor_lease.rb
|
|
389
|
+
- lib/llm_cost_tracker/storage/active_record_period_totals.rb
|
|
390
|
+
- lib/llm_cost_tracker/storage/active_record_periods.rb
|
|
391
|
+
- lib/llm_cost_tracker/storage/active_record_rollup_batch.rb
|
|
392
|
+
- lib/llm_cost_tracker/storage/active_record_rollup_upsert_sql.rb
|
|
378
393
|
- lib/llm_cost_tracker/storage/active_record_rollups.rb
|
|
379
394
|
- lib/llm_cost_tracker/storage/active_record_store.rb
|
|
380
395
|
- lib/llm_cost_tracker/storage/custom_backend.rb
|