#Active memory Questions

173 messages ยท Page 1 of 1 (latest)

final wasp
#

i have a few questions on active memory. first is, apparently active memory is sending requests to my llm provider every 30 seconds for each agent. cani configure a local model?

snow orchidBOT
last gorgeBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> โœ… Mark Solution

desert tigerBOT
#

Yes, you can.

Also, what youโ€™re describing does not sound like Active Memory itself. Active Memory runs before a reply for eligible chats, it is not supposed to poll your provider every 30s. Periodic calls are more likely heartbeat/background automation.

Two separate things you can make local:

{
  agents: {
    defaults: {
      model: { primary: "ollama/gemma4" }, // optional, main agent local too
      memorySearch: {
        provider: "ollama", // or "local" / "lmstudio"
      },
      heartbeat: {
        every: "0m", // disable, or slow it down
#
      },
    },
  },
  plugins: {
    entries: {
      "active-memory": {
        enabled: true,
        config: {
          agents: ["main"],
          model: "ollama/gemma4" // optional, otherwise it inherits session/agent model
        },
      },
    },
  },
}
#

Quick breakdown:

  • plugins.entries.active-memory.config.model = the Active Memory sub-agent model
  • agents.defaults.memorySearch.provider = the memory embeddings/search backend
  • local memory search options: local, ollama, lmstudio

One important doc-backed note:

  • heartbeat default is 30m, not 30s, and itโ€™s configurable via agents.defaults.heartbeat.every

Docs:

If you paste these, I can tell you exactly whatโ€™s generating the requests:

#
openclaw --version
openclaw status

and your active-memory, memorySearch, and heartbeat config blocks.

final wasp
#

can you jsut give me the lines to paste so that you can get the output you need

desert tigerBOT
#

Yep, paste these in your terminal and send the output here.

openclaw --version
openclaw status
openclaw config get agents.defaults.model --json
openclaw config get agents.defaults.memorySearch --json
openclaw config get agents.defaults.heartbeat --json
openclaw config get agents.list --json
openclaw config get 'plugins.entries["active-memory"]' --json

If any command says the path is missing, paste that too.

Please redact any obvious API keys/tokens before posting.

final wasp
#

this is a huge output. its broken into 6 pieces. wait until i say "im done" to respond

totaluser@Total-Hardware:~$ openclaw --version
openclaw status
openclaw config get agents.defaults.model --json
openclaw config get agents.defaults.memorySearch --json
openclaw config get agents.defaults.heartbeat --json
openclaw config get agents.list --json
openclaw config get 'plugins.entries["active-memory"]' --json
OpenClaw 2026.4.12 (1c0672b)

๐Ÿฆž OpenClaw 2026.4.12 (1c0672b)
One CLI to rule them all, and one more restart because you changed the port.

โ”‚
โ—‡
โ”‚
โ—‡
OpenClaw status

Overview
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Item โ”‚ Value โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ OS โ”‚ linux 6.17.0-19-generic (x64) ยท node 25.6.1 โ”‚
โ”‚ Dashboard โ”‚ http://127.0.0.1:18789/ โ”‚
โ”‚ Tailscale โ”‚ serve ยท [REDACTED].ts.net ยท https:// โ”‚
โ”‚ โ”‚ [REDACTED].ts.net โ”‚
โ”‚ Channel โ”‚ stable (default) โ”‚
โ”‚ Update โ”‚ pnpm ยท up to date ยท npm latest 2026.4.12 โ”‚
โ”‚ Gateway โ”‚ local ยท ws://127.0.0.1:18789 (local loopback) ยท โ”‚
โ”‚ โ”‚ reachable 140ms ยท auth token ยท Total-Hardware (192. โ”‚
โ”‚ โ”‚ 168.4.98) app 2026.4.12 linux 6.17.0-19-generic โ”‚
โ”‚ Gateway self โ”‚ Total-Hardware (192.168.4.98) app 2026.4.12 linux 6. โ”‚
โ”‚ โ”‚ 17.0-19-generic โ”‚
โ”‚ Gateway service โ”‚ systemd installed ยท enabled ยท running (pid 2122670, โ”‚
โ”‚ โ”‚ state active) โ”‚
โ”‚ Node service โ”‚ systemd not installed โ”‚

desert tigerBOT
#

Got it, Iโ€™ll wait for the rest.

final wasp
#

โ”‚ Agents โ”‚ 8 ยท 1 bootstrap file present ยท sessions 399 ยท โ”‚
โ”‚ โ”‚ default main active 9m ago โ”‚
โ”‚ Memory โ”‚ 1125 files ยท 1125 chunks ยท sources memory, sessions โ”‚
โ”‚ โ”‚ ยท plugin memory-core ยท vector ready โ”‚
โ”‚ Plugin compatibility โ”‚ none โ”‚
โ”‚ Probes โ”‚ skipped (use --deep) โ”‚
โ”‚ Events โ”‚ none โ”‚
โ”‚ Tasks โ”‚ 0 active ยท 0 queued ยท 0 running ยท 8 issues ยท audit 4 โ”‚
โ”‚ โ”‚ errors ยท 48 warn ยท 63 tracked โ”‚
โ”‚ Heartbeat โ”‚ 15m (main), 15m (alfred), disabled (cipher), 15m โ”‚
โ”‚ โ”‚ (forge), disabled (rush), 15m (scout), 15m โ”‚
โ”‚ โ”‚ (sentinel), 15m (vital) โ”‚
โ”‚ Sessions โ”‚ 399 active ยท default MiniMax-M2.7 (200k ctx) ยท 8 โ”‚
โ”‚ โ”‚ stores โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Task maintenance: openclaw tasks maintenance --apply

Security audit
Summary: 13 critical ยท 7 warn ยท 2 info
CRITICAL Exec security=full is configured
Full exec trust is enabled for: main, forge, scout, vital, sentinel, alfred, rush, cipher. Open channel access was also detected at: - channels.discord.accountโ€ฆ
Fix: Prefer tools.exec.security="allowlist" with ask prompts, and reserve "full" for tightly scoped break-glass agents only.
CRITICAL Open channels can reach exec-enabled agents
Open DM/group access detected at: - channels.discord.accounts.cipher.groupPolicy - channels.discord.accounts.default.groupPolicy - channels.discord.accounts.foโ€ฆ
Fix: Tighten dmPolicy/groupPolicy to pairing or allowlist, or disable exec for agents reachable from shared/public channels.

desert tigerBOT
#

Got it, keep going.

final wasp
#

Sessions
โ”‚ Key โ”‚ Kind โ”‚ Age โ”‚ Model โ”‚ Tokens โ”‚
โ”‚ agent:sc โ”‚ direct โ”‚ 1m ago โ”‚ MiniMax-M2.5 โ”‚ 69k/205k (33%) โ”‚
โ”‚ out:main โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ agent:se โ”‚ direct โ”‚ 2m ago โ”‚ MiniMax-M2.7 โ”‚ 149k/205k (73%) โ”‚
โ”‚ ntinel:m โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ ain โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ agent:sc โ”‚ direct โ”‚ 3m ago โ”‚ MiniMax-M2.7 โ”‚ 78k/200k (39%) ยท ๐Ÿ—„๏ธ 10% cached โ”‚
โ”‚ out:cron โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ :scout- โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ poll-new โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ agent:sc โ”‚ direct โ”‚ 3m ago โ”‚ MiniMax-M2.7 โ”‚ 78k/200k (39%) ยท ๐Ÿ—„๏ธ 10% cached โ”‚
โ”‚ out:cron โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ :scout- โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ poll- โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ newโ€ฆ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ agent:al โ”‚ direct โ”‚ 8m ago โ”‚ MiniMax-M2.7 โ”‚ 49k/200k (25%) โ”‚
โ”‚ fred:mai โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ n โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ agent:vi โ”‚ direct โ”‚ 8m ago โ”‚ MiniMax-M2.7 โ”‚ 115k/205k (56%) ยท ๐Ÿ—„๏ธ 15% cached โ”‚
โ”‚ tal:main โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ agent:fo โ”‚ direct โ”‚ 9m ago โ”‚ MiniMax-M2.7 โ”‚ 29k/200k (14%) ยท ๐Ÿ—„๏ธ 47% cached โ”‚
โ”‚ rge:main โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ agent:ma โ”‚ direct โ”‚ 9m ago โ”‚ MiniMax-M2.7 โ”‚ 79k/200k (40%) ยท ๐Ÿ—„๏ธ 3% cached โ”‚
โ”‚ in:main โ”‚ โ”‚ โ”‚ โ”‚ โ”‚

desert tigerBOT
#

๐Ÿ‘

final wasp
#

CRITICAL Open groupPolicy with elevated tools enabled
Found groupPolicy="open" at: - channels.telegram.groupPolicy - channels.telegram.accounts.default.groupPolicy - channels.telegram.accounts.forge.groupPolicy - โ€ฆ
Fix: Set groupPolicy="allowlist" and keep elevated allowlists extremely tight.
CRITICAL Open groupPolicy with runtime/filesystem tools exposed
Found groupPolicy="open" at: - channels.telegram.groupPolicy - channels.telegram.accounts.default.groupPolicy - channels.telegram.accounts.forge.groupPolicy - โ€ฆ
Fix: For open groups, prefer tools.profile="messaging" (or deny group:runtime/group:fs), set tools.fs.workspaceOnly=true, and use agents.defaults.sandbox.mode="all" for exposed agents.
CRITICAL Discord security warning
Discord guilds: groupPolicy="open" allows any channel not explicitly denied to trigger (mention-gated). Set channels.discord.groupPolicy="allowlist" and configโ€ฆ
CRITICAL Discord security warning
Discord guilds: groupPolicy="open" allows any channel not explicitly denied to trigger (mention-gated). Set channels.discord.groupPolicy="allowlist" and configโ€ฆ
โ€ฆ +14 more
Full report: openclaw security audit
Deep probe: openclaw security audit --deep

Channels
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Channel โ”‚ Enabled โ”‚ State โ”‚ Detail โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Discord โ”‚ ON โ”‚ OK โ”‚ token configร—4 ([REDACTED] ยท len 72) ยท โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ accounts 4/5 โ”‚
โ”‚ Telegram โ”‚ ON โ”‚ OK โ”‚ token configร—2 ([REDACTED] ยท len 46) ยท โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ accounts 2/2 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

