From 13967603bd69141348db126ca4d8329c70ed100c Mon Sep 17 00:00:00 2001 From: Justin Vallelonga Date: Fri, 13 Sep 2024 16:46:15 -0600 Subject: [PATCH] Add language model prices (#501) --- app/models/language_model.rb | 12 +++ app/models/user/registerable.rb | 84 +++++++++++-------- ...902024415_add_prices_to_language_models.rb | 6 ++ ...te_existing_language_models_with_prices.rb | 56 +++++++++++++ db/schema.rb | 4 +- 5 files changed, 127 insertions(+), 35 deletions(-) create mode 100644 db/migrate/20240902024415_add_prices_to_language_models.rb create mode 100644 db/migrate/20240911114059_update_existing_language_models_with_prices.rb diff --git a/app/models/language_model.rb b/app/models/language_model.rb index ff6591ff6..0501bff19 100644 --- a/app/models/language_model.rb +++ b/app/models/language_model.rb @@ -10,6 +10,18 @@ class LanguageModel < ApplicationRecord BEST_GROQ => "llama3-70b-8192", } + BEST_MODEL_INPUT_PRICES = { + BEST_GPT => 500, + BEST_CLAUDE => 300, + BEST_GROQ => 59, + } + + BEST_MODEL_OUTPUT_PRICES = { + BEST_GPT => 1500, + BEST_CLAUDE => 1500, + BEST_GROQ => 79, + } + belongs_to :user belongs_to :api_service diff --git a/app/models/user/registerable.rb b/app/models/user/registerable.rb index 36daa282a..97bcc7c02 100644 --- a/app/models/user/registerable.rb +++ b/app/models/user/registerable.rb @@ -13,50 +13,66 @@ def create_initial_assistants_etc groq_api_service = api_services.create!(url: APIService::URL_GROQ, driver: :openai, name: "Groq") [ - [LanguageModel::BEST_GPT, "Best OpenAI Model", true, open_ai_api_service], - [LanguageModel::BEST_CLAUDE, "Best Anthropic Model", true, anthropic_api_service], - [LanguageModel::BEST_GROQ, "Best Open-Source Model", true, groq_api_service], + [LanguageModel::BEST_GPT, "Best OpenAI Model", true, open_ai_api_service, LanguageModel::BEST_MODEL_INPUT_PRICES[LanguageModel::BEST_GPT], LanguageModel::BEST_MODEL_OUTPUT_PRICES[LanguageModel::BEST_GPT]], + [LanguageModel::BEST_CLAUDE, "Best Anthropic Model", true, anthropic_api_service, LanguageModel::BEST_MODEL_INPUT_PRICES[LanguageModel::BEST_CLAUDE], LanguageModel::BEST_MODEL_OUTPUT_PRICES[LanguageModel::BEST_CLAUDE]], + [LanguageModel::BEST_GROQ, "Best Open-Source Model", true, groq_api_service, LanguageModel::BEST_MODEL_INPUT_PRICES[LanguageModel::BEST_GROQ], LanguageModel::BEST_MODEL_OUTPUT_PRICES[LanguageModel::BEST_GROQ]], - ["gpt-4o", "GPT-4o (latest)", true, open_ai_api_service], - ["gpt-4o-2024-05-13", "GPT-4o Omni Multimodal (2024-05-13)", true, open_ai_api_service], + ["gpt-4o", "GPT-4o (latest)", true, open_ai_api_service, 500, 1500], + ["gpt-4o-2024-05-13", "GPT-4o Omni Multimodal (2024-05-13)", true, open_ai_api_service, 500, 1500], - ["gpt-4-turbo", "GPT-4 Turbo with Vision (latest)", true, open_ai_api_service], - ["gpt-4-turbo-2024-04-09", "GPT-4 Turbo with Vision (2024-04-09)", true, open_ai_api_service], - ["gpt-4-turbo-preview", "GPT-4 Turbo Preview", false, open_ai_api_service], - ["gpt-4-0125-preview", "GPT-4 Turbo Preview (2024-01-25)", false, open_ai_api_service], - ["gpt-4-1106-preview", "GPT-4 Turbo Preview (2023-11-06)", false, open_ai_api_service], - ["gpt-4-vision-preview", "GPT-4 Turbo with Vision Preview (2023-11-06)", true, open_ai_api_service], - ["gpt-4-1106-vision-preview", "GPT-4 Turbo with Vision Preview (2023-11-06)", true, open_ai_api_service], + ["gpt-4-turbo", "GPT-4 Turbo with Vision (latest)", true, open_ai_api_service, 1000, 3000], + ["gpt-4-turbo-2024-04-09", "GPT-4 Turbo with Vision (2024-04-09)", true, open_ai_api_service, 1000, 3000], + ["gpt-4-turbo-preview", "GPT-4 Turbo Preview", false, open_ai_api_service, 1000, 3000], # not sure on price + ["gpt-4-0125-preview", "GPT-4 Turbo Preview (2024-01-25)", false, open_ai_api_service, 1000, 3000], + ["gpt-4-1106-preview", "GPT-4 Turbo Preview (2023-11-06)", false, open_ai_api_service, 1000, 3000], + ["gpt-4-vision-preview", "GPT-4 Turbo with Vision Preview (2023-11-06)", true, open_ai_api_service, 1000, 3000], + ["gpt-4-1106-vision-preview", "GPT-4 Turbo with Vision Preview (2023-11-06)", true, open_ai_api_service, 1000, 3000], # not sure on price - ["gpt-4", "GPT-4 (latest)", false, open_ai_api_service], - ["gpt-4-0613", "GPT-4 Snapshot improved function calling (2023-06-13)", false, open_ai_api_service], + ["gpt-4", "GPT-4 (latest)", false, open_ai_api_service, 3000, 6000], + ["gpt-4-0613", "GPT-4 Snapshot improved function calling (2023-06-13)", false, open_ai_api_service, 1000, 3000], # not sure on price - ["gpt-3.5-turbo", "GPT-3.5 Turbo (latest)", false, open_ai_api_service], - ["gpt-3.5-turbo-0125", "GPT-3.5 Turbo (2022-01-25)", false, open_ai_api_service], - ["gpt-3.5-turbo-1106", "GPT-3.5 Turbo (2022-11-06)", false, open_ai_api_service], + ["gpt-3.5-turbo", "GPT-3.5 Turbo (latest)", false, open_ai_api_service, 300, 600], + ["gpt-3.5-turbo-0125", "GPT-3.5 Turbo (2022-01-25)", false, open_ai_api_service, 50, 150], + ["gpt-3.5-turbo-1106", "GPT-3.5 Turbo (2022-11-06)", false, open_ai_api_service, 100, 200], - ["claude-3-5-sonnet-20240620", "Claude 3.5 Sonnet (2024-06-20)", true, anthropic_api_service], - ["claude-3-opus-20240229", "Claude 3 Opus (2024-02-29)", true, anthropic_api_service], - ["claude-3-sonnet-20240229", "Claude 3 Sonnet (2024-02-29)", true, anthropic_api_service], - ["claude-3-haiku-20240307", "Claude 3 Haiku (2024-03-07)", true, anthropic_api_service], - ["claude-2.1", "Claude 2.1", false, anthropic_api_service], - ["claude-2.0", "Claude 2.0", false, anthropic_api_service], - ["claude-instant-1.2", "Claude Instant 1.2", false, anthropic_api_service], + ["claude-3-5-sonnet-20240620", "Claude 3.5 Sonnet (2024-06-20)", true, anthropic_api_service, 300, 1500], + ["claude-3-opus-20240229", "Claude 3 Opus (2024-02-29)", true, anthropic_api_service, 1500, 7500], + ["claude-3-sonnet-20240229", "Claude 3 Sonnet (2024-02-29)", true, anthropic_api_service, 300, 1500], + ["claude-3-haiku-20240307", "Claude 3 Haiku (2024-03-07)", true, anthropic_api_service, 25, 125], + ["claude-2.1", "Claude 2.1", false, anthropic_api_service, 800, 2400], + ["claude-2.0", "Claude 2.0", false, anthropic_api_service, 800, 2400], + ["claude-instant-1.2", "Claude Instant 1.2", false, anthropic_api_service, 80, 240], - ["llama3-70b-8192", "Meta Llama 3 70b", false, groq_api_service], - ["llama3-8b-8192", "Meta Llama 3 8b", false, groq_api_service], - ["mixtral-8x7b-32768", "Mistral 8 7b", false, groq_api_service], - ["gemma-7b-it", "Google Gemma 7b", false, groq_api_service], - ].each do |api_name, name, supports_images, api_service| - language_models.create!(api_name: api_name, api_service: api_service, name: name, supports_tools: true, supports_images: supports_images) + ["llama3-70b-8192", "Meta Llama 3 70b", false, groq_api_service, 59, 79], + ["llama3-8b-8192", "Meta Llama 3 8b", false, groq_api_service, 5, 8], + ["mixtral-8x7b-32768", "Mistral 8 7b", false, groq_api_service, 24, 24], + ["gemma-7b-it", "Google Gemma 7b", false, groq_api_service, 7, 7], + ].each do |api_name, name, supports_images, api_service, input_token_cost_per_million, output_token_cost_per_million| + million = BigDecimal(1_000_000) + input_token_cost_cents = input_token_cost_per_million/million + output_token_cost_cents = output_token_cost_per_million/million + + language_models.create!( + api_name: api_name, + api_service: api_service, + name: name, + supports_tools: true, + supports_images: supports_images, + input_token_cost_cents: input_token_cost_cents, + output_token_cost_cents: output_token_cost_cents, + ) end # Only these don't support tools: [ - ["gpt-3.5-turbo-instruct", "GPT-3.5 Turbo Instruct", false, open_ai_api_service], - ["gpt-3.5-turbo-16k-0613", "GPT-3.5 Turbo (2022-06-13)", false, open_ai_api_service], - ].each do |api_name, name, supports_images, api_service| - language_models.create!(api_name: api_name, api_service: api_service, name: name, supports_tools: false, supports_images: supports_images) + ["gpt-3.5-turbo-instruct", "GPT-3.5 Turbo Instruct", false, open_ai_api_service, 150, 200], + ["gpt-3.5-turbo-16k-0613", "GPT-3.5 Turbo (2022-06-13)", false, open_ai_api_service, 300, 400], + ].each do |api_name, name, supports_images, api_service, input_token_cost_per_million, output_token_cost_per_million| + million = BigDecimal(1_000_000) + input_token_cost_cents = input_token_cost_per_million/million + output_token_cost_cents = output_token_cost_per_million/million + + language_models.create!(api_name: api_name, api_service: api_service, name: name, supports_tools: false, supports_images: supports_images, input_token_cost_cents: input_token_cost_cents, output_token_cost_cents: output_token_cost_cents) end assistants.create! name: "GPT-4o", language_model: language_models.find_by(api_name: LanguageModel::BEST_GPT) diff --git a/db/migrate/20240902024415_add_prices_to_language_models.rb b/db/migrate/20240902024415_add_prices_to_language_models.rb new file mode 100644 index 000000000..6fdf169dd --- /dev/null +++ b/db/migrate/20240902024415_add_prices_to_language_models.rb @@ -0,0 +1,6 @@ +class AddPricesToLanguageModels < ActiveRecord::Migration[7.1] + def change + add_column :language_models, :input_token_cost_cents, :decimal, precision: 30, scale: 15, null: true + add_column :language_models, :output_token_cost_cents, :decimal, precision: 30, scale: 15, null: true + end +end diff --git a/db/migrate/20240911114059_update_existing_language_models_with_prices.rb b/db/migrate/20240911114059_update_existing_language_models_with_prices.rb new file mode 100644 index 000000000..8116e8a57 --- /dev/null +++ b/db/migrate/20240911114059_update_existing_language_models_with_prices.rb @@ -0,0 +1,56 @@ +class UpdateExistingLanguageModelsWithPrices < ActiveRecord::Migration[7.1] + def up + [ + [LanguageModel::BEST_GPT, LanguageModel::BEST_MODEL_INPUT_PRICES[LanguageModel::BEST_GPT], LanguageModel::BEST_MODEL_OUTPUT_PRICES[LanguageModel::BEST_GPT]], + [LanguageModel::BEST_CLAUDE, LanguageModel::BEST_MODEL_INPUT_PRICES[LanguageModel::BEST_CLAUDE], LanguageModel::BEST_MODEL_OUTPUT_PRICES[LanguageModel::BEST_CLAUDE]], + [LanguageModel::BEST_GROQ, LanguageModel::BEST_MODEL_INPUT_PRICES[LanguageModel::BEST_GROQ], LanguageModel::BEST_MODEL_OUTPUT_PRICES[LanguageModel::BEST_GROQ]], + + ["gpt-4o", 500, 1500], + ["gpt-4o-2024-05-13", 500, 1500], + + ["gpt-4-turbo", 1000, 3000], + ["gpt-4-turbo-2024-04-09", 1000, 3000], + ["gpt-4-turbo-preview", 1000, 3000], # not sure on price + ["gpt-4-0125-preview", 1000, 3000], + ["gpt-4-1106-preview", 1000, 3000], + ["gpt-4-vision-preview", 1000, 3000], + ["gpt-4-1106-vision-preview", 1000, 3000], # not sure on price + + ["gpt-4", 3000, 6000], + ["gpt-4-0613", 1000, 3000], # not sure on price + + ["gpt-3.5-turbo", 300, 600], + ["gpt-3.5-turbo-0125", 50, 150], + ["gpt-3.5-turbo-1106", 100, 200], + + ["claude-3-5-sonnet-20240620",300, 1500], + ["claude-3-opus-20240229", 1500, 7500], + ["claude-3-sonnet-20240229", 300, 1500], + ["claude-3-haiku-20240307", 25, 125], + ["claude-2.1", 800, 2400], + ["claude-2.0", 800, 2400], + ["claude-instant-1.2", 80, 240], + + ["llama3-70b-8192", 59, 79], + ["llama3-8b-8192", 5, 8], + ["mixtral-8x7b-32768", 24, 24], + ["gemma-7b-it", 7, 7], + + ["gpt-3.5-turbo-instruct", 150, 200], + ["gpt-3.5-turbo-16k-0613", 300, 400], + ].each do |api_name, input_token_cost_per_million, output_token_cost_per_million| + million = BigDecimal(1_000_000) + input_token_cost_cents = input_token_cost_per_million/million + output_token_cost_cents = output_token_cost_per_million/million + + LanguageModel.where(api_name: api_name).update_all( + input_token_cost_cents: input_token_cost_cents, + output_token_cost_cents: output_token_cost_cents, + ) + end + end + + def down + # nothing to do + end +end diff --git a/db/schema.rb b/db/schema.rb index a71b25341..9af9acad0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_08_23_210939) do +ActiveRecord::Schema[7.1].define(version: 2024_09_11_114059) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -170,6 +170,8 @@ t.bigint "user_id", null: false t.bigint "api_service_id" t.boolean "supports_tools", default: false + t.decimal "input_token_cost_cents", precision: 30, scale: 15 + t.decimal "output_token_cost_cents", precision: 30, scale: 15 t.index ["api_service_id"], name: "index_language_models_on_api_service_id" t.index ["user_id", "deleted_at"], name: "index_language_models_on_user_id_and_deleted_at" t.index ["user_id"], name: "index_language_models_on_user_id"