Teaching small Liquid models to use a browser
Three small open models, fine-tuned on a free T4 GPU, acting in real web tasks from the MiniWoB++ benchmark. Every frame is a replay of a recorded evaluation episode: the task is seeded, so applying the model's own recorded actions redraws exactly what it did. Nothing is staged. Code and evidence: GitHub.
The model sees only the screenshot and the instruction, and answers with a click position from 0 to 1000 on each axis. The red ring marks where its next click lands.
Same held-out task, side by side
Recorded evaluation episodes, replayed. Left pair: base model against the SFT adapter (greedy). Right pair: SFT against SFT then GRPO, sampled at temperature 1, where GRPO raised success from 26 to 83 of 100.


The same prompt and button. Before training the model writes text that isn't an action; after GRPO it writes a
valid click and the task is done.
Base model
After GRPO
| Model | Task | Training | Held-out result |
|---|---|---|---|
| LFM3-VL-2B + LoRA | click-button-sequence, screenshots only | Supervised fine-tuning on 234 expert clicks | 95/100 greedy, 21/100 sampled (base model 0/100) |
| LFM3-VL-2B + LoRA, SFT then GRPO | click-button-sequence, fresh tasks | GRPO on the task's own reward, from the SFT adapter | 83/100 sampled, 92/100 greedy (SFT 26 and 91) |
| LFM3-1.7B + LoRA | book-flight, about 10 steps | Supervised fine-tuning on scripted expert traces | 160/200 booked correctly (base model 0/100) |
| LFM2-350M + LoRA | click-test, one click | GRPO (reinforcement learning), 3 seeds | 2/50 → 50/50 for each seed |
The book-flight episodes come from the reserved evaluation, locked before it ran and used once. Two failures are included on purpose: in most failures the model filled the form correctly but chose a flight that wasn't the shortest. Every number can be recounted from the evidence dataset.