this is actually secyion 3 not 4 my bad the last one is section 4

desert tigerBOT
#

No worries, Iโ€™m following. Send section 4 when ready.

final wasp
#

โ”‚ agent:fo โ”‚ direct โ”‚ 9m ago โ”‚ MiniMax-M2.7 โ”‚ 61k/200k (30%) โ”‚
โ”‚ rge:cron โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ :forge- โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ poll- โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ newโ€ฆ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

FAQ: https://docs.openclaw.ai/faq
Troubleshooting: https://docs.openclaw.ai/troubleshooting
Next steps:
Need to share? openclaw status --all
Need to debug live? openclaw logs --follow
Need to test channels? openclaw status --deep
{
"primary": "minimax-portal/MiniMax-M2.7",
"fallbacks": [
"minimax/MiniMax-M2.7",
"minimax-portal/MiniMax-M2.5"
]
}
{
"enabled": true,
"experimental": {
"sessionMemory": true
}
}
{
"every": "15m",
"includeReasoning": true,
"directPolicy": "allow",
"suppressToolErrorWarnings": true
}
[
{
"id": "main",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "/home/totaluser/.openclaw/shared/health_research",
"name": "health-research"
}
]
}
},
"heartbeat": {},
"subagents": {
"allowAgents": [
"forge",
"scout",
"vital",
"sentinel",
"alfred"
]
}
},
{
"id": "forge",
"name": "Forge",
"workspace": "/home/totaluser/.openclaw/forge",
"agentDir": "/home/totaluser/.openclaw/agents/forge/agent",
"heartbeat": {}
},

no i meant the third seciton i sent you is actualy section 4 and then 4th one i sent is actually 3rd this on is 5

#

{
"id": "scout",
"name": "Scout",
"workspace": "/home/totaluser/.openclaw/scout",
"agentDir": "/home/totaluser/.openclaw/agents/scout/agent",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "/home/totaluser/.openclaw/shared/health_research",
"name": "health-research"
}
]
}
},
"heartbeat": {}
},
{
"id": "vital",
"name": "vital",
"workspace": "/home/totaluser/.openclaw/vital",
"agentDir": "/home/totaluser/.openclaw/agents/vital/agent",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "/home/totaluser/.openclaw/shared/health_research",
"name": "health-research"
}
]
}
},
"heartbeat": {}
},
{
"id": "sentinel",
"name": "sentinel",
"workspace": "/home/totaluser/.openclaw/sentinel",
"agentDir": "/home/totaluser/.openclaw/agents/sentinel/agent",
"heartbeat": {}
},
{
"id": "alfred",
"name": "Alfred",
"workspace": "/home/totaluser/.openclaw/alfred",
"agentDir": "/home/totaluser/.openclaw/agents/alfred/agent",
"heartbeat": {
"every": "15m",
"target": "telegram",
"accountId": "forge"
}
},
{
"id": "rush",
"name": "rush",
"workspace": "/home/totaluser/.openclaw/rush",
"agentDir": "/home/totaluser/.openclaw/agents/rush/agent",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "yr-knowledge"
}
]
}
}
},
{
"id": "cipher",
"name": "Cipher",
"workspace": "/home/totaluser/.openclaw/cipher",
"agentDir": "/home/totaluser/.openclaw/agents/cipher/agent"
}
]
Config path not found: plugins.entries["active-memory"]
totaluser@Total-Hardware:~$

im done

desert tigerBOT
#

All good, Iโ€™ve got section 5. Send the last one, then Iโ€™ll sort it out.

#

Good news, this is not Active Memory.

The giveaway is:

Config path not found: plugins.entries["active-memory"]

So the Active Memory plugin is not configured at all on this install.

What your output does show instead:

  • memorySearch is enabled
  • 6 agents have heartbeat enabled at 15m
  • you have cron-style sessions like scout-poll-new / forge-poll-new

So the background provider traffic is much more likely heartbeat and/or cron, not Active Memory. Also, the config you pasted says 15m, not 30s.

#

If you want to move this local, use these:

# assuming Ollama is running locally
openclaw config set models.providers.ollama.apiKey "ollama-local"
openclaw config set agents.defaults.model.primary "ollama/<your-local-model>"
openclaw config set agents.defaults.memorySearch.provider "ollama"
openclaw gateway restart

If you want to stop the periodic turns first:

openclaw config set agents.defaults.heartbeat.every "0m"
openclaw gateway restart
#

One important nuance:

  • agents.defaults.model.primary = the main model used by normal agent turns, including heartbeat/cron if they inherit defaults
  • agents.defaults.memorySearch.provider = the memory embeddings backend

Right now your memorySearch.provider is unset, so OpenClaw will auto-detect, which can mean a remote embedding provider if you have an API key configured.

If you want, paste just this next and I can tell you whether cron is the other half of the story:

openclaw cron list

Docs:

final wasp
#

Config path not found: plugins.entries["active-memory"]

how can i set up active memory?

desert tigerBOT
#

Yep. Easiest way is to add the plugin config, restart, then test it.

First, find your config file:

openclaw config file

Then add this block to openclaw.json:

{
  plugins: {
    entries: {
      "active-memory": {
        enabled: true,
#
        config: {
          enabled: true,
          agents: ["main"],
          allowedChatTypes: ["direct", "channel"], // add "group" too if you want
          model: "ollama/<your-local-model>", // optional, omit to inherit the session model
          queryMode: "recent",
          promptStyle: "balanced",
          timeoutMs: 15000,
          maxSummaryChars: 220,
          persistTranscripts: false,
          logging: true
        }
      }
    }
  },
#
  agents: {
    defaults: {
      memorySearch: {
        provider: "ollama" // or "local" / "lmstudio"
      }
    }
  }
}

Then restart:

openclaw gateway restart
#

If you want, I can give you the exact openclaw config set ... commands instead of the JSON block.

final wasp
#

can you give me the commands to show my active memory config state right now?

desert tigerBOT
#

Yep, paste these:

openclaw config get 'plugins.entries["active-memory"]' --json
openclaw config get plugins.slots.memory --json
openclaw config get agents.defaults.memorySearch --json
openclaw config get agents.list --json

What they tell you:

  • plugins.entries["active-memory"] = whether the Active Memory plugin is configured
  • plugins.slots.memory = which memory plugin owns the memory slot
  • agents.defaults.memorySearch = memory search / embeddings config
  • agents.list = per-agent overrides that might affect memory behavior

If the first one says:

#
Config path not found: plugins.entries["active-memory"]

then Active Memory is not configured right now.

If you want, after you paste the output I can translate it into plain English.

final wasp
#

Config path not found: plugins.entries["active-memory"]
Config path not found: plugins.slots.memory
{
"enabled": true,
"experimental": {
"sessionMemory": true
}
}
[
{
"id": "main",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "/home/totaluser/.openclaw/shared/health_research",
"name": "health-research"
}
]
}
},
"heartbeat": {},
"subagents": {
"allowAgents": [
"forge",
"scout",
"vital",
"sentinel",
"alfred"
]
}
},
{
"id": "forge",
"name": "Forge",
"workspace": "/home/totaluser/.openclaw/forge",
"agentDir": "/home/totaluser/.openclaw/agents/forge/agent",
"heartbeat": {}
},
{
"id": "scout",
"name": "Scout",
"workspace": "/home/totaluser/.openclaw/scout",
"agentDir": "/home/totaluser/.openclaw/agents/scout/agent",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "/home/totaluser/.openclaw/shared/health_research",
"name": "health-research"
}
]
}
},
"heartbeat": {}
},
{

two halves to the output

#

"id": "vital",
"name": "vital",
"workspace": "/home/totaluser/.openclaw/vital",
"agentDir": "/home/totaluser/.openclaw/agents/vital/agent",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "/home/totaluser/.openclaw/shared/health_research",
"name": "health-research"
}
]
}
},
"heartbeat": {}
},
{
"id": "sentinel",
"name": "sentinel",
"workspace": "/home/totaluser/.openclaw/sentinel",
"agentDir": "/home/totaluser/.openclaw/agents/sentinel/agent",
"heartbeat": {}
},
{
"id": "alfred",
"name": "Alfred",
"workspace": "/home/totaluser/.openclaw/alfred",
"agentDir": "/home/totaluser/.openclaw/agents/alfred/agent",
"heartbeat": {
"every": "15m",
"target": "telegram",
"accountId": "forge"
}
},
{
"id": "rush",
"name": "rush",
"workspace": "/home/totaluser/.openclaw/rush",
"agentDir": "/home/totaluser/.openclaw/agents/rush/agent",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "yr-knowledge"
}
]
}
}
},
{
"id": "cipher",
"name": "Cipher",
"workspace": "/home/totaluser/.openclaw/cipher",
"agentDir": "/home/totaluser/.openclaw/agents/cipher/agent"
}
]

desert tigerBOT
#

Got it, send the second half and Iโ€™ll interpret both together.

#

Yep, in plain English, your current state is:

  1. Active Memory is not configured

    • plugins.entries["active-memory"] is missing
    • so Active Memory is off, not just disabled
  2. You do have normal memory search enabled

    • this part:
    {
      "enabled": true,
      "experimental": {
        "sessionMemory": true
      }
    }
    

    means memorySearch is on, with experimental session memory enabled

#
  1. You do not have an explicit memory plugin slot override

    • plugins.slots.memory missing just means there is no explicit override there
  2. Several agents have heartbeat enabled

    • main, forge, scout, vital, sentinel, and alfred all have heartbeat blocks
    • from your earlier paste, those are inheriting a 15m default in most cases

So right now you have:

  • memory search / session memory: ON
  • Active Memory plugin: OFF / not configured
  • heartbeats: ON for multiple agents

So if you want actual Active Memory, you need to add the plugin config block. Right now you only have memory search.

If you want, I can give you a minimal Active Memory config next, either:

  • safe default for direct chats only, or
#
  • works in Discord threads/channels too
final wasp
#

can you give tme the config set to set it up

desert tigerBOT
#

Yep, paste this for a minimal setup that will work in direct chats and channel/thread chats like this one:

openclaw config set 'plugins.entries["active-memory"]' '{
  enabled: true,
  config: {
    enabled: true,
    agents: ["main"],
    allowedChatTypes: ["direct", "channel"],
    queryMode: "recent",
    promptStyle: "balanced",
    timeoutMs: 15000,
    maxSummaryChars: 220,
    persistTranscripts: false,
    logging: true
  }
#
}'
openclaw gateway restart

If you also want the Active Memory sub-agent itself to use a local Ollama model, run this too:

openclaw config set 'plugins.entries["active-memory"].config.model' "ollama/<your-local-model>"
openclaw config set agents.defaults.memorySearch.provider "ollama"
openclaw gateway restart

Then test it in chat:

#
/active-memory status
/verbose on
/trace on

If you want, I can also give you the version that enables it for all your agents, not just main.

final wasp
#

no dont make it use ollama im fine with my default model

desert tigerBOT
#

Yep, then just use this one:

openclaw config set 'plugins.entries["active-memory"]' '{
  enabled: true,
  config: {
    enabled: true,
    agents: ["main"],
    allowedChatTypes: ["direct", "channel"],
    queryMode: "recent",
    promptStyle: "balanced",
    timeoutMs: 15000,
    maxSummaryChars: 220,
    persistTranscripts: false,
    logging: true
  }
#
}'
openclaw gateway restart

That will let Active Memory use your existing default model.

After restart, test with:

/active-memory status
/verbose on
/trace on

If you want it on for more than just main, I can give you that version too.

final wasp
#

im getting this still

Config warnings โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ โ”‚
โ”‚ - plugins.entries."active-memory": plugin not found: "active-memory" โ”‚
โ”‚ (stale config entry ignored; remove it from plugins config)

also what commands can check if i have qmd enabled as backed memory for my system

desert tigerBOT
#

Ah, that warning changes things.

plugin not found: "active-memory" means your gateway does not have that plugin available, so the config entry is being ignored. So right now this is not a config typo, itโ€™s a missing plugin/build mismatch problem.

Iโ€™d check that with:

openclaw plugins list
openclaw plugins inspect active-memory

If inspect says it canโ€™t find it, then your current install simply doesnโ€™t have that plugin loaded.

For QMD backend checks, these are the useful commands:

#
openclaw config get memory.backend --json
openclaw config get memory.qmd --json
openclaw memory status
openclaw memory status --deep

How to read them:

  • memory.backend = "qmd" โ†’ QMD is the backend
  • missing memory.backend or anything else โ†’ youโ€™re on the builtin backend, not QMD
  • memory.qmd shows QMD-specific config
  • memory status --deep is the best live check that memory is actually healthy

One nuance:

  • the memorySearch.qmd.extraCollections you pasted earlier does not by itself prove QMD is the active backend
  • the real switch is memory.backend: "qmd"
#

If you paste the output of those 4 commands, I can tell you exactly whether QMD is actually active.

final wasp
#

๐Ÿฆž OpenClaw 2026.4.12 (1c0672b)
One CLI to rule them all, and one more restart because you changed the port.

โ”‚
โ—‡ Config warnings โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ โ”‚
โ”‚ - plugins.entries."active-memory": plugin not found: "active-memory" โ”‚
โ”‚ (stale config entry ignored; remove it from plugins config) โ”‚
โ”‚ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
Active Memory
id: active-memory
Proactively surfaces relevant memory before eligible conversational replies.

Status: loaded
Format: openclaw
Source: ~/.npm-global/lib/node_modules/openclaw/dist/extensions/active-memory/index.js
Origin: bundled
Version: 2026.4.12
Shape: non-capability
Capability mode: none
Legacy before_agent_start: no

Typed hooks:
before_prompt_build

Commands:
active-memory
totaluser@Total-Hardware:~$

desert tigerBOT
#

Ah, thatโ€™s useful. So the plugin does exist. That means the warning is probably a stale config / plugin-registry bug on your build, not โ€œthe plugin is missing.โ€

For QMD backend specifically, these are the right checks:

openclaw config get memory.backend --json
openclaw config get memory.qmd --json
openclaw memory status
openclaw memory status --deep

How to read them:

  • memory.backend = "qmd" โ†’ QMD is your backend
  • missing memory.backend or a different value โ†’ QMD is not the active backend
  • memory.qmd shows QMD-specific settings
  • openclaw memory status --deep is the best live health check
#

And for the weird Active Memory warning, Iโ€™d check these next:

openclaw config get plugins.entries --json
openclaw plugins list --enabled

Iโ€™m especially looking for whether the config entry got written strangely, or whether 2026.4.12 is just being inconsistent about bundled plugin validation.

If you paste those 2 QMD outputs plus plugins.entries, I can tell you exactly what state youโ€™re in.

final wasp
#

4 sections to this output

totaluser@Total-Hardware:~$ openclaw config get plugins.entries --json
openclaw plugins list --enabled
{
"brave": {
"enabled": true,
"config": {
"webSearch": {
"apiKey": "[REDACTED]"
}
}
},
"minimax": {
"enabled": true,
"config": {}
},
"active-memory": {
"enabled": true,
"config": {
"agents": ["main", "forge", "rush", "scout", "vital"],
"allowedChatTypes": ["direct", "channel"],
"queryMode": "recent",
"promptStyle": "balanced",
"timeoutMs": 15000,
"maxSummaryChars": 220,
"logging": true
}
},
"lossless-claw": {
"enabled": true,
"config": {}
},
""active-memory"": {
"enabled": true,
"config": {
"enabled": true,
"agents": ["main"],
"allowedChatTypes": ["direct", "channel"],
"queryMode": "recent",
"promptStyle": "balanced",
"timeoutMs": 15000,
"maxSummaryChars": 220,
"persistTranscripts": false,
"logging": true
}
},
"discord": { "config": {} },
"memory-core": { "config": {} },
"telegram": { "config": {} }
}
Config warnings:

  • plugins.entries."active-memory": plugin not found: "active-memory" (stale config entry ignored; remove it from plugins config)
#

Plugins (51/51 loaded)
Source roots:
stock: /home/totaluser/.npm-global/lib/node_modules/openclaw/dist/extensions
global: /home/totaluser/.openclaw/extensions

Active Memory | active-memory | openclaw | loaded | stock | 2026.4.12
Amazon Bedrock | amazon-bedrock | openclaw | loaded | stock | 2026.4.12
Amazon Bedrock Mantle | amazon-bedrock-mantle | openclaw | loaded | stock | 2026.4.12
Anthropic | anthropic | openclaw | loaded | stock | 2026.4.12
Anthropic Vertex | anthropic-vertex | openclaw | loaded | stock | 2026.4.12
Arcee | arcee | openclaw | loaded | stock | 2026.4.12
Brave | brave | openclaw | loaded | stock | 2026.4.12
BytePlus | byteplus | openclaw | loaded | stock | 2026.4.12
Chutes | chutes | openclaw | loaded | stock | 2026.4.12
Cloudflare AI Gateway | cloudflare-ai-gateway | openclaw | loaded | stock | 2026.4.12
Codex | codex | openclaw | loaded | stock | 2026.4.12
ComfyUI | comfy | openclaw | loaded | stock | 2026.4.12
Copilot Proxy | copilot-proxy | openclaw | loaded | stock | 2026.4.12
DeepSeek | deepseek | openclaw | loaded | stock | 2026.4.12
Discord | discord | openclaw | loaded | stock | 2026.4.12
fal | fal | openclaw | loaded | stock | 2026.4.12
Fireworks | fireworks | openclaw | loaded | stock | 2026.4.12
GitHub Copilot | github-copilot | openclaw | loaded | stock | 2026.4.12
Google | google | openclaw | loaded | stock | 2026.4.12
Hugging Face | huggingface | openclaw | loaded | stock | 2026.4.12

desert tigerBOT
#

Yep, that already shows the bug, but send the other 3 sections and Iโ€™ll give you the clean fix in one shot.

final wasp
#

Kilo Gateway | kilocode | openclaw | loaded | stock | 2026.4.12
Kimi | kimi | openclaw | loaded | stock | 2026.4.12
LiteLLM | litellm | openclaw | loaded | stock | 2026.4.12
LM Studio | lmstudio | openclaw | loaded | stock | 2026.4.12
Memory Core | memory-core | openclaw | loaded | stock | 2026.4.12
Microsoft Foundry | microsoft-foundry | openclaw | loaded | stock | 2026.4.12
MiniMax | minimax | openclaw | loaded | stock | 2026.4.12
Mistral | mistral | openclaw | loaded | stock | 2026.4.12
Moonshot | moonshot | openclaw | loaded | stock | 2026.4.12
NVIDIA | nvidia | openclaw | loaded | stock | 2026.4.12
Ollama | ollama | openclaw | loaded | stock | 2026.4.12
OpenAI | openai | openclaw | loaded | stock | 2026.4.12
OpenCode | opencode | openclaw | loaded | stock | 2026.4.12
OpenCode Go | opencode-go | openclaw | loaded | stock | 2026.4.12
OpenRouter | openrouter | openclaw | loaded | stock | 2026.4.12
Qianfan | qianfan | openclaw | loaded | stock | 2026.4.12
Qwen | qwen | openclaw | loaded | stock | 2026.4.12
SGLang | sglang | openclaw | loaded | stock | 2026.4.12
StepFun | stepfun | openclaw | loaded | stock | 2026.4.12
Synthetic | synthetic | openclaw | loaded | stock | 2026.4.12
Telegram | telegram | openclaw | loaded | stock | 2026.4.12
Together | together | openclaw | loaded | stock | 2026.4.12
Venice | venice | openclaw | loaded | stock | 2026.4.12

#

Vercel AI Gateway | vercel-ai-gateway | openclaw | loaded | stock | 2026.4.12
vLLM | vllm | openclaw | loaded | stock | 2026.4.12
Volcengine | volcengine | openclaw | loaded | stock | 2026.4.12
Vydra | vydra | openclaw | loaded | stock | 2026.4.12
xAI | xai | openclaw | loaded | stock | 2026.4.12
Xiaomi | xiaomi | openclaw | loaded | stock | 2026.4.12
Z.AI | zai | openclaw | loaded | stock | 2026.4.12
Lossless Claw | lossless-claw | openclaw | loaded | global | 0.8.2

