mirror of
				https://github.com/discourse/discourse-ai.git
				synced 2025-11-04 08:28:46 +00:00 
			
		
		
		
	Single and multi-chunk summaries end using different prompts for the last summary. This change detects when the summarized content fits in a single chunk and uses a slightly different prompt, which leads to more consistent summary formats. This PR also moves the chunk-splitting step to the `FoldContent` strategy as preparation for implementing streamed summaries.
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module DiscourseAi
 | 
						|
  module Summarization
 | 
						|
    module Models
 | 
						|
      class Discourse < Base
 | 
						|
        def display_name
 | 
						|
          "Discourse AI's #{model}"
 | 
						|
        end
 | 
						|
 | 
						|
        def correctly_configured?
 | 
						|
          SiteSetting.ai_summarization_discourse_service_api_endpoint.present? &&
 | 
						|
            SiteSetting.ai_summarization_discourse_service_api_key.present?
 | 
						|
        end
 | 
						|
 | 
						|
        def configuration_hint
 | 
						|
          I18n.t(
 | 
						|
            "discourse_ai.summarization.configuration_hint",
 | 
						|
            count: 2,
 | 
						|
            settings:
 | 
						|
              "ai_summarization_discourse_service_api_endpoint, ai_summarization_discourse_service_api_key",
 | 
						|
          )
 | 
						|
        end
 | 
						|
 | 
						|
        def concatenate_summaries(summaries)
 | 
						|
          completion(summaries.join("\n"))
 | 
						|
        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, available_tokens)
 | 
						|
 | 
						|
          completion(truncated_content)
 | 
						|
        end
 | 
						|
 | 
						|
        def summarize_single(chunk_text, _opts)
 | 
						|
          completion(chunk_text)
 | 
						|
        end
 | 
						|
 | 
						|
        private
 | 
						|
 | 
						|
        def summarize_chunk(chunk_text, _opts)
 | 
						|
          completion(chunk_text)
 | 
						|
        end
 | 
						|
 | 
						|
        def reserved_tokens
 | 
						|
          0
 | 
						|
        end
 | 
						|
 | 
						|
        def completion(prompt)
 | 
						|
          ::DiscourseAi::Inference::DiscourseClassifier.perform!(
 | 
						|
            "#{SiteSetting.ai_summarization_discourse_service_api_endpoint}/api/v1/classify",
 | 
						|
            model,
 | 
						|
            prompt,
 | 
						|
            SiteSetting.ai_summarization_discourse_service_api_key,
 | 
						|
          ).dig(:summary_text)
 | 
						|
        end
 | 
						|
 | 
						|
        def tokenizer
 | 
						|
          DiscourseAi::Tokenizer::BertTokenizer
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |