157 lines
4.7 KiB
Markdown
157 lines
4.7 KiB
Markdown
|
|
---
|
||
|
|
language:
|
||
|
|
- en
|
||
|
|
license: other
|
||
|
|
library_name: transformers
|
||
|
|
license_name: lfm-open-license-v1.0
|
||
|
|
license_link: https://huggingface.co/LiquidAI/LFM2.5-2.6B/raw/main/LICENSE
|
||
|
|
tags:
|
||
|
|
- lfm2
|
||
|
|
- macos
|
||
|
|
- agent
|
||
|
|
- tool-calling
|
||
|
|
- on-device
|
||
|
|
pipeline_tag: text-generation
|
||
|
|
base_model: LiquidAI/LFM2.5-2.6B
|
||
|
|
---
|
||
|
|
|
||
|
|
# 🦜 Macaw
|
||
|
|
|
||
|
|
**The assistant your Mac should have shipped with.**
|
||
|
|
|
||
|
|
Ask for something in plain English and Macaw does it — sends the email, finds the
|
||
|
|
file, reads the PDF, tells you what's eating your battery. It runs entirely on
|
||
|
|
your Mac. Nothing is uploaded, nothing is logged, and there is no account to
|
||
|
|
make.
|
||
|
|
|
||
|
|
Available today. Not a waitlist.
|
||
|
|
|
||
|
|
👉 **[badtheorylabs.com/macaw](https://badtheorylabs.com/macaw)**
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## What you can say to it
|
||
|
|
|
||
|
|
```
|
||
|
|
"email ada the q3 numbers and tell her i approved"
|
||
|
|
"why is my mac slow?"
|
||
|
|
"read ~/Documents/contract.pdf and summarise it in two sentences"
|
||
|
|
"take a screenshot, make a folder called Shots, and move it there"
|
||
|
|
"what's on my screen?"
|
||
|
|
"am i free tomorrow afternoon?"
|
||
|
|
"find my biggest files"
|
||
|
|
```
|
||
|
|
|
||
|
|
It chains steps on its own. *"Take a screenshot, make a folder, move it there"*
|
||
|
|
is three actions from one sentence, and it checks each one worked before moving
|
||
|
|
to the next.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## What it can reach
|
||
|
|
|
||
|
|
**97 tools**, each one hand-written and tested — not a scrape of every command
|
||
|
|
macOS exposes.
|
||
|
|
|
||
|
|
| | |
|
||
|
|
|---|---|
|
||
|
|
| ✉️ **Mail** | send, search, reply, unread counts, senders |
|
||
|
|
| 📅 **Calendar** | create events, today's schedule, free slots, next meeting's video link |
|
||
|
|
| 📁 **Files** | Spotlight search, open, move, folder sizes, biggest files, old downloads |
|
||
|
|
| 📝 **Notes & Reminders** | create, append, search, complete, overdue |
|
||
|
|
| 🎵 **Music** | play, pause, skip, by artist, by playlist, shuffle |
|
||
|
|
| 🌐 **Safari & Chrome** | current tab, all tabs, open, search |
|
||
|
|
| 🖥️ **System** | battery, disk, wifi, brightness, dark mode, volume, focus, lock, sleep |
|
||
|
|
| 👀 **Screen** | read what's on screen, record it, screenshot it |
|
||
|
|
| 📄 **Documents** | read and summarise PDFs, Word files, code, plain text |
|
||
|
|
| ⚡️ **Diagnostics** | what's using CPU, what's eating memory, battery health |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Private by construction
|
||
|
|
|
||
|
|
Not a policy — an architecture. The model weighs 1.5 GB and lives on your
|
||
|
|
machine. There is no server to send anything to.
|
||
|
|
|
||
|
|
- No cloud, no API keys, no account
|
||
|
|
- No telemetry, no analytics, no crash reporting
|
||
|
|
- Works on a plane
|
||
|
|
- Your mail, files and calendar never leave the device
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Specs
|
||
|
|
|
||
|
|
| | |
|
||
|
|
|---|---|
|
||
|
|
| **Size** | 2.7B parameters · 1.5 GB on disk (4-bit) |
|
||
|
|
| **Memory** | ~2 GB while running |
|
||
|
|
| **Speed** | ~1.2 s per request on an M2 |
|
||
|
|
| **Context** | 128K tokens |
|
||
|
|
| **Requires** | Apple Silicon (M1 or later), macOS 14+ |
|
||
|
|
|
||
|
|
**Two builds:**
|
||
|
|
|
||
|
|
- **[`Macaw-4bit-MLX`](https://huggingface.co/badtheorylabs/Macaw-4bit-MLX)** —
|
||
|
|
1.5 GB, what the app runs. Start here.
|
||
|
|
- **`Macaw`** (this repo) — 5.4 GB BF16, for fine-tuning or serving on a GPU.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Run it yourself
|
||
|
|
|
||
|
|
```python
|
||
|
|
from transformers import AutoModelForCausalLM, AutoTokenizer
|
||
|
|
import torch
|
||
|
|
|
||
|
|
tok = AutoTokenizer.from_pretrained("badtheorylabs/Macaw")
|
||
|
|
model = AutoModelForCausalLM.from_pretrained("badtheorylabs/Macaw",
|
||
|
|
dtype=torch.bfloat16)
|
||
|
|
|
||
|
|
messages = [
|
||
|
|
{"role": "system", "content": "You are Macaw, an on-device assistant running on this Mac."},
|
||
|
|
{"role": "user", "content": "what's my battery at?"},
|
||
|
|
]
|
||
|
|
inputs = tok.apply_chat_template(messages, add_generation_prompt=True,
|
||
|
|
return_dict=True, return_tensors="pt")
|
||
|
|
out = model.generate(inputs["input_ids"], max_new_tokens=128)
|
||
|
|
print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
|
||
|
|
```
|
||
|
|
|
||
|
|
Pass your tools with `tools=[...]` and it replies with a call:
|
||
|
|
|
||
|
|
```
|
||
|
|
<|tool_call_start|>[battery_status()]<|tool_call_end|>
|
||
|
|
```
|
||
|
|
|
||
|
|
The app in [github.com/Badtheorylabs/Macaw](https://github.com/Badtheorylabs/Macaw)
|
||
|
|
handles the rest — parsing, running, and asking before anything destructive.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Measured
|
||
|
|
|
||
|
|
On an Apple M2, 4-bit build:
|
||
|
|
|
||
|
|
| | |
|
||
|
|
|---|---|
|
||
|
|
| Tool-call accuracy | **10 / 10** on the capability suite |
|
||
|
|
| Request latency | **1.21 s** mean · 0.77 s best |
|
||
|
|
| Decode | ~40 tok/s |
|
||
|
|
|
||
|
|
Method and harness are in the [GitHub repo](https://github.com/Badtheorylabs/Macaw).
|
||
|
|
|
||
|
|
`model.safetensors` SHA-256
|
||
|
|
`966d206651b96446f6a4c415d118049f478a8df79be3fa45bfd04959a4d68be0`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## License
|
||
|
|
|
||
|
|
Weights derive from [LFM2.5-2.6B](https://huggingface.co/LiquidAI/LFM2.5-2.6B)
|
||
|
|
under the [LFM Open License v1.0](https://huggingface.co/LiquidAI/LFM2.5-2.6B/raw/main/LICENSE).
|
||
|
|
Redistribution keeps that license and Liquid AI's attribution. Commercial use is
|
||
|
|
free below $10M annual revenue. The app and tooling are MIT.
|
||
|
|
|
||
|
|
© 2026 Bad Theory Labs
|