done

desert tigerBOT
#

Got it, keep going. The first section already shows the stale extra key, and this confirms the real plugin is loaded. Send the remaining 2.

#

Perfect, one more section and I can give you the exact cleanup commands.

#

Yep, found it.

You currently have two entries:

  • active-memory โœ… correct
  • \"active-memory\" โŒ bad stale key

That bad second one is exactly whatโ€™s causing the warning.

Use this to remove the broken entry:

openclaw config unset 'plugins.entries["\"active-memory\""]'
openclaw gateway restart

Then verify:

#
openclaw config get plugins.entries --json
openclaw plugins inspect active-memory

After cleanup, you should only have the normal key:

"active-memory": { ... }

and not this one:

"\"active-memory\"": { ... }
#

So the good news is, Active Memory is actually already configured. The warning is just from that extra bogus entry.

If config unset fails, fallback is:

openclaw config file

then manually delete the block named:

"\"active-memory\""

One more important thing, since this was your original concern:
Active Memory is not the thing doing periodic timed calls. It runs before eligible replies. Your periodic traffic is still much more likely from heartbeat and/or cron.

#

If you want, next I can give you the exact commands to check whether QMD is your active memory backend.

final wasp
#

i got this

totaluser@Total-Hardware:~$ openclaw config unset 'plugins.entries[""active-memory""]'
openclaw gateway restart
Config warnings:\n- plugins.entries."active-memory": plugin not found: "active-memory" (stale config entry ignored; remove it from plugins config)

๐Ÿฆž OpenClaw 2026.4.12 (1c0672b)
I'm the reason your shell history looks like a hacker-movie montage.

Config path not found: plugins.entries[""active-memory""]
Config warnings:\n- plugins.entries."active-memory": plugin not found: "active-memory" (stale config entry ignored; remove it from plugins config)

๐Ÿฆž OpenClaw 2026.4.12 (1c0672b)
If it's repetitive, I'll automate it; if it's hard, I'll bring jokes and a rollback plan.

โ”‚
โ—‡ Config warnings โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ โ”‚
โ”‚ - plugins.entries."active-memory": plugin not found: "active-memory" โ”‚
โ”‚ (stale config entry ignored; remove it from plugins config) โ”‚
โ”‚ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
Config warnings:\n- plugins.entries."active-memory": plugin not found: "active-memory" (stale config entry ignored; remove it from plugins config)
Restarted systemd service: openclaw-gateway.service
totaluser@Total-Hardware:~$

desert tigerBOT
#

Yeah, that means the CLI path parser is choking on the malformed key. Easiest fix is manual.

Run:

openclaw config file

In that file, find and delete the whole block whose key is exactly:

"\"active-memory\"": {
  ...
}

Leave the normal one alone:

#
"active-memory": {
  ...
}

Then restart and verify:

openclaw gateway restart
openclaw config get plugins.entries --json

After that, the warning should be gone.

So at this point:

  • your real active-memory config is fine
#
  • the problem is just that one malformed duplicate entry

If you want, paste the plugins.entries section after cleanup and Iโ€™ll sanity-check it.

final wasp
#

this is what my agent told me eariler

ound the issue. The active-memory plugin is enabled and hitting MiniMax every ~30 seconds for all agents (main, forge, rush, scout, vital). MiniMax keeps returning 529 overload errors, and each query times out after 15 seconds.

Here are your options:

  1. Increase timeout (quick fix โ€” gives MiniMax more time per query):

openclaw config set plugins.entries.active-memory.config.timeoutMs 30000

Then restart gateway. This just makes each query wait longer before giving up.

  1. Reduce which agents use active-memory (reduce load โ€” fewer queries):

openclaw config set plugins.entries.active-memory.config.agents '["main"]'

This limits active-memory to only your main session, removing it from Forge/Scout/Vital/Rush.

  1. Disable active-memory entirely (most reliable fix while MiniMax is unstable):

openclaw config set plugins.entries.active-memory.enabled false

Then restart. This stops all active-memory queries entirely until MiniMax stabilizes.

  1. Check if there's a rate limit โ€” active-memory is querying MiniMax constantly on every message. If MiniMax has a rate limit, we're probably hitting it and getting 529s back.

Which would you prefer โ€” increase timeout, reduce agents, or disable it?

desert tigerBOT
#

Iโ€™d only trust part of that diagnosis.

What looks right:

  • Active Memory is enabled
  • itโ€™s enabled for 5 agents
  • timeoutMs is 15000

What I wouldnโ€™t trust yet is the โ€œevery 30 secondsโ€ part. Active Memory is supposed to run before eligible replies, not as a simple timer loop.

Also, if MiniMax is returning 529 overload, I would not start by increasing timeout. That usually just makes the failures slower.

My recommendation:

Best first move, reduce it to main only

openclaw config set 'plugins.entries["active-memory"].config.agents' '["main"]'
#
openclaw gateway restart

If that still causes trouble, disable it completely:

openclaw config set 'plugins.entries["active-memory"].enabled' false
openclaw gateway restart

I would not do this first:

openclaw config set 'plugins.entries["active-memory"].config.timeoutMs' 30000

because it increases wait time without reducing load.

So my actual recommendation is:

#
  1. limit Active Memory to main
  2. test
  3. if still overloaded, disable it

If you want, I can give you one small command to confirm whether the 529s are really coming from Active Memory vs heartbeat/cron.

final wasp
#

yeah lets try to figure out what the 529s are from

desert tigerBOT
#

Yep. Start with this and paste the matches:

openclaw logs | grep -E -n -C 3 '529|active-memory|heartbeat|cron|overload|timeout'

If that doesnโ€™t show enough, do the live version and wait for the next failure:

openclaw logs --follow | grep -E --line-buffered '529|active-memory|heartbeat|cron|overload|timeout'

What Iโ€™m looking for is whether the 529 lines are next to:

  • active-memory
  • heartbeat
  • cron
#

Paste the first chunk you get and Iโ€™ll decode it.

final wasp
#

multiple sections

39- [lcm] bootstrap: done session=48155618 bootstrapped=false importedMessages=0 reason=already bootstrapped duration=5ms
40- [lcm] assemble: falling back to live context conversation=5 contextItems=93 liveMessages=104 duration=3ms
41- [lcm] ingestBatch: session queue acquired queuedAhead=0 wait=0ms session=48155618 messages=4
42: [lcm] afterTurn: pruned 4 heartbeat ack messages for conversation=5 session=48155618
43- [lcm] Reusing shared engine init for db=/home/totaluser/.openclaw/lcm.db
44- [lcm] bootstrap: session queue acquired queuedAhead=0 wait=0ms session=18f3c582
45- [lcm] bootstrap: checkpoint hit conversation=6 session=18f3c582 existingCount=557 duration=2ms
46- [lcm] bootstrap: done session=18f3c582 bootstrapped=false importedMessages=0 reason=already bootstrapped duration=3ms
47- [lcm] assemble: done conversation=6 session=18f3c582 contextItems=157 hasSummaryItems=true inputMessages=1243 outputMessages=156 tokenBudget=200000 estimatedTokens=59362 duration=49ms
48: cron: pruned 1 expired cron run session(s)
49- [lcm] ingestBatch: session queue acquired queuedAhead=0 wait=0ms session=18f3c582 messages=4
50: [lcm] afterTurn: pruned 4 heartbeat ack messages for conversation=6 session=18f3c582
51- [lcm] Reusing shared engine init for db=/home/totaluser/.openclaw/lcm.db
52- [lcm] bootstrap: session queue acquired queuedAhead=0 wait=0ms session=fdcb89d9
53- [lcm] bootstrap: checkpoint hit conversation=7 session=fdcb89d9 existingCount=303 duration=2ms

#

56- [lcm] ingestBatch: session queue acquired queuedAhead=0 wait=0ms session=fdcb89d9 messages=4
57- [lcm] incremental compaction decision: conversation=7 cacheState=hot activityBand=low triggerLeafChunkTokens=40000 rawTokensOutsideTail=18819 threshold=40000 shouldCompact=false reason=below-leaf-trigger
58- [lcm] afterTurn: done conversation=7 session=fdcb89d9 newMessages=4 dedupedMessages=4 ingestedMessages=4 duration=64ms
59: heartbeat: using explicit accountId=forge target=telegram channel=none
60- [lcm] Reusing shared engine init for db=/home/totaluser/.openclaw/lcm.db
61- [lcm] bootstrap: session queue acquired queuedAhead=0 wait=0ms session=ff826a3b
62- [lcm] bootstrap: checkpoint hit conversation=8 session=ff826a3b existingCount=211 duration=1ms
63- [lcm] bootstrap: done session=ff826a3b bootstrapped=false importedMessages=0 reason=already bootstrapped duration=2ms
64- [lcm] assemble: falling back to live context conversation=8 contextItems=210 liveMessages=289 duration=1ms
65- [lcm] ingestBatch: session queue acquired queuedAhead=0 wait=0ms session=ff826a3b messages=2
66: WARN [lcm] afterTurn: heartbeat pruning failed: database disk image is malformed
67- [lcm] incremental compaction decision: conversation=8 cacheState=cold activityBand=low triggerLeafChunkTokens=20000 rawTokensOutsideTail=21392 threshold=20000 shouldCompact=true reason=cold-cache-catchup
68- [lcm] compactLeafAsync start: conversation=8 session=ff826a3b leafChunkTokens=40000 maxPasses=2 allowCondensedPasses=true
69- [lcm] afterTurn: done conversation=8 session=ff826a3b newMessages=2 dedupedMessages=2 ingestedMessages=2 duration=48ms

desert tigerBOT
#

Got it, send the next chunk. So far this points more at heartbeat/cron activity than Active Memory.

final wasp
#

91- ERROR: JSON5 parse failed: SyntaxError: JSON5: invalid end of input at 531:1
92- ERROR path: .npm-global/lib/node_modules/openclaw/dist/subsystem-CSBs8ZPt.js:161
93- ERROR Run openclaw doctor to repair, or fix the keys above manually.
94: cron: pruned 1 expired cron run session(s)
95: cron: pruned 1 expired cron run session(s)
96: config change detected; evaluating reload (tools.web.search.apiKey, plugins.entries."active-memory")
97: WARN config change requires gateway restart (plugins.entries."active-memory")
98- signal SIGUSR1 received
99- received SIGUSR1; restarting
100- gmail watcher stopped

