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.
Uses MLX. Tested on an M1 Max with 32 GB of memory.
Get started 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.
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.

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.
groot-19b-a3b-text
35B 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.
qwen3.6-35b-a3b-text
35B 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.
ornith-1.5-35b-a3bAll 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 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.
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 the stable release. You need an Apple Silicon Mac running macOS 15 or later.
brew install tijs/tap/meiThese 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 \
--model-profile groot-19b-a3b-text \
--served-model-id grootMei downloads a fixed version of the model. 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 ↗