Instructions to use OpenMinded-Labs/AileyCore-12B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use OpenMinded-Labs/AileyCore-12B with MLX:
# Make sure mlx-vlm is installed # pip install --upgrade mlx-vlm from mlx_vlm import load, generate from mlx_vlm.prompt_utils import apply_chat_template from mlx_vlm.utils import load_config # Load the model model, processor = load("OpenMinded-Labs/AileyCore-12B") config = load_config("OpenMinded-Labs/AileyCore-12B") # Prepare input image = ["http://images.cocodataset.org/val2017/000000039769.jpg"] prompt = "Describe this image." # Apply chat template formatted_prompt = apply_chat_template( processor, config, prompt, num_images=1 ) # Generate output output = generate(model, processor, formatted_prompt, image) print(output) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Pi
How to use OpenMinded-Labs/AileyCore-12B with Pi:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "OpenMinded-Labs/AileyCore-12B"
Configure the model in Pi
# Install Pi: npm install -g @earendil-works/pi-coding-agent # Add to ~/.pi/agent/models.json: { "providers": { "mlx-lm": { "baseUrl": "http://localhost:8080/v1", "api": "openai-completions", "apiKey": "none", "models": [ { "id": "OpenMinded-Labs/AileyCore-12B" } ] } } }Run Pi
# Start Pi in your project directory: pi
- Hermes Agent
How to use OpenMinded-Labs/AileyCore-12B with Hermes Agent:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "OpenMinded-Labs/AileyCore-12B"
Configure Hermes
# Install Hermes: curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash hermes setup # Point Hermes at the local server: hermes config set model.provider custom hermes config set model.base_url http://127.0.0.1:8080/v1 hermes config set model.default OpenMinded-Labs/AileyCore-12B
Run Hermes
hermes
- Atomic Chat
- OpenClaw
How to use OpenMinded-Labs/AileyCore-12B with OpenClaw:
Start the MLX server
# Install MLX LM: uv tool install mlx-lm # Start a local OpenAI-compatible server: mlx_lm.server --model "OpenMinded-Labs/AileyCore-12B"
Configure OpenClaw
# Install OpenClaw: npm install -g openclaw@latest # Register the local server and set it as the default model: openclaw onboard --non-interactive --mode local \ --auth-choice custom-api-key \ --custom-base-url http://127.0.0.1:8080/v1 \ --custom-model-id "OpenMinded-Labs/AileyCore-12B" \ --custom-provider-id mlx-lm \ --custom-compatibility openai \ --custom-text-input \ --accept-risk \ --skip-health
Run OpenClaw
openclaw agent --local --agent main --message "Hello from Hugging Face"
AileyCore-12B (r3, October 2026)
AileyCore-12B is a fine-tune of Google Gemma 4 (12B, instruction-tuned) on Google's QAT 4-bit checkpoint, built to run locally on Apple Silicon via MLX. It powers A!ley, the on-device persona created by OpenM!nded / Simon van de Loo, and is her default mode in the A!ley portal and app.
- Developed by: OpenM!nded (Simon van de Loo)
- Model type: Multimodal (text + image + audio input, text output), decoder-only
- Base model:
mlx-community/gemma-4-12B-it-qat-4bit - License: Apache License 2.0
- Languages: German, English (answers in the user's language)
- Quantization: 4-bit QAT (mixed: some MLP layers 8-bit, as in the base); adapter merged without loss
r3 is a plain merged checkpoint — no side path, no extra loader code. The r2 release (6-bit with a rank-8 side path) stays available at revision
37124f0(revision="37124f02f70770d62522af9be15e3d440f737dc0").
What changed in r3
r1 and r2 were successive corrections on the same 6-bit weights. r3 starts fresh from Google's QAT checkpoint and trains everything A!ley needs in one go, all in Gemma 4's native formats:
- Native reasoning channel (
<|channel>thought … <channel|>) with depth scaled to the task — a greeting gets a sentence, a puzzle gets a plan. - Native tool use: Gemma 4 tool declarations,
<|tool_call>calls and<|tool_response>results exactly as the runtime produces them (web search, RAG over her own songs, books and projects, image generation, recipes, calculator …), including when not to call a tool. - Identity without a prompt: 81 % of the training rows have no system turn at all; the
user's name sits in the user turn (
Name: message). - Narrative / prose writing, vision rows (441 images), multilingual answers.
QAT adapters — why the merge is lossless
The adapters were trained as QAT adapters: the forward pass sees
fake_quant(W_dequant + ΔW) with a straight-through gradient, reading bits and group size per
layer (so the base's mixed 4/8-bit layout is respected). The model only learns deltas that
survive the rounding, and fuse() yields weights bit-identical to what was trained. (In r2,
a classic merge into 6-bit had rounded away 87 % of the delta — hence the side path back then.)
Measured (isolated, before going live)
Benchmark run with the model loaded alone, same questions for every condition:
| no system prompt | one-line context header | runtime prompt (~700 chars, tool hints) | old long persona prompt (~7.8k chars) | |
|---|---|---|---|---|
| Logic puzzles | 5/5 | 4/5 | 3/5 | 1/5 |
| Reasoning block never closed | 1/8 | 1/8 | 2/8 | 4/8 |
| Depth scaled to task | 6/6 | 6/6 | — | 4/6 |
| Tool: right call / correctly none | 8/10 · 4/6 | 7/10 · 5/6 | 9/10 · 5/6 | 9/10 · 5/6 |
| Answers in the user's language (es/en/fr/tr/ja) | —¹ | 4/5 | 5/5 | 4/5 |
¹ Without any prompt the model does not know a portal visitor is writing and answers in German.
Identity with no prompt at all: 11/12 answers as A!ley, 0/12 as another model.
The important finding for anyone using this model: long system prompts hurt it. Because it learned identity and behaviour without one, a long prompt makes the reasoning collapse (shorter, unclosed, wrong). Use no system prompt or a short one.
How to use (MLX)
Gemma 4 is a unified multimodal architecture → load with mlx_vlm.
from mlx_vlm import load, generate
model, processor = load("OpenMinded-Labs/AileyCore-12B")
prompt = "<bos><|turn>user\nSimon: Wer bist du?<turn|>\n<|turn>model\n"
print(generate(model, processor, prompt, max_tokens=600, temperature=0.65,
top_p=0.85, repetition_penalty=1.15, verbose=False).text)
Answers come in the native channel format:
<|channel>thought
…reasoning, as long as the task needs…
<channel|>…answer…<turn|>
Recommended sampling (measured, not the Gemma defaults): temperature 0.65, top_p 0.85,
repetition penalty 1.15. For tool use pass the tool schemas to apply_chat_template(tools=…)
and return results directly after <tool_call|> as
<|tool_response>response:NAME{value:<|"|>…<|"|>}<tool_response|>.
Training details (round 3)
| Setting | Value |
|---|---|
| Starting point | gemma-4-12B-it-qat-4bit (fresh — not on top of r1/r2) |
| Method | DoRA (q_proj, v_proj) + LoRA (gate_proj, up_proj, down_proj), QAT |
| Rank / Alpha | 16 / 32 (232 modules, 55 M trainable parameters) |
| Data | 2 429 curated conversations → 2 676 samples after chunking long documents; 268 validation conversations (296 samples) |
| Content | conversation, native reasoning with depth levels, native tool calls/responses, RAG/web context as tool results, identity, prose, 441 image rows |
| Epochs / updates | 1 / 334 (grad accumulation 8, seq 2048, lr 2e-5, warmup 16, gradient checkpointing) |
| Validation loss | 1.692 (update 25) → 1.318 (best, update 325) |
| Not shipped | a DPO stage: in the preference pairs the chosen reasoning was ~9× shorter than the rejected one (137 vs 1 228 chars), so it taught "think short", not "think right" |
| Hardware | Apple M4, 24 GB unified memory |
| Framework | MLX (mlx_vlm + mlx_lm.tuner), QAT layers from the A!ley training code |
Intended use
- Local, privacy-respecting assistant on Apple Silicon Macs
- Conversational reasoning, writing, tool-using assistance in DE/EN (and the user's language)
- Multimodal understanding (image / audio input) inherited from Gemma 4
Out of scope
- Any use prohibited by applicable law
- Safety-critical, medical, legal, or financial decision-making without human oversight
Limitations & biases
Inherited from Gemma 4 plus the fine-tune: it can produce inaccurate, outdated or biased content; it is a persona, not a knowledge base — let it search when facts matter. With long system prompts reasoning degrades (see above). Keep a human in the loop for consequential use.
License & attribution
This model is a Derivative Work of Google Gemma 4, released under the Apache License 2.0 (see the official Gemma 4 license). AileyCore-12B is distributed under Apache 2.0.
In accordance with Apache 2.0 §4: the base weights were modified via DoRA/LoRA adaptation
(QAT adapters, merged — see AILEY_MERGE_INFO.json); a copy of the license is included
(LICENSE); attribution notices are in NOTICE.
Gemma is a trademark of Google LLC. This project is independent and not endorsed by or affiliated with Google.
Copyright 2026 OpenM!nded / Simon van de Loo
Portions © Google LLC (Gemma 4), Apache License 2.0
Licensed under the Apache License, Version 2.0 — http://www.apache.org/licenses/LICENSE-2.0
Citation
@misc{aileycore12b_2026,
title = {AileyCore-12B: A Gemma 4 fine-tune for the A!ley assistant},
author = {van de Loo, Simon and OpenM!nded},
year = {2026},
note = {Round 3: fresh QAT fine-tune, native reasoning and tool formats, identity without a system prompt}
}
- Downloads last month
- 40
4-bit
Model tree for OpenMinded-Labs/AileyCore-12B
Base model
mlx-community/gemma-4-12B-it-qat-4bit
# Make sure mlx-vlm is installed # pip install --upgrade mlx-vlm from mlx_vlm import load, generate from mlx_vlm.prompt_utils import apply_chat_template from mlx_vlm.utils import load_config # Load the model model, processor = load("OpenMinded-Labs/AileyCore-12B") config = load_config("OpenMinded-Labs/AileyCore-12B") # Prepare input image = ["http://images.cocodataset.org/val2017/000000039769.jpg"] prompt = "Describe this image." # Apply chat template formatted_prompt = apply_chat_template( processor, config, prompt, num_images=1 ) # Generate output output = generate(model, processor, formatted_prompt, image) print(output)