# frozen_string_literal: true module DiscourseAi module Summarization module Strategies class TruncateContent < ::Summarization::Base def initialize(completion_model) @completion_model = completion_model end attr_reader :completion_model delegate :correctly_configured?, :display_name, :configuration_hint, :model, to: :completion_model def summarize(content, _user, &on_partial_blk) opts = content.except(:contents) { summary: summarize_with_truncation(content[:contents], opts, &on_partial_blk), chunks: [], } end private def format_content_item(item) "(#{item[:id]} #{item[:poster]} said: #{item[:text]} " end def summarize_with_truncation(contents, opts) text_to_summarize = contents.map { |c| format_content_item(c) }.join truncated_content = ::DiscourseAi::Tokenizer::BertTokenizer.truncate( text_to_summarize, completion_model.available_tokens, ) completion(truncated_content) end def completion(prompt) ::DiscourseAi::Inference::DiscourseClassifier.perform!( "#{endpoint}/api/v1/classify", completion_model.model, prompt, SiteSetting.ai_summarization_discourse_service_api_key, ).dig(:summary_text) end def endpoint if SiteSetting.ai_summarization_discourse_service_api_endpoint_srv.present? service = DiscourseAi::Utils::DnsSrv.lookup( SiteSetting.ai_summarization_discourse_service_api_endpoint_srv, ) "https://#{service.target}:#{service.port}" else SiteSetting.ai_summarization_discourse_service_api_endpoint end end end end end end