126- canvas host mounted at http://127.0.0.1:18789/__openclaw__/canvas/
127- health-monitor started (interval: 300s, startup-grace: 60s, channel-connect-grace: 120s)
128- agent model: minimax-portal/MiniMax-M2.7
129: ready (4 plugins: active-memory, discord, lossless-claw, telegram; 7.5s)
130- log file: /tmp/openclaw/openclaw-2026-04-14.log
131- WARN security warning: dangerous config flags enabled: gateway.controlUi.allowInsecureAuth=true
132- WARN tailscale serve failed: Access denied: serve config denied

165- canvas host mounted at http://127.0.0.1:18789/__openclaw__/canvas/
166- health-monitor started (interval: 300s, startup-grace: 60s, channel-connect-grace: 120s)
167- agent model: minimax-portal/MiniMax-M2.7
168: ready (4 plugins: active-memory, discord, lossless-claw, telegram; 6.9s)
169- log file: /tmp/openclaw/openclaw-2026-04-14.log
170- WARN security warning: dangerous config flags enabled: gateway.controlUi.allowInsecureAuth=true
171- WARN tailscale serve failed: Access denied: serve config denied

desert tigerBOT
#

Nice, this is getting clearer. Still looks like heartbeat is definitely active, and thereโ€™s also an LCM DB issue (database disk image is malformed). Send the next chunk.

final wasp
#

181- [discord] [rush] delaying provider startup 20s to reduce Discord startup rate limits
182- [discord] [total] delaying provider startup 30s to reduce Discord startup rate limits
183- [lcm] Reusing shared engine init for db=/home/totaluser/.openclaw/lcm.db
184: heartbeat: started intervalMs=900000
185: cron: started enabled=true jobs=13
186- [discord] [cipher] Discord Message Content Intent is limited; bots under 100 servers can use it without verification.
187- [discord] [cipher] starting provider (@Cipher)
188- [telegram] [default] starting provider (@Total_Oversight_Bot)

223- discord: 254 commands exceeds limit; removing per-skill commands and keeping /skill.
224- WARN discord: truncating native command description (command:lossless) from 121 to 100
225- discord client initialized as [REDACTED] (Total); awaiting gateway readiness
226: WARN embedded run agent end:
event=embedded_run_agent_end
isError=true
error="The AI service is temporarily overloaded. Please try again in a moment."
failoverReason=overloaded
model=MiniMax-M2.7
provider=minimax-portal
httpCode=529
providerErrorType=overloaded_error
providerErrorMessage="The server cluster is currently under high load. Please retry after a short wait and thank you for your patience. (2064) (529)"

desert tigerBOT
#

Oof, okay, this shows a second problem too: your config file was briefly malformed (JSON5 parse failed), which explains some of the weirdness around that bad Active Memory key. Send the last chunk.

final wasp
#

ok im done

desert tigerBOT
#

Okay, weโ€™ve got the important part now.

What the logs actually prove

  • The 529s are real provider overloads from MiniMax portal
  • The failing event is a generic embedded agent run
  • Heartbeat is 15m, not 30s:
    heartbeat: started intervalMs=900000
    
  • Cron is enabled with 13 jobs
  • So the logs do not prove Active Memory is the 30s source

My read

Your load is more likely coming from a mix of:

  • cron jobs (jobs=13)
  • heartbeats
  • multi-agent background runs
#
  • with Active Memory adding extra calls on eligible replies

So I would not blame Active Memory alone from this evidence.

Best next step

First, reduce Active Memory load anyway, since itโ€™s cheap to test:

openclaw config set 'plugins.entries["active-memory"].config.agents' '["main"]'
openclaw gateway restart

Then check the bigger likely culprit:

openclaw cron list
#

If you want to be aggressive and reduce background traffic further, also slow/disable heartbeat:

openclaw config set agents.defaults.heartbeat.every "0m"
openclaw gateway restart

Separate issue I would not ignore

You also have:

  • database disk image is malformed
  • JSON5 parse failed

Those are separate problems and worth fixing with:

openclaw doctor
#

So, short version:

  • 529s are real
  • they are not proven to be from Active Memory specifically
  • heartbeat is definitely not 30s
  • cron is a strong suspect

Paste openclaw cron list next and Iโ€™ll help you identify which jobs are likely hammering the provider.

#

Thanks, I think weโ€™ve got it.

Bottom line

  • The 529s are real MiniMax overloads
  • The logs do not prove Active Memory is the source
  • Your earlier โ€œevery 30s per agentโ€ theory is not supported by the logs
  • Heartbeat is 15m, not 30s
  • You also have 13 cron jobs, which is a much stronger background-load suspect
  • Active Memory is enabled, but itโ€™s extra load on replies, not a simple timer loop

Also found

  • a bad duplicate config key: \"active-memory\"
  • a config parse problem happened at one point
  • lcm.db shows database disk image is malformed

What Iโ€™d do next, in order

  1. Reduce Active Memory to just main
#
   openclaw config set 'plugins.entries["active-memory"].config.agents' '["main"]'
   openclaw gateway restart
  1. Inspect cron jobs

    openclaw cron list
    
  2. If overloads keep happening, disable heartbeat temporarily

    openclaw config set agents.defaults.heartbeat.every "0m"
    openclaw gateway restart
    
  3. Run doctor, because you have unrelated state issues too

#
   openclaw doctor

If you want, next I can help you go line-by-line through openclaw cron list and figure out which jobs are worth disabling first.

final wasp
#

can i offload active memory and some other stuff to local models? and have the same performance?

desert tigerBOT
#

Yes, you can offload some of it locally.

But same performance? Honestly, no, not usually.

Good candidates to move local

  • memory embeddings / search
  • QMD
  • heartbeat
  • Active Memory (sometimes)

Bad candidates if you want cloud-like behavior

  • your main chat agent
  • tool-heavy flows
  • anything where you care a lot about reasoning reliability

The practical answer

A hybrid setup is usually the sweet spot:

#
  • keep the main agent on cloud
  • move memory search / embeddings local
  • optionally move heartbeat local
  • maybe move Active Memory local if youโ€™re okay with some quality drop

Why Iโ€™m saying โ€œnot the sameโ€

Local can be better for:

  • cost
  • privacy
  • sometimes latency

But usually worse for:

  • reasoning quality
  • consistency
  • tool calling reliability

Useful config knobs

#
  • Active Memory model
    plugins.entries["active-memory"].config.model
    
  • Memory search / embeddings backend
    agents.defaults.memorySearch.provider
    
    (local, ollama, lmstudio)
  • Heartbeat model
    agents.defaults.heartbeat.model
    

My recommendation

If you want the lowest-risk win:

  1. move memorySearch local first
#
  1. then try heartbeat local
  2. only then try Active Memory local
  3. keep the main agent cloud

If you want, I can give you a hybrid config snippet for exactly that setup.

final wasp
#

yeah lets do the hybrid one. the local models i have are qwen3:14b and llama3.2:3b

desert tigerBOT
#

Nice, Iโ€™d use qwen3:14b for the hybrid setup.

I would not use llama3.2:3b for Active Memory if you want decent recall quality. Itโ€™s okay for very cheap background stuff, but pretty likely to feel worse.

Hybrid setup Iโ€™d recommend

  • Main agent replies: keep on your current cloud model
  • Active Memory: move to local ollama/qwen3:14b
  • Heartbeat: move to local ollama/qwen3:14b
  • memorySearch embeddings: leave alone for now

Reason Iโ€™m leaving memorySearch alone:

  • your local models are chat models
  • memory search wants an embedding backend
  • thatโ€™s a separate thing

Commands

#
openclaw config set models.providers.ollama.apiKey "ollama-local"
openclaw config set 'plugins.entries["active-memory"].config.model' "ollama/qwen3:14b"
openclaw config set 'plugins.entries["active-memory"].config.agents' '["main"]'
openclaw config set agents.defaults.heartbeat.model "ollama/qwen3:14b"
openclaw gateway restart

What this gives you

  • main conversations stay high quality
  • Active Memory stops hitting your cloud provider
  • heartbeats stop hitting your cloud provider
  • lower background cost/load

What I would test after

#
/active-memory status

and:

openclaw status

Optional phase 2 later

If you want, after this works, I can help you move memory search local too, but thatโ€™s a separate embedding/QMD decision. Iโ€™d do it in a second step, not all at once.

final wasp
#

you keep giving me config setups that add in that messed up active memory plugin error

desert tigerBOT
#

Youโ€™re right. Sorry, that oneโ€™s on me.

For this plugin, stop using openclaw config set for now. On your machine itโ€™s what keeps creating the bogus key and re-triggering the warning.

Do it manually instead

Open the config file:

openclaw config file

1) Remove the bad entry

Delete this whole block if it exists:

#
"\"active-memory\"": {
  ...
}

2) Keep only the real Active Memory block

Make sure the real one looks like this:

"active-memory": {
  "enabled": true,
  "config": {
    "agents": ["main"],
    "allowedChatTypes": ["direct", "channel"],
    "model": "ollama/qwen3:14b",
#
    "queryMode": "recent",
    "promptStyle": "balanced",
    "timeoutMs": 15000,
    "maxSummaryChars": 220,
    "logging": true
  }
}

3) Add/update Ollama + heartbeat manually too

Somewhere in your config, make sure you also have:

models: {
  providers: {
#
    ollama: {
      apiKey: "ollama-local"
    }
  }
},

agents: {
  defaults: {
    heartbeat: {
      model: "ollama/qwen3:14b"
    }
  }
}

4) Restart

#
openclaw gateway restart

So, short version:

  • donโ€™t use config set for active-memory right now
  • edit the file directly
  • keep only active-memory, delete \"active-memory\"

If you want, paste just your plugins.entries.active-memory, models.providers.ollama, and agents.defaults.heartbeat sections after editing, and Iโ€™ll sanity-check them before you restart.

final wasp
#

