Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 8 additions & 14 deletions lib/summarization/entry_point.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,14 @@ def inject_into(plugin)
scope.can_see_summary?(object.topic)
end

# plugin.register_modifier(:topic_query_create_list_topics) do |topics, options|
# if Discourse.filters.include?(options[:filter]) && SiteSetting.ai_summarization_enabled &&
# SiteSetting.ai_summarize_max_hot_topics_gists_per_batch > 0
# topics
# .includes(:ai_summaries)
# .where(
# "ai_summaries.id IS NULL OR ai_summaries.summary_type = ?",
# AiSummary.summary_types[:gist],
# )
# .references(:ai_summaries)
# else
# topics
# end
# end
plugin.register_modifier(:topic_query_create_list_topics) do |topics, options|
if Discourse.filters.include?(options[:filter]) && SiteSetting.ai_summarization_enabled &&
SiteSetting.ai_summarize_max_hot_topics_gists_per_batch > 0
topics.includes(:ai_summaries)
else
topics
end
end

plugin.add_to_serializer(
:topic_list_item,
Expand Down
40 changes: 33 additions & 7 deletions spec/lib/modules/summarization/entry_point_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,37 @@
before do
assign_fake_provider_to(:ai_summarization_model)
SiteSetting.ai_summarization_enabled = true
SiteSetting.ai_summarize_max_hot_topics_gists_per_batch = 100
end

fab!(:user)

describe "#inject_into" do
describe "hot topics gist summarization" do
fab!(:topic_ai_gist)
fab!(:regular_summary) { Fabricate(:ai_summary, target: topic_ai_gist.target) }

before { TopicHotScore.create!(topic_id: topic_ai_gist.target_id, score: 1.0) }

let(:topic_query) { TopicQuery.new(user) }

describe "topic_query_create_list_topics modifier" do
context "when hot topic summarization is enabled" do
before { SiteSetting.ai_summarize_max_hot_topics_gists_per_batch = 100 }
it "doesn't duplicate records when there more than one summary type" do
Fabricate(:ai_summary, target: topic_ai_gist.target)

skip "preloads only gist summaries" do
gist_topic = topic_query.list_hot.topics.find { |t| t.id == topic_ai_gist.target_id }
expect(topic_query.list_hot.topics.map(&:id)).to contain_exactly(
topic_ai_gist.target_id,
)
end

expect(gist_topic.ai_summaries.size).to eq(1)
expect(gist_topic.ai_summaries.first).to eq(topic_ai_gist)
it "doesn't exclude records when the topic has a single different summary" do
regular_summary_2 = Fabricate(:ai_summary)
TopicHotScore.create!(topic_id: regular_summary_2.target_id, score: 1.0)

expect(topic_query.list_hot.topics.map(&:id)).to contain_exactly(
regular_summary_2.target_id,
topic_ai_gist.target_id,
)
end

it "doesn't filter out hot topics without summaries" do
Expand Down Expand Up @@ -118,11 +127,28 @@
gist_topic,
scope: Guardian.new(admin),
root: false,
filter: :hot,
filter: :unread,
).as_json

expect(serialized[:ai_topic_gist]).to be_present
end

it "doesn't include the summary if it's not a gist" do
regular_summary_2 = Fabricate(:ai_summary)
TopicHotScore.create!(topic_id: regular_summary_2.target_id, score: 1.0)

hot_topic = topic_query.list_hot.topics.find { |t| t.id == regular_summary_2.target_id }

serialized =
TopicListItemSerializer.new(
hot_topic,
scope: Guardian.new(user),
root: false,
filter: :hot,
).as_json

expect(serialized[:ai_topic_gist]).to be_nil
end
end
end
end
Expand Down