MLX local inference

This is the unquantized BF16 MLX version of NeoHorse-1-9B for Apple Silicon. Converted from the original BF16 weights with MLX-LM. No weight quantization is applied; MLX-LM adapts tensor names/layouts and normalization representation for its runtime. Benchmark scores below refer to the original model, not a separate evaluation of this MLX version.

pip install "mlx-lm>=0.31.3"
mlx_lm.chat --model TokenRhythm/NeoHorse-1-9B-MLX

The model downloads automatically from Hugging Face. The original chat template is preserved. See Deployment for local checkpoints, the chat API, and tool calling.

NeoHorse-1-9B

Towards Recursive Self-Improvement via Agentic Post-Training with Routing Harness.

GitHub Company Hugging Face Twitter / X License: Apache-2.0

Technical Report

NeoHorse-1-9B is a 9B causal language model and an initial prototype on the path toward recursive self-improvement (RSI). It is post-trained from Qwen3.5-9B for text-based agent harnesses, tool use, coding, and instruction following.

Derived from Qwen/Qwen3.5-9B and fine-tuned by TokenRhythm. The source checkpoint was repackaged for text-only inference. This repository contains language-model weights only, converted to MLX BF16 without weight quantization.

NeoHorse-1-9B evaluation results

Highlights

  • Path toward RSI: the routing harness assigns tasks to a heterogeneous model pool, records tool interactions and outcomes, estimates capability demand, and uses capability-level feedback to shape the next training mixture. Updated models can return to the harness, closing a prototype evaluation–selection–update loop; extending this loop across successive iterations is the next step toward RSI.
  • Agentic post-training framework: the associated research explores routing-guided curriculum SFT and routing-guided on-policy distillation to turn execution trajectories into training signal while preserving execution and harness context around each response.
  • Data quality: exact and near-duplicate removal, evaluation decontamination, structural validation, six-dimensional semantic evaluation, and subscene-level Scene/Goal/Outcome labeling.
  • Broad gains: 69.04 macro average across ten benchmarks versus 65.60 for Qwen3.5-9B (+3.44).

Model Details

Property Value
Model family NeoHorse Agent-Native Causal Language Model
Parameters Approximately 9B
Base model Qwen3.5-9B
Post-training Routing-guided agentic post-training
Interface Text input and text output
Context length 262,144 natively and extensible up to 1,010,000 tokens.
Weight format / precision MLX Safetensors / BF16 (unquantized)

Evaluation

The 9B track compares NeoHorse-1-9B with five representative open-weight baselines: Granite-4.2-8B, Qwen3.5-9B, Ornith-1.5-9B, Gemma-4-12B-it, and Muse-Glimmer-30B. Results cover ten benchmarks and are grouped by capability. Higher is better; Δ is NeoHorse-1-9B minus Qwen3.5-9B. Bold and underline mark the best and second-best results in each benchmark row, respectively; ties share the same formatting.

Benchmark Granite-4.2-8B Qwen3.5-9B Ornith-1.5-9B Gemma-4-12B-it Muse-Glimmer-30B NeoHorse-1-9B Δ vs Qwen3.5-9B
🤖 Agentic
QwenClawBench
37.01
44.04
47.27
43.53
46.11
48.73
+4.69
WorkBuddy Bench
35.07
39.60
29.29
29.65
45.85
40.15
+0.55
PinchBench
56.93
74.55
68.22
58.89
71.35
82.25
+7.70
VitaBench
23.00
31.25
26.75
36.50
48.50
42.25
+11.00
BFCL v4
52.06
64.88
65.03
62.06
53.74
67.43
+2.55
tau2-Bench
62.28
88.04
83.68
59.37
76.64
90.82
+2.78
💻 Coding
HumanEval
96.34
92.68
93.90
100.00
98.17
98.17
+5.49
LiveCodeBench v6
72.00
65.14
47.43
73.14
65.71
65.14
+0.00
📚 Instruction Following
IFBench
78.00
66.33
40.00
77.67
78.67
66.33
+0.00
IFEval
92.98
89.46
71.35
94.27
93.90
89.09
-0.37
📊 Overall
Ten-benchmark average
60.57
65.60
57.29
63.51
67.86
69.04
+3.44

