mirror of
				https://github.com/discourse/discourse-ai.git
				synced 2025-10-30 22:18:38 +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
 |