Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NeoHorse-1

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

Hugging Face Company Twitter / X License: Apache-2.0

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

The routing harness assigns tasks to a heterogeneous model pool, records tool interactions and outcomes, estimates capability demand, and feeds capability-level feedback into the next training mixture. Updated models can return to the harness, forming a prototype evaluation–selection–update loop; extending this loop across successive iterations is the next step toward RSI.

News

  • [2026-09-08] 📦 GGUF and quantized models on Hugging Face! We release NeoHorse-1-4B-GGUF and NeoHorse-1-9B-GGUF. Both include 16-bit (BF16) weights and smaller 8-bit, 5-bit, and 4-bit quantized versions that use less disk space and memory, making it easier to run NeoHorse on your own hardware.

  • [2026-09-08] 🚀 Now on ModelScope! NeoHorse-1-4B and NeoHorse-1-9B are now available on ModelScope.

  • [2026-09-07] 🎉 NeoHorse-1 is here! We release NeoHorse-1-4B and NeoHorse-1-9B under the Apache 2.0 license.

NeoHorse-1-4B evaluation results

NeoHorse-1-9B evaluation results

Highlights

  • Agentic post-training framework: routing-guided curriculum SFT and routing-guided on-policy distillation turn execution trajectories into training signal while preserving execution and harness context.
  • Data quality: exact and near-duplicate removal, evaluation decontamination, structural validation, six-dimensional semantic evaluation, and subscene-level Scene/Goal/Outcome labeling.
  • Two release sizes: 4B for a lighter local deployment footprint and 9B for higher capacity on the same text-first serving interface.

Model Downloads

Checkpoint Parameters Hugging Face ModelScope Base model
NeoHorse-1-4B ~4B NeoHorse-1-4B NeoHorse-1-4B Qwen3.5-4B
NeoHorse-1-9B ~9B NeoHorse-1-9B NeoHorse-1-9B Qwen3.5-9B

Both checkpoints are released as text input/text output language-model weights for self-hosted inference. Each model card contains its model-specific evaluation table and deployment notes.

Model Details

PropertyNeoHorse-1-4BNeoHorse-1-9B
Model familyNeoHorse Agent-Native Causal Language ModelNeoHorse Agent-Native Causal Language Model
ParametersApproximately 4BApproximately 9B
Post-trainingRouting-guided agentic post-trainingRouting-guided agentic post-training
InterfaceText input and text outputText input and text output
Context length262,144 natively; base capability extensible up to 1,010,000 tokens262,144 natively; base capability extensible up to 1,010,000 tokens
Weight format / precisionSafetensors / BF16Safetensors / BF16

Evaluation

The tables report the ten-benchmark protocol from the technical report. Results are grouped by capability. Higher is better; Δ is NeoHorse minus the same-size Qwen baseline. Bold marks the best result in each benchmark row; ties share the same formatting.

4B track

The 4B comparison includes four representative open-weight baselines.

BenchmarkQwen3.5-4BGemma-4-E4B-itNanbeige-4.2-3BAgents-A1-4BNeoHorse-1-4BΔ vs Qwen3.5-4B
🤖 Agentic
QwenClawBench38.4722.9840.6643.1644.68+6.21
WorkBuddy Bench24.6211.6521.0333.3734.41+9.79
PinchBench71.1947.6066.7875.0777.33+6.14
VitaBench21.505.0031.5039.2532.00+10.50
BFCL v461.0247.1867.2846.6061.79+0.77
tau2-Bench84.2943.6085.0881.0088.46+4.17
💻 Coding
HumanEval87.2084.7698.7892.6896.95+9.75
LiveCodeBench v653.7152.0072.50*56.5759.43+5.72
📚 Instruction Following
IFBench60.3340.0055.0063.3365.33+5.00
IFEval87.0674.6884.4783.5588.35+1.29
📊 Overall
Ten-benchmark average58.9442.9562.3161.4664.87+5.93

9B track

The 9B comparison includes five representative open-weight baselines from the technical report. Underline marks the second-best result in each benchmark row.

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
QwenClawBench37.0144.0447.2743.5346.1148.73+4.69
WorkBuddy Bench35.0739.6029.2929.6545.8540.15+0.55
PinchBench56.9374.5568.2258.8971.3582.25+7.70
VitaBench23.0031.2526.7536.5048.5042.25+11.00
BFCL v452.0664.8865.0362.0653.7467.43+2.55
tau2-Bench62.2888.0483.6859.3776.6490.82+2.78
💻 Coding
HumanEval96.3492.6893.90100.0098.1798.17+5.49
LiveCodeBench v672.0065.1447.4373.1465.7165.14+0.00
📚 Instruction Following
IFBench78.0066.3340.0077.6778.6766.33+0.00
IFEval92.9889.4671.3594.2793.9089.09-0.37
📊 Overall
Ten-benchmark average60.5765.6057.2963.5167.8669.04+3.44

* Nanbeige-4.2-3B LiveCodeBench v6 result is reported from its official blog post or technical report.

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

These examples serve a checkpoint downloaded to local disk. Set MODEL_PATH to the directory containing config.json, tokenizer files, and weights. The request model value is the served alias (neohorse-1-4B or neohorse-1-9B), not the filesystem path.

SGLang

pip install "sglang==0.5.17"
MODEL_PATH="/path/to/NeoHorse-1-4B"  # or /path/to/NeoHorse-1-9B
python3 -m sglang.launch_server \
  --model-path "$MODEL_PATH" \
  --served-model-name neohorse-1-4B \
  --host 0.0.0.0 --port 30000 \
  --context-length 262144 \
  --reasoning-parser qwen3 \
  --tool-call-parser qwen3_coder

vLLM

pip install -U vllm
MODEL_PATH="/path/to/NeoHorse-1-4B"  # or /path/to/NeoHorse-1-9B
vllm serve "$MODEL_PATH" \
  --served-model-name neohorse-1-4B \
  --host 0.0.0.0 --port 8000 \
  --max-model-len 262144 \
  --reasoning-parser qwen3 \
  --enable-auto-tool-choice \
  --tool-call-parser qwen3_coder

The 262,144-token setting is a configured limit; actual capacity depends on GPU memory and serving settings. Reduce it if needed.

The examples below target vLLM at http://127.0.0.1:8000. For SGLang, use http://127.0.0.1:30000. For the 9B checkpoint, use --model neohorse-1-9B and launch the server with --served-model-name neohorse-1-9B.

Send a Request

Install the client dependency:

pip install requests

Run the provided chat example from the repository root:

python examples/chat.py \
  --url http://127.0.0.1:8000 \
  --model neohorse-1-4B

This example sends a predefined prompt to the deployed model and prints the generated response.

Alternatively, send an OpenAI-compatible request directly:

curl http://127.0.0.1:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"neohorse-1-4B","messages":[{"role":"user","content":"Write a Python function that returns the first n Fibonacci numbers."}],"max_tokens":512}'

Tool Calling

Run the provided tool-calling example from the repository root:

python examples/tool_call.py \
  --url http://127.0.0.1:8000 \
  --model neohorse-1-4B

This example sends a predefined weather query and prints the tool call generated by the model.

License

NeoHorse-1 is released under the Apache License 2.0. The upstream models are Qwen3.5-4B and Qwen3.5-9B.

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}
}

About

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

Topics

Resources

Stars

22 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors