Training-free decision engine for existing MLX models on Apple Silicon. No fine-tuning or extra decision weights. MLX-LM + experimental MLX-VLM action selection and semantic routing. Related: AnyJev.
Python
4
38 commits
updated Oct 15, 2026
Your existing compatible MLX model → a local decision engine.
No fine-tuning required. No extra decision-model weights.
MLX Direct Decider is an open-source Python library for training-free decisions from existing MLX models on Apple Silicon Macs. Use it for local LLM action selection, classification, semantic routing, and enum / boolean decisions.
Reuse a compatible MLX-LM checkpoint for text or an MLX-VLM checkpoint for experimental text + image decisions. Supply application state, a natural-language request and allowed choices; receive a stable candidate ID, no_match or abstain. Integrate through a Python API, CLI or local text HTTP service.
No additional fine-tuning, trained decision head or separate decision-model weights are required. The full model processes the prompt normally; the library reads candidate logits from its unchanged original output head without generating a continuation. Compatible base-model weights are still needed.
Quick start · Tested models · Game demo · Measured results · AnyJev & related projects · FAQ · Methodology · Connect & support
English · 简体中文
MLX Direct Decider uses the current application state, a user utterance, and dynamic allowed choices to select a stable business ID with a local model. No-match and abstention are explicit outcomes.
Embed it in an existing tool: open a feature, select a visible item, pause a player, or answer a boolean / enum question. Inference runs on your Mac with an existing checkpoint; no training is required.
Project and package: The project is MLX Direct Decider. The distribution and CLI are
mlx-direct-decider, with Python imports frommlx_direct_decider. Version 0.1 is experimental and has not been published to PyPI.
| Capability | What it means for your application |
|---|---|
| Dynamic choices | Update allowed actions with the page; keep your own stable business IDs. |
| Explicit rejection | Return no_match or abstain when an action is not appropriate. |
| Version protection | Reject stale decisions after state changes; consume execution authorization once. |
| Prefix reuse | Reuse stable context while evaluating every new utterance. Never cache final answers. |
| Small integration surface | Python API, CLI, and a localhost HTTP service. |
Models can make mistakes. Candidate scores rank choices and are not calibrated probabilities of correctness. State guards do not establish semantic correctness.
Requires Apple Silicon, native ARM Python 3.11+, and a local MLX-LM checkpoint. Start with the verified Qwen checkpoint in the model table.
Clone the repository and install:
git clone https://github.com/ItsOdeLeo/MLX-Direct-Decider.git
cd MLX-Direct-Decider
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e '.[mlx]'
export MLX_DIRECT_MODEL=/absolute/path/to/your/local/mlx-model
import os
from mlx_direct_decider import Candidate, DecisionRequest, MLXDecisionEngine
engine = MLXDecisionEngine(os.environ["MLX_DIRECT_MODEL"])
result = engine.decide(DecisionRequest(
state={"focused_window": "notes"},
utterance="Close it",
candidates=(Candidate("close.notes", "Close the open notes window"),),
state_version=1,
))
print(result.status, result.candidate_id)
print(result.margin, result.timing)
The CLI uses the same request contract:
mlx-direct-decider decide --request examples/decision.json
Results include the candidate ID, raw logits, candidate scores, margin, state version, model identity, actual timing, and cache details. See the Python API for booleans, state updates, and versioned execution.
MLXDecisionEngine, with bounded prefix reuse.MLXVLMDecisionEngine or
mlx-direct-decider decide --backend mlx-vlm --image ..., without fine-tuning.Install image support with python -m pip install -e '.[mlx,vlm]'.
Image quick start and real-model checks include Qwen3-VL,
SmolVLM's mistakes, and the Gemma checkpoint loading limitation. VLM requests
currently recompute the full context; the HTTP/game demos still use text state.
See the model guide for checkpoint-specific text coverage.

