diff --git a/app/controllers/discourse_ai/ai_helper/assistant_controller.rb b/app/controllers/discourse_ai/ai_helper/assistant_controller.rb index eea254ec..ec9863fe 100644 --- a/app/controllers/discourse_ai/ai_helper/assistant_controller.rb +++ b/app/controllers/discourse_ai/ai_helper/assistant_controller.rb @@ -101,12 +101,14 @@ module DiscourseAi raise Discourse::InvalidParameters.new(:post_id) unless post - render json: - DiscourseAi::AiHelper::TopicHelper.new(current_user).explain( - term_to_explain, - post, - ), - status: 200 + Jobs.enqueue( + :stream_post_helper, + post_id: post.id, + user_id: current_user.id, + term_to_explain: term_to_explain, + ) + + render json: { success: true }, status: 200 rescue DiscourseAi::Completions::Endpoints::Base::CompletionFailed => e render_json_error I18n.t("discourse_ai.ai_helper.errors.completion_request_failed"), status: 502 diff --git a/app/jobs/regular/stream_post_helper.rb b/app/jobs/regular/stream_post_helper.rb new file mode 100644 index 00000000..9b103d06 --- /dev/null +++ b/app/jobs/regular/stream_post_helper.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Jobs + class StreamPostHelper < ::Jobs::Base + sidekiq_options retry: false + + def execute(args) + return unless post = Post.includes(:topic).find_by(id: args[:post_id]) + return unless user = User.find_by(id: args[:user_id]) + return unless args[:term_to_explain] + + topic = post.topic + reply_to = post.reply_to_post + + guardian = Guardian.new(user) + return unless guardian.can_see?(post) + + prompt = CompletionPrompt.enabled_by_name("explain") + + input = <<~TEXT + #{args[:term_to_explain]} + #{post.raw} + #{topic.title} + #{reply_to ? "#{reply_to.raw}" : nil} + TEXT + + DiscourseAi::AiHelper::Assistant.new.stream_prompt( + prompt, + input, + user, + "/discourse-ai/ai-helper/explain/#{post.id}", + ) + end + end +end diff --git a/assets/javascripts/discourse/components/ai-helper-loading.gjs b/assets/javascripts/discourse/components/ai-helper-loading.gjs new file mode 100644 index 00000000..730be41d --- /dev/null +++ b/assets/javascripts/discourse/components/ai-helper-loading.gjs @@ -0,0 +1,19 @@ +import DButton from "discourse/components/d-button"; +import i18n from "discourse-common/helpers/i18n"; + +const AiHelperLoading = ; + +export default AiHelperLoading; diff --git a/assets/javascripts/discourse/connectors/after-d-editor/ai-helper-context-menu.hbs b/assets/javascripts/discourse/connectors/after-d-editor/ai-helper-context-menu.hbs index f61a6828..b63cad7a 100644 --- a/assets/javascripts/discourse/connectors/after-d-editor/ai-helper-context-menu.hbs +++ b/assets/javascripts/discourse/connectors/after-d-editor/ai-helper-context-menu.hbs @@ -53,18 +53,7 @@ {{else if (eq this.menuState this.CONTEXT_MENU_STATES.loading)}} -
-
- - {{i18n "discourse_ai.ai_helper.context_menu.loading"}} - - -
+ {{else if (eq this.menuState this.CONTEXT_MENU_STATES.review)}}