Module: LlmCostTracker

Defined in:
lib/llm_cost_tracker.rb,
lib/llm_cost_tracker/cost.rb,
lib/llm_cost_tracker/event.rb,
lib/llm_cost_tracker/assets.rb,
lib/llm_cost_tracker/budget.rb,
lib/llm_cost_tracker/engine.rb,
lib/llm_cost_tracker/errors.rb,
lib/llm_cost_tracker/report.rb,
lib/llm_cost_tracker/logging.rb,
lib/llm_cost_tracker/pricing.rb,
lib/llm_cost_tracker/railtie.rb,
lib/llm_cost_tracker/tag_key.rb,
lib/llm_cost_tracker/tracker.rb,
lib/llm_cost_tracker/version.rb,
lib/llm_cost_tracker/retention.rb,
lib/llm_cost_tracker/tag_query.rb,
lib/llm_cost_tracker/price_sync.rb,
lib/llm_cost_tracker/parsers/sse.rb,
lib/llm_cost_tracker/report_data.rb,
lib/llm_cost_tracker/tags_column.rb,
lib/llm_cost_tracker/llm_api_call.rb,
lib/llm_cost_tracker/parsed_usage.rb,
lib/llm_cost_tracker/parsers/base.rb,
lib/llm_cost_tracker/configuration.rb,
lib/llm_cost_tracker/tag_accessors.rb,
lib/llm_cost_tracker/value_helpers.rb,
lib/llm_cost_tracker/event_metadata.rb,
lib/llm_cost_tracker/parameter_hash.rb,
lib/llm_cost_tracker/parsers/gemini.rb,
lib/llm_cost_tracker/parsers/openai.rb,
lib/llm_cost_tracker/price_registry.rb,
lib/llm_cost_tracker/period_grouping.rb,
lib/llm_cost_tracker/unknown_pricing.rb,
lib/llm_cost_tracker/parsers/registry.rb,
lib/llm_cost_tracker/report_formatter.rb,
lib/llm_cost_tracker/stream_collector.rb,
lib/llm_cost_tracker/parsers/anthropic.rb,
lib/llm_cost_tracker/price_sync/merger.rb,
lib/llm_cost_tracker/price_sync/source.rb,
lib/llm_cost_tracker/middleware/faraday.rb,
lib/llm_cost_tracker/price_sync/fetcher.rb,
app/services/llm_cost_tracker/pagination.rb,
app/helpers/llm_cost_tracker/chart_helper.rb,
lib/llm_cost_tracker/engine_compatibility.rb,
lib/llm_cost_tracker/parsers/openai_usage.rb,
lib/llm_cost_tracker/price_sync/raw_price.rb,
lib/llm_cost_tracker/price_sync/validator.rb,
lib/llm_cost_tracker/price_sync/model_catalog.rb,
lib/llm_cost_tracker/price_sync/source_result.rb,
app/helpers/llm_cost_tracker/pagination_helper.rb,
app/services/llm_cost_tracker/dashboard/filter.rb,
lib/llm_cost_tracker/parsers/openai_compatible.rb,
app/helpers/llm_cost_tracker/application_helper.rb,
lib/llm_cost_tracker/price_sync/registry_loader.rb,
lib/llm_cost_tracker/price_sync/registry_writer.rb,
lib/llm_cost_tracker/price_sync/sources/litellm.rb,
app/controllers/llm_cost_tracker/tags_controller.rb,
lib/llm_cost_tracker/storage/active_record_store.rb,
app/controllers/llm_cost_tracker/calls_controller.rb,
app/controllers/llm_cost_tracker/assets_controller.rb,
app/controllers/llm_cost_tracker/models_controller.rb,
app/services/llm_cost_tracker/dashboard/top_models.rb,
app/helpers/llm_cost_tracker/dashboard_query_helper.rb,
app/services/llm_cost_tracker/dashboard/time_series.rb,
lib/llm_cost_tracker/price_sync/sources/open_router.rb,
app/helpers/llm_cost_tracker/dashboard_filter_helper.rb,
app/services/llm_cost_tracker/dashboard/data_quality.rb,
lib/llm_cost_tracker/price_sync/refresh_plan_builder.rb,
app/controllers/llm_cost_tracker/dashboard_controller.rb,
app/services/llm_cost_tracker/dashboard/spend_anomaly.rb,
app/services/llm_cost_tracker/dashboard/tag_breakdown.rb,
app/services/llm_cost_tracker/dashboard/overview_stats.rb,
app/controllers/llm_cost_tracker/application_controller.rb,
app/controllers/llm_cost_tracker/data_quality_controller.rb,
app/services/llm_cost_tracker/dashboard/tag_key_explorer.rb,
app/services/llm_cost_tracker/dashboard/provider_breakdown.rb,
app/helpers/llm_cost_tracker/dashboard_filter_options_helper.rb,
lib/llm_cost_tracker/generators/llm_cost_tracker/prices_generator.rb,
lib/llm_cost_tracker/generators/llm_cost_tracker/install_generator.rb,
lib/llm_cost_tracker/generators/llm_cost_tracker/add_streaming_generator.rb,
lib/llm_cost_tracker/generators/llm_cost_tracker/add_latency_ms_generator.rb,
lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_tags_to_jsonb_generator.rb,
lib/llm_cost_tracker/generators/llm_cost_tracker/upgrade_cost_precision_generator.rb,
lib/llm_cost_tracker/generators/llm_cost_tracker/add_provider_response_id_generator.rb

