bahnator-1.1-pro-preview
LoRA adapters for LiquidAI/d1-3B that check an agent's decision card for known traps before a person sees it: a stale GPS fix, a replaced instruction, a wrong escalation. They read text and photos.
Built for Controlane, a control room for car delivery, at the Prompt Operations Hackathon (24 to 25 Oct 2026). Live at https://controlane.bobs.build.
Results
On 4,395 synthetic test cases from 203 template families held out of training completely:
| Checker | Catch rate | False alarms | Time per check |
|---|---|---|---|
| bahnator (this model) | 92% | 5% | 22 ms |
| Jev (typesafe/jev-1.14) | 92% | 13% | 229 ms |
| Laya v6, fine-tuned | 86% | 8% | 10 ms |
| d1-3B, as released | 67% | 33% | 23 ms |
93.5% correct overall. 32 of 34 on the hand-labelled set, 216 of 220 on photos and scans.
Training
- LoRA rank 16, alpha 32, on
q_proj k_proj v_proj out_proj in_proj w1 w2 w3; 24.5 M trainable parameters - 3 epochs, AdamW, learning rate 2e-4
- Synthetic train split only; no test case was used
- 24 minutes on one RTX 6000 Ada on Verda (Finland), about $1.33
- Best of 7 training runs across 2 models
Use
d1-lora-v1.pt holds rank, alpha, targets and the A/B weights per layer. train_d1.py has add_lora and merge_lora:
import torch
from transformers import AutoModel
from train_d1 import add_lora, merge_lora
model = AutoModel.from_pretrained("LiquidAI/d1-3B", trust_remote_code=True, dtype=torch.bfloat16).to("cuda")
saved = torch.load("d1-lora-v1.pt")
lm = model.model.language_model
for name, lora in add_lora(lm, saved["rank"], saved["alpha"]).items():
lora.A.data.copy_(saved["weights"][name]["A"])
lora.B.data.copy_(saved["weights"][name]["B"])
merge_lora(lm)
model.eval()
model.system_one(state, questions, images=images)
All training data is synthetic and fictional.
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support