Class: Legion::CLI::Chat::Tools::BudgetStatus

Inherits:
Tools::Base
  • Object
show all
Defined in:
lib/legion/cli/chat/tools/budget_status.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

.append_model_breakdown(lines, by_model) ⇒ Object



67
68
69
70
71
72
73
74
75
# File 'lib/legion/cli/chat/tools/budget_status.rb', line 67

def self.append_model_breakdown(lines, by_model)
  return unless by_model&.any?

  lines << "\n  By Model:"
  by_model.each do |model, data|
    lines << format('    %<model>-30s $%<cost>.6f (%<reqs>d requests)',
                    model: model, cost: data[:cost_usd], reqs: data[:requests])
  end
end

.budget_guard_available?Boolean

Returns:

  • (Boolean)


89
90
91
# File 'lib/legion/cli/chat/tools/budget_status.rb', line 89

def self.budget_guard_available?
  defined?(Legion::LLM::Hooks::BudgetGuard)
end

.budget_guard_statusObject



77
78
79
80
81
# File 'lib/legion/cli/chat/tools/budget_status.rb', line 77

def self.budget_guard_status
  return { enforcing: false, budget_usd: 0.0, ratio: 0.0 } unless budget_guard_available?

  Legion::LLM::Hooks::BudgetGuard.status
end

.call(action: 'status') ⇒ Object



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

def self.call(action: 'status')
  return 'Legion::LLM not available.' unless llm_available?

  case action.to_s
  when 'summary' then format_summary
  else format_status
  end
rescue StandardError => e
  Legion::Logging.warn("BudgetStatus#execute failed: #{e.message}") if defined?(Legion::Logging)
  "Error checking budget: #{e.message}"
end

.cost_summaryObject



83
84
85
86
87
# File 'lib/legion/cli/chat/tools/budget_status.rb', line 83

def self.cost_summary
  return empty_summary unless cost_tracker_available?

  Legion::LLM::CostTracker.summary
end

.cost_tracker_available?Boolean

Returns:

  • (Boolean)


93
94
95
# File 'lib/legion/cli/chat/tools/budget_status.rb', line 93

def self.cost_tracker_available?
  defined?(Legion::LLM::CostTracker)
end

.empty_summaryObject



101
102
103
# File 'lib/legion/cli/chat/tools/budget_status.rb', line 101

def self.empty_summary
  { total_cost_usd: 0.0, total_requests: 0, total_input_tokens: 0, total_output_tokens: 0, by_model: {} }
end

.format_statusObject



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

def self.format_status
  guard = budget_guard_status
  tracker = cost_summary
  lines = ["Session Budget Status:\n"]
  lines << format('  Enforcing:  %<val>s', val: guard[:enforcing] ? 'YES' : 'no')
  lines << format('  Budget:     $%<val>.4f', val: guard[:budget_usd]) if guard[:enforcing]
  lines << format('  Spent:      $%<val>.6f', val: tracker[:total_cost_usd])
  lines << format('  Remaining:  $%<val>.4f', val: guard[:remaining_usd]) if guard[:remaining_usd]
  lines << format('  Usage:      %<val>.1f%%', val: guard[:ratio] * 100) if guard[:enforcing]
  lines << format('  Requests:   %<val>d', val: tracker[:total_requests])
  lines << format('  Tokens In:  %<val>d', val: tracker[:total_input_tokens])
  lines << format('  Tokens Out: %<val>d', val: tracker[:total_output_tokens])
  lines.join("\n")
end

.format_summaryObject



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/legion/cli/chat/tools/budget_status.rb', line 53

def self.format_summary
  tracker = cost_summary
  return 'No LLM requests recorded this session.' if tracker[:total_requests].zero?

  lines = ["Session Cost Summary:\n"]
  lines << format('  Total:    $%<cost>.6f (%<reqs>d requests)',
                  cost: tracker[:total_cost_usd], reqs: tracker[:total_requests])
  lines << format('  Tokens:   %<inp>d in / %<out>d out',
                  inp: tracker[:total_input_tokens], out: tracker[:total_output_tokens])

  append_model_breakdown(lines, tracker[:by_model])
  lines.join("\n")
end

.llm_available?Boolean

Returns:

  • (Boolean)


97
98
99
# File 'lib/legion/cli/chat/tools/budget_status.rb', line 97

def self.llm_available?
  defined?(Legion::LLM)
end