Qwen3.5-9B · 20 model-selected placements · 6 cleared rows · 600 points. Freshly recorded with the MLX Direct Decider name on October 14, 2026. The GIF shows the complete run at 4× playback, including inference waits. The model chooses from every legal vertical-drop placement using structured board data and rule-computed outcomes; there is no best-move fallback. This is turn-based play, not screenshot understanding or frame-by-frame control.
Run the game locally · Full-speed video · All decisions
This single illustrative development run reached its planned 20-piece limit without retries, browser errors or recording errors. Earlier attempts, including the initial refusal, remain in the historical game report. This is not a held-out game benchmark or a speed claim. Manual play can run on a static server; new AI decisions require the local MLX backend.
11 distinct checkpoints tested locally as of 2026-10-13 · Apple M2 Max · 64 GiB. All use existing model weights, with no additional fine-tuning or decision-specific weights. The table records direct candidate scoring; completed runtime checks and decision accuracy are separate facts.
| Local checkpoint | Backend / input | Recorded validation |
|---|---|---|
Qwen3.5-9B-OptiQ-4bit | MLX-LM · text | Full 28- and 36-case evaluations; 30/36 correct on the extension. |
GLM-4.7-Flash-4bit | MLX-LM · text | Full 28- and 36-case evaluations; 21/36 correct on the extension. |
gemma-4-26b-a4b-it-4bit | MLX-LM · text | Full 28- and 36-case evaluations; 31/36 correct on the extension. |
Qwen3-4B | MLX-LM · text | 3-case development smoke: 1/3 correct; cache parity 3/3 passed. |
NVIDIA-Nemotron-3-Nano-30B-A3B-OptiQ-4bit | MLX-LM · text | 3-case development smoke: 1/3 correct; cache parity 3/3 passed. |
qwen3.6-35b-a3b-mlx-4bit | MLX-LM · text | 3-case development smoke: 3/3 correct; cache parity 3/3 passed. |
gemma-4-e4b-it-4bit | MLX-LM · text; MLX-VLM · image attempt | Text smoke: 2/3 correct, cache parity 3/3 passed. Image path: blocked during model loading. |
Llama-3.2-1B-Instruct-4bit | MLX-LM · text | 3-case development smoke: 0/3 correct; cache parity 3/3 passed. |
Mistral-7B-Instruct-v0.3-mlx-4Bit | MLX-LM · text | 3-case development smoke: 3/3 correct; cache parity 3/3 passed. |
Qwen3-VL-4B-Instruct-4bit | MLX-VLM · text + images | 7 synthetic development cases: 7/7 correct, including image changes, reversed choices and booleans. |
SmolVLM-500M-Instruct-4bit | MLX-VLM · text + images | 7 synthetic development cases: 3/7 correct; mistakes and candidate-order sensitivity recorded. |
The 36-case frozen evaluation, 3-case development checks and 7-case synthetic vision checks use different inputs and should be read within their own scope. The fully evaluated models also returned wrong actions; small smoke checks do not establish general reliability or compatibility with every model in a family.
Text model details and evidence · Image model details and evidence · Full 36-case results
New six-domain evaluation · Apple M2 Max · 64 GiB · 36 fictional English cases.
Documents, calendar drafts, files, music queues, product comparisons, and settings. Three models receive the same frozen inputs, semantic prompt, and threshold, with four output methods each. These are the direct-scoring results:
| Local checkpoint | Exact decisions / 36 | Wrong actions / 30 | Same-page p50 / p95 |
|---|---|---|---|
| Qwen3.5-9B-OptiQ-4bit | 30 / 36 (83.3%) | 1 / 30 | 194.8 / 407.5 ms |
| Gemma 4 26B-A4B MoE | 31 / 36 (86.1%) | 1 / 30 | 168.9 / 556.5 ms |
| GLM-4.7-Flash-4bit | 21 / 36 (58.3%) | 8 / 30 | 170.6 / 330.5 ms |
The 36 cases contain 30 enum requests and six boolean decisions; action errors count enum requests only. Timings require loaded weights and a reusable page prefix. They do not describe startup or arbitrary new pages. See the extended report for every method, rejection and coverage rates, boolean quality, memory, and failures.
Gemma selected the wrong queue item; Qwen selected the wrong longest-battery product. GLM made more action errors. The earlier small sample's zero-error observation did not carry over to new cases. These results do not establish reliable unattended actions, arbitrary-model compatibility, or fixed 100 ms performance.
Apple M2 Max · 64 GiB · 28 fictional English test cases · revised cache runtime.
| Local checkpoint | Exact decisions | Wrong actions / enum requests | Same-page p50 / p95 |
|---|---|---|---|
| Qwen3.5-9B-OptiQ-4bit | 25 / 28 (89.3%) | 0 / 26 | 171.7 / 176.4 ms |
| GLM-4.7-Flash-4bit | 14 / 28 (50.0%) | 2 / 26 | 147.8 / 170.6 ms |
| Gemma 4 26B-A4B MoE · mixed 4/8-bit | 26 / 28 (92.9%) | 1 / 26 | 134.9 / 283.9 ms |
Accuracy includes 26 enum requests and two boolean decisions; action errors count enum requests only. These are separate recorded runs, not inputs to a cross-revision algorithm speedup claim. The Gemma report includes all four methods, three cache conditions, and every failure.
These timings require loaded weights and a reusable page prefix. Qwen's KV-cold p50 was 2,159.9 ms; its first decision after a page update was 1,050.2 ms. About 170 ms is not a per-request guarantee.
Qwen's three original-suite misses include rejection-status distinctions and a tied choice after reordering. Gemma selected the wrong filtered first item; GLM also produced incorrect actions. The original and extended sets are reported separately, not combined into one unseen-test score.
Repeating 28 cases under several cache conditions does not create more independent samples. The historical one-code baseline reached 26/28, slightly better than the direct returned decision. Direct scoring did not dominate every quality and latency metric. A supplementary JSON-format experiment was informed by earlier test results and is explicitly labeled as such.
The full report includes p50/p95, rejection, executable coverage, memory, versions, input sizes, reproduction commands, and original cache failures. Do not combine timings from different code revisions to calculate a speedup. See the testing guide for a step-by-step explanation.
The fictional Morrow Studio desktop demonstrates how to connect allowed actions to real DOM controls, validate state versions, and inspect execution receipts.
Local setup and integration guide · Recorded eight-request walkthrough · Original browser transcript
The static evidence replay reads saved results without a model or server. Clone the repository and open docs/demo/index.html locally; GitHub displays HTML files as source. New requests require the local MLX service. This integration example controls allowlisted buttons in a fictional application; it does not navigate arbitrary websites.
Application state + utterance + allowed choices
│
Official MLX-LM model
│
Final-position candidate logits
│
selected(id) / no_match / abstain
│
Application version check → execution → receipt
Choices map to tokenizer-verified single-token codes, then back to business IDs. Direct scoring reads a causal model's next-token logits without generating a JSON continuation. It retains the official quantized output head. Hybrid caches reuse only complete, valid prefix boundaries.
See the architecture and framework audit. Version 0.1 focuses on English, single-turn, single-step choices. Experimental text + image decisions use the separate MLX-VLM API. General chat, multi-step planning, arbitrary arguments, training, and GPU batching are outside its scope. Chinese documentation does not mean Chinese model behavior has been validated.
Developers evaluating AnyJev, OpenDecider, Laya, or Laya-MLX may also be looking for local action selection, classification, or semantic routing. MLX Direct Decider focuses on existing compatible causal MLX-LM checkpoints on Apple Silicon, with no fine-tuning or separate decision-model weights. Application-defined choices are scored through the original model output head. AnyJev also offers a path without training; the implementations and score semantics differ.
| Project | Documented approach | Relationship to MLX Direct Decider |
|---|---|---|
| AnyJev | A training-free Decider with option rotations and label-prior correction; a separate self-distilled Tacit model path. | Shared use of existing LLMs; MLX Direct Decider provides native MLX scoring and application execution guards, without AnyJev's L0 corrections. |
| OpenDecider | Open-weight System 1 decision models with typed outputs and serving clients. | Related decision-model alternative; MLX Direct Decider uses its own request and execution contracts. |
| Laya · Convai Innovations | Encoder-based models for choice, ordered score, and yes/no questions. | Related typed-decision approach; MLX Direct Decider scores option-token logits from causal language models. |
| Laya-MLX | Independent MLX runtime for Laya's encoder and decision heads on Apple Silicon. | Shared MLX platform and local decision use case; separate model architecture and API. |
Read the AnyJev, OpenDecider, and Laya comparison for source snapshots, integration boundaries, and evaluation considerations. These are related projects, not bundled backends or vendor partnerships.
MLX provides the array and compute framework; MLX-LM runs text models, and the optional MLX-VLM backend runs text/image models. Metal execution is handled by MLX. Image decisions use fresh context; the existing text backend retains prefix reuse. MLX Direct Decider adds application-supplied choices, candidate scoring, rejection outcomes, and versioned execution. Direct decisions read next-token logits for verified single-token option codes without generating a JSON continuation. See the architecture.
The full model still processes the input. Reading final-position logits does not mean running only the final layer or replacing the output head.
Yes. Describe the currently allowed routes or actions as candidates with stable business IDs, supply the application state and user request, and inspect the selected ID. The host application defines and executes the actions. no_match and abstain handle unsuitable or ambiguous requests. See the Python API.
Both reuse existing models without additional training. MLX Direct Decider focuses on native MLX-LM and experimental MLX-VLM inference on Apple Silicon, with dynamic action IDs, prefix reuse for text, and versioned execution. AnyJev's Decider adds option-rotation and label-prior corrections. MLX Direct Decider uses direct candidate scoring; its scores are not calibrated correctness probabilities. See the MLX Direct Decider vs AnyJev comparison.
MLX Direct Decider adds bounded action selection to existing compatible causal MLX-LM checkpoints without fine-tuning or decision-specific weights. AnyJev's Decider also reuses existing LLMs without training and adds corrections for option ordering and label priors. OpenDecider and Laya publish trained decision-model families, and Laya-MLX runs Laya weights. Their users can load published checkpoints without training them themselves. See the decision-model comparison.
Point MLX Direct Decider at a compatible local MLX-LM checkpoint using --model or MLX_DIRECT_MODEL. Its model loader is shared across architectures; each checkpoint still needs a supported model implementation, compatible tokenizer and chat template, accessible logits, and enough memory. Installation does not attach it to other apps or load GGUF models from Ollama. The compatibility guide separates full evaluations, small runtime checks, and untested families.
The homepage model table lists all 11 locally tested checkpoints across Qwen, GLM, Gemma, NVIDIA Nemotron, Llama, Mistral and SmolVLM, including text/image paths and loading failures. The text compatibility guide and multimodal guide retain exact versions, complete results and limits. Full evaluations and small smoke checks are identified separately.
No. Reuse a compatible local MLX-LM checkpoint, or an MLX-VLM checkpoint for experimental image decisions, on an Apple Silicon Mac. No cloud API, extra training, fine-tuning, new decision head, or decision-specific checkpoint is required. If you already have compatible base weights, reuse them. Otherwise obtain those base weights separately and pass their local directory to the engine; the package does not download weights.
Clone ItsOdeLeo/MLX-Direct-Decider, create a native ARM Python 3.11+ environment, and run python -m pip install -e '.[mlx]' from the checkout. Set MLX_DIRECT_MODEL to your local checkpoint directory. Follow the quick start for a runnable example. Version 0.1 is experimental and has not been published to PyPI.
Latency depends on the checkpoint, hardware, input, and reusable prefix. The measured results distinguish loaded weights with a reusable page prefix from startup, cold KV, and page updates. Warm measurements are not a fixed latency guarantee or evidence of reliable unattended execution.
MLX Direct Decider is an independent JEV-inspired project at ItsOdeLeo/MLX-Direct-Decider. It uses existing MLX-LM models, not JEV weights, and does not reproduce unpublished JEV training. Version 0.1 supports English, single-turn, single-step choices; general chat and multi-step planning are outside its scope. Experimental text/image choices are documented in the multimodal guide.
| Guide | Contents |
|---|---|
| Python API | Enum / boolean, result fields, and versioned execution |
| Model compatibility | Checkpoints, quantization, dependencies, licenses, and limits |
| AnyJev, OpenDecider, and Laya comparison | Related decision projects, MLX runtimes, and integration boundaries |
| Evaluation · Results | All baselines, raw evidence, versions, and failures |
| Testing guide | Methodology, results, and reproduction |
| Local HTTP | CLI, service, and actual browser operations |
| Contributing · Releasing | Development, builds, and publication |
python -m pip install -e '.[dev]'
python scripts/check_docs.py
python -m pytest -m 'not model'
python -m ruff check src tests benchmarks scripts examples
Real-model tests require explicitly selected local weights. Run model workloads sequentially. GitHub CI runs core checks and distribution builds on Python 3.11 and 3.13; local MLX inference is verified separately.
Share use cases, reproduction results, and suggestions. Issues, documentation fixes, and new public test cases also support the project.
欧的Leo
X / Twitter · @ItsOdeLeo ↗ · Xiaohongshu · 欧的Leo ↗
Xiaohongshu ID: ItsOdeLeo
Support the project with a star, a share, or a pull request.
MIT. Independently maintained, inspired by TypeSafe AI's JEV, and built on official MLX-LM. No affiliation or endorsement, no JEV weights, and no claim to reproduce unpublished RLCD.
Models and dependencies retain their own licenses; see NOTICE. Recorded evidence retains former project names, source paths, and hashes as explained in results. See the naming research for the candidate name.
Local decisions. Visible evidence. Open source.
Training-free decision engine for existing MLX models on Apple Silicon. No fine-tuning or extra decision weights. MLX-LM + experimental MLX-VLM action selection and semantic routing. Related: AnyJev.
Python
4
38 commits
updated Oct 15, 2026
Your existing compatible MLX model → a local decision engine.
No fine-tuning required. No extra decision-model weights.
MLX Direct Decider is an open-source Python library for training-free decisions from existing MLX models on Apple Silicon Macs. Use it for local LLM action selection, classification, semantic routing, and enum / boolean decisions.
Reuse a compatible MLX-LM checkpoint for text or an MLX-VLM checkpoint for experimental text + image decisions. Supply application state, a natural-language request and allowed choices; receive a stable candidate ID, no_match or abstain. Integrate through a Python API, CLI or local text HTTP service.
No additional fine-tuning, trained decision head or separate decision-model weights are required. The full model processes the prompt normally; the library reads candidate logits from its unchanged original output head without generating a continuation. Compatible base-model weights are still needed.
Quick start · Tested models · Game demo · Measured results · AnyJev & related projects · FAQ · Methodology · Connect & support
English · 简体中文
MLX Direct Decider uses the current application state, a user utterance, and dynamic allowed choices to select a stable business ID with a local model. No-match and abstention are explicit outcomes.
Embed it in an existing tool: open a feature, select a visible item, pause a player, or answer a boolean / enum question. Inference runs on your Mac with an existing checkpoint; no training is required.
Project and package: The project is MLX Direct Decider. The distribution and CLI are
mlx-direct-decider, with Python imports frommlx_direct_decider. Version 0.1 is experimental and has not been published to PyPI.
| Capability | What it means for your application |
|---|---|
| Dynamic choices | Update allowed actions with the page; keep your own stable business IDs. |
| Explicit rejection | Return no_match or abstain when an action is not appropriate. |
| Version protection | Reject stale decisions after state changes; consume execution authorization once. |
| Prefix reuse | Reuse stable context while evaluating every new utterance. Never cache final answers. |
| Small integration surface | Python API, CLI, and a localhost HTTP service. |
Models can make mistakes. Candidate scores rank choices and are not calibrated probabilities of correctness. State guards do not establish semantic correctness.
Requires Apple Silicon, native ARM Python 3.11+, and a local MLX-LM checkpoint. Start with the verified Qwen checkpoint in the model table.
Clone the repository and install:
git clone https://github.com/ItsOdeLeo/MLX-Direct-Decider.git
cd MLX-Direct-Decider
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e '.[mlx]'
export MLX_DIRECT_MODEL=/absolute/path/to/your/local/mlx-model
import os
from mlx_direct_decider import Candidate, DecisionRequest, MLXDecisionEngine
engine = MLXDecisionEngine(os.environ["MLX_DIRECT_MODEL"])
result = engine.decide(DecisionRequest(
state={"focused_window": "notes"},
utterance="Close it",
candidates=(Candidate("close.notes", "Close the open notes window"),),
state_version=1,
))
print(result.status, result.candidate_id)
print(result.margin, result.timing)
The CLI uses the same request contract:
mlx-direct-decider decide --request examples/decision.json
Results include the candidate ID, raw logits, candidate scores, margin, state version, model identity, actual timing, and cache details. See the Python API for booleans, state updates, and versioned execution.
MLXDecisionEngine, with bounded prefix reuse.MLXVLMDecisionEngine or
mlx-direct-decider decide --backend mlx-vlm --image ..., without fine-tuning.Install image support with python -m pip install -e '.[mlx,vlm]'.
Image quick start and real-model checks include Qwen3-VL,
SmolVLM's mistakes, and the Gemma checkpoint loading limitation. VLM requests
currently recompute the full context; the HTTP/game demos still use text state.
See the model guide for checkpoint-specific text coverage.

