One query moving through BenchGen Router Lite: the frozen backbone embeds it, the head picks one pool member (here open_mid), and only that model's real reply comes back. No text is ever generated by the head itself.
1. Build the dataset
A router has nothing to learn from until you can prove that different models are actually better at different things. That proof is a reward matrix: for every task, how well each candidate model actually scored on it, measured rather than assumed. BenchGen Router Lite trains on two paired datasets published from a single pilot collection run.task_id. Training the router head means loading both datasets and matching rows
on that field before anything gets embedded.
The reward dataset
Every model was reached through OpenRouter, so the pool could mix closed-style and open-weight models behind one API and one billing account, and every candidate went through the same pre-flight check before being trusted with real collection: 20 live calls against a trivial prompt, checking that the model returned a valid completion, respected themax_tokens cap instead of silently truncating, reported usable token counts, and kept its
empty-response rate under 5%.
The five models that passed pre-flight split into two roles inside the pool:
rlpr, was collected but excluded
from the public release, since its answers are free-form prose and tables and the string-match
grader used here scores genuinely correct RLPR answers as wrong. A label that cannot be trusted is
worse than no label, so those 14 tasks were dropped before publishing.
That leaves 46 tasks x 5 agents x 3 repetitions = 690 graded calls, published as the
rewards dataset for a
total collection cost of $0.0826 across the full pilot, with zero call errors. A reward row
looks like this:
mean_reward[i] is agent agent_order[i]’s accuracy over 3 attempts. Ties are kept explicit in
best_agents rather than collapsed to a single winner, because on easy questions several agents
are genuinely equal, and pretending otherwise teaches a router a coin flip.
The task dataset
The task pool is a normalized set of prompts drawn from eight public benchmark sources, balanced across domains and split with a fixed seed so results are reproducible.Domain
Math: 370 (33.3%)
Reasoning: 370 (33.3%)
Difficulty
Hard: 427 (38.5%)
Easy: 179 (16.1%)
Split
Test: 245 (22.1%)
Validation: 217 (19.5%)
What the pilot shows before any router gets trained
Every dataset ships with baseline numbers, because a routing dataset that only reports the winner’s score invites the exact mistake this project exists to avoid: training a router on a pool where one model already wins everywhere.frontier_a. That is the bar the trained
router is measured against in Benchmark below.
2. Train the router head
BenchGen Router Lite does not fine-tune a model, and it does not train a LoRA adapter on top of one. What gets trained is a router head: a small classifier, a few thousand parameters, that sits on top of a frozen backbone and learns which pool member to send each query to. The backbone never updates. Only the head does.(task, agent) reward is already in
the dataset, so a full training run makes zero API calls and costs nothing beyond the embedding
pass.
1. Start a new training run and pick Head
In the Train tab, click + New Training, then pick Head on the training method toggle (“Learn from past agent scores”). Point Base Model at the frozen backbone (this run usedQwen/Qwen3-1.7B) and Dataset at the rewards dataset, benchgen/router-pilot.

The New Training form with Head selected, Qwen/Qwen3-1.7B as the base model, and router-pilot as the dataset
2. Fill in the head-specific fields
Add the Tasks dataset,benchgen/router-pilot-tasks, so prompts can be joined and embedded.
Set Held-out split value to test, the split the dataset’s own reported baselines use, and
leave Head hidden dimension at 0 for a pure linear head. This run used the defaults for the
rest: sigma0 0.5, 60 generations, automatic population size, and seed 42, with the CUDA
embedding device.

