class SlackSmartBot
module AI
module OpenAI
def self.connect(ai_open_ai, general_config, personal_settings, reconnect: false, service: :chat_gpt)
require "openai"
require "nice_http"
user = Thread.current[:user]
team_id_user = Thread.current[:team_id_user]
ai_open_ai = {} if ai_open_ai.nil?
ai_open_ai_user = {}
ai_open_ai_user = {
host: general_config._ai.open_ai.host,
access_token: general_config._ai.open_ai.access_token,
models: {
client: nil,
host: general_config._ai.open_ai.models.host,
access_token: general_config._ai.open_ai.models.access_token,
url: general_config._ai.open_ai.models.url,
api_type: general_config._ai.open_ai.models.api_type,
api_version: general_config._ai.open_ai.models.api_version,
},
chat_gpt: {
client: nil,
host: general_config._ai.open_ai.chat_gpt.host,
access_token: general_config._ai.open_ai.chat_gpt.access_token,
model: general_config._ai.open_ai.chat_gpt.model,
smartbot_model: general_config._ai.open_ai.chat_gpt.smartbot_model,
api_type: general_config._ai.open_ai.chat_gpt.api_type,
api_version: general_config._ai.open_ai.chat_gpt.api_version,
fixed_user: general_config._ai.open_ai.chat_gpt.fixed_user, },
dall_e: {
client: nil,
host: general_config._ai.open_ai.dall_e.host,
access_token: general_config._ai.open_ai.dall_e.access_token,
image_size: general_config._ai.open_ai.dall_e.image_size,
model: general_config._ai.open_ai.dall_e.model,
},
whisper: {
client: nil,
host: general_config._ai.open_ai.whisper.host,
access_token: general_config._ai.open_ai.whisper.access_token,
model: general_config._ai.open_ai.whisper.model,
},
}
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.host") and
personal_settings[team_id_user]["ai.open_ai.host"] != ""
ai_open_ai_user[:host] = personal_settings[team_id_user]["ai.open_ai.host"]
ai_open_ai_user[:chat_gpt][:host] = ai_open_ai_user[:host]
ai_open_ai_user[:dall_e][:host] = ai_open_ai_user[:host]
ai_open_ai_user[:whisper][:host] = ai_open_ai_user[:host]
ai_open_ai_user[:models][:host] = ai_open_ai_user[:host]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.access_token") and
personal_settings[team_id_user]["ai.open_ai.access_token"] != ""
ai_open_ai_user[:access_token] = personal_settings[team_id_user]["ai.open_ai.access_token"]
ai_open_ai_user[:chat_gpt][:access_token] = ai_open_ai_user[:access_token]
ai_open_ai_user[:dall_e][:access_token] = ai_open_ai_user[:access_token]
ai_open_ai_user[:whisper][:access_token] = ai_open_ai_user[:access_token]
ai_open_ai_user[:models][:access_token] = ai_open_ai_user[:access_token]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.chat_gpt.model") and
personal_settings[team_id_user]["ai.open_ai.chat_gpt.model"] != ""
ai_open_ai_user[:chat_gpt][:model] = personal_settings[team_id_user]["ai.open_ai.chat_gpt.model"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.chat_gpt.smartbot_model") and
personal_settings[team_id_user]["ai.open_ai.chat_gpt.smartbot_model"] != ""
ai_open_ai_user[:chat_gpt][:smartbot_model] = personal_settings[team_id_user]["ai.open_ai.chat_gpt.smartbot_model"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.whisper.model") and
personal_settings[team_id_user]["ai.open_ai.whisper.model"] != ""
ai_open_ai_user[:whisper][:model] = personal_settings[team_id_user]["ai.open_ai.whisper.model"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.dall_e.image_size") and
personal_settings[team_id_user]["ai.open_ai.dall_e.image_size"] != ""
ai_open_ai_user[:dall_e][:image_size] = personal_settings[team_id_user]["ai.open_ai.dall_e.image_size"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.chat_gpt.host") and
personal_settings[team_id_user]["ai.open_ai.chat_gpt.host"] != ""
ai_open_ai_user[:chat_gpt][:host] = personal_settings[team_id_user]["ai.open_ai.chat_gpt.host"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.dall_e.host") and
personal_settings[team_id_user]["ai.open_ai.dall_e.host"] != ""
ai_open_ai_user[:dall_e][:host] = personal_settings[team_id_user]["ai.open_ai.dall_e.host"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.whisper.host") and
personal_settings[team_id_user]["ai.open_ai.whisper.host"] != ""
ai_open_ai_user[:whisper][:host] = personal_settings[team_id_user]["ai.open_ai.whisper.host"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.chat_gpt.access_token") and
personal_settings[team_id_user]["ai.open_ai.chat_gpt.access_token"] != ""
ai_open_ai_user[:chat_gpt][:access_token] = personal_settings[team_id_user]["ai.open_ai.chat_gpt.access_token"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.dall_e.access_token") and
personal_settings[team_id_user]["ai.open_ai.dall_e.access_token"] != ""
ai_open_ai_user[:dall_e][:access_token] = personal_settings[team_id_user]["ai.open_ai.dall_e.access_token"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.whisper.access_token") and
personal_settings[team_id_user]["ai.open_ai.whisper.access_token"] != ""
ai_open_ai_user[:whisper][:access_token] = personal_settings[team_id_user]["ai.open_ai.whisper.access_token"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.chat_gpt.api_type") and
personal_settings[team_id_user]["ai.open_ai.chat_gpt.api_type"] != ""
ai_open_ai_user[:chat_gpt][:api_type] = personal_settings[team_id_user]["ai.open_ai.chat_gpt.api_type"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.chat_gpt.api_version") and
personal_settings[team_id_user]["ai.open_ai.chat_gpt.api_version"] != ""
ai_open_ai_user[:chat_gpt][:api_version] = personal_settings[team_id_user]["ai.open_ai.chat_gpt.api_version"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.models.host") and
personal_settings[team_id_user]["ai.open_ai.models.host"] != ""
ai_open_ai_user[:models][:host] = personal_settings[team_id_user]["ai.open_ai.models.host"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.models.access_token") and
personal_settings[team_id_user]["ai.open_ai.models.access_token"] != ""
ai_open_ai_user[:models][:access_token] = personal_settings[team_id_user]["ai.open_ai.models.access_token"]
end
if personal_settings.key?(team_id_user) and personal_settings[team_id_user].key?("ai.open_ai.models.url") and
personal_settings[team_id_user]["ai.open_ai.models.url"] != ""
ai_open_ai_user[:models][:url] = personal_settings[team_id_user]["ai.open_ai.models.url"]
end
host = ai_open_ai_user[service].host
access_token = ai_open_ai_user[service].access_token
ai_open_ai[team_id_user] ||= ai_open_ai_user.deep_copy
if ai_open_ai.key?(team_id_user) and ai_open_ai[team_id_user] != nil and ai_open_ai[team_id_user][service].key?(:client) and
ai_open_ai[team_id_user][service][:client] != nil and !reconnect
elsif access_token.to_s != ""
ai_open_ai[team_id_user][service] = ai_open_ai_user[service].deep_copy
if host == ""
ai_open_ai[team_id_user][service][:client] = ::OpenAI::Client.new(uri_base: "https://api.openai.com/", access_token: access_token, request_timeout: 300)
else
if ai_open_ai_user[service].key?(:url) and ai_open_ai_user[service][:url] != ""
ai_open_ai[team_id_user][service][:client] = NiceHttp.new(host: host, headers: { 'Authorization': "Bearer #{ai_open_ai_user[service][:access_token]}" }, ssl: true, timeout: (30))
elsif ai_open_ai_user[service].key?(:api_type) and ai_open_ai_user[service][:api_type] == :openai_azure
if general_config._ai.open_ai.key?(:testing) and general_config._ai.open_ai.testing log = "#{general_config.path}/logs/chat_gpt_azure_#{team_id_user}.log"
else
log = :no
end
ai_open_ai[team_id_user][service][:client] = NiceHttp.new(host: host, headers: { 'api-key': access_token }, ssl: true, timeout: (30), log: log)
else
ai_open_ai[team_id_user][service][:client] = ::OpenAI::Client.new(uri_base: host, access_token: access_token, request_timeout: 300)
end
end
else
ai_open_ai[team_id_user] = nil
message = ["You need to set the OpenAI access token in the config file or in the personal settings."]
message << "You can get it from https://platform.openai.com/account/api-keys"
message << "If you want to use your personal access token, you can set it on a DM with SmartBot in the personal settings:"
message << " `set personal settings ai.open_ai.#{service}.access_token ACCESS_TOKEN`"
if service == :chat_gpt
message << "By default we will be using the chatgpt model #{general_config._ai.open_ai.chat_gpt.model}. You can change it in the config file or in personal settings:"
message << " `set personal settings ai.open_ai.chat_gpt.model gpt-4-0314`"
message << "For specifying the model for ChatGPT on REPLs: `set personal settings ai.open_ai.chat_gpt.smartbot_model gpt-4-0314`"
elsif service == :whisper
message << "By default we will be using the whisper model #{general_config._ai.open_ai.whisper.model}. You can change it in the config file or in personal settings:"
message << " `set personal settings ai.open_ai.whisper.model whisper-1`"
elsif service == :dall_e
message << "You can also change the image size in the config file or in personal settings:"
message << " `set personal settings ai.open_ai.dall_e.image_size 512x512`"
end
message << "In case you are a master admin, you can set it in the SmartBot config file:"
message << " `ai: { open_ai: { #{service}: { access_token: 'ACCESS_TOKEN'} } }`"
return ai_open_ai, message.join("\n")
end
return ai_open_ai, ""
end
end
end
end