Configuration đ§Â¶
OpenClaw lit une configuration JSON5 optionnelle depuis ~/.openclaw/openclaw.json (commentaires + virgules finales autorisés).
Si le fichier est absent, OpenClaw utilise des valeurs par dĂ©faut relativement sĂ»res (agent Pi intĂ©grĂ© + sessions par expĂ©diteur + espace de travail ~/.openclaw/workspace). En gĂ©nĂ©ral, vous nâavez besoin dâune configuration que pourâŻ:
- restreindre qui peut déclencher le bot (
channels.whatsapp.allowFrom,channels.telegram.allowFrom, etc.) - contrĂŽler les listes dâautorisation de groupes + le comportement des mentions (
channels.whatsapp.groups,channels.telegram.groups,channels.discord.guilds,agents.list[].groupChat) - personnaliser les préfixes de messages (
messages) - dĂ©finir lâespace de travail de lâagent (
agents.defaults.workspaceouagents.list[].workspace) - ajuster les paramĂštres par dĂ©faut de lâagent intĂ©grĂ© (
agents.defaults) et le comportement des sessions (session) - dĂ©finir lâidentitĂ© par agent (
agents.list[].identity)
Nouveau dans la configurationâŻ? Consultez le guide Configuration Examples pour des exemples complets avec des explications dĂ©taillĂ©esâŻ!
Validation stricte de la configuration¶
OpenClaw nâaccepte que les configurations qui correspondent entiĂšrement au schĂ©ma. Les clĂ©s inconnues, les types mal formĂ©s ou les valeurs invalides amĂšnent la Gateway (passerelle) Ă refuser de dĂ©marrer par mesure de sĂ©curitĂ©.
En cas dâĂ©chec de la validationâŻ:
- La Gateway ne démarre pas.
- Seules les commandes de diagnostic sont autorisĂ©es (par exempleâŻ:
openclaw doctor,openclaw logs,openclaw health,openclaw status,openclaw service,openclaw help). - Exécutez
openclaw doctorpour voir les problÚmes exacts. - Exécutez
openclaw doctor --fix(ou--yes) pour appliquer les migrations/réparations.
Doctor nâĂ©crit jamais de modifications sauf si vous optez explicitement pour --fix/--yes.
Schéma + indications UI¶
La Gateway expose une reprĂ©sentation JSON Schema de la configuration via config.schema pour les Ă©diteurs dâinterface.
Lâinterface de contrĂŽle gĂ©nĂšre un formulaire Ă partir de ce schĂ©ma, avec un Ă©diteur Raw JSON comme Ă©chappatoire.
Les plugins et extensions de canaux peuvent enregistrer un schéma + des indications UI pour leur configuration, afin que les paramÚtres de canaux restent pilotés par schéma dans toutes les applications sans formulaires codés en dur.
Les indications (libellés, regroupements, champs sensibles) accompagnent le schéma afin que les clients puissent rendre de meilleurs formulaires sans connaissance codée en dur de la configuration.
Appliquer + redémarrer (RPC)¶
Utilisez config.apply pour valider + écrire la configuration complÚte et redémarrer la Gateway en une seule étape.
Cela écrit un marqueur de redémarrage et ping la derniÚre session active aprÚs le redémarrage de la Gateway.
AvertissementâŻ: config.apply remplace lâintĂ©gralitĂ© de la configuration. Si vous souhaitez ne modifier que quelques clĂ©s,
utilisez config.patch ou openclaw config set. Conservez une sauvegarde de ~/.openclaw/openclaw.json.
Parametres :
raw(string) â charge utile JSON5 pour la configuration complĂštebaseHash(optionnel) â hachage de configuration provenant deconfig.get(requis lorsquâune configuration existe dĂ©jĂ )sessionKey(optionnel) â clĂ© de la derniĂšre session active pour le ping de rĂ©veilnote(optionnel) â note Ă inclure dans le marqueur de redĂ©marragerestartDelayMs(optionnel) â dĂ©lai avant redĂ©marrage (par dĂ©faut 2000)
Exemple (via gateway call)âŻ:
openclaw gateway call config.get --params '{}' # capture payload.hash
openclaw gateway call config.apply --params '{
"raw": "{\\n agents: { defaults: { workspace: \\"~/.openclaw/workspace\\" } }\\n}\\n",
"baseHash": "<hash-from-config.get>",
"sessionKey": "agent:main:whatsapp:dm:+15555550123",
"restartDelayMs": 1000
}'
Mises à jour partielles (RPC)¶
Utilisez config.patch pour fusionner une mise à jour partielle dans la configuration existante sans écraser
les clĂ©s non liĂ©es. Cela applique la sĂ©mantique de JSON merge patchâŻ:
- les objets fusionnent récursivement
nullsupprime une clé- les tableaux sont remplacés
Commeconfig.apply, la configuration est validée, écrite, un marqueur de redémarrage est stocké, puis le redémarrage de la Gateway est planifié (avec un réveil optionnel lorsquesessionKeyest fourni).
Parametres :
raw(string) â charge utile JSON5 contenant uniquement les clĂ©s Ă modifierbaseHash(requis) â hachage de configuration provenant deconfig.getsessionKey(optionnel) â clĂ© de la derniĂšre session active pour le ping de rĂ©veilnote(optionnel) â note Ă inclure dans le marqueur de redĂ©marragerestartDelayMs(optionnel) â dĂ©lai avant redĂ©marrage (par dĂ©faut 2000)
ExempleâŻ:
openclaw gateway call config.get --params '{}' # capture payload.hash
openclaw gateway call config.patch --params '{
"raw": "{\\n channels: { telegram: { groups: { \\"*\\": { requireMention: false } } } }\\n}\\n",
"baseHash": "<hash-from-config.get>",
"sessionKey": "agent:main:whatsapp:dm:+15555550123",
"restartDelayMs": 1000
}'
Configuration minimale (point de départ recommandé)¶
{
agents: { defaults: { workspace: "~/.openclaw/workspace" } },
channels: { whatsapp: { allowFrom: ["+15555550123"] } },
}
Construisez lâimage par dĂ©faut une seule fois avecâŻ:
scripts/sandbox-setup.sh
Mode auto-discussion (recommandé pour le contrÎle des groupes)¶
Pour empĂȘcher le bot de rĂ©pondre aux @-mentions WhatsApp dans les groupes (rĂ©pondre uniquement Ă des dĂ©clencheurs textuels spĂ©cifiques)âŻ:
{
agents: {
defaults: { workspace: "~/.openclaw/workspace" },
list: [
{
id: "main",
groupChat: { mentionPatterns: ["@openclaw", "reisponde"] },
},
],
},
channels: {
whatsapp: {
// Allowlist is DMs only; including your own number enables self-chat mode.
allowFrom: ["+15555550123"],
groups: { "*": { requireMention: true } },
},
},
}
Inclusions de configuration ($include)¶
Scindez votre configuration en plusieurs fichiers Ă lâaide de la directive $include. Ceci est utile pourâŻ:
- organiser de grandes configurations (p.âŻex. dĂ©finitions dâagents par client)
- partager des paramĂštres communs entre environnements
- conserver les configurations sensibles séparément
Utilisation de base¶
// ~/.openclaw/openclaw.json
{
gateway: { port: 18789 },
// Include a single file (replaces the key's value)
agents: { $include: "./agents.json5" },
// Include multiple files (deep-merged in order)
broadcast: {
$include: ["./clients/mueller.json5", "./clients/schmidt.json5"],
},
}
// ~/.openclaw/agents.json5
{
defaults: { sandbox: { mode: "all", scope: "session" } },
list: [{ id: "main", workspace: "~/.openclaw/workspace" }],
}
Comportement de fusion¶
- Fichier uniqueâŻ: remplace lâobjet contenant
$include - Tableau de fichiersâŻ: fusion profonde des fichiers dans lâordre (les fichiers ultĂ©rieurs remplacent les prĂ©cĂ©dents)
- Avec clĂ©s sĆursâŻ: les clĂ©s sĆurs sont fusionnĂ©es aprĂšs les inclusions (elles remplacent les valeurs incluses)
- ClĂ©s sĆurs + tableaux/primitifsâŻ: non pris en charge (le contenu inclus doit ĂȘtre un objet)
// Sibling keys override included values
{
$include: "./base.json5", // { a: 1, b: 2 }
b: 99, // Result: { a: 1, b: 99 }
}
Inclusions imbriquées¶
Les fichiers inclus peuvent eux-mĂȘmes contenir des directives $include (jusquâĂ 10 niveaux de profondeur)âŻ:
// clients/mueller.json5
{
agents: { $include: "./mueller/agents.json5" },
broadcast: { $include: "./mueller/broadcast.json5" },
}
Résolution des chemins¶
- Chemins relatifsâŻ: rĂ©solus par rapport au fichier incluant
- Chemins absolus : Utilisé tel quel
- RĂ©pertoires parentsâŻ: les rĂ©fĂ©rences
../fonctionnent comme attendu
{ "$include": "./sub/config.json5" } // relative
{ "$include": "/etc/openclaw/base.json5" } // absolute
{ "$include": "../shared/common.json5" } // parent dir
Gestion des erreurs¶
- Fichier manquantâŻ: erreur claire avec le chemin rĂ©solu
- Erreur dâanalyseâŻ: indique quel fichier inclus a Ă©chouĂ©
- Inclusions circulairesâŻ: dĂ©tectĂ©es et signalĂ©es avec la chaĂźne dâinclusion
ExempleâŻ: configuration lĂ©gale multiâclients¶
// ~/.openclaw/openclaw.json
{
gateway: { port: 18789, auth: { token: "secret" } },
// Common agent defaults
agents: {
defaults: {
sandbox: { mode: "all", scope: "session" },
},
// Merge agent lists from all clients
list: { $include: ["./clients/mueller/agents.json5", "./clients/schmidt/agents.json5"] },
},
// Merge broadcast configs
broadcast: {
$include: ["./clients/mueller/broadcast.json5", "./clients/schmidt/broadcast.json5"],
},
channels: { whatsapp: { groupPolicy: "allowlist" } },
}
// ~/.openclaw/clients/mueller/agents.json5
[
{ id: "mueller-transcribe", workspace: "~/clients/mueller/transcribe" },
{ id: "mueller-docs", workspace: "~/clients/mueller/docs" },
]
// ~/.openclaw/clients/mueller/broadcast.json5
{
"120363403215116621@g.us": ["mueller-transcribe", "mueller-docs"],
}
Options courantes¶
Env vars + .env¶
OpenClaw lit les variables dâenvironnement depuis le processus parent (shell, launchd/systemd, CI, etc.).
De plus, il chargeâŻ:
.envdepuis le rĂ©pertoire de travail courant (sâil existe)- un repli global
.envdepuis~/.openclaw/.env(alias$OPENCLAW_STATE_DIR/.env)
Aucun fichier .env ne remplace des variables dâenvironnement existantes.
Vous pouvez Ă©galement fournir des variables dâenvironnement en ligne dans la configuration. Elles ne sont appliquĂ©es que si la variable est absente de lâenvironnement du processus (mĂȘme rĂšgle de nonâremplacement)âŻ:
{
env: {
OPENROUTER_API_KEY: "sk-or-...",
vars: {
GROQ_API_KEY: "gsk-...",
},
},
}
Voir /environment pour la priorité complÚte et les sources.
env.shellEnv (optionnel)¶
Option de confortâŻ: si activĂ©e et quâaucune des clĂ©s attendues nâest encore dĂ©finie, OpenClaw exĂ©cute votre shell de connexion et importe uniquement les clĂ©s attendues manquantes (ne remplace jamais). Cela revient Ă sourcer votre profil de shell.
{
env: {
shellEnv: {
enabled: true,
timeoutMs: 15000,
},
},
}
Env var équivalent:
OPENCLAW_LOAD_SHELL_ENV=1OPENCLAW_SHELL_ENV_TIMEOUT_MS=15000
Substitution de variables dâenvironnement dans la configuration¶
Vous pouvez rĂ©fĂ©rencer des variables dâenvironnement directement dans toute valeur de chaĂźne de la configuration en utilisant la syntaxe ${VAR_NAME}. Les variables sont substituĂ©es au chargement de la configuration, avant validation.
{
models: {
providers: {
"vercel-gateway": {
apiKey: "${VERCEL_GATEWAY_API_KEY}",
},
},
},
gateway: {
auth: {
token: "${OPENCLAW_GATEWAY_TOKEN}",
},
},
}
RĂšglesâŻ:
- Seuls les noms de variables en majuscules sont reconnusâŻ:
[A-Z_][A-Z0-9_]* - Il manque ou vide env vars lancer une erreur au chargement de la configuration
- Ăchappez avec
$${VAR}pour produire un${VAR}littéral - Fonctionne avec
$include(les fichiers inclus bénéficient aussi de la substitution)
Substitution en ligneâŻ:
{
models: {
providers: {
custom: {
baseUrl: "${CUSTOM_API_BASE}/v1", // â "https://api.example.com/v1"
},
},
},
}
Stockage dâauthentification (OAuth + clĂ©s API)¶
OpenClaw stocke des profils dâauthentification par agent (OAuth + clĂ©s API) dansâŻ:
<agentDir>/auth-profiles.json(par dĂ©fautâŻ:~/.openclaw/agents/<agentId>/agent/auth-profiles.json)
Voir aussiâŻ: /concepts/oauth
Imports OAuth hĂ©ritĂ©sâŻ:
~/.openclaw/credentials/oauth.json(ou$OPENCLAW_STATE_DIR/credentials/oauth.json)
Lâagent Pi intĂ©grĂ© maintient un cache dâexĂ©cution Ă âŻ:
<agentDir>/auth.json(gĂ©rĂ© automatiquementâŻ; ne pas modifier manuellement)
RĂ©pertoire dâagent hĂ©ritĂ© (avant le multiâagent)âŻ:
~/.openclaw/agent/*(migré paropenclaw doctorvers~/.openclaw/agents/<defaultAgentId>/agent/*)
RemplacementsâŻ:
- RĂ©pertoire OAuth (import hĂ©ritĂ© uniquement)âŻ:
OPENCLAW_OAUTH_DIR - RĂ©pertoire dâagent (remplacement de la racine par dĂ©faut)âŻ:
OPENCLAW_AGENT_DIR(préféré),PI_CODING_AGENT_DIR(hérité)
Lors de la premiÚre utilisation, OpenClaw importe les entrées oauth.json dans auth-profiles.json.
auth¶
MĂ©tadonnĂ©es optionnelles pour les profils dâauthentification. Cela ne stocke pas de secretsâŻ; cela mappe les identifiants de profil vers un fournisseur + un mode (et un eâmail optionnel) et dĂ©finit lâordre de rotation des fournisseurs utilisĂ© pour le basculement.
{
auth: {
profiles: {
"anthropic:me@example.com": { provider: "anthropic", mode: "oauth", email: "me@example.com" },
"anthropic:work": { provider: "anthropic", mode: "api_key" },
},
order: {
anthropic: ["anthropic:me@example.com", "anthropic:work"],
},
},
}
agents.list[].identity¶
IdentitĂ© par agent optionnelle utilisĂ©e pour les valeurs par dĂ©faut et lâUX. Elle est Ă©crite par lâassistant de prise en main macOS.
Si dĂ©finie, OpenClaw dĂ©rive des valeurs par dĂ©faut (uniquement si vous ne les avez pas dĂ©finies explicitement)âŻ:
messages.ackReactiondepuis lâidentity.emojide lâagent actif (repli sur đ)agents.list[].groupChat.mentionPatternsdepuis lâidentity.name/identity.emojide lâagent (ainsi «âŻ@SamanthaâŻÂ» fonctionne dans les groupes sur Telegram/Slack/Discord/Google Chat/iMessage/WhatsApp)identity.avataraccepte un chemin dâimage relatif Ă lâespace de travail ou une URL distante/URL de donnĂ©es. Les fichiers locaux doivent se trouver dans lâespace de travail de lâagent.
identity.avatar accepteâŻ:
- un chemin relatif Ă lâespace de travail (doit rester dans lâespace de travail de lâagent)
- une URL
http(s) - un URI
data:
{
agents: {
list: [
{
id: "main",
identity: {
name: "Samantha",
theme: "helpful sloth",
emoji: "đŠ„",
avatar: "avatars/samantha.png",
},
},
],
},
}
wizard¶
Métadonnées écrites par les assistants CLI (onboard, configure, doctor).
{
wizard: {
lastRunAt: "2026-01-01T00:00:00.000Z",
lastRunVersion: "2026.1.4",
lastRunCommit: "abc1234",
lastRunCommand: "configure",
lastRunMode: "local",
},
}
journalisation¶
- Fichier journal par défaut:
/tmp/openclaw/openclaw-YYYYY-MM-DD.log - Si vous voulez un chemin stable, définissez
logging.fileĂ/tmp/openclaw/openclaw.log. - La sortie de la console peut ĂȘtre rĂ©glĂ©e sĂ©parĂ©ment via :
logging.consoleLevel(par dĂ©faut,info, bumps Ădebugquand--verbose)logging.consoleStyle(pretty|compact|json)- Les rĂ©sumĂ©s des outils peuvent ĂȘtre reproduits pour Ă©viter les fuites de secrets :
logging.redactSensitive(off|tools, default:tools)logging.redactPatterns(tableau de chaßnes regex ; remplace les valeurs par défaut)
{
logging: {
level: "info",
file: "/tmp/openclaw/openclaw. og",
ConsoleLevel: "info",
ConsoleStyle: "pretty",
redactSensitive: "tools",
redactPatterns: [
// Exemple: remplacer les valeurs par défaut par vos propres rÚgles.
"\\bTOKEN\\b\\s*[=:]\\s*([\"']? ([^\\s\"']+)\\1",
"/\\bsk-[A-Za-z0-9_-]{8,}\\b/gi",
],
},
}
channels.whatsapp.dmPolicy¶
ContrĂŽle la gestion des discussions directes sur WhatsApp (DMs) :
"appairage"(par défaut): les expéditeurs inconnus obtiennent un code d'appairage ; le propriétaire doit approuver"allowlist": n'autoriser que les expéditeurs danschannels.whatsapp.allowFrom(ou le magasin autorisé par apparition)"open": autorise toutes les DMs entrantes (requireschannels.whatsapp.allowFromà inclure"*")"désactivé": ignorer tous les MP entrants
Les codes d'appairage expirent aprĂšs 1 heure ; le bot n'envoie un code d'appairage que lorsqu'une nouvelle requĂȘte est créée. Les requĂȘtes d'appairage de DM en attente sont plafonnĂ©es Ă 3 par canal par dĂ©faut.
Approbations d'appairage :
liste d'appairage openclaw whatsappL'appairage openclaw approuve whatsapp <code>
channels.whatsapp.allowFrom¶
Liste des numéros de téléphone E.164 qui peuvent déclencher les réponses automatiques WhatsApp (MP seulement).
Si vide et channels.whatsapp.dmPolicy="appairage", les expéditeurs inconnus recevront un code d'appairage.
Pour les groupes, utilisez channels.whatsapp.groupPolicy + channels.whatsapp.groupAllowFrom.
{
channels: {
whatsapp: {
dmPolicy: "appairage", // appairage | allowlist | open | disabled
allowFrom: ["+15555550123", "+447700900123"],
textChunkLimit: 4000, // taille de chunk sortant optionnelle (caractĂšres)
chunkMode : "length", // mode de chunking optionnel (longueur | newline)
mediaMaxMb: 50, // capuche média entrante en option (MB)
},
},
}
channels.whatsapp.sendReadReadReceipts¶
ContrÎle si les messages WhatsApp entrants sont marqués comme lus (tickets bleus). Par défaut: true.
Le mode auto-chat saute toujours les reçus de lecture, mĂȘme lorsqu'il est activĂ©.
Surcharge par compte : channels.whatsapp.accounts.<id>.sendReadReadReceipts.
{
canaux: {
whatsapp: { sendReadReceipts: false },
},
}
channels.whatsapp.accounts (multi-compte)¶
Exécutez plusieurs comptes WhatsApp dans une seule passerelle :
{
channels: {
whatsapp: {
accouns: {
default: {}, // optionnelle; garde l'id stable par défaut
personal: {},
biz: {
// Substitution facultative. Par défaut: ~/.openclaw/credentials/whatsapp/biz
// authDir: "~/. penclaw/credentials/whatsapp/biz",
},
},
},
},
}
NotesâŻ:
- Les commandes sortantes sont par défaut le compte
defaultsi elles sont présentes; sinon le premier identifiant de compte configuré (trié). - L'ancien dossier d'authentification unique Baileys est migré par
openclaw doctorverswhatsapp/default.
channels.telegram.accounts / channels.discord.accounts / channels.googlechat.accounts / channels.slack.accounts / channels.mattermost.accounts / channels.signal.accounts / channels.imessage.accounts¶
Exécutez plusieurs comptes par canal (chaque compte a son propre accountId et optionnel name) :
{
channels: {
telegram: {
accouns: {
default: {
name: "Primary bot",
botToken: "123456:ABC... ,
},
alertes: {
nom: "Alertes bot",
botToken: "987654:XYZ. .",
},
},
},
},
}
RemarquesâŻ:
defaultest utilisé lorsqueaccountIdest omis (CLI + routing).- Les jetons d'Env ne s'appliquent qu'au compte default.
- ParamÚtres du canal de base (politique de groupe, portail de mention etc.) s'appliquent à tous les comptes sauf si surchargé par compte.
- Utilisez
bindings[].match.accountIdpour acheminer chaque compte vers un agents.defaults.
ClÎture de mention de groupe (agents.list[].groupChat + messages.groupChat)¶
Les messages de groupe sont par défaut require mention (soit la mention des métadonnées ou les schémas de regex ). S'applique aux discussions de groupe WhatsApp, Telegram, Discord, Google Chat et iMessage.
Types de mentions :
- Mentions de métadonnées : Plate-forme native @-mentions (par exemple, WhatsApp tap-to-mention). Ignoré dans le mode WhatsApp auto-chat (voir
channels.whatsapp.allowFrom). - ModÚles de texte: ModÚles de Regex définis dans
agents.list[].groupChat.mentionPatterns. Toujours vérifié indépendamment du mode auto-chat. - La mention de la barriÚre n'est obligatoire que lorsque la détection des mentions est possible (mentions natives ou au moins un
mentionPattern).
{
messages : {
groupChat: { historyLimit: 50 },
},
agents : {
list: [{ id: "main", groupChat: { mentionPatterns: ["@openclaw", "openclaw"] } }],
},
}
messages.groupChat.historyLimit dĂ©finit la valeur par dĂ©faut globale pour le contexte de l'histoire du groupe. Les canaux peuvent ĂȘtre remplacĂ©s par channels.<channel>.historyLimit (ou channels.<channel>.accounts.*.historyLimit pour plusieurs comptes). DĂ©finissez 0 pour dĂ©sactiver le wrapping historique.
Limites de l'historique des DM¶
Les conversations DM utilisent un historique de session géré par l'agent. Vous pouvez limiter le nombre de tours d'utilisateurs retenus par session DM :
{
canaux: {
télégramme: {
dmHistoryLimit: 30, // limite les sessions de DM Ă 30 devient
dms: {
"123456789": { historyLimit: 50 }, // surcharge par utilisateur (ID utilisateur)
},
},
},
}
Ordre de resolution:
- Substitution par DM:
channels.<provider>.dms[userId].historyLimit - Fournisseur par défaut :
channels.<provider>Limite de .dmHistory - Aucune limite (tout historique retenu)
Fournisseurs supportés : telegram, whatsapp, discord, slack, signal, imessage, msteams.
Surcharge par agent (prend la prioritĂ© lorsque dĂ©fini, mĂȘme []):
{
agents : {
liste: [
{ id: "travail", groupChat: { mentionPatterns: ["@workbot", "\\+15555550123"] } },
{ id: "personnel", groupChat: { mentionPatterns: ["@homebot", "\\+15555550999"] } },
],
},
}
Mentionnez les valeurs par défaut des gages en direct par canal (channels.whatsapp.groups, channels.telegram.groups, channels.imessage.groups, channels.discord.guilds). Lorsque *.groups est défini, il agit également comme une liste d'autorisations de groupe; inclure "*" pour autoriser tous les groupes.
Pour répondre seulement aux déclencheurs de texte spécifiques (ignorant les @-mentions natives) :
{
channels: {
whatsapp: {
// Inclure votre propre numéro pour activer le mode auto-chat (ignorer les @-mentions natifs).
permisDe: ["+15555550123"],
groupes: { "*": { requireMention: true } },
},
},
agents : {
liste: [
{
id: "main",
groupChat: {
// Seules ces pratiques de texte déclencheront les réponses
mentionPatterns: ["reisponde", "@openclaw"],
},
},
],
},
}
RÚgles de groupe (par canal)¶
Utilisez channels.*.groupPolicy pour contrÎler si les messages de groupe/salle sont acceptés du tout:
{
channels: {
whatsapp: {
groupPolicy: "allowlist",
groupeAllowDe: ["+15551234567"],
},
télégramme : {
groupPolicy: "allowlist",
groupAllowDe: ["tg:123456789", "@alice"],
},
signal: {
groupPolicy: "allowlist",
groupAllowDe: ["+15551234567"],
},
imitation : {
groupPolicy: "allowlist",
groupAllowDe: ["chat_id:123"],
},
msteams: {
groupPolicy: "allowlist",
groupAllowFrom: ["user@org. om"],
},
discord: {
groupPolicy: "allowlist",
guildes: {
GUILD_ID: {
canaux: { help: { allow: true } },
},
},
},
slack: {
groupPolicy: "allowlist",
canaux: { "#general": { allow: true } },
},
},
}
Notes :
"open": groupe de contourner les listes d'autorisations; mention-gating s'applique toujours."disabled": bloque tous les messages de groupe/salle."allowlist": n'autorise que les groupes/salles qui correspondent à la liste d'autorisations configurée.channels.defaults.groupPolicydéfinit la valeur par défaut quand legroupPolicyd'un fournisseur est dédéfini.- WhatsApp/Telegram/Signal/iMessage/Microsoft Teams utilisent
groupAllowFrom(repli : expliciteallowFrom). - Discord/Slack utilise des listes d'autorisations de canal (
channels.discord.guilds.*.channels,channels.slack.channels). - Les DMs de groupe (Discord/Slack) sont toujours contrÎlés par
dm.groupEnabled+dm.groupChannels. - La valeur par défaut est
groupPolicy: "allowlist"(à moins quechannels.defaults.groupPolicy); si aucune liste d'autorisations n'est configurée, les messages de groupe sont bloqués.
Routage multi-agents (agents.list + bindings)¶
Exécutez plusieurs agents isolés (espace de travail séparé, agentDir, sessions) à l'intérieur d'une passerelle.
Les messages entrants sont acheminés vers un agent via des liaisons.
- gateway/configuration.md
id: id de l'agent stable (obligatoire).default: optionnel; lorsque plusieurs sont dĂ©finis, le premier gagne et un avertissement est enregistrĂ©. Si aucun n'est dĂ©fini, la premiĂšre entrĂ©e dans la liste est l'agent par dĂ©faut.name: affiche le nom de l'agent.workspace: par dĂ©faut~/.openclaw/workspace-<agentId>(pourmain, tombe Ăagents.defaults.workspace).agentDir: default~/.openclaw/agents/<agentId>/agent.model: le modĂšle par dĂ©faut par agent remplaceagents.defaults.modelpour cet agent.- string form:
"provider/model", remplace seulementagents.defaults.model.primary - forme de l'objet :
{ primary, fallbacks }(les replis remplacentagents.defaults.model.fallbacks;[]désactive les replis globaux pour cet agent)
- string form:
identity: nom de chaque agent / thÚme/emoji (utilisé pour les motifs de mention + réactions de ack).groupChat: per-agent mention-gating (mentionPatterns).sandbox: per-agent sandbox config (remplaceagents.defaults.sandbox).mode:"off"|"non-main"|"all"workspaceAccess:"none"|"ro"|"rw"scope:"session"|"agent"|"shared"workspaceRoot: racine de l'espace de travail du sandbox personnalisédocker: le docker par agent remplace (par exempleimage,network,env,setupCommand, limites; ignoré quandscope: "shared")browser: par agent sandboxed browser overrides (ignoré lorsquescope: "shared")prune: le nettoyage par agent du bac à sable remplace (ignoré lorsquescope: "shared")
sous-agents: par agent sous-agent par dĂ©faut.allowAgents: autorise la liste des identifiants d'agents poursessions_spawnde cet agent (["*"]= autorise n'importe ; par dĂ©faut: seulement le mĂȘme agent)
tools: restrictions par agent (appliquées avant la politique de l'outil sandbox).profile: profil de l'outil de base (appliqué avant autoriser/refuser)allow: tableau de noms d'outils autorisésniy: tableau de noms d'outils refusés (refuse gagne)
agents.defaults: agent partagé par défaut (modÚle, espace de travail, bac à sable, etc.).bindings[]: annule les messages entrants vers unagentId.match.channel(obligatoire)match.accountId(facultatif;*= n'importe quel compte; omis = compte par défaut)match.peer(facultatif;{ kind: direct|group|channel, id })match.guildId/match.teamId(optional; channel-specific)
Ordre de correspondance déterministe :
match.peermatch.guildIdmatch.teamIdmatch.accountId(exact, pas de peer/guild/team)match.accountId: "*"(canal-wide, no peer/guild/team)- agent par défaut (
agents.list[].default, sinon premiÚre entrée de liste, sinon"main")
Dans chaque niveau de match, la premiÚre entrée correspondante dans bindings gagne.
Profils dâaccĂšs par agent (multiâagent)¶
Chaque agent peut porter sa propre politique de sandbox + outils. Utilisez ceci pour mélanger les niveaux d'accÚs dans une seule passerelle:
- AccĂšs complet (agent personnel)
- Outils en lecture seule + espace de travail
- Aucun accĂšs au systĂšme de fichiers (outils de messagerie/session seulement)
Voir Sandbox & Outils multi-agents pour la priorité et des exemples supplémentaires.
AccĂšs complet (sans bac Ă sable) :
{
agents: {
list: [
{
id: "personal",
workspace: "~/.openclaw/workspace-personal",
sandbox: { mode: "off" },
},
],
},
}
Outils en lecture seule + espace de travail en lecture seule :
{
agents : {
liste: [
{
id: "famille",
espace de travail: "~/. penclaw/workspace-family",
sandbox: {
mode : "all",
téles: "agent",
workspaceAccess : "ro",
},
outils : {
allow: [
"read",
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"session_status",
],
: ["write", "edit", "apply_patch", "exec", "process", "browser"],
},
},
],
},
}
Aucun accÚs au systÚme de fichiers (outils de messagerie/session activés) :
{
agents : {
liste: [
{
id: "public",
espace de travail: "~/. penclaw/workspace-public",
sandbox: {
mode : "all",
téles: "agent",
workspaceAccess : "none",
},
outils : {
allow: [
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"statut de session",
"whatsapp",
"télégramme",
"slack",
"discord",
"passerelle",
],
Ni : [
"lu",
"écrire",
"modifier",
"apply_patch",
"exec",
"processus",
"navigateur",
"toile",
"nĆuds",
"cron",
"passerelle",
"image",
],
},
},
],
},
}
Exemple: deux comptes WhatsApp â deux agents:
{
agents : {
liste: [
{ id: "maison", par défaut : true, workspace: "~/. penclaw/workspace-home" },
{ id: "work", workspace: "~/. penclaw/workspace-work" },
],
},
liaisons : [
{ agentId: "home", match: { channel: "whatsapp", accountId: "personal" } },
{ agentId: "work", match: { channel: "whatsapp", accountId: "biz" } },
],
salons : {
whatsapp: {
accouns: {
personal: {},
biz : {},
},
},
},
}
tools.agentToAgent (facultatif)¶
La messagerie Agent-to-Agent est opt-in :
{
tools: {
agentToAgent: {
activé: false,
allow: ["home", "work"],
},
},
}
messages.queue¶
ContrÎle le comportement des messages entrants lorsqu'un agent est déjà actif.
{
messages: {
file d'attente: {
mode : "collect", // va | suivi | collect | steer-backlog (steer+backlog ok) | interrupt (queue=legacy)
debounceMs: 1000,
majuscule : 20,
drop: "résumer", // ancien | nouveau | résumé
par Channel: {
whatsapp: "collect",
télégramme : "collecter",
discord: "collecter",
Impression : "collecter",
webchat : "collecter",
},
},
},
}
messages.inbound¶
Debouncez les messages entrants rapides du mĂȘme expĂ©diteur de sorte que les messages multiples deviennent un tour d'agent. Le debouncing est delimite par canal + conversation et utilise le message le plus recent pour le fil de reponse et les IDs.
{
messages : {
inbound: {
debounceMs: 2000, // 0 désactive
byChannel: {
whatsapp: 5000,
slack : 1500,
discord: 1500,
},
},
},
}
Notes :
- Debounce batches text-only messages; media/attachments purge immédiatement.
- Les commandes de contrĂŽle (par exemple
/queue,/new) contournent le débouncement pour qu'ils restent autonomes.
commands (gestion des commandes de chat)¶
ContrÎle comment les commandes de chat sont activées entre les connecteurs.
{
commandes: {
natif : "auto", // registre les commandes natives lorsque supporté (auto)
text: true, // analyse les commandes slash dans les messages de chat
bash: false, // allow ! (alias: /bash) (HÎte seulement; nécessite des outils. listes d'autorisations levées)
bashForegroundMs: 2000, // bash fenĂȘtre de premier plan (0 arriĂšre-plans immĂ©diatement)
config: false, // autorise /config (écrit sur le disque)
debug: false, // autorise /debug (runtime-only overrides)
redémarrage: false, // autorise /restart + outil de redémarrage de passerelle
useAccessGroups: true, // force les listes d'autorisations de groupe d'accĂšs / politiques pour les commandes
},
}
Notes :
- Les commandes de texte doivent ĂȘtre envoyĂ©es en tant que message standalone et utiliser le
/(aucun alias en texte brut). commands.text: falsedésactive l'analyse des messages de chat pour les commandes.commands.native: "auto"(par défaut) active les commandes natives pour Discord/Telegram et laisse Slack éteint ; les canaux non pris en charge ne restent que du texte.- Définissez
commands.native: true|falsepour forcer tous, ou remplacez par canal parchannels.discord.commands.native,channels.telegram.commands.native,channels.slack.commands.native(bool ou"auto").falseefface les commandes prĂ©cĂ©demment enregistrĂ©es sur Discord/Telegram au dĂ©marrage; les commandes Slack sont gĂ©rĂ©es dans l'application Slack. channels.telegram.customCommandsajoute des entrĂ©es de menu Telegram bot supplĂ©mentaires. Les noms sont normalisĂ©s ; les conflits avec les commandes natives sont ignorĂ©s.commands.bash: trueactive! <cmd>pour exĂ©cuter les commandes du shell hĂŽte (/bash <cmd>fonctionne aussi comme un alias). NĂ©cessitetools.elevated.enabledet autorise l'expĂ©diteur danstools.elevated.allowFrom.<channel>.commands.bashForegroundMscontrĂŽle combien de temps bash attend avant l'arriĂšre-plan. Pendant qu'une tĂąche de bash est en cours d'exĂ©cution, nouveau! <cmd>les demandes sont rejetĂ©es (une Ă la fois).commands.config: trueactive/config(reads/writesopenclaw.json).canaux.<provider>.configWritesporte les mutations de configuration initiĂ©es par ce canal (par dĂ©faut : true). Ceci s'applique Ă/config set|unsetplus aux auto-migrations spĂ©cifiques au fournisseur (changements d'ID de super-groupe Telegram, changement d'ID de canal Slack).commands.debug: trueactive/debug(overrides).commands.restart: trueactive/restartet l'outil passerelle redĂ©marre l'action.commands.useAccessGroups: falsepermet aux commandes de contourner les listes d'autorisations de groupe d'accĂšs/polices.- Les commandes slash et directives ne sont honorĂ©es que pour des expĂ©diteurs autorisĂ©s. L'autorisation est dĂ©rivĂ©e de
channel allowlists/appairage plus
commands.useAccessGroups.
web (Exécution du canal web WhatsApp)¶
WhatsApp passe par le canal web de la passerelle (Baileys Web). Il démarre automatiquement lorsqu'une session liée existe.
Définissez web.enabled: false pour le garder désactivé par défaut.
{
web: {
activé: true,
heartbeatSeconds: 60,
reconnecté: {
initialMs: 2000,
maxMs : 120000,
facteur : 1. ,
jitter: 0. ,
maxTentatives : 0,
},
},
}
channels.telegram (transport du bot)¶
OpenClaw démarre Telegram seulement quand une section de configuration channels.telegram existe. Le jeton de bot est résolu à partir de channels.telegram.botToken (ou channels.telegram.tokenFile), avec TELEGRAM_BOT_TOKEN comme secours pour le compte par défaut.
Définir channels.telegram.enabled: false pour désactiver le démarrage automatique.
La prise en charge des comptes multi-comptes se trouve sous channels.telegram.accounts (voir la section multi-comptes ci-dessus). Les jetons Env ne s'appliquent qu'au compte par défaut.
Définissez channels.telegram.configWrites: false pour bloquer l'écriture de configuration initialisée par Telegram-initiated (incluant les migrations d'ID de supergroupe et /config set|unset).
{
channels: {
telegram: {
enabled: true,
botToken: "your-bot-token",
dmPolicy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["tg:123456789"], // optional; "open" requires ["*"]
groups: {
"*": { requireMention: true },
"-1001234567890": {
allowFrom: ["@admin"],
systemPrompt: "Keep answers brief.",
topics: {
"99": {
requireMention: false,
skills: ["search"],
systemPrompt: "Stay on topic.",
},
},
},
},
customCommands: [
{ command: "backup", description: "Git backup" },
{ command: "generate", description: "Create an image" },
],
historyLimit: 50, // include last N group messages as context (0 disables)
replyToMode: "first", // off | first | all
linkPreview: true, // toggle outbound link previews
streamMode: "partial", // off | partial | block (draft streaming; separate from block streaming)
draftChunk: {
// optional; only for streamMode=block
minChars: 200,
maxChars: 800,
breakPreference: "paragraph", // paragraph | newline | sentence
},
actions: { reactions: true, sendMessage: true }, // tool action gates (false disables)
reactionNotifications: "own", // off | own | all
mediaMaxMb: 5,
retry: {
// outbound retry policy
attempts: 3,
minDelayMs: 400,
maxDelayMs: 30000,
jitter: 0.1,
},
network: {
// transport overrides
autoSelectFamily: false,
},
proxy: "socks5://localhost:9050",
webhookUrl: "https://example.com/telegram-webhook", // requires webhookSecret
webhookSecret: "secret",
webhookPath: "/telegram-webhook",
},
},
}
Notes de streaming brouillon :
- Utilise Telegram
sendMessageDraft(bulle brouillon, pas un vrai message). - Nécessite des sujets de chat privés (message_thread_id en DMs; le bot a activé les sujets).
/reasoning streamenvoie le raisonnement dans le brouillon, puis envoie la réponse finale. La politique de réessai par défaut et le comportement sont documentés dans [Politique de réessai] (/concepts/retry).
channels.discord (transport du bot)¶
Configurer le bot Discord en définissant le jeton de bot et le portail facultatif :
Le support multi-comptes vit sous channels.discord.accounts (voir la section multi-comptes ci-dessus). Les jetons Env ne s'appliquent qu'au compte par défaut.
{
channels: {
discord: {
enabled: true,
token: "your-bot-token",
mediaMaxMb: 8, // clamp inbound media size
allowBots: false, // allow bot-authored messages
actions: {
// tool action gates (false disables)
reactions: true,
stickers: true,
polls: true,
permissions: true,
messages: true,
threads: true,
pins: true,
search: true,
memberInfo: true,
roleInfo: true,
roles: false,
channelInfo: true,
voiceStatus: true,
events: true,
moderation: false,
},
replyToMode: "off", // off | first | all
dm: {
enabled: true, // disable all DMs when false
policy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["1234567890", "steipete"], // optional DM allowlist ("open" requires ["*"])
groupEnabled: false, // enable group DMs
groupChannels: ["openclaw-dm"], // optional group DM allowlist
},
guilds: {
"123456789012345678": {
// guild id (preferred) or slug
slug: "friends-of-openclaw",
requireMention: false, // per-guild default
reactionNotifications: "own", // off | own | all | allowlist
users: ["987654321098765432"], // optional per-guild user allowlist
channels: {
general: { allow: true },
help: {
allow: true,
requireMention: true,
users: ["987654321098765432"],
skills: ["docs"],
systemPrompt: "Short answers only.",
},
},
},
},
historyLimit: 20, // include last N guild messages as context
textChunkLimit: 2000, // optional outbound text chunk size (chars)
chunkMode: "length", // optional chunking mode (length | newline)
maxLinesPerMessage: 17, // soft max lines per message (Discord UI clipping)
retry: {
// outbound retry policy
attempts: 3,
minDelayMs: 500,
maxDelayMs: 30000,
jitter: 0.1,
},
},
},
}
OpenClaw démarre Discord uniquement quand une section de configuration channels.discord existe. Le jeton est résolu à partir de channels.discord.token, avec DISCORD_BOT_TOKEN comme secours pour le compte par défaut (sauf si channels.discord.enabled est false). Utilisez user:<id> (DM) ou channel:<id> (canal de guilde) lorsque vous spécifiez des cibles de livraison pour les commandes cron/CLI ; les identifiants numériques nus sont ambigus et rejetés.
Les identifiants de guilde sont en minuscule avec des espaces remplacĂ©s par -; les clĂ©s de canal utilisent le nom du canal slugged (aucun # en tĂȘte). PrĂ©fĂ©rez les identifiants de guilde comme des clĂ©s pour Ă©viter de renommer l'ambiguĂŻtĂ©.
Les messages créés par le bot sont ignorés par défaut. Activer avec channels.discord.allowBots (les propres messages sont toujours filtrés pour éviter les boucles d'auto-réponse).
Modes de notification de réaction :
off: aucun evenement de reaction.own: reactions sur les propres messages du bot (defaut).all: toutes les reactions sur tous les messages.allowlist: reactions provenant deguilds.<id>.userssur tous les messages (liste vide desactive). Le texte sortant est chunked parchannels.discord.textChunkLimit(par dĂ©faut 2000). DĂ©finissezchannels.discord.chunkMode="newline"Ă sĂ©parer sur des lignes vides (limites du paragraphe) avant le chunking de longueur. Les clients Discord peuvent couper de trĂšs grands messages, doncchannels.discord.maxLinesPerMessage(par dĂ©faut 17) divise les rĂ©ponses longues de plusieurs lignes mĂȘme si moins de 2000 caractĂšres. La politique de rĂ©essai par dĂ©faut et le comportement sont documentĂ©s dans [Politique de rĂ©essai] (/concepts/retry).
channels.googlechat (Chat API webhook)¶
Google Chat s'exécute sur des webhooks HTTP avec une authentification au niveau de l'application (compte de service).
La prise en charge des comptes multi-comptes se trouve sous channels.googlechat.accounts (voir la section multi-comptes ci-dessus). Les variables Env ne s'appliquent qu'au compte par défaut.
{
salons: {
googlechat: {
activé: vrai,
serviceAccountFile: "/path/vers/service-account. son",
audienceType: "app-url", // app-url | project-number
audience: "https://gateway.example. om/googlechat",
webhookPath: "/googlechat",
botUser: "users/1234567890", // optional; améliore la détection des mentions
dm: {
activé: vrai,
Politique : "appairage", // appairage | allowlist | open | disabled
allowFrom: ["users/1234567890"], // optional; "open" requires ["*"]
},
groupPolicy: "allowlist",
groupes: {
"espaces/AAAA": { allow: true, requireMention: true },
},
actions : { reactions: true },
indicateur de frappe: "message",
mediaMaxMb: 20,
},
},
}
Notes :
- Le compte de service JSON peut ĂȘtre en ligne (
serviceAccount) ou basé sur un fichier (serviceAccountFile). - Env fallbacks pour le compte par défaut :
GOOGLE_CHAT_SERVICE_ACCOUNTouGOOGLE_CHAT_SERVICE_ACCOUNT_FILE. audienceType+audiencedoit correspondre Ă la configuration d'authentification du webhook de l'application de Chat.- Utilisez
spaces/<spaceId>ouusers/<userId|email>lorsque vous définissez des cibles de livraison.
channels.slack (mode socket)¶
Slack fonctionne en mode Socket et nécessite à la fois un jeton de bot et un jeton d'application:
{
channels: {
slack: {
enabled: true,
botToken: "xoxb-...",
appToken: "xapp-...",
dm: {
enabled: true,
policy: "pairing", // pairing | allowlist | open | disabled
allowFrom: ["U123", "U456", "*"], // optional; "open" requires ["*"]
groupEnabled: false,
groupChannels: ["G123"],
},
channels: {
C123: { allow: true, requireMention: true, allowBots: false },
"#general": {
allow: true,
requireMention: true,
allowBots: false,
users: ["U123"],
skills: ["docs"],
systemPrompt: "Short answers only.",
},
},
historyLimit: 50, // include last N channel/group messages as context (0 disables)
allowBots: false,
reactionNotifications: "own", // off | own | all | allowlist
reactionAllowlist: ["U123"],
replyToMode: "off", // off | first | all
thread: {
historyScope: "thread", // thread | channel
inheritParent: false,
},
actions: {
reactions: true,
messages: true,
pins: true,
memberInfo: true,
emojiList: true,
},
slashCommand: {
enabled: true,
name: "openclaw",
sessionPrefix: "slack:slash",
ephemeral: true,
},
textChunkLimit: 4000,
chunkMode: "length",
mediaMaxMb: 20,
},
},
}
La prise en charge des comptes multi-comptes se trouve sous channels.slack.accounts (voir la section multi-comptes ci-dessus). Les jetons Env ne s'appliquent qu'au compte par défaut.
OpenClaw démarre Slack lorsque le fournisseur est activé et que les deux jetons sont définis (via config ou SLACK_BOT_TOKEN + SLACK_APP_TOKEN). Utilisez user:<id> (DM) ou channel:<id> lorsque vous spécifiez des cibles de livraison pour les commandes cron/CLI.
Définissez channels.slack.configWrites: false pour bloquer l'écriture de la configuration Slack-initiated (y compris les migrations d'ID du canal et /config set|unset).
Les messages créés par le bot sont ignorés par défaut. Activer avec channels.slack.allowBots ou channels.slack.channels.<id>.allowBots.
Modes de notification de réaction :
off: aucun evenement de reaction.own: reactions sur les propres messages du bot (defaut).all: toutes les reactions sur tous les messages.allowlist: les réactions dechannels.slack.reactionAllowlistsur tous les messages (liste vide désactive).
Isolation de la session de discussion :
channels.slack.thread.historyScopecontrÎle si l'historique du thread est par thread (thread, default) ou partagé sur le canal (channel).channels.slack.thread.inheritParentcontrÎle si les nouvelles sessions de thread héritent de la transcription du canal parent (par défaut: false).
Groupes d'action Slack (actions de l'outil slack de portes):
| Groupe dâactions | Par dĂ©faut | Remarques |
|---|---|---|
| reactions | active | React + lister les reactions |
| messages | active | Lire/envoyer/editer/supprimer |
| pins | active | Epingler/desepingler/lister |
| memberInfo | active | Informations de membres |
| emojiList | active | Liste dâemoji personnalises |
channels.mattermost (jeton de bot)¶
Mattermost est distribue sous forme de plugin et nâest pas inclus dans lâinstallation de base.
Installez d'abord : openclaw plugins install @openclaw/mattermost (ou ./extensions/mattermost depuis un checkout).
Le plus important nécessite un jeton de bot plus l'URL de base de votre serveur:
{
channels: {
mattermost: {
activé: true,
botToken: "mm-token",
baseUrl: "https://chat. xample. om",
dmPolicy: "appairage",
chatmode: "oncall", // oncall | onmessage | onchar
oncharPrefixes: [">", "! ],
textChunkLimit: 4000,
chunkMode : "length",
},
},
}
OpenClaw démarre le plus important lorsque le compte est configuré (jeton de bot + URL de base) et activé. Le jeton + l'URL de base sont résolus à partir de channels.mattermost.botToken + channels.mattermost.baseUrl ou MATTERMOST_BOT_TOKEN + MATTERMOST_URL pour le compte par défaut (sauf si channels.mattermost.enabled est false).
Modes de chat :
oncall(par défaut) : ne répond aux messages du canal que lorsque @mentionné.onmessage: repond a chaque message du canal.onchar: répond lorsqu'un message commence par un préfixe de déclenchement (channels.mattermost.oncharPrefixes, default[">", "!"]).
ContrĂŽle d'accĂšs :
- DMs par défaut:
channels.mattermost.dmPolicy="appairage"(les expéditeurs inconnus obtiennent un code d'appairage). - Messages prives publics :
channels.mattermost.dmPolicy="open"pluschannels.mattermost.allowFrom=["*"]. - Groupes :
channels.mattermost.groupPolicy="allowlist"par défaut (mention-gated). Utilisezchannels.mattermost.groupAllowFrompour restreindre les expéditeurs.
La prise en charge des comptes multi-comptes se trouve sous channels.mattermost.accounts (voir la section multi-comptes ci-dessus). Les variables Env ne s'appliquent qu'au compte par défaut.
Utilisez channel:<id> ou user:<id> (ou @username) lorsque vous spécifiez des cibles de livraison; les identifiants natifs sont traités comme des identifiants de canal.
channels.signal (signal-cli)¶
Les réactions de signal peuvent émettre des événements systÚme (outils de réaction partagée) :
{
channels: {
signal: {
reactionNotifications: "own", // off | propre | all | allowlist
reactionAllowlist: ["+15551234567", "uuid:123e4567-e89b-12d3-a456-426614174000"],
historyLimit: 50, // inclure les derniers N messages de groupe dans le contexte (0 désactivé)
},
},
}
Modes de notification de réaction :
off: aucun evenement de reaction.own: reactions sur les propres messages du bot (defaut).all: toutes les reactions sur tous les messages.allowlist: les réactions dechannels.signal.reactionAllowlistsur tous les messages (liste vide désactive).
channels.imessage (imsg CLI)¶
OpenClaw fait apparaßtre imsg rpc (JSON-RPC sur stdio). Aucun démon ou port requis.
{
salons: {
imessage: {
activé: vrai,
cliPath: "imsg",
dbPath: "~/Library/Messages/chat. b",
distantHĂŽte : "user@gateway-host", // SCP pour les piĂšces jointes distantes lors de l'utilisation du wrapper SSH
dmPolicy: "appairage", // appairage | allowlist | open | disabled
allowFrom: ["+15555550123", "user@example. om", "chat_id:123"],
historyLimit: 50, // inclure les derniers N messages de groupe dans le contexte (0 désactivé)
includeAttaches: false,
mediaMaxMb: 16,
service: "auto",
région: "USA",
},
},
}
La prise en charge des comptes multi-comptes se trouve dans channels.imessage.accounts (voir la section multi-comptes ci-dessus).
Notes :
- Nécessite un accÚs complet au disque dur de la base de données des messages.
- Le premier envoi demandera l'autorisation d'automatiser les messages.
- Préférez les cibles
chat_id:<id>. Utilisezimsg chats --limit 20pour lister les chats. channels.imessage.cliPathpeut pointer vers un script de wrapper (par exemplesshvers un autre Mac qui exécuteimsg rpc); utilisez les clés SSH pour éviter les instructions de mot de passe.- Pour les enveloppeurs SSH distants, définissez
channels.imessage.remoteHostpour récupérer les piÚces jointes via SCP lorsqueincludeAttachmentsest activé.
Exemple de wrapper :
#!/usr/bin/env bash
exec ssh -T gateway-host imsg "$@"
agents.defaults.workspace¶
Définit le répertoire de l'espace de travail global unique utilisé par l'agent pour les opérations de fichiers.
Par defaut : ~/.openclaw/workspace.
{
agents: { defaults: { workspace: "~/.openclaw/workspace" } },
}
Si agents.defaults.sandbox est activé, les sessions non-principales peuvent remplacer cela avec leur
leurs propres espaces de travail par portée sous agents.defaults.sandbox.workspaceRoot.
agents.defaults.repoRoot¶
Racine optionnelle du dépÎt à afficher dans la ligne d'exécution de l'invite systÚme. Si non défini, OpenClaw
tente de détecter un répertoire .git en marchant vers le haut depuis l'espace de travail (et le dossier de travail
actuel). Le chemin doit exister pour ĂȘtre utilisĂ©.
{
agents: { defaults: { repoRoot: "~/Projects/openclaw" } },
}
agents.defaults.skipBootstrap¶
Désactive la création automatique des fichiers de bootstrap de l'espace de travail (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, et BOOTSTRAP.md).
Utilisez ceci pour les dĂ©ploiements prĂ©configurĂ©s oĂč vos fichiers d'espace de travail proviennent d'un dĂ©pĂŽt.
{
agents : { defaults: { skipBootstrap: true } },
}
agents.defaults.bootstrapMaxChars¶
Nombre maximum de caractÚres de chaque fichier de bootstrap de l'espace de travail injecté dans l'invite de systÚme
avant troncation. Par défaut : 20000.
Lorsquâun fichier dĂ©passe cette limite, OpenClaw consigne un avertissement et injecte un dĂ©but/fin tronquĂ© avec un marqueur.
{
agents : { defaults: { bootstrapMaxChars: 20000 } },
}
agents.defaults.userTimezone¶
DĂ©finit le fuseau horaire de lâutilisateur pour le contexte du prompt systĂšme (pas pour les horodatages dans les enveloppes de messages). Si non dĂ©fini, OpenClaw utilise le fuseau horaire de l'hĂŽte Ă l'exĂ©cution.
{
agents: { defaults: { userTimezone: "America/Chicago" } },
}
agents.defaults.timeFormat¶
ContrÎle le format horaire affiché dans la section Date et heure courante de l'invite du systÚme.
Par défaut: auto (préférence de l'OS).
**Chemins absolus**âŻ: utilisĂ©s tels quels
messages¶
ContrÎle les préfixes entrants/sortants et les réactions d'ack optionnelles. Voir Messages pour la file d'attente, les sessions et le contexte de streaming.
{
messages: {
responsePrefix: "đŠ", // ou "auto"
ackReaction: "đ",
ackReactionScope: "group-mentions",
removeAckAfterReply: false,
},
}
responsePrefix est appliqué à toutes les réponses sortantes (résumés d'outils, bloc
streaming, réponses finales) à travers les canaux sauf si déjà présents.
Les remplacements peuvent ĂȘtre configurĂ©s par canal et par compte :
- `channels.
Préfixe de réponse - `channels.
.accounts. Préfixe de réponse
Ordre de rĂ©solution (le plus spĂ©cifique lâemporte)âŻ:
- `channels.
.accounts. Préfixe de réponse - `channels.
Préfixe de réponse messages.responsePrefix
Sémantiques:
undefinedtombe au niveau suivant.""dĂ©sactive explicitement le prĂ©fixe et arrĂȘte la cascade."auto"dĂ©rive[{identity.name}]pour l'agent routĂ©.
Les remplacements s'appliquent à tous les canaux, y compris les extensions, et à chaque type de réponse sortante.
Si messages.responsePrefix est dédéfini, aucun préfixe n'est appliqué par défaut. Les réponses à WhatsApp auto-chat
sont l'exception : elles sont par défaut [{identity.name}] lorsqu'elles sont définies, sinon
[openclaw], donc les conversations du mĂȘme tĂ©lĂ©phone restent lisibles.
Définissez à "auto" pour dériver [{identity.name}] pour l'agent routé (lorsqu'il est défini).
Variables de modÚle¶
La chaßne responsePrefix peut inclure des variables de modÚle qui se résolvent dynamiquement :
| Variable | Description | Exemple |
|---|---|---|
{model} |
Nom du modĂšle court | claude-opus-4-6, gpt-4o |
{modelFull} |
Identifiant complet du modĂšle | anthropique/claude-opus-4-6 |
{provider} |
Nom du fournisseur | anthropique, openai |
{thinkingLevel} |
Niveau de pensée actuel | high, low, off |
{identity.name} |
Nom d'identitĂ© de l'agent | (mĂȘme que le mode "auto") |
Les variables sont insensibles Ă la casse ({MODEL} = {model}). {think} est un alias pour {thinkingLevel}.
Les variables non résolues restent en tant que texte littéral.
{
messages : {
responsePrefix: "[{model} | think:{thinkingLevel}]",
},
}
Exemple de sortie: [claude-opus-4-6 | think:high] Voici ma réponse...
Le préfixe d'entrée WhatsApp est configuré via channels.whatsapp.messagePrefix (obsolÚte:
messages.messagePrefix). La valeur par défaut reste inchangée: "[openclaw]" quand
channels.whatsapp.allowFrom est vide, sinon "" (pas de préfixe). Lorsque vous utilisez
"[openclaw]", OpenClaw utilisera à la place [{identity.name}] lorsque l'agent routé
a défini identity.name.
ackReaction envoie une réaction emoji du meilleur effort pour reconnaßtre les messages entrants
sur les canaux qui supportent les réactions (Slack/Discord/Telegram/Google Chat). La valeur par défaut du identity.emoji de l'agent actif
lorsqu'il est dĂ©fini, sinon "đ". DĂ©finir Ă "" pour dĂ©sactiver.
ackReactionScope contrÎle quand les réactions se déclencheront :
group-mentions(par défaut) : seulement quand un groupe/salle nécessite des mentions et que le bot a été mentionnégroup-all: tous les messages de groupe/salledirect: messages directs uniquementall: tous les messages
removeAckAfterReply supprime la rĂ©action dâaccusĂ© de rĂ©ception du bot aprĂšs lâenvoi dâune rĂ©ponse (Slack/Discord/Telegram/Google Chat uniquement). Par dĂ©faut: false.
messages.tts¶
Activer la synthÚse vocale pour les réponses sortantes. Lorsqu'activé, OpenClaw génÚre de l'audio en utilisant ElevenLabs ou OpenAI et l'attache aux réponses. Telegram utilise des notes vocales Opus ; les autres canaux envoient de l'audio MP3.
{
messages: {
tts: {
auto: "toujours", // off | always | entrant | tagged
mode : "final", // final | all (include tool/block replies)
provider: "elevenlabs",
summaryModel: "openai/gpt-4. -mini",
modĂšles: {
enabled: true,
},
maxTextLength: 4000,
timeoutMs: 30000,
prefsPath: "~/. penclaw/paramĂštres/tts. son",
onze labs: {
apiKey: "elevenlabs_api_key",
baseUrl: "https://api. levenlabs. o",
voiceId : "voice_id",
modelId: "eleven_multilingual_v2",
seed: 42,
applyTextNormalization: "auto",
languageCode : "fr",
paramĂštres vocaux: {
stabilité: 0. ,
similarityBoost: 0. 5,
style: 0. ,
useSpeakerBoost : vrai,
vitesse: 1. ,
},
},
openai: {
apiKey: "openai_api_key",
modĂšle: "gpt-4o-mini-tts",
voix: "alliage",
},
},
},
}
Notes :
messages.tts.autocontrĂŽle autoâTTS (off,always,inbound,tagged)./tts off|toujours|inbound|taggeddĂ©finit le mode auto par session (remplace la config).messages.tts.enabledest hĂ©ritĂ©; le mĂ©decin le migre versmessages.tts.auto.prefsPathstocke les substitutions locales (provider/limit/summarize).maxTextLengthest un capuchon dur pour l'entrĂ©e TTS ; les rĂ©sumĂ©s sont tronquĂ©s pour s'adapter.summaryModelremplaceagents.defaults.model.primarypour auto-summary.- Accepte
provider/modelou un alias deagents.defaults.models. modelOverridesactive les remplacements basés sur le modÚle comme les balises[[tts:...]](par défaut)./tts limitet/tts summarycontrÎlent les paramÚtres de synthÚse par utilisateur.- Les valeurs
apiKeyreviennent ĂELEVENLABS_API_KEY/XI_API_KEYetOPENAI_API_KEY. elevenlabs.baseUrlremplace l'URL de base de l'API ElevenLabs.elevenlabs.voiceSettingssupportestability/similarityBoost/style(0..1),useSpeakerBoost, etspeed(0.5..2.0).
parler¶
Par défaut pour le mode Talk (macOS/iOS/Android). Les identifiants vocaux sont remplacés par « ELEVENLABS_VOICE_ID» ou « SAG_VOICE_ID» lorsque le paramÚtre n'est pas défini.
apiKey tombe à ELEVENLABS_API_KEY (ou le profil du shell de la passerelle) quand il n'est pas défini.
voiceAliases permet aux directives Talk d'utiliser des noms conviviaux (par exemple "voice":"Clawd").
{
talk: {
voiceId: "elevenlabs_voice_id",
voiceAliases: {
Griffe : "EXAVITQu4vr4xnSDxMaL",
Roger : "CwhRBWXzGAHq8TQ4Fs17",
},
modelId: "eleven_v3",
outputFormat: "mp3_44100_128",
apiKey: "elevenlabs_api_key",
interruptOnSpeech: true,
},
}
agents.defaults¶
ContrÎle le runtime de l'agent intégré (modÚle/pense/verbose/timeouts).
agents.defaults.models définit le catalogue de modÚles configuré (et agit comme la liste d'autorisations pour /model).
agents.defaults.model.primary définit le modÚle par défaut; agents.defaults.model.fallbacks sont des utilisateurs globaux.
agents.defaults.imageModel est optionnel et n'est utilisé que si le modÚle principal manque d'entrée d'image.
Chaque entrée agents.defaults.models peut inclure :
alias(raccourci du modĂšle optionnel, par exemple/opus).params(des paramĂštres d'API optionnels spĂ©cifiques au fournisseur sont passĂ©s Ă la requĂȘte du modĂšle).
params est également appliqué aux exécutions de streaming (agent embarqué + compaction). Clés supportées aujourd'hui: temperature, maxTokens. Celles-ci fusionnent avec les options de temps d'appel; les valeurs fournies par l'appelant gagnent. temperature est un bouton avancé, laisser vide à moins que vous ne connaissiez les valeurs par défaut du modÚle et que vous ayez besoin d'un changement.
Exemple :
{
agents: {
par défaut: {
modĂšles: {
"anthropic/claude-sonnet-4-5-20250929": {
paramĂštres : { temperature: 0.6 },
},
"openai/gpt-5. ": {
paramĂštres : { maxTokens: 8192 },
},
},
},
},
}
Les modÚles Z.AI GLM-4.x activent automatiquement le mode de pensée à moins que vous :
- définir
--thinking off, ou - dĂ©finissez vous-mĂȘme
agents.defaults.models["zai/<model>"].params.thinking.
OpenClaw fournit également quelques raccourcis d'alias intégrés. Les valeurs par défaut ne s'appliquent que lorsque le modÚle
est déjà présent dans agents.defaults.models:
opus->anthropic/claude-opus-4-6sonnet->anthropic/claude-sonnet-4-5gpt->openai/gpt-5.2gpt-mini->openai/gpt-5-minigemini->google/gemini-3-pro-previewgemini-flash->google/gemini-3-flash-preview
Si vous configurez le mĂȘme nom d'alias (insensible Ă la casse) vous-mĂȘme, votre valeur gagnera (par dĂ©faut, elle ne sera jamais remplacĂ©e).
Exemple : Opus 4.6 primaire avec MiniMax M2.1 (hébergé MiniMax) :
{
agents: {
par défaut: {
modĂšles: {
"anthropic/claude-opus-4-6": { alias: "opus" },
"minimax/MiniMax-M2. ": { alias : "minimax" },
}, ModĂšle
: {
primaire : "anthropique/claude-opus-4-6",
replis : ["minimax/MiniMax-M2. "],
},
},
},
}
MiniMax auth: définir MINIMAX_API_KEY (env) ou configurer models.providers.minimax.
agents.defaults.cliBackends (CLI replié)¶
Backends CLI optionnels pour les exécutions de secours en mode texte (pas d'appels d'outils). Celles-ci sont utiles comme un chemin de sauvegarde
lorsque les fournisseurs d'API échouent. Le passage de l'image est pris en charge lorsque vous configurez
un imageArg qui accepte les chemins de fichier.
Notes :
- Les backends CLI sont text-first ; les outils sont toujours désactivés.
- Les sessions sont prises en charge lorsque
sessionArgest défini; les identifiants de session sont persistés par backend. - Pour
claude-cli, les valeurs par défaut sont cùblées. Remplacer le chemin de la commande si PATH est minimum (launchd/systemd).
Exemple :
{
agents: {
defaults: {
cliBackends: {
"claude-cli": {
command: "/opt/homebrew/bin/claude",
},
"mon-cli": {
commande: "mon-cli",
args: ["--json"],
sortie : "json",
modĂšle Arg: "--model",
sessionArg: "--session",
sessionMode : "existant",
systemPromptArg : "--system",
systemPromptWhen: "first",
imageArg: "--image",
imageMode : "répéter",
},
},
},
},
}
{
agents: {
par défaut: {
modĂšles: {
"anthropic/claude-opus-4-6": { alias: "Opus" },
"anthropic/claude-sonnet-4-1": { alias: "Sonnet" },
"openrouter/deepseek/deepseek-r1:free": {},
"zai/glm-4. ": {
alias : "GLM",
paramĂštres : {
pense: {
type: "enabled",
clear_thinking: false,
},
},
},
},
modĂšle : {
primaire : "anthropique/claude-opus-4-6",
fallbacks: [
"openrouter/deepseek/deepseek-r1:free",
"openrouter/meta-llama/llama-3. -70b-instruct:gratuit",
],
},
imageModel: {
primary: "openrouter/qwen/qwen-2. -vl-72b-instruct:free",
fallbacks: ["openrouter/google/gemini-2. -vision flash: libre"],
},
thinkingDefault: "low",
verboseDefault: "off",
elevatedDefault: "on",
secondes de timeout: 600,
mediaMaxMb: 5,
heartbeat: {
every: "30m",
cible : "dernier",
},
maxConcurrent : 3,
sous-agents : {
model: "minimax/MiniMax-M2. ",
maxConcurrent: 1,
archiveAfterMinutes: 60,
},
exec: {
backgroundMs: 10000,
timeoutSec: 1800,
nettoyageM: 1800000,
},
contextTokens : 200000,
},
},
agents.defaults.contextPruning (tool-result pruning)¶
agents.defaults.contextPruning supprime les rĂ©sultats de l'ancien outil du contexte en mĂ©moire juste avant qu'une requĂȘte ne soit envoyĂ©e au LLM.
Il ne modifie pas l'historique de session sur le disque (*.jsonl reste terminé).
Ceci est destiné à réduire l'utilisation de jetons pour les agents de chat qui accumulent des sorties de gros outils au fil du temps.
Niveau supérieur:
- Ne touchez jamais les messages utilisateur/assistant.
- ProtĂšge les derniers messages d'assistant
keepLastAssistants(aucun résultat d'outil aprÚs que ce point soit supprimé). - ProtÚge le préfixe de bootstrap (rien avant que le premier message utilisateur soit effacé).
- Modes:
adaptive: soft-trims oversized tool results (keep head/tail) when the estimated context ratio crossessoftTrimRatio. Puis hard-efface les résultats les plus anciens outils éligibles lorsque le ratio contextuel estimé traversehardClearRatioet il y a assez de prunable tool-result bulk (minPrunableToolChars).agressive: remplace toujours les résultats des outils éligibles avant la coupure par lehardClear.placeholder(pas de vérifications de ratifs).
Soft vs hard pruning (quels changements dans le contexte envoyés au LLM):
- Soft-trim: seulement pour les résultats de l'outil surdimensionnés. Conserve le début + la fin et insÚre
...au milieu. - Before:
toolResult("âŠvery long outputâŠ") - AprĂšs:
toolResult("HEADâŠ\n...\nâŠTAIL\n\n[RĂ©sultat de l'outil : âŠ]") - Hard-clear : remplace le rĂ©sultat de l'outil entier par le placeholder.
- Before:
toolResult("âŠvery long outputâŠ") - AprĂšs:
toolResult("[Ancien outil contenu de résultat effacé]")
Notes / Limites actuelles:
- Les résultats de l'outil contenant des blocs d'image sont ignorés (jamais tronqués/effacés) pour le moment.
- Le âratio contextuelâ estimĂ© est basĂ© sur des caractĂšres (approximatifs), pas des jetons exacts.
- Si la session ne contient pas encore au moins de messages d'assistant
keepLastAssistants, la taille est ignorée. - En mode
agressive,hardClear.enabledest ignoré (les résultats des outils éligibles sont toujours remplacés parhardClear.placeholder).
Par défaut (adaptatif) :
{
Agents: { defaults: { contextPruning: { mode: "adaptive" } },
}
Pour désactiver:
{
agents: { defaults: { contextPruning: { mode: "off" } },
}
Par défaut (lorsque mode est "adaptive" ou "agressive"):
keepLastAssistantsâŻ:3softTrimRatio:0.3(adaptatif seulement)hardClearRatio:0.5(adaptatif seulement)minPrunableToolChars:50000(adaptatif seulement)softTrim:{ maxChars: 4000, headChars: 1500, tailChars: 1500 }(adaptatif seulement)hardClearâŻ:{ enabled: true, placeholder: "[Old tool result content cleared]" }
Exemple (agressif, minimum) :
{
agents: { defaults: { contextPruning: { mode: "agressive" } },
}
Exemple (ajusté adaptatif) :
{
agents : {
par défaut : {
contextPruning: {
mode : "adaptatif",
keepLastAssistants: 3,
softTrimRatio: 0. ,
hardClearRatio : 0. ,
minPrunableToolChars: 50000,
softTrim: { maxChars: 4000, headChars: 1500, tailChars: 1500 },
hardClear: { activé: true, placeholder: "[Ancien outil contenu de résultat effacé]" },
// Facultatif: restreindre la taille à des outils spécifiques (refuser les victoires; supporte les caractÚres génériques "*")
outils: { deny: ["browser", "canvas"] },
},
},
},
}
Voir /concepts/session-pruning pour plus de détails sur le comportement.
agents.defaults.compaction (réserve headroom + mémoire flush)¶
agents.defaults.compaction.mode sélectionne la stratégie de résumé de la compaction. Par défaut, default; définit safeguard pour activer la synthÚse des chunked pour les trÚs longues histoires. Voir /concepts/compaction.
agents.defaults.compaction.reserveTokensFloor impose une valeur minimale reserveTokens
pour la compaction Pi (par défaut: 20000). Définissez-le à 0 pour désactiver le sol.
agents.defaults.compaction.memoryFlush exécute un tour agentique silencieux avant
auto-compaction, instruction au modÚle de stocker des mémoires durables sur le disque (par exemple
memory/YYYY-MM-DD.md). Il se dĂ©clenche lorsque lâestimation des jetons de session dĂ©passe un seuil souple infĂ©rieur Ă la limite de compaction.
Défaut hérité :
memoryFlush.enabled:truememoryFlush.softThresholdTokens:4000memoryFlush.prompt/memoryFlush.systemPrompt: valeurs par défaut intégrées avecNO_REPLY- Note: la mémoire vive est ignorée lorsque l'espace de travail de la session est en lecture seule
(
agents.defaults.sandbox.workspaceAccess: "ro"ou"none").
Exemple (ajusté) :
{
agents: {
par défaut : {
compaction: {
mode : "sauvegarde",
réservoirTokensFloor: 24000,
memoryFlush: {
activé: true,
softThresholdTokens : 6000,
systemPrompt: "Session presque compact". Stockez des souvenirs durables.",
: "Ăcrivez des notes durables Ă la mĂ©moire/AAAA-MM-JJ. ; rĂ©pondez avec NO_REPLY si rien Ă stocker. ,
},
},
},
},
}
Bloquer le streaming:
-
agents.defaults.blockStreamingDefault:"on"/"off"(désactivé par défaut). -
Substitutions de canal :
*.blockStreaming(et variantes par compte) pour forcer le blocage du streaming on/off. Les canaux non-Telegram nécessitent un*.blockStreaming: trueexplicite pour activer les réponses de bloc. -
agents.defaults.blockStreamingBreak:"text_end"ou"message_end"(par défaut: text_end). -
agents.defaults.blockStreamingChunk: un chunking souple pour les blocs streamés. Par défaut, 800-1200 caractÚres, préfÚre les sauts de paragraphe (`\n\nA), puis les nouvelles lignes, puis les phrases. Exemple :
json5
{
agents : { defaults: { blockStreamingChunk: { minChars: 800, maxChars: 1200 } } },
}
-
agents.defaults.blockStreamingCoalesce: fusionne les blocs avant l'envoi. Par dĂ©faut,{ idleMs: 1000 }et hĂ©riteminCharsdeblockStreamingChunkavec la limite de texte demaxCharsSignal/Slack/Discord/Google Chat par dĂ©faut ĂminChars: 1500sauf remplacement. Substitutions de canaux:channels.whatsapp.blockStreamingCoalesce,channels.telegram.blockStreamingCoalesce,channels.discord.blockStreamingCoalesce,channels.slack.blockStreamingCoalesce,channels.mattermost.blockStreamingCoalesce,channels.signal.blockStreamingCoalesce,channels.imessage.blockStreamingCoalesce,channels.msteams.blockStreamingCoalesce,channels.googlechat.blockStreamingCoalesce(et variantes de compte per). -
agents.defaults.humanDelay: pause alĂ©atoire entre rĂ©ponses de bloc aprĂšs la premiĂšre. Modes:off(par dĂ©faut),natural(800â2500ms),custom(utilisezminMs/maxMs). Surcharge par agent :agents.list[].humanDelay. Exemple :
json5
{
agents: { defaults: { humanDelay: { mode: "natural" } },
}
Voir /concepts/streaming pour plus de détails sur le comportement + le chunking.
Indicateurs d'écriture :
agents.defaults.typingMode:"never" | "instant" | "thinking" | "message". Par défaut,instantpour les chats directs/mentions etmessagepour les chats de groupe non mentionnés.session.typingMode: surcharge par session pour le mode.agents.defaults.typingIntervalSeconds: à quelle fréquence le signal de saisie est actualisé (par défaut: 6s).session.typingIntervalSeconds: surcharge par session pour l'intervalle de rafraßchissement. Voir /concepts/typing-indicators pour plus de détails sur le comportement.
agents.defaults.model.primary doit ĂȘtre dĂ©fini comme provider/model (par exemple anthropic/claude-opus-4-6).
Les alias proviennent de agents.defaults.models.*.alias (par exemple Opus).
Si vous omettez le fournisseur, OpenClaw assume actuellement anthropique comme un repli temporaire de la dépréciation
.
Les modĂšles Z.AI sont disponibles en tant que zai/<model> (par exemple zai/glm-4.7) et requiĂšrent
ZAI_API_KEY (ou Z_AI_API_KEY) dans l'environnement.
agents.defaults.heartbeat configure les exécutions périodiques de pulsations cardiaques :
every: duration string (ms,s,m,h); default unit minutes. Par dĂ©faut:30m. DĂ©finissez0mpour dĂ©sactiver.model: modĂšle optionnel de remplacement pour les exĂ©cutions de pulsations (provider/model).includeReasoning: lorsquetrue, les pulsations du cĆur fourniront Ă©galement le message sĂ©parĂ©Raisoning:quand il est disponible (mĂȘme forme que/reasoning on). Par dĂ©faut:false.session: clĂ© de session optionnelle pour contrĂŽler la session dans laquelle le rythme cardiaque s'exĂ©cute. Par dĂ©faut:main.to: surcharge optionnelle du destinataire (id spĂ©cifique au canal, par exemple E.164 pour WhatsApp, ID de chat pour Telegram).target: canal de livraison optionnel (last,whatsapp,telegram,discord,slack,msteams,signal,imessage,none). Par dĂ©faut:last.prompt: surcharge optionnelle pour le corps du cĆur-beat (par dĂ©faut:Lire HEARTBEAT.md s'il existe (contexte d'espace de travail). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.). Les remplacements sont envoyĂ©s verbatim; inclure une ligneLire HEARTBEAT.mdsi vous voulez toujours que le fichier soit lu.ackMaxChars: max caractĂšres autorisĂ©s aprĂšsHEARTBEAT_OKavant la livraison (par dĂ©faut : 300).
Heartbeats par agent:
- Définissez
agents.list[].heartbeatpour activer ou outrepasser les paramÚtres de pulsations cardiaques pour un agent spécifique. - Si une entrée d'agent définit
heartbeat, only those agents run heartbeats; defaults devient la ligne de base partagée pour ces agents.
Les heartbeats exĂ©cutent des tours dâagent complets. Les intervalles plus courts brĂ»lent plus de jetons ; soyez attentif Ă
de tous, gardez petit HEARTBEAT.md et/ou choisissez un modĂšle moins cher.
tools.exec configure le fond par défaut exec :
backgroundMs: temps avant l'arriÚre-plan automatique (ms, valeur par défaut 10000)timeoutSec: auto-kill aprÚs cette exécution (secondes, par défaut 1800)cleanupMs: combien de temps pour conserver les sessions terminées en mémoire (ms, 1800000)notifyOnExit: mettre en file d'attente un événement systÚme + demander des pulsations cardiaques en arriÚre-plan exec (valeur par défaut vraie)applyPatch.enabled: activeapply_patchexpérimental (Codex OpenAI/OpenAI seulement; default false)applyPatch.allowModels: optionel allowlist of model ids (e.g.gpt-5.2oropenai/gpt-5.2) Note:applyPatchis only undertools.exec.
tools.web configure la recherche web + les outils de recherche :
tools.web.search.enabled(par dĂ©faut : true lorsque la clĂ© est prĂ©sente)tools.web.search.apiKey(recommandĂ©: dĂ©finir viaopenclaw configure --section web, ou utiliserBRAVE_API_KEYenv var)tools.web.search.maxResults(1â10, par dĂ©faut 5)tools.web.search.timeoutSeconds(par dĂ©faut 30)tools.web.search.cacheTtlMinutes(par dĂ©faut 15)tools.web.fetch.enabled(par dĂ©faut true)tools.web.fetch.maxChars(par dĂ©faut 50000)tools.web.fetch.maxCharsCap(par dĂ©faut 50000; clampe maxChars des appels config/tool)tools.web.fetch.timeoutSeconds(par dĂ©faut 30)tools.web.fetch.cacheTtlMinutes(par dĂ©faut 15)tools.web.fetch.userAgent(surcharge optionnelle)tools.web.fetch.readability(par dĂ©faut true; disable to use basic HTML cleanup only)tools.web.fetch.firecrawl.enabled(par dĂ©faut vrai quand une clĂ© API est dĂ©finie)tools.web.fetch.firecrawl.apiKey(facultatif; par dĂ©fautFIRECRAWL_API_KEY)tools.web.fetch.firecrawl.baseUrl(par dĂ©faut https://api.firecrawl.dev)tools.web.fetch.firecrawl.onlyMainContent(par dĂ©faut true)tools.web.fetch.firecrawl.maxAgeMs(optionnel)tools.web.fetch.firecrawl.timeoutSeconds(optionnel)
tools.media configure la compréhension des médias entrants (image/audio/vidéo) :
tools.media.models: liste de modÚles partagés (capability-tagged; utilisée aprÚs les listes de capture).tools.media.concurrency: capacité simultanée max exécutée (par défaut 2).tools.media.image/tools.media.audio/tools.media.video:enabled: opt-out switch (par défaut true lorsque les modÚles sont configurés).prompt: surcharge optionnelle de l'invite (image/vidéo ajoute automatiquement un indicemaxChars).maxChars: nombre maximum de caractÚres de sortie (par défaut 500 pour l'image/la vidéo; annuler pour l'audio).maxBytes: taille maximale du média à envoyer (par défaut: image 10Mo, audio 20Mo, vidéo 50Mo).timeoutSeconds: demande de timeout (par défaut : image 60s, audio 60s, vidéo 120).language: indice audio optionnel.attachments: politique d'attachement (mode,maxAttachments,prefer).scope: portail optionnel (premier match gagne) avecmatch.channel,match.chatType, oumatch.keyPrefix.models: liste ordonnée des entrées du modÚle; les échecs ou les dépassements de média tombent à l'entrée suivante.- Chaque entrée
models[]: - Entrée du fournisseur (
type: "provider"ou omisĂ©) :provider: ID de fournisseur API (openai,anthropic,google/gemini,groq, etc).model: remplacement de l'id du modĂšle (requis pour l'image; valeur par dĂ©faut Ăgpt-4o-mini-transcribe/whisper-large-v3-turbopour les fournisseurs audio, etgemini-3-flash-previewpour la vidĂ©o).profile/preferredProfile: sĂ©lection du profil d'authentification.
- Entrée CLI (
type: "cli"):commande: exécutable à exécuter.args: gabarit args (supporte{{MediaPath}},{{Prompt}},{{MaxChars}}, etc).
capabilities: liste optionnelle (image,audio,video) pour ouvrir une entrĂ©e partagĂ©e. DĂ©faut quand omis :openai/anthropic/minimaxâ image,googleâ image+audio+video,groqâ audio.prompt,maxChars,maxBytes,timeoutSeconds,languagepeuvent ĂȘtre remplacĂ©s par entrĂ©e.
Si aucun modÚle n'est configuré (ou activé: false), la compréhension est ignorée; le modÚle reçoit toujours les piÚces jointes originales.
L'authentification du fournisseur suit l'ordre d'authentification standard des modĂšles (profils d'authentification, env vars comme OPENAI_API_KEY/GROQ_API_KEY/GEMINI_API_KEY, ou models.providers.*.apiKey).
Exemple :
{
tools: {
media: {
audio: {
enabled: true,
maxBytes: 20971520,
scope: {
default: "deny",
rules: [{ action: "allow", match: { chatType: "direct" } }],
},
models: [
{ provider: "openai", model: "gpt-4o-mini-transcribe" },
{ type: "cli", command: "whisper", args: ["--model", "base", "{{MediaPath}}"] },
],
},
video: {
enabled: true,
maxBytes: 52428800,
models: [{ provider: "google", model: "gemini-3-flash-preview" }],
},
},
},
}
agents.defaults.subagents configure les valeurs par défaut des sous-agents :
model: modĂšle par dĂ©faut pour les sous-agents apparus (chaĂźne de caractĂšres ou{ primary, fallbacks }). En cas d'omission, les sous-agents hĂ©ritent du modĂšle de l'appelant Ă moins d'ĂȘtre remplacĂ©s par agent ou par appel.maxConcurrent: nombre maximum de sous-agents simultanĂ©s exĂ©cutĂ©s (par dĂ©faut 1)archiveAfterMinutes: archiver automatiquement les sessions de sous-agents aprĂšs N minutes (par dĂ©faut 60; dĂ©finir0pour dĂ©sactiver)- RĂšgle de l'outil par sous-agent :
tools.subagents.tools.allow/tools.subagents.tools.deny(deny wins)
tools.profile définit un outil de base allowlist avant tools.allow/tools.deny:
minimal :session_statusuniquementcoding :group:fs,group:runtime,group:sessions,group:memory,imagemessaging :group:messaging,sessions_list,sessions_history,sessions_send,session_statusfull : aucune restriction (identique à non défini)
Surcharge par agent : agents.list[].tools.profile.
Exemple (messagerie uniquement par défaut, autoriser aussi les outils Slack + Discord) :
{
tools: {
profile: "messaging",
allow: ["slack", "discord"],
},
}
Exemple (profil de codage, mais interdire exec/process partout)Â :
{
tools: {
profile: "coding",
deny: ["group:runtime"],
},
}
tools.byProvider vous permet de restreindre les outils pour des fournisseurs spécifiques (ou un seul provider/model).
Surcharge par agent : agents.list[].tools.byProvider.
Commande : profil de base â profil du fournisseur â autoriser/refuser les politiques.
Les clés du fournisseur acceptent soit provider (par exemple google-antigravity) soit provider/model
(par exemple openai/gpt-5.2).
Exemple (conserver le profil de codage global, mais outils minimaux pour Google Antigravity)Â :
{
tools: {
profile: "coding",
byProvider: {
"google-antigravity": { profile: "minimal" },
},
},
}
Exemple (liste d'autorisations spécifique au fournisseur/modÚle) :
{
tools: {
allow: ["group:fs", "group:runtime", "sessions_list"],
byProvider: {
"openai/gpt-5.2": { allow: ["group:fs", "sessions_list"] },
},
},
}
tools.allow / tools.deny configure un outil global autoriser/deny policy (deny wins).
La correspondance est insensible à la casse et supporte les caractÚres génériques * ("*" signifie tous les outils).
Ceci est appliquĂ© mĂȘme lorsque le sandbox Docker est dĂ©sactivĂ©.
Exemple (désactiver le navigateur/canvas partout):
{
tools: { deny: ["browser", "canvas"] },
}
Les groupes dâoutils (raccourcis) fonctionnent dans les politiques dâoutils global et par agent :
group:runtimeâŻ:exec,bash,processgroup:fsâŻ:read,write,edit,apply_patchgroup:sessionsâŻ:sessions_list,sessions_history,sessions_send,sessions_spawn,session_statusgroup:memoryâŻ:memory_search,memory_getgroup:web :web_search,web_fetchgroup:uiâŻ:browser,canvasgroup:automationâŻ:cron,gatewaygroup:messagingâŻ:messagegroup:nodesâŻ:nodesgroup:openclawâŻ: tous les outils OpenClaw intĂ©grĂ©s (exclut les plugins de fournisseurs)
tools.elevated contrÎle l'accÚs exec élevé (host) :
enabled: autorise le mode Ă©levĂ© (par dĂ©faut true)allowFrom: per-channel allowlists (vide = dĂ©sactivĂ©)whatsapp: nombre E.164telegram: ID de chat ou nom d'utilisateurdiscord: les identifiants des utilisateurs ou les noms d'utilisateur (tombe Ăchannels.discord.dm.allowFromsi omis)signal: nombre E.164imessage: gestion/ID de chatwebchat: ID de session ou nom d'utilisateur
Exemple :
{
outils: {
élévé: {
activé: vrai,
allowDe: {
whatsapp: ["+155550123"],
discord: ["steipete", "1234567890123"],
},
},
},
}
Surcharge par agent (restriction supplémentaire):
{
agents : {
liste: [
{
id: "famille", Outils
: {
élevés : { enabled: false },
},
},
],
},
}
Notes :
tools.elevatedest la ligne de base globale.agents.list[].tools.elevatedne peut que restreindre davantage (les deux doivent autoriser)./elevated on|off|ask|fullstocke l'état par clé de session; les directives en ligne s'appliquent à un seul message.execélevé fonctionne sur l'hÎte et contourne la sandboxing.- La politique des outils s'applique toujours; si
execest refusé, il est impossible d'utiliser une politique élevée.
agents.defaults.maxConcurrent définit le nombre maximum d'exécutions d'agents embarqués qui peuvent
exécuter en parallÚle entre les sessions. Chaque session est toujours sérialisée (une fois exécutée
par clé de session à la fois). Defaut : 1.
agents.defaults.sandbox¶
Optionnel sandboxing Docker pour l'agent embarqué. Destiné aux sessions non principales, elles ne peuvent donc pas accéder à votre systÚme hÎte.
Détails: Sandboxing
Par défaut (si activé) :
- scope:
"agent"(un conteneur + espace de travail par agent) - Image basée sur Debian bookworm-slim
- agent workspace access:
workspaceAccess: "none"(par dĂ©faut) "none": utilise un espace de travail sandbox par portĂ©e sous~/.openclaw/sandboxes"ro": garde l'espace de travail sandbox Ă/workspace, et monte l'espace de travail de l'agent en lecture seule Ă/agent(dĂ©sactivewrite/edit/apply_patch)"rw": monte l'espace de travail de l'agent en lecture/Ă©criture dans/workspace- auto-prune : inactif > 24 h OU Ăąge > 7 j
- tool policy: allow only
exec,process,read,write,edit,apply_patch,sessions_list,sessions_history,sessions_send,sessions_spawn,session_status(deny wins) - configurer via
tools.sandbox.tools, remplacer par agent viaagents.list[].tools.sandbox.tools - les groupes d'outils supportés dans la politique sandbox :
group:runtime,group:fs,group:sessions,group:memory(voir Sandbox vs Tool Policy vs Elevated) - navigateur en boĂźte Ă sable optionnel (Chromium + CDP, observateur noVNC)
- boutons de durcissement :
network,user,pidsLimit,memory,cpus,ulimits,seccompProfile,apparmorProfile
Attention: scope: "shared" signifie un conteneur partagĂ© et un espace de travail partagĂ©. Aucune isolation interâsession. Utilisez scope: "session" pour l'isolement par session.
Legacy: perSession est toujours supportĂ© (true â scope: "session",
false â scope: "shared").
setupCommand s'exécute une fois aprÚs que le conteneur soit créé (à l'intérieur du conteneur via sh -lc).
Pour les installations de paquets, assurez-vous que le réseau est égal, un systÚme de gestion des droits en écriture et un utilisateur root.
{
agents: {
defaults: {
sandbox: {
mode: "non-main", // off | non-main | all
scope: "agent", // session | agent | shared (agent is default)
workspaceAccess: "none", // none | ro | rw
workspaceRoot: "~/.openclaw/sandboxes",
docker: {
image: "openclaw-sandbox:bookworm-slim",
containerPrefix: "openclaw-sbx-",
workdir: "/workspace",
readOnlyRoot: true,
tmpfs: ["/tmp", "/var/tmp", "/run"],
network: "none",
user: "1000:1000",
capDrop: ["ALL"],
env: { LANG: "C.UTF-8" },
setupCommand: "apt-get update && apt-get install -y git curl jq",
// Per-agent override (multi-agent): agents.list[].sandbox.docker.*
pidsLimit: 256,
memory: "1g",
memorySwap: "2g",
cpus: 1,
ulimits: {
nofile: { soft: 1024, hard: 2048 },
nproc: 256,
},
seccompProfile: "/path/to/seccomp.json",
apparmorProfile: "openclaw-sandbox",
dns: ["1.1.1.1", "8.8.8.8"],
extraHosts: ["internal.service:10.0.0.5"],
binds: ["/var/run/docker.sock:/var/run/docker.sock", "/home/user/source:/source:rw"],
},
browser: {
enabled: false,
image: "openclaw-sandbox-browser:bookworm-slim",
containerPrefix: "openclaw-sbx-browser-",
cdpPort: 9222,
vncPort: 5900,
noVncPort: 6080,
headless: false,
enableNoVnc: true,
allowHostControl: false,
allowedControlUrls: ["http://10.0.0.42:18791"],
allowedControlHosts: ["browser.lab.local", "10.0.0.42"],
allowedControlPorts: [18791],
autoStart: true,
autoStartTimeoutMs: 12000,
},
prune: {
idleHours: 24, // 0 disables idle pruning
maxAgeDays: 7, // 0 disables max-age pruning
},
},
},
},
tools: {
sandbox: {
tools: {
allow: [
"exec",
"process",
"read",
"write",
"edit",
"apply_patch",
"sessions_list",
"sessions_history",
"sessions_send",
"sessions_spawn",
"session_status",
],
deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"],
},
},
},
}
Construire l'image du sandbox par défaut une fois avec:
scripts/sandbox-setup.sh
Note: Les conteneurs sandbox sont par défaut network: "none"; définissez agents.defaults.sandbox.docker.network
à "bridge" (ou votre réseau personnalisé) si l'agent a besoin d'un accÚs sortant.
Note: les piÚces jointes entrantes sont mises en scÚne dans l'espace de travail actif à media/inbound/*. Avec workspaceAccess: "rw", cela signifie que les fichiers sont écrits dans l'espace de travail de l'agent.
Note : docker.binds monte des répertoires d'hÎtes supplémentaires ; les liaisons globales et par agent sont fusionnées.
Construire l'image optionnelle du navigateur avec:
scripts/sandbox-browser-setup.sh
Lorsque agents.defaults.sandbox.browser.enabled=true, l'outil du navigateur utilise une instance de sandboxed
Chromium (CDP). Si noVNC est activé (par défaut quand headless=false),
l'URL noVNC est injectée dans l'invite systÚme pour que l'agent puisse la référentier.
Cela ne nécessite pas browser.enabled dans la configuration principale; l'URL de contrÎle de bac à sable
est injectée par session.
agents.defaults.sandbox.browser.allowHostControl (par dĂ©faut: false) permet Ă
sandboxed sessions de cibler explicitement le host browser control server
via l'outil navigateur (target: "host"). Laissez cette option désactivée si vous voulez une isolation stricte du bac à sable
stricte.
Listes d'autorisations pour le contrĂŽle Ă distance :
allowedControlUrls: URL de contrÎle exacte permise pourtarget: "custom".allowedControlHosts: noms d'hÎtes autorisés (nom d'hÎte seulement, aucun port).allowedControlPorts: ports autorisés (par défaut: http=80, https=443). Par défaut : toutes les listes d'autorisations sont non définies (aucune restriction).allowHostControlest par défaut à false.
models (fournisseurs personnalisés + URL de base)¶
OpenClaw utilise le modÚle pi-coding-agent. Vous pouvez ajouter des fournisseurs personnalisés
(LiteLLM, serveurs compatibles avec OpenAI, proxy Anthropique, etc.) en écrivant
~/.openclaw/agents/<agentId>/agent/models.json ou en dĂ©finissant le mĂȘme schĂ©ma dans votre configuration
OpenClaw sous models.providers.
Aperçu du fournisseur par fournisseur + exemples : /concepts/model-providers.
Lorsque models.providers est présent, OpenClaw écrit / fusionne un models.json en
~/.openclaw/agents/<agentId>/agent/ au démarrage :
- comportement par défaut : fusion (conserve les fournisseurs existants, remplace le nom)
- définir
models.mode: "replace"pour écraser le contenu du fichier
Sélectionnez le modÚle via agents.defaults.model.primary (provider/model).
{
agents: {
defaults: {
model: { primary: "custom-proxy/llama-3. -8b" },
modĂšles: {
"custom-proxy/llama-3. -8b : {},
},
},
}, ModĂšles
: mode {
: "fusion",
Fournisseurs : {
"custom-proxy": {
baseUrl: "http://localhost:4000/v1",
apiKey : "LITELLM_KEY",
api : "openai-completions",
modĂšles: [
{
id: "llama-3. -8b",
nom: "Llama 3. 8B",
raisonnement : faux, Entrée
: ["texte"],
coût : { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
fenĂȘtre contextuelle: 128000,
maxTokens : 32000,
},
],
},
},
},
}
OpenCode Zen (proxy multi-modÚles)¶
OpenCode Zen est une passerelle multi-modĂšles avec des points de terminaison par modĂšle. OpenClaw utilise
le fournisseur intégré opencode de pi-ai; définissez OPENCODE_API_KEY (ou
OPENCODE_ZEN_API_KEY) de https://opencode.ai/auth.
Notes :
- Les modĂšles utilisent
opencode/<modelId>(exemple:opencode/claude-opus-4-6). - Si vous activez une liste d'autorisations via
agents.defaults.models, ajoutez chaque modÚle que vous prévoyez utiliser. - Raccourci :
openclaw Ă la carte --auth-choice opencode-zen.
{
agents: {
par défaut: {
model: { primary: "opencode/claude-opus-4-6" },
modĂšles: { "opencode/claude-opus-4-6": { alias: "Opus" } },
},
},
}
Z.AI (GLM-4.7) â support des alias du fournisseur¶
Les modÚles Z.AI sont disponibles via le fournisseur intégré zai. Définissez ZAI_API_KEY
dans votre environnement et référencez le modÚle par fournisseur/modÚle.
Raccourci : openclaw Ă la carte --auth-choice zai-api-key.
{
agents: {
par défaut: {
model: { primary: "zai/glm-4.7" },
models: { "zai/glm-4.7": {} },
},
},
}
Notes :
z.ai/*etz-ai/*sont des alias acceptés et se normalisent enzai/*.- Si
ZAI_API_KEYest manquant, les requĂȘtes verszai/*Ă©choueront avec une erreur d'authentification au moment de l'exĂ©cution. - Erreur d'exemple :
Aucune clé API trouvée pour le fournisseur "zai". - Le point de terminaison général de l'API de Z.AI est
https://api.z.ai/api/paas/v4. Les requĂȘtes de codage GLM utilisent le point de terminaison dĂ©diĂ©https://api.z.ai/api/coding/paas/v4. Le fournisseur intĂ©grĂ©zaiutilise le point de terminaison de Codage. Si vous avez besoin de l'extrĂ©mitĂ© gĂ©nĂ©rale , dĂ©finissez un fournisseur personnalisĂ© dansmodels.providersavec la substitution de l'URL de base (voir la section des fournisseurs personnalisĂ©s ci-dessus). - Utilisez un faux placeholder dans les docs/configs ; ne commettez jamais de vraies clĂ©s d'API.
Moonshot AI (Kimi)¶
Utiliser le point de terminaison compatible OpenAI de Moonshot:
{
env: { MOONSHOT_API_KEY: "sk-... },
agents: {
defaults: {
model: { primary: "moonshot/kimi-k2. " },
modĂšles: { "lune/kimi-k2. ": { alias: "Kimi K2. " } },
},
},
modĂšles: {
mode : "fusion",
Fournisseurs : {
lune: {
baseUrl: "https://api. oonshot. i/v1",
apiKey: "${MOONSHOT_API_KEY}",
api: "openai-completions",
modĂšles: [
{
id: "kimi-k2. ",
nom: "Kimi K2. ",
raisonnement : faux, Entrée
: ["texte"],
coût : { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextFenĂȘtre : 256000,
maxTokens : 8192,
},
],
},
},
},
}
Notes :
- Définissez
MOONSHOT_API_KEYdans l'environnement ou utilisezopenclaw Ă bord --auth-choice moonshot-api-key. - ModĂšle ref:
moonshot/kimi-k2.5. - Pour le point de terminaison de la Chine:
- Exécutez
openclaw à la carte --auth-choice moonshot-api-key-cn(l'assistant va définirhttps://api.moonshot.cn/v1), ou - Définissez manuellement
baseUrl: "https://api.moonshot.cn/v1"dansmodels.providers.moonshot.
Kimi Coding¶
Utiliser le point de terminaison du codage Kimi de Moonshot AI (fournisseur intégré et compatible Anthropique) :
{
env: { KIMI_API_KEY: "sk-..." },
agents: {
defaults: {
model: { primary: "kimi-coding/k2p5" },
models: { "kimi-coding/k2p5": { alias: "Kimi K2.5" } },
},
},
}
Notes :
- Définissez
KIMI_API_KEYdans l'environnement ou utilisezopenclaw Ă bord --auth-choice kimi-code-api-key. - ModĂšle ref:
kimi-coding/k2p5.
Synthétique (compatible Anthropique)¶
Utiliser le point de terminaison Anthropique du synthétique:
{
env: { SYNTHETIC_API_KEY: "sk-..." },
agents: {
defaults: {
model: { primary: "synthetic/hf:MiniMaxAI/MiniMax-M2.1" },
models: { "synthetic/hf:MiniMaxAI/MiniMax-M2.1": { alias: "MiniMax M2.1" } },
},
},
models: {
mode: "merge",
providers: {
synthetic: {
baseUrl: "https://api.synthetic.new/anthropic",
apiKey: "${SYNTHETIC_API_KEY}",
api: "anthropic-messages",
models: [
{
id: "hf:MiniMaxAI/MiniMax-M2.1",
name: "MiniMax M2.1",
reasoning: false,
input: ["text"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 192000,
maxTokens: 65536,
},
],
},
},
},
}
Notes :
- Définissez
SYNTHETIC_API_KEYou utilisezopenclaw Ă bord --auth-choice synthetic-api-key. - ModĂšle ref:
synthétique/hf:MiniMaxAI/MiniMax-M2.1. - L'URL de base devrait omettre
/v1car le client anthropique l'ajoute.
ModĂšles locaux (LM Studio) â Configuration recommandĂ©e¶
Voir /gateway/local-models pour les conseils locaux actuels. TL;DR: exécutez MiniMax M2.1 via LM Studio Responses API sur un matériel sérieux; gardez les modÚles hébergés fusionnés pour une solution de repli.
MiniMax M2.1¶
Utiliser MiniMax M2.1 directement sans LM Studio :
{
agent: {
model: { primary: "minimax/MiniMax-M2. " },
modĂšles: {
"anthropique/claude-opus-4-6": { alias: "Opus" },
"minimax/MiniMax-M2. ": { alias: "Minimax" },
},
}, ModĂšles
: mode {
: "fusion",
Fournisseurs : {
minimax: {
baseUrl: "https://api. inimax. o/anthropique",
apiKey: "${MINIMAX_API_KEY}",
api: "anthropique-messages",
modĂšles: [
{
id: "MiniMax-M2. ",
nom: "MiniMax M2. ",
raisonnement : faux, Entrée
: ["texte"],
// Tarif: mise à jour dans les modÚles. si vous avez besoin d'un suivi exact des coûts.
coût: { input: 15, output: 60, cacheRead: 2, cacheWrite: 10 },
contextWindow: 200000,
maxTokens : 8192,
},
],
},
},
},
}
Notes :
- Définissez la variable d'environnement
MINIMAX_API_KEYou utilisezopenclaw Ă bord --auth-choice minimax-api. - ModĂšle disponible:
MiniMax-M2.1(par défaut). - Mettre à jour les prix dans
models.jsonsi vous avez besoin de suivi exact des coûts.
Cérébraux (GLM 4.6 / 4.7)¶
Utilisez Cerebras via leur point de terminaison compatible OpenAI:
{
env: { CEREBRAS_API_KEY: "sk-..." },
agents: {
defaults: {
model: {
primary: "cerebras/zai-glm-4.7",
fallbacks: ["cerebras/zai-glm-4.6"],
},
models: {
"cerebras/zai-glm-4.7": { alias: "GLM 4.7 (Cerebras)" },
"cerebras/zai-glm-4.6": { alias: "GLM 4.6 (Cerebras)" },
},
},
},
models: {
mode: "merge",
providers: {
cerebras: {
baseUrl: "https://api.cerebras.ai/v1",
apiKey: "${CEREBRAS_API_KEY}",
api: "openai-completions",
models: [
{ id: "zai-glm-4.7", name: "GLM 4.7 (Cerebras)" },
{ id: "zai-glm-4.6", name: "GLM 4.6 (Cerebras)" },
],
},
},
},
}
Notes :
- Utilisez
cerebras/zai-glm-4.7pour Cerebras; utilisezzai/glm-4.7pour Z.AI direct. - Définissez
CEREBRAS_API_KEYdans l'environnement ou la configuration.
Notes :
- APIs supportés :
openai-completions,openai-respones,anthropic-messages,google-generative-ai - Utilisez
authHeader: true+headerspour des besoins d'authentification personnalisés. - Remplacer la configuration root de l'agent avec
OPENCLAW_AGENT_DIR(ouPI_CODING_AGENT_DIR) si vous voulezmodels.jsonstockés ailleurs (par défaut:~/.openclaw/agents/main/agent).
session¶
ContrĂŽle la portĂ©e de la session, la politique de rĂ©initialisation, les dĂ©clencheurs de rĂ©initialisation et le lieu oĂč la boutique de session est Ă©crite.
{
session: {
scope: "per-sender",
dmScope: "main",
identityLinks: {
alice: ["telegram:123456789", "discord:987654321012345678"],
},
reset: {
mode: "daily",
atHour: 4,
idleMinutes: 60,
},
resetByType: {
thread: { mode: "daily", atHour: 4 },
direct: { mode: "idle", idleMinutes: 240 },
group: { mode: "idle", idleMinutes: 120 },
},
resetTriggers: ["/new", "/reset"],
// Default is already per-agent under ~/.openclaw/agents/<agentId>/sessions/sessions.json
// You can override with {agentId} templating:
store: "~/.openclaw/agents/{agentId}/sessions/sessions.json",
// Direct chats collapse to agent:<agentId>:<mainKey> (default: "main").
mainKey: "main",
agentToAgent: {
// Max ping-pong reply turns between requester/target (0â5).
maxPingPongTurns: 5,
},
sendPolicy: {
rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
default: "allow",
},
},
}
Champs :
mainKey: clé bucket direct-chat (par défaut:"main"). Utile lorsque vous voulez « renommer » le fil principal du DM sans changer « agentId ».- Note Sandbox :
agents.defaults.sandbox.mode: "non-main"utilise cette clĂ© pour dĂ©tecter la session principale. N'importe quelle clĂ© de session qui ne correspond pas ĂmainKey(groups/canaux) est en bac Ă sable. dmScope: comment les sessions DM sont regroupĂ©es (par dĂ©faut:"main").main: tous les DMs partagent la session principale pour la continuitĂ©.per-peer: isoler les DMs par l'id de l'expĂ©diteur Ă travers les canaux.per-channel-peer: isoler les DMs par canal + expĂ©diteur (recommandĂ© pour les boĂźtes de rĂ©ception multi-utilisateurs).per-account-channel-peer: isoler les DMs par compte + canal + expĂ©diteur (recommandĂ© pour les boĂźtes de rĂ©ception multi-comptes).- Mode DM sĂ©curisĂ© (recommandĂ©) : dĂ©finir
session.dmScope: "per-channel-peer"lorsque plusieurs personnes peuvent DM le bot (boĂźtes de rĂ©ception partagĂ©es, listes d'autorisations multi-personnes oudmPolicy: "open"). identityLinks: mapper les identifiants canoniques aux pairs prĂ©fixĂ©s par le fournisseur afin que la mĂȘme personne partage une session DM Ă travers les canaux lors de l'utilisation deper-peer,per-channel-peer, ouper-account-channel-peer.- Exemple:
alice: ["telegram:123456789", "discord:987654321012345678"]. reset: politique de rĂ©initialisation primaire. La valeur par dĂ©faut de rĂ©initialisation quotidienne Ă 4:00 heure locale sur l'hĂŽte de la passerelle.mode:dailyouidle(par dĂ©faut:dailyquandresetest prĂ©sent).atHour: heure locale (0-23) pour la limite quotidienne de rĂ©initialisation.idleMinutes: glisser la fenĂȘtre inactive en quelques minutes. Lorsque quotidien + inactivite sont tous deux configures, celui qui expire en premier lâemporte.resetByType: per-session overrides fordirect,group, andthread. Legacydmkey is accepted as an alias fordirect.- Si vous ne dĂ©finissez que les anciens
session.idleMinutessans aucunreset/resetByType, OpenClaw reste en mode idle-only pour une compatibilitĂ© ascendante. heartbeatIdleMinutes: option de remplacement inactif pour les tests de pulsations cardiaques (rĂ©initialisation quotidienne s'applique toujours quand activĂ©).agentToAgent.maxPingPongTurns: max reply-back turns between requester/target (0â5, default 5).sendPolicy.default:allowoudenyquand aucune rĂšgle ne correspond.sendPolicy.rules[]: correspond parchannel,chatType(direct|group|room), oukeyPrefix(par exemplecron:). Premier refus gagne; sinon autoriser.
skills (configuration des compétences)¶
ContrÎle la liste d'autorisations groupée, les préférences d'installation, les dossiers de compétences supplémentaires et les dérogations par compétence
. S'applique aux compétences groupées et ~/.openclaw/skills (compétences de l'espace de travail
gagnent toujours en conflit de noms).
Champs :
allowBundled: liste blanche optionnelle pour les skills intĂ©grĂ©es uniquement. Sâil est dĂ©fini, seules ces compĂ©tences groupĂ©es sont Ă©ligibles (les compĂ©tences gĂ©rĂ©es/de lâespace de travail ne sont pas affectĂ©es).load.extraDirs : rĂ©pertoires de Skills supplĂ©mentaires Ă analyser (prioritĂ© la plus basse).install.preferBrew : privilĂ©gier les installateurs brew lorsquâils sont disponibles (par dĂ©faut : true).install.nodeManager: prĂ©fĂ©rence de l'installateur de node (npm|pnpm|yarn, default: npm).entries.<skillKey>: substitutions de configuration par compĂ©tence.
Champs par Skill :
enabled : dĂ©finirfalsepour dĂ©sactiver un Skill mĂȘme sâil est fourni/installĂ©.env : variables dâenvironnement injectĂ©es pour lâexĂ©cution de lâagent (uniquement si elles ne sont pas dĂ©jĂ dĂ©finies).apiKey: commoditĂ© optionnelle pour les compĂ©tences qui dĂ©clarent une var env primaire (par exemplenano-banane proâGEMINI_API_KEY).
Exemple :
{
compétences: {
allowBundled: ["gemini", "peekaboo"],
charge: {
extraDirs: ["~/Projects/agent-scripts/skills", "~/Projets/oss/some-skill-pack/skills"],
},
install: {
preferBrew: true,
nodeManager : "npm",
},
entrées : {
"nano-banana-pro": {
apiKey: "GEMINI_KEY_HERE",
env: {
GEMINI_API_KEY: "GEMINI_KEY_HERE",
},
},
peekaboo: { enabled: true },
Su : { enabled: false },
},
},
}
plugins (extensions)¶
ContrÎle la découverte de plugins, autoriser/refuser et la configuration par plugin. Les plugins sont chargés
depuis ~/.openclaw/extensions, <workspace>/.openclaw/extensions, plus toutes les entrées
plugins.load.paths. Les modifications de configuration nécessitent un redémarrage de la passerelle.
Voir /plugin pour une utilisation complĂšte.
Champs :
enabled: bascule maßtre pour le chargement du plugin (par défaut: true).allow: option allowlist des identifiants de plugins; lorsque défini, seul le chargement des plugins est listé.niy: refus optionnel des identifiants de plugins (refus de gagne).load.paths: fichiers ou répertoires supplémentaires à charger (absolus ou~).entrées.<pluginId>: surcharge par plugin.enabled: définitfalsepour désactiver.config: objet de configuration spécifique au plugin (validé par le plugin si fourni).
Exemple :
{
plugins: {
activé: true,
allow: ["appel vocal"],
charge: {
chemins: ["~/Projects/oss/voice-call-extension"],
},
entrées : {
"appel vocal" : {
activé : vrai,
config: {
provider: "twilio",
},
},
},
},
}
browser (navigateur géré par openclaw)¶
OpenClaw peut démarrer une instance dédiée, isolée Chrome/Brave/Edge/Chromium pour openclaw et exposer un petit service de contrÎle de bouclage.
Les profils peuvent pointer vers un navigateur distant basé sur Chromium via profils.<name>.cdpUrl. Les profils
distants sont en piĂšces jointes uniquement (dĂ©marrer/arrĂȘter/rĂ©initialiser sont dĂ©sactivĂ©s).
browser.cdpUrl reste prĂ©sent pour les configurations monoâprofil hĂ©ritĂ©es et comme schĂ©ma/hĂŽte de base pour les profils qui ne dĂ©finissent que cdpPort.
Variables dâenvironnement + .env
- activé:
true - evaluateEnabled:
true(définirfalsepour désactiveract:evaluateetwait --fn) - service de contrÎle : loopback uniquement (port dérivé de
gateway.port, valeur par défaut18791) - URL CDP:
http://127.0.0.1:18792(service de contrÎle + 1, profil unique hérité) - couleur du profil:
#FF4500(lobster-orange) - Note: le serveur de contrÎle est démarré par la passerelle en cours d'exécution (barre de menus OpenClaw.app ou
passerelle openclaw). - Ordre de dĂ©tection automatique : navigateur par dĂ©faut si basĂ© sur Chromium ; sinon Chrome â Brave â Bord â Chromium â Canary Chrome.
{
browser: {
activé: vrai,
evaluateEnabled: true,
// cdpUrl: "http://127. 0.0. :18792", // héritage mono-profil surcharge
defaultProfile: "chrome",
profils : {
openclaw: { cdpPort: 18800, color: "#FF4500" },
fonctionne: { cdpPort: 18801, color: "#0066CC" },
distante : { cdpUrl: "http://10. .0.42:9222", couleur: "#00AA00" },
},
couleur: "#FF4500",
// Avancé:
// sans tĂȘte: false,
// noSandbox: false,
// executablePath: "/Applications/Brave Browser. pp/Contents/MacOS/Brave Browser",
// attachSeulement: false, // définit vrai lors du tunneling d'un CDP distant sur localhost
},
}
ui (Apparence)¶
Couleur d'accentuation optionnelle utilisée par les applications natives pour le chrome de l'interface (ex: teinte de bulle Mode Talk).
Si non défini, les clients retombent à un bleu clair mis en sourdine.
{
ui: {
couture Color: "#FF4500", // hexadécimal (RRGGBB ou #RRGGBB)
// Optionnel: ContrÎle de l'assistant d'identité de l'interface utilisateur.
// Si non défini, l'interface de contrÎle utilise l'identité de l'agent actif (config ou IDENTITY. d).
assistant : {
name : "OpenClaw",
avatar : "CB", // emoji, texte court, ou URI URI
},
},
}
passerelle (mode serveur Gateway + lier)¶
Utilisez gateway.mode pour déclarer explicitement si cette machine doit exécuter la passerelle.
Ăquivalent en variable dâenvironnementâŻ:
- mode : unset (traitĂ© comme âne pas dĂ©marrer automatiqueâ)
- bind:
loopback - port:
18789(port unique pour WS + HTTP)
{
gateway: {
mode : "local", // ou "remote"
port: 18789, // WS + HTTP multiplex
bind: "loopback",
// controlUi: { enabled: true, basePath: "/openclaw" }
// auth: { mode: "token", token: "votre-jeton" } // portes de jeton WS + Control UI access
// tailscale: { mode: "off" | "serve" | "funnel" }
},
}
ContrĂŽler le chemin de base de l'interface :
gateway.controlUi.basePathdĂ©finit le prĂ©fixe d'URL oĂč l'interface de contrĂŽle est servie.- Exemples:
"/ui","/openclaw","/apps/openclaw". - Par défaut: root (
/) (inchangĂ©). gateway.controlUi.rootdĂ©finit la racine du systĂšme de fichiers pour les assets de Control UI (par dĂ©faut:dist/control-ui).gateway.controlUi.allowInsecureAuthautorise une authentification par jeton uniquement pour lâUI de contrĂŽle lorsque lâidentitĂ© de lâappareil est omise (gĂ©nĂ©ralement via HTTP). Par dĂ©faut:false. PrĂ©fĂ©rez HTTPS (Tailscale Serve) ou127.0.0.1.gateway.controlUi.dangerouslyDisableDeviceAuthdĂ©sactive les vĂ©rifications d'identitĂ© du pĂ©riphĂ©rique pour Control UI (jeton/mot de passe uniquement). Par dĂ©faut:false. Verre de pause seulement.
Documentation connexe :
Proxys de confiance :
gateway.trustedProxies: liste des adresses IP de proxy inversé qui terminent TLS devant la passerelle.- Quand une connexion provient d'un de ces IPs, OpenClaw utilise
x-forwarded-for(oux-real-ip) pour déterminer l'adresse IP du client pour les vérifications locales d'appairage et les vérifications HTTP auth/local. - Ne listez que les proxys que vous contrÎlez entiÚrement et assurez-vous qu'ils écrasent les
x-forwarded-for.
RemarquesâŻ:
openclaw gatewayrefuse de dĂ©marrer sauf sigateway.modeest dĂ©fini Ălocal(ou si vous passez le paramĂštre de remplacement).gateway.portcontrĂŽle le seul port multiplexĂ© utilisĂ© pour WebSocket + HTTP (control UI, hooks, A2UI).- Point de terminaison des complĂ©ments de chat OpenAI : dĂ©sactivĂ© par dĂ©faut; activez avec
gateway.http.endpoints.chatCompletions.enabled: true. - Précédent:
--port>OPENCLAW_GATEWAY_PORT>gateway.port> default18789. - L'authentification de la passerelle est requise par défaut (token/mot de passe ou identité de service en échelle de taille). Les liaisons non-loopback nécessitent un jeton/mot de passe partagé.
- L'assistant d'intĂ©gration gĂ©nĂšre un jeton de passerelle par dĂ©faut (mĂȘme sur le rebouclage).
gateway.remote.tokenest uniquement pour les appels CLI; il n'active pas l'authentification de la passerelle locale.gateway.tokenest ignoré.
Auth and Tailscale :
gateway.auth.modedĂ©finit les exigences d'Ă©tablissement de main (tokenoupassword). Quand le jeton n'est pas dĂ©fini, l'authentification est utilisĂ©e.gateway.auth.tokenstocke le jeton partagĂ© pour l'authentification des jetons (utilisĂ© par le CLI sur la mĂȘme machine).- Lorsque
gateway.auth.modeest dĂ©fini, seule cette mĂ©thode est acceptĂ©e (plus des en-tĂȘtes optionnels d'Ă©chelle de queue). gateway.auth.passwordpeut ĂȘtre dĂ©fini ici, ou viaOPENCLAW_GATEWAY_PASSWORD(recommandĂ©).gateway.auth.allowTailscalepermet aux Tailscale Serve des en-tĂȘtes d'identitĂ© (tailscale-user-login) de satisfaire l'authentification lorsque la requĂȘte arrive sur loopback avecx-forwarded-for,x-forwarded-proto, etx-forwarded-host. OpenClaw vĂ©rifie l'identitĂ© en rĂ©solvant l'adressex-forwarded-forviatailscale whoisavant de l'accepter. Lorsquâil est dĂ©fini surtrue, les requĂȘtes Serve nâont pas besoin de jeton/mot de passe ; dĂ©finissezfalsepour exiger des identifiants explicites. Par dĂ©faut,truelorsquetailscale.mode = "serveur"et le mode d'authentification n'est paspassword.gateway.tailscale.mode: "serve"utilise Tailscale Serve (tailnet uniquement, lien loopback).gateway.tailscale.mode: "funnel"expose le tableau de bord publiquement; nĂ©cessite auth.gateway.tailscale.resetOnExitrĂ©initialise la configuration Serve/Funnel lors de l'extinction.
Client distant par défaut (CLI) :
gateway.remote.urldĂ©finit l'URL par dĂ©faut de passerelle WebSocket pour les appels CLI lorsquegateway.mode = "remote".gateway.remote.transportsĂ©lectionne le transport Ă distance macOS (sshpar dĂ©faut,directpour ws/wss). Lorsquedirect,gateway.remote.urldoit ĂȘtrews://ouwss://.ws://hostest par dĂ©faut le port18789.gateway.remote.tokenfournit le jeton pour les appels distants (laisser non dĂ©fini sans authentification).gateway.remote.passwordfournit le mot de passe pour les appels distants (laisser vide sans authentification).
Comportement de l'application macOS :
- OpenClaw.app surveille
~/.openclaw/openclaw.jsonet communique les modes en direct lorsquegateway.modeougateway.remote.urlchange. - Si
gateway.modeest désactivé, maisgateway.remote.urlest défini, l'application macOS le traite comme mode distant. - Lorsque vous changez de mode de connexion dans l'application macOS, il écrit
gateway.mode(etgateway.remote.url+gateway.remote.transporten mode distant) dans le fichier de configuration.
{
gateway: {
mode: "remote",
remote: {
url: "ws://gateway.tailnet:18789",
token: "votre-jeton",
password: "votre-mot de passe",
},
},
}
Exemple de transport direct (application macOS) :
{
gateway: {
mode: "remote",
remote: {
transport: "direct",
url: "wss://gateway.example.net",
token: "your-token",
},
},
}
gateway.reload (Rechargement chaud de la configuration)¶
La passerelle surveille ~/.openclaw/openclaw.json (ou OPENCLAW_CONFIG_PATH) et applique les changements automatiquement.
Modes:
hybrid(par défaut) : appliquer des changements sûrs à chaud; redémarrer la passerelle pour les changements critiques.hot: n'appliquer que les changements à chaud ; log quand un redémarrage est nécessaire.restart: redémarrez la passerelle en cas de changement de configuration.off: désactive le rechargement chaud.
{
gateway: {
reload: {
mode: "hybrid",
debounceMs: 300,
},
},
}
Matrice de rechargement à chaud (fichiers + impact)¶
Fichiers surveillés :
~/.openclaw/openclaw.json(ouOPENCLAW_CONFIG_PATH)
Appliqué à chaud (pas de redémarrage complet de la passerelle):
hooks(webhook auth/path/mappings) +hooks.gmail(Gmail watcher redĂ©marrĂ©)browser(redĂ©marrage du serveur de contrĂŽle du navigateur)cron(redĂ©marrage du service cron + mise Ă jour simultanĂ©e)agents.defaults.heartbeat(redĂ©marrage du runner du cĆur)web(redĂ©marrage du canal web WhatsApp)telegram,discord,signal,imessage(redĂ©marrage du canal)agent,models,routing,messages,session,whatsapp,logging,skills,ui,talk,identity,wizard(lectures dynamiques)
Nécessite un redémarrage complet de la passerelle:
gateway(port/bind/auth/control UI/tailscale)bridge(hérité)découvertecanvasHostplugins- Tout chemin de configuration inconnu/non pris en charge (redémarrage par défaut pour sécurité)
Isolation multi-instance¶
Pour exécuter plusieurs passerelles sur un hÎte (pour redondance ou un robot de sauvetage), isoler l'état par instance + configuration et utiliser des ports uniques:
OPENCLAW_CONFIG_PATH(configuration par instance)OPENCLAW_STATE_DIR(sessions/creds)agents.defaults.workspace(souvenirs)gateway.port(unique par instance)
Drapeaux de confort (CLI) :
openclaw --dev âŠâ utilise~/.openclaw-dev+ dĂ©place les ports depuis la base19001openclaw --profile <name> âŠâ utilise~/.openclaw-<name>(port via config/env/flags)
Voir Carnet de passerelle pour le mapping de ports dérivé (passerelle/navigateur/canvas). Voir passerelles multiples pour plus de détails sur l'isolation du port par navigateur/CDP.
Exemple :
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
passerelle openclaw --port 19001
hooks (Gateway webhooks)¶
Activer un point de terminaison simple du webhook HTTP sur le serveur HTTP de la passerelle.
ParamĂštresâŻ:
- activé:
false - chemin :
/hooks - maxBodyBytes:
262144(256 KB)
{
crochets : {
activé: true,
token: "shared-secret",
chemin: "/hooks",
presets: ["gmail"],
transformsDir: "~/. penclaw/crochets",
correspondances : [
{
correspondance: { path: "gmail" }, Action
: "agent",
wakeMode : "now",
name : "Gmail",
sessionKey: "crochete:gmail:{{messages[0].id}}",
ModĂšle de message : "De: {{messages[0].from}}\nSujet : {{messages[0].subject}}\n{{messages[0].snippet}}",
: vrai,
canal: "last",
modĂšle : "openai/gpt-5. -mini",
},
],
},
}
Les requĂȘtes doivent inclure le jeton de crochet :
Authorization: Bearer <token>oux-openclaw-token: <token>
Points de terminaison :
POST /hooks/wakeâ{ text, mode?: "now"|"next-heartbeat" }POST /hooks/agentâ{ message, name?, sessionKey?, wakeMode?, deliver?, channel?, to?, model?, thinking?, timeoutSeconds? }POST /hooks/<name>â rĂ©solu viahooks.mappings
/hooks/agent publie toujours un résumé dans la session principale (et peut éventuellement déclencher un pulsateur immédiat via `wakeMode: "now").
Mappage des notes :
match.pathcorrespond au sous-chemin aprĂšs/hooks(par exemple/hooks/gmailâgmail).match.sourcecorrespond Ă un champ payload (par exemple{ source: "gmail" }) afin que vous puissiez utiliser un chemin gĂ©nĂ©rique/hooks/ingest.- ModĂšles comme
{{messages[0].subject}}lu depuis le payload. transformpeut pointer vers un module JS/TS qui retourne une action de crochet.deliver: trueenvoie la réponse finale à un salon ;channelest par défautlast(tombe sur WhatsApp).- S'il n'y a pas de route de livraison préalable, définissez explicitement
channel+to(requis pour Telegram/Discord/Google Chat/Slack/Signal/iMessage/MS Teams). modelremplace le LLM pour ce hook run (provider/modelou alias; doit ĂȘtre autorisĂ© siagents.defaults.modelsest dĂ©fini).
Gmail helper config (utilisé par openclaw webhooks gmail setup / run):
{
hooks: {
gmail: {
account: "openclaw@gmail.com",
topic: "projects/<project-id>/topics/gog-gmail-watch",
subscription: "gog-gmail-watch-push",
pushToken: "shared-push-token",
hookUrl: "http://127.0.0.1:18789/hooks/gmail",
includeBody: true,
maxBytes: 20000,
renewEveryMinutes: 720,
serve: { bind: "127.0.0.1", port: 8788, path: "/" },
tailscale: { mode: "funnel", path: "/gmail-pubsub" },
// Optional: use a cheaper model for Gmail hook processing
// Falls back to agents.defaults.model.fallbacks, then primary, on auth/rate-limit/timeout
model: "openrouter/meta-llama/llama-3.3-70b-instruct:free",
// Optional: default thinking level for Gmail hooks
thinking: "off",
},
},
}
Remplacer le modĂšle pour les crochets Gmail :
hooks.gmail.modelspécifie un modÚle à utiliser pour le traitement du hook Gmail (par défaut pour la session primaire).- Accepte les refs
provider/modelou les alias deagents.defaults.models. - Falls back to
agents.defaults.model.fallbacks, thenagents.defaults.model.primary, on auth/rate-limit/timeouts. - Si
agents.defaults.modelsest défini, inclure le modÚle de crochets dans la liste d'autorisations. - Au démarrage, avertit si le modÚle configuré n'est pas dans le catalogue de modÚles ou la liste d'autorisations.
hooks.gmail.thinkingdéfinit le niveau de pensée par défaut pour les hooks Gmail et est écrasé par per-hookthinking.
Démarrage automatique de la passerelle:
- Si
hooks.enabled=trueethooks.gmail.accountsont définis, la passerelle démarregog gmail watch serveau démarrage et renouvelle automatiquement la montre. - Définissez
OPENCLAW_SKIP_GMAIL_WATCHER=1pour dĂ©sactiver le dĂ©marrage automatique (pour les exĂ©cutions manuelles). - Ăvitez dâexĂ©cuter un
gog gmail watch serveséparé en parallÚle du Gateway ; cela échouera aveclisten tcp 127.0.0.1:8788: bind: address already in use.
Note: lorsque tailscale.mode est activé, OpenClaw définit par défaut serve.path à / afin que
Tailscale puisse proxy /gmail-pubsub correctement (il supprime le préfixe set-path).
Si vous avez besoin du backend pour recevoir le chemin préfixé, définissez
hooks.gmail.tailscale.target sur une URL complĂšte (et alignez serve.path).
canvasHost (LAN/tailnet Canvas file server + reload)¶
La passerelle sert un rĂ©pertoire de HTML/CSS/JS via HTTP, donc les nĆuds iOS/Android peuvent simplement canvas.navigate vers lui.
Racine par défaut: ~/. penclaw/workspace/canvas
Port par défaut: 18793 (choisi pour éviter le port CDP du navigateur openclaw 18792)
Le serveur Ă©coute sur le gateway bind host (LAN ou Tailnet) afin que les nĆuds puissent l'atteindre.
Le serveur:
- sert des fichiers dans
canvasHost.root - injecte un minuscule client de rechargement en HTML servi
- surveille le rĂ©pertoire et les diffusions se rechargent sur un point de terminaison WebSocket Ă
/__openclaw__/ws - auto-crée un démarrage
index.htmllorsque le rĂ©pertoire est vide (donc vous voyez quelque chose immĂ©diatement) - sert Ă©galement A2UI Ă
/__openclaw__/a2ui/et est annoncĂ© aux nĆuds commecanvasHostUrl(toujours utilisĂ© par les nĆuds pour Canvas/A2UI)
Désactiver le rechargement en direct (et la surveillance des fichiers) si le répertoire est volumineux ou si vous appuyez sur EMFILE:
- config:
canvasHost: { liveReload: false }
{
canvasHost: {
root: "~/.openclaw/workspace/canvas",
port: 18793,
liveReload: true,
},
}
Les modifications apportées à canvasHost.* nécessitent un redémarrage de la passerelle (le rechargement de la configuration va redémarrer).
DĂ©sactiver avecâŻ:
- config:
canvasHost: { enabled: false } - env:
OPENCLAW_SKIP_CANVAS_HOST=1
bridge (pont TCP hérité, supprimé)¶
Les versions actuelles n'incluent plus l'écouteur du pont TCP ; les clés de configuration bridge.* sont ignorées.
Les nĆuds se connectent sur la passerelle WebSocket. Cette section est conservĂ©e pour rĂ©fĂ©rence historique.
Comportement hérité :
- La passerelle pourrait exposer un pont TCP simple pour les nĆuds (iOS/Android), gĂ©nĂ©ralement sur le port
18790.
ParamĂštresâŻ:
- activé:
true - port :
18790 - bind:
lan(se lie Ă0.0.0.0)
Bind modes:
lan:0.0.0.0(accessible sur n'importe quelle interface, incluant LAN/WiâFi et Tailscale)tailnet: se lier uniquement Ă l'IP Tailscale de la machine (recommandĂ© pour VienneLondres) loopback:127.0.0.1(local seulement)auto: prĂ©fĂšre tailnet IP si prĂ©sent, sinonlan
TLS:
bridge.tls.enabled: active TLS pour les connexions de passerelles (TLS-only quand activé).bridge.tls.autoGenerate: génÚre un certificat auto-signé quand aucune clé n'est présente (par défaut: true).bridge.tls.certPath/bridge.tls.keyPath: chemins PEM pour le certificat de pont + clé privée.bridge.tls.caPath: bundle PEM CA optionnel (racines personnalisées ou futur mTLS).
Lorsque TLS est activé, la passerelle annonce bridgeTls=1 et bridgeTlsSha256 lors de la découverte des enregistrements TXT
afin que les nĆuds puissent Ă©pingler le certificat. Les connexions manuelles utilisent une utilisation de confiance en premiĂšre utilisation si aucune empreinte
n'est encore enregistrée.
Les certificats générés automatiquement nécessitent openssl sur PATH; si la génération échoue, le pont de connexion ne démarrera pas.
{
pont: {
activé: vrai,
port : 18790,
liaison : "tailnet",
tls : {
activé : vrai,
// Utilise ~/. penclaw/bridge/tls/bridge-{cert,key}. em quand omis.
// certPath: "~/.openclaw/bridge/tls/bridge-cert.pem",
// keyPath: "~/. penclaw/bridge/tls/bridge-key.pem"
},
},
}
discovery.mdns (mode diffusion Bonjour / mDNS)¶
ContrÎle les diffusions de découverte de LAN mDNS (_openclaw-gw._tcp).
minimal(par défaut) : omettrecliPath+sshPortdes enregistrements TXTfull: inclurecliPath+sshPortdans les enregistrements TXToff: désactiver entiÚrement les diffusions mDNS- Nom d'hÎte :
openclawpar défaut (annonceopenclaw.local). Remplacer parOPENCLAW_MDNS_HOSTNAME.
{
découverte: { mdns: { mode: "minimal" } },
}
discovery.wideArea (Wide-Area Bonjour / unicast DNSâSD)¶
Lorsqu'elle est activée, la passerelle écrit une zone DNS-SD unicast pour _openclaw-gw._tcp dans ~/.openclaw/dns/ en utilisant le domaine de découverte configuré (exemple: openclaw.internal.).
Pour faire découvrir iOS/Android à travers les réseaux (Vienne
- un serveur DNS sur l'hÎte passerelle servant le domaine choisi (CoreDNS est recommandé)
- Facile à diviser les DNS pour que les clients résolvent ce domaine via le serveur DNS de passerelle
Assistant de configuration unique (hĂŽte de passerelle):
openclaw dns setup --apply
{
discovery: { wideArea: { enabled: true } },
}
Variables de modÚle de média¶
Les espaces réservés au modÚle sont étendus dans tools.media.*.models[].args et tools.media.models[].args (et dans tous les champs d'arguments modÚles futurs).
| Variable | Description |
| ------------------------------------------------------------------------------- | -------- | ------- | ---------- | ----- | ----- | ------ | -------- | ------- | ------- | | --- |
| {{Body}} | Corps du message entrant |
| {{RawBody}} | Raw corps du message entrant (pas de enveloppe de l'historique/expéditeur; best for command parsing) |
| {{BodyStripped}} | Body with group mentions stripped (best default for agents) |
| {{From}} | Sender identifiant (E. 64 pour WhatsApp ; peut différer par canal) |
| {{To}} | Identifiant de destination |
| {{MessageSid}} | ID de message de canal (lorsque disponible) |
| {{SessionId}} | UUID de la session actuelle |
| {{IsNewSession}} | "true" quand une nouvelle session a été créée |
| {{MediaUrl}} | pseudo-URL du média entrant (si présent) |
| {{MediaPath}} | Chemin du média local (si téléchargé) |
| {{MediaType}} | Type de mĂ©dia (image/audio/document/âŠ) |
| {{Transcript}} | Transcription audio (lorsque activée) |
| {{Prompt}} | Prompt média résolu pour les entrées CLI |
| {{MaxChars}} | Nombre maximal de caractÚres de sortie résolu pour les entrées CLI |
| {{ChatType}} | "direct" ou "group" |
| {{GroupSubject}} | Sujet du groupe (meilleur effort) |
| {{GroupMembers}} | Aperçu des membres du groupe (meilleur effort) |
| {{SenderName}} | Nom dâaffichage de lâexpĂ©diteur (meilleur effort) |
| {{SenderE164}} | NumĂ©ro de tĂ©lĂ©phone de lâexpĂ©diteur (meilleur effort) |
| {{Provider}} | Indication du fournisseur (whatsapp | telegram | discord | googlechat | slack | signal | imessage | msteams | webchat | âŠ)
|
Cron (Planificateur de Gateway)¶
Cron est un planificateur appartenant à la passerelle pour les réveils et les tùches planifiées. Voir Tùches Cron pour la vue d'ensemble des fonctionnalités et les exemples de CLI.
{
cron: {
enabled: true,
maxConcurrentRuns: 2,
},
}
SuivantâŻ: Agent Runtime đŠ