llm_cost_tracker 0.8.0 → 0.10.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.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +136 -0
  3. data/README.md +14 -6
  4. data/app/assets/llm_cost_tracker/application.css +65 -5
  5. data/app/controllers/llm_cost_tracker/application_controller.rb +25 -33
  6. data/app/controllers/llm_cost_tracker/assets_controller.rb +1 -1
  7. data/app/controllers/llm_cost_tracker/calls_controller.rb +21 -11
  8. data/app/controllers/llm_cost_tracker/data_quality_controller.rb +4 -0
  9. data/app/controllers/llm_cost_tracker/reconciliation_controller.rb +106 -0
  10. data/app/controllers/llm_cost_tracker/tags_controller.rb +15 -1
  11. data/app/helpers/llm_cost_tracker/application_helper.rb +11 -1
  12. data/app/helpers/llm_cost_tracker/inline_style_helper.rb +28 -0
  13. data/app/helpers/llm_cost_tracker/reconciliation_helper.rb +13 -0
  14. data/app/helpers/llm_cost_tracker/token_usage_helper.rb +5 -1
  15. data/app/models/llm_cost_tracker/call.rb +0 -3
  16. data/app/models/llm_cost_tracker/call_line_item.rb +1 -5
  17. data/app/models/llm_cost_tracker/call_rollup.rb +0 -3
  18. data/app/models/llm_cost_tracker/call_tag.rb +0 -4
  19. data/app/models/llm_cost_tracker/ingestion/inbox_entry.rb +0 -4
  20. data/app/models/llm_cost_tracker/ingestion/lease.rb +0 -3
  21. data/app/models/llm_cost_tracker/provider_invoice.rb +7 -3
  22. data/app/models/llm_cost_tracker/provider_invoice_import.rb +29 -0
  23. data/app/services/llm_cost_tracker/dashboard/data_quality.rb +33 -4
  24. data/app/services/llm_cost_tracker/dashboard/filter.rb +6 -4
  25. data/app/services/llm_cost_tracker/dashboard/setup_state.rb +110 -0
  26. data/app/views/layouts/llm_cost_tracker/application.html.erb +6 -1
  27. data/app/views/llm_cost_tracker/calls/show.html.erb +26 -41
  28. data/app/views/llm_cost_tracker/dashboard/index.html.erb +9 -9
  29. data/app/views/llm_cost_tracker/data_quality/index.html.erb +92 -53
  30. data/app/views/llm_cost_tracker/reconciliation/index.html.erb +183 -0
  31. data/app/views/llm_cost_tracker/shared/_bar.html.erb +1 -1
  32. data/app/views/llm_cost_tracker/shared/_filters.html.erb +3 -0
  33. data/app/views/llm_cost_tracker/shared/_metric_stack.html.erb +1 -1
  34. data/app/views/llm_cost_tracker/tags/show.html.erb +60 -0
  35. data/config/routes.rb +3 -2
  36. data/lib/llm_cost_tracker/billing/components.rb +45 -3
  37. data/lib/llm_cost_tracker/billing/components.yml +71 -0
  38. data/lib/llm_cost_tracker/billing/cost_status.rb +21 -25
  39. data/lib/llm_cost_tracker/billing/line_item.rb +16 -50
  40. data/lib/llm_cost_tracker/budget.rb +31 -7
  41. data/lib/llm_cost_tracker/capture/stream_collector.rb +113 -34
  42. data/lib/llm_cost_tracker/capture/stream_tracker.rb +40 -5
  43. data/lib/llm_cost_tracker/configuration.rb +72 -17
  44. data/lib/llm_cost_tracker/doctor/capture_verifier.rb +1 -1
  45. data/lib/llm_cost_tracker/doctor/cost_drift_check.rb +2 -0
  46. data/lib/llm_cost_tracker/doctor/ingestion_check.rb +30 -4
  47. data/lib/llm_cost_tracker/doctor/invoice_reconciliation_check.rb +164 -0
  48. data/lib/llm_cost_tracker/doctor/legacy_audit_check.rb +0 -2
  49. data/lib/llm_cost_tracker/doctor/legacy_billing_status_check.rb +0 -2
  50. data/lib/llm_cost_tracker/doctor/schema_check.rb +5 -2
  51. data/lib/llm_cost_tracker/doctor.rb +72 -14
  52. data/lib/llm_cost_tracker/engine.rb +8 -0
  53. data/lib/llm_cost_tracker/errors.rb +3 -2
  54. data/lib/llm_cost_tracker/event.rb +48 -1
  55. data/lib/llm_cost_tracker/generators/llm_cost_tracker/async_ingestion_generator.rb +43 -0
  56. data/lib/llm_cost_tracker/generators/llm_cost_tracker/call_rollups_generator.rb +43 -0
  57. data/lib/llm_cost_tracker/generators/llm_cost_tracker/install_generator.rb +17 -26
  58. data/lib/llm_cost_tracker/generators/llm_cost_tracker/reconciliation_generator.rb +34 -0
  59. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/create_llm_cost_tracker_async_ingestion.rb.erb +29 -0
  60. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/create_llm_cost_tracker_call_rollups.rb.erb +15 -0
  61. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/create_llm_cost_tracker_calls.rb.erb +5 -58
  62. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/create_llm_cost_tracker_reconciliation.rb.erb +60 -0
  63. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/initializer.rb.erb +35 -25
  64. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_call_rollups_provider.rb.erb +35 -0
  65. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_call_tags_key_value_index.rb.erb +32 -0
  66. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_image_tokens.rb.erb +18 -0
  67. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_provider_invoice_imports_provider.rb.erb +32 -0
  68. data/lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_provider_invoices_metadata_index.rb.erb +25 -0
  69. data/lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_call_rollups_provider_generator.rb +29 -0
  70. data/lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_call_tags_key_value_index_generator.rb +30 -0
  71. data/lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_image_tokens_generator.rb +29 -0
  72. data/lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_provider_invoice_imports_provider_generator.rb +31 -0
  73. data/lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_provider_invoices_metadata_index_generator.rb +31 -0
  74. data/lib/llm_cost_tracker/ingestion/batch.rb +5 -2
  75. data/lib/llm_cost_tracker/ingestion/inbox.rb +3 -25
  76. data/lib/llm_cost_tracker/ingestion/pool.rb +44 -0
  77. data/lib/llm_cost_tracker/ingestion/worker.rb +28 -34
  78. data/lib/llm_cost_tracker/ingestion.rb +48 -11
  79. data/lib/llm_cost_tracker/integrations/anthropic.rb +31 -26
  80. data/lib/llm_cost_tracker/integrations/base.rb +35 -15
  81. data/lib/llm_cost_tracker/integrations/openai.rb +345 -84
  82. data/lib/llm_cost_tracker/integrations/ruby_llm.rb +111 -14
  83. data/lib/llm_cost_tracker/integrations.rb +33 -14
  84. data/lib/llm_cost_tracker/ledger/period/totals.rb +25 -7
  85. data/lib/llm_cost_tracker/ledger/rollups.rb +22 -17
  86. data/lib/llm_cost_tracker/ledger/schema/call_line_items.rb +41 -1
  87. data/lib/llm_cost_tracker/ledger/schema/call_rollups.rb +16 -6
  88. data/lib/llm_cost_tracker/ledger/schema/call_tags.rb +28 -2
  89. data/lib/llm_cost_tracker/ledger/schema/calls.rb +2 -4
  90. data/lib/llm_cost_tracker/ledger/schema/ingestion_inbox_entries.rb +57 -0
  91. data/lib/llm_cost_tracker/ledger/schema/ingestion_leases.rb +52 -0
  92. data/lib/llm_cost_tracker/ledger/schema/provider_invoice_imports.rb +56 -0
  93. data/lib/llm_cost_tracker/ledger/schema/provider_invoices.rb +28 -13
  94. data/lib/llm_cost_tracker/ledger/store.rb +34 -31
  95. data/lib/llm_cost_tracker/ledger/tags/encoding.rb +37 -0
  96. data/lib/llm_cost_tracker/ledger/tags/query.rb +2 -2
  97. data/lib/llm_cost_tracker/ledger.rb +2 -1
  98. data/lib/llm_cost_tracker/logging.rb +0 -4
  99. data/lib/llm_cost_tracker/masking.rb +39 -0
  100. data/lib/llm_cost_tracker/middleware/faraday.rb +120 -33
  101. data/lib/llm_cost_tracker/parsers/anthropic.rb +36 -28
  102. data/lib/llm_cost_tracker/parsers/azure.rb +46 -0
  103. data/lib/llm_cost_tracker/parsers/base.rb +53 -43
  104. data/lib/llm_cost_tracker/parsers/gemini.rb +24 -22
  105. data/lib/llm_cost_tracker/parsers/openai.rb +20 -38
  106. data/lib/llm_cost_tracker/parsers/openai_compatible.rb +26 -39
  107. data/lib/llm_cost_tracker/parsers/openai_service_charges.rb +81 -13
  108. data/lib/llm_cost_tracker/parsers/openai_usage.rb +126 -59
  109. data/lib/llm_cost_tracker/parsers.rb +31 -4
  110. data/lib/llm_cost_tracker/prices.json +572 -493
  111. data/lib/llm_cost_tracker/pricing/backfill.rb +140 -0
  112. data/lib/llm_cost_tracker/pricing/effective_prices.rb +7 -40
  113. data/lib/llm_cost_tracker/pricing/estimator.rb +33 -0
  114. data/lib/llm_cost_tracker/pricing/explainer.rb +4 -1
  115. data/lib/llm_cost_tracker/pricing/lookup.rb +73 -5
  116. data/lib/llm_cost_tracker/pricing/mode.rb +76 -0
  117. data/lib/llm_cost_tracker/pricing/registry.rb +3 -8
  118. data/lib/llm_cost_tracker/pricing/service_charges.rb +14 -12
  119. data/lib/llm_cost_tracker/pricing/{sync_change_printer.rb → sync/change_printer.rb} +3 -3
  120. data/lib/llm_cost_tracker/pricing/sync/registry_writer.rb +62 -1
  121. data/lib/llm_cost_tracker/pricing/sync.rb +4 -10
  122. data/lib/llm_cost_tracker/pricing/unknown.rb +5 -2
  123. data/lib/llm_cost_tracker/pricing.rb +117 -44
  124. data/lib/llm_cost_tracker/providers/anthropic/tier_classification.rb +22 -0
  125. data/lib/llm_cost_tracker/providers/azure/hosts.rb +17 -0
  126. data/lib/llm_cost_tracker/providers/gemini/model_families.rb +17 -0
  127. data/lib/llm_cost_tracker/providers/openai/hosts.rb +35 -0
  128. data/lib/llm_cost_tracker/providers/openai/model_families.rb +51 -0
  129. data/lib/llm_cost_tracker/railtie.rb +8 -0
  130. data/lib/llm_cost_tracker/reconcile_tasks.rb +134 -0
  131. data/lib/llm_cost_tracker/reconciliation/diff.rb +409 -0
  132. data/lib/llm_cost_tracker/reconciliation/diff_result.rb +44 -0
  133. data/lib/llm_cost_tracker/reconciliation/import_result.rb +19 -0
  134. data/lib/llm_cost_tracker/reconciliation/importer.rb +254 -0
  135. data/lib/llm_cost_tracker/reconciliation/sources/anthropic_usage.rb +172 -0
  136. data/lib/llm_cost_tracker/reconciliation/sources/fingerprint.rb +20 -0
  137. data/lib/llm_cost_tracker/reconciliation/sources/openai_usage.rb +142 -0
  138. data/lib/llm_cost_tracker/reconciliation.rb +118 -0
  139. data/lib/llm_cost_tracker/report/data.rb +4 -1
  140. data/lib/llm_cost_tracker/report.rb +0 -4
  141. data/lib/llm_cost_tracker/retention.rb +31 -6
  142. data/lib/llm_cost_tracker/tags/context.rb +3 -4
  143. data/lib/llm_cost_tracker/tags/sanitizer.rb +73 -21
  144. data/lib/llm_cost_tracker/token_usage.rb +14 -2
  145. data/lib/llm_cost_tracker/tracker.rb +41 -55
  146. data/lib/llm_cost_tracker/version.rb +1 -1
  147. data/lib/llm_cost_tracker.rb +19 -14
  148. data/lib/tasks/llm_cost_tracker.rake +41 -4
  149. metadata +49 -3
  150. data/lib/llm_cost_tracker/usage_capture.rb +0 -58
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: llm_cost_tracker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergii Khomenko
@@ -239,13 +239,16 @@ files:
239
239
  - app/controllers/llm_cost_tracker/dashboard_controller.rb
