DEV: port directory structure to Zeitwerk (#319)
Previous to this change we relied on explicit loading for a files in Discourse AI. This had a few downsides: - Busywork whenever you add a file (an extra require relative) - We were not keeping to conventions internally ... some places were OpenAI others are OpenAi - Autoloader did not work which lead to lots of full application broken reloads when developing. This moves all of DiscourseAI into a Zeitwerk compatible structure. It also leaves some minimal amount of manual loading (automation - which is loading into an existing namespace that may or may not be there) To avoid needing /lib/discourse_ai/... we mount a namespace thus we are able to keep /lib pointed at ::DiscourseAi Various files were renamed to get around zeitwerk rules and minimize usage of custom inflections Though we can get custom inflections to work it is not worth it, will require a Discourse core patch which means we create a hard dependency.
This commit is contained in:
+1
-1
@@ -11,7 +11,7 @@ module Jobs
|
||||
|
||||
return if post.uploads.none? { |u| FileHelper.is_supported_image?(u.url) }
|
||||
|
||||
DiscourseAi::PostClassificator.new(DiscourseAi::NSFW::NSFWClassification.new).classify!(post)
|
||||
DiscourseAi::PostClassificator.new(DiscourseAi::Nsfw::Classification.new).classify!(post)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -53,6 +53,8 @@ en:
|
||||
ai_helper_allowed_in_pm: "Enable the composer's AI helper in PMs."
|
||||
ai_helper_model: "Model to use for the AI helper."
|
||||
ai_helper_custom_prompts_allowed_groups: "Users on these groups will see the custom prompt option in the AI helper."
|
||||
ai_helper_automatic_chat_thread_title_delay: "Delay in minutes before the AI helper automatically sets the chat thread title."
|
||||
ai_helper_automatic_chat_thread_title: "Automatically set the chat thread titles based on thread contents."
|
||||
|
||||
ai_embeddings_enabled: "Enable the embeddings module."
|
||||
ai_embeddings_discourse_service_api_endpoint: "URL where the API is running for the embeddings module"
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# frozen_string_literal: true
|
||||
module DiscourseAi
|
||||
module AiBot
|
||||
module Commands
|
||||
class Parameter
|
||||
attr_reader :item_type, :name, :description, :type, :enum, :required
|
||||
def initialize(name:, description:, type:, enum: nil, required: false, item_type: nil)
|
||||
@name = name
|
||||
@description = description
|
||||
@type = type
|
||||
@enum = enum
|
||||
@required = required
|
||||
@item_type = item_type
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -27,36 +27,6 @@ module DiscourseAi
|
||||
end
|
||||
end
|
||||
|
||||
def load_files
|
||||
require_relative "jobs/regular/create_ai_reply"
|
||||
require_relative "jobs/regular/update_ai_bot_pm_title"
|
||||
require_relative "bot"
|
||||
require_relative "anthropic_bot"
|
||||
require_relative "open_ai_bot"
|
||||
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"
|
||||
require_relative "commands/read_command"
|
||||
require_relative "commands/setting_context_command"
|
||||
require_relative "commands/search_settings_command"
|
||||
require_relative "commands/db_schema_command"
|
||||
require_relative "commands/dall_e_command"
|
||||
require_relative "personas/persona"
|
||||
require_relative "personas/artist"
|
||||
require_relative "personas/general"
|
||||
require_relative "personas/sql_helper"
|
||||
require_relative "personas/settings_explorer"
|
||||
require_relative "personas/researcher"
|
||||
require_relative "personas/creative"
|
||||
require_relative "personas/dall_e_3"
|
||||
require_relative "site_settings_extension"
|
||||
end
|
||||
|
||||
def inject_into(plugin)
|
||||
plugin.on(:site_setting_changed) do |name, _old_value, _new_value|
|
||||
if name == :ai_bot_enabled_chat_bots || name == :ai_bot_enabled
|
||||
@@ -76,7 +46,7 @@ module DiscourseAi
|
||||
scope.user.in_any_groups?(SiteSetting.ai_bot_allowed_groups_map)
|
||||
end,
|
||||
) do
|
||||
Personas
|
||||
DiscourseAi::AiBot::Personas
|
||||
.all(user: scope.user)
|
||||
.map do |persona|
|
||||
{ id: persona.id, name: persona.name, description: persona.description }
|
||||
@@ -135,8 +105,8 @@ module DiscourseAi
|
||||
post.topic.custom_fields[REQUIRE_TITLE_UPDATE] = true
|
||||
post.topic.save_custom_fields
|
||||
end
|
||||
Jobs.enqueue(:create_ai_reply, post_id: post.id, bot_user_id: bot_id)
|
||||
Jobs.enqueue_in(
|
||||
::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,
|
||||
@@ -0,0 +1,46 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module DiscourseAi
|
||||
module AiBot
|
||||
module Personas
|
||||
def self.system_personas
|
||||
@system_personas ||= {
|
||||
Personas::General => -1,
|
||||
Personas::SqlHelper => -2,
|
||||
Personas::Artist => -3,
|
||||
Personas::SettingsExplorer => -4,
|
||||
Personas::Researcher => -5,
|
||||
Personas::Creative => -6,
|
||||
Personas::DallE3 => -7,
|
||||
}
|
||||
end
|
||||
|
||||
def self.system_personas_by_id
|
||||
@system_personas_by_id ||= system_personas.invert
|
||||
end
|
||||
|
||||
def self.all(user:)
|
||||
# this needs to be dynamic cause site settings may change
|
||||
all_available_commands = Persona.all_available_commands
|
||||
|
||||
AiPersona.all_personas.filter do |persona|
|
||||
next false if !user.in_any_groups?(persona.allowed_group_ids)
|
||||
|
||||
if persona.system
|
||||
instance = persona.new
|
||||
(
|
||||
instance.required_commands == [] ||
|
||||
(instance.required_commands - all_available_commands).empty?
|
||||
)
|
||||
else
|
||||
true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.find_by(id: nil, name: nil, user:)
|
||||
all(user: user).find { |persona| persona.id == id || persona.name == name }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user