Class: Legion::LLM::Router::Ranker
- Inherits:
-
Object
- Object
- Legion::LLM::Router::Ranker
- Includes:
- Legion::Logging::Helper
- Defined in:
- lib/legion/llm/router/ranker.rb
Overview
Soft preference, integer weight/affinity, and rendezvous tie-breaking (§10).
Returns the winning RankedCandidate, or nil when no ready candidate exists.
PRIVATE — no call site outside router.rb may invoke Ranker directly.
Class Method Summary collapse
Instance Method Summary collapse
- #call ⇒ Object
-
#initialize(evaluation_set:, requirements:, settings_snapshot:) ⇒ Ranker
constructor
A new instance of Ranker.
Constructor Details
#initialize(evaluation_set:, requirements:, settings_snapshot:) ⇒ Ranker
Returns a new instance of Ranker.
55 56 57 58 59 |
# File 'lib/legion/llm/router/ranker.rb', line 55 def initialize(evaluation_set:, requirements:, settings_snapshot:) @evaluation_set = evaluation_set @requirements = requirements @settings_snapshot = settings_snapshot end |
Class Method Details
.call(evaluation_set:, requirements:, settings_snapshot:) ⇒ RankedCandidate?
49 50 51 52 53 |
# File 'lib/legion/llm/router/ranker.rb', line 49 def self.call(evaluation_set:, requirements:, settings_snapshot:) new(evaluation_set: evaluation_set, requirements: requirements, settings_snapshot: settings_snapshot).call end |
Instance Method Details
#call ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/legion/llm/router/ranker.rb', line 61 def call # Step 1 (§10): start with ready candidates only. ready = @evaluation_set.ready_candidates return nil if ready.empty? log.debug("[llm][ranker] action=rank ready_count=#{ready.size} " \ "seed=#{@requirements.routing_seed[0, 8]}...") # Step 2 (§10.1): preferred-context soft sieve. sieved = preferred_context_sieve(ready) # Steps 3–4 (§10.2 + D17): base weight, affinity, effective weight. # Step 5 (§10.3): rendezvous score. ranked = compute_ranked(sieved) # Select the winner (greatest effective_weight bucket → greatest rendezvous # score → lexicographically ascending lane_id for cryptographically # improbable score collisions). select_winner(ranked) end |