Qwen3.5-9B · 20 model-selected placements · 6 cleared rows · 600 points. Freshly recorded with the MLX Direct Decider name on October 14, 2026. The GIF shows the complete run at 4× playback, including inference waits. The model chooses from every legal vertical-drop placement using structured board data and rule-computed outcomes; there is no best-move fallback. This is turn-based play, not screenshot understanding or frame-by-frame control.
Run the game locally · Full-speed video · All decisions
This single illustrative development run reached its planned 20-piece limit without retries, browser errors or recording errors. Earlier attempts, including the initial refusal, remain in the historical game report. This is not a held-out game benchmark or a speed claim. Manual play can run on a static server; new AI decisions require the local MLX backend.
11 distinct checkpoints tested locally as of 2026-10-13 · Apple M2 Max · 64 GiB. All use existing model weights, with no additional fine-tuning or decision-specific weights. The table records direct candidate scoring; completed runtime checks and decision accuracy are separate facts.
| Local checkpoint | Backend / input | Recorded validation |
|---|---|---|
Qwen3.5-9B-OptiQ-4bit | MLX-LM · text | Full 28- and 36-case evaluations; 30/36 correct on the extension. |
GLM-4.7-Flash-4bit | MLX-LM · text | Full 28- and 36-case evaluations; 21/36 correct on the extension. |
gemma-4-26b-a4b-it-4bit | MLX-LM · text | Full 28- and 36-case evaluations; 31/36 correct on the extension. |
Qwen3-4B | MLX-LM · text | 3-case development smoke: 1/3 correct; cache parity 3/3 passed. |
NVIDIA-Nemotron-3-Nano-30B-A3B-OptiQ-4bit | MLX-LM · text | 3-case development smoke: 1/3 correct; cache parity 3/3 passed. |
qwen3.6-35b-a3b-mlx-4bit | MLX-LM · text | 3-case development smoke: 3/3 correct; cache parity 3/3 passed. |
gemma-4-e4b-it-4bit | MLX-LM · text; MLX-VLM · image attempt | Text smoke: 2/3 correct, cache parity 3/3 passed. Image path: blocked during model loading. |
Llama-3.2-1B-Instruct-4bit | MLX-LM · text | 3-case development smoke: 0/3 correct; cache parity 3/3 passed. |
Mistral-7B-Instruct-v0.3-mlx-4Bit | MLX-LM · text | 3-case development smoke: 3/3 correct; cache parity 3/3 passed. |
Qwen3-VL-4B-Instruct-4bit | MLX-VLM · text + images | 7 synthetic development cases: 7/7 correct, including image changes, reversed choices and booleans. |
SmolVLM-500M-Instruct-4bit | MLX-VLM · text + images | 7 synthetic development cases: 3/7 correct; mistakes and candidate-order sensitivity recorded. |
The 36-case frozen evaluation, 3-case development checks and 7-case synthetic vision checks use different inputs and should be read within their own scope. The fully evaluated models also returned wrong actions; small smoke checks do not establish general reliability or compatibility with every model in a family.
Text model details and evidence · Image model details and evidence · Full 36-case results
New six-domain evaluation · Apple M2 Max · 64 GiB · 36 fictional English cases.
Documents, calendar drafts, files, music queues, product comparisons, and settings. Three models receive the same frozen inputs, semantic prompt, and threshold, with four output methods each. These are the direct-scoring results:
| Local checkpoint | Exact decisions / 36 | Wrong actions / 30 | Same-page p50 / p95 |
|---|---|---|---|
| Qwen3.5-9B-OptiQ-4bit | 30 / 36 (83.3%) | 1 / 30 | 194.8 / 407.5 ms |
| Gemma 4 26B-A4B MoE | 31 / 36 (86.1%) | 1 / 30 | 168.9 / 556.5 ms |
| GLM-4.7-Flash-4bit | 21 / 36 (58.3%) | 8 / 30 | 170.6 / 330.5 ms |
The 36 cases contain 30 enum requests and six boolean decisions; action errors count enum requests only. Timings require loaded weights and a reusable page prefix. They do not describe startup or arbitrary new pages. See the extended report for every method, rejection and coverage rates, boolean quality, memory, and failures.
Gemma selected the wrong queue item; Qwen selected the wrong longest-battery product. GLM made more action errors. The earlier small sample's zero-error observation did not carry over to new cases. These results do not establish reliable unattended actions, arbitrary-model compatibility, or fixed 100 ms performance.
Apple M2 Max · 64 GiB · 28 fictional English test cases · revised cache runtime.
| Local checkpoint | Exact decisions | Wrong actions / enum requests | Same-page p50 / p95 |
|---|---|---|---|
| Qwen3.5-9B-OptiQ-4bit | 25 / 28 (89.3%) | 0 / 26 | 171.7 / 176.4 ms |
| GLM-4.7-Flash-4bit | 14 / 28 (50.0%) | 2 / 26 | 147.8 / 170.6 ms |
| Gemma 4 26B-A4B MoE · mixed 4/8-bit | 26 / 28 (92.9%) | 1 / 26 | 134.9 / 283.9 ms |
Accuracy includes 26 enum requests and two boolean decisions; action errors count enum requests only. These are separate recorded runs, not inputs to a cross-revision algorithm speedup claim. The Gemma report includes all four methods, three cache conditions, and every failure.
These timings require loaded weights and a reusable page prefix. Qwen's KV-cold p50 was 2,159.9 ms; its first decision after a page update was 1,050.2 ms. About 170 ms is not a per-request guarantee.
Qwen's three original-suite misses include rejection-status distinctions and a tied choice after reordering. Gemma selected the wrong filtered first item; GLM also produced incorrect actions. The original and extended sets are reported separately, not combined into one unseen-test score.
Repeating 28 cases under several cache conditions does not create more independent samples. The historical one-code baseline reached 26/28, slightly better than the direct returned decision. Direct scoring did not dominate every quality and latency metric. A supplementary JSON-format experiment was informed by earlier test results and is explicitly labeled as such.
The full report includes p50/p95, rejection, executable coverage, memory, versions, input sizes, reproduction commands, and original cache failures. Do not combine timings from different code revisions to calculate a speedup. See the testing guide for a step-by-step explanation.
The fictional Morrow Studio desktop demonstrates how to connect allowed actions to real DOM controls, validate state versions, and inspect execution receipts.
Local setup and integration guide · Recorded eight-request walkthrough · Original browser transcript
The static evidence replay reads saved results without a model or server. Clone the repository and open docs/demo/index.html locally; GitHub displays HTML files as source. New requests require the local MLX service. This integration example controls allowlisted buttons in a fictional application; it does not navigate arbitrary websites.
Application state + utterance + allowed choices
│
Official MLX-LM model
│
Final-position candidate logits
│
selected(id) / no_match / abstain
│
Application version check → execution → receipt
Choices map to tokenizer-verified single-token codes, then back to business IDs. Direct scoring reads a causal model's next-token logits without generating a JSON continuation. It retains the official quantized output head. Hybrid caches reuse only complete, valid prefix boundaries.
See the architecture and framework audit. Version 0.1 focuses on English, single-turn, single-step choices. Experimental text + image decisions use the separate MLX-VLM API. General chat, multi-step planning, arbitrary arguments, training, and GPU batching are outside its scope. Chinese documentation does not mean Chinese model behavior has been validated.
Developers evaluating AnyJev, OpenDecider, Laya, or Laya-MLX may also be looking for local action selection, classification, or semantic routing. MLX Direct Decider focuses on existing compatible causal MLX-LM checkpoints on Apple Silicon, with no fine-tuning or separate decision-model weights. Application-defined choices are scored through the original model output head. AnyJev also offers a path without training; the implementations and score semantics differ.
| Project | Documented approach | Relationship to MLX Direct Decider |
|---|---|---|
| AnyJev | A training-free Decider with option rotations and label-prior correction; a separate self-distilled Tacit model path. | Shared use of existing LLMs; MLX Direct Decider provides native MLX scoring and application execution guards, without AnyJev's L0 corrections. |
| OpenDecider | Open-weight System 1 decision models with typed outputs and serving clients. | Related decision-model alternative; MLX Direct Decider uses its own request and execution contracts. |
| Laya · Convai Innovations | Encoder-based models for choice, ordered score, and yes/no questions. | Related typed-decision approach; MLX Direct Decider scores option-token logits from causal language models. |
| Laya-MLX | Independent MLX runtime for Laya's encoder and decision heads on Apple Silicon. | Shared MLX platform and local decision use case; separate model architecture and API. |
Read the AnyJev, OpenDecider, and Laya comparison for source snapshots, integration boundaries, and evaluation considerations. These are related projects, not bundled backends or vendor partnerships.
MLX provides the array and compute framework; MLX-LM runs text models, and the optional MLX-VLM backend runs text/image models. Metal execution is handled by MLX. Image decisions use fresh context; the existing text backend retains prefix reuse. MLX Direct Decider adds application-supplied choices, candidate scoring, rejection outcomes, and versioned execution. Direct decisions read next-token logits for verified single-token option codes without generating a JSON continuation. See the architecture.
The full model still processes the input. Reading final-position logits does not mean running only the final layer or replacing the output head.
Yes. Describe the currently allowed routes or actions as candidates with stable business IDs, supply the application state and user request, and inspect the selected ID. The host application defines and executes the actions. no_match and abstain handle unsuitable or ambiguous requests. See the Python API.
Both reuse existing models without additional training. MLX Direct Decider focuses on native MLX-LM and experimental MLX-VLM inference on Apple Silicon, with dynamic action IDs, prefix reuse for text, and versioned execution. AnyJev's Decider adds option-rotation and label-prior corrections. MLX Direct Decider uses direct candidate scoring; its scores are not calibrated correctness probabilities. See the MLX Direct Decider vs AnyJev comparison.
MLX Direct Decider adds bounded action selection to existing compatible causal MLX-LM checkpoints without fine-tuning or decision-specific weights. AnyJev's Decider also reuses existing LLMs without training and adds corrections for option ordering and label priors. OpenDecider and Laya publish trained decision-model families, and Laya-MLX runs Laya weights. Their users can load published checkpoints without training them themselves. See the decision-model comparison.
Point MLX Direct Decider at a compatible local MLX-LM checkpoint using --model or MLX_DIRECT_MODEL. Its model loader is shared across architectures; each checkpoint still needs a supported model implementation, compatible tokenizer and chat template, accessible logits, and enough memory. Installation does not attach it to other apps or load GGUF models from Ollama. The compatibility guide separates full evaluations, small runtime checks, and untested families.
The homepage model table lists all 11 locally tested checkpoints across Qwen, GLM, Gemma, NVIDIA Nemotron, Llama, Mistral and SmolVLM, including text/image paths and loading failures. The text compatibility guide and multimodal guide retain exact versions, complete results and limits. Full evaluations and small smoke checks are identified separately.
No. Reuse a compatible local MLX-LM checkpoint, or an MLX-VLM checkpoint for experimental image decisions, on an Apple Silicon Mac. No cloud API, extra training, fine-tuning, new decision head, or decision-specific checkpoint is required. If you already have compatible base weights, reuse them. Otherwise obtain those base weights separately and pass their local directory to the engine; the package does not download weights.
Clone ItsOdeLeo/MLX-Direct-Decider, create a native ARM Python 3.11+ environment, and run python -m pip install -e '.[mlx]' from the checkout. Set MLX_DIRECT_MODEL to your local checkpoint directory. Follow the quick start for a runnable example. Version 0.1 is experimental and has not been published to PyPI.
Latency depends on the checkpoint, hardware, input, and reusable prefix. The measured results distinguish loaded weights with a reusable page prefix from startup, cold KV, and page updates. Warm measurements are not a fixed latency guarantee or evidence of reliable unattended execution.
MLX Direct Decider is an independent JEV-inspired project at ItsOdeLeo/MLX-Direct-Decider. It uses existing MLX-LM models, not JEV weights, and does not reproduce unpublished JEV training. Version 0.1 supports English, single-turn, single-step choices; general chat and multi-step planning are outside its scope. Experimental text/image choices are documented in the multimodal guide.
| Guide | Contents |
|---|---|
| Python API | Enum / boolean, result fields, and versioned execution |
| Model compatibility | Checkpoints, quantization, dependencies, licenses, and limits |
| AnyJev, OpenDecider, and Laya comparison | Related decision projects, MLX runtimes, and integration boundaries |
| Evaluation · Results | All baselines, raw evidence, versions, and failures |
| Testing guide | Methodology, results, and reproduction |
| Local HTTP | CLI, service, and actual browser operations |
| Contributing · Releasing | Development, builds, and publication |
python -m pip install -e '.[dev]'
python scripts/check_docs.py
python -m pytest -m 'not model'
python -m ruff check src tests benchmarks scripts examples
Real-model tests require explicitly selected local weights. Run model workloads sequentially. GitHub CI runs core checks and distribution builds on Python 3.11 and 3.13; local MLX inference is verified separately.
Share use cases, reproduction results, and suggestions. Issues, documentation fixes, and new public test cases also support the project.
欧的Leo
X / Twitter · @ItsOdeLeo ↗ · Xiaohongshu · 欧的Leo ↗
Xiaohongshu ID: ItsOdeLeo
Support the project with a star, a share, or a pull request.
MIT. Independently maintained, inspired by TypeSafe AI's JEV, and built on official MLX-LM. No affiliation or endorsement, no JEV weights, and no claim to reproduce unpublished RLCD.
Models and dependencies retain their own licenses; see NOTICE. Recorded evidence retains former project names, source paths, and hashes as explained in results. See the naming research for the candidate name.
Local decisions. Visible evidence. Open source.