class SlackSmartBot
module AI
module OpenAI
def self.send_gpt_chat(open_ai_client, model, messages, chat_gpt_config)
require "openai"
require "nice_http"
user = Thread.current[:user]
if user.key?(:sso_user_name)
user_name = user.sso_user_name
else
user_name = user.name
end
if messages.is_a?(String)
messages = [{ role: "user", content: messages }]
end
parameters = {
model: model, messages: messages,
temperature: 0.7,
user: user_name,
}
parameters.user = chat_gpt_config.fixed_user if chat_gpt_config.fixed_user.to_s != ""
if open_ai_client.is_a?(NiceHttp)
begin
response = {}
tries = 0
while (!response.key?(:data) or response.data.nil? or response.data.empty?) and tries < 10
begin
request = {
path: "/openai/deployments/#{model}/chat/completions?api-version=#{chat_gpt_config.api_version}",
data: parameters,
}
response = open_ai_client.post(request)
rescue Exception => exception
response = { message: exception.message }.to_json
end
tries += 1
sleep 1 if !response.key?(:data) or response.data.nil? or response.data.empty? end
response.data = { message: "" }.to_json if !response.key?(:data) or response.data.nil? or response.data.empty?
response = response.data
rescue Exception => exception
response = { message: exception.message }.to_json
end
else
begin
response = open_ai_client.chat(parameters: parameters)
response = response.to_json
rescue Exception => e
response = e.response
if !response.nil? and response.status == 403 and response.body.error.message.to_s.include?("You must pass a valid 'user'")
response.body.error.message += "\nThe user on Slack is: #{user.name}\nYou have to go to your Profile Slack Account on a browser. Then go to Settings.\nNow go to Username and click on expand, change the name to your SSO name and click on Save"
end
if response.nil?
response = { message: e.message }
else
response = response.to_json
end
end
end
if response.nil?
result = "No response from the AI. Please contact the SmartBot administrator."
return false, result
elsif response.is_a?(Hash) and response.key?(:message) and !response.key?(:content)
result = response[:message]
return false, result
elsif !response.json(:message).empty? and response.json(:content).empty?
result = response.json(:message)
return false, result
elsif !response.json(:error).empty? and !response.json(:code).empty?
result = response.json(:code)
return false, result
elsif !response.json(:error).empty?
result = response.json(:error).to_s
return false, result
else
result = response.json(:content)
return true, result
end
end
end
end
end