Class: SwarmSDK::ContextCompactor::Metrics

Inherits:
Object
  • Object
show all
Defined in:
lib/swarm_sdk/context_compactor/metrics.rb

Overview

Metrics tracks compression statistics

Provides detailed information about the compression operation:

  • Message counts (before/after)
  • Token counts (before/after)
  • Compression ratio
  • Time taken
  • Summary of changes

Usage

metrics = agent.compact_context
puts metrics.summary
puts "Compressed from #{metrics.original_tokens} to #{metrics.compressed_tokens} tokens"
puts "Compression ratio: #{(metrics.compression_ratio * 100).round(1)}%"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(original_messages:, compressed_messages:, time_taken:) ⇒ Metrics

Initialize metrics from compression operation

Parameters:

  • original_messages (Array<RubyLLM::Message>)

    Messages before compression

  • compressed_messages (Array<RubyLLM::Message>)

    Messages after compression

  • time_taken (Float)

    Time taken in seconds



29
30
31
32
33
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 29

def initialize(original_messages:, compressed_messages:, time_taken:)
  @original_messages = original_messages
  @compressed_messages = compressed_messages
  @time_taken = time_taken
end

Instance Attribute Details

#compressed_messagesObject (readonly)

Returns the value of attribute compressed_messages.



22
23
24
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 22

def compressed_messages
  @compressed_messages
end

#original_messagesObject (readonly)

Returns the value of attribute original_messages.



22
23
24
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 22

def original_messages
  @original_messages
end

#time_takenObject (readonly)

Returns the value of attribute time_taken.



22
23
24
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 22

def time_taken
  @time_taken
end

Instance Method Details

#compressed_message_countInteger

Number of messages after compression

Returns:

  • (Integer)

    Compressed message count



45
46
47
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 45

def compressed_message_count
  @compressed_messages.size
end

#compressed_tokensInteger

Estimated tokens after compression

Returns:

  • (Integer)

    Compressed token count



75
76
77
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 75

def compressed_tokens
  @compressed_tokens ||= TokenCounter.estimate_messages(@compressed_messages)
end

#compression_factorFloat

Compression factor (original / compressed)

e.g., 5.0 means compressed to 1/5th of original size

Returns:

  • (Float)

    Compression factor



100
101
102
103
104
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 100

def compression_factor
  return 0.0 if compressed_tokens.zero?

  original_tokens.to_f / compressed_tokens
end

#compression_percentageFloat

Compression percentage

Returns:

  • (Float)

    Percentage of original size (0-100)



109
110
111
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 109

def compression_percentage
  (compression_ratio * 100).round(2)
end

#compression_ratioFloat

Compression ratio (compressed / original)

Returns:

  • (Float)

    Ratio between 0.0 and 1.0



89
90
91
92
93
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 89

def compression_ratio
  return 0.0 if original_tokens.zero?

  compressed_tokens.to_f / original_tokens
end

#messages_removedInteger

Number of messages removed

Returns:

  • (Integer)

    Messages removed



52
53
54
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 52

def messages_removed
  original_message_count - compressed_message_count
end

#messages_summarizedInteger

Number of checkpoint summary messages created

Returns:

  • (Integer)

    Checkpoint messages



59
60
61
62
63
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 59

def messages_summarized
  @compressed_messages.count do |msg|
    msg.role == :system && msg.content.to_s.include?("CONVERSATION CHECKPOINT")
  end
end

#original_message_countInteger

Number of messages before compression

Returns:

  • (Integer)

    Original message count



38
39
40
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 38

def original_message_count
  @original_messages.size
end

#original_tokensInteger

Estimated tokens before compression

Returns:

  • (Integer)

    Original token count



68
69
70
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 68

def original_tokens
  @original_tokens ||= TokenCounter.estimate_messages(@original_messages)
end

#summaryString

Generate a human-readable summary

Returns:

  • (String)

    Summary text



116
117
118
119
120
121
122
123
124
125
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 116

def summary
  <<~SUMMARY
    Context Compression Results:
    - Messages: #{original_message_count}#{compressed_message_count} (-#{messages_removed})
    - Estimated tokens: #{original_tokens}#{compressed_tokens} (-#{tokens_removed})
    - Compression ratio: #{compression_factor.round(1)}:1 (#{compression_percentage}%)
    - Checkpoints created: #{messages_summarized}
    - Time taken: #{time_taken.round(3)}s
  SUMMARY
end

#to_hHash

Convert metrics to hash for logging

Returns:

  • (Hash)

    Metrics as hash



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 130

def to_h
  {
    original_message_count: original_message_count,
    compressed_message_count: compressed_message_count,
    messages_removed: messages_removed,
    messages_summarized: messages_summarized,
    original_tokens: original_tokens,
    compressed_tokens: compressed_tokens,
    tokens_removed: tokens_removed,
    compression_ratio: compression_ratio.round(4),
    compression_factor: compression_factor.round(2),
    compression_percentage: compression_percentage,
    time_taken: time_taken.round(3),
  }
end

#tokens_removedInteger

Number of tokens removed

Returns:

  • (Integer)

    Tokens removed



82
83
84
# File 'lib/swarm_sdk/context_compactor/metrics.rb', line 82

def tokens_removed
  original_tokens - compressed_tokens
end