class Conversation::Message::ResponseGenerator::Response MICROCENTS_PER_DOLLAR = 100_000 attr_reader :answer, :input_tokens, :output_tokens, :model_id, :tool_calls, :tool_call_id def initialize(answer:, input_tokens:, output_tokens:, model_id:) @answer = answer @input_tokens = input_tokens @output_tokens = output_tokens @model_id = model_id end def cost cost_microcents.to_d / MICROCENTS_PER_DOLLAR end def cost_microcents input_cost_microcents + output_cost_microcents end def input_cost_microcents return unless token_price = input_token_price_microcents (input_tokens * token_price).to_i end def input_token_price_microcents return unless model_info price_per_million_tokens_to_microcents(model_info.input_price_per_million) end def output_cost_microcents return unless token_price = output_token_price_microcents (output_tokens * token_price).to_i end def output_token_price_microcents return unless model_info price_per_million_tokens_to_microcents(model_info.output_price_per_million) end def model_info @model_info ||= RubyLLM.models.find(model_id) end private def price_per_million_tokens_to_microcents(price) single_token_price = price.to_d / 1_000_000 single_token_price * MICROCENTS_PER_DOLLAR end end