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, # Required. 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? #wait a second before trying again 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