Class: Legion::CLI::Chat::Tools::SummarizeTraces

Inherits:
Tools::Base
  • Object
show all
Defined in:
lib/legion/cli/chat/tools/summarize_traces.rb

Class Method Summary collapse

Methods inherited from Tools::Base

deferred, deferred?, description, error_response, extension, handle_exception, input_schema, log, mcp_category, mcp_tier, runner, sticky, tags, text_response, tool_name, trigger_words

Class Method Details

.call(query:) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/legion/cli/chat/tools/summarize_traces.rb', line 26

def self.call(query:)
  require 'legion/trace_search'
  result = Legion::TraceSearch.summarize(query)
  return "Error: #{result[:error]}" if result[:error]

  format_summary(result)
rescue LoadError
  'Trace search unavailable (legion-llm or legion-data not loaded).'
rescue StandardError => e
  Legion::Logging.warn("SummarizeTraces#execute failed: #{e.message}") if defined?(Legion::Logging)
  "Error summarizing traces: #{e.message}"
end

.format_status_counts(counts) ⇒ Object



59
60
61
62
63
64
# File 'lib/legion/cli/chat/tools/summarize_traces.rb', line 59

def self.format_status_counts(counts)
  return nil if counts.nil? || counts.empty?

  parts = counts.map { |status, count| "#{status}: #{count}" }
  "  Status: #{parts.join(', ')}"
end

.format_summary(data) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/legion/cli/chat/tools/summarize_traces.rb', line 39

def self.format_summary(data)
  lines = ["Trace Summary (#{data[:total_records]} records):\n"]
  lines << "  Tokens: #{data[:total_tokens_in]} in / #{data[:total_tokens_out]} out"
  lines << "  Cost: $#{data[:total_cost]}"
  lines << "  Latency: avg #{data[:avg_latency_ms]}ms / max #{data[:max_latency_ms]}ms"

  lines << format_time_range(data[:time_range])
  lines << format_status_counts(data[:status_counts])
  lines << format_top('Top Extensions', data[:top_extensions], :name)
  lines << format_top('Top Workers', data[:top_workers], :id)

  lines.compact.join("\n")
end

.format_time_range(range) ⇒ Object



53
54
55
56
57
# File 'lib/legion/cli/chat/tools/summarize_traces.rb', line 53

def self.format_time_range(range)
  return nil unless range && (range[:from] || range[:to])

  "  Time range: #{range[:from] || '?'} to #{range[:to] || '?'}"
end

.format_top(title, items, key) ⇒ Object



66
67
68
69
70
71
# File 'lib/legion/cli/chat/tools/summarize_traces.rb', line 66

def self.format_top(title, items, key)
  return nil if items.nil? || items.empty?

  parts = items.map { |item| "#{item[key]} (#{item[:count]})" }
  "  #{title}: #{parts.join(', ')}"
end