# 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) opts = content.except(:contents) chunks = split_into_chunks(content[:contents]) if chunks.length == 1 { summary: completion_model.summarize_single(chunks.first[:summary], opts), chunks: [] } else summaries = completion_model.summarize_in_chunks(chunks, opts) { summary: completion_model.concatenate_summaries(summaries), 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