mirror of
https://github.com/discourse/discourse-ai.git
synced 2025-03-09 02:40:50 +00:00
When navigating between topic we were not correctly resetting internal state for summarization. This leads to a situation where incorrect summaries can be displayed to users and wrong summaries can be displayed. Additionally our controller for grabbing summaries was always streaming results via message bus, which could be delayed when sidekiq is overloaded. We now will return the cached summary right away if it is available direct from REST endpoint.
51 lines
1.4 KiB
Ruby
51 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Jobs
|
|
class StreamTopicAiSummary < ::Jobs::Base
|
|
sidekiq_options retry: false
|
|
|
|
def execute(args)
|
|
return unless topic = Topic.find_by(id: args[:topic_id])
|
|
return unless user = User.find_by(id: args[:user_id])
|
|
|
|
strategy = DiscourseAi::Summarization.default_strategy
|
|
return if strategy.nil? || !Guardian.new(user).can_see_summary?(topic)
|
|
|
|
guardian = Guardian.new(user)
|
|
return unless guardian.can_see?(topic)
|
|
|
|
skip_age_check = !!args[:skip_age_check]
|
|
|
|
streamed_summary = +""
|
|
start = Time.now
|
|
|
|
summary =
|
|
DiscourseAi::TopicSummarization
|
|
.new(strategy, topic, user)
|
|
.summarize(skip_age_check: skip_age_check) do |partial_summary|
|
|
streamed_summary << partial_summary
|
|
|
|
# Throttle updates.
|
|
if (Time.now - start > 0.5) || Rails.env.test?
|
|
payload = { done: false, ai_topic_summary: { summarized_text: streamed_summary } }
|
|
|
|
publish_update(topic, user, payload)
|
|
start = Time.now
|
|
end
|
|
end
|
|
|
|
publish_update(
|
|
topic,
|
|
user,
|
|
AiTopicSummarySerializer.new(summary, { scope: guardian }).as_json.merge(done: true),
|
|
)
|
|
end
|
|
|
|
private
|
|
|
|
def publish_update(topic, user, payload)
|
|
MessageBus.publish("/discourse-ai/summaries/topic/#{topic.id}", payload, user_ids: [user.id])
|
|
end
|
|
end
|
|
end
|