Files
Table with columns: Path, Contents| Path | Contents |
|---|
text/ | Text adapter: adapter_config.json and adapter_model.safetensors |
multimodal/ | Multimodal adapter: adapter_config.json and adapter_model.safetensors |
adapter_config.json, adapter_model.safetensors | Root copy of the text adapter, byte-identical to text/ |
Both adapters use LoRA rank 16, alpha 32, and dropout 0.05, and were saved
with PEFT 0.18.1. The text adapter targets the language model's attention and
MLP projections. The multimodal adapter also targets the vision-merger
projections (linear_fc1, linear_fc2). All weights are safetensors; this
repository contains no pickle files.
Intended use
- Research on closed-option computer-use decisions. The caller supplies the
screen state and an enumerated set of candidate actions, and the model
scores them.
- Baseline and ablation comparisons against
cua-s1-4b-0.2 and other
Cua-S1 checkpoints on cua-bench-s1.
- Studying failure modes, abstention, and human-oversight boundaries in
isolated, controlled environments.
Out of scope
- General-purpose or open-ended computer operation.
- Unsupervised operation on production accounts or sensitive data.
- Actions with financial, legal, medical, employment, safety, or other
high-impact consequences.
- Bypassing access controls, consent, rate limits, or service policies.
- Treating a selected option, or a high probability, as proof that the action
is correct, safe, or succeeded. The model chooses only among options the
caller provides, so its choice says nothing about whether that option set
was safe, complete, or correctly scoped.
How it works
A chat-template prompt describes the screen and lists the candidate options,
each labeled with a letter. Every letter is a single tokenizer token. The
model runs one forward pass, and the logits for the option letters at the
final position are converted with softmax into per-option probabilities. This
is closed-set selection, not open-ended generation, and it supports at most
26 options.
- Text mode describes the screen with an accessibility tree.
- Multimodal mode describes it with a screenshot.
The two adapters were trained independently.
cua_s1.four_b.FourBModel
selects text/ or multimodal/ based on the requested modality.
Training summary
Both adapters were supervised fine-tuned on the data/v1 split of the
cua-bench-s1 core GUI task families: form_filling, login_auth,
consent_checkbox, multi_step_submit, pagination, and search_filter.
cua-bench-s1 builds these families with its synthetic generator and its
converters for AndroidControl
(Apache-2.0) and GUI-360 (MIT). For exact provenance, see
Data sources and provenance.
The training recipe is
libs/cua-s1/training/train_4b.py.
It applies soft-label cross-entropy over the option-letter logits, with
uniform target mass across every gold option. The base model stayed frozen,
and no reinforcement-learning stage was applied.
The multimodal adapter saw only the six core families' synthetic,
same-distribution data. It does not generalize to out-of-distribution
families such as chess or game_control. The safety_gate "finetuned"
result in cua-bench-s1 comes from a separate LoRA trained on that family,
which is not published here.
Evaluation
These are measured results from the cua-bench-s1
Results section:
- Held-out cross-dataset text split: task-level accuracy of 0.167 to 0.571,
depending on family.
- Same-distribution multimodal split for the six core families (the split it
was trained on): 1.000.
chess, on the same 15-position subset used for every model: 0.000 task
accuracy.
game_control: 0.000 task accuracy. Neither result survives chance
correction.
safety_gate: 0.071 zero-shot.
- External
general_decision benchmark: 0.563 zero-shot.
In local runtime smokes through the jev-use chooser (Apple M1 Ultra, mps,
float16, 2026-09-25), this checkpoint failed on two of three synthetic
requests in both modalities:
- It abstained on the checked-in positive fixture, where the expected answer
was
submit-form.
- It chose the wrong target on a 12-region, 8-candidate request.
The base model without an adapter passed the positive fixture. For the full
table, see Verification scope and known failure modes.
Run it with the jev-use chooser
Pin both downloads. These are the revisions the Cua-S1 documentation was
verified against. The adapter weights are unchanged at later revisions of
this repository that change only documentation.
Table with columns: Artifact, Revision| Artifact | Revision |
|---|
Qwen/Qwen3.5-4B | 851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a |
cua-ai/cua-s1-4b-0.1 (weights) | 88d8b8a90c2da4470d005cc23ec8665a6442ebe1 |
From a checkout of trycua/cua, create the
locked inference environment (torch 2.14.0, Transformers 5.17.0, PEFT
0.21.0), then download the weights. The base weights take about 9.3 GB and
need at least 16 GB of free memory.
uv sync --frozen --project libs/cua-s1/python --python 3.12 --extra four-bHF=libs/cua-s1/python/.venv/bin/hfS1_MODELS="$HOME/cua-s1-models" "$HF" download Qwen/Qwen3.5-4B \ --revision 851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a \ --local-dir "$S1_MODELS/Qwen3.5-4B""$HF" download cua-ai/cua-s1-4b-0.1 \ --revision 88d8b8a90c2da4470d005cc23ec8665a6442ebe1 \ --local-dir "$S1_MODELS/cua-s1-4b-0.1"
Run one decision through the
jev-use closed-candidate chooser.
Set S1_DEVICE=mps on Apple silicon or cuda on NVIDIA. For the multimodal
adapter, set S1_MODALITY=multimodal and pass --screenshot <png> and
--screenshot-capture-id <capture_id> from the same capture as the request.
export S1_BASE_MODEL_PATH="$S1_MODELS/Qwen3.5-4B"export S1_ADAPTER_PATH="$S1_MODELS/cua-s1-4b-0.1"export S1_DEVICE=cpu S1_DTYPE=float16 S1_MODALITY=text libs/cua-s1/python/.venv/bin/python \ libs/cua-driver/examples/jev-use/python/choose_decision.py --model s1 \ < libs/cua-driver/examples/jev-use/fixtures/jev-choice-request-v1.json
The chooser prints one cua.decision_choice_v1 object. Its kind is
selected, reobserve, abstain, or error, and it includes one
probability per candidate. The model field names the adapter, revision, and
modality, but not the base model, so record the base revision with your
evidence.
To load the adapters directly in Python:
from cua_s1.four_b import FourBModel model = FourBModel( base_model="/path/to/Qwen3.5-4B", lora_adapter_path="/path/to/cua-s1-4b-0.1", # local directory, not a Hub ID modality="text", # or "multimodal" device="cpu", dtype="float16",)
Pass a local directory. FourBModel resolves the text/ or multimodal/
subdirectory only for local paths.
Limitations
- It chooses only among caller-enumerated options, up to 26, and cannot
propose an action outside that set.
- Computer-use behavior can fail on unfamiliar layouts, changed interface
state, ambiguous labels, localization, timing, occlusion, unexpected
dialogs, or adversarial on-screen instructions.
- A specialist checkpoint may overfit its training distribution without
recognizing that a task is outside it.
- No weights-backed CI or canonical Cua Driver desktop E2E covers this
checkpoint. Inference on Linux, Windows, and CUDA has not been measured.
Run it in an isolated environment with least-privilege credentials and
bounded actions. Verify outcomes independently, and require human
confirmation before consequential or irreversible actions.
License
The adapter weights in this repository are licensed under Apache-2.0. This
license covers only the adapters. Qwen/Qwen3.5-4B is not redistributed
here: download it from Qwen's repository, where its own license governs it.
The Cua-S1 source code is MIT-licensed in
trycua/cua.