240
240
  - app/controllers/llm_cost_tracker/data_quality_controller.rb
241
241
  - app/controllers/llm_cost_tracker/models_controller.rb
242
+ - app/controllers/llm_cost_tracker/reconciliation_controller.rb
242
243
  - app/controllers/llm_cost_tracker/tags_controller.rb
243
244
  - app/helpers/llm_cost_tracker/application_helper.rb
244
245
  - app/helpers/llm_cost_tracker/chart_helper.rb
245
246
  - app/helpers/llm_cost_tracker/dashboard_filter_helper.rb
246
247
  - app/helpers/llm_cost_tracker/dashboard_filter_options_helper.rb
247
248
  - app/helpers/llm_cost_tracker/dashboard_query_helper.rb
249
+ - app/helpers/llm_cost_tracker/inline_style_helper.rb
248
250
  - app/helpers/llm_cost_tracker/pagination_helper.rb
251
+ - app/helpers/llm_cost_tracker/reconciliation_helper.rb
249
252
  - app/helpers/llm_cost_tracker/token_usage_helper.rb
250
253
  - app/models/llm_cost_tracker/call.rb
251
254
  - app/models/llm_cost_tracker/call_line_item.rb
@@ -254,6 +257,7 @@ files:
254
257
  - app/models/llm_cost_tracker/ingestion/inbox_entry.rb
