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
+