GitHub - ornith-ai/Ornith-1

GitHub

10 min read Original article ↗

Ornith 1.0 Blog  |  Ornith 1.5 Blog


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.

Ornith 397B Benchmark Results

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.177.582.7818588.3
Terminal-Bench 2.1 (Claude Code)85.278.281.882.778.9-
SWE-bench Verified8682.481.68385.886.2
SWE-bench Pro65.162.264.462.168-
SWE-bench Multilingual79.678.977.978.475.7-
DeepSWE56854.446.25967.5
Frontier-Bench v0.113.52.76.15.121.123
NL2Repo59.548.254.248.969.7-
SWE Atlas - QnA55.641.251.65059.759.7
Reasoning
HLE (no tools)44.630.23540.549.843.5
HLE (with tools)56.147.550.854.757.956
GPQA Diamond92.888.191.491.293.693.5
Agentic
MCP-Atlas8076.474.677.882.282.3
Toolathlon-Verified71.243.270.348.276.273.2
WideSearch80.875.277.37972.9-
BrowseComp86.679.784.885.684.391.2
ClawEval81.477.177.678.880.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.864.252.542.151.753.5
Terminal-Bench 2.1 (Claude Code)68.562.849.2--48.6
SWE-bench Verified7975.673.4527676.4
SWE-bench Pro59.650.449.535.751.251.6
SWE-bench Multilingual71.469.367.251.7-69.3
DeepSWE2200--1
Frontier-Bench v0.15.11.41.4--1.4
NL2Repo46.234.629.415.5-36.8
SWE Atlas - QnA39.837.115.5--20.4
Reasoning
HLE (no tools)25.620.821.419.52228.7
HLE (with tools)33.430.128.926.5-48.3
GPQA Diamond89.286.28684.383.588.4
Agentic
MCP-Atlas70.264.462.85575.572.3
Toolathlon-Verified48.742.441.740.8-38.3
WideSearch67.863.460.154.2-74
BrowseComp67.663.562--78.6
ClawEval72.569.868.748.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.243.121.352.542.1
Terminal-Bench 2.1 (Claude Code)4740.618.949.2-
SWE-bench Verified70.669.453.273.452
SWE-bench Pro47.542.931.349.535.7
SWE-bench Multilingual54.45239.767.251.7
NL2Repo32.427.216.229.415.5
SWE Atlas - QnA20.617.99.215.5-
Reasoning
HLE (no tools)20.216.814.721.419.5
HLE (with tools)30.526.424.528.926.5
GPQA Diamond86.482.581.78684.3
Agentic
MCP-Atlas54.249.446.862.855
Toolathlon-Verified41.233.429.641.752.8
WideSearch59.555.853.660.154.2
BrowseComp56.444.841.562-
ClawEval66.563.153.268.748.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 separate reasoning_content field, and a tool-call parser so the model's <tool_call> blocks are surfaced as OpenAI-style tool_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 a rope_scaling block 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 1000000

    SGLang:

    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_scaling when your workload genuinely needs the longer window, and size factor to match it — the target window is roughly factor × 262,144, so if your requests top out around 524,288 tokens, factor: 2.0 is 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}
}