255
258
  - app/models/llm_cost_tracker/ingestion/lease.rb
256
259
  - app/models/llm_cost_tracker/provider_invoice.rb
260
+ - app/models/llm_cost_tracker/provider_invoice_import.rb
257
261
  - app/services/llm_cost_tracker/dashboard/data_quality.rb
258
262
  - app/services/llm_cost_tracker/dashboard/date_range.rb
259
263
  - app/services/llm_cost_tracker/dashboard/filter.rb
@@ -261,6 +265,7 @@ files:
261
265
  - app/services/llm_cost_tracker/dashboard/pagination.rb
262
266
  - app/services/llm_cost_tracker/dashboard/params.rb
263
267
  - app/services/llm_cost_tracker/dashboard/provider_breakdown.rb
268
+ - app/services/llm_cost_tracker/dashboard/setup_state.rb
264
269
  - app/services/llm_cost_tracker/dashboard/spend_anomaly.rb
265
270
  - app/services/llm_cost_tracker/dashboard/tag_breakdown.rb
266
271
  - app/services/llm_cost_tracker/dashboard/tag_key_explorer.rb
@@ -275,6 +280,7 @@ files:
275
280
  - app/views/llm_cost_tracker/errors/invalid_filter.html.erb
276
281
  - app/views/llm_cost_tracker/errors/not_found.html.erb
