| 
									
										
										
										
											2023-05-05 15:28:31 -03:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module DiscourseAi | 
					
						
							|  |  |  |   module AiBot | 
					
						
							|  |  |  |     class EntryPoint | 
					
						
							| 
									
										
										
										
											2023-08-24 07:20:24 +10:00
										 |  |  |       REQUIRE_TITLE_UPDATE = "discourse-ai-title-update" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-11 10:03:03 -03:00
										 |  |  |       GPT4_ID = -110
 | 
					
						
							|  |  |  |       GPT3_5_TURBO_ID = -111
 | 
					
						
							| 
									
										
										
										
											2023-07-27 11:24:44 +10:00
										 |  |  |       CLAUDE_V2_ID = -112
 | 
					
						
							|  |  |  |       BOTS = [[GPT4_ID, "gpt4_bot"], [GPT3_5_TURBO_ID, "gpt3.5_bot"], [CLAUDE_V2_ID, "claude_bot"]] | 
					
						
							| 
									
										
										
										
											2023-05-05 15:28:31 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-16 14:38:21 -03:00
										 |  |  |       def self.map_bot_model_to_user_id(model_name) | 
					
						
							|  |  |  |         case model_name | 
					
						
							|  |  |  |         in "gpt-3.5-turbo" | 
					
						
							|  |  |  |           GPT3_5_TURBO_ID | 
					
						
							|  |  |  |         in "gpt-4" | 
					
						
							|  |  |  |           GPT4_ID | 
					
						
							| 
									
										
										
										
											2023-07-27 11:24:44 +10:00
										 |  |  |         in "claude-2" | 
					
						
							|  |  |  |           CLAUDE_V2_ID | 
					
						
							| 
									
										
										
										
											2023-05-16 14:38:21 -03:00
										 |  |  |         else | 
					
						
							|  |  |  |           nil | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-05 15:28:31 -03:00
										 |  |  |       def load_files | 
					
						
							|  |  |  |         require_relative "jobs/regular/create_ai_reply" | 
					
						
							| 
									
										
										
										
											2023-05-16 14:38:21 -03:00
										 |  |  |         require_relative "jobs/regular/update_ai_bot_pm_title" | 
					
						
							| 
									
										
										
										
											2023-05-11 10:03:03 -03:00
										 |  |  |         require_relative "bot" | 
					
						
							|  |  |  |         require_relative "anthropic_bot" | 
					
						
							|  |  |  |         require_relative "open_ai_bot" | 
					
						
							| 
									
										
										
										
											2023-05-20 17:45:54 +10:00
										 |  |  |         require_relative "commands/command" | 
					
						
							|  |  |  |         require_relative "commands/search_command" | 
					
						
							|  |  |  |         require_relative "commands/categories_command" | 
					
						
							|  |  |  |         require_relative "commands/tags_command" | 
					
						
							|  |  |  |         require_relative "commands/time_command" | 
					
						
							|  |  |  |         require_relative "commands/summarize_command" | 
					
						
							|  |  |  |         require_relative "commands/image_command" | 
					
						
							|  |  |  |         require_relative "commands/google_command" | 
					
						
							| 
									
										
										
										
											2023-08-09 07:19:56 +10:00
										 |  |  |         require_relative "commands/read_command" | 
					
						
							| 
									
										
										
										
											2023-08-29 10:43:58 +10:00
										 |  |  |         require_relative "commands/setting_context_command" | 
					
						
							| 
									
										
										
										
											2023-09-01 11:48:51 +10:00
										 |  |  |         require_relative "commands/search_settings_command" | 
					
						
							| 
									
										
										
										
											2023-08-30 16:15:03 +10:00
										 |  |  |         require_relative "commands/db_schema_command" | 
					
						
							|  |  |  |         require_relative "personas/persona" | 
					
						
							|  |  |  |         require_relative "personas/artist" | 
					
						
							|  |  |  |         require_relative "personas/general" | 
					
						
							|  |  |  |         require_relative "personas/sql_helper" | 
					
						
							| 
									
										
										
										
											2023-08-31 17:02:03 +10:00
										 |  |  |         require_relative "personas/settings_explorer" | 
					
						
							| 
									
										
										
										
											2023-09-04 12:05:27 +10:00
										 |  |  |         require_relative "personas/researcher" | 
					
						
							| 
									
										
										
										
											2023-09-27 01:48:38 +01:00
										 |  |  |         require_relative "personas/creative" | 
					
						
							| 
									
										
										
										
											2023-05-05 15:28:31 -03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def inject_into(plugin) | 
					
						
							|  |  |  |         plugin.register_seedfu_fixtures( | 
					
						
							|  |  |  |           Rails.root.join("plugins", "discourse-ai", "db", "fixtures", "ai_bot"), | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-30 16:15:03 +10:00
										 |  |  |         plugin.add_to_serializer( | 
					
						
							|  |  |  |           :current_user, | 
					
						
							|  |  |  |           :ai_enabled_personas, | 
					
						
							|  |  |  |           include_condition: -> do | 
					
						
							|  |  |  |             SiteSetting.ai_bot_enabled && scope.authenticated? && | 
					
						
							|  |  |  |               scope.user.in_any_groups?(SiteSetting.ai_bot_allowed_groups_map) | 
					
						
							|  |  |  |           end, | 
					
						
							|  |  |  |         ) do | 
					
						
							|  |  |  |           Personas.all.map { |persona| { name: persona.name, description: persona.description } } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-17 06:29:58 +10:00
										 |  |  |         plugin.add_to_serializer( | 
					
						
							|  |  |  |           :current_user, | 
					
						
							|  |  |  |           :ai_enabled_chat_bots, | 
					
						
							|  |  |  |           include_condition: -> do | 
					
						
							|  |  |  |             SiteSetting.ai_bot_enabled && scope.authenticated? && | 
					
						
							|  |  |  |               scope.user.in_any_groups?(SiteSetting.ai_bot_allowed_groups_map) | 
					
						
							|  |  |  |           end, | 
					
						
							|  |  |  |         ) do | 
					
						
							|  |  |  |           model_map = {} | 
					
						
							|  |  |  |           SiteSetting | 
					
						
							|  |  |  |             .ai_bot_enabled_chat_bots | 
					
						
							|  |  |  |             .split("|") | 
					
						
							|  |  |  |             .each do |bot_name| | 
					
						
							|  |  |  |               model_map[ | 
					
						
							|  |  |  |                 ::DiscourseAi::AiBot::EntryPoint.map_bot_model_to_user_id(bot_name) | 
					
						
							|  |  |  |               ] = bot_name | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # not 100% ideal, cause it is one extra query, but we need it | 
					
						
							|  |  |  |           bots = DB.query_hash(<<~SQL, user_ids: model_map.keys) | 
					
						
							|  |  |  |             SELECT username, id FROM users WHERE id IN (:user_ids) | 
					
						
							|  |  |  |           SQL | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           bots.each { |hash| hash["model_name"] = model_map[hash["id"]] } | 
					
						
							|  |  |  |           bots | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-16 14:38:21 -03:00
										 |  |  |         plugin.register_svg_icon("robot") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-30 16:15:03 +10:00
										 |  |  |         plugin.add_to_serializer( | 
					
						
							|  |  |  |           :topic_view, | 
					
						
							|  |  |  |           :ai_persona_name, | 
					
						
							|  |  |  |           include_condition: -> { SiteSetting.ai_bot_enabled && object.topic.private_message? }, | 
					
						
							|  |  |  |         ) { topic.custom_fields["ai_persona"] } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-05 15:28:31 -03:00
										 |  |  |         plugin.on(:post_created) do |post| | 
					
						
							| 
									
										
										
										
											2023-05-11 10:03:03 -03:00
										 |  |  |           bot_ids = BOTS.map(&:first) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-20 17:45:54 +10:00
										 |  |  |           if post.post_type == Post.types[:regular] && post.topic.private_message? && | 
					
						
							|  |  |  |                !bot_ids.include?(post.user_id) | 
					
						
							| 
									
										
										
										
											2023-05-11 10:03:03 -03:00
										 |  |  |             if (SiteSetting.ai_bot_allowed_groups_map & post.user.group_ids).present? | 
					
						
							|  |  |  |               bot_id = post.topic.topic_allowed_users.where(user_id: bot_ids).first&.user_id | 
					
						
							| 
									
										
										
										
											2023-05-05 15:28:31 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-16 14:38:21 -03:00
										 |  |  |               if bot_id | 
					
						
							| 
									
										
										
										
											2023-08-24 07:20:24 +10:00
										 |  |  |                 if post.post_number == 1
 | 
					
						
							|  |  |  |                   post.topic.custom_fields[REQUIRE_TITLE_UPDATE] = true | 
					
						
							|  |  |  |                   post.topic.save_custom_fields | 
					
						
							|  |  |  |                 end | 
					
						
							| 
									
										
										
										
											2023-05-16 14:38:21 -03:00
										 |  |  |                 Jobs.enqueue(:create_ai_reply, post_id: post.id, bot_user_id: bot_id) | 
					
						
							|  |  |  |                 Jobs.enqueue_in( | 
					
						
							|  |  |  |                   5.minutes, | 
					
						
							|  |  |  |                   :update_ai_bot_pm_title, | 
					
						
							|  |  |  |                   post_id: post.id, | 
					
						
							|  |  |  |                   bot_user_id: bot_id, | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |               end | 
					
						
							| 
									
										
										
										
											2023-05-11 10:03:03 -03:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2023-05-05 15:28:31 -03:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |