Module: Engram::TurnDigest

Defined in:
lib/engram/turn_digest.rb

Overview

Produces a stable digest for a conversation turn (scope + messages). Used as an idempotency key so the same turn is not observed twice.

Class Method Summary collapse

Class Method Details

.digest(scope:, messages:) ⇒ Object



12
13
14
15
# File 'lib/engram/turn_digest.rb', line 12

def digest(scope:, messages:)
  normalized = Array(messages).map { |message| normalize(message) }
  Digest::SHA256.hexdigest(JSON.generate(scope: scope, messages: normalized))
end

.normalize(message) ⇒ Object



17
18
19
20
21
22
23
24
25
26
# File 'lib/engram/turn_digest.rb', line 17

def normalize(message)
  if message.is_a?(Hash)
    {
      role: (message[:role] || message["role"] || "user").to_s,
      content: (message[:content] || message["content"]).to_s
    }
  else
    {role: "user", content: message.to_s}
  end
end