class Ai::UsageCost attr_reader :model_id, :input_tokens, :output_tokens class << self def from_llm_response(response) new \ model_id: response.model_id, input_tokens: response.input_tokens, output_tokens: response.output_tokens end end def initialize(model_id:, input_tokens:, output_tokens:) @model_id = model_id @input_tokens = input_tokens @output_tokens = output_tokens end def in_microcents input_cost_in_microcents + output_cost_in_microcents end def input_cost_in_microcents calculate_token_cost(input_tokens, model_info.input_price_per_million) end def output_cost_in_microcents calculate_token_cost(output_tokens, model_info.output_price_per_million) end private def calculate_token_cost(token_count, price_per_million) return 0 unless price_per_million single_token_price = price_per_million.to_d / 1_000_000 token_cost_dollars = token_count * single_token_price Ai::Quota::Money.wrap(token_cost_dollars).in_microcents end def model_info @model_info ||= RubyLLM.models.find(model_id) end end