README.md
20.7 KB · 445 lines · markdown Raw
1 ---
2 library_name: transformers
3 license: mit
4 license_link: https://huggingface.co/deepreinforce-ai/Ornith-1.0-35B/blob/main/LICENSE
5 pipeline_tag: text-generation
6 ---
7
8
9 <img width="600px" src="assets/ornith_logo.png">
10
11 [![Ornith Blog](https://img.shields.io/badge/%F0%9F%A6%A2%EF%B8%8F%20Ornith%20Blog%20-FD8E5B)](https://deep-reinforce.com/ornith.html)
12
13 # Ornith-1.0-35B
14
15 Aloha! 🌺 Today, we are releasing Ornith-1.0, a self-improving family of open-source models for agentic coding.
16
17 Highlights:
18
19 - **State-of-the-Art Coding Agents**: Available in 9B-Dense, 31B-Dense, 35B-MoE, and 397B-MoE (post-trained on top of Gemma 4 and Qwen 3.5), achieving state-of-the-art performance among open-source models of comparable size on coding benchmarks such as Terminal-Bench 2.1, SWE-Bench, NL2Repo and OpenClaw.
20 - **Self-Improving Training Framework**: Ornith-1.0 employs RL to learn to generate not only solution rollouts, but also the scallfold that drive those rollouts. By jointly optimizing the scaffold and the resulting solution, the model discovers better search trajectories and generates higher-quality solutions.
21 - **Licence**: MIT licensed, globally accessible, and free from regional limitations.
22
23 <img style="width: 100%; max-width: 900px;" src="assets/ornith_35b_eval.png" alt="Ornith 35B Benchmark Results" title="Ornith 35B Benchmark Results">
24
25 ## Ornith 1.0 35B
26
27 This model card documents **Ornith-1.0-35B**, the lightweight member of the Ornith family, designed for efficient single-GPU deployment.
28
29
30 ### Benchmarks
31
32 <div style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;width:100%;margin:0 auto;padding:16px 0">
33 <table style="width:100%;table-layout:fixed;border-collapse:collapse;font-size:13px">
34 <thead><tr>
35 <th style="width:28%;padding:10px 7px;text-align:left;font-weight:600;border-bottom:2px solid #FD8E5B;color:#FD8E5B"></th>
36 <th style="width:14.40%;padding:10px 7px;text-align:center;font-weight:700;border-bottom:2px solid #FD8E5B;color:#FD8E5B;font-size:14px;background:rgba(253, 142, 91, 0.12)">Ornith-1.0-35B</th>
37 <th style="width:14.40%;padding:10px 7px;text-align:center;font-weight:500;border-bottom:2px solid #FD8E5B;color:#FD8E5B;font-size:14px">Qwen3.5-35B</th>
38 <th style="width:14.40%;padding:10px 7px;text-align:center;font-weight:500;border-bottom:2px solid #FD8E5B;color:#FD8E5B;font-size:14px">Qwen3.6-35B</th>
39 <th style="width:14.40%;padding:10px 7px;text-align:center;font-weight:500;border-bottom:2px solid #FD8E5B;color:#FD8E5B;font-size:14px">Gemma4-31B</th>
40 <th style="width:14.40%;padding:10px 7px;text-align:center;font-weight:500;border-bottom:2px solid #FD8E5B;color:#FD8E5B;font-size:14px">Qwen3.5-397B</th>
41 </tr></thead>
42 <tbody>
43 <tr><td colspan="6" style="padding:8px 12px;font-weight:600;color:#FD8E5B;border-bottom:1px solid rgba(253, 142, 91, 0.2);background:rgba(253, 142, 91, 0.1)">Agentic Coding</td></tr>
44 <tr>
45 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">Terminal-Bench 2.1 <sub><small>(Terminus-2)</small></sub></td>
46 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">64.2</td>
47 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">41.4</td>
48 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">52.5</td>
49 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">42.1</td>
50 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">53.5</td>
51 </tr>
52 <tr>
53 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">Terminal-Bench 2.1 <sub><small>(Claude Code)</small></sub></td>
54 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">62.8</td>
55 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">38.9</td>
56 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">49.2</td>
57 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">-</td>
58 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">48.6</td>
59 </tr>
60 <tr>
61 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">SWE-bench Verified</td>
62 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">75.6</td>
63 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">70</td>
64 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">73.4</td>
65 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">52</td>
66 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">76.4</td>
67 </tr>
68 <tr>
69 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">SWE-bench Pro</td>
70 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">50.4</td>
71 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">44.6</td>
72 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">49.5</td>
73 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">35.7</td>
74 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">51.6</td>
75 </tr>
76 <tr>
77 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">SWE-bench Multilingual</td>
78 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">69.3</td>
79 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">60.3</td>
80 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">67.2</td>
81 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">51.7</td>
82 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">69.3</td>
83 </tr>
84 <tr>
85 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">NL2Repo</td>
86 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">34.6</td>
87 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">20.5</td>
88 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">29.4</td>
89 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">15.5</td>
90 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">36.8</td>
91 </tr>
92 <tr>
93 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">Claw-eval Avg</td>
94 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">69.8</td>
95 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">65.4</td>
96 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">68.7</td>
97 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">48.5</td>
98 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">70.7</td>
99 </tr>
100 <tr>
101 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">SWE Atlas - QnA</td>
102 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">37.1</td>
103 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">13.2</td>
104 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">15.5</td>
105 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">-</td>
106 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">20.4</td>
107 </tr>
108 <tr>
109 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">SWE Atlas - RF</td>
110 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">29.7</td>
111 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">10.2</td>
112 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">11.4</td>
113 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">-</td>
114 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">18.4</td>
115 </tr>
116 <tr>
117 <td style="padding:7px 7px;padding-left:20px;border-bottom:1px solid rgba(128, 128, 128, 0.15);">SWE Atlas - TW</td>
118 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15);font-weight:600;color:#FD8E5B;background:rgba(253, 142, 91, 0.06)">27.8</td>
119 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">9.8</td>
120 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">13.3</td>
121 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">-</td>
122 <td style="padding:7px 7px;text-align:center;border-bottom:1px solid rgba(128, 128, 128, 0.15)">18.5</td>
123 </tr>
124 </tbody>
125 </table>
126
127 <p style="margin-top:12px;font-size:10px;opacity:0.7">
128 * Terminal-Bench 2.1 (Terminus-2): We evaluate Terminal-Bench 2.1 using the Harbor/Terminus-2 framework with parser=json, temperature=1.0, top_p=1.0, and a 128K context window. Each run uses a 4-hour timeout with 32 CPU cores and 48GB RAM, and results are averaged over 5 runs. We adjust the Qwen chat template to ensure consistency between training and inference (https://huggingface.co/deepreinforce-ai/Ornith-1.0-397B/blob/main/chat_template.jinja), and modify Harbor to align with vLLM's reasoning_content key.<br/>
129 * Terminal-Bench 2.1 (Claude Code): We evaluate Terminal-Bench 2.1 using Claude Code 2.1.126 with parser=json, temperature=1.0, top_p=1.0, max_new_tokens=131072. Results are averaged over 5 runs. Again, Qwen chat template needs to be modified.<br/>
130 * SWE-Bench Verified, Pro and Multilingual: using OpenHands harness with temp=1.0, top_p=0.95, 256k context window.<br/>
131 * SWE Atlas QnA, RF, TW: using mini SWE agent harness with temp=1.0, top_p=0.95, 128K context window. Results are averaged over 5 runs.<br/>
132 * NL2Repo: with temperature=1.0, top_p=1.0, 400K context, 48K output and anti-hacking filters.<br/>
133 * ClawEval: An agentic code benchmark over real-user task distributions; temp=0.6 and 256K context.<br/>
134 </p>
135
136 </div>
137
138
139
140
141 ## Quickstart
142
143
144 <div style="border-left:4px solid #FD8E5B;background:rgba(253,142,91,0.1);border-radius:6px;padding:12px 16px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;font-size:14px;line-height:1.6">
145 <div style="font-weight:700;color:#FD8E5B;margin-bottom:6px">📝 NOTE</div>
146 <p style="margin:0 0 10px"><b>Ornith-1.0-35B</b> is a <b>reasoning model</b>: by default the assistant turn opens with a <code style="background:rgba(253,142,91,0.15);padding:1px 5px;border-radius:4px">&lt;think&gt; … &lt;/think&gt;</code> block before the final answer. The serving recipes below enable a reasoning parser so the chain-of-thought is returned in a separate <code style="background:rgba(253,142,91,0.15);padding:1px 5px;border-radius:4px">reasoning_content</code> field, and a tool-call parser so the model's <code style="background:rgba(253,142,91,0.15);padding:1px 5px;border-radius:4px">&lt;tool_call&gt;</code> blocks are surfaced as OpenAI-style <code style="background:rgba(253,142,91,0.15);padding:1px 5px;border-radius:4px">tool_calls</code>.</p>
147 <p style="margin:0 0 6px">Serving Ornith-1.0-35B requires recent runtimes:</p>
148 <ul style="margin:0;padding-left:20px">
149 <li><b>Transformers</b> ≥ 5.8.1</li>
150 <li><b>vLLM</b> ≥ 0.19.1</li>
151 <li><b>SGLang</b> ≥ 0.5.9</li>
152 </ul>
153 </div>
154
155 ### Serving Ornith-1.0-35B
156
157 The two recipes below stand up an OpenAI-compatible server on a single 8×80GB GPU node (tensor-parallel 8). Adjust `--tensor-parallel-size` / `--tp` to the number of GPUs you have.
158
159 #### vLLM
160
161 ```bash
162 vllm serve deepreinforce-ai/Ornith-1.0-35B \
163 --served-model-name Ornith-1.0-35B \
164 --tensor-parallel-size 8 \
165 --host 0.0.0.0 --port 8000 \
166 --max-model-len 262144 \
167 --gpu-memory-utilization 0.90 \
168 --enable-prefix-caching \
169 --enable-auto-tool-choice --tool-call-parser qwen3_xml \
170 --reasoning-parser qwen3 \
171 --trust-remote-code
172 ```
173
174 #### SGLang
175
176 ```bash
177 python -m sglang.launch_server \
178 --model-path deepreinforce-ai/Ornith-1.0-35B \
179 --served-model-name Ornith-1.0-35B \
180 --tp 8 \
181 --host 0.0.0.0 --port 8000 \
182 --context-length 262144 \
183 --mem-fraction-static 0.85 \
184 --tool-call-parser qwen3_coder \
185 --reasoning-parser qwen3
186 ```
187
188 #### Hugging Face Transformers
189
190 For a quick local test (or to script offline generation), load the model directly with Transformers. Make sure you have a recent release installed — see the [Transformers installation guide](https://huggingface.co/docs/transformers/installation); Ornith-1.0-35B requires `transformers >= 5.8.1`.
191
192 ```python
193 from transformers import AutoModelForCausalLM, AutoTokenizer
194
195 model_name = "deepreinforce-ai/Ornith-1.0-35B"
196
197 tokenizer = AutoTokenizer.from_pretrained(model_name)
198 model = AutoModelForCausalLM.from_pretrained(
199 model_name,
200 dtype="auto",
201 device_map="auto",
202 )
203
204 messages = [
205 {"role": "user", "content": "Write a Python function is_prime(n). Keep it short."}
206 ]
207 text = tokenizer.apply_chat_template(
208 messages,
209 tokenize=False,
210 add_generation_prompt=True,
211 )
212
213 inputs = tokenizer(text, return_tensors="pt").to(model.device)
214 generated = model.generate(
215 **inputs,
216 max_new_tokens=512,
217 do_sample=True,
218 temperature=0.6,
219 top_p=0.95,
220 top_k=20,
221 )
222 output_ids = generated[0][inputs.input_ids.shape[1]:]
223
224 # The reply contains a <think> ... </think> reasoning block followed by the answer.
225 content = tokenizer.decode(output_ids, skip_special_tokens=True)
226 print(content)
227 ```
228
229 To split the reasoning trace from the final answer, parse on the `</think>` marker:
230
231 ```python
232 text = tokenizer.decode(output_ids, skip_special_tokens=True)
233 if "</think>" in text:
234 reasoning, answer = text.split("</think>", 1)
235 reasoning = reasoning.replace("<think>", "").strip()
236 answer = answer.strip()
237 else:
238 reasoning, answer = "", text.strip()
239 ```
240
241 ### Using Ornith-1.0-35B via the Chat Completions API
242
243 Once a vLLM or SGLang server is running, talk to it with any OpenAI-compatible client.
244
245 #### Basic Usage
246
247 ```python
248 from openai import OpenAI
249
250 client = OpenAI(
251 base_url="http://localhost:8000/v1",
252 api_key="EMPTY", # any non-empty string works for a local server
253 )
254
255 response = client.chat.completions.create(
256 model="Ornith-1.0-35B",
257 messages=[
258 {"role": "user", "content": "Write a one-line Python lambda that squares a number."}
259 ],
260 temperature=0.6,
261 top_p=0.95,
262 max_tokens=1024,
263 )
264
265 message = response.choices[0].message
266 # reasoning_content holds the <think> trace; content holds the final answer.
267 print("reasoning:", getattr(message, "reasoning_content", None))
268 print("answer:", message.content)
269 ```
270
271 You can also stream tokens, or hand the model tools — Ornith-1.0-35B emits well-formed function calls that the server parses into the standard `tool_calls` field:
272
273 ```python
274 tools = [
275 {
276 "type": "function",
277 "function": {
278 "name": "get_weather",
279 "description": "Get the current weather for a city",
280 "parameters": {
281 "type": "object",
282 "properties": {"city": {"type": "string"}},
283 "required": ["city"],
284 },
285 },
286 }
287 ]
288
289 response = client.chat.completions.create(
290 model="Ornith-1.0-35B",
291 messages=[{"role": "user", "content": "What is the weather in Paris right now?"}],
292 tools=tools,
293 tool_choice="auto",
294 temperature=0.6,
295 max_tokens=2048,
296 )
297
298 tool_call = response.choices[0].message.tool_calls[0]
299 print(tool_call.function.name, tool_call.function.arguments)
300 # -> get_weather {"city": "Paris"}
301 ```
302
303 You can point any OpenAI-compatible SDK (Python, Node.js, etc.) or `curl` at the same `/v1/chat/completions` endpoint.
304
305 ## Agentic Usage
306
307 Ornith-1.0-35B excels in tool-calling and agentic coding capabilities.
308
309 ### Agent Frameworks
310
311 Because Ornith-1.0-35B 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-1.0-35B to tools through an MCP server.
312
313 ```python
314 import os
315 from openai import OpenAI
316
317 client = OpenAI(
318 base_url=os.getenv("OPENAI_BASE_URL", "http://localhost:8000/v1"),
319 api_key=os.getenv("OPENAI_API_KEY", "EMPTY"),
320 )
321
322 tools = [
323 {
324 "type": "function",
325 "function": {
326 "name": "run_shell",
327 "description": "Run a shell command and return its output.",
328 "parameters": {
329 "type": "object",
330 "properties": {
331 "command": {"type": "string", "description": "The command to run"}
332 },
333 "required": ["command"],
334 },
335 },
336 }
337 ]
338
339 messages = [{"role": "user", "content": "List the Python files in the current directory."}]
340
341 response = client.chat.completions.create(
342 model="deepreinforce-ai/Ornith-1.0-35B",
343 messages=messages,
344 tools=tools,
345 temperature=0.6,
346 top_p=0.95,
347 )
348 print(response.choices[0].message)
349 ```
350
351 **Examples of using Ornith with agent harness:**
352
353 #### Hermes Agent
354 ```bash
355 # Hermes talks to any OpenAI-compatible endpoint — point it at your Ornith server.
356 export OPENAI_BASE_URL="http://localhost:8000/v1"
357 export OPENAI_API_KEY="EMPTY"
358 export MODEL="deepreinforce-ai/Ornith-1.0-35B"
359 ```
360
361
362 #### Atomic.chat/ Ollama / llama.cpp
363 ```bash
364 # Both runtimes load a GGUF build of Ornith (publish one at deepreinforce-ai/Ornith-1.0-35B-GGUF).
365
366 # llama.cpp — serve an OpenAI-compatible API on port 8000.
367 llama-server -hf deepreinforce-ai/Ornith-1.0-35B-GGUF --port 8000 -c 262144
368
369 # Ollama — pull and chat with the same GGUF straight from Hugging Face.
370 ollama run hf.co/deepreinforce-ai/Ornith-1.0-35B-GGUF
371 ```
372
373 #### OpenClaw
374
375 ```bash
376 # OpenClaw talks to any OpenAI-compatible endpoint — point it at your Ornith server.
377 export OPENAI_BASE_URL="http://localhost:8000/v1"
378 export OPENAI_API_KEY="EMPTY"
379 export OPENAI_MODEL="deepreinforce-ai/Ornith-1.0-35B"
380 ```
381
382 #### Unsloth Studio
383
384 ```bash
385 pip install unsloth
386
387 # Load Ornith for fast local inference or fine-tuning (Python):
388 # from unsloth import FastLanguageModel
389 # model, tokenizer = FastLanguageModel.from_pretrained(
390 # "deepreinforce-ai/Ornith-1.0-35B",
391 # max_seq_length=262144,
392 # load_in_4bit=True,
393 # )
394 ```
395
396 #### OpenHands
397 ```bash
398 pip install openhands-ai
399
400 # OpenHands routes through LiteLLM; the "openai/" prefix selects the OpenAI-compatible path.
401 export LLM_MODEL="openai/deepreinforce-ai/Ornith-1.0-35B"
402 export LLM_BASE_URL="http://localhost:8000/v1"
403 export LLM_API_KEY="EMPTY"
404
405 # Launch the CLI (or run the official OpenHands Docker image with the same env vars).
406 openhands
407 ```
408
409 ### Coding CLIs
410
411 Ornith-1.0-35B is optimized for terminal-based coding agents. Point any OpenAI-compatible coding CLI at your Ornith-1.0-35B endpoint (set `OPENAI_BASE_URL` and `OPENAI_API_KEY`) to understand large codebases, automate tedious work, and ship faster.
412
413 #### OpenCode
414 ```bash
415 # Register your local Ornith endpoint as a provider in ~/.config/opencode/opencode.json:
416 #
417 # {
418 # "$schema": "https://opencode.ai/config.json",
419 # "provider": {
420 # "ornith": {
421 # "npm": "@ai-sdk/openai-compatible",
422 # "name": "Ornith (local)",
423 # "options": { "baseURL": "http://localhost:8000/v1", "apiKey": "EMPTY" },
424 # "models": { "deepreinforce-ai/Ornith-1.0-35B": { "name": "Ornith-1.0-35B" } }
425 # }
426 # }
427 # }
428
429 opencode
430 ```
431
432
433 ### Citation
434
435 If you find our work helpful, feel free to give us a cite.
436
437 ```bibtex
438 @misc{ornith-35b,
439 title = {{Ornith-1.0-35B}: Agentic Coding, Open to All},
440 url = {https://deep-reinforce.com/ornith_1_0.html},
441 author = {{DeepReinforce Team}},
442 year = {2026}
443 }
444 ```
445