mirror of
				https://github.com/discourse/discourse-ai.git
				synced 2025-11-04 00:18:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module DiscourseAi
 | 
						|
  module Summarization
 | 
						|
    module Strategies
 | 
						|
      class FoldContent < ::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, &on_partial_blk)
 | 
						|
          opts = content.except(:contents)
 | 
						|
 | 
						|
          chunks = split_into_chunks(content[:contents])
 | 
						|
 | 
						|
          if chunks.length == 1
 | 
						|
            {
 | 
						|
              summary:
 | 
						|
                completion_model.summarize_single(chunks.first[:summary], opts, &on_partial_blk),
 | 
						|
              chunks: [],
 | 
						|
            }
 | 
						|
          else
 | 
						|
            summaries = completion_model.summarize_in_chunks(chunks, opts)
 | 
						|
 | 
						|
            {
 | 
						|
              summary: completion_model.concatenate_summaries(summaries, &on_partial_blk),
 | 
						|
              chunks: summaries,
 | 
						|
            }
 | 
						|
          end
 | 
						|
        end
 | 
						|
 | 
						|
        private
 | 
						|
 | 
						|
        def split_into_chunks(contents)
 | 
						|
          section = { ids: [], summary: "" }
 | 
						|
 | 
						|
          chunks =
 | 
						|
            contents.reduce([]) do |sections, item|
 | 
						|
              new_content = completion_model.format_content_item(item)
 | 
						|
 | 
						|
              if completion_model.can_expand_tokens?(
 | 
						|
                   section[:summary],
 | 
						|
                   new_content,
 | 
						|
                   completion_model.available_tokens,
 | 
						|
                 )
 | 
						|
                section[:summary] += new_content
 | 
						|
                section[:ids] << item[:id]
 | 
						|
              else
 | 
						|
                sections << section
 | 
						|
                section = { ids: [item[:id]], summary: new_content }
 | 
						|
              end
 | 
						|
 | 
						|
              sections
 | 
						|
            end
 | 
						|
 | 
						|
          chunks << section if section[:summary].present?
 | 
						|
 | 
						|
          chunks
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |