Module: Legion::LLM::Hooks::BudgetGuard
- Extended by:
- Legion::Logging::Helper
- Defined in:
- lib/legion/llm/hooks/budget_guard.rb
Class Method Summary collapse
- .budget_exceeded_response(model, spent, limit) ⇒ Object
- .budget_setting ⇒ Object
- .check_budget(model) ⇒ Object
- .enforcing? ⇒ Boolean
- .install ⇒ Object
- .remaining ⇒ Object
- .session_budget ⇒ Object
- .status ⇒ Object
Class Method Details
.budget_exceeded_response(model, spent, limit) ⇒ Object
63 64 65 66 67 68 69 70 71 |
# File 'lib/legion/llm/hooks/budget_guard.rb', line 63 def budget_exceeded_response(model, spent, limit) { error: 'budget_exceeded', message: "Session budget of $#{limit} exceeded (spent: $#{spent.round(4)}). " \ "Model #{model} request blocked.", spent_usd: spent.round(6), budget_usd: limit } end |
.budget_setting ⇒ Object
73 74 75 76 77 78 79 80 81 |
# File 'lib/legion/llm/hooks/budget_guard.rb', line 73 def budget_setting return 0.0 unless defined?(Legion::Settings) settings = Legion::Settings.dig(:llm, :budget, :session_usd) settings.to_f rescue StandardError => e handle_exception(e, level: :debug) 0.0 end |
.check_budget(model) ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/legion/llm/hooks/budget_guard.rb', line 18 def check_budget(model) return nil unless enforcing? limit = session_budget spent = CostTracker.summary[:total_cost_usd] return nil if spent < limit log.warn("[LLM::BudgetGuard] blocked: spent=$#{spent.round(4)} >= limit=$#{limit}") { action: :block, response: budget_exceeded_response(model, spent, limit) } rescue StandardError => e handle_exception(e, level: :debug) nil end |
.enforcing? ⇒ Boolean
35 36 37 |
# File 'lib/legion/llm/hooks/budget_guard.rb', line 35 def enforcing? session_budget.positive? end |
.install ⇒ Object
12 13 14 15 16 |
# File 'lib/legion/llm/hooks/budget_guard.rb', line 12 def install Legion::LLM::Hooks.before_chat do |model:, **| check_budget(model) end end |
.remaining ⇒ Object
43 44 45 46 47 48 49 |
# File 'lib/legion/llm/hooks/budget_guard.rb', line 43 def remaining limit = session_budget return Float::INFINITY unless limit.positive? spent = CostTracker.summary[:total_cost_usd] [(limit - spent), 0.0].max end |
.session_budget ⇒ Object
39 40 41 |
# File 'lib/legion/llm/hooks/budget_guard.rb', line 39 def session_budget budget_setting.to_f end |
.status ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/legion/llm/hooks/budget_guard.rb', line 51 def status limit = session_budget spent = CostTracker.summary[:total_cost_usd] { enforcing: limit.positive?, budget_usd: limit, spent_usd: spent.round(6), remaining_usd: limit.positive? ? [(limit - spent), 0.0].max.round(6) : nil, ratio: limit.positive? ? (spent / limit).round(4) : 0.0 } end |