diff --git a/app/controllers/discourse_ai/admin/rag_document_fragments_controller.rb b/app/controllers/discourse_ai/admin/rag_document_fragments_controller.rb index fecc2c01..732a28fb 100644 --- a/app/controllers/discourse_ai/admin/rag_document_fragments_controller.rb +++ b/app/controllers/discourse_ai/admin/rag_document_fragments_controller.rb @@ -20,7 +20,7 @@ module DiscourseAi def upload_file file = params[:file] || params[:files].first - if !SiteSetting.ai_embeddings_enabled? + if !DiscourseAi::Embeddings.enabled? raise Discourse::InvalidAccess.new("Embeddings not enabled") end diff --git a/app/jobs/regular/generate_embeddings.rb b/app/jobs/regular/generate_embeddings.rb index 6cc71fed..ab3ea167 100644 --- a/app/jobs/regular/generate_embeddings.rb +++ b/app/jobs/regular/generate_embeddings.rb @@ -5,7 +5,7 @@ module Jobs sidekiq_options queue: "low" def execute(args) - return unless SiteSetting.ai_embeddings_enabled + return unless DiscourseAi::Embeddings.enabled? return if args[:target_type].blank? || args[:target_id].blank? target = args[:target_type].constantize.find_by_id(args[:target_id]) return if target.nil? || target.deleted_at.present? diff --git a/app/jobs/scheduled/embeddings_backfill.rb b/app/jobs/scheduled/embeddings_backfill.rb index 4fdbe5bd..23bc46b9 100644 --- a/app/jobs/scheduled/embeddings_backfill.rb +++ b/app/jobs/scheduled/embeddings_backfill.rb @@ -7,7 +7,7 @@ module Jobs cluster_concurrency 1 def execute(args) - return unless SiteSetting.ai_embeddings_enabled + return unless DiscourseAi::Embeddings.enabled? limit = SiteSetting.ai_embeddings_backfill_batch_size diff --git a/app/models/rag_document_fragment.rb b/app/models/rag_document_fragment.rb index c1cd7d9d..b546b164 100644 --- a/app/models/rag_document_fragment.rb +++ b/app/models/rag_document_fragment.rb @@ -11,7 +11,7 @@ class RagDocumentFragment < ActiveRecord::Base def link_target_and_uploads(target, upload_ids) return if target.blank? return if upload_ids.blank? - return if !SiteSetting.ai_embeddings_enabled? + return if !DiscourseAi::Embeddings.enabled? UploadReference.ensure_exist!(upload_ids: upload_ids, target: target) @@ -27,7 +27,7 @@ class RagDocumentFragment < ActiveRecord::Base def update_target_uploads(target, upload_ids) return if target.blank? - return if !SiteSetting.ai_embeddings_enabled? + return if !DiscourseAi::Embeddings.enabled? if upload_ids.blank? RagDocumentFragment.where(target: target).destroy_all diff --git a/lib/ai_bot/entry_point.rb b/lib/ai_bot/entry_point.rb index 77a802fe..134422d2 100644 --- a/lib/ai_bot/entry_point.rb +++ b/lib/ai_bot/entry_point.rb @@ -196,7 +196,7 @@ module DiscourseAi ) plugin.on(:site_setting_changed) do |name, old_value, new_value| - if name == :ai_embeddings_selected_model && SiteSetting.ai_embeddings_enabled? && + if name == :ai_embeddings_selected_model && DiscourseAi::Embeddings.enabled? && new_value != old_value RagDocumentFragment.delete_all UploadReference diff --git a/lib/ai_bot/personas/persona.rb b/lib/ai_bot/personas/persona.rb index 7fe1b9ac..58b05e26 100644 --- a/lib/ai_bot/personas/persona.rb +++ b/lib/ai_bot/personas/persona.rb @@ -295,7 +295,7 @@ module DiscourseAi upload_refs = UploadReference.where(target_id: id, target_type: "AiPersona").pluck(:upload_id) - return nil if !SiteSetting.ai_embeddings_enabled? + return nil if !DiscourseAi::Embeddings.enabled? return nil if conversation_context.blank? || upload_refs.blank? latest_interactions = diff --git a/lib/ai_helper/semantic_categorizer.rb b/lib/ai_helper/semantic_categorizer.rb index 842e49c3..a0be3dcb 100644 --- a/lib/ai_helper/semantic_categorizer.rb +++ b/lib/ai_helper/semantic_categorizer.rb @@ -9,7 +9,7 @@ module DiscourseAi def categories return [] if @text.blank? - return [] unless SiteSetting.ai_embeddings_enabled + return [] if !DiscourseAi::Embeddings.enabled? candidates = nearest_neighbors(limit: 100) return [] if candidates.empty? @@ -51,7 +51,7 @@ module DiscourseAi def tags return [] if @text.blank? - return [] unless SiteSetting.ai_embeddings_enabled + return [] if !DiscourseAi::Embeddings.enabled? candidates = nearest_neighbors(limit: 100) return [] if candidates.empty? diff --git a/lib/configuration/embedding_defs_validator.rb b/lib/configuration/embedding_defs_validator.rb index 9e962d7d..6662da33 100644 --- a/lib/configuration/embedding_defs_validator.rb +++ b/lib/configuration/embedding_defs_validator.rb @@ -8,20 +8,11 @@ module DiscourseAi end def valid_value?(val) - if val.blank? - @module_enabled = SiteSetting.ai_embeddings_enabled - - !@module_enabled - else - EmbeddingDefinition.exists?(id: val).tap { |def_exists| @invalid_option = !def_exists } - end + val.present? || !SiteSetting.ai_embeddings_enabled end def error_message - return I18n.t("discourse_ai.embeddings.configuration.disable_embeddings") if @module_enabled - return I18n.t("discourse_ai.embeddings.configuration.invalid_config") if @invalid_option - - "" + I18n.t("discourse_ai.embeddings.configuration.disable_embeddings") end end end diff --git a/lib/embeddings.rb b/lib/embeddings.rb new file mode 100644 index 00000000..6c066935 --- /dev/null +++ b/lib/embeddings.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +module DiscourseAi + module Embeddings + def self.enabled? + SiteSetting.ai_embeddings_enabled && SiteSetting.ai_embeddings_selected_model.present? && + EmbeddingDefinition.exists?(id: SiteSetting.ai_embeddings_selected_model) + end + end +end diff --git a/lib/embeddings/entry_point.rb b/lib/embeddings/entry_point.rb index 66047af2..632ce81f 100644 --- a/lib/embeddings/entry_point.rb +++ b/lib/embeddings/entry_point.rb @@ -56,7 +56,7 @@ module DiscourseAi # embeddings generation. callback = Proc.new do |target| - if SiteSetting.ai_embeddings_enabled && + if DiscourseAi::Embeddings.enabled? && (target.is_a?(Topic) || SiteSetting.ai_embeddings_per_post_enabled) Jobs.enqueue( :generate_embeddings, diff --git a/spec/lib/modules/embeddings/entry_point_spec.rb b/spec/lib/modules/embeddings/entry_point_spec.rb index de1e3024..e7ce7257 100644 --- a/spec/lib/modules/embeddings/entry_point_spec.rb +++ b/spec/lib/modules/embeddings/entry_point_spec.rb @@ -3,6 +3,10 @@ describe DiscourseAi::Embeddings::EntryPoint do fab!(:user) { Fabricate(:user, refresh_auto_groups: true) } + fab!(:embedding_definition) + + before { SiteSetting.ai_embeddings_selected_model = embedding_definition.id } + describe "registering event callbacks" do context "when creating a topic" do let(:creator) do diff --git a/spec/models/rag_document_fragment_spec.rb b/spec/models/rag_document_fragment_spec.rb index 31a43cbc..58824c47 100644 --- a/spec/models/rag_document_fragment_spec.rb +++ b/spec/models/rag_document_fragment_spec.rb @@ -6,7 +6,10 @@ RSpec.describe RagDocumentFragment do fab!(:upload_2) { Fabricate(:upload) } fab!(:vector_def) { Fabricate(:embedding_definition) } - before { SiteSetting.ai_embeddings_enabled = true } + before do + SiteSetting.ai_embeddings_selected_model = vector_def.id + SiteSetting.ai_embeddings_enabled = true + end describe ".link_uploads_and_persona" do it "does nothing if there is no persona" do diff --git a/spec/requests/admin/ai_personas_controller_spec.rb b/spec/requests/admin/ai_personas_controller_spec.rb index 4edceb27..cf991eae 100644 --- a/spec/requests/admin/ai_personas_controller_spec.rb +++ b/spec/requests/admin/ai_personas_controller_spec.rb @@ -3,10 +3,11 @@ RSpec.describe DiscourseAi::Admin::AiPersonasController do fab!(:admin) fab!(:ai_persona) + fab!(:embedding_definition) before do sign_in(admin) - + SiteSetting.ai_embeddings_selected_model = embedding_definition.id SiteSetting.ai_embeddings_enabled = true end