Class: Phronomy::Memory::Compression::ToolOutputPruner

Inherits:
Base
  • Object
show all
Defined in:
lib/phronomy/memory/compression/tool_output_pruner.rb

Overview

Compression strategy that truncates oversized tool-call result messages.

Large tool outputs — such as a full web-page dump or a massive JSON response — can consume a significant fraction of the context window. This compressor truncates the content of any :tool message whose character count exceeds max_chars, appending a note that the output was truncated.

Unlike Summary, this is a stateless compressor: it does not accumulate state across calls and requires no thread_id bookkeeping.

Examples:

compressor = Phronomy::Memory::Compression::ToolOutputPruner.new(max_chars: 4000)
manager = Phronomy::Memory::ConversationManager.new(
  storage: storage,
  retrieval: retrieval,
  compression: compressor
)

Constant Summary collapse

TRUNCATION_NOTE =
"\n[... output truncated ...]"

Instance Method Summary collapse

Constructor Details

#initialize(max_chars: 4000) ⇒ ToolOutputPruner

Returns a new instance of ToolOutputPruner.

Parameters:

  • max_chars (Integer) (defaults to: 4000)

    maximum character length for tool-result content



29
30
31
# File 'lib/phronomy/memory/compression/tool_output_pruner.rb', line 29

def initialize(max_chars: 4000)
  @max_chars = max_chars
end

Instance Method Details

#compress(thread_id:, messages:, seq_offset: 0) ⇒ Hash

Truncate oversized :tool messages in-place (non-destructive — returns new array). Content pruning does not produce a compaction record; :compaction is always nil.

Parameters:

  • thread_id (String)

    unused (stateless pruner)

  • messages (Array)
  • seq_offset (Integer) (defaults to: 0)

    unused

Returns:

  • (Hash)

    { messages: Array, compaction: nil }



40
41
42
43
44
45
46
47
48
49
# File 'lib/phronomy/memory/compression/tool_output_pruner.rb', line 40

def compress(thread_id:, messages:, seq_offset: 0)
  pruned = messages.map do |msg|
    next msg unless msg.role.to_sym == :tool
    next msg if msg.content.to_s.length <= @max_chars

    truncated = msg.content.to_s[0, @max_chars] + TRUNCATION_NOTE
    clone_message(msg, truncated)
  end
  {messages: pruned, compaction: nil}
end