Documentation
OpenClaw
OpenClaw se connecte à n’importe quel point de terminaison au moyen d’une entrée models.providers. Pour un agent qui ne s’arrête jamais, la configuration de cette entrée est la partie la plus courte : cette page explique aussi quel côté place les points de rupture du cache sur chaque protocole, combien coûtent les pulsations sur une journée et ce qu’un code 402 implique pour la passerelle.
Une entrée models.providers dans ~/.openclaw/openclaw.json — baseUrl https://api.kunavo.com, api "anthropic-messages" — fait fonctionner un agent OpenClaw toujours actif avec Claude ; cacheRetention est défini à côté, car un point de terminaison Anthropic personnalisé ne reçoit aucun marqueur de cache tant que ce paramètre ne l’est pas.
// ~/.openclaw/openclaw.json — merge into the file you already have
{
models: {
mode: "merge",
providers: {
kunavo: {
baseUrl: "https://api.kunavo.com", // origin — no /v1 on this wire
apiKey: "${KUNAVO_API_KEY}", // from the environment or ~/.openclaw/.env
api: "anthropic-messages",
models: [
{
id: "claude-sonnet-5",
name: "Claude Sonnet 5",
reasoning: true,
input: ["text", "image"],
contextWindow: 1000000,
contextTokens: 200000, // optional: compact here, not at 1M
maxTokens: 32000,
},
{
id: "claude-haiku-4-5",
name: "Claude Haiku 4.5",
input: ["text", "image"],
contextWindow: 200000,
maxTokens: 16000,
},
],
},
},
},
agents: {
defaults: {
model: { primary: "kunavo/claude-sonnet-5" },
models: {
// Required for caching: a custom Anthropic endpoint gets no cache
// markers from OpenClaw until cacheRetention is set explicitly.
"kunavo/claude-sonnet-5": { params: { cacheRetention: "short" } },
"kunavo/claude-haiku-4-5": { params: { cacheRetention: "short" } },
},
},
},
}https://api.kunavo.com, sans /v1. L’exemple de fournisseur compatible Anthropic donné par OpenClaw précise que l’URL de base doit omettre /v1, car le client Anthropic l’ajoute. Le protocole compatible OpenAI, décrit plus bas, est celui qui conserve le suffixe.cacheRetention activent la mise en cache des prompts. Pour un point de terminaison Anthropic personnalisé, OpenClaw n’envoie des marqueurs de cache que si cacheRetention est défini explicitement, et le /v1/messages de Kunavo n’en ajoute aucun. Si vous omettez ces lignes, chaque tour refacture l’ensemble de la conversation comme une entrée fraîche.maxTokens indique la limite de sortie qu’OpenClaw utilise pour un modèle ; chez Kunavo, le plafond de sortie d’une requête fait partie du montant réservé sur votre solde avant son exécution. Le catalogue autorise jusqu’à 128 000 jetons de sortie pour Claude Sonnet 5 ; la valeur inférieure du bloc suffit largement pour un tour d’agent et réduit le montant réservé.contextTokens est facultatif. Claude Sonnet 5 dispose d’une fenêtre de 1 000 000 jetons à tarif fixe, dans laquelle une session qui ne se termine jamais finira par s’étendre ; contextTokens permet à OpenClaw de disposer d’un budget de travail plus réduit et de compacter le contexte bien avant que chaque tour ne renvoie toute la fenêtre.sk-kn-) et ajoutez un crédit à partir de 10 $ — les appels sont payés sur ce solde et les appels échoués ne sont pas facturés. Le tableau de bord s’ouvre ensuite sur la configuration OpenClaw.Étape par étape
- Créez une clé sur
/app/keyset copiez-la — elle n’est affichée qu’une seule fois. - Fournissez la clé à la passerelle : ajoutez
KUNAVO_API_KEY=sk-kn-...à~/.openclaw/.envou exportez-la dans l’environnement dans lequel la passerelle démarre. À la lecture de la configuration, la valeur${KUNAVO_API_KEY}du bloc est remplacée par celle qui s’y trouve. - Fusionnez le bloc dans
~/.openclaw/openclaw.jsonen conservant les fournisseurs, agents et canaux déjà présents. Le fichier est au format JSON5 ; les commentaires peuvent donc rester. - Exécutez
openclaw config validate. OpenClaw refuse de démarrer si le fichier contient un paramètre qu’il ne reconnaît pas. Mieux vaut donc repérer une faute de frappe ici qu’au prochain redémarrage. - Exécutez
openclaw models list --provider kunavoet vérifiez que les deux identifiants sont répertoriés. Si une passerelle en cours d’exécution n’a pas pris en compte la modification, exécutezopenclaw gateway restart. - Ouvrez une nouvelle session avec
/new— une session existante conserve le modèle qu’elle utilisait déjà —, envoyez deux messages, puis consultez/usage tokens: le second tour doit indiquercacheRead.
Vérifié avec Référence des fournisseurs personnalisés d’OpenClaw le 5 octobre 2026. Les paramètres tiers évoluent ; si le nom d’un champ ne correspond plus à ce que vous voyez ici, cette page fait autorité, pas celle-ci.
Vérifiez avant de déboguer le client
Une requête suffit à déterminer si l’échec vient de l’endpoint, de la clé ou du fichier de configuration. Si cette requête renvoie du JSON, la même URL de base et la même clé fonctionnent dans OpenClaw.
# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/messages \
-H "Authorization: Bearer sk-kn-..." \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-5","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'Quel identifiant de modèle saisir dans le champ
Tous les modèles textuels sont accessibles sous forme d’identifiant de modèle — la liste à jour se trouve sur GET /v1/models, et le catalogue avec les prix sur la page des modèles. Les tarifs sont en USD par million de tokens, entrée / sortie.
| Identifiant du modèle | Entrée / sortie sur Kunavo | Où cela s’intègre dans OpenClaw |
|---|---|---|
claude-sonnet-5 | $1.40 / $7.00 | l’agent principal — boucles d’utilisation d’outils et requêtes courantes |
claude-opus-5-5 | $2.80 / $14.00 | le niveau supérieur pour les tâches longues ou difficiles ; ajoutez-le comme entrée supplémentaire et sélectionnez-le avec /model |
claude-haiku-4-5 | $0.70 / $3.50 | pulsations, titres de session et autres courts tours en arrière-plan |
claude-fable-5 | $7.00 / $35.00 | le niveau le plus élevé — estimez son coût quotidien à l’aide du tableau des pulsations ci-dessous avant d’y laisser un agent fonctionner |
Le protocole compatible OpenAI
La même clé permet d’accéder à toutes les autres familles de modèles via /v1/chat/completions. Enregistrez-la dans une seconde entrée de fournisseur pour que les deux protocoles restent distincts, puis référencez ses modèles sous la forme kunavo-openai/<id> :
// ~/.openclaw/openclaw.json — a second entry, beside "kunavo"
{
models: {
providers: {
"kunavo-openai": {
baseUrl: "https://api.kunavo.com/v1", // this wire keeps /v1
apiKey: "${KUNAVO_API_KEY}",
api: "openai-completions",
models: [
{
id: "gpt-6-sol",
name: "GPT-6 Sol",
reasoning: true,
input: ["text"],
contextWindow: 1050000,
maxTokens: 32000,
},
],
},
},
},
}
// then: /model kunavo-openai/gpt-6-solTrois éléments diffèrent du bloc ci-dessus. L’URL de base conserve /v1, comme dans les exemples de fournisseurs personnalisés d’OpenClaw. api vaut openai-completions — valeur également utilisée par OpenClaw lorsqu’un fournisseur personnalisé fournit un baseUrl sans api. Enfin, maxTokens n’est plus facultatif en pratique : lorsque la limite de sortie d’un modèle est inconnue, OpenClaw n’envoie aucun plafond sur ce protocole et Kunavo termine alors une réponse Claude après 4 096 jetons.
Les identifiants Claude fonctionnent aussi ici ; c’est le protocole à utiliser si vous voulez une seule entrée pour tout. Deux éléments changent pour ces modèles : les niveaux de réflexion ne sont pas transmis à Claude via chat completions, et c’est Kunavo, et non OpenClaw, qui place les points de rupture du cache.
Mise en cache des prompts selon le protocole
Sur le protocole Anthropic, OpenClaw place lui-même les points de rupture du cache, mais, pour un point de terminaison personnalisé, il ne le fait que lorsque cacheRetention est défini. Sa documentation sur la mise en cache des prompts le précise : la valeur par défaut short est définie pour les seuls fournisseurs anthropic et anthropic-vertex, et toutes les autres routes de la famille Anthropic nécessitent une valeur explicite. Le /v1/messages de Kunavo transmet le corps tel qu’il a été envoyé, sans ajouter de point de rupture ; sans ces lignes dans la configuration, rien n’est mis en cache.
short demande une entrée de cinq minutes et long une entrée d’une heure. Kunavo transmet l’un ou l’autre marqueur et facture l’écriture au même tarif. Avant de planifier une fréquence en comptant sur la présence d’une entrée d’une heure à l’arrivée de la prochaine pulsation, vérifiez son comportement à partir de votre propre utilisation : un tour qui indique cacheRead a conservé son cache, tandis qu’un tour qui indique à nouveau cacheWrite ne l’a pas conservé. /usage tokens et /status affichent les deux compteurs.
Sur le protocole compatible OpenAI, c’est l’inverse. OpenClaw n’envoie aucun indice de mise en cache au point de terminaison proxy, et Kunavo place lui-même les points de rupture pour les modèles Claude — dans le prompt système, les définitions des outils et à la fin de la conversation — dès que le prompt est assez long pour être mis en cache. Aucun paramètre n’est nécessaire, et les modèles GPT sont mis en cache implicitement par leur fournisseur.
Quel que soit le côté qui place les points de rupture, la facture est la même. Sur Claude Sonnet 5 une lecture du cache coûte $0.14 par million de jetons, contre $1.40 pour une entrée fraîche, et une écriture dans le cache coûte $1.75 — la majoration d’écriture appliquée par Claude à l’entrée, facturée au même tarif lorsque l’entrée demande une durée de vie d’une heure. Une entrée dure cinq minutes et chaque lecture renouvelle sa durée ; le coût pour un agent dépend donc moins du modèle que du fait que sa prochaine requête arrive dans cette fenêtre. Les tarifs du cache de chaque modèle figurent sur la page consacrée à la mise en cache des prompts.
OpenClaw peut afficher les mêmes calculs en local. Son récapitulatif /usage cost et la ligne de coût dans /status nécessitent un objet cost pour chaque ligne de modèle ; sans cet objet, ils indiquent zéro, même si Kunavo facture normalement. Ces lignes sont générées à partir du catalogue en direct :
// merge into the rows of models.providers.kunavo.models — USD per 1M tokens
{ id: "claude-sonnet-5", cost: { input: 1.4, output: 7, cacheRead: 0.14, cacheWrite: 1.75 } },
{ id: "claude-haiku-4-5", cost: { input: 0.7, output: 3.5, cacheRead: 0.07, cacheWrite: 0.875 } },
{ id: "claude-opus-5-5", cost: { input: 2.8, output: 14, cacheRead: 0.14, cacheWrite: 3.5 } },
{ id: "claude-fable-5", cost: { input: 7, output: 35, cacheRead: 0.7, cacheWrite: 8.75 } },Coût quotidien d’un agent toujours actif
Un agent OpenClaw est facturé même lorsque personne ne lui parle, à cause de la pulsation : un tour planifié de l’agent qui s’exécute toutes les 30 minutes par défaut, soit 48 par jour. Sauf indication contraire, il s’exécute dans la session principale et renvoie la conversation — la documentation de référence d’OpenClaw estime une telle exécution à environ 100 000 jetons, et à quelques milliers lorsqu’elle est isolée. Trente minutes dépassent la fenêtre de cache de cinq minutes ; chaque exécution est donc facturée pour l’intégralité de son prompt, au tarif d’entrée ou au tarif d’écriture, plus élevé, lorsqu’un point de rupture est placé. Le tableau chiffre une journée d’inactivité au tarif d’entrée, avec 5 000 jetons pour l’exécution isolée :
| Modèle utilisé pour la pulsation | Tarif d’entrée par million de jetons | 48 exécutions dans la session principale | 48 exécutions isolées |
|---|---|---|---|
claude-haiku-4-5 | $0.70 | $3.36 | $0.17 |
claude-sonnet-5 | $1.40 | $6.72 | $0.34 |
claude-opus-5-5 | $2.80 | $13.44 | $0.67 |
claude-fable-5 | $7.00 | $33.60 | $1.68 |
Le bloc ci-dessous correspond à un scénario peu coûteux de ce tableau : des pulsations sur Haiku, dans une session isolée, sans les fichiers d’initialisation de l’espace de travail et uniquement pendant les heures d’éveil. Tous les paramètres qu’il contient proviennent de la documentation de référence des pulsations d’OpenClaw. Un intervalle every plus long est l’autre levier, et "0m" désactive l’exécution récurrente.
// ~/.openclaw/openclaw.json — what decides the cost of an idle day
{
agents: {
defaults: {
utilityModel: "kunavo/claude-haiku-4-5", // titles and other short internal tasks
heartbeat: {
every: "30m", // the default with an API key
model: "kunavo/claude-haiku-4-5", // wake-ups on the cheapest tier
isolatedSession: true, // a fresh session, not the whole conversation
lightContext: true, // skip the workspace bootstrap files
activeHours: { start: "08:00", end: "24:00" },
},
},
},
}model et isolatedSession. La page d’OpenClaw consacrée aux pulsations avertit qu’une pulsation qui fait passer une session partagée à un modèle plus petit peut laisser ce modèle en place pour le prochain tour réel ; créer une nouvelle session à chaque exécution évite ce problème.Les heures pendant lesquelles l’agent travaille réellement représentent l’autre moitié de la facture, et c’est là que le cache fait la différence. Prenons 100 requêtes consécutives, chacune envoyant à nouveau un contexte de 100 000 jetons, auquel s’ajoutent 2 000 nouveaux jetons, et produisant 800 jetons en sortie. Sur Claude Sonnet 5, cela revient à environ $2.31 lorsque le contexte est lu depuis le cache, et à environ $14.84 lorsque le contexte est facturé comme une nouvelle entrée à chaque requête. Même travail, même modèle : la différence tient à la présence des points de rupture et au fait que les requêtes soient espacées de moins de cinq minutes.
Pour donner un ordre de grandeur, mesuré et non supposé : parmi les comptes Kunavo qui exécutent un agent en continu, le coût d’une journée active médiane est de $12.67, et celui d’une journée au 90e percentile est d’environ $163. Ces montants ont été facturés jusqu’au 5 octobre 2026, aux tarifs en vigueur chaque jour. Le groupe est restreint : voyez ces chiffres comme l’étendue de la fourchette, et non comme une prévision pour votre agent.
Quand le solde est épuisé
Kunavo fonctionne en prépaiement : chaque appel est payé depuis le portefeuille, et un agent qui travaille pendant que vous dormez le vide pendant que vous dormez. Une requête que le portefeuille ne peut pas couvrir est refusée avec HTTP 402 et le code insufficient_balance, quel que soit le protocole, et elle n’est pas facturée. Le refus survient avant que le solde du portefeuille n’atteigne zéro : chaque requête réserve d’abord son coût maximal, soit son prompt plus la réponse la plus longue qu’elle est autorisée à produire. Ainsi, plus le plafond de sortie demandé par un agent est élevé, plus tôt ses appels commencent à être refusés. L’erreur indique le montant manquant, en balance_usd et en needed_usd.
OpenClaw détermine la signification d’un 402 à partir de son message. Selon les règles d’OpenClaw 2026.9.8, le refus du portefeuille est un échec de facturation, et sa documentation de référence sur le basculement décrit la suite : l’identifiant d’accès est désactivé pendant dix minutes, l’exécution passe au modèle suivant dans agents.defaults.model.fallbacks, et la recharge ne met pas fin à cette période — l’agent peut donc continuer à ne pas utiliser les modèles kunavo/… après une recharge, jusqu’à la fin de cette période. Le refus lié à la limite mensuelle d’une clé est interprété différemment. Son message indique une limite qui est réinitialisée, ce que les mêmes règles traitent comme une limitation de débit : OpenClaw réessaie, puis met l’identifiant d’accès en pause pendant 30 secondes au départ, et jusqu’à cinq minutes au maximum. openclaw models status répertorie les identifiants d’accès désactivés et indique quand ils sont réactivés.
Deux paramètres empêchent un agent sans supervision d’en arriver là, et ils ont des fonctions différentes :
- Recharge automatique, sous Facturation. Enregistrez une carte une seule fois et définissez trois montants : le solde en dessous duquel le rechargement doit avoir lieu, le montant à ajouter à chaque fois et un plafond mensuel. Le portefeuille se recharge alors en quelques secondes dès qu’un appel fait passer son solde sous le seuil. Une requête reçue alors que le solde du portefeuille est encore insuffisant attend que le paiement soit effectué, puis est traitée au lieu d’être refusée. Un
402est toujours renvoyé si le paiement ne peut pas être effectué — carte refusée, plafond mensuel atteint — ou si une requête réserve un montant supérieur au solde disponible après le rechargement. Cette fonctionnalité nécessite une carte ou Link ; Alipay, WeChat Pay, Pix et les autres moyens de paiement locaux ne peuvent pas être débités automatiquement. - Une limite mensuelle pour la clé, sous Clés API. Attribuez à l’agent sa propre clé et définissez le montant maximal que cette clé peut dépenser au cours d’un mois civil. Au-delà de ce montant, ses appels sont refusés avec un
402et aucun montant n’est débité, tandis que vos autres clés continuent de fonctionner. C’est le plafond qu’il faut pour contenir une boucle qui s’emballe, et que le portefeuille ne peut pas fournir, puisque toutes les clés utilisent le même portefeuille.
Définissez le seuil de recharge au-dessus du montant réservé pour une requête et choisissez le montant en fonction d’une journée d’utilisation de votre agent, pas du minimum : la recharge minimale est de $10, et la journée médiane d’un agent toujours actif indiquée plus haut coûte $12.67. Les limites de la recharge automatique sont indiquées sur la page de facturation, et le corps complet de l’erreur figure sur la page des erreurs.
Guides associés
- Meilleure API pour OpenClaw — choisir un fournisseur et un modèle pour chaque type de tâche.
- Tarification d’OpenClaw — le coût total d’exploitation : logiciel, hébergement, modèles et outils.
- OpenClaw avec plusieurs agents et modèles — acheminer chaque agent vers son propre modèle et ventiler les coûts par route.
- Hermes ou OpenClaw — et la même configuration pour l’autre agent, sur la page Hermes Agent.
Questions fréquentes
Comment ajouter un fournisseur personnalisé à OpenClaw ?
Ajoutez une entrée sous models.providers dans ~/.openclaw/openclaw.json et choisissez l’identifiant du fournisseur qui lui servira de clé. Elle doit comporter un baseUrl, un apiKey (généralement une référence ${ENV_VAR}), un type d’api — notamment openai-completions, openai-responses ou anthropic-messages — et un tableau models dont chaque entrée doit au minimum avoir un id. Définissez ensuite agents.defaults.model.primary avec provider-id/model-id. OpenClaw valide le fichier de manière stricte ; exécutez donc openclaw config validate avant de redémarrer la passerelle.
L’URL de base d’OpenClaw doit-elle inclure /v1 ?
Cela dépend du type d’api. Avec api "anthropic-messages", l’URL de base est l’origine seule, car le client Anthropic ajoute lui-même /v1/messages — pour Kunavo : https://api.kunavo.com. Avec api "openai-completions", le suffixe est conservé, comme dans les exemples de fournisseurs personnalisés d’OpenClaw — pour Kunavo : https://api.kunavo.com/v1. Un format incorrect pour le protocole est la raison la plus courante pour laquelle un point de terminaison disponible renvoie une erreur 404.
La mise en cache des prompts fonctionne-t-elle dans OpenClaw via un point de terminaison personnalisé ?
Oui, et le côté qui s’en charge dépend du protocole. Avec un point de terminaison anthropic-messages personnalisé, OpenClaw n’envoie des marqueurs de cache que si cacheRetention est explicitement défini — short pour une entrée de cinq minutes, long pour une entrée d’une heure. Ce paramètre doit donc figurer dans agents.defaults.models pour chaque modèle utilisé. Avec un point de terminaison compatible OpenAI, OpenClaw n’envoie aucun indice de mise en cache au proxy ; Kunavo place lui-même les points de rupture pour les modèles Claude. Dans les deux cas, cacheRead et cacheWrite dans /usage tokens indiquent si la mise en cache fonctionne.
Combien coûte l’exécution d’OpenClaw toute la journée ?
Commencez par estimer le coût des pulsations, puisqu’elles ont lieu même si personne ne parle à l’agent. Avec le réglage par défaut d’OpenClaw, soit une pulsation toutes les 30 minutes, une journée compte 48 exécutions. Une exécution dans la session principale renvoie la conversation ; la documentation d’OpenClaw l’estime à environ 100K jetons. Au tarif d’entrée de Kunavo pour Claude Sonnet 5, cela représente environ $6.72 par jour avant tout travail réel, et environ $0.34 avec isolatedSession, qui ramène une exécution à quelques milliers de jetons. Le travail supplémentaire consiste surtout en lectures du cache lorsque les requêtes arrivent à moins de cinq minutes d’intervalle.
Qu’arrive-t-il à OpenClaw lorsque le solde de l’API est épuisé ?
Kunavo refuse la requête avec HTTP 402 et ne la facture pas. OpenClaw traite un échec de facturation comme un motif de basculement : sa documentation indique que l’identifiant d’accès est désactivé pendant dix minutes, que l’exécution passe au modèle suivant dans agents.defaults.model.fallbacks et qu’une recharge ne met pas fin à cette période à elle seule. Deux paramètres côté Kunavo empêchent un agent d’en arriver là : la recharge automatique débite une carte enregistrée lorsque le solde du portefeuille est bas, de sorte qu’une requête qui aurait été refusée est traitée, et une limite mensuelle définie sur la propre clé de l’agent plafonne les dépenses d’une boucle incontrôlée.
Quel modèle la pulsation d’OpenClaw doit-elle utiliser ?
Le modèle le moins cher capable de lire le prompt de pulsation et de déterminer qu’aucune intervention n’est nécessaire. heartbeat.model prend une référence fournisseur/modèle — par exemple kunavo/claude-haiku-4-5. Associez-lui isolatedSession: true : la page d’OpenClaw consacrée aux pulsations avertit qu’une pulsation qui fait passer une session partagée à un modèle plus petit peut laisser ce modèle en place pour le prochain tour réel ; une session isolée évite ce problème.