Configuration du fournisseur
Chaque fournisseur de modèle se trouve dans [providers.models.<type>.<alias>]. <type> est un emplacement de famille canonique (consultez le Catalog pour chaque emplacement avec son point de terminaison). <alias> est le nom d’instance attribué par l’opérateur, choisissez n’importe quel nom descriptif (home, work, cn, gpt5, …).
Exemple de travail minimal
La configuration minimale qui se charge sans erreur comporte quatre en-têtes de section : une entrée de fournisseur, un agent qui y fait référence, et un profil de risque sur lequel l’agent applique ses contrôles. Configurez-les via la passerelle, zerocode ou zeroclaw config set ; la référence de configuration contient l’index complet des champs.
Référence des champs : entrée de fournisseur
Presque chaque famille reprend également les champs communs de ModelProviderConfig :
api_key: identifiant pour les fournisseurs qui utilisent des clés API de type bearer ou d’abonnement.uri: surcharge complète de l’endpoint. Laisser non défini pour utiliser le résolveur d’endpoint de la famille.model: identifiant du modèle envoyé au fournisseur.temperature: température d’échantillonnage optionnelle.timeout_secs: délai d’attente de la requête HTTP en secondes.max_tokens: limite optionnelle de la longueur de la réponse.extra_headers: en-têtes HTTP supplémentaires pour des passerelles personnalisées ou des ponts d’authentification.fallback_models: identifiants de modèles alternatifs sur le même alias de fournisseur.fallback: liste ordonnée d’autres alias de fournisseurs en notation pointée à essayer après l’échec de cet alias.wire_api,native_tools,provider_extra,thinketchat_template_kwargs: surcharges avancées de protocole et de corps de requête.vision: remplace la capacité d’entrée d’image (vision) du fournisseur. Laissez cette option non définie pour utiliser la valeur par défaut intégrée de la famille. Définissezfalsepour un modèle texte uniquement servi par une famille compatible avec la vision (par exemple, un modèle texte derrière llama.cpp) afin que les messages d’image soient acheminés vers un[multimodal] vision_model_providerconfiguré au lieu de générer une erreur ; définisseztruepour la forcer.tool_result_image_policy: gestion des marqueurs d’image dans les résultats natifs derole = "tool"envoyés aux fournisseurs compatibles avec les chat-completions. La valeur par défaut est"image_url"; définissez-la sur"omit"pour supprimer les charges utiles URI/base64 des images et ajouter une notification fixe. Cela ne modifie pas les images utilisateur directes ni les fournisseurs OpenAI Responses.tls_ca_cert_path: chemin absolu vers un certificat CA encodé en PEM pour les connexions TLS à ce fournisseur (une surcharge de confiance par fournisseur, distincte duca_cert_pathTLS de la passerelle). L’expansion shell telle que~n’est pas effectuée ; laisser non défini pour utiliser le magasin de confiance du système.
Les entrées spécifiques à la famille ajoutent leurs propres champs typés en plus de ces champs partagés.
Ordre de résolution des champs
Pour la plupart des familles, l’URL est résolue dans cet ordre :
- Substitution opérateur : champ
urisur l’entrée d’alias, s’il est défini. - Endpoint de famille : l’énumération
*Endpointde la famille fournit l’URL (par ex.OpenAIEndpoint::Default->https://api.openai.com/v1). Les familles multi-régions disposent d’un champendpointsur l’entrée d’alias qui sélectionne la variante (par ex.endpoint = "cn"pour Moonshot). - Familles basées sur des modèles : Azure accepte des entrées typées (
resource,deployment,api_version) et les substitue dans le modèle d’URI de la famille. Les champs manquants échouent explicitement à l’exécution.
Bedrock est une exception : le nom d’hôte de son point de terminaison est construit au moment de la requête à partir de la région de signature résolue via la chaîne d’identifiants AWS (AWS_REGION, AWS_DEFAULT_REGION, ou la region du profil credential_process ou IMDS actif). Le champ d’alias uri et le champ providers.models.bedrock.<alias>.region au niveau du schéma n’ont aucun effet dans l’implémentation actuelle.
Emplacements familiaux
Chaque slot, son endpoint par défaut et son exécution locale ou non figurent dans le Catalogue. Il existe une clé canonique par fournisseur : pas de synonymes.
Identifiants
Formes de saisie et de stockage des identifiants prises en charge :
api_key = "..."en ligne dans l’entrée d’alias (acceptable en développement, risqué pour les configs versionnées).- Références 1Password : définissez un champ secret sur
op://vault/item/field. ZeroClaw conserve la référence dans la configuration et la résout à l’exécution avecop read, le CLI 1Password doit donc être installé et connecté. - Magasin de secrets au niveau de la configuration : chiffré dans
~/.zeroclaw/secretsvia un fichier de clé local. - Substitution générique via variable d’environnement :
ZEROCLAW_providers__models__<type>__<alias>__api_key=...définitproviders.models.<type>.<alias>.api_keyau démarrage. Consultez Variables d’environnement pour la grammaire complète.
Les substitutions d’environnement schema-mirror prévalent au démarrage. Elles remplacent l’identifiant en mémoire pour ce processus sans réécrire la valeur stockée inline, chiffrée ou op:// sur le disque.
zeroclaw quickstart écrit les identifiants dans le magasin de secrets par défaut. Les configurations que vous validez ne doivent pas contenir de clés en ligne. Pour les noms par défaut de l’écosystème que vous exportez déjà dans votre shell ($ANTHROPIC_API_KEY, $OPENROUTER_API_KEY, …), la référence env-vars présente les expansions bash d’une seule ligne qui font pointer un nom miroir du schéma vers la valeur existante.
Authentification OAuth et authentification par abonnement
Plusieurs fournisseurs acceptent des jetons OAuth ou de type abonnement au lieu de clés API brutes. Obtenez le jeton depuis le tableau de bord ou le flux CLI du fournisseur, puis insérez-le dans l’entrée d’alias de la même manière qu’une clé API :
- Anthropic / Claude : Les clés API et les jetons de la console générés par
claude setup-tokenpour Claude Max se placent dansapi_keysur[providers.models.anthropic.<alias>]. Dans le Quickstart, choisissezapi_keyousetup_token; l’entrée de fournisseur enregistrée correspond toujours au champ canoniqueanthropic. - Abonnement OpenAI Codex : exécutez
zeroclaw auth login --model-provider openai-codex(ou importez une connexion CLI Codex existante avec--import ~/.codex/auth.json), puis définissezrequires_openai_auth = trueet laissezapi_keynon défini dans[providers.models.openai.<alias>]; le runtime lit le profil d’authentificationopenai-codexstocké par ZeroClaw. - Gemini CLI :
[providers.models.gemini_cli.<alias>]délègue l’exécution à la CLIgemini; utilisez le flux d’authentification propre à la CLI. - Grok Build CLI :
[providers.models.grok_cli.<alias>]exécute une commande externe via l’interface ACP documentéegrok agent stdio. Le prompt assemblé est transmis sous forme de JSON-RPC sur stdin, jamais via argv ni par un fichier de prompt. L’authentification utilise par défaut le cache de connexion de la CLI. Pour l’authentification par clé API, exportezXAI_API_KEYdans l’environnement du démon et ajoutez explicitementenv_passthrough = ["XAI_API_KEY"]à l’alias ; l’alias typéapi_keyreste non pris en charge. Unworking_directoryabsolu et existant est requis et définit à la fois le cwd du processus enfant et la limite de session ACP. L’environnement du processus enfant est vidé avant son lancement, etenv_passthroughest vide par défaut. Les autres variablesXAI_*appartenant au fournisseur et toutes les variablesGROK_*sont rejetées. ZeroClaw utilise par défaut--sandbox strict,--permission-mode dontAsk, un ensemble vide d’outils intégrés et des réponses d’autorisation ACP qui refusent en cas d’échec.extra_argsest l’activation explicite propre à chaque alias pour assouplir ces contrôles. Les options de contournement--always-approve,--dangerously-skip-permissions,--yoloet--permission-mode=bypassPermissionsamènent le client ACP sans interface à sélectionnerallow_once; les autres modes d’autorisation continuent d’entraîner la sélection dereject_once. Les options ACP de transport, de modèle, de session et de cwd, ainsi que les arguments positionnels et courts, sont réservés ; les options longues inconnues qui prennent une valeur utilisent--flag=value. L’aliasvision = truene fait qu’autoriser ZeroClaw à envoyer des blocs d’image ACP ; Grok continue d’annoncerpromptCapabilities.image = falsejusqu’à la version 0.2.118 incluse et n’utilise pas de manière fiable le contenu de l’image — laissez ce paramètre non défini en production ; voir vision ACP / entrée d’image. - Qwen / MiniMax : définissez
auth_mode = "o_auth"dans l’entrée d’alias, ainsi que les champsoauth_*pertinents (voir env-vars → OAuth et champs de chemin CLI).
Remplacements adaptés aux conteneurs
Lorsque ZeroClaw s’exécute dans un conteneur et qu’un fournisseur se trouve sur l’hôte (par ex. Ollama), définissez uri sur une adresse accessible depuis l’hôte. Le mécanisme générique de surcharge par variables d’environnement (ZEROCLAW_<dotted_path_with_double_underscores>=<value>) peut définir le même champ à l’exécution sans modifier la configuration :
sh
ZEROCLAW_providers__models__ollama__home__uri=http://ollama:11434 zeroclaw agent -a assistant
__ est le séparateur de chemin ; l’exemple ci-dessus définit providers.models.ollama.home.uri. Consultez Variables d’environnement pour la grammaire complète.
Capacité de vision par modèle
Utilisez vision lorsqu’une famille de fournisseurs peut servir à la fois des modèles multimodaux et des modèles texte uniquement. La valeur appartient à l’alias du fournisseur, de sorte que les chemins de routage et de repli la résolvent en même temps que le point de terminaison, les identifiants et le modèle de cet alias :
[providers.models.openai.vision]
model = "gpt-4o"
wire_api = "responses"
vision = true
[providers.models.llamacpp.text]
model = "qwen3-4b"
vision = false
Laisser vision non défini préserve la valeur par défaut intégrée de la famille de fournisseurs. Pour les alias OpenAI Responses, définissez vision = true pour les modèles qui acceptent les entrées d’image ; cette activation explicite empêche que des modèles Responses uniquement textuels reçoivent accidentellement des charges utiles d’image.
Le paramètre vision = true est une affirmation explicite de l’opérateur selon laquelle l’alias sélectionné accepte les entrées d’image. Il modifie le routage des images : ZeroClaw conserve les pièces jointes d’image sur cet alias au lieu de les traiter comme du texte uniquement ou de les acheminer vers multimodal.vision_model_provider. Ne le définissez que pour une combinaison fournisseur et modèle testée. Pour grok_cli, le même champ contrôle uniquement si ZeroClaw envoie des blocs d’images ACP ; il ne modifie pas l’annonce promptCapabilities.image de Grok (toujours false jusqu’à la version 0.2.118) et ne permet pas à la CLI de décrire l’image de manière fiable. Voir vision ACP / entrée d’image.
Lorsque [multimodal] vision_model_provider désigne un alias de fournisseur avec point, son model est utilisé automatiquement. Un [multimodal] vision_model explicite est prioritaire sur le modèle de l’alias ; si aucun n’est défini, le modèle de tour principal est utilisé pour des raisons de rétrocompatibilité.
Affichage natif du raisonnement (Anthropic)
agent.thinking.display contrôle la manière dont le raisonnement étendu d’Anthropic est transmis lorsque le raisonnement natif est activé (agent.thinking.native_thinking = true). Valeurs acceptées :
off(par défaut) : aucun champdisplayn’est envoyé ; les requêtes sont identiques au niveau des octets à celles des versions précédentes de ZeroClaw et les requêtes de réflexion utilisent le mécanisme de secours sans streaming.omitted: Anthropic omet le texte de réflexion de la réponse ; les blocs ne contiennent que la signature (thinkingvide, signature requise), ce qui préserve la relecture tout en réduisant au minimum le raisonnement visible.updates: la requête inclut la version bêtathinking-display-updates-2026-08-18et utilise le chemin de réponse en streaming. La progression lisible de la réflexion est affichée en direct pendant que le modèle travaille ; la charge utile de raisonnement signée est conservée séparément pour la relecture de l’historique et n’est jamais affichée.summarized: même comportement de streaming, en demandant un raisonnement résumé.
[agent.thinking]
native_thinking = true
display = "updates"
Ce paramètre nécessite un compte Anthropic inscrit au programme bêta thinking-display-updates ; sans inscription, l’API rejette la requête. Définissez display = "off" (ou supprimez le champ) pour revenir au comportement précédent au niveau du protocole.
Réglages par famille : exemples détaillés
Ollama
Ollama utilise par défaut le point de terminaison local, un alias local n’a donc besoin que du nom du modèle :
[providers.models.ollama.local]
model = "llama3.1"
Définissez uri lorsque ZeroClaw ne s’exécute pas sur le même hôte qu’Ollama :
[providers.models.ollama.host]
model = "llama3.1"
uri = "http://host.docker.internal:11434"
Les champs optionnels spécifiques à Ollama sont num_ctx, num_predict et temperature_override.
Azure OpenAI
Azure OpenAI détermine son point de terminaison à partir des champs Azure renseignés :
[providers.models.azure.work]
api_key = "op://platform/azure-openai/api-key"
model = "gpt-4o"
resource = "example-resource"
deployment = "gpt-4o-prod"
api_version = "2024-10-21"
Les valeurs resource, deployment et api_version se trouvent dans cette configuration typée, elles ne sont pas lues à partir des variables d’environnement spécifiques à Azure. Utilisez uri uniquement lorsque vous devez remplacer complètement le point de terminaison calculé.
Amazon Bedrock
Bedrock nécessite un alias avec un modèle ; la région du point de terminaison provient actuellement du chemin d’environnement/profil d’authentification Bedrock :
[providers.models.bedrock.work]
model = "anthropic.claude-sonnet-4-6"
Le fournisseur Bedrock utilise les chemins d’identification implémentés dans crates/zeroclaw-providers/src/bedrock.rs :
api_keysur l’alias Bedrock, ouBEDROCK_API_KEY, utilise l’authentification par jeton porteur Bedrock et prévaut sur les identifiants SigV4.AWS_ACCESS_KEY_IDplusAWS_SECRET_ACCESS_KEYutilise SigV4.AWS_SESSION_TOKENest optionnel.AWS_REGIONouAWS_DEFAULT_REGIONsélectionne la région de signature et utiliseus-east-1par défaut.credential_processdans le profil actif issu de~/.aws/config, ou deAWS_CONFIG_FILE, utilise SigV4.AWS_PROFILEsélectionne le profil et prend la valeurdefaultpar défaut.- Les informations d’identification d’instance EC2 IMDSv2 constituent le dernier mécanisme de secours pour SigV4.
Le schéma de configuration définit en outre un champ providers.models.bedrock.<alias>.region, mais l’implémentation actuelle ne le lit pas. La région du point de terminaison est toujours résolue à partir de la chaîne d’informations d’identification AWS (variables d’environnement, credential_process ou IMDS) comme décrit ci-dessus.
Un profil statique normal dans ~/.aws/credentials n’est pas lu par l’implémentation Bedrock actuelle. ~/.zeroclaw/secrets ne stocke que les secrets de configuration ZeroClaw, tels qu’un alias api_key ; il n’exporte pas les variables AWS_* pour le fournisseur.
Pour réutiliser un profil AWS CLI via le chemin de profil implémenté, ajoutez un credential_process dans ~/.aws/config :
[profile zeroclaw-bedrock]
credential_process = /usr/bin/aws configure export-credentials --profile my-existing-profile
region = us-east-1
/usr/bin/aws est le chemin par défaut sur Debian et Ubuntu. Sur les autres systèmes, utilisez le chemin absolu obtenu avec command -v aws.
Ensuite, exécutez ZeroClaw avec AWS_PROFILE=zeroclaw-bedrock. Pour un service utilisateur systemd, consultez Gestion des services.
Multi-région (Moonshot / Qwen / GLM / MiniMax / …)
Un type par famille ; choisissez la région via le champ typé endpoint sur l’entrée d’alias.
Point de terminaison personnalisé compatible OpenAI
Le slot custom nécessite uri. Voir Custom providers.
Choix du fournisseur utilisé par un agent
Les agents référencent un fournisseur par alias pointé. Les entrées de fournisseur seules ne font rien.
risk_profile et runtime_profile référencent des tables d’alias indépendantes, leurs noms n’ont donc pas besoin de correspondre (runtime_profile est également facultatif). Config::validate() échoue bruyamment au démarrage si model_provider ne se résout pas en une entrée [providers.models.<type>.<alias>] configurée, ou si risk_profile ne se résout pas en une entrée [risk_profiles.<alias>] configurée.
Pour plusieurs agents pointant vers différents fournisseurs, consultez Routing.
Repli en cas d’échec
Lorsqu’une requête vers un fournisseur échoue après avoir épuisé ses tentatives (fournisseur indisponible, clé limitée en débit, modèle indisponible), l’alias peut basculer vers les alternatives que vous déclarez sur l’entrée de l’alias. Deux axes indépendants et ordonnés :
fallback_models: identifiants de modèles alternatifs essayés sur ce fournisseur, en utilisant le même endpoint, la même clé et les mêmes en-têtes. Seul l’identifiant du modèle change. Utilisez-le lorsqu’un fournisseur propose un modèle de secours (une variante plus petite ou plus ancienne) qui doit être essayé avant de quitter complètement le fournisseur.fallback: une liste ordonnée d’autres alias de fournisseurs (références pointées<type>.<alias>vers[providers.models]). Chaque alias de secours est résolu avec ses propres identifiants, point de terminaison et modèle ; un alias de secours n’hérite jamais de la clé de l’alias défaillant.
Ordre des tentatives
Le parcours est en profondeur d’abord : la liste complète des modèles d’un alias est épuisée avant de le quitter, puis chaque alias fallback est parcouru à son tour, en appliquant récursivement les fallback_models et le fallback propres à cet alias. Supposons que anthropic.prod serve claude-sonnet-4-5, liste claude-haiku-4-5 dans ses fallback_models, et désigne openai.backup (servant gpt-4.1) dans son fallback. L’ordre des tentatives est alors :
anthropic.prod/claude-sonnet-4-5
-> anthropic.prod/claude-haiku-4-5
-> openai.backup/gpt-4.1
-> (request fails)
Les alias de repli peuvent eux-mêmes déclarer fallback, donc la chaîne est aussi longue que votre configuration le permet, jusqu’à une profondeur maximale de 3 alias. Une chaîne qui boucle sur elle-même (a -> b -> a) est détectée et l’arête du cycle est élaguée, et une chaîne acyclique plus profonde que la limite voit ses liens restants élagués ; aucune ne boucle, ne se bloque ou ne provoque de débordement de pile.
Mauvaise configuration
Une entrée fallback qui désigne un alias non configuré, qui ferme un cycle, ou une chaîne qui dépasse la profondeur maximale est non fatale : Config::validate() réussit quand même, l’arête fautive est ignorée à l’exécution, et le problème est signalé sous forme d’avertissement de validation (dangling_fallback_ref / fallback_cycle / max_fallback_depth_exceeded) dans la CLI et dans le tableau de bord. Une entrée fallback_models vide ou qui duplique le model principal de l’alias est de même ignorée à l’exécution et signalée (empty_fallback_model / fallback_model_duplicates_primary). Un lien de repli défectueux se dégrade de manière contrôlée, il n’empêche jamais l’agent de s’exécuter.
Voir aussi
- Vue d’ensemble
- Catalogue des fournisseurs : exemple de configuration concret pour chaque famille
- Streaming
- Routage
- Fournisseurs personnalisés