discourse/plugins/discourse-ai/app/models/llm_feature_credit_cost.rb
Keegan George 902fd7494b
FEATURE: Hosted LLM credit system (#35162)
## 🔍 Overview
This update adds a credit system under the hood which will be used for
our CDCK Hosted LLM models so we can make our features more accessible
to our hosted customers!

## 📷 Screenshots
<img width="1105" height="268" alt="Screenshot 2025-10-02 at 12 48 58"
src="https://github.com/user-attachments/assets/2a07d89b-7510-4565-82bb-26b46fbcf5c4"
/>

_☝🏽 ` ProblemCheck` notices to inform customers_

<img width="1077" height="472" alt="Screenshot 2025-10-02 at 12 49 41"
src="https://github.com/user-attachments/assets/b72028f7-5df2-45a8-8c71-65cf750755ab"
/>

_☝🏽 AI Usage page for easy monitoring_

<img width="1112" height="1083" alt="Screenshot 2025-10-02 at 18 17 01"
src="https://github.com/user-attachments/assets/a01992d5-15a0-472a-9501-bc3bc9a54ade"
/>

_☝🏽 Credit bars underneath relevant LLM models_

<img width="866" height="267" alt="Screenshot 2025-10-03 at 11 35 19"
src="https://github.com/user-attachments/assets/e7b4c0e7-c93d-4b0f-923d-79ac5d53028b"
/>

_☝🏽 Dialog box when trying to use without available credits_
2025-10-14 07:48:20 -07:00

44 lines
1.4 KiB
Ruby
Vendored

# frozen_string_literal: true
class LlmFeatureCreditCost < ActiveRecord::Base
self.table_name = "llm_feature_credit_costs"
belongs_to :llm_model
validates :llm_model_id, presence: true
validates :feature_name, presence: true
validates :credits_per_token, presence: true, numericality: { greater_than_or_equal_to: 0 }
validates :feature_name, uniqueness: { scope: :llm_model_id }
def self.credit_cost_for(llm_model, feature_name)
return 1.0 if llm_model.blank? || feature_name.blank?
cost =
where(llm_model: llm_model, feature_name: feature_name).pick(:credits_per_token) ||
where(llm_model: llm_model, feature_name: "default").pick(:credits_per_token) || 1.0
cost.to_f
end
def self.calculate_credit_cost(llm_model, feature_name, total_tokens)
cost_per_token = credit_cost_for(llm_model, feature_name)
(total_tokens * cost_per_token).ceil
end
end
# == Schema Information
#
# Table name: llm_feature_credit_costs
#
# id :bigint not null, primary key
# credits_per_token :decimal(10, 4) default(1.0), not null
# feature_name :string not null
# created_at :datetime not null
# updated_at :datetime not null
# llm_model_id :bigint not null
#
# Indexes
#
# idx_on_llm_model_id_feature_name_2b0b794b27 (llm_model_id,feature_name) UNIQUE
# index_llm_feature_credit_costs_on_llm_model_id (llm_model_id)
#