Repository

barunaction-35m

A 35M-parameter local compiler for typed personal actions

Parameters
35.07M
Weights
140.3 MB float; 57.5 MB Darwin ARM64 int8
Output
Strict, typed Action IR JSON
Mobile Actions dev · strict exact
79.63% (602/756)

Specs

  • Parameters35.07M
  • Weights140.3 MB float; 57.5 MB Darwin ARM64 int8
  • OutputStrict, typed Action IR JSON
  • Mobile Actions dev · strict exact79.63% (602/756)
  • Matched Qwen2.5-0.5B baseline87.70% (663/756); BarunAction is 14.09× smaller
  • RuntimeProposal only; no external execution
  • LicenseApache-2.0 code and released weights
  • ModelParameters
  • Qwen2.5-0.5B-Instruct494.03M
  • SmolLM2-360M-Instruct361.82M
  • GPT-2 125M125.0M
  • FileSHA-256
  • model.safetensorsfdb95ccf58a095e0d321be998924318b35ee59a334f6dd97d8726d2cf80021d3
  • tokenizer.json70ded9605fccd09c2340ca7e225361eab0ae8b4dbbb0d6e26343ab5183979db6
  • barun_config.json9b3a1d71baa95a198744d250f9629231738d942570b8685c44307fd83dd33565
  • checkpoint_manifest.jsonc743ab7c4d33ae75c6b0aa4547458a961b92766da8fcf85fd148fda2ebb5530a

README

BarunAction-35M

Model
<a href="https://barunaction-d9123728.nip.io" target="_blank" rel="noopener noreferrer">

Live demo

</a>
License
Python

A 35M-parameter local compiler for typed personal actions.

BarunAction-35M turns a natural-language request, explicit tool schemas, context, and a reference
time into strict Action IR JSON. It is small enough for local research, hash-verifies its own
checkpoint, validates every proposal deterministically, and never invokes a real tool.

<a href="https://barunaction-d9123728.nip.io" target="_blank" rel="noopener noreferrer">Try the live browser demo ↗</a> ·
Download the model ·
Read the model card ·
Reproduce the benchmark

Release highlights

BarunAction-35M
Parameters 35.07M
Weights 140.3 MB float; 57.5 MB Darwin ARM64 int8
Output Strict, typed Action IR JSON
Mobile Actions dev · strict exact 79.63% (602/756)
Matched Qwen2.5-0.5B baseline 87.70% (663/756); BarunAction is 14.09× smaller
Runtime Proposal only; no external execution
License Apache-2.0 code and released weights

The matched Qwen baseline has 494.03M parameters. BarunAction retains 90.80% of its exact-match
rate while trailing by 8.07 points. This is a grouped development split, not the official test.

Try it

<a href="https://barunaction-d9123728.nip.io" target="_blank" rel="noopener noreferrer">Open the live demo ↗</a>, choose an action type, and edit the request.
It runs the real checkpoint, validates the proposal, and never executes a tool.

Best first example: save Mira Shah's name, phone, and email from one sentence. If a result is wrong,
the page includes a short feedback form with an optional screenshot.

Quick start

git clone https://github.com/harrrshall/barunaction-35m.git
cd barunaction-35m
python -m venv .venv
source .venv/bin/activate
pip install -e .

# Weight-free contract and sandbox demonstration
barunaction demo

# Download the versioned release from Hugging Face and verify every required SHA-256
barunaction download --output ./models/BarunAction-35M

# Verify again at any time
barunaction verify --checkpoint ./models/BarunAction-35M

# Run deterministic CPU inference
barunaction infer \
  --checkpoint ./models/BarunAction-35M \
  --tools examples/barunaction_tools.example.json \
  --context examples/barunaction_empty_context.example.json \
  --now 2026-08-03T20:00:00+05:30 \
  --request "Turn on the flashlight" \
  --device cpu

Every successful result still carries policy.execution_permitted: false. A proposal becomes a
real action only if an application supplies its own authentication, authorization, confirmation,
rate limiting, and tool execution layer outside this package.

Python API

import json

from barunaction import BarunActionCompiler, download_candidate_checkpoint

downloaded = download_candidate_checkpoint("./models/BarunAction-35M")
compiler = BarunActionCompiler(downloaded.path, device="cpu")

with open("examples/barunaction_tools.example.json", encoding="utf-8") as source:
    tools = json.load(source)

result = compiler.infer(
    request="Turn on the flashlight",
    tool_schemas=tools,
    context={},
    now="2026-08-03T20:00:00+05:30",
)
print(json.dumps(result.to_dict(), indent=2))

Inputs are rejected unless the request is non-empty, tool declarations are strict and
non-duplicated, context is a JSON object, and now is timezone-aware. Outputs are parsed as one
complete JSON object without extraction, repair, coercion, or implicit defaults.

What the released model learned

