Class: Legion::LLM::Router::Ranker

Inherits:
Object
  • Object
show all
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

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?

Parameters:

Returns:

  • (RankedCandidate, nil)


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

#callObject



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