totaluser@Total-Hardware:~$ openclaw config validate
Invalid config at /home/totaluser/.openclaw/openclaw.json:\n- models.providers.ollama.baseUrl: Invalid input: expected string, received undefined

  • models.providers.ollama.models: Invalid input: expected array, received undefined

๐Ÿฆž OpenClaw 2026.4.12 (1c0672b)
Your terminal just grew clawsโ€”type something and let the bot pinch the busywork.

Config invalid at ~/.openclaw/openclaw.json:
ร— models.providers.ollama.baseUrl: Invalid input: expected string, received undefined
ร— models.providers.ollama.models: Invalid input: expected array, received undefined

Run openclaw doctor to repair, or fix the keys above manually.

desert tigerBOT
#

Yep, that one is my fault too. I had you create a partial explicit Ollama provider block, and OpenClaw expects that block to be complete.

What that error means

If models.providers.ollama exists in config, OpenClaw expects things like:

  • baseUrl
  • models

So a tiny block with only apiKey is invalid.

Safest fix

  1. Open your config file:
openclaw config file
  1. Delete the entire models.providers.ollama block you added manually.
#
  1. Then set up Ollama the supported way:
openclaw config --section model

and choose Ollama there.

That wizard path is much safer than hand-writing the provider block.

After that

Keep your manual Active Memory block, but let the wizard handle Ollama.

Then you can set:

  • plugins.entries["active-memory"].config.model = "ollama/qwen3:14b"
  • agents.defaults.heartbeat.model = "ollama/qwen3:14b"

So the immediate fix is

#
  • remove the partial models.providers.ollama
  • use the model wizard instead of manual Ollama config

Docs: https://docs.openclaw.ai/providers/ollama

If you want, paste just your current models section and Iโ€™ll tell you exactly what to delete before you rerun openclaw config --section model.

final wasp
#

ok i added ollama

desert tigerBOT
#

Nice. Next Iโ€™d do this:

1) Verify Ollama is wired in cleanly

openclaw config validate
openclaw models list --provider ollama

2) If that looks good, edit your config file manually

openclaw config file

Set your real Active Memory block to use local Ollama:

#
"active-memory": {
  "enabled": true,
  "config": {
    "agents": ["main"],
    "allowedChatTypes": ["direct", "channel"],
    "model": "ollama/qwen3:14b",
    "queryMode": "recent",
    "promptStyle": "balanced",
    "timeoutMs": 15000,
    "maxSummaryChars": 220,
    "logging": true
  }
}

And set heartbeat to local too:

#
agents: {
  defaults: {
    heartbeat: {
      model: "ollama/qwen3:14b"
    }
  }
}

3) Restart

openclaw gateway restart

4) Quick sanity checks

#
openclaw status

and in chat:

/active-memory status

If you want, paste openclaw config validate and openclaw models list --provider ollama first, and Iโ€™ll sanity-check before you edit anything else.

snow orchidBOT
final wasp
#

here are logs from the most recent crash. it will come in sections ill be done when i say "im done"

Apr 13 23:34:12 [active-memory] agent=forge session=agent:forge:main start timeoutMs=15000 queryChars=2105

Apr 13 23:34:28 [agent/embedded] embedded run failover decision: runId=active-memory-mny8xgqy stage=assistant decision=surface_error reason=timeout provider=minimax-portal/MiniMax-M2.7

Apr 13 23:34:28 [active-memory] agent=forge session=agent:forge:main done status=timeout elapsedMs=16015 summaryChars=0

Apr 13 23:43:33 [active-memory] agent=forge session=agent:forge:main start timeoutMs=15000 queryChars=2208

Apr 13 23:43:51 [discord] 254 commands exceeds limit; removing per-skill commands and keeping /skill.

Apr 13 23:43:51 [agent/embedded] embedded run failover decision: runId=active-memory-mny99i91 stage=assistant decision=surface_error reason=timeout provider=minimax-portal/MiniMax-M2.7

Apr 13 23:43:51 [active-memory] agent=forge session=agent:forge:main done status=timeout elapsedMs=17888 summaryChars=0

Apr 13 23:43:57 [agent/embedded] embedded run agent end: isError=true model=MiniMax-M2.7 provider=minimax-portal error="The AI service is temporarily overloaded." httpCode=529

Apr 13 23:44:05 [agent/embedded] embedded run agent end: isError=true model=MiniMax-M2.7 provider=minimax-portal error="The AI service is temporarily overloaded." httpCode=529

Apr 13 23:44:15 [agent/embedded] embedded run agent end: isError=true model=MiniMax-M2.7 provider=minimax-portal error="The AI service is temporarily overloaded." httpCode=529

Apr 13 23:44:28 [agent/embedded] embedded run agent end: isError=true model=MiniMax-M2.7 provider=minimax-portal error="The AI service is temporarily overloaded." httpCode=529

#

Apr 13 23:44:28 [agent/embedded] auth profile failure state updated: provider=minimax-portal reason=overloaded window=cooldown reused=false

Apr 13 23:44:28 [agent/embedded] embedded run failover decision: runId=48c7c493 stage=assistant decision=fallback_model reason=overloaded provider=minimax-portal/MiniMax-M2.7

Apr 13 23:44:28 [diagnostic] lane task error: lane=main durationMs=58024 error="FailoverError: The AI service is temporarily overloaded."

Apr 13 23:44:28 [diagnostic] lane task error: lane=session:agent:forge:main durationMs=58025 error="FailoverError: The AI service is temporarily overloaded."

Apr 13 23:44:28 [model-fallback/decision] decision=candidate_failed requested=minimax-portal/MiniMax-M2.7 reason=overloaded next=minimax/MiniMax-M2.7

Apr 13 23:44:32 [active-memory] agent=forge session=agent:forge:main start timeoutMs=15000 queryChars=2208

Apr 13 23:44:48 [agent/embedded] embedded run failover decision: runId=active-memory-mny9arik stage=assistant decision=surface_error reason=timeout provider=minimax/MiniMax-M2.7

Apr 13 23:44:48 [active-memory] agent=forge session=agent:forge:main done status=timeout elapsedMs=15836 summaryChars=0

Apr 13 23:46:15 systemd: Stopping openclaw-gateway.service
Apr 13 23:46:15 [gateway] signal SIGTERM received
Apr 13 23:46:15 [gateway] received SIGTERM; shutting down
Apr 13 23:46:15 [gmail-watcher] gmail watcher stopped
Apr 13 23:46:15 [ws] webchat disconnected code=1006 reason=n/a
Apr 13 23:46:16 systemd: Stopped openclaw-gateway.service
Apr 13 23:46:16 systemd: Consumed 35min 34.843s CPU time, 4.7G memory peak, 243.6M memory swap peak

#

Apr 13 23:46:16 systemd: Started openclaw-gateway.service
Apr 13 23:46:19 [gateway] loading configurationโ€ฆ
Apr 13 23:46:19 [gateway] resolving authenticationโ€ฆ
Apr 13 23:46:19 [gateway] starting...
Apr 13 23:46:26 [gateway] starting HTTP server...
Apr 13 23:46:27 [health-monitor] started (interval: 300s, startup-grace: 60s, channel-connect-grace: 120s)
Apr 13 23:46:27 [gateway] agent model: minimax-portal/MiniMax-M2.7
Apr 13 23:46:27 [gateway] ready (4 plugins: active-memory, discord, lossless-claw, telegram; 7.7s)

im done

desert tigerBOT
#

Got it, Iโ€™ll wait for the rest. This chunk does directly tie at least some failures to Active Memory on forge timing out against MiniMax.

#

Got it. This is even stronger evidence that Active Memory on forge is definitely one of the failing paths. Send the next chunk when ready.

#

Okay, we finally have the smoking gun.

What these logs confirm

  1. Active Memory is definitely one of the failing paths

    • agent=forge ... status=timeout
    • itโ€™s timing out around 15-18s
  2. MiniMax is also genuinely overloaded

    • httpCode=529
    • failover is trying to move from minimax-portal to minimax
  3. This does not look like a mysterious hard crash

    • systemd stops and restarts the gateway cleanly
    • the main issue is provider overload + Active Memory timeouts

My read

So the real picture is:

#
  • yes, Active Memory on forge is contributing to the problem
  • yes, MiniMax overload is also real
  • no, this still doesnโ€™t look like a simple โ€œevery 30s timerโ€ issue

What I would do now

Since you already wanted a hybrid setup, Iโ€™d make these changes manually in the config file, not with config set:

"active-memory": {
  "enabled": true,
  "config": {
    "agents": ["main"],
    "allowedChatTypes": ["direct", "channel"],
    "model": "ollama/qwen3:14b",
    "queryMode": "message",
    "promptStyle": "balanced",
#
    "timeoutMs": 15000,
    "maxSummaryChars": 220,
    "logging": true
  }
}

And:

agents: {
  defaults: {
    heartbeat: {
      model: "ollama/qwen3:14b"
    }
#
  }
}

Why these changes

  • agents: ["main"] removes forge/rush/scout/vital from Active Memory load
  • model: "ollama/qwen3:14b" moves Active Memory off MiniMax
  • queryMode: "message" shrinks the Active Memory prompt, so it should be faster and cheaper than recent

One nuance

If qwen3:14b is too slow locally, then bump:

timeoutMs: 30000

But I would only do that after moving it local.

#

So the plan Iโ€™d recommend

  1. clean config
  2. Active Memory only on main
  3. Active Memory model = local Ollama
  4. queryMode = "message"
  5. restart gateway

If you want, paste your current real active-memory block and Iโ€™ll rewrite it exactly how it should look.

final wasp
#

when heartbeat model is changed does that mean that the heartbeat instructions are performed by that local model or is it just the sending of the heartbeat that is done? cause what if my heartbeats instructions are complex tasks?

desert tigerBOT
#

Yes, changing heartbeat.model means the heartbeat turn itself is run by that model.

So:

  • it reads the heartbeat prompt
  • it reads HEARTBEAT.md
  • it decides what to do
  • it produces the reply / action

It is not just the delivery/sending step.

So if your heartbeat instructions are complex, that local model is the one trying to carry them out.

