Class: Legion::CLI::Chat::Tools::BudgetStatus
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
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_status ⇒ Object
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_summary ⇒ Object
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
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_summary ⇒ Object
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
|
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
|
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
97
98
99
|
# File 'lib/legion/cli/chat/tools/budget_status.rb', line 97
def self.llm_available?
defined?(Legion::LLM)
end
|