277
282
  - app/views/llm_cost_tracker/models/index.html.erb
283
+ - app/views/llm_cost_tracker/reconciliation/index.html.erb
278
284
  - app/views/llm_cost_tracker/shared/_active_filters.html.erb
279
285
  - app/views/llm_cost_tracker/shared/_bar.html.erb
280
286
  - app/views/llm_cost_tracker/shared/_filters.html.erb
@@ -302,6 +308,7 @@ files:
302
308
  - lib/llm_cost_tracker/doctor/check.rb
303
309
  - lib/llm_cost_tracker/doctor/cost_drift_check.rb
304
310
  - lib/llm_cost_tracker/doctor/ingestion_check.rb
311
+ - lib/llm_cost_tracker/doctor/invoice_reconciliation_check.rb
305
312
  - lib/llm_cost_tracker/doctor/legacy_audit_check.rb
306
313
  - lib/llm_cost_tracker/doctor/legacy_billing_status_check.rb
307
314
  - lib/llm_cost_tracker/doctor/price_check.rb
@@ -311,14 +318,31 @@ files:
311
318
  - lib/llm_cost_tracker/engine.rb
312
319
  - lib/llm_cost_tracker/errors.rb
313
320
  - lib/llm_cost_tracker/event.rb
321
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/async_ingestion_generator.rb
322
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/call_rollups_generator.rb
314
323
  - lib/llm_cost_tracker/generators/llm_cost_tracker/install_generator.rb
315
324
  - lib/llm_cost_tracker/generators/llm_cost_tracker/prices_generator.rb