Practical rule of thumb

  • simple heartbeat stuff like โ€œcheck if anything is urgentโ€, โ€œlight status checksโ€, โ€œkeep caches warmโ€ โ†’ local is usually fine
  • complex heartbeat stuff like multi-step reasoning, nuanced triage, tool-heavy workflows, or important decisions โ†’ keep it on cloud

My recommendation

#

If your heartbeat is doing real work, I would not move it local blindly.

Better options:

  1. keep heartbeat on cloud
  2. move Active Memory local first
  3. or simplify heartbeat so the local model only does lightweight checks

If you want, paste your HEARTBEAT.md or describe what your heartbeat actually does, and Iโ€™ll tell you whether itโ€™s a good local-model candidate.

final wasp
#

shouldnt active memory be on a weaker model that is faster? all its doing it linking data together right? what are the downsoides to having a smaller local model on active memory

desert tigerBOT
#

Yes, in principle Active Memory is a good place to use a smaller/faster model.

Itโ€™s a bounded pre-reply task, not your full main agent.

But the downside is: bad Active Memory can actively make the main reply worse, because it injects memory context before the main answer.

What a too-small model gets wrong

  • false positives: pulls in irrelevant memory when it should return NONE
  • false negatives: misses the one memory that actually mattered
  • bad summaries: compresses the memory incorrectly
  • weak linking: fails to connect current message with older relevant context
  • poor preference detection: confuses one-off events with stable preferences

So yes, smaller is reasonable, butโ€ฆ

The safer speed wins usually come from:

  1. fewer agents
  2. smaller query scope
#
  1. then a smaller model

Thatโ€™s why I suggested:

  • agents: ["main"]
  • queryMode: "message"

Those two changes reduce load without hurting quality as much as dropping to a tiny model.

For your two local models

If I had to choose:

  • qwen3:14b = reasonable for Active Memory
  • llama3.2:3b = likely too small unless youโ€™re okay with noticeably worse recall quality

My recommendation

Use a mid-sized fast model for Active Memory, not the tiniest one you have.

So:

#
  • yes, weaker than your main model makes sense
  • no, I would not go all the way down to a tiny 3B model unless youโ€™re just experimenting

If you want, I can give you a โ€œfast but safeโ€ Active Memory config tuned for qwen3:14b.

final wasp
#

what is querymode mssage vs recent doing?

desert tigerBOT
#

queryMode controls how much chat history Active Memory sees before it decides what memory to inject.

message

Active Memory sees just the current message.

Good:

  • fastest
  • cheapest
  • least likely to get distracted by nearby chat
  • better for weaker/local models

Tradeoff:

  • can miss context if the current message is vague

Example:

โ€œwhat was that place again?โ€

#

In message, that may be too little context.


recent

Active Memory sees the current message plus a short window of recent turns.

Good:

  • better continuity
  • better when the user is referring to something mentioned a few messages ago
  • more likely to connect follow-up questions correctly

Tradeoff:

  • slower
  • more tokens
  • more chance of โ€œcontext bleedโ€ or noisy recall
#

Practical rule

  • use message if you want speed and cleaner recall
  • use recent if your conversations are follow-up heavy and context matters a lot

For your setup, especially if you move Active Memory local, Iโ€™d lean toward:

queryMode: "message"

Itโ€™s usually the safer/faster choice for a smaller local model.

final wasp
#

how can i check whats going on with qmd like the activity of qwen?

desert tigerBOT
#

Yep, these are the best checks for QMD activity:

1) See if QMD is actually the backend

openclaw config get memory.backend --json
openclaw config get memory.qmd --json

If memory.backend says "qmd", QMD is active.


2) Get live memory/QMD status

openclaw memory status --deep --verbose
#

Thatโ€™s the best single command for:

  • whether memory is healthy
  • whether QMD is being used
  • embedding/provider/model details
  • indexing/search issues

3) Force a verbose index run

openclaw memory index --agent main --verbose

That will usually show the most useful โ€œwhat is QMD doing right now?โ€ detail.


#

4) Watch logs for QMD / memory activity

openclaw logs --follow | grep -E --line-buffered 'qmd|memory|embed|rerank|qwen'

Thatโ€™s the easiest way to watch:

  • QMD indexing
  • embedding runs
  • reranking/query activity
  • whether Qwen-backed local pieces are doing work

5) If you want to inspect the raw QMD home

QMD data lives under:

#
~/.openclaw/agents/<agentId>/qmd/

So for main, usually:

ls -R ~/.openclaw/agents/main/qmd

If you paste openclaw memory status --deep --verbose, I can tell you exactly whether QMD and Qwen are actually active or not.

final wasp
#

sorry i meant active memory. qmd doesnt have an agent attached to it right?

desert tigerBOT
#

Right, QMD is not an agent.

Think of it like this:

  • Active Memory = a blocking memory sub-agent
  • QMD = a memory backend / search sidecar

So:

  • Active Memory is the thing that runs before a reply
  • QMD is just one possible backend that Active Memory can query through memory_search

More precise version

QMD is per-agent in storage/layout, but it is not itself an agent.

So if Active Memory runs for forge, it uses forgeโ€™s memory setup, and that setup might use QMD underneath.

Easy mental model

#
  • agent = โ€œthe thinkerโ€
  • active-memory = โ€œthe pre-reply recall helperโ€
  • qmd = โ€œthe local search engine / indexโ€

If you want to watch Active Memory activity specifically, this is the better log filter:

openclaw logs --follow | grep -E --line-buffered 'active-memory|memory_search|memory_get|embedded run'

If you want, I can also give you a quick diagram of how main agent โ†” active memory โ†” qmd/memory_search fits together.

final wasp
#

totaluser@Total-Hardware:~$ openclaw logs --follow | grep -E --line-buffered 'active-memory|memory_search|memory_get|embedded run'
2026-04-14T16:58:38.578Z info plugins {"subsystem":"plugins"} active-memory: agent=main session=agent:main:main start timeoutMs=15000 queryChars=1060
2026-04-14T16:58:45.678Z info {"plugin":"lossless-claw"} [lcm] assemble: conversation lookup missed session=active-memory-mnyv8i2b-b82a8cc8 sessionKey=agent:โ€ฆd2f1 duration=0ms
2026-04-14T16:58:46.273Z info {"plugin":"lossless-claw"} [lcm] ingestBatch: session queue acquired queueKey=agent:โ€ฆd2f1 queuedAhead=0 wait=0ms session=active-memory-mnyv8i2b-b82a8cc8 sessionKey=agent:โ€ฆd2f1 messages=2
2026-04-14T16:58:46.277Z warn {"plugin":"lossless-claw"} [lcm] afterTurn: bootstrap checkpoint refresh failed for session=active-memory-mnyv8i2b-b82a8cc8 sessionKey=agent:โ€ฆ2f1: ENOENT: no such file or directory, stat '/tmp/openclaw/openclaw-active-memory-7jemeb/session.jsonl'
2026-04-14T16:58:46.279Z info {"plugin":"lossless-claw"} [lcm] afterTurn: done conversation=142 session=active-memory-mnyv8i2b-b82a8cc8 sessionKey=agent:โ€ฆd2f1 newMessages=2 dedupedMessages=2 ingestedMessages=2 duration=6ms
2026-04-14T16:58:46.368Z info plugins {"subsystem":"plugins"} active-memory: agent=main session=agent:main:main done status=ok elapsedMs=7789 summaryChars=42
2026-04-14T17:00:12.114Z info plugins {"subsystem":"plugins"} active-memory: agent=main session=agent:main:main start timeoutMs=15000 queryChars=1049
2026-04-14T17:00:19.191Z info {"plugin":"lossless-claw"} [lcm] assemble: conversation lookup missed session=active-memory-mnyvai8j-6cdd7e3a sessionKey=agent:โ€ฆ2f20 duration=0ms
2026-04-14T17:00:19.426Z info {"plugin":"lossless-claw"} [lcm] ingestBatch: session queue acquired queueKey=agent:โ€ฆ2f20 queuedAhead=0 wait=0ms session=active-memory-mnyvai8j-6cdd7e3a sessionKey=agent:โ€ฆ2f20 messages=2
2026-04-14T17:00:19.429Z warn {"plugin":"lossless-claw"} [lcm] afterTurn: bootstrap checkpoint refresh failed for

part 1/2

#

session=active-memory-mnyvai8j-6cdd7e3a sessionKey=agent:โ€ฆf20: ENOENT: no such file or directory, stat '/tmp/openclaw/openclaw-active-memory-S00zT4/session.jsonl'
2026-04-14T17:00:19.431Z info {"plugin":"lossless-claw"} [lcm] afterTurn: done conversation=143 session=active-memory-mnyvai8j-6cdd7e3a sessionKey=agent:โ€ฆ2f20 newMessages=2 dedupedMessages=2 ingestedMessages=2 duration=5ms
2026-04-14T17:00:19.520Z info plugins {"subsystem":"plugins"} active-memory: agent=main session=agent:main:main done status=ok elapsedMs=7406 summaryChars=42
2026-04-14T17:14:55.676Z info plugins {"subsystem":"plugins"} active-memory: agent=rush session=agent:rush:main start timeoutMs=15000 queryChars=1204
2026-04-14T17:15:02.911Z info {"plugin":"lossless-claw"} [lcm] assemble: conversation lookup missed session=active-memory-mnyvtfzx-f9c94fe6 sessionKey=agent:โ€ฆc312 duration=0ms
2026-04-14T17:15:03.132Z info {"plugin":"lossless-claw"} [lcm] ingestBatch: session queue acquired queueKey=agent:โ€ฆc312 queuedAhead=0 wait=0ms session=active-memory-mnyvtfzx-f9c94fe6 sessionKey=agent:โ€ฆc312 messages=2
2026-04-14T17:15:03.135Z warn {"plugin":"lossless-claw"} [lcm] afterTurn: bootstrap checkpoint refresh failed for session=active-memory-mnyvtfzx-f9c94fe6 sessionKey=agent:โ€ฆ312: ENOENT: no such file or directory, stat '/tmp/openclaw/openclaw-active-memory-asK06K/session.jsonl'
2026-04-14T17:15:03.137Z info {"plugin":"lossless-claw"} [lcm] afterTurn: done conversation=144 session=active-memory-mnyvtfzx-f9c94fe6 sessionKey=agent:โ€ฆc312 newMessages=2 dedupedMessages=2 ingestedMessages=2 duration=5ms
2026-04-14T17:15:03.156Z info plugins {"subsystem":"plugins"} active-memory: agent=rush session=agent:rush:main done status=ok elapsedMs=7481 summaryChars=42
Log tail truncated (increase --max-bytes).

