2024-05-13 11:46:42 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class LlmModel < ActiveRecord::Base
|
2024-06-18 13:32:14 -04:00
|
|
|
FIRST_BOT_USER_ID = -1200
|
|
|
|
RESERVED_VLLM_SRV_URL = "https://vllm.shadowed-by-srv.invalid"
|
2024-06-24 18:26:30 -04:00
|
|
|
BEDROCK_PROVIDER_NAME = "aws_bedrock"
|
2024-06-18 13:32:14 -04:00
|
|
|
|
|
|
|
belongs_to :user
|
|
|
|
|
|
|
|
validates :url, exclusion: { in: [RESERVED_VLLM_SRV_URL] }
|
|
|
|
|
|
|
|
def self.enable_or_disable_srv_llm!
|
|
|
|
srv_model = find_by(url: RESERVED_VLLM_SRV_URL)
|
|
|
|
if SiteSetting.ai_vllm_endpoint_srv.present? && srv_model.blank?
|
|
|
|
record =
|
|
|
|
new(
|
|
|
|
display_name: "vLLM SRV LLM",
|
|
|
|
name: "mistralai/Mixtral",
|
|
|
|
provider: "vllm",
|
|
|
|
tokenizer: "DiscourseAi::Tokenizer::MixtralTokenizer",
|
|
|
|
url: RESERVED_VLLM_SRV_URL,
|
2024-06-19 01:49:36 -04:00
|
|
|
max_prompt_tokens: 8000,
|
2024-06-18 13:32:14 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
record.save(validate: false) # Ignore reserved URL validation
|
|
|
|
elsif srv_model.present?
|
|
|
|
srv_model.destroy!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-06-24 18:26:30 -04:00
|
|
|
def self.provider_params
|
|
|
|
{
|
|
|
|
aws_bedrock: {
|
|
|
|
url_editable: false,
|
|
|
|
fields: %i[access_key_id region],
|
|
|
|
},
|
|
|
|
open_ai: {
|
|
|
|
url_editable: true,
|
|
|
|
fields: %i[organization],
|
|
|
|
},
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2024-06-18 13:32:14 -04:00
|
|
|
def toggle_companion_user
|
|
|
|
return if name == "fake" && Rails.env.production?
|
|
|
|
|
|
|
|
enable_check = SiteSetting.ai_bot_enabled && enabled_chat_bot
|
|
|
|
|
|
|
|
if enable_check
|
|
|
|
if !user
|
|
|
|
next_id = DB.query_single(<<~SQL).first
|
|
|
|
SELECT min(id) - 1 FROM users
|
|
|
|
SQL
|
|
|
|
|
|
|
|
new_user =
|
|
|
|
User.new(
|
|
|
|
id: [FIRST_BOT_USER_ID, next_id].min,
|
2024-06-21 03:32:15 -04:00
|
|
|
email: "no_email_#{SecureRandom.hex}",
|
2024-06-18 13:32:14 -04:00
|
|
|
name: name.titleize,
|
|
|
|
username: UserNameSuggester.suggest(name),
|
|
|
|
active: true,
|
|
|
|
approved: true,
|
|
|
|
admin: true,
|
|
|
|
moderator: true,
|
|
|
|
trust_level: TrustLevel[4],
|
|
|
|
)
|
|
|
|
new_user.save!(validate: false)
|
|
|
|
self.update!(user: new_user)
|
|
|
|
else
|
2024-06-19 01:49:36 -04:00
|
|
|
user.active = true
|
|
|
|
user.save!(validate: false)
|
2024-06-18 13:32:14 -04:00
|
|
|
end
|
|
|
|
elsif user
|
|
|
|
# will include deleted
|
|
|
|
has_posts = DB.query_single("SELECT 1 FROM posts WHERE user_id = #{user.id} LIMIT 1").present?
|
|
|
|
|
|
|
|
if has_posts
|
|
|
|
user.update!(active: false) if user.active
|
|
|
|
else
|
|
|
|
user.destroy!
|
|
|
|
self.update!(user: nil)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-05-13 11:46:42 -04:00
|
|
|
def tokenizer_class
|
|
|
|
tokenizer.constantize
|
|
|
|
end
|
2024-06-24 18:26:30 -04:00
|
|
|
|
|
|
|
def lookup_custom_param(key)
|
|
|
|
provider_params&.dig(key)
|
|
|
|
end
|
2024-05-13 11:46:42 -04:00
|
|
|
end
|
2024-05-21 12:35:50 -04:00
|
|
|
|
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: llm_models
|
|
|
|
#
|
|
|
|
# id :bigint not null, primary key
|
|
|
|
# display_name :string
|
|
|
|
# name :string not null
|
|
|
|
# provider :string not null
|
|
|
|
# tokenizer :string not null
|
|
|
|
# max_prompt_tokens :integer not null
|
|
|
|
# created_at :datetime not null
|
|
|
|
# updated_at :datetime not null
|
|
|
|
# url :string
|
|
|
|
# api_key :string
|
2024-06-18 13:32:14 -04:00
|
|
|
# user_id :integer
|
|
|
|
# enabled_chat_bot :boolean default(FALSE), not null
|
2024-05-21 12:35:50 -04:00
|
|
|
#
|