325
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/reconciliation_generator.rb
326
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/create_llm_cost_tracker_async_ingestion.rb.erb
327
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/create_llm_cost_tracker_call_rollups.rb.erb
316
328
  - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/create_llm_cost_tracker_calls.rb.erb
329
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/create_llm_cost_tracker_reconciliation.rb.erb
317
330
  - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/initializer.rb.erb
331
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_call_rollups_provider.rb.erb
332
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_call_tags_key_value_index.rb.erb
333
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_image_tokens.rb.erb
334
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_provider_invoice_imports_provider.rb.erb
335
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/templates/upgrade_provider_invoices_metadata_index.rb.erb
336
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_call_rollups_provider_generator.rb
337
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_call_tags_key_value_index_generator.rb
338
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_image_tokens_generator.rb
339
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_provider_invoice_imports_provider_generator.rb
340
+ - lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_provider_invoices_metadata_index_generator.rb
318
341
  - lib/llm_cost_tracker/ingestion.rb
319
342
  - lib/llm_cost_tracker/ingestion/batch.rb
320
343
  - lib/llm_cost_tracker/ingestion/inbox.rb
321
344
  - lib/llm_cost_tracker/ingestion/lease_claim.rb
345
+ - lib/llm_cost_tracker/ingestion/pool.rb
322
346
  - lib/llm_cost_tracker/ingestion/worker.rb
323
347
  - lib/llm_cost_tracker/integrations.rb
324
348
  - lib/llm_cost_tracker/integrations/anthropic.rb
@@ -335,14 +359,20 @@ files:
335
359
  - lib/llm_cost_tracker/ledger/schema/call_rollups.rb
336
360
  - lib/llm_cost_tracker/ledger/schema/call_tags.rb
337
361
  - lib/llm_cost_tracker/ledger/schema/calls.rb
362
+ - lib/llm_cost_tracker/ledger/schema/ingestion_inbox_entries.rb
363
+ - lib/llm_cost_tracker/ledger/schema/ingestion_leases.rb
364
+ - lib/llm_cost_tracker/ledger/schema/provider_invoice_imports.rb
338
365
  - lib/llm_cost_tracker/ledger/schema/provider_invoices.rb
339
366
  - lib/llm_cost_tracker/ledger/store.rb
367
+ - lib/llm_cost_tracker/ledger/tags/encoding.rb
340
368
  - lib/llm_cost_tracker/ledger/tags/query.rb
341
369
  - lib/llm_cost_tracker/ledger/tags/sql.rb
342
370
  - lib/llm_cost_tracker/logging.rb
371
+ - lib/llm_cost_tracker/masking.rb
343
372
  - lib/llm_cost_tracker/middleware/faraday.rb
344
373
  - lib/llm_cost_tracker/parsers.rb
345
374
  - lib/llm_cost_tracker/parsers/anthropic.rb
375
+ - lib/llm_cost_tracker/parsers/azure.rb
346
376
  - lib/llm_cost_tracker/parsers/base.rb
347
377
  - lib/llm_cost_tracker/parsers/gemini.rb
348
378
  - lib/llm_cost_tracker/parsers/openai.rb
@@ -352,18 +382,35 @@ files:
352
382
  - lib/llm_cost_tracker/parsers/sse.rb
353
383
  - lib/llm_cost_tracker/prices.json
354
384
  - lib/llm_cost_tracker/pricing.rb
385
+ - lib/llm_cost_tracker/pricing/backfill.rb
355
386
  - lib/llm_cost_tracker/pricing/effective_prices.rb
387
+ - lib/llm_cost_tracker/pricing/estimator.rb
356
388
  - lib/llm_cost_tracker/pricing/explainer.rb
357
389
  - lib/llm_cost_tracker/pricing/lookup.rb
390
+ - lib/llm_cost_tracker/pricing/mode.rb
358
391
  - lib/llm_cost_tracker/pricing/registry.rb
359
392
  - lib/llm_cost_tracker/pricing/service_charges.rb
360
393
  - lib/llm_cost_tracker/pricing/sync.rb
394
+ - lib/llm_cost_tracker/pricing/sync/change_printer.rb
361
395
  - lib/llm_cost_tracker/pricing/sync/fetcher.rb
362
396
  - lib/llm_cost_tracker/pricing/sync/registry_diff.rb
363
397
  - lib/llm_cost_tracker/pricing/sync/registry_writer.rb
