Aloha! 🌺 Ornith is a family of self-improving open-source models for agentic tasks. This repo covers both generations:
- 🐦 Ornith-1.5 (latest) — extends self-scaffolding into a complete end-to-end self-improvement loop: the model proposes new tasks, generates task-specific scaffolds, and produces solution rollouts for reinforcement learning. Model weights at HuggingFace, and more details can be found at blog.
- 🐦 Ornith-1.0 — the first release, which jointly optimizes the scaffold and the resulting solution rollouts. Model weights at HuggingFace, and more details can be found at blog.
Both generations are MIT licensed, globally accessible, and free from regional limitations.
Benchmarks
397B
| Ornith-1.5-397B | Ornith-1.0-397B | DeepSeek-V4-Flash-0731 (284B) | GLM-5.2 (753B) | Claude Opus 4.8 | Kimi K3 (2.8T) | |
|---|---|---|---|---|---|---|
| Coding | ||||||
| Terminal-Bench 2.1 (Terminus-2) | 86.1 | 77.5 | 82.7 | 81 | 85 | 88.3 |
| Terminal-Bench 2.1 (Claude Code) | 85.2 | 78.2 | 81.8 | 82.7 | 78.9 | - |
| SWE-bench Verified | 86 | 82.4 | 81.6 | 83 | 85.8 | 86.2 |
| SWE-bench Pro | 65.1 | 62.2 | 64.4 | 62.1 | 68 | - |
| SWE-bench Multilingual | 79.6 | 78.9 | 77.9 | 78.4 | 75.7 | - |
| DeepSWE | 56 | 8 | 54.4 | 46.2 | 59 | 67.5 |
| Frontier-Bench v0.1 | 13.5 | 2.7 | 6.1 | 5.1 | 21.1 | 23 |
| NL2Repo | 59.5 | 48.2 | 54.2 | 48.9 | 69.7 | - |
| SWE Atlas - QnA | 55.6 | 41.2 | 51.6 | 50 | 59.7 | 59.7 |
| Reasoning | ||||||
| HLE (no tools) | 44.6 | 30.2 | 35 | 40.5 | 49.8 | 43.5 |
| HLE (with tools) | 56.1 | 47.5 | 50.8 | 54.7 | 57.9 | 56 |
| GPQA Diamond | 92.8 | 88.1 | 91.4 | 91.2 | 93.6 | 93.5 |
| Agentic | ||||||
| MCP-Atlas | 80 | 76.4 | 74.6 | 77.8 | 82.2 | 82.3 |
| Toolathlon-Verified | 71.2 | 43.2 | 70.3 | 48.2 | 76.2 | 73.2 |
| WideSearch | 80.8 | 75.2 | 77.3 | 79 | 72.9 | - |
| BrowseComp | 86.6 | 79.7 | 84.8 | 85.6 | 84.3 | 91.2 |
| ClawEval | 81.4 | 77.1 | 77.6 | 78.8 | 80.2 | - |
35B-A3B
| Ornith-1.5-35B-A3B | Ornith-1.0-35B-A3B | Qwen3.6-35B-A3B | Gemma4-31B (dense) | Muse-Glimmer-30B (dense) | Qwen3.5-397B | |
|---|---|---|---|---|---|---|
| Coding | ||||||
| Terminal-Bench 2.1 (Terminus-2) | 67.8 | 64.2 | 52.5 | 42.1 | 51.7 | 53.5 |
| Terminal-Bench 2.1 (Claude Code) | 68.5 | 62.8 | 49.2 | - | - | 48.6 |
| SWE-bench Verified | 79 | 75.6 | 73.4 | 52 | 76 | 76.4 |
| SWE-bench Pro | 59.6 | 50.4 | 49.5 | 35.7 | 51.2 | 51.6 |
| SWE-bench Multilingual | 71.4 | 69.3 | 67.2 | 51.7 | - | 69.3 |
| DeepSWE | 22 | 0 | 0 | - | - | 1 |
| Frontier-Bench v0.1 | 5.1 | 1.4 | 1.4 | - | - | 1.4 |
| NL2Repo | 46.2 | 34.6 | 29.4 | 15.5 | - | 36.8 |
| SWE Atlas - QnA | 39.8 | 37.1 | 15.5 | - | - | 20.4 |
| Reasoning | ||||||
| HLE (no tools) | 25.6 | 20.8 | 21.4 | 19.5 | 22 | 28.7 |
| HLE (with tools) | 33.4 | 30.1 | 28.9 | 26.5 | - | 48.3 |
| GPQA Diamond | 89.2 | 86.2 | 86 | 84.3 | 83.5 | 88.4 |
| Agentic | ||||||
| MCP-Atlas | 70.2 | 64.4 | 62.8 | 55 | 75.5 | 72.3 |
| Toolathlon-Verified | 48.7 | 42.4 | 41.7 | 40.8 | - | 38.3 |
| WideSearch | 67.8 | 63.4 | 60.1 | 54.2 | - | 74 |
| BrowseComp | 67.6 | 63.5 | 62 | - | - | 78.6 |
| ClawEval | 72.5 | 69.8 | 68.7 | 48.5 | - | 70.7 |
9B
| Ornith-1.5-9B | Ornith-1.0-9B | Qwen3.5-9B | Qwen3.6-35B-A3B | Gemma4-31B (dense) | |
|---|---|---|---|---|---|
| Coding | |||||
| Terminal-Bench 2.1 (Terminus-2) | 46.2 | 43.1 | 21.3 | 52.5 | 42.1 |
| Terminal-Bench 2.1 (Claude Code) | 47 | 40.6 | 18.9 | 49.2 | - |
| SWE-bench Verified | 70.6 | 69.4 | 53.2 | 73.4 | 52 |
| SWE-bench Pro | 47.5 | 42.9 | 31.3 | 49.5 | 35.7 |
| SWE-bench Multilingual | 54.4 | 52 | 39.7 | 67.2 | 51.7 |
| NL2Repo | 32.4 | 27.2 | 16.2 | 29.4 | 15.5 |
| SWE Atlas - QnA | 20.6 | 17.9 | 9.2 | 15.5 | - |
| Reasoning | |||||
| HLE (no tools) | 20.2 | 16.8 | 14.7 | 21.4 | 19.5 |
| HLE (with tools) | 30.5 | 26.4 | 24.5 | 28.9 | 26.5 |
| GPQA Diamond | 86.4 | 82.5 | 81.7 | 86 | 84.3 |
| Agentic | |||||
| MCP-Atlas | 54.2 | 49.4 | 46.8 | 62.8 | 55 |
| Toolathlon-Verified | 41.2 | 33.4 | 29.6 | 41.7 | 52.8 |
| WideSearch | 59.5 | 55.8 | 53.6 | 60.1 | 54.2 |
| BrowseComp | 56.4 | 44.8 | 41.5 | 62 | - |
| ClawEval | 66.5 | 63.1 | 53.2 | 68.7 | 48.5 |
* All results reported for Ornith-1.5 are averaged over five independent runs.
* Terminal-Bench 2.1 (Terminus-2): evaluated with the Harbor/Terminus-2 framework, parser=json, temperature=1.0, top_p=1.0, 128K context window. Each run uses a 4-hour timeout with 32 CPU cores and 48GB RAM, averaged over 5 runs. We adjust the Qwen chat template to keep training and inference consistent and modify Harbor to align with vLLM's reasoning_content key.
* Terminal-Bench 2.1 (Claude Code): evaluated with Claude Code 2.1.126, parser=json, temperature=1.0, top_p=1.0, max_new_tokens=131072, averaged over 5 runs (Qwen chat template likewise modified).
* SWE-bench Verified / Pro / Multilingual: OpenHands harness, temp=1.0, top_p=0.95, 256K context window. Anti-hacking safeguards applied throughout: Git history is removed from the local repository image to prevent access to prior solutions or commits, and network access is disabled.
* DeepSWE: Claude Code harness, temperature=1.0, top_p=0.95, 256K context window.
* SWE Atlas QnA: mini-SWE-agent harness, temp=1.0, top_p=0.95, 128K context window, averaged over 5 runs.
* NL2Repo: temperature=1.0, top_p=1.0, 400K context, 48K output. Access to specified GitHub repositories and pip packages is blocked to prevent reward hacking.
* HLE: evaluated using Claude 4.6 Opus as the judge model.
* MCP-Atlas: all models evaluated in thinking mode on the 500-task public subset, 10-minute timeout per task, Claude 4.8 Opus as the judge model.
* Toolathlon-Verified: official evaluation service with the maximum token limit set to 128K.
* ClawEval: an agentic code benchmark over real-user task distributions; temp=0.6, 256K context.
Quickstart
NOTE
Ornith models (1.0 and 1.5) are reasoning models: by default the assistant turn opens with a
<think> … </think>block before the final answer. The serving recipes below enable a reasoning parser so the chain-of-thought is returned in a separatereasoning_contentfield, and a tool-call parser so the model's<tool_call>blocks are surfaced as OpenAI-styletool_calls.Serving Ornith requires recent runtimes:
- Transformers ≥ 5.8.1
- vLLM ≥ 0.19.1
- SGLang ≥ 0.5.9
Recommended sampling parameters:
- For general tasks:
temperature=1.0,top_p=0.95,top_k=20,min_p=0.0,presence_penalty=1.5,repetition_penalty=1.0- For precise coding tasks:
temperature=0.6,top_p=0.95,top_k=20,min_p=0.0,presence_penalty=0.0,repetition_penalty=1.0
Serving Ornith
Both generations ship as a dense 9B model plus two Mixture-of-Experts models (35B, 397B). All checkpoints expose the same OpenAI-compatible interface and support a 256K (262,144-token) context window; the dense 9B fits on a single 80GB GPU, while the MoE checkpoints are sharded across a multi-GPU node with tensor parallelism.
Ornith-1.5 checkpoints (latest):
| Checkpoint | Architecture | Format | Best for |
|---|---|---|---|
| Ornith-1.5-9B | Dense (~9B) | bf16 | Single-GPU serving & fine-tuning |
| Ornith-1.5-9B-GGUF | Dense (~9B) | GGUF (quantized) | Local inference via llama.cpp / Ollama |
| Ornith-1.5-9B-MLX | Dense (~9B) | MLX | Local inference on Apple Silicon |
| Ornith-1.5-9B-MLX (4bit / 6bit / 8bit) | Dense (~9B) | MLX (quantized) | Local inference on Apple Silicon via MLX |
| Ornith-1.5-35B-A3B | MoE (35B-A3B) | bf16 | Full-precision multi-GPU serving |
| Ornith-1.5-35B-A3B-FP8 | MoE (35B-A3B) | FP8 | ~Half the VRAM on FP8-capable GPUs |
| Ornith-1.5-35B-A3B-NVFP4 | MoE (35B-A3B) | NVFP4 | 4-bit serving on NVIDIA Blackwell GPUs |
| Ornith-1.5-35B-A3B-GGUF | MoE (35B-A3B) | GGUF (quantized) | Local inference via llama.cpp / Ollama |
| Ornith-1.5-35B-A3B-MLX | MoE (35B-A3B) | MLX | Local inference on Apple Silicon |
| Ornith-1.5-35B-A3B-MLX (4bit / 6bit / 8bit) | MoE (35B-A3B) | MLX (quantized) | Local inference on Apple Silicon via MLX |
| Ornith-1.5-397B | MoE (397B) | bf16 | Full-precision serving on a multi-GPU node |
| Ornith-1.5-397B-FP8 | MoE (397B) | FP8 | Memory-efficient serving on FP8-capable GPUs |
| Ornith-1.5-397B-NVFP4 | MoE (397B) | NVFP4 | 4-bit serving on NVIDIA Blackwell GPUs |
| Ornith-1.5-397B-GGUF | MoE (397B) | GGUF (quantized) | Local inference via llama.cpp / Ollama |
Ornith-1.0 checkpoints:
| Checkpoint | Architecture | Format | Best for |
|---|---|---|---|
| Ornith-1.0-9B | Dense (~9B) | bf16 | Single-GPU serving & fine-tuning |
| Ornith-1.0-9B-GGUF | Dense (~9B) | GGUF (quantized) | Local inference via llama.cpp / Ollama |
| Ornith-1.0-35B | MoE (35B) | bf16 | Full-precision multi-GPU serving |
| Ornith-1.0-35B-FP8 | MoE (35B) | FP8 | ~Half the VRAM on FP8-capable GPUs |
| Ornith-1.0-35B-GGUF | MoE (35B) | GGUF (quantized) | Local inference via llama.cpp / Ollama |
| Ornith-1.0-397B | MoE (397B) | bf16 | Full-precision serving on a multi-GPU node |
| Ornith-1.0-397B-FP8 | MoE (397B) | FP8 | Memory-efficient serving on FP8-capable GPUs |
The recipes below stand up an OpenAI-compatible server under the shared alias Ornith-1.5 (swap 1.5 for 1.0 everywhere to serve the previous generation). Set MODEL to the checkpoint you want, and match --tensor-parallel-size / --tp to your GPU count.
vLLM
# Pick a checkpoint — dense 9B, or MoE 35B / 397B (use Ornith-1.0-*-FP8 for lower-VRAM serving): MODEL=deepreinforce-ai/Ornith-1.5-397B # MoE checkpoints (35B / 397B): shard across the node with tensor parallelism. # Dense checkpoint (9B): fits on a single 80GB GPU — drop --tensor-parallel-size. vllm serve $MODEL \ --served-model-name Ornith-1.5 \ --tensor-parallel-size 8 \ --host 0.0.0.0 --port 8000 \ --max-model-len 262144 \ --gpu-memory-utilization 0.90 \ --enable-prefix-caching \ --enable-auto-tool-choice --tool-call-parser qwen3_xml \ --reasoning-parser qwen3 \ --trust-remote-code
SGLang
# Pick a checkpoint — dense 9B, or MoE 35B / 397B (use Ornith-1.0-*-FP8 for lower-VRAM serving): MODEL=deepreinforce-ai/Ornith-1.5-397B # MoE checkpoints (35B / 397B): shard with --tp ; dense 9B: drop --tp for a single GPU. python -m sglang.launch_server \ --model-path $MODEL \ --served-model-name Ornith-1.5 \ --tp 8 \ --host 0.0.0.0 --port 8000 \ --context-length 262144 \ --mem-fraction-static 0.85 \ --tool-call-parser qwen3_coder \ --reasoning-parser qwen3
For Long-Context
Ornith-1.5 and Ornith-1.0 series models handle context windows of up to 262,144 tokens. When a task's combined input and output must go beyond this limit, we suggest extending the effective window with RoPE scaling — YaRN is the technique we validate against, and it is already built into both vLLM and SGLang. With a scaling factor of 4.0, the usable window grows to roughly 1M tokens.
You can turn YaRN on in either of two ways:
-
Edit the checkpoint's
config.json. Add arope_scalingblock to the model configuration:{ "rope_scaling": { "rope_type": "yarn", "factor": 4.0, "original_max_position_embeddings": 262144 } } -
Override at launch time. Leave the checkpoint untouched and extend the serve commands above with the equivalent flags.
vLLM:
VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 vllm serve ornith-ai/Ornith-1.5-9B ... --hf-overrides '{"rope_scaling": {"rope_type": "yarn", "factor": 4.0, "original_max_position_embeddings": 262144}}' --max-model-len 1000000SGLang:
SGLANG_ALLOW_OVERWRITE_LONGER_CONTEXT_LEN=1 python -m sglang.launch_server ... --json-model-override-args '{"rope_scaling": {"rope_type": "yarn", "factor": 4.0, "original_max_position_embeddings": 262144}}' --context-length 1000000
NOTE
Open-source runtimes implement YaRN statically: the same scaling factor is applied to every request regardless of its length, which can slightly hurt quality on ordinary-length inputs. Only enable
rope_scalingwhen your workload genuinely needs the longer window, and sizefactorto match it — the target window is roughlyfactor× 262,144, so if your requests top out around 524,288 tokens,factor: 2.0is the better setting.
Using Ornith via the Chat Completions API
Once a vLLM or SGLang server is running, talk to it with any OpenAI-compatible client.
Basic Usage
from openai import OpenAI client = OpenAI( base_url="http://localhost:8000/v1", api_key="EMPTY", # any non-empty string works for a local server ) response = client.chat.completions.create( model="Ornith-1.5", messages=[ {"role": "user", "content": "Write a one-line Python lambda that squares a number."} ], temperature=0.6, top_p=0.95, max_tokens=1024, ) message = response.choices[0].message # reasoning_content holds the <think> trace; content holds the final answer. print("reasoning:", getattr(message, "reasoning_content", None)) print("answer:", message.content)
You can also stream tokens, or hand the model tools — Ornith emits well-formed function calls that the server parses into the standard tool_calls field:
tools = [ { "type": "function", "function": { "name": "get_weather", "description": "Get the current weather for a city", "parameters": { "type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"], }, }, } ] response = client.chat.completions.create( model="Ornith-1.5", messages=[{"role": "user", "content": "What is the weather in Paris right now?"}], tools=tools, tool_choice="auto", temperature=0.6, max_tokens=2048, ) tool_call = response.choices[0].message.tool_calls[0] print(tool_call.function.name, tool_call.function.arguments) # -> get_weather {"city": "Paris"}
You can point any OpenAI-compatible SDK (Python, Node.js, etc.) or curl at the same /v1/chat/completions endpoint.
Agentic Usage
Ornith models excel in tool-calling and agentic coding capabilities.
Agent Frameworks
Because Ornith exposes an OpenAI-compatible endpoint with tool calling, it works out of the box with standard agent frameworks. Below is a minimal example that connects Ornith to tools through an MCP server.
import os from openai import OpenAI client = OpenAI( base_url=os.getenv("OPENAI_BASE_URL", "http://localhost:8000/v1"), api_key=os.getenv("OPENAI_API_KEY", "EMPTY"), ) tools = [ { "type": "function", "function": { "name": "run_shell", "description": "Run a shell command and return its output.", "parameters": { "type": "object", "properties": { "command": {"type": "string", "description": "The command to run"} }, "required": ["command"], }, }, } ] messages = [{"role": "user", "content": "List the Python files in the current directory."}] response = client.chat.completions.create( model="Ornith-1.5", messages=messages, tools=tools, temperature=0.6, top_p=0.95, ) print(response.choices[0].message)
Examples of using Ornith with agent harness:
Hermes Agent
# Hermes talks to any OpenAI-compatible endpoint — point it at your Ornith server. export OPENAI_BASE_URL="http://localhost:8000/v1" export OPENAI_API_KEY="EMPTY" export MODEL="Ornith-1.5"
OpenHands
pip install openhands-ai # OpenHands routes through LiteLLM; the "openai/" prefix selects the OpenAI-compatible path. export LLM_MODEL="openai/Ornith-1.5" export LLM_BASE_URL="http://localhost:8000/v1" export LLM_API_KEY="EMPTY" # Launch the CLI (or run the official OpenHands Docker image with the same env vars). openhands
llama.cpp / Ollama
# Both runtimes load a GGUF build — currently published for the Ornith-1.0 9B and 35B checkpoints (swap -9B for -35B). # llama.cpp — serve an OpenAI-compatible API on port 8000. llama-server -hf deepreinforce-ai/Ornith-1.0-9B-GGUF --port 8000 -c 262144 # Ollama — pull and chat with the same GGUF straight from Hugging Face. ollama run hf.co/deepreinforce-ai/Ornith-1.0-9B-GGUF
Unsloth Studio
pip install unsloth # Load Ornith for fast local inference or fine-tuning (Python): # from unsloth import FastLanguageModel # model, tokenizer = FastLanguageModel.from_pretrained( # "deepreinforce-ai/Ornith-1.5-9B", # or Ornith-1.0-9B # max_seq_length=262144, # load_in_4bit=True, # )
OpenClaw
# OpenClaw talks to any OpenAI-compatible endpoint — point it at your Ornith server. export OPENAI_BASE_URL="http://localhost:8000/v1" export OPENAI_API_KEY="EMPTY" export OPENAI_MODEL="Ornith-1.5"
Coding CLIs
Ornith is optimized for terminal-based coding agents. Point any OpenAI-compatible coding CLI at your Ornith endpoint (set OPENAI_BASE_URL and OPENAI_API_KEY) to understand large codebases, automate tedious work, and ship faster.
OpenCode
# Register your local Ornith endpoint as a provider in ~/.config/opencode/opencode.json: # # { # "$schema": "https://opencode.ai/config.json", # "provider": { # "ornith": { # "npm": "@ai-sdk/openai-compatible", # "name": "Ornith (local)", # "options": { "baseURL": "http://localhost:8000/v1", "apiKey": "EMPTY" }, # "models": { "Ornith-1.5": { "name": "Ornith-1.5" } } # } # } # } opencode
Citation
If you find our work helpful, feel free to give us a cite.
@misc{ornith-1.5, title = {{Ornith-1.5}: From Self-Scaffolding to Self-Improvement}, url = {https://ornith.ai/ornith_1_5.html}, author = {{Ornith Team}}, year = {2026} } @misc{ornith-1.0, title = {{Ornith-1.0}: Agentic Coding, Open to All}, url = {https://ornith.ai/ornith_1_0.html}, author = {{Ornith Team}}, year = {2026} }

