44 lines
1.1 KiB
Ruby
44 lines
1.1 KiB
Ruby
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
|