Skip to content
Kward Search API index

Class: Kward::Compaction::TokenEstimator

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

Overview

Estimates transcript token usage from messages and provider usage metadata.

Instance Method Summary collapse

Instance Method Details

#context_tokens(messages) ⇒ Object



19
20
21
22
23
24
25
26
27
# File 'lib/kward/compaction/token_estimator.rb', line 19

def context_tokens(messages)
  messages = Array(messages)
  usage_info = last_assistant_usage_info(messages)
  return messages_tokens(messages) unless usage_info

  usage_tokens = usage_tokens(usage_info[:usage])
  trailing_tokens = messages[(usage_info[:index] + 1)..].to_a.sum { |message| message_tokens(message) }
  usage_tokens + trailing_tokens
end

#estimate_tokens(text) ⇒ Object



11
12
13
# File 'lib/kward/compaction/token_estimator.rb', line 11

def estimate_tokens(text)
  (text.to_s.length / 4.0).ceil
end

#message_tokens(message) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/kward/compaction/token_estimator.rb', line 29

def message_tokens(message)
  role = value(message, :role)
  parts = [role]
  if role.to_s == "compactionSummary"
    parts << value(message, :summary)
  else
    parts << content_text(value(message, :content))
  end
  parts << value(message, :reasoning_summary)
  tool_calls(message).each do |tool_call|
    parts << tool_call_name(tool_call)
    parts << tool_call_arguments(tool_call)
  end
  parts << value(message, :tool_call_id)
  parts << value(message, :name)
  estimate_tokens(parts.compact.join("\n"))
end

#messages_tokens(messages) ⇒ Object



15
16
17
# File 'lib/kward/compaction/token_estimator.rb', line 15

def messages_tokens(messages)
  Array(messages).sum { |message| message_tokens(message) }
end