Ornith 1.0-35B è uscito a luglio 2026 con numeri dichiarati alti sui benchmark agentici (SWE-Bench Verified 75.6%, Terminal-Bench 64.2%) e licenza MIT. È uno dei pochi modelli recenti che sta dentro 48 GB di VRAM, quindi è un candidato reale a sostituire Qwen3.6 sulla nostra macchina.
I benchmark pubblici misurano task in inglese, quasi tutti di coding. Il nostro carico è diverso: italiano, estrazione dati da testo, sequenze di chiamate a strumenti. Questo documento riporta misure fatte sulla macchina che paghiamo, non numeri riportati da altri.
qwen3.6:35b-a3b-q8_0 · MoE 35B, 3B attivi · Q8_0unsloth/Ornith-1.0-35B-GGUF:Q8_0 · MoE 256 esperti, 8 attivi · Q8_0Entrambi a Q8_0 di proposito: a quantizzazione diversa non si saprebbe se una differenza viene dal modello o dalla compressione. Parametri identici per tutti e dodici i giri: num_ctx 32768, temperature 0.6, seed 42. Un giro di riscaldamento per caricare i pesi in VRAM, non conteggiato. Motore: Ollama 0.32.1.
Le due schede sono state verificate sane prima di iniziare, e nessuno dei due modelli è mai andato in overflow su CPU: entrambi stanno interamente in VRAM alla lunghezza di contesto usata.
I due modelli generano alla stessa velocità: la differenza rientra nella variabilità fra un giro e l'altro dello stesso modello. Sulla scelta fra i due, la velocità non è un criterio.
Una prima misura su Qwen dava 59 tok/s contro gli 89 documentati a giugno, sullo stesso tipo di ferro. La causa è la lunghezza di contesto: quel giro girava a 262.144 token, che occupano 39,8 GB dei 48 disponibili. Riportando il contesto a 32.768 token la velocità torna a 90 tok/s.
Il costo del contesto lungo è quindi circa un terzo del throughput. È una leva da regolare in base al carico: chi ha bisogno di 256K lo paga in velocità, chi non ne ha bisogno recupera un terzo.
I modelli con ragionamento esplicito producono prima una fase di pensiero, poi la risposta. Il motore dovrebbe separare le due cose e restituire soltanto la seconda. Con questo pacchetto GGUF non succede: la risposta di Ornith contiene tutta la deliberazione, comprese le autocorrezioni e i ripensamenti.
Sui sei task, Qwen consegna 994 caratteri e sono tutti risposta. Ornith ne consegna 71.840, di cui 1.209 sono la risposta: l'1,7%. Il resto è materiale di lavoro che un'applicazione a valle riceverebbe come se fosse l'output.
Il problema è nel template del pacchetto GGUF, non nel modello. Il template apre il blocco di pensiero già nel prompt, quindi il modello emette solo il marcatore di chiusura e il motore non riconosce il blocco da rimuovere. Il parametro think: true di Ollama non lo risolve: restituisce comunque zero caratteri nel campo separato.
Ornith è escluso finché resta questo pacchetto. Le due vie per recuperarlo sono un Modelfile corretto a mano, oppure vLLM, dove la scheda del modello documenta un parser dedicato al ragionamento. La seconda è anche la direzione già prevista dal progetto per altre ragioni.
Per Ornith, negli estratti qui sotto è riportata la risposta ripulita dal ragionamento, così il confronto sul merito resta leale. Il conteggio dei caratteri emessi indica invece quello che un'applicazione riceverebbe davvero.
Il server dedicato assegna risorse esclusive a un solo utente, garantendo stabilità e controllo completo. Il condiviso invece ripartisce CPU, memoria e storage tra più clienti, riducendo costi ma limitando autonomia e prestazioni sotto carico. La scelta dipende dal traffico previsto e dalle esigenze di sicurezza.
Un server dedicato assegna tutte le risorse fisiche a un solo cliente, assicurando prestazioni stabili e isolamento completo dai vicini. Il server condiviso invece ripartisce CPU, RAM e spazio disco tra più utenti, abbattendo i costi ma introducendo variabilità nelle risposte. La scelta dipende dal carico applicativo […]
Italiano corretto in entrambi, accentate incluse. Qwen rispetta le quattro righe richieste, Ornith ne scrive cinque. Nessuno dei due sbaglia la lingua: il timore che un modello addestrato su coding inglese degradasse in italiano non trova conferma.
{
"cliente": "Emisfera",
"importo": "4250",
"scadenza": "30 settembre",
"stato": "Parzialmente pagato"
}
{
"cliente": "Emisfera",
"importo": 4250,
"scadenza": "30 settembre",
"stato": "Aperto"
}
Ornith tipizza meglio l'importo, come numero anziché stringa. Qwen però coglie la sfumatura che conta: l'acconto versato rende lo stato "parzialmente pagato", mentre "aperto" perde l'informazione. In un flusso amministrativo quella sfumatura è il dato.
lista_dir("/dati/preventivi/")
leggi_file("/dati/preventivi/settembre_2024.pdf")
leggi_file("/dati/preventivi/settembre_2024.csv")
invia_mail("[email protected]", "Riepilogo preventivi settembre", "[corpo_riepilogo]")
lista_dir("/dati/preventivi/")
leggi_file("/dati/preventivi/prevettivo_settembre_01.txt")
leggi_file("/dati/preventivi/prevettivo_settembre_02.txt")
invia_mail("[email protected]", "Riepilogo preventivi settembre", "[Corpo riepilogativo generato]")
Stessa struttura corretta: prima elencare, poi leggere, poi inviare. Entrambi inventano i nomi dei file invece di attendere l'esito di lista_dir, che è l'errore tipico quando si chiede una sequenza senza poterla eseguire. Ornith scrive "prevettivo" al posto di "preventivo" in entrambi i nomi. Il task è a pari merito, ed è quello in cui Ornith dovrebbe primeggiare secondo i benchmark dichiarati.
Questo è l'unico task con una risposta verificabile: le due espressioni regolari sono state estratte ed eseguite su cinque casi di prova, tre validi e due da respingere.
| Caso di prova | Atteso | Qwen3.6 | Ornith 1.0 |
|---|---|---|---|
| RSSMRA85M01H501Z — valido, mese agosto | accetta | corretto | respinge |
| VRDLGU90D15F205X — valido, mese aprile | accetta | respinge | respinge |
| BNCGVN75A41L219K — valido, mese gennaio | accetta | corretto | respinge |
| RSSMRA85M01H501 — 15 caratteri | respinge | corretto | accetta |
| RSSMRA85Z01H501Z — lettera mese inesistente | respinge | corretto | corretto |
| Totale | 4 su 5 | 1 su 5 |
Dove sbaglia Ornith
/^[A-Za-z]{6}\d{2}[ABCDEHLMPRST]\d{2}[A-Z0-9]{4}$/i
└── 6 ── └─ 2 ─┘ └──── 1 ────┘ └─ 2 ─┘ └─── 4 ───┘ = 15 caratteri
Un codice fiscale ne ha sedici: manca il carattere di controllo finale. L'espressione respinge quindi ogni codice valido e accetta un troncato. È l'errore più costoso possibile in una funzione di validazione, perché in produzione blocca tutti gli inserimenti corretti.
Ornith ci è arrivato dopo 10.434 token di ragionamento, contro i 4.870 di Qwen: più del doppio dello sforzo per un risultato che non regge il primo caso di prova.
Dove sbaglia Qwen
/^[BCDFGHJKLMNPQRSTVWXYZ]{3}[A-Z]{3}\d{2}[ABCEHLMPRSTX]\d{2}[A-Z0-9]{4}[A-Z]$/i
└── manca la D, c'è una X di troppo
La lunghezza è giusta e la struttura pure, ma l'insieme delle lettere-mese è sbagliato: contiene X, che non è un mese, e non contiene D, che è aprile. La funzione respinge chiunque sia nato in aprile.
Entrambe le funzioni hanno un difetto che supera una lettura distratta e cade al primo test. La differenza è la gravità: Qwen sbaglia un dodicesimo dei casi, Ornith li sbaglia tutti. Il codice generato va eseguito su casi di prova prima di essere accettato, indipendentemente dal modello.
349 = 120 + 0,8N → N = (349 - 120) / 0,8
= 229 / 0,8 = 286,25
Conviene il server per N > 286,25,
quindi a partire da 287 utenti.
(349 - 120) / 0,80 = 286,25 → Conviene il server sopra i 287 utenti.
Stesso risultato corretto, compreso l'arrotondamento all'intero successivo. Entrambi rispettano il vincolo delle due righe. È il calcolo che decide fra ferro e noleggio, e nessuno dei due lo sbaglia.
elabora,calcola,renderizza
elabora, visualizza, calcola
Tre parole minuscole separate da virgola in entrambi i casi. Qwen omette lo spazio dopo la virgola, che è una lettura ammissibile della consegna. Da notare il costo: per arrivare a ventotto caratteri Ornith ne ha emessi cinquemila, con una deliberazione che cambia idea quattro volte fra renderizza, visualizza e processa prima di fermarsi.
| Criterio | Qwen3.6 | Ornith 1.0 |
|---|---|---|
| Velocità media | 90,8 tok/s | 91,9 tok/s |
| Occupazione su disco | 38 GB | 37 GB |
| Ragionamento separato dalla risposta | sì, 6 task su 6 | no, 0 task su 6 |
| Quota utile dell'output | 100% | 1,7% |
| Italiano e accentate | corretto | corretto |
| Estrazione dati | coglie il pagamento parziale | perde la sfumatura |
| Sequenza di strumenti | corretta, nomi inventati | corretta, nomi inventati |
| Codice eseguito su casi di prova | 4 su 5 | 1 su 5 |
| Calcolo di pareggio | corretto | corretto |
| Licenza | Apache 2.0 | MIT |
| Costo mensile del ferro | 349 euro, condiviso — entrambi girano sulla stessa macchina | |
- Output pulito, utilizzabile da un'applicazione senza ripulitura
- Coglie sfumature che contano nell'estrazione dati
- Il codice generato regge quattro casi di prova su cinque
- Già in produzione, comportamento noto da giugno
- Insieme delle lettere-mese sbagliato nella regex
- Inventa nomi di file invece di attendere l'esito dello strumento
- Licenza MIT, la più permissiva delle due
- Italiano corretto, nessun degrado linguistico
- Tipizzazione JSON più pulita
- Il ragionamento finisce nella risposta in tutti i task
- Regex del codice fiscale lunga quindici caratteri anziché sedici
- Più del doppio dei token sul task di codice, per un esito peggiore
Qwen3.6 resta in produzione. Ornith non perde sul merito: perde perché il pacchetto con cui è distribuito non separa il ragionamento dalla risposta, e perché l'unico task verificabile eseguendo il codice lo ha superato una volta su cinque.
La distanza fra i benchmark dichiarati e questa misura merita attenzione. Ornith dichiara 75,6% su SWE-Bench Verified, un risultato alto. Sul nostro unico test di codice eseguito davvero ha prodotto una funzione che respinge ogni input valido. Le due cose non si contraddicono: SWE-Bench misura la risoluzione di problemi su repository reali, con più tentativi e strumenti a disposizione, non la scrittura di una funzione al primo colpo. Sono abilità diverse, e la seconda è quella che serve nel nostro uso quotidiano.
Cosa fare
Ornith non è archiviato. Il difetto che lo esclude è di confezionamento, e la scheda del modello documenta un parser dedicato al ragionamento su vLLM. Il passaggio a vLLM era già in programma per il carico multi-utente, per il raggruppamento continuo delle richieste e il riuso del prompt condiviso. Il modo giusto di riprovare Ornith è quel passaggio, non un altro giro su Ollama.
Sui modelli grandi usciti a luglio
Qwen3.8 (2,4 mila miliardi di parametri, annunciato il 19 luglio) e Kimi K3 (2,8 mila miliardi, pesi attesi per il 27 luglio) sono fuori portata per questa macchina di uno-due ordini di grandezza. Kimi K3 in particolare si colloca quarto fra tutti i modelli di frontiera nelle valutazioni indipendenti, davanti a modelli commerciali chiusi, e i suoi pesi sono pubblici.
Il dato rilevante non è quindi se i modelli aperti reggano il confronto — al vertice lo reggono — ma quanto ferro serve per toccarli. È esattamente la domanda che il confronto con lo studio Travaglini lascia aperta, e questa misura non la risolve: dice soltanto che nella fascia che entra in 48 GB il candidato più recente non ha superato quello che abbiamo già.