Tool-using agents
Let a model request actions through your app’s APIs, read the results, and decide what to do next.
Mei runs language models on Apple Silicon and makes them available to your apps through an OpenAI-compatible API.
Native Swift, powered by MLX. No Python environment required. Tested on an M1 Max with 32 GB of memory.
Get started Mei 0.11.2 · Apple Silicon · macOS 15+ · MIT licensedMei runs the model on your Mac. Your app provides the tools and carries out the actions the model requests.
See how your app, Mei and the model fit together →Let a model request actions through your app’s APIs, read the results, and decide what to do next.
Build assistants that search information supplied by your app, summarize it, or extract data from text.
Write small scripts, process data, or make changes to a few lines of code.
Mei includes tested settings for these three models. The descriptions below explain the differences we found in the same set of tests.
Mei uses repacks of existing, quantized MLX models. A repack changes the packaged files, for example by removing unused components or adjusting the file layout. The repacking step leaves the retained language-model weights unchanged. Each Mei configuration selects a fixed version and includes the settings we tested with it.
19B parameters · text-only · 4.5 bits/weight
We suggest starting with Groot on a 32 GB M1 Max. It passed 22 of 24 assistant tasks and all 6 Python tasks. It also had the lowest measured memory increase of these three models.
Uses hermitdave’s MLX version. We removed image-processing weights and unused multi-token prediction components, and corrected the settings describing weight precision. The retained language-model weights are unchanged.
Mei automatically loads Groot’s measured settings: 256-token prefill, conversation anchors off, stock decode kernels and eligible blocked prefill. No kernel flags are needed.
mei pull groot-19b-a3b-text
mei \
--model-dir ~/.cache/mei/models/Groot-19B-A3B-261023-rco-role-4.5bpw-textonly \
--served-model-id groot35B parameters · text-only · 4-bit weights
Qwen finished the test tasks faster on average than Groot and Ornith. It passed 18 of 24 assistant tasks and all 6 Python tasks. Its measured memory increase was higher than Groot’s.
Uses mlx-community’s 4-bit MLX version with the image-processing weights removed. The text weights, tokenizer and chat template are unchanged. This version accepts text only.
Mei automatically loads Qwen’s measured settings: 1024-token prefill on a fitting Mac and two conversation anchors. Smaller devices use the documented prefill fallback.
mei pull qwen3.6-35b-a3b-text
mei \
--model-dir ~/.cache/mei/models/Qwen3.6-35B-A3B-4bit-textonly \
--served-model-id qwen35B parameters · MLX · 4-bit weights
Ornith passed 19 of 24 assistant tasks and 4 of 6 Python tasks. It took longer per task on average than Qwen and Groot. Mei includes separate settings for running this model.
Uses Ornith’s 4-bit MLX version. We changed the file padding to align the stored weights. The weight values are unchanged.
Mei automatically loads Ornith’s measured settings: 1024-token prefill on a fitting Mac and conversation anchors off. Smaller devices use the documented prefill fallback.
mei pull ornith-1.5-35b-a3b
mei \
--model-dir ~/.cache/mei/models/Ornith-1.5-35B-A3B-MLX-4bit-aligned \
--served-model-id ornithAll three are mixture-of-experts models: they use about 3 billion parameters for each token, but the full set of weights must be stored. Weight storage in these tests was about 11.45 GiB for Groot and 18.17 GiB for Qwen and Ornith. Running a model also needs memory for the prompt, generated text and calculations.
We use test results to choose models and adjust their settings. In the latest tests, Gemma passed the same 22 of 24 assistant tasks as Groot, but passed 3 of 6 Python tasks and averaged 72.27 seconds per task. Our current recommendations remain Groot, Qwen and Ornith.
Read the latest model tests ↗Compare task results, time per task, memory measurements and text generation speed for the three models.
M1 Max · 32 GB · Mei 0.11.0
Tested 7 November 2026 · two runs per model
Passed tasks · more is better
We tested each model twice. Each run used 12 simulated household-assistant tasks and 3 small Python tasks. Failed attempts count too. The results measure each model with its Mei settings; they do not tell us how well it will work in your application.
Test setup and full results ↗We used test suite benchmark-v9.11.5 with random seeds 17 and 29. Each model ran 12 simulated household-assistant tasks and 3 small Python tasks per run. We gave both runs equal weight when calculating averages. Each model used its own sampling and cache settings. Two runs are too few to show that one model will consistently outperform another or to predict how it will work in your app.
| Model | Assistant | Python | Task time | Wired increase |
|---|---|---|---|---|
| Groot | 22/24 | 6/6 | 38.90 s | 13.72 GiB |
| Qwen3.6 | 18/24 | 6/6 | 29.44 s | 20.34 GiB |
| Ornith 1.5 | 19/24 | 4/6 | 44.24 s | 19.86 GiB |
The memory figures show changes in the Mac’s wired memory, not total memory used by each model. Task times include failures. Text generation speed was tested separately and does not show whether longer prompts produced correct answers. These charts show the three recommended Mei models; the full report includes other models and engines.
Download the chart data ↗Mei is written in Swift and uses MLX through vMLX to run models on Apple Silicon. Each server process loads one model and responds to HTTP requests from your app.
It runs as a compiled executable, so you don’t need to install Python or manage a Python environment to use it.
It can stream generated text, return tool calls and produce JSON using supported schema rules. It reads long prompts in chunks to limit memory use and can reuse calculations from earlier requests.
We test on an M1 Max with 32 GB of memory. Other Apple Silicon Macs can run Mei too. The model you can run and its speed depend on your Mac’s memory, the length of the prompt and the work you ask it to do.
Read more about how Mei fits into your app →
Supported API features and limits ↗Mei is a command-line server. Install it, download a model, then connect your own app or send an API request. Mei does not include a chat interface.
This installs stable Mei 0.11.2. You need an Apple Silicon Mac running macOS 15 or later.
brew install tijs/tap/meiManual install: Apple Silicon archive and checksum.
These commands use Groot, our suggested first model for the 32 GB M1 Max. Install the Hugging Face download tool first. If you already have the hf command, skip that first block.
brew install uv
uv tool install huggingface_hubmei pull groot-19b-a3b-text
mei \
--model-dir ~/.cache/mei/models/Groot-19B-A3B-261023-rco-role-4.5bpw-textonly \
--served-model-id grootMei downloads a fixed version and loads its validated settings automatically. mei pull groot-19b-a3b-text --dry-run previews what it would download. Each server runs one model; stop it with Ctrl-C before switching models.
Set your OpenAI-compatible client’s base URL to http://127.0.0.1:8024/v1 and use the served model ID groot.
curl http://127.0.0.1:8024/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "groot",
"messages": [{
"role": "user",
"content": "Hello, Mei."
}]
}'CoCore supports Mei as an external model server. When it connects, it checks whether the selected model can handle tool calls and structured responses.
CoCore setup instructions ↗