FluidInference / FluidUse
git clone https://github.com/FluidInference/FluidUse.git
v0.3.0 · 25d ago
Local computer use on Apple silicon: on-device typed decisions with laya and form filling with CUA-S1-FORMS, driven through the macOS Accessibility API
—
stars, 24h
—
stars, 7 days
+523
stars, 30 days · #532
523
★ total
40
forks · 8 open issues
Star history starts 2026-10-20; the chart appears after the second daily snapshot.
LanguageSwift
LicenseApache-2.0
Created2026-09-21 (1mo ago)
Last push6d ago
Watchers5
OwnerOrganization
GitHub topics
Links
- GitHub: github.com/FluidInference/FluidUse
- Homepage: https://huggingface.co/FluidInference
- Releases · Issues · Hacker News mentions
README excerpt
# FluidUse See decision-model runtime support for the current Core ML model matrix and handoff notes. Local computer use on Apple silicon. FluidUse reads a form in a running Mac app or browser through the Accessibility API, asks a small on-device model what belongs in each field, and types the answer into the real app. About 1 ms per decision on the Neural Engine, nothing leaves the machine. The first model is CUA-S1-FORMS, a 706K-parameter form specialist from Cua, converted to Core ML and served by FluidInference. ## Demo video https://github.com/user-attachments/assets/a0b31285-05be-4bcf-a645-4283eb327c35 ## Use [code] [code] `WebFormDriver` does the same for an embedded `WKWebView`. `DocumentEntities` turns a PDF or text file of `Label: value` lines into the profile; an optional `PredeterminedAnswer` sheet covers question-style fields the model does not decide. ## laya typed decisions laya (Convai Innovations, Apache-2.0) is an open Jev-style decision model: a 322M mmBERT encoder plus decision head that answers typed `choice` / `score` / `noul` questions about a text state with calibrated probabilities in one pass, no generated tokens. `LayaManager` runs the Core ML buckets from FluidInference/laya-coreml (128/256/512/1024 tokens, 32 options) on the Neural Engine: 3.7 ms per short question on an M5 Pro, about 7× faster than the ~27 ms upstream reports on an M1 Max GPU. [code] `LayaManager.Configuration` picks the buckets to load, their compute units (128 → CPU+ANE, longer → all units) and the weight precision (`fp16`, or `e8` with an int8 embedding table at 30% less weight and the same accuracy); a prompt runs on the smallest loaded bucket that fits, and the largest one truncates the state on the right like laya's `max_len`. The tokenizer is a Swift port of the mmBERT/Gemma byte-fallback BPE and matches HuggingFace `tokenizers` on the conversion fixtures. On laya's own published suites (3,899 questions rebuilt from upstream's scripts) the Core ML buckets match the PyTorch reference's accuracy on every suite (AG News 0.935, Emotion 0.537, MASSIVE-20 0.657, spam/phishing 0.993, guardrails 0.808, …) at 5.2 ms median per question versus 61.6 ms for PyTorch on the same Mac's CPU. Full tables in Benchmarks.md; the questions, reference answers, reports and conversion live in mobius `models/computer-use/laya/coreml`. [code] `LayaTetrisDemo` (Sources/LayaTetrisDemo, 25 s clip) defaults to GLiClass comparing the heuristic's two strongest legal landings in one call. Its policy control can instead run laya, which scores each surviving landing independently with *"Is this a clean placement?"*, or the heuristic and random baselines. The window is a single column so it sits next to a terminal; the app prints decisions and model latency to stdout for presentations: [code] The current ten-seed capped run averages 3,667 pieces for GLiClass LUT8 and 2,874 for the corrected heuristic control. See Benchmarks.md for the exact policy, per-seed results, an