Defined Under Namespace

Modules: ApplicationHelper, Assets, ChartHelper, Dashboard, DashboardFilterHelper, DashboardFilterOptionsHelper, DashboardQueryHelper, EngineCompatibility, EventMetadata, Generators, Logging, Middleware, PaginationHelper, ParameterHash, Parsers, PeriodGrouping, PriceRegistry, PriceSync, Pricing, Retention, Storage, TagAccessors, TagKey, TagQuery, TagsColumn, ValueHelpers Classes: ApplicationController, AssetsController, Budget, BudgetExceededError, CallsController, Configuration, Cost, DashboardController, DataQualityController, Engine, Error, Event, InvalidFilterError, LlmApiCall, ModelsController, Pagination, ParsedUsage, Railtie, Report, ReportData, ReportFormatter, StorageError, StreamCollector, TagsController, TopCall, Tracker, UnknownPricing, UnknownPricingError

Constant Summary collapse

CONFIGURATION_MUTEX =
Monitor.new
VERSION =
"0.3.1"

Class Method Summary collapse

Class Method Details

.configurationObject



44
45
46
# File 'lib/llm_cost_tracker.rb', line 44

def configuration
  CONFIGURATION_MUTEX.synchronize { @configuration ||= Configuration.new }
end

.configureObject



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/llm_cost_tracker.rb', line 48

def configure
  config = CONFIGURATION_MUTEX.synchronize do
    current = @configuration || Configuration.new
    current = current.dup_for_configuration if current.finalized?
    @configuration = current
    yield(current)
    current.normalize_openai_compatible_providers!
    current.finalize!
    current
  end
  warn_for_configuration!(config)
end

.enforce_budget!Object



65
66
67
# File 'lib/llm_cost_tracker.rb', line 65

def enforce_budget!
  Tracker.enforce_budget!
end

.reset_configuration!Object



61
62
63
# File 'lib/llm_cost_tracker.rb', line 61

def reset_configuration!
  CONFIGURATION_MUTEX.synchronize { @configuration = Configuration.new }
end

.track(provider:, model:, input_tokens:, output_tokens:, latency_ms: nil, stream: false, usage_source: :manual, enforce_budget: false, provider_response_id: nil, **metadata) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/llm_cost_tracker.rb', line 69

def track(provider:, model:, input_tokens:, output_tokens:, latency_ms: nil, stream: false, usage_source: :manual,
          enforce_budget: false, provider_response_id: nil, **)
  enforce_budget! if enforce_budget
  Tracker.record(
    provider: provider.to_s,
    model: model,
    input_tokens: input_tokens,
    output_tokens: output_tokens,
    latency_ms: latency_ms,
    stream: stream,
    usage_source: usage_source,
    provider_response_id: provider_response_id,
    metadata: 
  )
end

.track_stream(provider:, model:, latency_ms: nil, enforce_budget: false, provider_response_id: nil, **metadata) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/llm_cost_tracker.rb', line 85

def track_stream(provider:, model:, latency_ms: nil, enforce_budget: false, provider_response_id: nil, **)
  require_relative "llm_cost_tracker/stream_collector"
  enforce_budget! if enforce_budget
  collector = StreamCollector.new(
    provider: provider.to_s,
    model: model,
    latency_ms: latency_ms,
    provider_response_id: provider_response_id,
    metadata: 
  )
  yield collector
  collector.finish!
rescue StandardError
  collector&.finish!(errored: true)
  raise
end