Module: SlackSmartBot::Commands::General::AI::OpenAI
- Included in:
- SlackSmartBot
- Defined in:
- lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_models.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_whisper.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_edit_image.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_use_model.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_generate_image.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_get_prompts.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_variations_image.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_copy_session.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_list_sessions.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_share_session.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_delete_session.rb,
lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_add_collaborator.rb
Instance Method Summary collapse
- #open_ai_chat(message, delete_history, type, model: '', tag: '', description: '', files: []) ⇒ Object
- #open_ai_chat_add_collaborator(cname) ⇒ Object
- #open_ai_chat_copy_session(team_orig, user_orig, session_name, new_session_name) ⇒ Object
- #open_ai_chat_delete_session(session_name) ⇒ Object
- #open_ai_chat_get_prompts(session_name) ⇒ Object
-
#open_ai_chat_list_sessions(type, tag: '') ⇒ Object
type can be :own or :public or :shared.
- #open_ai_chat_share_session(type, session_name, channel_id) ⇒ Object
- #open_ai_chat_use_model(model, dont_save_stats: false) ⇒ Object
- #open_ai_edit_image(message, files) ⇒ Object
- #open_ai_generate_image(message, delete_history = false, repeat: false) ⇒ Object
- #open_ai_models(model = '', just_models: false) ⇒ Object
- #open_ai_variations_image(message, variations, files) ⇒ Object
- #open_ai_whisper(message, files) ⇒ Object
Instance Method Details
#open_ai_chat(message, delete_history, type, model: '', tag: '', description: '', files: []) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat.rb', line 6 def open_ai_chat(, delete_history, type, model: '', tag: '', description: '', files: []) get_personal_settings() user = Thread.current[:user].dup user_name = user.name team_id = user.team_id team_id_user = Thread.current[:team_id_user] if model != '' and !@open_ai_models.include?(model) open_ai_models('', just_models: true) if @open_ai_models.empty? model_selected = @open_ai_models.select{|m| m.include?(model)} model = model_selected[0] if model_selected.size == 1 end @active_chat_gpt_sessions[team_id_user] ||= {} if delete_history @active_chat_gpt_sessions[team_id_user][Thread.current[:dest]] = '' session_name = '' end if @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:thread_ts]) and Thread.current[:thread_ts]!='' #added and Thread.current[:thread_ts]!='' for testing when SIMULATE==true and not in a thread session_name = @active_chat_gpt_sessions[team_id_user][Thread.current[:thread_ts]] elsif @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:dest]) session_name = @active_chat_gpt_sessions[team_id_user][Thread.current[:dest]] else session_name = '' @active_chat_gpt_sessions[team_id_user][Thread.current[:dest]] = '' end if type == :start or type == :continue session_name = @active_chat_gpt_sessions[team_id_user] ||= {} @active_chat_gpt_sessions[team_id_user][Thread.current[:thread_ts]] = session_name = '' get_openai_sessions(session_name) @open_ai[team_id_user] ||= {} @open_ai[team_id_user][:chat_gpt] ||= {} @open_ai[team_id_user][:chat_gpt][:sessions] ||= {} if !@open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name) @open_ai[team_id_user][:chat_gpt][:sessions][session_name] = { team_creator: team_id, user_creator: user_name, started: Time.now.strftime("%Y-%m-%d %H:%M:%S"), last_activity: Time.now.strftime("%Y-%m-%d %H:%M:%S"), collaborators: [], num_prompts: 0, model: model, copy_of_session: '', copy_of_team: '', copy_of_user: '', users_copying: [], public: false, shared: [], description: description, tag: tag.downcase } else # type == :continue or loading @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:model] = model if model != '' num_prompts = @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:num_prompts] respond "*ChatGPT*: I just loaded *#{session_name}*.\nThere are *#{num_prompts} prompts* in this session.\nThis was the *last prompt* from the session:\n" content = @ai_gpt[team_id_user][session_name].join("\n") index_last_prompt = content.rindex(/^(Me>\s.*)$/) if index_last_prompt.nil? respond "No prompts found" else last_prompt = content[index_last_prompt..-1].gsub(/^Me>/, '*Me>*').gsub(/^chatGPT>/i, "\n*ChatGPT>*") respond last_prompt end end if Thread.current[:on_thread] and (Thread.current[:thread_ts] == Thread.current[:ts] or ( @open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name) and @open_ai[team_id_user][:chat_gpt][:sessions][session_name].key?(:thread_ts) and @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:thread_ts].include?(Thread.current[:thread_ts]) ) ) react :running, Thread.current[:thread_ts] @listening[team_id_user] ||= {} @listening[team_id_user][Thread.current[:thread_ts]] = Time.now @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:thread_ts] ||= [] @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:thread_ts] << Thread.current[:thread_ts] @listening[:threads][Thread.current[:thread_ts]] = Thread.current[:dest] else @active_chat_gpt_sessions[team_id_user][Thread.current[:dest]] = session_name end @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:description] = description if description != '' @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:tag] = tag.downcase if tag != '' open_ai_chat_use_model(model, dont_save_stats: true) if model != '' elsif type == :temporary and (!@chat_gpt_collaborating.key?(team_id_user) or !@chat_gpt_collaborating[team_id_user].key?(Thread.current[:thread_ts])) @open_ai[team_id_user] ||= {} @open_ai[team_id_user][:chat_gpt] ||= {} @open_ai[team_id_user][:chat_gpt][:sessions] ||= {} if Thread.current[:on_thread] and (Thread.current[:thread_ts] == Thread.current[:ts] or (@open_ai[team_id_user][:chat_gpt][:sessions].key?("") and @open_ai[team_id_user][:chat_gpt][:sessions][""].key?(:thread_ts) and @open_ai[team_id_user][:chat_gpt][:sessions][""][:thread_ts].include?(Thread.current[:thread_ts]) )) @listening[team_id_user] ||= {} @listening[team_id_user][Thread.current[:thread_ts]] = Time.now @listening[:threads][Thread.current[:thread_ts]] = Thread.current[:dest] react :running if Thread.current[:thread_ts] == Thread.current[:ts] @open_ai[team_id_user][:chat_gpt][:sessions][""] ||= {} @open_ai[team_id_user][:chat_gpt][:sessions][""][:thread_ts] ||= [] @open_ai[team_id_user][:chat_gpt][:sessions][""][:thread_ts] << Thread.current[:thread_ts] @active_chat_gpt_sessions[team_id_user] ||= {} @active_chat_gpt_sessions[team_id_user][Thread.current[:thread_ts]] ||= "" end end #for collaborators if @chat_gpt_collaborating.key?(team_id_user) and @chat_gpt_collaborating[team_id_user].key?(Thread.current[:thread_ts]) team_creator = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:team_creator] user_creator = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:user_creator] session_name = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:session_name] collaborator = true else team_creator = team_id user_creator = user_name collaborator = false end team_id_user_creator = team_creator + "_" + user_creator unless type != :temporary and (!@open_ai.key?(team_id_user_creator) or !@open_ai[team_id_user_creator].key?(:chat_gpt) or !@open_ai[team_id_user_creator][:chat_gpt].key?(:sessions) or !@open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name) or (@open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name) and !collaborator and user_creator!=user.name)) save_stats(__method__) @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:last_activity] = Time.now.strftime("%Y-%m-%d %H:%M:%S") unless session_name == '' @ai_open_ai, = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, reconnect: delete_history, service: :chat_gpt) respond if if !@ai_open_ai[team_id_user_creator].nil? and !@ai_open_ai[team_id_user_creator][:chat_gpt][:client].nil? @ai_gpt[team_id_user_creator] ||= {} @ai_gpt[team_id_user_creator][session_name] ||= [] if delete_history or !@open_ai.key?(team_id_user_creator) or !@open_ai[team_id_user_creator].key?(:chat_gpt) or !@open_ai[team_id_user_creator][:chat_gpt].key?(:sessions) or !@open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name) or !@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name].key?(:model) or !@open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name].key?(:num_prompts) if delete_history and session_name == '' && @open_ai.key?(team_id_user_creator) && @open_ai[team_id_user_creator].key?(:chat_gpt) && @open_ai[team_id_user_creator][:chat_gpt].key?(:sessions) && @open_ai[team_id_user_creator][:chat_gpt][:sessions].key?("") && @open_ai[team_id_user_creator][:chat_gpt][:sessions][""].key?(:thread_ts) @open_ai[team_id_user_creator][:chat_gpt][:sessions][""][:thread_ts].each do |thread_ts| if thread_ts != Thread.current[:thread_ts] && @listening[:threads].key?(thread_ts) unreact :running, thread_ts, channel: @listening[:threads][thread_ts] = "I'm sorry, but I'm no longer listening to this thread since you started a new temporary session." respond , @listening[:threads][thread_ts], thread_ts: thread_ts @listening[team_id_user_creator].delete(thread_ts) @listening[:threads].delete(thread_ts) end end end @open_ai[team_id_user_creator] ||= {} @open_ai[team_id_user_creator][:chat_gpt] ||= {} @open_ai[team_id_user_creator][:chat_gpt][:sessions] ||= {} @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name] ||= {} @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:model] = model @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:num_prompts] = 0 end if == "" and session_name == '' # ?? is called @ai_gpt[team_id_user_creator][session_name] = [] respond "*ChatGPT*: Let's start a new temporary conversation. Ask me anything." open_ai_chat_use_model(model, dont_save_stats: true) if model != '' else react :speech_balloon begin = [] get_openai_sessions(session_name, team_id: team_creator, user_name: user_creator) @ai_gpt[team_id_user_creator][session_name] = [] if delete_history if @open_ai.key?(team_id_user_creator) and @open_ai[team_id_user_creator].key?(:chat_gpt) and @open_ai[team_id_user_creator][:chat_gpt].key?(:sessions) and @open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name) and @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name].key?(:model) if model == '' model = @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:model].to_s else @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:model] = model end else model = '' end model = @ai_open_ai[team_id_user_creator].chat_gpt.model if model.empty? if == '' res = '' else if !files.nil? and files.size == 1 http = NiceHttp.new(host: "https://files.slack.com", headers: { "Authorization" => "Bearer #{config.token}" }) res = http.get(files[0].url_private_download) = "#{}\n\n#{res.data}" end @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:num_prompts] += 1 urls = .scan(/!(https?:\/\/[\S]+)/).flatten urls.uniq.each do |url| begin parsed_url = URI.parse(url) headers = {} = {} if config.key?(:authorizations) config[:authorizations].each do |key, value| if value.key?(:host) [value[:host]] = value end end end if @personal_settings_hash.key?(team_id_user) and @personal_settings_hash[team_id_user].key?(:authorizations) @personal_settings_hash[team_id_user][:authorizations].each do |key, value| if value.key?(:host) [value[:host]] = value end end end .each do |key, value| if key.match?(/^(https:\/\/|http:\/\/)?#{parsed_url.host.gsub('.','\.')}/) value.each do |k, v| headers[k.to_sym] = v unless k == :host end end end domain = "#{parsed_url.scheme}://#{parsed_url.host}" http = NiceHttp.new(host: domain, headers: headers, log: :no) response = http.get(parsed_url.path) html_doc = Nokogiri::HTML(response.body) html_doc.search('script, style').remove text = html_doc.text.strip text.gsub!(/^\s*$/m, "") << "> #{url}: content extracted and added to prompt\n" http.close rescue Exception => e text = "Error: #{e.}" << "> #{url}: #{text}\n" end .gsub!("!#{url}", '') += "\n #{text}\n" end @ai_gpt[team_id_user_creator][session_name] << "Me> #{}" prompts = @ai_gpt[team_id_user_creator][session_name].join("\n\n") prompts.gsub!(/^Me>\s*/,'') prompts.gsub!(/^chatGPT>\s*/,'') success, res = SlackSmartBot::AI::OpenAI.send_gpt_chat(@ai_open_ai[team_id_user_creator][:chat_gpt][:client], model, prompts, @ai_open_ai[team_id_user_creator].chat_gpt) if success @ai_gpt[team_id_user_creator][session_name] << "chatGPT> #{res}" end end if session_name == '' temp_session_name = @ai_gpt[team_id_user_creator][''].first[0..35].gsub('Me> ','') respond "*ChatGPT* Temporary session: _<#{temp_session_name.gsub("\n",' ').gsub("`",' ')}...>_ model: #{model}\n#{res.to_s.strip}" if res.to_s.strip == '' respond "It seems like GPT is not responding. Please try again later or use another model, as it might be overloaded." end #to avoid logging the prompt or the response if config.encrypt Thread.current[:encrypted] ||= [] Thread.current[:encrypted] << end elsif res.to_s.strip == '' res = "\nAll prompts were removed from session." if delete_history respond "*ChatGPT* Session _<#{session_name}>_ model: #{model}#{res}" respond "It seems like GPT is not responding. Please try again later or use another model, as it might be overloaded." if != '' else respond "*ChatGPT* Session _<#{session_name}>_ model: #{model}\n#{res.to_s.strip}" end if .size > 0 respond .join("\n") end update_openai_sessions(session_name, team_id: team_creator, user_name: user_creator) unless session_name == '' rescue => exception respond "*ChatGPT*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later." @logger.warn exception end unreact :speech_balloon end end end end |
#open_ai_chat_add_collaborator(cname) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_add_collaborator.rb', line 6 def open_ai_chat_add_collaborator(cname) save_stats(__method__) user = Thread.current[:user] team_id = user.team_id team_id_user = Thread.current[:team_id_user] @active_chat_gpt_sessions[team_id_user] ||= {} if @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:thread_ts]) session_name = @active_chat_gpt_sessions[team_id_user][Thread.current[:thread_ts]] elsif @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:dest]) session_name = @active_chat_gpt_sessions[team_id_user][Thread.current[:dest]] else session_name = '' end if session_name != "" and @active_chat_gpt_sessions[team_id_user].key?(Thread.current[:thread_ts]) collaborator = find_user(cname) team_id_user_collaborator = collaborator.team_id + "_" + collaborator.name unless @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:collaborators].include?(team_id_user_collaborator) @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:collaborators] << team_id_user_collaborator end @listening[team_id_user_collaborator] ||= {} @listening[team_id_user_collaborator][Thread.current[:thread_ts]] = Time.now @chat_gpt_collaborating[team_id_user_collaborator] ||= {} @chat_gpt_collaborating[team_id_user_collaborator][Thread.current[:thread_ts]] ||= { team_creator: team_id, user_creator: user.name, session_name: session_name } respond "Now <@#{collaborator.name}> is a collaborator of this session only when on a thread.\nIn case you don't want to send a message as a prompt, just start the message with hyphen (-)." else respond "You can add collaborators for the chatGPT session only when started on a thread and using a session name." end end |
#open_ai_chat_copy_session(team_orig, user_orig, session_name, new_session_name) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_copy_session.rb', line 6 def open_ai_chat_copy_session(team_orig, user_orig, session_name, new_session_name) if user_orig == "" save_stats(__method__) else save_stats(:open_ai_chat_copy_session_from_user) end user = Thread.current[:user].dup team_id = user.team_id if user_orig == "" user_orig = user.name team_orig = team_id end team_orig = team_id if team_orig == "" dest = Thread.current[:dest] get_openai_sessions() orig_team_id_user = team_orig + "_" + user_orig team_id_user = team_id + "_" + user.name if !@open_ai.key?(orig_team_id_user) respond "*ChatGPT*: The user *#{user_orig}* doesn't exist." elsif !@open_ai[orig_team_id_user][:chat_gpt][:sessions].key?(session_name) respond "*ChatGPT*: The session *#{session_name}* doesn't exist." elsif user_orig != user.name and !@open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name][:public] and !@open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name][:shared].include?(dest) respond "*ChatGPT*: The session *#{session_name}* doesn't exist or it is not shared." else @open_ai[team_id_user] ||= {} @open_ai[team_id_user][:chat_gpt] ||= {} @open_ai[team_id_user][:chat_gpt][:sessions] ||= {} session_orig = @open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name] open_ai_new_session = { team_creator: team_id, user_creator: user.name, started: Time.now.strftime("%Y-%m-%d %H:%M:%S"), last_activity: Time.now.strftime("%Y-%m-%d %H:%M:%S"), collaborators: [], num_prompts: session_orig[:num_prompts], model: session_orig[:model], shared: [], copy_of_session: session_name, copy_of_team: team_orig, copy_of_user: user_orig, users_copying: [], public: false, description: session_orig[:description], tag: session_orig[:tag] } new_session_name = session_name if new_session_name == "" session_names = @open_ai[team_id_user][:chat_gpt][:sessions].keys if session_names.include?(new_session_name) number = session_names.join("\n").scan(/^#{new_session_name}(\d+)$/).max if number.nil? number = "1" else number = number.flatten[-1].to_i + 1 end new_session_name = "#{new_session_name}#{number}" end @open_ai[team_id_user][:chat_gpt][:sessions][new_session_name] = open_ai_new_session if user_orig != user.name or team_id != team_orig @open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name][:users_copying] ||= [] @open_ai[orig_team_id_user][:chat_gpt][:sessions][session_name][:users_copying] << user.name update_openai_sessions("", team_id: team_orig, user_name: user_orig) end get_openai_sessions(session_name, team_id: team_orig, user_name: user_orig) @ai_gpt[team_id_user] ||= {} @ai_gpt[team_id_user][new_session_name] = @ai_gpt[orig_team_id_user][session_name].dup update_openai_sessions(new_session_name, team_id: team_id, user_name: user.name) if user_orig != user.name or team_id != team_orig respond "*ChatGPT*: Session #{session_name} (#{user_orig}) copied to #{new_session_name}.\nNow you can call `^chatGPT #{new_session_name}` to use it." else respond "*ChatGPT*: Session #{session_name} copied to #{new_session_name}.\nNow you can call `^chatGPT #{new_session_name}` to use it." end end end |
#open_ai_chat_delete_session(session_name) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_delete_session.rb', line 6 def open_ai_chat_delete_session(session_name) save_stats(__method__) user = Thread.current[:user].dup team_id_user = Thread.current[:team_id_user] @active_chat_gpt_sessions[team_id_user] ||= {} #todo: add confirmation message @open_ai[team_id_user] ||= {} @open_ai[team_id_user][:chat_gpt] ||= {} @open_ai[team_id_user][:chat_gpt][:sessions] ||= {} if @open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name) delete_threads = [] @active_chat_gpt_sessions[team_id_user].each do |thread_ts, sname| delete_threads << thread_ts if sname == session_name end delete_threads.each do |thread_ts| @active_chat_gpt_sessions[team_id_user].delete(thread_ts) @listening[team_id_user].delete(thread_ts) if @listening.key?(team_id_user) @open_ai[team_id_user][:chat_gpt][:sessions][session_name][:collaborators].each do |collaborator| collaborator_name = collaborator.split("_")[1..-1].join("_") @listening[collaborator_name].delete(thread_ts) if @listening.key?(collaborator_name) @chat_gpt_collaborating[collaborator].delete(thread_ts) if @chat_gpt_collaborating.key?(collaborator) end end @open_ai[team_id_user][:chat_gpt][:sessions].delete(session_name) update_openai_sessions(session_name) respond "*ChatGPT*: Session *#{session_name}* deleted." else respond "*ChatGPT*: You don't have a session with that name.\nCall `chatGPT list sessions` to see your saved sessions." end end |
#open_ai_chat_get_prompts(session_name) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_get_prompts.rb', line 6 def open_ai_chat_get_prompts(session_name) save_stats(__method__) user = Thread.current[:user].dup team_id_user = Thread.current[:team_id_user] @active_chat_gpt_sessions[team_id_user] ||= {} get_openai_sessions(session_name) if @open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name) prompts = @ai_gpt[team_id_user][session_name].join("\n") prompts.gsub!(/^Me>\s*/, "\nMe> ") prompts.gsub!(/^chatGPT>\s*/, "\nchatGPT> ") if prompts.length > 3000 respond "*ChatGPT*: Session *#{session_name}*." send_file(Thread.current[:dest], "ChatGPT prompts for #{session_name}", "prompts.txt", "prompts", "text/plain", "text", content: prompts) elsif prompts.empty? respond "*ChatGPT*: Session *#{session_name}* has no prompts." else respond "*ChatGPT*: Session *#{session_name}*." if prompts.include?("`") respond prompts else respond "```#{prompts}```" end end else respond "*ChatGPT*: You don't have a session with that name.\nCall `chatGPT list sessions` to see your saved sessions." end end |
#open_ai_chat_list_sessions(type, tag: '') ⇒ Object
type can be :own or :public or :shared
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_list_sessions.rb', line 6 def open_ai_chat_list_sessions(type, tag: '') #type can be :own or :public or :shared save_stats(__method__) user = Thread.current[:user].dup team_id = user.team_id team_id_user = Thread.current[:team_id_user] channel = Thread.current[:dest] get_openai_sessions() check_users = [] if type == :own check_users << team_id_user else check_users = @open_ai.keys end list_sessions = [] check_users.each do |team_user_name| if @open_ai.key?(team_user_name) and @open_ai[team_user_name].key?(:chat_gpt) and @open_ai[team_user_name][:chat_gpt].key?(:sessions) and @open_ai[team_user_name][:chat_gpt][:sessions].size > 0 sessions = @open_ai[team_user_name][:chat_gpt][:sessions].keys.sort sessions.delete("") sessions.each do |session_name| session = @open_ai[team_user_name][:chat_gpt][:sessions][session_name] if (type == :own and session[:user_creator] == user.name) or (type == :public and session.key?(:public) and session[:public]) or (type == :shared and session.key?(:shared) and session[:shared].include?(channel)) if tag == '' or (session.key?(:tag) and tag == session[:tag].to_s) if !session.key?(:team_creator) or session[:team_creator] == '' session[:team_creator] = config.team_id end list_sessions << "*`#{session_name}`*: " list_sessions[-1]<<"_#{session[:description]}_ " if session.key?(:description) and session[:description].to_s.strip != '' list_sessions[-1]<<"*(public)* " if session.key?(:public) and session[:public] and type != :public list_sessions[-1]<<"(shared on <##{session.shared.join(">, <#")}>) " if session.key?(:shared) and session[:shared].size > 0 and type != :shared list_sessions[-1]<<"\n *#{session.num_prompts}* prompts. " list_sessions[-1]<<" tag: >*#{session.tag}*. " if session.key?(:tag) and session[:tag].to_s != '' and tag == '' list_sessions[-1]<<"shared by: *#{session.user_creator}*. " if type != :own list_sessions[-1]<<"original creator: *#{session.copy_of_user}*. " if session.key?(:copy_of_user) and session[:copy_of_user] != '' and session[:copy_of_user] != session[:user_creator] list_sessions[-1]<<"model: #{session.model}. " if session.key?(:model) and session[:model] != '' list_sessions[-1]<<"copies: #{session..size}. " if session.key?(:users_copying) and session[:users_copying].size > 0 list_sessions[-1]<<"users: #{session..uniq.size}. " if session.key?(:users_copying) and session[:users_copying].size > 0 list_sessions[-1]<<"collaborators: *#{session.collaborators.join(", ").gsub("#{team_id}_","")}*. " unless !session.key?(:collaborators) or session.collaborators.empty? list_sessions[-1]<<"last prompt: #{session.last_activity.gsub("-", "/")[0..15]}. " if type == :own end end end end end if list_sessions.size > 0 list_sessions[-1] << "\n\n:information_source: To start using a session: `chatgpt use USER_SHARED SESSION_NAME`" if type != :own if type == :own respond "*ChatGPT*: Your#{" >*#{tag}*" if tag!=''} sessions:\n\n#{list_sessions.join("\n\n")}" elsif type == :public respond "*ChatGPT*: Public#{" >*#{tag}*" if tag!=''} sessions:\n\n#{list_sessions.join("\n\n")}" elsif type == :shared respond "*ChatGPT*: Shared#{" >*#{tag}*" if tag!=''} sessions on <##{channel}>:\n\n#{list_sessions.join("\n\n")}" end else if type == :own respond "*ChatGPT*: You don't have any#{" >*#{tag}*" if tag!=''} sessions." else respond "*ChatGPT*: There are no#{" >*#{tag}*" if tag!=''} #{type} sessions." end end end |
#open_ai_chat_share_session(type, session_name, channel_id) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_share_session.rb', line 6 def open_ai_chat_share_session(type, session_name, channel_id) save_stats(__method__) user = Thread.current[:user].dup team_id_user = Thread.current[:team_id_user] @open_ai[team_id_user] ||= {} @open_ai[team_id_user][:chat_gpt] ||= {} @open_ai[team_id_user][:chat_gpt][:sessions] ||= {} if @open_ai[team_id_user][:chat_gpt][:sessions].key?(session_name) if type == :share if channel_id == "" @open_ai[team_id_user][:chat_gpt][:sessions][session_name].public = true else @open_ai[team_id_user][:chat_gpt][:sessions][session_name].shared ||= [] @open_ai[team_id_user][:chat_gpt][:sessions][session_name].shared << channel_id end elsif type == :stop if channel_id == "" @open_ai[team_id_user][:chat_gpt][:sessions][session_name].public = false else @open_ai[team_id_user][:chat_gpt][:sessions][session_name].shared.delete(channel_id) end end update_openai_sessions() if type == :share if channel_id == "" respond "*ChatGPT*: Session *#{session_name}* is now public." else respond "*ChatGPT*: Session *#{session_name}* is now shared on <##{channel_id}>." end elsif type == :stop if channel_id == "" respond "*ChatGPT*: Session *#{session_name}* is no longer public." else respond "*ChatGPT*: Session *#{session_name}* is no longer shared on <##{channel_id}>." end end else respond "*ChatGPT*: You don't have a session with that name.\nCall `chatGPT list sessions` to see your saved sessions." end end |
#open_ai_chat_use_model(model, dont_save_stats: false) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_chat_use_model.rb', line 6 def open_ai_chat_use_model(model, dont_save_stats: false) save_stats(__method__) unless dont_save_stats open_ai_models('', just_models: true) if @open_ai_models.empty? model_selected = @open_ai_models.select{|m| m==model} model_selected = @open_ai_models.select{|m| m.include?(model)} if model_selected.empty? if model_selected.size == 1 model = model_selected[0] user = Thread.current[:user].dup team_id_user = Thread.current[:team_id_user] user_name = user.name if @chat_gpt_collaborating.key?(team_id_user) and @chat_gpt_collaborating[team_id_user].key?(Thread.current[:thread_ts]) user_creator = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:user_creator] team_creator = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:team_creator] team_id_user_creator = team_creator + "_" + user_creator session_name = @chat_gpt_collaborating[team_id_user][Thread.current[:thread_ts]][:session_name] else user_creator = user.name team_creator = user.team_id team_id_user_creator = team_creator + "_" + user_creator @active_chat_gpt_sessions[team_id_user_creator] ||= {} if @active_chat_gpt_sessions[team_id_user_creator].key?(Thread.current[:thread_ts]) session_name = @active_chat_gpt_sessions[team_id_user_creator][Thread.current[:thread_ts]] elsif @active_chat_gpt_sessions[team_id_user_creator].key?(Thread.current[:dest]) session_name = @active_chat_gpt_sessions[team_id_user_creator][Thread.current[:dest]] else session_name = '' end end if @open_ai.key?(team_id_user_creator) and @open_ai[team_id_user_creator].key?(:chat_gpt) and @open_ai[team_id_user_creator][:chat_gpt].key?(:sessions) and @open_ai[team_id_user_creator][:chat_gpt][:sessions].key?(session_name) @open_ai[team_id_user_creator][:chat_gpt][:sessions][session_name][:model] = model respond "Model for this session is now #{model}" unless dont_save_stats update_openai_sessions(session_name, team_id: team_creator, user_name: user_creator) unless session_name == '' end elsif model_selected.size > 1 respond "There are more than one model with that name. Please be more specific: #{model_selected.join(', ')}" else respond "There is no model with that name." end end |
#open_ai_edit_image(message, files) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_edit_image.rb', line 6 def open_ai_edit_image(, files) save_stats(__method__) get_personal_settings() @ai_open_ai, = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, service: :dall_e) respond if user = Thread.current[:user].dup team_id = user.team_id team_id_user = Thread.current[:team_id_user] if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:dall_e][:client].nil? @ai_open_ai_image ||= {} @ai_open_ai_image[team_id_user] ||= [] react :art begin @ai_open_ai_image[team_id_user] = [] if !files.nil? and files.size == 1 if files.nil? or files.size != 1 respond "*OpenAI*: Sorry, I need an image to edit. Please upload an image and try again." else require "nice_http" image = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png" http = NiceHttp.new(host: "https://files.slack.com", headers: { "Authorization" => "Bearer #{config.token}" }) res = http.get(files[0].url_private_download, save_data: image) success, res = SlackSmartBot::AI::OpenAI.send_image_edit(@ai_open_ai[team_id_user][:dall_e].client, image, , size: @ai_open_ai[team_id_user][:dall_e][:image_size]) if success urls = res urls = [urls] if urls.is_a?(String) if urls.nil? or urls.empty? respond "*OpenAI*: Sorry, I'm having some problems. OpenAI was not able to generate an image." else if @ai_open_ai_image[team_id_user].empty? session_name = "Edit" else session_name = @ai_open_ai_image[team_id_user].first[0..29] end = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[team_id_user].object_id})" = "Edit" require "uri" urls.each do |url| uri = URI.parse(url) require "nice_http" http = NiceHttp.new(host: "https://#{uri.host}") file_path_name = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png" res = http.get(uri.path + "?#{uri.query}", save_data: file_path_name) send_file(Thread.current[:dest], , file_path_name, , "image/png", "png") http.close unless http.nil? end end else respond res end end rescue => exception respond "*OpenAI*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later." @logger.warn exception end unreact :art end end |
#open_ai_generate_image(message, delete_history = false, repeat: false) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_generate_image.rb', line 6 def open_ai_generate_image(, delete_history = false, repeat: false) save_stats(__method__) get_personal_settings() @ai_open_ai, = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, reconnect: delete_history, service: :dall_e) respond if user = Thread.current[:user].dup team_id = user.team_id team_id_user = Thread.current[:team_id_user] if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:dall_e][:client].nil? @ai_open_ai_image ||= {} @ai_open_ai_image[team_id_user] ||= [] react :art begin @ai_open_ai_image[team_id_user] = [] if delete_history if delete_history and == "" respond "*OpenAI*: Let's start a new image generation. Use `?i PROMPT` to generate an image." elsif repeat and @ai_open_ai_image[team_id_user].empty? and == "" respond "*OpenAI*: Sorry, I need to generate an image first. Use `?i PROMPT` to generate an image." else @ai_open_ai_image[team_id_user] << unless repeat success, res = SlackSmartBot::AI::OpenAI.send_image_generation(@ai_open_ai[team_id_user][:dall_e][:client], @ai_open_ai_image[team_id_user].join("\n"), @ai_open_ai[team_id_user][:dall_e][:image_size]) if success urls = res urls = [urls] if urls.is_a?(String) urls.delete({}) if urls.nil? or urls.empty? respond "*OpenAI*: Sorry, I'm having some problems. OpenAI was not able to generate an image." else session_name = @ai_open_ai_image[team_id_user].first[0..29] = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[team_id_user].object_id})" = "Repeat" if repeat require "uri" urls.each do |url| uri = URI.parse(url) require "nice_http" http = NiceHttp.new(host: "https://#{uri.host}") Dir.mkdir("#{config.path}/tmp") unless Dir.exist?("#{config.path}/tmp") file_path_name = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png" res = http.get(uri.path + "?#{uri.query}", save_data: file_path_name) if config.simulate respond "file: #{file_path_name}, #{}, #{}, image/png, png" else send_file(Thread.current[:dest], , file_path_name, , "image/png", "png") end http.close unless http.nil? end end else respond res end end rescue => exception respond "*OpenAI*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later." @logger.warn exception end unreact :art end end |
#open_ai_models(model = '', just_models: false) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_models.rb', line 6 def open_ai_models(model='', just_models: false) save_stats(__method__) unless just_models get_personal_settings() @ai_open_ai, = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, service: :models) respond if user = Thread.current[:user].dup team_id = user.team_id team_id_user = Thread.current[:team_id_user] if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:models][:client].nil? react :running unless just_models begin res = SlackSmartBot::AI::OpenAI.models(@ai_open_ai[team_id_user][:models][:client], @ai_open_ai[team_id_user][:models], model) if model == '' or model == 'chatgpt' unless just_models = ["*OpenAI*"] << "To start a chatGPT session using a specific model: `^chatgpt SESSION_NAME MODEL_NAME`" << "For example: `^chatgpt data_analysis gpt-35-turbo-0301`" << "If you want to use a model by default, you can use on a DM with the SmartBot the command" << "`set personal settings ai.open_ai.chat_gpt.model MODEL_NAME`" << "`set personal settings ai.open_ai.whisper.model MODEL_NAME`" if model == '' << "Here are the #{"#{model} " if model!=''}models available for use:" << "```#{res.strip}```" respond .join("\n") end @open_ai_models = res.split("\n") if model == '' else if just_models return res else respond "*OpenAI* Info about #{model} model:\n```#{res.strip}```" end end rescue => exception @logger.warn "Error in open_ai_models: #{exception}" respond "*OpenAI*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later." end unreact :running unless just_models end end |
#open_ai_variations_image(message, variations, files) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_variations_image.rb', line 6 def open_ai_variations_image(, variations, files) save_stats(__method__) get_personal_settings() @ai_open_ai, = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, service: :dall_e) respond if user = Thread.current[:user].dup team_id = user.team_id team_id_user = Thread.current[:team_id_user] if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:dall_e][:client].nil? if variations > 9 respond "*OpenAI*: I'm sorry, I can only generate up to 9 variations at a time. Please try again." else variations = 1 if variations == 0 @ai_open_ai_image ||= {} @ai_open_ai_image[team_id_user] ||= [] react :art begin @ai_open_ai_image[team_id_user] = [] if !files.nil? and files.size == 1 if (!File.exist?("#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png") and (files.nil? or files.size != 1)) respond "*OpenAI*: Sorry, I need to generate an image first. Use `?i PROMPT` to generate an image or upload an image to generate variations." else image = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png" if !files.nil? and files.size == 1 require "nice_http" http = NiceHttp.new(host: "https://files.slack.com", headers: { "Authorization" => "Bearer #{config.token}" }) res = http.get(files[0].url_private_download, save_data: image) success, res = SlackSmartBot::AI::OpenAI.send_image_variation(@ai_open_ai[team_id_user][:dall_e].client, image, variations, size: @ai_open_ai[team_id_user][:dall_e][:image_size]) else success, res = SlackSmartBot::AI::OpenAI.send_image_variation(@ai_open_ai[team_id_user][:dall_e].client, image, variations, size: @ai_open_ai[team_id_user][:dall_e][:image_size]) end if success urls = res urls = [urls] if urls.is_a?(String) if urls.nil? or urls.empty? respond "*OpenAI*: Sorry, I'm having some problems. OpenAI was not able to generate an image." else if @ai_open_ai_image[team_id_user].empty? session_name = "Temporary Variation" else session_name = @ai_open_ai_image[team_id_user].first[0..29] end = "OpenAI Session: _<#{session_name}...>_ (id:#{@ai_open_ai_image[team_id_user].object_id})" require "uri" urls.each do |url| uri = URI.parse(url) require "nice_http" http = NiceHttp.new(host: "https://#{uri.host}") file_path_name = "#{config.path}/tmp/#{team_id_user}_#{@ai_open_ai_image[team_id_user].object_id}.png" res = http.get(uri.path + "?#{uri.query}", save_data: file_path_name) = "Variation #{urls.index(url)+1} of #{urls.size}" if config.simulate respond "file: #{file_path_name}, #{}, #{}, image/png, png" else send_file(Thread.current[:dest], , file_path_name, , "image/png", "png") end http.close unless http.nil? end end else respond res end end rescue => exception respond "*OpenAI*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later." @logger.warn exception end unreact :art end end if variations > 9 respond "*OpenAI*: I'm sorry, I can only generate up to 9 variations at a time. Please try again." else end end |
#open_ai_whisper(message, files) ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/slack/smart-bot/commands/general/ai/open_ai/open_ai_whisper.rb', line 6 def open_ai_whisper(, files) save_stats(__method__) get_personal_settings() @ai_open_ai, = SlackSmartBot::AI::OpenAI.connect(@ai_open_ai, config, @personal_settings, service: :whisper) respond if user = Thread.current[:user].dup team_id = user.team_id team_id_user = Thread.current[:team_id_user] if !@ai_open_ai[team_id_user].nil? and !@ai_open_ai[team_id_user][:whisper][:client].nil? react :speech_balloon begin if files.nil? or files.size != 1 respond "*OpenAI Whisper*: Sorry, I need an audio file to transcribe. Please upload an audio file and try again." else require "nice_http" audio = "#{config.path}/tmp/#{team_id_user}_audio.wav" http = NiceHttp.new(host: "https://files.slack.com", headers: { "Authorization" => "Bearer #{config.token}" }) #todo: in case using a channel with external people from other organizations files are treated differently. We need to take in consideration that #https://api.slack.com/types/file#slack_connect_files #This is for all files in all commands res = http.get(files[0].url_private_download, save_data: audio) success, res = SlackSmartBot::AI::OpenAI.whisper_transcribe(@ai_open_ai[team_id_user][:whisper][:client], @ai_open_ai[team_id_user].whisper.model, audio) if success if .to_s != '' success, res = SlackSmartBot::AI::OpenAI.send_gpt_chat(@ai_open_ai[team_id_user][:whisper][:client], @ai_open_ai[team_id_user].chat_gpt.model, "#{}:\n#{res}", @ai_open_ai[team_id_user].chat_gpt) type_whisper = else type_whisper = "Transcribe" end if res.size > 3000 send_file(Thread.current[:dest], "*OpenAI Whisper*", '', type_whisper, "text/plain", "text", content: res) else respond "*OpenAI Whisper* \n#{res.strip}" end else respond "*OpenAI Whisper* \n#{res.strip}" end File.delete(audio) if File.exist?(audio) end rescue => exception respond "*OpenAI Whisper*: Sorry, I'm having some problems. OpenAI probably is not available. Please try again later." @logger.warn exception end unreact :speech_balloon end end |