discourse-ai/lib/modules/summarization/strategies/fold_content.rb

65 lines
1.7 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)
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