Class: Kward::Compaction::Preparation

Inherits:
Object
  • Object
show all
Defined in:
lib/kward/compactor.rb

Instance Method Summary collapse

Constructor Details

#initialize(conversation:, settings: Settings.new, estimator: TokenEstimator.new, cut_point_finder: CutPointFinder.new(estimator: estimator), file_operation_tracker: FileOperationTracker.new) ⇒ Preparation

Returns a new instance of Preparation.



435
436
437
438
439
440
441
# File 'lib/kward/compactor.rb', line 435

def initialize(conversation:, settings: Settings.new, estimator: TokenEstimator.new, cut_point_finder: CutPointFinder.new(estimator: estimator), file_operation_tracker: FileOperationTracker.new)
  @conversation = conversation
  @settings = settings
  @estimator = estimator
  @cut_point_finder = cut_point_finder
  @file_operation_tracker = file_operation_tracker
end

Instance Method Details

#callObject

Raises:



443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
# File 'lib/kward/compactor.rb', line 443

def call
  branch_entries = entry_messages(@conversation.messages)
  raise NothingToCompact, "Nothing to compact" if branch_entries.empty?
  raise AlreadyCompacted, "Already compacted" if compaction_entry?(branch_entries.last) || already_compacted?

  previous_index = latest_previous_compaction_index(branch_entries)
  previous_entry = previous_index ? branch_entries[previous_index] : nil
  boundary_start = boundary_start_index(branch_entries, previous_index, previous_entry)
  raise NothingToCompact, "Nothing to compact" if boundary_start >= branch_entries.length

  cut = @cut_point_finder.find(entries: branch_entries, start_index: boundary_start, keep_recent_tokens: @settings.keep_recent_tokens)
  raise NothingToCompact, "Nothing to compact" unless cut
  raise NothingToCompact, "Nothing to compact" if cut.messages_to_summarize.empty? && cut.turn_prefix_messages.empty?

  first_kept_index = cut.preserved_start_index || cut.first_kept_index
  first_kept_entry_id = entry_id(branch_entries[first_kept_index], first_kept_index)
  summarized_for_file_ops = cut.messages_to_summarize + cut.turn_prefix_messages
  file_ops = @file_operation_tracker.call(summarized_for_file_ops, previous_details: compaction_details(previous_entry))
  kept_messages = Array(cut.preserved_messages) + (branch_entries[cut.first_kept_index..] || [])

  PreparationResult.new(
    first_kept_entry_id: first_kept_entry_id,
    messages_to_summarize: cut.messages_to_summarize,
    kept_messages: kept_messages,
    turn_prefix_messages: cut.turn_prefix_messages,
    split_turn: cut.split_turn,
    tokens_before: @estimator.context_tokens(@conversation.messages),
    previous_summary: previous_entry ? compaction_summary(previous_entry) : nil,
    file_ops: file_ops,
    settings: @settings
  )
end