Class: Agent::SessionContext::EvidencePacket

Inherits:
Object
  • Object
show all
Defined in:
lib/agent/session_context/evidence_packet.rb

Defined Under Namespace

Classes: Result

Constant Summary collapse

MAX_BYTES =
65_536
TRUNCATABLE_KEYS =
{
  message: ["text"].freeze,
  tool_use: %w[input name].freeze,
  observed: ["label"].freeze
}.freeze
UNSAFE_SOURCE_REF_TEXT_PATTERN =
/(?:\p{Space}|\p{Cntrl})/

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.safe_ref_text(source_ref) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/agent/session_context/evidence_packet.rb', line 36

def safe_ref_text(source_ref)
  text = source_ref.to_s
  normalized_text = normalize_ref_text(text, source_ref)

  if normalized_text.match?(UNSAFE_SOURCE_REF_TEXT_PATTERN)
    raise ArgumentError,
          "Source ref text cannot contain whitespace or control characters (#{source_ref_type(source_ref)})"
  end

  normalized_text
end

Instance Method Details

#call(transcript:, observed:) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/agent/session_context/evidence_packet.rb', line 79

def call(transcript:, observed:)
  warnings = []
  carried_refs = []
  seen_refs = {}
  lines = []

  transcript.entries.each do |entry|
    entry.parts.each do |part|
      line = serialize_transcript_part(entry.role, part, warnings)
      next unless line

      remember_ref(seen_refs, carried_refs, part.source_ref)
      lines << line
    end
  end

  observed_lines(observed).each do |source_ref, payload|
    line = bounded_serialized_line(source_ref, payload, TRUNCATABLE_KEYS.fetch(:observed), warnings)
    remember_ref(seen_refs, carried_refs, source_ref)
    lines << line
  end

  Result.new(
    chunks: chunk_lines(lines).freeze,
    warnings: warnings.map { |warning| String.new(warning).freeze }.freeze,
    source_refs: carried_refs.freeze
  )
end