Fournisseurs personnalisés
Trois façons d’ajouter un fournisseur que ZeroClaw n’inclut pas par défaut :
- Utilisez le slot
custom. Pour tout point de terminaison compatible OpenAI non couvert par un slot canonique existant. - Utilisez les emplacements de serveur local de première classe (
lmstudio,llamacpp,sglang,vllm,osaurus,litellm). Des wrappers légers avec des valeurs par défaut pertinentes. - Implémentez le trait
ModelProvideren Rust. Pour tout ce qui n’est pas compatible avec OpenAI.
Point de terminaison compatible OpenAI : utilisez l’emplacement custom
Si le service prend en charge le format chat-completions d’OpenAI, il s’agit d’une modification de configuration uniquement. L’emplacement custom nécessite uri (l’énumération d’endpoint de la famille n’a pas de valeur par défaut) ; référencez-le depuis le model_provider d’un agent.
Il s’agit de la même implémentation runtime OpenAiCompatibleModelProvider utilisée par groq, mistral, xai et tous les autres fournisseurs disposant de leur propre emplacement canonique dans le catalogue. La différence réside dans l’emplacement de famille que vous utilisez : custom est l’emplacement fourre-tout pour les points de terminaison non représentés par un emplacement de fournisseur.
Pour une passerelle qui ne peut pas accepter les résultats d’outil contenant des images, omettez ces charges utiles tout en conservant le texte d’outil environnant. Les images d’outil sont déclarées dans un tableau attachments sur le support natif de résultat d’outil ; leur omission ne modifie donc jamais le texte du résultat. Cette politique ne s’applique qu’au tableau attachments du support natif role = "tool" ; les résultats d’outil en mode prompt (le support à ligne de comptage livré dans un message utilisateur) résolvent leurs images déclarées par un autre chemin et ne sont pas affectés par ce paramètre. Pour activer cette option :
[providers.models.custom.gateway]
uri = "https://gateway.example.com/v1"
model = "my-model"
tool_result_image_policy = "omit"
Préchauffage de la connexion
Les fournisseurs compatibles avec OpenAI préchauffent la connexion avec GET {base_url}/models, en utilisant les mêmes paramètres d’authentification et de client HTTP que la liste des modèles. La sonde consomme le corps de la réponse et accepte les codes d’état HTTP non réussis, de sorte qu’un service sans point de terminaison de modèles peut tout de même démarrer. Les requêtes de complétion de chat continuent d’utiliser POST ; le préchauffage n’invoque pas d’inférence et ne nécessite pas de catalogue de modèles.
Serveurs d’inférence locale de première classe
ZeroClaw fournit des emplacements canoniques pour les piles d’inférence locale les plus répandues. Elles sont toutes compatibles OpenAI en interne, mais avec des valeurs uri par défaut pré-appliquées, ce qui vous permet généralement d’omettre complètement uri.
llama.cpp : slot llamacpp
sh
llama-server -hf ggml-org/gpt-oss-20b-GGUF --jinja -c 133000 --host 127.0.0.1 --port 8033
Les champs optionnels s’appliquent à toute famille de compat-slot (y compris llamacpp). L’ensemble complet, dérivé du schéma :
api_key 🔑
Jeton d’API secret pour ce model_provider. Récupérez-le depuis le tableau de bord du model_provider (plateforme OpenAI, console Anthropic, page des clés OpenRouter, etc.). Stocké via le trousseau de clés du système d’exploitation lorsque c’est possible ; ne le validez jamais directement dans config.toml.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.api_key.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.api_key.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.api_key # entrée masquée, stockée chiffrée
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__api_key=
cache_passthrough
Transmet le cache de prompts d’Anthropic à travers ce fournisseur compatible OpenAI. Lorsque la valeur est true, les corps de requête des chemins structurés (tours d’agent, appels d’outils, streaming structuré) reçoivent un point d’arrêt cache_control au format Anthropic sur le prompt système, ainsi que sur le dernier message dès que la conversation contient plus d’un message non système, en reprenant la stratégie de placement du fournisseur Anthropic natif. Les compteurs de tokens mis en cache sont alimentés par l’usage de cache signalé par la passerelle. Avec merge_system_into_user, le premier message utilisateur fusionné porte à la place le point d’arrêt du système. Les helpers texte seuls (chat_with_system, chat_with_history, les API de flux par fragments héritées) n’émettent volontairement aucun point d’arrêt, car leurs réponses n’incluent pas l’usage : une écriture de cache coûteuse déclenchée par eux ne pourrait jamais être comptabilisée. Seules les passerelles qui traduisent entre OpenAI Chat Completions et l’API Anthropic Messages (par exemple LiteLLM) transmettent ces points d’arrêt. Par défaut, false : les corps de requête et la gestion des réponses restent inchangés. Avant de s’y fier, vérifiez que la route configurée sert bien les lectures de cache : une répétition immédiate d’une requête qui crée le cache doit renvoyer cache_read_input_tokens > 0. Certaines routes de passerelle acceptent et facturent les écritures de cache sans jamais servir de lectures.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.cache_passthrough.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.cache_passthrough.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.cache_passthrough <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__cache_passthrough=
cache_ttl
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.cache_ttl.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.cache_ttl.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.cache_ttl <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__cache_ttl=
chat_template_kwargs
Paires clé/valeur arbitraires transmises telles quelles sous la forme d’un objet chat_template_kwargs de premier niveau dans le corps de la requête des fournisseurs compatibles avec OpenAI. Utilisées par des backends prenant en charge les templates de chat, tels que vLLM, SGLang et llama.cpp, pour transmettre des variables de template propres à la famille de modèles qui contrôlent un comportement non exposé par les autres champs. Doit être un objet JSON (table inline TOML) ; les valeurs qui ne sont pas des objets sont ignorées avec un avertissement. Exemple (désactivation du mode réflexion de Qwen3) : chat_template_kwargs = { enable_thinking = false }
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.chat_template_kwargs.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.chat_template_kwargs.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.chat_template_kwargs <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__chat_template_kwargs=
context_window
Taille de la fenêtre de contexte (nombre maximum de tokens d’entrée) pour ce modèle. Rempli automatiquement lors de l’initialisation via le point de terminaison /models du fournisseur, si disponible. Remplacer manuellement pour les points de terminaison personnalisés ou en cas d’échec de la détection automatique.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.context_window.
zerocode
Dans le panneau Config, définissez le champ providers.models.custom.<alias>.context_window.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.context_window <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__context_window=
extra_headers 🔑
En-têtes HTTP supplémentaires envoyés avec chaque requête. Cas de niche : utilisés pour les passerelles d’authentification, les proxys d’entreprise ou les passerelles personnalisées qui exigent un en-tête de traçage. La plupart des utilisateurs n’y touchent jamais ; modifiez directement config.toml si vous en avez besoin.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.extra_headers.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.extra_headers.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.extra_headers.<KEY> # masked input, stored encrypted
zeroclaw config set providers.models.custom.<alias>.extra_headers.<KEY> # valeur vide supprime l'entrée
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__extra_headers=
fallback
Liste ordonnée des autres alias de fournisseurs à essayer lorsque tous les modèles de cet alias ont échoué. Chaque entrée est une référence pointée <type>.<alias> vers providers.models et se résout avec ses propres identifiants, point de terminaison et modèle. Un fallback n’hérite jamais de la clé de cet alias. Le parcours s’effectue en profondeur d’abord : les modèles de cet alias sont épuisés en premier, puis chaque alias de fallback est parcouru à son tour (en appliquant ses propres fallback_models et fallback). Vide signifie aucun fallback au niveau du fournisseur.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.fallback.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.fallback.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.fallback <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__fallback=
fallback_models
Modèles alternatifs ordonnés à essayer sur CE fournisseur avant de basculer vers les alias fallback. Mêmes point de terminaison, clé et en-têtes que le model principal. Seul l’identifiant du modèle change. Utilisez cette option lorsqu’un fournisseur propose un modèle de secours (p. ex. une variante plus petite ou plus ancienne) qui doit être essayé avant de quitter complètement le fournisseur. Si vide, seul model est essayé.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.fallback_models.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.fallback_models.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.fallback_models <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__fallback_models=
kind
Implémentation de fournisseur à instancier pour ce profil. Utilisez ceci lorsqu’un emplacement typé canonique doit s’exécuter via une implémentation compatible, par ex. [providers.models.openai.proxy] kind = "openai-compatible".
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.kind.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.kind.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.kind <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__kind=
live_pricing
Récupère les prix de tokens en direct pour les modèles de ce fournisseur depuis sa propre liste /models compatible OpenAI (la passerelle est la source de vérité pour ses prix), en renseignant les tarifs de suivi des coûts pour les modèles que l’opérateur n’a PAS tarifés sous [cost.rates] / pricing. Les modèles que la passerelle ne tarifie pas (ou les fournisseurs sans aucune liste HTTP /models, comme une passerelle sous-processus telle que kilocli) se rabattent sur le catalogue public models.dev. Les tarifs configurés l’emportent toujours ; les prix en direct ne comblent que les lacunes. Une tâche en arrière-plan actualise l’instantané des prix toutes les heures ; le chemin d’enregistrement des coûts lit l’instantané en cache et ne bloque jamais sur le réseau. Par défaut false : désactivé signifie aucune récupération et un comportement identique à une build sans la fonctionnalité.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.live_pricing.
zerocode
Dans le volet Configuration, définissez le champ providers.models.custom.<alias>.live_pricing.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.live_pricing <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__live_pricing=
max_tokens
Limite stricte de la longueur des réponses en tokens. La plupart des modèles appliquent déjà des limites intégrées raisonnables ; laissez ce paramètre non défini sauf si vous avez spécifiquement besoin de tronquer les sorties longues pour des raisons de coût ou de latence.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.max_tokens.
zerocode
Dans le panneau Config, définissez le champ providers.models.custom.<alias>.max_tokens.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.max_tokens <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__max_tokens=
merge_system_into_user
Particularité spécifique au ModelProvider : intégrer le prompt système dans le premier message utilisateur au lieu d’envoyer un rôle system distinct. Nécessaire uniquement pour les modèles qui rejettent (ou gèrent mal) un rôle system autonome, p. ex. certaines variantes plus anciennes de Mistral.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.merge_system_into_user.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.merge_system_into_user.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.merge_system_into_user <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__merge_system_into_user=
model
Identifiant de modèle à envoyer avec chaque requête : la chaîne d’identification provenant du catalogue du model_provider (par ex. gpt-4o, claude-sonnet-4-5, llama-3.3-70b). Doit correspondre à un modèle que le model_provider sert réellement sur ce compte.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.model.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.model.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.model <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__model=
native_tools
Remplace la valeur par défaut du fournisseur pour l’appel d’outils natif. None (par défaut) respecte le choix intégré du fournisseur. Some(true) force l’activation des appels d’outils natifs, Some(false) force le repli textuel. Actuellement consulté uniquement par la fabrique Groq, qui utilise par défaut le repli textuel car les modèles Groq de la famille llama rejettent les appels d’outils natifs avec une erreur HTTP 400. Définir native_tools = true réactive l’appel d’outils natif pour les modèles Groq qui le prennent en charge.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.native_tools.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.native_tools.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.native_tools <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__native_tools=
pricing
Tarification par modèle pour le suivi des coûts, en USD par million de tokens. Table clé/valeur libre. Les clés sont des identifiants de modèles définis par l’utilisateur ; un suffixe optionnel .input / .output encode la dimension de tarification lorsque l’opérateur souhaite séparer les tarifs. Une clé simple sans suffixe est utilisée comme tarif forfaitaire par token lorsqu’aucune dimension n’est spécifiée. La valeur par défaut est vide : le suivi des coûts retombe sur des tarifs « inconnus » et seule l’utilisation des tokens est enregistrée. Exemple : pricing = { opus = 15.0, sonnet = 3.0 } Ou en mode séparé : pricing = { "opus.input" = 15.0, "opus.output" = 75.0 }
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.pricing.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.pricing.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.pricing <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__pricing=
provider_extra
Paramètres JSON supplémentaires à inclure dans les requêtes API. Fusionnés au niveau supérieur du corps de la requête, permettant des fonctionnalités spécifiques au fournisseur (routage, transformations, etc.) sans modification du code. Exemple : provider_extra = { model_provider = { only = ["Anthropic"] } }
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.provider_extra.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.provider_extra.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.provider_extra <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__provider_extra=
reasoning_effort_passthrough
Transmettre le reasoning_effort configuré à l’exécution à chaque modèle de ce fournisseur compatible OpenAI, et pas seulement aux noms de la famille de raisonnement OpenAI (o1*/o3*/o4*/gpt-5*/gpt-codex). Le filtre sur les noms existe parce que certains backends stricts rejettent avec HTTP 400 les paramètres de requête inconnus ; n’activer cette option que sur un backend vérifié comme acceptant reasoning_effort (les modèles de raisonnement de type GLM/Kimi/DeepSeek/Qwen derrière des passerelles compatibles OpenAI l’acceptent généralement). Par défaut false : le filtre sur les noms continue de décider, et les noms de modèles non OpenAI ne reçoivent jamais ce paramètre.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
/config/providers.models/custom ouvrez cette page et définissez le champ providers.models.custom.<alias>.reasoning_effort_passthrough.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.reasoning_effort_passthrough.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.reasoning_effort_passthrough <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__reasoning_effort_passthrough=
replay_assistant_reasoning
Si le raisonnement stocké de l’assistant doit être rejoué sur les messages d’historique d’assistant sortants. Some(false) supprime reasoning_content et reasoning avant l’envoi. None (par défaut) respecte la valeur par défaut intégrée du fournisseur (true pour la plupart des fournisseurs compat, false pour Groq).
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.replay_assistant_reasoning.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.replay_assistant_reasoning.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.replay_assistant_reasoning <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__replay_assistant_reasoning=
requires_openai_auth
Lorsque true, le client récupère les identifiants depuis le profil d’authentification openai-codex stocké de ZeroClaw au lieu du champ api_key ci-dessus. Importez une connexion Codex CLI existante avec zeroclaw auth login --model-provider openai-codex --import ~/.codex/auth.json, ou exécutez zeroclaw auth login --model-provider openai-codex. Activez uniquement pour le model_provider OpenAI Codex ; laissez désactivé pour les model_providers standard à clé API.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.requires_openai_auth.
zerocode
Dans le panneau Config, définissez le champ providers.models.custom.<alias>.requires_openai_auth.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.requires_openai_auth <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__requires_openai_auth=
temperature
Température d’échantillonnage transmise au modèle. Les valeurs faibles (0.0–0.3) produisent une sortie déterministe, quasi littérale, adaptée au code, au routage et au résumé. Les valeurs élevées (0.7–1.2) produisent une sortie plus variée, adaptée aux conversations ouvertes.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.temperature.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.temperature.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.temperature <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__temperature=
think
Active ou désactive le raisonnement en chaîne de pensée pour les modèles qui le prennent en charge (p. ex. Qwen3, GLM-4). true active le raisonnement, false le désactive. None (par défaut) laisse le modèle décider. Transmis sous le nom enable_thinking dans le corps de la requête ; correspond au champ think du fournisseur Ollama.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.think.
zerocode
Dans le panneau Config, définissez le champ providers.models.custom.<alias>.think.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.think <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__think=
thinking_passthrough
Transmettre la réflexion étendue d’Anthropic via ce fournisseur compatible OpenAI. Lorsque la valeur est true et que le runtime demande la réflexion native, les corps de requête reçoivent un objet thinking au format Anthropic ({"type":"enabled","budget_tokens":N}), et les réponses de réflexion de la passerelle sont normalisées en blocs signés rejouables. Seules les passerelles qui traduisent entre OpenAI Chat Completions et l’API Anthropic prennent en charge cette option (par ex. LiteLLM) ; un upstream sans traduction rejette l’objet injecté avec un HTTP 400. Par défaut false : les corps de requête et la gestion des réponses restent inchangés.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.thinking_passthrough.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.thinking_passthrough.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.thinking_passthrough <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__thinking_passthrough=
timeout_secs
Délai d’expiration des requêtes HTTP en secondes. Augmentez cette valeur pour les model_providers locaux lents (Ollama sur CPU, grands modèles locaux) ou les réseaux à forte latence ; laissez-la non définie sinon. Lorsqu’elle est définie au-dessus de 300, elle augmente également la limite d’inactivité du flux du provider (300 s par défaut, l’écart maximal entre deux lectures du flux) pour les providers compatibles OpenAI et OpenAI Responses.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.timeout_secs.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.timeout_secs.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.timeout_secs <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__timeout_secs=
tls_ca_cert_path
Chemin vers un certificat CA encodé en PEM pour les connexions TLS à ce fournisseur. Doit être un chemin absolu ; l’expansion shell (par exemple ~) n’est pas effectuée. Laissez ce paramètre non défini pour utiliser le magasin de confiance par défaut du système.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.tls_ca_cert_path.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.tls_ca_cert_path.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.tls_ca_cert_path <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__tls_ca_cert_path=
tool_result_image_policy
Comment les fournisseurs natifs compatibles chat-completions traitent les images qu’un résultat role=tool déclare dans son tableau attachments : image_url les envoie sous forme de parties d’image structurées ; omit les supprime et ajoute un avis fixe, en conservant le texte du résultat tel quel. Les résultats d’outil hérités (sans clé de tableau) sont transmis tels quels avec les deux réglages : ils ne déclarent rien et leur contenu est du texte, si bien qu’une syntaxe de marqueur littérale dans la sortie d’un outil ne pilote jamais cette politique. Cela n’affecte ni le contenu d’image fourni directement par l’utilisateur, ni les fournisseurs OpenAI Responses.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.tool_result_image_policy.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.tool_result_image_policy.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.tool_result_image_policy <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__tool_result_image_policy=
uri
URI du point de terminaison auquel le client accède. Remplacez le point de terminaison par défaut de la famille lorsque vous ciblez une passerelle auto-hébergée (LiteLLM, vLLM, Ollama), un proxy personnalisé ou toute URL non standard. Laissez non défini pour utiliser l’URI par défaut de la famille issu de son implémentation ModelEndpoint. Définissez ici l’URL COMPLÈTE du point de terminaison ; il n’existe pas de champ séparé pour le suffixe de chemin.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.uri.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.uri.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.uri <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__uri=
vision
Remplace la capacité vision (entrée d’images) du fournisseur. None (par défaut) utilise la valeur par défaut intégrée à la famille de fournisseurs. Plusieurs familles (llama.cpp, le point de terminaison compatible OpenAI générique, etc.) supposent la prise en charge de la vision car elles peuvent servir des modèles multimodaux. Définissez vision = false pour un modèle texte uniquement servi par une telle famille (par ex. un LLM texte derrière llama.cpp) afin que les messages contenant des images soient acheminés vers un [multimodal] vision_model_provider configuré plutôt qu’envoyés à un modèle qui les rejette. Some(true) force l’activation de la vision.
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.vision.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.vision.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.vision <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__vision=
wire_api
Posez-le sur n’importe quelle surface :
Tableau de bord de la passerelle
Ouvrez /config/providers.models/custom et définissez le champ providers.models.custom.<alias>.wire_api.
zerocode
Dans le volet Config, définissez le champ providers.models.custom.<alias>.wire_api.
zeroclaw config
zeroclaw config set providers.models.custom.<alias>.wire_api <value>
Variable d’environnement
Exportez le remplacement (shells POSIX ; à placer dans ~/.bashrc, ~/.zshrc, .env ou un Dockerfile). Remplacez <alias> par l’alias littéral :
export ZEROCLAW_providers__models__custom__<alias>__wire_api=
Le contrôle du mode de réflexion varie selon la famille de modèles. think = false définit le champ enable_thinking de premier niveau dans la requête. Certains modèles (par exemple Qwen3) lisent plutôt ce drapeau depuis le modèle Jinja via chat_template_kwargs :
Les autres familles de modèles utilisent des noms de variables de modèle différents, vérifiez le modèle de chat de votre modèle et définissez la clé appropriée sous chat_template_kwargs.
SGLang : emplacement sglang
sh
python -m sglang.launch_server --model meta-llama/Llama-3.1-8B-Instruct --port 30000
vLLM : emplacement vllm
sh
vllm serve meta-llama/Llama-3.1-8B-Instruct
LM Studio, Osaurus, LiteLLM
Les slots lmstudio, osaurus, litellm suivent le même modèle, voir le catalogue.
Protocole de transmission : wire_api = "responses"
Les nouveaux emplacements du fournisseur OpenAI écrits dans la configuration (providers.models.openai.<alias>, créés par zeroclaw quickstart ou l’interface de la passerelle/configuration) utilisent par défaut wire_api = "responses" car les modèles GPT récents d’OpenAI emploient POST /v1/responses comme wire principal. Les autres emplacements avec point de terminaison personnalisé (custom, llamacpp et les fournisseurs compatibles OpenAI) conservent par défaut le wire chat-completions ; un point de terminaison qui ne parle que le wire responses d’OpenAI (certains déploiements auto-hébergés vLLM / TGI) nécessite un opt-in explicite wire_api = "responses" sur l’entrée d’alias.
Lorsque cette option est définie sur "responses", le fournisseur est construit en tant que OpenAiResponsesModelProvider (appels d’outils en streaming complet via le protocole responses) plutôt qu’en tant que fournisseur chat-completions. Définissez "chat_completions" pour forcer le protocole legacy. Deux cas maintiennent chat-completions à l’exécution pour la compatibilité ascendante, de sorte qu’aucune configuration existante ne change de protocole lors d’une mise à niveau :
- Une entrée persistante
providers.models.openai.<alias>qui ometwire_apiest désérialisée comme non définie et reste sur chat-completions. - Une référence nue
model_provider = "openai"(ou une référence pointée vers un alias inexistant) ne possède aucune entrée de configuration à lire ; elle est construite à partir du fallback de la famille et reste sur chat-completions. La valeur par défaut de responses ne s’applique que lorsqu’un emplacement est effectivement écrit dans la configuration.
wire_api est pris en charge par les familles bring-your-own-endpoint où le wire est configurable par l’opérateur : openai, llamacpp et custom (ainsi que le chemin générique compatible openai). Les emplacements de fournisseurs de marque (groq, mistral, deepseek, …) ont un protocole wire fixe et ignorent ce champ, à une exception près : opencode prend en charge wire_api = "responses" car OpenCode Zen dessert les deux wires. Sans surcharge uri, la route responses d’OpenCode cible https://opencode.ai/zen/v1/responses :
[providers.models.opencode.default]
model = "big-pickle"
wire_api = "responses"
Le paramètre régit à la fois le chemin de l’agent principal et les cibles déléguées, de sorte qu’un délégué dont l’alias cible déclare wire_api = "responses" atteint le point de terminaison via le protocole responses.
OpenCode session affinity
Chaque requête d’inférence envoyée à un hôte opencode.ai transporte un en-tête x-opencode-session, qu’il s’agisse d’un flux continu (streaming) ou non. OpenCode s’en sert pour rattacher les tours d’une même conversation au même backend amont, ce qui maintient le cache de prompt de ce backend actif d’un tour à l’autre. L’amont le mentionne aussi dans ses recommandations pour éviter qu’un compte soit signalé, et certains modèles d’OpenCode Go rejettent purement et simplement les requêtes sans cet en-tête. Les requêtes de catalogue de modèles et de préchauffage (GET /models) ne transportent pas cet en-tête : elles ne font pas partie d’une conversation, il n’y a donc aucun backend à fixer.
La valeur est un jeton hexadécimal opaque de 128 bits dérivé de la portée de conversation active, de sorte que chaque conversation est associée à son propre backend et qu’une même conversation conserve son backend après un redémarrage du démon. La clé de session de la conversation est hachée, jamais envoyée : les clés de session incorporent des identifiants de canal et d’utilisateur, et les transmettre telles quelles reviendrait à remettre à un relais tiers un identifiant propre à chaque utilisateur. Les requêtes d’inférence effectuées hors de toute conversation partagent à la place un jeton stable pour toute la durée du processus.
Rien n’a besoin d’être configuré. Pour fixer la valeur vous-même, par exemple pour partager une même portée d’affinité entre plusieurs réplicas, définissez-la explicitement et ZeroClaw ne la modifiera pas :
[providers.models.opencode.default]
model = "big-pickle"
[providers.models.opencode.default.extra_headers]
x-opencode-session = "my-fixed-scope"
Les hôtes autres que opencode.ai et ses sous-domaines ne reçoivent jamais l’en-tête. Pour que cela reste ainsi, les requêtes d’OpenCode ne suivent une redirection que sur le même hôte : une redirection vers un hôte différent n’est pas suivie, et la requête échoue avec ce code de statut de redirection.
Validation
Quelle que soit l’approche :
sh
zeroclaw config list # charge la configuration ; tout échec de validation est affiché sur stderr
zeroclaw models refresh --model-provider <type>.<alias> # list models the endpoint advertises
zeroclaw agent -a <alias> -m "hello" # test de validation avec l'agent à `[agents.<alias>]`
Implémentation d’un nouveau trait ModelProvider
Si le point de terminaison n’est pas compatible avec OpenAI et ne fait pas partie des emplacements de serveur local, vous devez écrire du code.
Le trait se trouve dans crates/zeroclaw-api/src/model_provider.rs :
#![allow(unused)]
fn main() {
#[async_trait]
pub trait ModelProvider: Send + Sync {
fn name(&self) -> &str;
fn supports_streaming(&self) -> bool { true }
fn supports_streaming_tool_events(&self) -> bool { false }
async fn chat(
&self,
messages: Vec<Message>,
tools: Vec<ToolSchema>,
options: ChatOptions,
) -> Pin<Box<dyn Stream<Item = Result<StreamEvent>> + Send>>;
}
}
Schéma d’implémentation :
-
Définissez la configuration typée dans
crates/zeroclaw-config/src/schema.rs:#![allow(unused)] fn main() { pub struct MyProviderModelProviderConfig { #[serde(flatten)] pub base: ModelProviderConfig, pub endpoint: MyProviderEndpoint, // champs spécifiques à la famille } pub enum MyProviderEndpoint { Default } impl ModelEndpoint for MyProviderEndpoint { fn uri(&self) -> &'static str { match self { Self::Default => "https://my-provider.example.com/v1" } } } } -
Ajoutez le slot à
for_each_model_provider_slot!danscrates/zeroclaw-config/src/providers.rs. Chaque helper récupère automatiquement le nouveau slot. -
Ajoutez l’implémentation runtime dans
crates/zeroclaw-providers/src/myprovider.rs. ConvertissezVec<Message>au format wire, diffusez la réponse, émettez des valeursStreamEvent. -
Connectez la branche factory dans
crates/zeroclaw-providers/src/lib.rs::create_provider_with_url_and_options. -
Ajoutez un feature flag dans
Cargo.tomlsi le fournisseur entraîne des dépendances lourdes.
Voir anthropic.rs comme référence pour un fournisseur avec un format filaire entièrement personnalisé. Voir compatible.rs pour le pattern de streaming SSE compatible OpenAI.
Dépannage
Erreurs d’authentification
- Vérifiez que la clé API correspond au point de terminaison (de nombreux fournisseurs utilisent des préfixes de clé :
sk-,gsk_,sk-ant-). - Vérifiez que
uriinclut le schéma (http:///https://) et le chemin/v1si le point de terminaison l’attend. - Endpoints derrière un VPN ou un proxy ? Vérifiez le routage depuis l’hôte ZeroClaw.
Modèle non trouvé
- Listez ce que l’endpoint annonce :
sh
curl -sS "$URI/models" -H "Authorization : Bearer $API_KEY" | jq
Problèmes de connexion
curl -I $URI, répond-il ?- Pare-feu, proxy, règles de sortie ? Les fournisseurs de VPS bloquent parfois les ports élevés sortants.
- Page d’état du fournisseur s’il s’agit d’un service hébergé.
La passerelle rejette temperature
Certaines passerelles (par ex. un proxy LiteLLM placé devant claude-opus-4-7) renvoient une erreur dès qu’un champ temperature est présent. ZeroClaw respecte le contrat Option : si vous laissez temperature non défini dans la configuration, le champ est entièrement omis du corps de la requête et le backend choisit sa propre valeur par défaut. Ne définissez temperature explicitement que lorsque le point de terminaison l’accepte.
Voir aussi
- Overview : modèle de fournisseur et fonctionnement de la répartition par agent
- Configuration : schéma complet
[providers.*], configuration typée Azure, variantes régionales et OAuth - Catalogue : chaque emplacement canonique avec un exemple TOML détaillé
- Développement → Protocole de plugin : si un plugin fonctionne mieux qu’une crate de première classe