55 lines
1.3 KiB
Ruby
55 lines
1.3 KiB
Ruby
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
|