The Head-specific fields: tasks dataset, held-out split value, head hidden dimension, and the sep-CMA-ES hyperparameters (sigma0, generations, population, seed)
3. Submit and watch it train
Click Start Training. The logs confirm exactly what is loading before anything else happens:
Training logs right after submit: the rewards dataset, the tasks dataset, and the five-agent pool all loading before embedding starts
4. CMA-ES evolves the head
The backbone embeds each prompt once, splits into 35 train rows and 11 test rows, and then a 10,245-parameter head is evolved against the training rows:
Training Progress at 100% alongside the raw logs: 35 train rows, 11 test rows, a 10,245-parameter head, and the best training reward climbing across generations
best_reward_so_far number is the head’s fit to the 35 training rows as CMA-ES optimizes, not a
held-out score. What the trained head actually generalizes to is what
Benchmark below measures.
5. Register the head
A completed job’s Use In Benchmarks panel offers Register as Model. Click it, and the head becomes selectable anywhere BenchGen lets you pick a model, carrying a Head badge and a stable name (head-Qwen3-1.7B-e99b449fde for this run) so it is never confused with a regular fine-tuned
model. There is no merge or export step, since a router head has no adapter weights to fold into a
base model.

The completed job, registered and ready: head-Qwen3-1.7B-e99b449fde, selectable anywhere BenchGen lets you pick a model
3. Benchmark
A router head’s own output is a routing decision, not an answer. Running it through a benchmark scores the router and its pool together, not the head in isolation, since every response a user sees comes from whichever pool member the head picked. BenchGen Router Lite was evaluated against TR Benchmark (TR, Karma Zorluk), an existing BenchGen environment picked deliberately because it is nothing like the training data: 70 Turkish multiple-choice questions, 50 easy and medium general-knowledge questions plus 20 genuinely hard ones (multi-step math, logic, obscure facts), each with four options and a single correct letter. Scoring is deterministic exact-match on the letter, with no LLM-as-judge involved, and because the model under test is a router, the results table also records which pool member answered each question.
The TR Benchmark (TR, Karma Zorluk) overview: 70 Turkish multiple-choice questions, deterministic scoring, with a sample question shown
Running the evaluation
From the benchmark’s Evaluate tab, the registered head shows up under Platform Models alongside every other trained model, carrying its Head badge. Selecting it auto-fills the sampling parameters (temperature 0.7, max tokens 150, top P 1.0, 30 second timeout) from the model, and Run Evaluation starts the same round trip described above: each question gets embedded, the head picks a pool member, and that pool member answers for real.
Selecting benchgen-router-lite under Platform Models, with sampling parameters auto-filled from the registered head

The evaluation running live, streaming through the 70 questions one step at a time
Watching the questions arrive at the pool
Because the router never generates text itself, every question it routes turns into a real API call to the selected pool member. Those calls show up in the OpenRouter dashboard as the run proceeds, which is the clearest way to confirm the routing is genuinely happening rather than being simulated. The generations log lists each call with the model that received it, the provider that served it, token counts, and cost. The three pool members that were reachable during this run appear here by name:gpt-oss-120b, DeepSeek V4 Flash 0731, and Ling-3.0-flash.

The OpenRouter generations log during the benchmark run, one row per routed question with model, provider, tokens, and cost

One routed question as the pool member received it: the benchmark prompt, its options, and the single-letter answer instruction
benchgen-router-lite, along with the
routing and generation timings and the prompt and completion token counts for that single question.

Generation details for one routed call, issued by the benchgen-router-lite key, with routing timings and token counts
Results
Overall score: 72.9% (51 of 70 correct, 1 empty response), broken down by difficulty:open_mid (mistralai/mistral-nemo). The one remaining question came back with no routing
decision recorded at all, which is also the run’s single empty response.

The completed run: 72.9% overall, with the per-question table showing which pool member answered each question and whether it was correct
Explore it on BenchGen
The dataset and the trained head both live on the BenchGen platform, where you can inspect their details, schema, and files. Each page also links onward to the underlying repository if you want to download the raw artifacts.Router rewards dataset
task_id.BenchGen Router Lite
head-Qwen3-1.7B-e99b449fde head: a 10,245-parameter weight vector, its manifest,
and a reference implementation of the embed and pick step.