what do these logs tell you

desert tigerBOT
#

Got it, send part 2. So far this shows Active Memory on main is actually completing successfully in about 7 to 8 seconds, which is a lot healthier than the earlier forge timeouts.

#

These logs are actually pretty reassuring.

What they tell us

  1. Active Memory is working now

    • agent=main ... done status=ok elapsedMs=7406
    • agent=rush ... done status=ok elapsedMs=7481

    So for those runs, Active Memory completed successfully in about 7.4 to 7.8 seconds.

  2. It is not behaving like a fixed 30s timer

    • runs happened at 16:58, 17:00, then 17:14
    • that looks like triggered session activity, not a rigid polling loop
  3. The prompt/query size is smaller than the earlier failing runs

    • earlier forge failures were around queryChars=2105-2208
    • now youโ€™re seeing queryChars=1060-1204
#

That strongly suggests the newer config is lighter, which is good.

  1. The ENOENT warnings look like temp-file cleanup noise

    • itโ€™s trying to stat a temp Active Memory session file under /tmp/openclaw/...
    • then the run still finishes status=ok

    So that warning looks more like a lossless-claw/temp-session bookkeeping issue than an Active Memory failure.

  2. summaryChars=42 means it actually returned a small memory summary

    • not a timeout
    • not NONE
    • it found something and injected it

My conclusion

Right now:

#
  • Active Memory itself looks healthy on main and rush
  • the earlier bad behavior was likely a mix of:
    • bigger query size
    • more agents enabled
    • MiniMax overload at that time

The only weird thing left

This part:

bootstrap checkpoint refresh failed ... ENOENT ... /tmp/openclaw/openclaw-active-memory-.../session.jsonl

does not look like the cause of your provider crashes. It looks like a cleanup/checkpoint mismatch around temporary Active Memory sessions.

If that keeps happening a lot, itโ€™s probably worth a GitHub issue with those exact lines.

#

So overall: your current Active Memory config looks much healthier than before.

final wasp
#

lets go into that weird thing. what do you mean.

desert tigerBOT
#

Yeah, the weird thing I meant is this part:

bootstrap checkpoint refresh failed ... ENOENT: no such file or directory ... /tmp/openclaw/openclaw-active-memory-.../session.jsonl

What that means

ENOENT just means:

โ€œI tried to look at this file, but it was already gone.โ€

Why thatโ€™s happening here

Active Memory uses a temporary sub-session/transcript by default.

Per the docs, those blocking memory sub-agent transcripts are temporary and deleted after the run completes unless you turn on:

#
persistTranscripts: true

So the likely sequence is:

  1. Active Memory starts a temp session
  2. it finishes successfully
  3. the temp session.jsonl gets cleaned up
  4. lossless-claw tries to refresh/checkpoint that temp session afterward
  5. it canโ€™t find the file anymore, so it logs ENOENT

Why I called it โ€œweird but probably harmlessโ€

Because right after the warning, the run still ends with:

#
done status=ok

So:

  • Active Memory itself did not fail
  • the warning is more like post-run bookkeeping looking for a file that was already cleaned up

What it is probably not

It is probably not:

  • the cause of the 529 overloads
  • the reason Active Memory timed out earlier
  • a sign that memory search itself is broken

If you want to debug it further

Temporarily enable transcript persistence:

#
persistTranscripts: true

That keeps the Active Memory transcripts on disk instead of deleting them right away, which makes this kind of thing easier to inspect.

So the short version is:

Active Memory creates a temp transcript, deletes it, and another plugin seems to still be trying to touch it afterward. Thatโ€™s why I called it a cleanup/checkpoint mismatch.

final wasp
#

so i dont have to worry about that

desert tigerBOT
#

Probably not as an urgent problem, no.

Based on what you showed:

  • Active Memory still finished with status=ok
  • the warning looks like temp-file cleanup noise
  • it doesnโ€™t look like the cause of your 529s

So Iโ€™d treat it as:

  • not urgent
  • worth noting
  • only worth digging deeper if:
    • Active Memory starts actually failing again
    • you see a lot more of those warnings
    • or lossless-claw starts misbehaving in other ways

So, short answer: I wouldnโ€™t worry about that one right now.

final wasp
#

wahts the command to check what my heartbeat model is?

desert tigerBOT
#

Yep:

openclaw config get agents.defaults.heartbeat.model --json
openclaw config get agents.list --json

How to read it:

  • agents.defaults.heartbeat.model = global heartbeat model
  • agents.list = check for any per-agent heartbeat.model overrides

If agents.defaults.heartbeat.model says path not found, that usually means heartbeat is just using the agentโ€™s normal model instead of a separate one.

final wasp
#

totaluser@Total-Hardware:~$ openclaw config get agents.defaults.heartbeat.model --json
openclaw config get agents.list --json
"ollama/qwen3:14b"
[
{
"id": "main",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "/home/totaluser/.openclaw/shared/health_research",
"name": "health-research"
}
]
}
},
"heartbeat": {},
"subagents": {
"allowAgents": [
"forge",
"scout",
"vital",
"sentinel",
"alfred"
]
}
},
{
"id": "forge",
"name": "Forge",
"workspace": "/home/totaluser/.openclaw/forge",
"agentDir": "/home/totaluser/.openclaw/agents/forge/agent",
"heartbeat": {}
},
{
"id": "scout",
"name": "Scout",
"workspace": "/home/totaluser/.openclaw/scout",
"agentDir": "/home/totaluser/.openclaw/agents/scout/agent",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "/home/totaluser/.openclaw/shared/health_research",
"name": "health-research"
}
]
}
},
"heartbeat": {}
},
{

two parts 1/2

#

"id": "vital",
"name": "vital",
"workspace": "/home/totaluser/.openclaw/vital",
"agentDir": "/home/totaluser/.openclaw/agents/vital/agent",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "/home/totaluser/.openclaw/shared/health_research",
"name": "health-research"
}
]
}
},
"heartbeat": {}
},
{
"id": "sentinel",
"name": "sentinel",
"workspace": "/home/totaluser/.openclaw/sentinel",
"agentDir": "/home/totaluser/.openclaw/agents/sentinel/agent",
"heartbeat": {}
},
{
"id": "alfred",
"name": "Alfred",
"workspace": "/home/totaluser/.openclaw/alfred",
"agentDir": "/home/totaluser/.openclaw/agents/alfred/agent",
"heartbeat": {
"every": "15m",
"target": "telegram",
"accountId": "forge"
}
},
{
"id": "rush",
"name": "rush",
"workspace": "/home/totaluser/.openclaw/rush",
"agentDir": "/home/totaluser/.openclaw/agents/rush/agent",
"memorySearch": {
"qmd": {
"extraCollections": [
{
"path": "yr-knowledge"
}
]
}
}
},
{
"id": "cipher",
"name": "Cipher",
"workspace": "/home/totaluser/.openclaw/cipher",
"agentDir": "/home/totaluser/.openclaw/agents/cipher/agent"
}
]
totaluser@Total-Hardware:~$

desert tigerBOT
#

Yep, send part 2. So far that means your default heartbeat model is definitely ollama/qwen3:14b.

#

Yep, that confirms it.

Your default heartbeat model is:

ollama/qwen3:14b

And from the agents.list output, I donโ€™t see any per-agent heartbeat.model overrides, so the heartbeat-enabled agents are inheriting that default.

So effectively:

  • main โ†’ heartbeat uses ollama/qwen3:14b
  • forge โ†’ heartbeat uses ollama/qwen3:14b
  • scout โ†’ heartbeat uses ollama/qwen3:14b
  • vital โ†’ heartbeat uses ollama/qwen3:14b
  • sentinel โ†’ heartbeat uses ollama/qwen3:14b
  • alfred โ†’ also uses ollama/qwen3:14b for heartbeat, but with its own target/account settings
#

So yes, your heartbeat logic is currently being run by the local Ollama Qwen model.

final wasp
#

can we revert to the system default cloud model

desert tigerBOT
#

Yep.

To make heartbeat go back to the normal inherited cloud model, unset the heartbeat-specific override:

openclaw config unset agents.defaults.heartbeat.model
openclaw gateway restart

Then verify:

openclaw config get agents.defaults.heartbeat.model --json

If it says path not found, heartbeat is back to inheriting the regular agent model again.

final wasp
#

can we disable mains heartbeat, set vitals to every 6 hours, sentinel to hourly, set scout to hourly, disable rush, forge to hourly, cipher hourly, alfred every 15 minutes.

desert tigerBOT
#

Yep. Based on the agents.list order you pasted, this should do it:

openclaw config set agents.defaults.heartbeat.every "0m"

openclaw config set agents.list[1].heartbeat.every "1h"   # forge
openclaw config set agents.list[2].heartbeat.every "1h"   # scout
openclaw config set agents.list[3].heartbeat.every "6h"   # vital
openclaw config set agents.list[4].heartbeat.every "1h"   # sentinel
openclaw config set agents.list[5].heartbeat.every "15m"  # alfred
openclaw config set agents.list[7].heartbeat.every "1h"   # cipher

openclaw gateway restart

What that does:

  • main disabled (inherits default 0m)
#
  • forge hourly
  • scout hourly
  • vital every 6 hours
  • sentinel hourly
  • alfred every 15 minutes
  • rush disabled (no heartbeat block)
  • cipher hourly

If you want to double-check after:

openclaw status
openclaw config get agents.list --json

If you want, I can also turn that into a single clean JSON snippet instead of a bunch of commands.

snow orchidBOT
final wasp
#

how do i check the fallback chain

desert tigerBOT
#

If you mean the model fallback chain, these are the useful checks:

openclaw config get agents.defaults.model --json
openclaw config get agents.list --json

That shows:

  • the default primary model
  • the configured fallback list
  • any per-agent model overrides

If you want to see the live failover behavior in logs too:

openclaw logs | grep -E -n -C 2 'failover decision|model-fallback|candidate_failed|overloaded'