A fast, single-pass 2B System 1 for robots' physical judgment.
robo-jev reads a short text of what a robot senses and answers the questions that matter in the moment — will the glass tip if I brake now? does the person reach my path first? did the part seat? — with a probability for every answer.
This repository holds the LoRA adapter (r 32, α 64, 31 M parameters, bfloat16) for Qwen/Qwen3.5-2B at revision 15852e8. The runners load the base at that pinned revision and apply the adapter with peft. The merged model is at Steerix-org/robo-jev-2b.
| Model | Physical judgment ↑ | General reading (BoolQ + MultiNLI) ↑ |
|---|---|---|
| robo-jev v0.12 · 2B | 0.44 | 0.75 |
| TypeSafe Jev | 0.28 | 0.91 |
| Liquid d1 | 0.17 | 0.93 |
| Microsoft-Decision-1 | 0.04 | 0.92 |
| Together Tev1 4B | 0.03 | 0.90 |
| OpenAI GPT-6 Luna Decisions | −0.02 ¹ | 0.86 |
| Upstage Solar Decide | −0.15 | 0.86 |
| Qwen3.5-2B, untrained | −0.15 | 0.74 |
Physical judgment is skill against always answering 50 % (0 = a coin flip, 1 = perfect) on robo-jev's physical-judgment benchmark: 1,100 held-out situations — wordings, value ranges and combinations of phenomena the model never saw in training. The decision models were asked through the OpenRouter Decisions API. ¹ It declined about a fifth of the physical-judgment requests; its score covers the rest.
robo_jev_decide.py in this repo builds robo-jev's prompt and reads its answer; it needs only transformers and peft.
pip install torch "transformers>=5.17" peft
hf download Steerix-org/robo-jev-2b-lora robo_jev_decide.py --local-dir .
python robo_jev_decide.py --model Steerix-org/robo-jev-2b-lora --request request.json # prints the answers as JSON
from robo_jev_decide import load
model = load("Steerix-org/robo-jev-2b-lora") # GPU if available, bfloat16 — fetches Qwen/Qwen3.5-2B at revision 15852e8 and applies the adapter
state = """You are a delivery robot (wheeled base) in a busy café, carrying a tray to table 7.
- Your speed: 1.1 m/s, driving straight down the aisle between tables.
- On the tray: one tall glass of iced latte, open top, about three-quarters full (camera estimate).
- An adult customer stepped into the aisle 1.6 m ahead of you, 0.4 s ago (lidar).
- The customer is facing the counter and has not looked at you.
- Your braking: gentle 1.0 m/s^2, moderate 1.8 m/s^2, hard 3.0 m/s^2; reaction time 0.2 s; body radius 0.32 m.
- Two chairs are pushed out at the next table (not in your path). Music is playing.
- Planner recommendation: stop_moderate."""
questions = {
"action": {"type": "choice", "instructions": "What should the robot do now?", "criteria": {
"continue": "Keep going at the current speed (1.1 m/s).",
"slow_half": "Slow to about half speed (0.55 m/s) and keep going.",
"stop_gentle": "Stop with gentle braking (about 1.0 m/s^2).",
"stop_moderate": "Stop with moderate braking (about 1.8 m/s^2).",
"stop_hard": "Stop with hard braking (about 3.0 m/s^2)."}},
"contact_if_continue": {"type": "noul",
"instructions": "If the robot keeps its current speed, will it touch the customer within the next 3 seconds?"},
"spill_if_hard": {"type": "noul", "instructions": "If the robot brakes hard (3.0 m/s^2) now, will the latte spill?"},
"risk_gentle": {"type": "score",
"instructions": "How likely is it that the robot touches the customer if it stops with gentle braking?",
"criteria": ["0 = it certainly will not touch the customer", "1 = it certainly will touch the customer"]},
}
answers = model.decide(state, questions) # {"action": {"type": "choice", "choice": …, "probabilities": {…}}, …}
The answers for this example (Qwen/Qwen3.5-2B + this adapter, bfloat16, one GPU, orders="single"; rounded to three decimals here):
{
"action": {"type": "choice", "choice": "stop_moderate", "probabilities": {"continue": 0.001, "slow_half": 0.001, "stop_gentle": 0.067, "stop_moderate": 0.816, "stop_hard": 0.116}},
"contact_if_continue": {"type": "noul", "noul": 0.83},
"spill_if_hard": {"type": "noul", "noul": 0.515},
"risk_gentle": {"type": "score", "score": 0.677, "probabilities": {"0.0": 0.086, "0.1": 0.035, "0.2": 0.034, "0.3": 0.04, "0.4": 0.045, "0.5": 0.049, "0.6": 0.072, "0.7": 0.079, "0.8": 0.164, "0.9": 0.135, "1.0": 0.261}}
}
Limits: choice questions with 2–255 options (most accurate on shorter lists); 1–12 questions per request; state text ≤ 16,000 characters. With the robo-jev package: RoboJev.from_pretrained("Steerix-org/robo-jev-2b-lora").decide(state, questions).
Research preview, tuned on simulated physical judgment; less reliable outside simulation, and not a safety system. It often follows the planner's recommendation even when that recommendation is wrong.
peft needed): Steerix-org/robo-jev-2bQwen/Qwen3.5-2B