discourse-ai/app/services/discourse_ai/topic_summarization.rb
Roman Rizzi c7acb4a6a0
REFACTOR: Support of different summarization targets/prompts. (#835)
* DEV: Add summary types

* Refactor for different summary types

* Use enum for summary types

* Update lib/summarization/strategies/topic_summary.rb

Co-authored-by: Penar Musaraj <pmusaraj@gmail.com>

* Update lib/summarization/strategies/topic_gist.rb

Co-authored-by: Penar Musaraj <pmusaraj@gmail.com>

* Update lib/summarization/strategies/chat_messages.rb

Co-authored-by: Penar Musaraj <pmusaraj@gmail.com>

* Fix chat_messages single prompt

* Small tweak to the chat summarization prompt

---------

Co-authored-by: Penar Musaraj <pmusaraj@gmail.com>
2024-10-15 13:53:26 -03:00

45 lines
1.1 KiB
Ruby

# frozen_string_literal: true
module DiscourseAi
# A cache layer on top of our topic summarization engine. Also handle permissions.
class TopicSummarization
def self.for(topic, user)
new(DiscourseAi::Summarization.topic_summary(topic), user)
end
def initialize(summarizer, user)
@summarizer = summarizer
@user = user
end
def cached_summary
summarizer.existing_summary
end
def summarize(skip_age_check: false, &on_partial_blk)
# Existing summary shouldn't be nil in this scenario because the controller checks its existence.
return if !user && !cached_summary
return cached_summary if use_cached?(skip_age_check)
summarizer.delete_cached_summaries! if cached_summary
summarizer.summarize(user, &on_partial_blk)
end
private
attr_reader :summarizer, :user
def use_cached?(skip_age_check)
can_summarize = Guardian.new(user).can_request_summary?
cached_summary &&
!(
can_summarize && cached_summary.outdated &&
(skip_age_check || cached_summary.created_at < 1.hour.ago)
)
end
end
end