Reported protocol: SGLang v0.5.17 · temperature=1.0 · top_p=0.95 · top_k=20 · min_p=0.0 · presence_penalty=1.5 · repetition_penalty=1.0 · thinking mode enabled with enable_thinking=true and force_nonempty_content=true. QwenClawBench, WorkBuddy Bench, and tau2-Bench use three runs; PinchBench and VitaBench use one run; the remaining benchmarks follow their official protocols. VitaBench uses the DeepSeek-V4-Flash simulator and judge.

Deployment

Use MLX-LM on an Apple Silicon Mac to run this checkpoint.

Install and select a local checkpoint

pip install "mlx-lm>=0.31.3"
MODEL_PATH="/path/to/NeoHorse-1-9B-MLX"

Set MODEL_PATH to the downloaded MLX directory containing config.json, tokenizer files, chat_template.jinja, and model weights. You can also use TokenRhythm/NeoHorse-1-9B-MLX as the model path to download it automatically from Hugging Face.

Chat locally

mlx_lm.chat --model "$MODEL_PATH"

Start an API server

mlx_lm.server \
  --model "$MODEL_PATH" \
  --host 127.0.0.1 \
  --port 8080

The server exposes an OpenAI-compatible /v1/chat/completions endpoint. In the requests below, default_model refers to the checkpoint selected with --model.

Basic Usage

After the server starts, run this request in another terminal:

curl http://127.0.0.1:8080/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "default_model",
    "messages": [
      {"role": "user", "content": "Write a Python function that returns the first n Fibonacci numbers."}
    ],
    "max_tokens": 2048,
    "stream": false
  }'

The generated reply is returned in choices[0].message.content.

Tool Calling

Pass function definitions in the tools field:

curl http://127.0.0.1:8080/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "default_model",
    "messages": [
      {"role": "user", "content": "Use get_weather to check the current weather in Beijing in celsius."}
    ],
    "tools": [
      {
        "type": "function",
        "function": {
          "name": "get_weather",
          "description": "Get the current weather for a city.",
          "parameters": {
            "type": "object",
            "properties": {
              "city": {"type": "string", "description": "City name."},
              "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
            },
            "required": ["city", "unit"]
          }
        }
      }
    ],
    "max_tokens": 2048,
    "stream": false
  }'

MLX-LM reads the preserved chat template to format tool requests and parse generated calls. When the model chooses to call a tool, the call is returned in choices[0].message.tool_calls. Your application executes the function, appends the assistant message and a role: "tool" result with the matching tool_call_id, then sends the conversation back to the same endpoint for the final answer.

License

NeoHorse-1-9B is released under the Apache License 2.0.

The upstream model is Qwen/Qwen3.5-9B. Its original copyright notice, Copyright 2026 Alibaba Cloud, is retained in the license file. TokenRhythm fine-tuned and repackaged the source checkpoint for text-only inference. This repository provides its MLX BF16 conversion without weight quantization.

Citation

@misc{neohorse2026,
  title        = {NeoHorse-1: Towards Recursive Self-Improvement via Agentic Post-Training with Routing Harness},
  author       = {NeoHorse Team},
  year         = {2026},
  howpublished = {arXiv preprint},
  eprint       = {2609.08183},
  archivePrefix = {arXiv},
  primaryClass = {cs.CL},
  url          = {https://arxiv.org/abs/2609.08183}
}

For questions or issue reports, use the NeoHorse project repository.

Downloads last month
-
Safetensors
Model size
9B params
Tensor type
BF16
·
MLX
Hardware compatibility
Log In to add your hardware

Quantized

Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for TokenRhythm/NeoHorse-1-9B-MLX

Finetuned
Qwen/Qwen3.5-9B
Finetuned
(1)
this model

Collection including TokenRhythm/NeoHorse-1-9B-MLX

Paper for TokenRhythm/NeoHorse-1-9B-MLX