Les modèles locaux sont possibles. Ils exigent aussi davantage du matériel, de la taille de contexte et de la défense contre l’injection de prompts — les cartes petites ou quantifiées agressivement tronquent le contexte et affaiblissent la sécurité. Cette page est le guide prescriptif pour les stacks locales haut de gamme et les serveurs locaux personnalisés compatibles OpenAI. Pour une intégration avec le moins de friction possible, commencez par LM Studio ou Ollama etDocumentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
openclaw onboard.
Pour les serveurs locaux qui ne doivent démarrer que lorsqu’un modèle sélectionné en a besoin, consultez
Services de modèles locaux.
Socle matériel
Visez haut : ≥2 Mac Studios au maximum de leur configuration ou une machine GPU équivalente (~30 k$+) pour une boucle d’agent confortable. Un seul GPU de 24 Go ne convient qu’aux prompts plus légers, avec une latence plus élevée. Exécutez toujours la variante la plus grande / complète que vous pouvez héberger ; les checkpoints petits ou fortement quantifiés augmentent le risque d’injection de prompts (voir Sécurité).Choisir un backend
| Backend | À utiliser lorsque |
|---|---|
| LM Studio | Première configuration locale, chargeur GUI, API Responses native |
| Ollama | Flux de travail CLI, bibliothèque de modèles, service systemd sans intervention |
| MLX / vLLM / SGLang | Service auto-hébergé à haut débit avec un point de terminaison HTTP compatible OpenAI |
| LiteLLM / OAI-proxy / proxy personnalisé compatible OpenAI | Vous placez une autre API de modèle en façade et voulez qu’OpenClaw la traite comme OpenAI |
api: "openai-responses") lorsque le backend la prend en charge (c’est le cas de LM Studio). Sinon, restez sur Chat Completions (api: "openai-completions").
Recommandé : LM Studio + grand modèle local (API Responses)
Meilleure stack locale actuelle. Chargez un grand modèle dans LM Studio (par exemple une build Qwen, DeepSeek ou Llama complète), activez le serveur local (http://127.0.0.1:1234 par défaut) et utilisez l’API Responses pour séparer le raisonnement du texte final.
- Installez LM Studio : https://lmstudio.ai
- Dans LM Studio, téléchargez la plus grande build de modèle disponible (évitez les variantes « small »/fortement quantifiées), démarrez le serveur, confirmez que
http://127.0.0.1:1234/v1/modelsle liste. - Remplacez
my-local-modelpar l’ID de modèle réel affiché dans LM Studio. - Gardez le modèle chargé ; le chargement à froid ajoute de la latence au démarrage.
- Ajustez
contextWindow/maxTokenssi votre build LM Studio diffère. - Pour WhatsApp, restez sur l’API Responses afin que seul le texte final soit envoyé.
models.mode: "merge" afin que les fallbacks restent disponibles.
Configuration hybride : primaire hébergé, fallback local
Local d’abord avec filet de sécurité hébergé
Inversez l’ordre du primaire et des fallbacks ; gardez le même bloc providers etmodels.mode: "merge" afin de pouvoir revenir à Sonnet ou Opus lorsque la machine locale est indisponible.
Hébergement régional / routage des données
- Des variantes MiniMax/Kimi/GLM hébergées existent aussi sur OpenRouter avec des points de terminaison ancrés par région (par exemple hébergés aux États-Unis). Choisissez la variante régionale à cet endroit pour conserver le trafic dans la juridiction de votre choix tout en utilisant
models.mode: "merge"pour les fallbacks Anthropic/OpenAI. - Le local uniquement reste la voie la plus forte pour la confidentialité ; le routage régional hébergé est le compromis lorsque vous avez besoin de fonctionnalités de fournisseur tout en voulant contrôler le flux des données.
Autres proxys locaux compatibles OpenAI
MLX (mlx_lm.server), vLLM, SGLang, LiteLLM, OAI-proxy ou des Gateway personnalisés fonctionnent s’ils exposent un point de terminaison de style OpenAI /v1/chat/completions. Utilisez l’adaptateur Chat Completions sauf si le backend documente explicitement la prise en charge de /v1/responses. Remplacez le bloc provider ci-dessus par votre point de terminaison et votre ID de modèle :
api est omis sur un provider personnalisé avec un baseUrl, OpenClaw utilise par défaut openai-completions. Les points de terminaison de bouclage tels que 127.0.0.1 sont automatiquement approuvés ; les points de terminaison LAN, tailnet et DNS privé nécessitent toujours request.allowPrivateNetwork: true.
La valeur models.providers.<id>.models[].id est locale au provider. N’y incluez pas le préfixe du provider. Par exemple, un serveur MLX démarré avec mlx_lm.server --model mlx-community/Qwen3-30B-A3B-6bit doit utiliser cet ID de catalogue et cette référence de modèle :
models.providers.mlx.models[].id: "mlx-community/Qwen3-30B-A3B-6bit"agents.defaults.model.primary: "mlx/mlx-community/Qwen3-30B-A3B-6bit"
input: ["text", "image"] sur les modèles de vision locaux ou proxifiés afin que les pièces jointes image soient injectées dans les tours d’agent. L’onboarding interactif des providers personnalisés déduit les ID de modèles de vision courants et ne pose des questions que pour les noms inconnus. L’onboarding non interactif utilise la même inférence ; utilisez --custom-image-input pour les ID de vision inconnus ou --custom-text-input lorsqu’un modèle qui ressemble à un modèle connu est texte uniquement derrière votre point de terminaison.
Gardez models.mode: "merge" afin que les modèles hébergés restent disponibles comme fallbacks. Utilisez models.providers.<id>.timeoutSeconds pour les serveurs de modèles locaux ou distants lents avant d’augmenter agents.defaults.timeoutSeconds. Le délai d’expiration du provider ne s’applique qu’aux requêtes HTTP de modèle, y compris la connexion, les en-têtes, le streaming du corps et l’abandon total guarded-fetch.
Pour les providers personnalisés compatibles OpenAI, la persistance d’un marqueur local non secret tel que
apiKey: "ollama-local" est acceptée lorsque baseUrl se résout vers une adresse de bouclage, un LAN privé, .local ou un nom d’hôte nu. OpenClaw le traite comme un identifiant local valide au lieu de signaler une clé manquante. Utilisez une vraie valeur pour tout provider qui accepte un nom d’hôte public./v1 locaux/proxifiés :
- OpenClaw les traite comme des routes compatibles OpenAI de type proxy, et non comme des points de terminaison OpenAI natifs
- la mise en forme des requêtes réservée à OpenAI natif ne s’applique pas ici : pas de
service_tier, pas destoreResponses, pas de mise en forme de payload compatible raisonnement OpenAI, et pas d’indices de cache de prompt - les en-têtes d’attribution OpenClaw masqués (
originator,version,User-Agent) ne sont pas injectés sur ces URL de proxy personnalisées
-
Certains serveurs n’acceptent que des
messages[].contentsous forme de chaîne sur Chat Completions, et non des tableaux structurés de parties de contenu. Définissezmodels.providers.<provider>.models[].compat.requiresStringContent: truepour ces points de terminaison. -
Certains modèles locaux émettent des demandes d’outil autonomes entre crochets sous forme de texte, telles que
[tool_name]suivies de JSON et de[END_TOOL_REQUEST]. OpenClaw les promeut en appels d’outil réels uniquement lorsque le nom correspond exactement à un outil enregistré pour le tour ; sinon, le bloc est traité comme du texte non pris en charge et masqué dans les réponses visibles par l’utilisateur. - Si un modèle émet du texte JSON, XML ou de style ReAct qui ressemble à un appel d’outil mais que le provider n’a pas émis d’invocation structurée, OpenClaw le laisse comme texte et journalise un avertissement avec l’ID d’exécution, le provider/modèle, le motif détecté et le nom de l’outil lorsqu’il est disponible. Traitez cela comme une incompatibilité d’appel d’outil provider/modèle, pas comme une exécution d’outil terminée.
-
Si des outils apparaissent comme du texte assistant au lieu de s’exécuter, par exemple du JSON brut, du XML, une syntaxe ReAct ou un tableau
tool_callsvide dans la réponse du provider, vérifiez d’abord que le serveur utilise un modèle/parser de chat capable d’appels d’outil. Pour les backends Chat Completions compatibles OpenAI dont le parser fonctionne uniquement lorsque l’utilisation d’outils est forcée, définissez un override de requête par modèle au lieu de vous appuyer sur l’analyse de texte :Utilisez ceci uniquement pour les modèles/sessions où chaque tour normal doit appeler un outil. Cela remplace la valeur proxy par défaut d’OpenClaw,tool_choice: "auto". Remplacezlocal/my-local-modelpar la référence provider/modèle exacte affichée paropenclaw models list. -
Si un modèle personnalisé compatible OpenAI accepte des efforts de raisonnement OpenAI au-delà du profil intégré, déclarez-les dans le bloc compat du modèle. Ajouter
"xhigh"ici fait que/think xhigh, les sélecteurs de session, la validation Gateway et la validationllm-taskexposent le niveau pour cette référence provider/modèle configurée :
Backends plus petits ou plus stricts
Si le modèle se charge correctement mais que les tours complets de l’agent se comportent mal, procédez de haut en bas — confirmez d’abord le transport, puis réduisez la surface.-
Confirmez que le modèle local lui-même répond. Aucun outil, aucun contexte d’agent :
-
Confirmez le routage du Gateway. Envoie uniquement le prompt fourni — ignore la transcription, l’amorçage AGENTS, l’assemblage du moteur de contexte, les outils et les serveurs MCP groupés, mais exerce tout de même le routage du Gateway, l’authentification et la sélection du fournisseur :
-
Essayez le mode allégé. Si les deux sondes réussissent mais que les vrais tours d’agent échouent avec des appels d’outil mal formés ou des prompts surdimensionnés, activez
agents.defaults.experimental.localModelLean: true. Il supprime les trois outils par défaut les plus lourds (browser,cron,message) afin que la forme du prompt soit plus petite et moins fragile. Consultez Fonctionnalités expérimentales → Mode allégé pour modèle local pour l’explication complète, les cas d’utilisation et la manière de confirmer qu’il est activé. -
Désactivez entièrement les outils en dernier recours. Si le mode allégé ne suffit pas, définissez
models.providers.<provider>.models[].compat.supportsTools: falsepour cette entrée de modèle. L’agent fonctionnera alors sans appels d’outil sur ce modèle. -
Au-delà, le goulot d’étranglement est en amont. Si le backend échoue encore uniquement sur des exécutions OpenClaw plus importantes après le mode allégé et
supportsTools: false, le problème restant concerne généralement le modèle ou la capacité du serveur en amont — fenêtre de contexte, mémoire GPU, éviction du kv-cache ou bug du backend. À ce stade, ce n’est pas la couche de transport d’OpenClaw.
Dépannage
- Le Gateway peut-il atteindre le proxy ?
curl http://127.0.0.1:1234/v1/models. - Modèle LM Studio déchargé ? Rechargez-le ; le démarrage à froid est une cause fréquente de « blocage ».
- Le serveur local indique
terminated,ECONNRESET, ou ferme le flux en plein tour ? OpenClaw enregistre unmodel.call.error.failureKindà faible cardinalité ainsi que l’instantané RSS/tas du processus OpenClaw dans les diagnostics. En cas de pression mémoire avec LM Studio/Ollama, faites correspondre cet horodatage avec le journal du serveur ou le journal de plantage / jetsam de macOS pour confirmer si le serveur de modèle a été tué. - OpenClaw dérive les seuils de prévalidation de la fenêtre de contexte à partir de la fenêtre du modèle détectée, ou de la fenêtre de modèle non plafonnée lorsque
agents.defaults.contextTokensabaisse la fenêtre effective. Il avertit sous 20 % avec un plancher de 8k. Les blocages stricts utilisent le seuil de 10 % avec un plancher de 4k, plafonné à la fenêtre de contexte effective afin que des métadonnées de modèle surdimensionnées ne puissent pas rejeter une limite utilisateur pourtant valide. Si vous atteignez cette prévalidation, augmentez la limite de contexte du serveur/modèle ou choisissez un modèle plus grand. - Erreurs de contexte ? Réduisez
contextWindowou augmentez votre limite serveur. - Un serveur compatible OpenAI renvoie
messages[].content ... expected a string? Ajoutezcompat.requiresStringContent: trueà cette entrée de modèle. - Un serveur compatible OpenAI renvoie
validation.keysou indique que les entrées de message n’autorisent queroleetcontent? Ajoutezcompat.strictMessageKeys: trueà cette entrée de modèle. - Les petits appels directs à
/v1/chat/completionsfonctionnent, maisopenclaw infer model run --localéchoue sur Gemma ou un autre modèle local ? Vérifiez d’abord l’URL du fournisseur, la référence du modèle, le marqueur d’authentification et les journaux du serveur ; lemodel runlocal n’inclut pas les outils d’agent. Si lemodel runlocal réussit mais que les tours d’agent plus importants échouent, réduisez la surface d’outils de l’agent aveclocalModelLeanoucompat.supportsTools: false. - Les appels d’outil apparaissent comme du texte JSON/XML/ReAct brut, ou le fournisseur renvoie un
tableau
tool_callsvide ? N’ajoutez pas de proxy qui convertit aveuglément le texte de l’assistant en exécution d’outil. Corrigez d’abord le modèle de chat/parser du serveur. Si le modèle ne fonctionne que lorsque l’utilisation d’outils est forcée, ajoutez le remplacement par modèleparams.extra_body.tool_choice: "required"ci-dessus et utilisez cette entrée de modèle uniquement pour les sessions où un appel d’outil est attendu à chaque tour. - Sécurité : les modèles locaux ignorent les filtres côté fournisseur ; gardez des agents ciblés et la Compaction activée pour limiter le rayon d’action de l’injection de prompt.