65 lines
1.7 KiB
Ruby
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
|