Sur un M3 Max de 128 Go exécutant OpenClaw 2026.9.7 avec Ollama 0.35.0, gemma4 — le modèle recommandé par la configuration Ollama d’OpenClaw — a réussi les 12 exécutions évaluées sur quatre tâches agentiques ; gpt-oss:20b en a réussi 11 sur 12 avec près de trois fois plus d’appels d’outils échoués ; et qwen3-coder:30b, le choix habituel pour le code, en a réussi 2 sur 12, car ses appels d’outils échouaient sans cesse dans l’analyseur d’Ollama. Nous avons exécuté chaque modèle trois fois pour chaque tâche dans un espace de travail vierge, évalué le résultat par script et enregistré les nombres d’appels d’outils et de tokens fournis par OpenClaw lui-même ainsi que le journal du serveur Ollama. Mesuré le 1er octobre 2026.
Pour connaître le coût d’OpenClaw lui-même et celui d’un modèle hébergé, consultez les tarifs d’OpenClaw ; pour exécuter un modèle local avec un repli vers une API, consultez plusieurs agents et modèles dans OpenClaw.
Ce qui a été exécuté
| Machine | Apple M3 Max, 128 Go de mémoire unifiée |
| OpenClaw | 2026.9.7 depuis npm, Node 24.21.0, openclaw agent --local --json, un tour par exécution |
| Ollama | Binaire de la version 0.35.0, API native (sans /v1) |
| Modèles | gemma4:latest — 7.5B, Q4_K_M, 6.6 Go sur disque ; gpt-oss:20b — 20.9B, MXFP4, 13.8 Go ; qwen3-coder:30b — mélange d’experts de 30.5B, Q4_K_M, 18.6 Go |
| Contexte | OpenClaw contextWindow 32 768 pour les trois ; Ollama a chargé gemma4 et gpt-oss à 131 072 et qwen3-coder à 262 144 |
| Exécution des outils | Sandbox Docker d’OpenClaw, espace de travail monté en lecture-écriture |
| Exécutions | 4 tâches × 3 répétitions × 3 modèles = 36, chacune dans un espace de travail vierge avec un état OpenClaw vierge |
Les quatre tâches
| Tâche | Ce que l’agent devait faire | Réussite lorsque |
|---|---|---|
| Lecture | Lire un journal de service de 301 lignes et nommer le service sur son unique ligne ERROR | La réponse contient le nom correct du service |
| Correctif | Exécuter un fichier de tests unitaires, corriger le bug dans le module testé, puis relancer — sans toucher aux tests | Les tests se terminent avec le code 0 et le fichier de test est identique octet par octet |
| Comptage | Compter les lignes de données de cinq fichiers CSV et écrire les décomptes dans counts.json | counts.json est égal à l’objet attendu |
| Correction de deux fichiers | Deux bogues indépendants dans deux modules derrière trois tests en échec ; corrigez-les tous les deux sans toucher aux tests | Tous les tests se terminent avec le code 0 et les tests sont identiques octet par octet |
Résultats
| Modèle | Tâche | Réussites | Temps médian | Appels d’outils médians | Appels d’outils échoués (3 exécutions) | Tokens médians en entrée / sortie |
|---|---|---|---|---|---|---|
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 |
Les temps sont mesurés au mur pour chaque exécution, y compris environ cinq à sept secondes de démarrage d’OpenClaw. « Tokens en entrée » désigne l’entrée non mise en cache telle qu’OpenClaw l’a enregistrée ; le contexte renvoyé depuis le cache s’y ajoute et est comptabilisé dans la section des coûts ci-dessous. La colonne des appels d’outils échoués compte les échecs enregistrés par OpenClaw ; les échecs de qwen3-coder se sont produits avant qu’un appel n’atteigne OpenClaw, ils apparaissent donc comme zéro ici et sont expliqués ci-dessous.
Ce que disent les chiffres
- gemma4 et gpt-oss:20b sont tous deux utilisables pour les tâches agentiques courtes. 23 de leurs 24 exécutions ont réussi, y compris la correction de deux fichiers, qui nécessite de lire plusieurs modules, d’en modifier deux et de relancer les tests.
- gemma4 a utilisé les outils plus proprement. Pour la tâche de lecture, il a effectué exactement un appel d’outil à chaque fois ; gpt-oss en a effectué trois, dont deux échouaient généralement avant la lecture du fichier. Sur les douze exécutions, gpt-oss a enregistré 19 appels d’outils échoués contre 7 pour gemma4, et a effectué en moyenne 9.1 tours d’assistant par tâche contre 6.8 pour gemma4.
- L’unique échec concernait gpt-oss sur la tâche de comptage : après treize appels d’outils, il a écrit un counts.json mal formé et a terminé le tour sans réponse.
- La vitesse n’est pas le facteur différenciant ici. Temps médian de 53 s pour gemma4 et de 54 s pour gpt-oss sur l’ensemble des exécutions ; l’exécution individuelle la plus lente a été celle de gemma4, avec 133 s sur la correction de deux fichiers et dix-sept appels d’outils. Les exécutions de qwen3-coder étaient plus courtes uniquement parce qu’elles échouaient tôt.
- Les modèles plus grands n’ont pas amélioré la précision sur ces tâches. gpt-oss:20b possède presque trois fois plus de paramètres que gemma4 et qwen3-coder:30b, conçu pour le code, a obtenu le score le plus faible des trois.
Douze exécutions par modèle suffisent pour voir une tendance sur ces tâches, mais pas pour classer les modèles en général. Les tâches longues, les bases de code plus importantes et d’autres quantifications n’ont pas été testées.
Pourquoi qwen3-coder:30b a échoué
Ce n’était pas lié au codage. Sur ses dix exécutions échouées :
- Cinq se sont terminées dans l’analyseur d’Ollama. qwen3-coder écrit les appels d’outils en XML et, lorsqu’un argument contenait du code, il fermait un élément
<parameter>avec</function>. Le journal du serveur d’Ollama 0.35.0 a enregistré « qwen tool call parsing failed … XML syntax error … element <parameter> closed by </function> », et OpenClaw a terminé le tour avec « Agent run failed ». - Quatre n'ont jamais effectué d'appel. La réponse annonçait l'étape suivante, puis affichait un simple
</tool_call>sous forme de texte, sans rien qu'Ollama puisse analyser comme un appel ; le tour s'est terminé là. C'est le symptôme que la documentation d'OpenClaw associe à l'URL/v1— ici, il s'est produit avec l'API native. - Une était une mauvaise réponse : elle comptait les lignes d'en-tête du CSV comme des lignes de données.
L'analyseur est celui d'Ollama ; il s'agit donc d'un résultat pour Ollama 0.35.0, et non d'un verdict sur le modèle. Si vous exécutez qwen3-coder avec OpenClaw, surveillez le journal de ollama serve pour repérer « qwen tool call parsing failed » avant d'accuser le modèle, puis refaites le test après une mise à niveau d'Ollama.
La configuration qui comptait
- URL Ollama native. La documentation d'OpenClaw indique que l'URL compatible OpenAI
/v1« perturbe les appels d'outils et les modèles peuvent émettre du JSON brut d'appel d'outil sous forme de texte brut » ; les exécutions utilisaientbaseUrlsans/v1, avecapi: "ollama". - Épinglez
contextWindowdans les entrées rédigées manuellement. Lors d'un test rapide, une entrée de modèle explicite sans cette valeur a abouti à un contexte de 200 000 tokens ; la configuration Ollama d'OpenClaw utilise elle-même 32 768 pour les modèles locaux, valeur retenue par ces exécutions. - Le contexte d'Ollama est distinct. Ollama 0.35.0 a chargé gemma4 et gpt-oss avec 131 072 tokens, et qwen3-coder avec 262 144 — 45,3 Go en mémoire — indépendamment des 32 768 d'OpenClaw ; c'est ce paramètre, et non le budget d'OpenClaw, qui détermine la mémoire.
- Isolez le shell. Le véritable risque ici est qu'un modèle local exécute des commandes shell sur votre machine. Avec
sandbox.mode: "all", exec s'exécutait dans l'image Docker d'OpenClaw, avec uniquement l'espace de travail monté ; l'image est construite une fois avec la commandedocker buildindiquée dans la documentation sur le bac à sable d'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" } },
}Coûts locaux
Un modèle local remplace une facturation par token par du temps, du stockage et de l'électricité. À chaque exécution, OpenClaw a enregistré environ 16,415 tokens d'entrée non mis en cache, 78,469 tokens de contexte mis en cache renvoyés et 1,142 tokens de sortie pour gemma4, ainsi que 13,761, 88,688 et 1,192 pour gpt-oss. À titre de calcul approximatif — les tokeniseurs diffèrent selon les modèles — les mêmes volumes aux tarifs Kunavo de Claude Haiku 4.5 ($0.70 en entrée, $0.07 en cache, $3.50 en sortie par million) représentent environ $0.021 et $0.020 par exécution. La consommation électrique n'a pas été mesurée ; l'électricité par exécution se calcule ainsi : watts × secondes ÷ 3 600 000 × votre prix par kWh.
Le schéma pratique consiste à utiliser un modèle local principal avec un recours hébergé pour les tours qu'un modèle local échoue à traiter. OpenClaw accepte une liste de fallbacks par agent ; une clé Kunavo fonctionne comme fournisseur compatible OpenAI à côté d'Ollama, avec une facturation au token sur un solde prépayé. Personne chez Kunavo n'a exécuté OpenClaw contre son endpoint — ces exécutions étaient entièrement locales.
Questions fréquentes
Quel est le meilleur modèle local pour OpenClaw ?
Parmi les trois que nous avons mesurés, gemma4 — le modèle Ollama recommandé par OpenClaw lui-même. Sur un M3 Max avec 128 Go, exécutant OpenClaw 2026.9.7 et Ollama 0.35.0, gemma4 (7.5B, Q4_K_M) a réussi les 12 exécutions évaluées sur quatre tâches ; gpt-oss:20b (20.9B, MXFP4) en a réussi 11 sur 12, avec 19 appels d’outils échoués contre 7 pour gemma4 ; qwen3-coder:30b en a réussi 2 sur 12, car ses appels d’outils continuaient de se briser dans l’analyseur d’Ollama. Il s’agit d’un résultat portant sur trois modèles et des tâches courtes, pas d’un classement de tous les modèles locaux.
OpenClaw peut-il fonctionner entièrement hors ligne avec Ollama ?
Oui pour les appels au modèle : avec le fournisseur configuré vers un hôte Ollama local, toutes les requêtes de modèle de ces exécutions sont allées vers 127.0.0.1. Utilisez l’URL native, http://127.0.0.1:11434, et non celle compatible OpenAI /v1 — la documentation Ollama d’OpenClaw indique que /v1 interrompt les appels d’outils et peut amener les modèles à afficher le JSON brut d’appel d’outil sous forme de texte. Les compétences ou outils qui accèdent à Internet en ont toujours besoin, et l’image sandbox Docker d’OpenClaw doit être construite une fois (elle n’est pas téléchargée automatiquement).
De combien de mémoire un modèle OpenClaw local a-t-il besoin ?
Sur disque, gemma4 occupe 6,6 Go, gpt-oss:20b 13,8 Go et qwen3-coder:30b 18,6 Go. Une fois les modèles chargés, Ollama a indiqué 13,7 Go pour gpt-oss et 45,3 Go pour qwen3-coder, car Ollama 0.35.0 a dimensionné lui-même le contexte — 131 072 tokens pour gemma4 et gpt-oss, 262 144 pour qwen3-coder — indépendamment des 32 768 indiqués à OpenClaw. Sur un Mac de 128 Go, tout cela tient ; sur une machine de 16 ou 32 Go, ce ne serait pas le cas sans un contexte plus petit. Les machines de moindre capacité n’ont pas été testées.
Un modèle local est-il gratuit par rapport à une 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.
Pourquoi qwen3-coder échoue-t-il dans OpenClaw avec Ollama ?
Dans nos exécutions, le problème venait du format des appels d’outils, pas du code. qwen3-coder écrit les appels d’outils en XML et, avec Ollama 0.35.0, cinq de ses douze exécutions se sont terminées lorsque le journal du serveur Ollama a signalé « qwen tool call parsing failed » — une erreur de syntaxe XML, un élément <parameter> fermé par </function> — après quoi OpenClaw s’est arrêté avec « Agent run failed ». Quatre autres ont affiché un </tool_call> isolé sous forme de texte, sans appel analysable par Ollama, donc rien n’a été exécuté. Vérifiez le journal du serveur à la recherche de cet avertissement avant d’incriminer le modèle, et retestez avec une version plus récente d’Ollama : l’analyseur appartient à Ollama, et ce résultat est propre à la version 0.35.0.
Pourquoi définir contextWindow lors de l’ajout manuel de modèles Ollama à OpenClaw ?
Parce qu’une entrée de modèle explicite sans ce paramètre a été résolue en un contexte de 200 000 tokens lors de notre test rapide — bien au-delà de ce que la plupart des modèles locaux peuvent gérer — alors que la configuration Ollama d’OpenClaw écrit 32 768 pour les modèles locaux. Épingler contextWindow (et maxTokens) maintient un budget de compactage réaliste pour OpenClaw. Cela ne modifie pas le num_ctx d’Ollama : ici, Ollama a tout de même chargé les modèles avec 131 072.
Exécuté le 1er octobre 2026 sur un Apple M3 Max (128 Go) : OpenClaw 2026.9.7 (npm, Node 24.21.0), Ollama v0.35.0 (binaire de publication), gemma4:latest, gpt-oss:20b et qwen3-coder:30b téléchargés depuis le registre Ollama et vérifiés par sha256. Chacune des 36 exécutions utilisait un espace de travail vierge et un nouvel état OpenClaw, exec dans le bac à sable Docker d'OpenClaw et un évaluateur par script ; les appels d'outils et les décomptes de tokens proviennent de la sortie JSON d'OpenClaw. Les jeux de test des tâches, les évaluateurs et le script adaptateur sont publiés avec les éléments justificatifs de cette page. Non mesurés : consommation électrique, tâches longues, autres quantifications ou machines de moindre capacité.