Andy-Select 2B LoRA adapters (v1, v2)

LoRA adapters that turn Qwen3.5-2B into Andy-Select, an on-device action selector for Android agents. Given the goal, the screen's accessibility tree and a numbered list of allowed actions, it picks the next action and says how sure it is, so the agent can act or hand the step to you.

How Andy-Select works

Model (AndroidControl test, 2,003 steps) Step accuracy File size
v2 adapter, merged, Q4_K_M 0.655 1.27 GB
v1 adapter, merged, Q4_K_M (BF16: 0.664) 0.635 1.27 GB
Qwen3.5 4B Q4_K_M 0.501 2.74 GB
Qwen3.5 2B Q4_K_M (the base model, without an adapter) 0.335 1.28 GB

To run the model, use the GGUF repos below. They hold the merged files, their calibration and a quick start. Use this repo to inspect, merge, re-export or continue training.

Model family

Repo What Use with
andy-select-v2-2b-GGUF (recommended) v2, Q4_K_M + BF16 GGUF prompt 2
andy-select-2b-GGUF v1, Q4_K_M + BF16 GGUF prompt 1
andy-select-2b-lora (this repo) LoRA adapters for v1 and v2 merge into Qwen3.5-2B
Folder Prompt Checkpoint Contents
v1/ prompt 1 best of the full run (1,463 updates) adapter_model.safetensors (62.6 MB), adapter_config.json, MANIFEST.json (SHA-256 of each file), trainer.pt
v2/ prompt 2 update 1,250 (run stopped at 1,720 of 1,835) same

Both adapters use LoRA r 16, α 32 and dropout 0 (15.6M trainable parameters, PEFT 0.21.2). They target the attention, linear-attention input/output and MLP projections of the language model's decoder layers. trainer.pt is optimizer state for resuming training. It is a PyTorch pickle that inference does not need, so only load it if you trust it.

Merge and convert

import torch, transformers
from peft import PeftModel

BASE, REV = "Qwen/Qwen3.5-2B", "15852e8c16360a2fea060d615a32b45270f8a8fc"   # use this exact revision
tok = transformers.AutoTokenizer.from_pretrained(BASE, revision=REV)
cls = getattr(transformers, "AutoModelForImageTextToText", None) or transformers.AutoModelForCausalLM
base = cls.from_pretrained(BASE, revision=REV, dtype=torch.bfloat16)

model = PeftModel.from_pretrained(base, "corbanyax/andy-select-2b-lora", subfolder="v2")   # or "v1"
merged = model.merge_and_unload()
merged.save_pretrained("andy-select-v2-hf", safe_serialization=True)
tok.save_pretrained("andy-select-v2-hf")
python convert_hf_to_gguf.py andy-select-v2-hf --outtype bf16 --outfile andy-select-v2-2b-BF16.gguf
llama-quantize --imatrix imatrix.dat andy-select-v2-2b-BF16.gguf andy-select-v2-2b-Q4_K_M.gguf Q4_K_M

Block-count fix. The merged model has no multi-token-prediction layer, but the converter writes qwen35.block_count = 25 and qwen35.nextn_predict_layers = 1. llama.cpp then fails with blk.24.attn_norm.weight not found. Set them to 24 and 0 in the BF16 file before quantizing, for example with gguf-py's GGUFReader(path, "r+").

A re-export will not be byte-identical to the released GGUFs, so fit the temperature T and threshold tau80 again on validation data before you rely on the confidence. The released files use T = 0.907 with tau80 = 0.4494 (v2 Q4_K_M) or tau80 = 0.4195 (v1 Q4_K_M).

Intended use and limitations

Intended: research on small, calibrated on-device agents; reproducing or extending Andy-Select. The caller builds the candidate list from the screen and the model picks one, scored by log-likelihood. The exact prompt formats are in the GGUF cards and in andy_select.py in the GGUF repos.

Not for: a general chatbot, multi-step planning or unattended operation. This is a research preview. In the Andy app the agent never sends messages, deletes content, buys anything, enters passwords or grants permissions, and uncertain steps go to the user. The app enforces these rules, not the model.

Limitations:

  • The model reads text only (no pixels).
  • Single-step accuracy is not task success.
  • Some measured errors are AndroidControl label noise.
  • It was trained and tested on AndroidControl only and is English-centric.
  • v2 is an early-stopped checkpoint.

Training (short)

LoRA fine-tune of Qwen3.5-2B (r 16, one epoch) on 67,907 AndroidControl training steps rendered with prompt 1 (v1) or prompt 2 (v2), distilled from a proprietary teacher's soft labels mixed with the official answers. The GGUF repos hold the merged models quantized to Q4_K_M.

License and data

  • Adapters: Apache-2.0. The base model Qwen/Qwen3.5-2B is Apache-2.0.
  • Training data: AndroidControl (Google). Check the AndroidControl dataset terms before redistribution: its code is Apache-2.0, but we could not confirm a license for the data.
  • Teacher labels: part of the training targets are soft labels from a proprietary model.

Citation

Paper in preparation. Code: repository link to be added.

@misc{deo2026andyselect,
  title  = {Know When to Hand Off: Calibrated Closed-Set Action Selection for 4 GB On-Device Mobile Agents},
  author = {Deo, Atharva},
  year   = {2026},
  note   = {Paper in preparation}
}
Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for corbanyax/andy-select-2b-lora

Finetuned
Qwen/Qwen3.5-2B
Adapter
(277)
this model

Collection including corbanyax/andy-select-2b-lora

Evaluation results

  • Step accuracy (merged, Q4_K_M, candidate scoring) on AndroidControl (2,003-step test sample)
    test set self-reported
    0.655
  • Step accuracy (merged, BF16, candidate scoring) on AndroidControl (2,003-step test sample)
    test set self-reported
    0.664
  • Step accuracy (merged, Q4_K_M, candidate scoring) on AndroidControl (2,003-step test sample)
    test set self-reported
    0.635