Su un M3 Max da 128 GB con OpenClaw 2026.9.7 e Ollama 0.35.0, gemma4 — il modello suggerito dalla configurazione Ollama di OpenClaw — ha superato tutte le 12 esecuzioni valutate su quattro attività agent; gpt-oss:20b ne ha superate 11 su 12 con quasi il triplo di chiamate agli strumenti fallite; e qwen3-coder:30b, la scelta abituale per il coding, ne ha superate 2 su 12 perché le sue chiamate agli strumenti continuavano a rompersi nel parser di Ollama. Abbiamo eseguito ogni modello tre volte per ogni attività in un workspace nuovo, valutato il risultato tramite script e registrato i conteggi degli strumenti e dei token di OpenClaw e il log del server Ollama. Misurato il 1° ottobre 2026.
Per sapere quanto costa OpenClaw e quanto costerebbe invece un modello ospitato, consulta prezzi di OpenClaw; per eseguire un modello locale con un fallback API, più agent e modelli in OpenClaw.
Cosa è stato eseguito
| Macchina | Apple M3 Max, 128 GB di memoria unificata |
| OpenClaw | 2026.9.7 da npm, Node 24.21.0, openclaw agent --local --json, un turno per esecuzione |
| Ollama | Binario di rilascio v0.35.0, API nativa (senza /v1) |
| Modelli | gemma4:latest — 7.5B, Q4_K_M, 6.6 GB su disco; gpt-oss:20b — 20.9B, MXFP4, 13.8 GB; qwen3-coder:30b — mixture-of-experts da 30.5B, Q4_K_M, 18.6 GB |
| Contesto | OpenClaw contextWindow 32.768 per tutti e tre; Ollama ha caricato gemma4 e gpt-oss a 131.072 e qwen3-coder a 262.144 |
| Esecuzione degli strumenti | Sandbox Docker di OpenClaw, workspace montato in lettura-scrittura |
| Esecuzioni | 4 attività × 3 ripetizioni × 3 modelli = 36, ognuna in un workspace nuovo con stato OpenClaw nuovo |
Le quattro attività
| Attività | Cosa doveva fare l'agente | Superata quando |
|---|---|---|
| Lettura | Leggi un log di servizio di 301 righe e indica il servizio sulla sua unica riga ERROR | La risposta contiene il nome corretto del servizio |
| Correzione | Esegui un file di unit test, correggi il bug nel modulo che verifica, riesegui — senza modificare i test | I test terminano con 0 e il file di test è identico a livello di byte |
| Conteggio | Conta le righe di dati in cinque file CSV e scrivi i conteggi in counts.json | counts.json è uguale all'oggetto previsto |
| Correzione di due file | Due bug indipendenti in due moduli dietro tre test falliti; correggili entrambi senza modificare i test | Tutti i test terminano con 0 e i test sono identici a livello di byte |
Risultati
| Modello | Attività | Superate | Tempo mediano | Chiamate mediane agli strumenti | Chiamate agli strumenti fallite (3 esecuzioni) | Token mediani in / out |
|---|---|---|---|---|---|---|
gemma4:latest | t1-read | 3/3 | 50,2 s | 1 | 0 | 21.438 / 19 |
gemma4:latest | t2-fix | 3/3 | 47,5 s | 4 | 0 | 13.387 / 866 |
gemma4:latest | t3-count | 3/3 | 37,9 s | 7 | 1 | 13.073 / 513 |
gemma4:latest | t4-multi | 3/3 | 75,1 s | 10 | 6 | 16.417 / 2.441 |
gpt-oss:20b | t1-read | 3/3 | 38,7 s | 3 | 5 | 16.971 / 508 |
gpt-oss:20b | t2-fix | 3/3 | 54,2 s | 7 | 6 | 12.409 / 1.193 |
gpt-oss:20b | t3-count | 2/3 | 76,5 s | 10 | 5 | 13.247 / 1.713 |
gpt-oss:20b | t4-multi | 3/3 | 65,1 s | 11 | 3 | 13.065 / 1.380 |
qwen3-coder:30b | t1-read | 0/3 | 25,1 s | 0 | 0 | 8.915 / 38 |
qwen3-coder:30b | t2-fix | 0/3 | 34,8 s | 3 | 0 | 9.435 / 163 |
qwen3-coder:30b | t3-count | 2/3 | 36,9 s | 3 | 0 | 9.503 / 279 |
qwen3-coder:30b | t4-multi | 0/3 | 42,5 s | 5 | 0 | 9.992 / 243 |
I tempi sono quelli reali per esecuzione, inclusi circa cinque-sette secondi di avvio di OpenClaw. "Token in" è l'input non memorizzato nella cache registrato da OpenClaw; il contesto reinviato dalla cache si aggiunge a questo ed è conteggiato nella sezione dei costi qui sotto. La colonna delle chiamate agli strumenti fallite conta gli errori registrati da OpenClaw; i fallimenti di qwen3-coder sono avvenuti prima che una chiamata raggiungesse OpenClaw, quindi lì risultano zero e sono spiegati di seguito.
Cosa dicono i numeri
- gemma4 e gpt-oss:20b sono entrambi utilizzabili per brevi attività agent. Hanno superato 23 delle 24 esecuzioni, inclusa la correzione di due file, che richiede di leggere diversi moduli, modificarne due e rieseguire i test.
- gemma4 ha usato gli strumenti in modo più pulito. Nell'attività di lettura ha effettuato esattamente una chiamata allo strumento ogni volta; gpt-oss ne ha effettuate tre, due delle quali in genere sono fallite prima della lettura del file. Nelle dodici esecuzioni complessive gpt-oss ha avuto 19 chiamate agli strumenti fallite contro le 7 di gemma4 e ha registrato in media 9,1 turni dell'assistente per attività contro i 6,8 di gemma4.
- L'unico fallimento è stato gpt-oss nell'attività di conteggio: dopo tredici chiamate agli strumenti ha scritto un counts.json non valido e ha terminato il turno senza una risposta.
- La velocità non è il fattore distintivo qui. Mediana di 53 s per gemma4 e 54 s per gpt-oss in tutte le esecuzioni; l'esecuzione singola più lenta è stata quella di gemma4, 133 s per la correzione di due file, con diciassette chiamate agli strumenti. Le esecuzioni di qwen3-coder sono state più brevi solo perché sono fallite subito.
- I modelli più grandi non hanno portato maggiore accuratezza in queste attività. gpt-oss:20b ha quasi il triplo dei parametri di gemma4 e qwen3-coder:30b, progettato per il codice, ha ottenuto il punteggio più basso dei tre.
Dodici esecuzioni per modello bastano a vedere uno schema in queste attività, ma non a classificare i modelli in generale. Non sono state testate attività lunghe, basi di codice più grandi né altre quantizzazioni.
Perché qwen3-coder:30b ha fallito
Non per il coding. Delle sue dieci esecuzioni fallite:
- Cinque sono terminate nel parser di Ollama. qwen3-coder scrive le chiamate agli strumenti come XML e, quando un argomento conteneva codice, chiudeva un elemento
<parameter>con</function>. Il log del server di Ollama 0.35.0 ha registrato "qwen tool call parsing failed … XML syntax error … element <parameter> closed by </function>" e OpenClaw ha terminato il turno con "Agent run failed". - Quattro non hanno mai effettuato una chiamata. La risposta annunciava il passaggio successivo e poi mostrava un semplice
</tool_call>come testo, senza nulla che Ollama potesse interpretare come una chiamata; il turno si è concluso lì. Questo è il sintomo che la documentazione di OpenClaw associa all'URL/v1— qui si è verificato con l'API nativa. - Una era una risposta errata: contava le righe dell'intestazione CSV come righe di dati.
Il parser è quello di Ollama, quindi questo risultato riguarda Ollama 0.35.0, non è un verdetto sul modello. Se esegui qwen3-coder con OpenClaw, controlla nel log di ollama serve la voce "qwen tool call parsing failed" prima di attribuire la colpa al modello e ripeti il test dopo un aggiornamento di Ollama.
La configurazione che ha fatto la differenza
- URL nativo di Ollama. La documentazione di OpenClaw afferma che l'URL compatibile con OpenAI
/v1"interrompe le chiamate agli strumenti e i modelli possono emettere JSON grezzo di chiamata allo strumento come testo normale"; per le esecuzioni è stato usatobaseUrlsenza/v1, insieme aapi: "ollama". - Imposta
contextWindownelle voci scritte manualmente. In un test rapido, una voce di modello esplicita senza questo valore è stata risolta con un contesto di 200.000 token; la configurazione Ollama di OpenClaw imposta 32.768 per i modelli locali, ed è questo il valore usato nelle esecuzioni. - Il contesto di Ollama è separato. Ollama 0.35.0 ha caricato gemma4 e gpt-oss con 131.072 token e qwen3-coder con 262.144 — 45,3 GB residenti — indipendentemente dai 32.768 di OpenClaw; è questo, non il budget di OpenClaw, a determinare la memoria.
- Isola la shell. Un modello locale che esegue comandi shell sulla tua macchina rappresenta il rischio reale. Con
sandbox.mode: "all", exec è stato eseguito nell'immagine Docker di OpenClaw con il solo workspace montato; l'immagine viene compilata una volta con il comandodocker buildindicato nella documentazione di sandboxing di OpenClaw.
// ~/.openclaw/openclaw.json — the runs used one model per config; the
// fallbacks line shows the pattern and was not part of the measured runs
{
models: { providers: { ollama: {
apiKey: "ollama-local",
baseUrl: "http://127.0.0.1:11434", // native Ollama URL — no /v1
api: "ollama",
timeoutSeconds: 600,
models: [
{ id: "gemma4:latest", name: "gemma4:latest", contextWindow: 32768, maxTokens: 8192,
params: { keep_alive: "30m" } },
{ id: "gpt-oss:20b", name: "gpt-oss:20b", contextWindow: 32768, maxTokens: 8192,
params: { keep_alive: "30m" } },
],
} } },
agents: { defaults: {
model: { primary: "ollama/gemma4:latest", fallbacks: ["ollama/gpt-oss:20b"] },
sandbox: { mode: "all", workspaceAccess: "rw" }, // shell runs in Docker
} },
tools: { exec: { mode: "full" } },
}Quali sono i costi locali
Un modello locale sostituisce un costo per token con tempo, spazio su disco ed elettricità. Per esecuzione, OpenClaw ha registrato circa 16.415 token di input non memorizzati nella cache, 78.469 token di contesto memorizzato nella cache reinviato e 1.142 token di output per gemma4, oltre a 13.761, 88.688 e 1.192 per gpt-oss. Come calcolo approssimativo — i tokenizer differiscono tra i modelli — gli stessi conteggi alle tariffe Kunavo di Claude Haiku 4.5 ($0,70 in ingresso, $0,07 in cache, $3,50 in uscita per milione) corrispondono a circa $0,021 e $0,020 per esecuzione. La potenza assorbita non è stata misurata; l'elettricità per esecuzione è watt × secondi ÷ 3.600.000 × il prezzo per kWh.
Lo schema pratico consiste nell'usare un modello locale come principale, con un fallback ospitato per i turni che il modello locale non riesce a gestire. OpenClaw accetta un elenco fallbacks per agente; una chiave Kunavo funziona come provider compatibile con OpenAI accanto a Ollama e viene fatturata per token a partire da un saldo prepagato. Nessuno presso Kunavo ha eseguito OpenClaw contro il suo endpoint: queste esecuzioni sono state interamente locali.
Domande frequenti
Qual è il miglior modello locale per OpenClaw?
Tra i tre che abbiamo misurato, gemma4 — il modello Ollama suggerito dallo stesso OpenClaw. Su un M3 Max con 128 GB, con OpenClaw 2026.9.7 e Ollama 0.35.0, gemma4 (7.5B, Q4_K_M) ha superato tutte le 12 esecuzioni valutate su quattro attività; gpt-oss:20b (20.9B, MXFP4) ne ha superate 11 su 12, con 19 chiamate agli strumenti fallite contro le 7 di gemma4; qwen3-coder:30b ne ha superate 2 su 12 perché le sue chiamate agli strumenti continuavano a rompersi nel parser di Ollama. È un risultato su tre modelli e attività brevi, non una classifica di ogni modello locale.
OpenClaw può funzionare completamente offline con Ollama?
Sì per le chiamate al modello: con il provider indirizzato a un host Ollama locale, ogni richiesta al modello in queste esecuzioni è andata a 127.0.0.1. Usa l'URL nativo, http://127.0.0.1:11434, non quello compatibile con OpenAI /v1 — la documentazione Ollama di OpenClaw afferma che /v1 interrompe le chiamate agli strumenti e può far stampare ai modelli JSON grezzo di chiamata allo strumento come testo. Skill o strumenti che raggiungono Internet ne hanno ancora bisogno, e l'immagine sandbox Docker di OpenClaw deve essere creata una volta (non viene scaricata automaticamente).
Quanta memoria richiede un modello locale di OpenClaw?
Su disco, gemma4 occupa 6.6 GB, gpt-oss:20b 13.8 GB e qwen3-coder:30b 18.6 GB. Caricato, Ollama ha riportato 13.7 GB per gpt-oss e 45.3 GB per qwen3-coder, perché Ollama 0.35.0 ha dimensionato autonomamente il contesto — 131.072 token per gemma4 e gpt-oss, 262.144 per qwen3-coder — indipendentemente dai 32.768 indicati a OpenClaw. Su un Mac da 128 GB entra tutto; su una macchina da 16 o 32 GB non sarebbe possibile senza un contesto più piccolo. Non sono state testate macchine più piccole.
Un modello locale è gratuito rispetto a un'API?
Not free, just billed differently: you pay in time, disk and electricity instead of per token. Each run here used about 95,000–105,000 tokens counting OpenClaw's re-sent context — on a metered API at Claude Haiku 4.5 rates that would be roughly $0,021 a run, as rough arithmetic across different tokenizers. A local run took about 54 seconds; power draw was not measured, so the electricity side is a formula: watts × seconds ÷ 3.600.000 × your price per kWh.
Perché qwen3-coder fallisce in OpenClaw con Ollama?
Nelle nostre esecuzioni il problema era il formato delle chiamate agli strumenti, non il codice. qwen3-coder scrive le chiamate agli strumenti come XML e in Ollama 0.35.0 cinque delle sue dodici esecuzioni sono terminate con il log del server di Ollama che riportava "qwen tool call parsing failed" — un errore di sintassi XML, un elemento <parameter> chiuso da </function> — dopodiché OpenClaw si è fermato con "Agent run failed". Altre quattro hanno stampato un </tool_call> isolato come testo, senza alcuna chiamata analizzabile da Ollama, quindi non è stato eseguito nulla. Controlla il log del server per quell'avviso prima di incolpare il modello e riprova su una versione più recente di Ollama: il parser è quello di Ollama e questo risultato è specifico della versione 0.35.0.
Perché impostare contextWindow aggiungendo manualmente modelli Ollama a OpenClaw?
Perché una voce di modello configurata esplicitamente senza questo parametro ha determinato un contesto di 200.000 token nella nostra esecuzione di smoke test — ben oltre ciò che gestisce la maggior parte dei modelli locali — mentre la configurazione Ollama di OpenClaw scrive 32.768 per i modelli locali. Fissare contextWindow (e maxTokens) mantiene realistico il budget di compattazione di OpenClaw. Non modifica il num_ctx di Ollama: qui Ollama ha comunque caricato i modelli a 131.072.
Eseguito il 1° ottobre 2026 su un Apple M3 Max (128 GB): OpenClaw 2026.9.7 (npm, Node 24.21.0), Ollama v0.35.0 (binario di release), gemma4:latest, gpt-oss:20b e qwen3-coder:30b scaricati dal registro Ollama e verificati tramite sha256. Ciascuna delle 36 esecuzioni ha usato un workspace nuovo e uno stato OpenClaw nuovo, exec nella sandbox Docker di OpenClaw e un valutatore basato su script; le chiamate agli strumenti e i conteggi dei token sono l'output JSON prodotto da OpenClaw. I fixture delle attività, i valutatori e lo script dell'adattatore sono pubblicati insieme alle evidenze di questa pagina. Non sono stati misurati: consumo energetico, attività lunghe, altre quantizzazioni o macchine più piccole.