364
- - lib/llm_cost_tracker/pricing/sync_change_printer.rb
365
398
  - lib/llm_cost_tracker/pricing/unknown.rb
399
+ - lib/llm_cost_tracker/providers/anthropic/tier_classification.rb
400
+ - lib/llm_cost_tracker/providers/azure/hosts.rb
401
+ - lib/llm_cost_tracker/providers/gemini/model_families.rb
402
+ - lib/llm_cost_tracker/providers/openai/hosts.rb
403
+ - lib/llm_cost_tracker/providers/openai/model_families.rb
366
404
  - lib/llm_cost_tracker/railtie.rb
405
+ - lib/llm_cost_tracker/reconcile_tasks.rb
406
+ - lib/llm_cost_tracker/reconciliation.rb
407
+ - lib/llm_cost_tracker/reconciliation/diff.rb
408
+ - lib/llm_cost_tracker/reconciliation/diff_result.rb
409
+ - lib/llm_cost_tracker/reconciliation/import_result.rb
410
+ - lib/llm_cost_tracker/reconciliation/importer.rb
411
+ - lib/llm_cost_tracker/reconciliation/sources/anthropic_usage.rb
412
+ - lib/llm_cost_tracker/reconciliation/sources/fingerprint.rb
413
+ - lib/llm_cost_tracker/reconciliation/sources/openai_usage.rb
367
414
  - lib/llm_cost_tracker/report.rb
368
415
  - lib/llm_cost_tracker/report/data.rb
369
416
  - lib/llm_cost_tracker/report/formatter.rb
@@ -374,7 +421,6 @@ files:
374
421
  - lib/llm_cost_tracker/timing.rb
375
422
  - lib/llm_cost_tracker/token_usage.rb
376
423
  - lib/llm_cost_tracker/tracker.rb
377
- - lib/llm_cost_tracker/usage_capture.rb
378
424
  - lib/llm_cost_tracker/version.rb
379
425
  - lib/tasks/llm_cost_tracker.rake
380
426
  homepage: https://github.com/sergey-homenko/llm_cost_tracker
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/core_ext/object/blank"
4
-
5
- require_relative "pricing"
6
- require_relative "billing/line_item"
7
-
8
- module LlmCostTracker
9
- UsageCapture = Data.define(
10
- :provider,
11
- :model,
12
- :token_usage,
13
- :stream,
14
- :usage_source,
15
- :provider_response_id,
16
- :provider_project_id,
17
- :provider_api_key_id,
18
- :provider_workspace_id,
19
- :batch,
20
- :pricing_mode,
21
- :line_items
22
- )
23
-
24
- class UsageCapture
25
- UNKNOWN_MODEL = "unknown"
26
-
27
- def self.batch_from_pricing_mode?(pricing_mode)
28
- pricing_mode.to_s.split("_").include?("batch")
29
- end
30
-
31
- def self.build(**attributes)
32
- pricing_mode = Pricing.normalize_mode(attributes[:pricing_mode])
33
- batch = attributes[:batch]
34
- batch = batch_from_pricing_mode?(pricing_mode) if batch.nil?
35
-
36
- token_usage = attributes.fetch(:token_usage)
37
- service_line_items = Array(attributes[:service_line_items]).map do |item|
38
- item.is_a?(Billing::LineItem) ? item : Billing::LineItem.build(item)
39
- end
40
- line_items = attributes[:line_items] || (Billing::LineItem.from_token_usage(token_usage) + service_line_items)
41
-
42
- new(
43
- provider: attributes.fetch(:provider).to_s,
44
- model: attributes.fetch(:model).to_s.strip.presence || UNKNOWN_MODEL,
45
- token_usage: token_usage,
46
- stream: attributes[:stream] || false,
47
- usage_source: attributes[:usage_source],
48
- provider_response_id: attributes[:provider_response_id].to_s.strip.presence,
49
- provider_project_id: attributes[:provider_project_id].to_s.strip.presence,
50
- provider_api_key_id: attributes[:provider_api_key_id].to_s.strip.presence,
51
- provider_workspace_id: attributes[:provider_workspace_id].to_s.strip.presence,
52
- batch: batch,
53
- pricing_mode: pricing_mode,
54
- line_items: line_items
55
- )
56
- end
57
- end
58
- end