The released model was post-trained for one epoch with full-parameter, response-only supervised
fine-tuning from the exact harrrshall/BarunLM-35M base checkpoint. It saw 7,937 derived examples
once and completed 126 optimizer steps. It used no synthetic teacher data, distillation,
preference optimization, DPO, or reinforcement learning.

The released training population covers seven Mobile Actions tools:

  • create_calendar_event
  • create_contact
  • open_wifi_settings
  • send_email
  • show_map
  • turn_off_flashlight
  • turn_on_flashlight

See Training for the exact recipe and Data card
for revisions, derivation, licenses, hashes, and redistribution boundaries.

Benchmark result and terminology

The primary metric is strict Action IR AST exact match. A prediction must be one valid JSON
object, satisfy the supplied tool schema, match the decision and call mode, preserve ordered calls
for SINGLE/SERIAL, and match typed arguments exactly. PARALLEL calls are compared as an
order-independent multiset. Missing outputs, parse failures, schema failures, truncations, and
generation failures remain incorrect.

Model Parameters Performance Evaluated on
BarunAction-35M 35.07M 79.63% (602/756) strict AST exact Mobile Actions grouped development
Qwen2.5-0.5B-Instruct 494.03M 87.70% (663/756) strict AST exact Same Mobile Actions matched-adaptation lane
SmolLM2-360M-Instruct 361.82M 0.00% (0/756) strict AST exact Same Mobile Actions matched-adaptation lane
GPT-2 125M 125.0M 39.10% macro accuracy Separate nine-task zero-shot language suite

GPT-2 used a different benchmark, so its score is not directly comparable with Action IR exact
match. SmolLM2's zero is specific to that structured-output adaptation run, not general ability.

The comparison used identical 7,937 training IDs, 756 development IDs, semantic labels, one pass,
effective batch 63, 126 optimizer steps, seed 17, final-checkpoint selection, and unconstrained
deterministic greedy decoding. Model-native tokenizers/templates and learning rates differed, and
BarunAction had an earlier development sweep. This is therefore a one-seed matched
semantic-adaptation comparison, not a universal model ordering.

The source is google/mobile-actions revision
e920309bc2acbc2e99a5e3201cf37df2b9fd9151 (CC BY 4.0). The reported 756 rows are grouped public
development data and contain only CALL cases. The separate 961-row official evaluation split
was never read or materialized.

Full definitions, evaluator logic, exact model revisions, data hashes, decoding settings, and
curated sample-level outcome evidence are in Benchmark and
Evaluation. The executable scorer is
src/barunlm/evaluation/mobile_actions.py.

Reproduce

The public repository separates four layers so results are inspectable without internal lab
state:

src/                 model, training, inference, schema, scorer, quantization
configs/             released candidate and matched-baseline contracts
benchmarks/          curated manifests, aggregates, paired outcomes, verification
docs/                model, data, training, evaluation, retrieval, deployment cards
space/               public Gradio demonstration

Common verification commands:

# Product runtime and scorer tests
pytest -q

# Style and formatting
ruff check .
ruff format --check .

# Rebuild the grouped public train/dev manifests from the pinned source.
# Official evaluation rows remain opaque and are never parsed or materialized.
python -m barunlm.datasets.mobile_actions \
  --download-pinned \
  --tokenizer-json ./models/BarunAction-35M/tokenizer.json \
  --tokenizer-revision v1.0.0 \
  --output-dir ./build/mobile-actions

# Re-score the published BarunAction predictions without generating new outputs
barunaction score-mobile \
  --manifest ./build/mobile-actions/dev.jsonl \
  --predictions benchmarks/evidence/barunaction-predictions.jsonl \
  --output ./reproduced-score

No raw training dataset or sealed evaluation label is redistributed. The repository supplies
pinned source revisions, derivation code, membership and content hashes, licenses, evaluator code,
aggregate results, and curated sample-level comparison outcomes. See
Release evidence.

Model files

The canonical Hugging Face mirror contains:

File SHA-256
model.safetensors fdb95ccf58a095e0d321be998924318b35ee59a334f6dd97d8726d2cf80021d3
tokenizer.json 70ded9605fccd09c2340ca7e225361eab0ae8b4dbbb0d6e26343ab5183979db6
barun_config.json 9b3a1d71baa95a198744d250f9629231738d942570b8685c44307fd83dd33565
checkpoint_manifest.json c743ab7c4d33ae75c6b0aa4547458a961b92766da8fcf85fd148fda2ebb5530a

The source artifacts remain immutable public W&B v0 releases. Hugging Face is a byte-identical,
freshly verified mirror. See Retrieval for both locations.

Citation

@software{harrrshall2026barunaction35m,
  author  = {Harrrshall},
  title   = {BarunAction-35M: A Compact Typed Personal-Action Compiler},
  year    = {2026},
  version = {v1.0.0},
  url     = {https://github.com/harrrshall/barunaction-35m}
}

License

Source code and released model weights are licensed under Apache License 2.0. Mobile Actions is
licensed CC BY 4.0 and retains its upstream attribution and terms. See NOTICE and the
data card.