#QMD periodic updates/embed not working

1 messages · Page 1 of 1 (latest)

tired dune
#

I believe my QMD peridoc syncing is not working properly. I can confirm it is being initialized/armed:

openclaw-gateway-1 | 2026-03-13T22:12:33.212+01:00 [gateway] qmd memory startup initialization armed for agent "main"

But it does not seem to be running periodic syncs/embeddings. Here are the last few status checks I did (there is more than an hour between the first and last one):

zaro@g3-plus:~/openclaw$ docker compose exec openclaw-gateway sh -lc '
STATE_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"
export XDG_CONFIG_HOME="$STATE_DIR/agents/main/qmd/xdg-config"
export XDG_CACHE_HOME="$STATE_DIR/agents/main/qmd/xdg-cache"
qmd status
'
QMD Status

Index: /home/node/.openclaw/agents/main/qmd/xdg-cache/qmd/index.sqlite
Size:  3.3 MB

Documents
  Total:    18 files indexed
  Vectors:  31 embedded
  Pending:  1 need embedding (run 'qmd embed')
  Updated:  10m ago

No collections. Run 'qmd collection add .' to index markdown files.

<truncated>

QMD Warning: no GPU acceleration, running on CPU (slow). Run 'qmd status' for details.

Device
  GPU:      none (running on CPU — models will be slow)
  Tip: Install CUDA, Vulkan, or Metal support for GPU acceleration.
  CPU:      4 math cores
zaro@g3-plus:~/openclaw$ docker compose exec openclaw-gateway sh -lc '
STATE_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"
export XDG_CONFIG_HOME="$STATE_DIR/agents/main/qmd/xdg-config"
export XDG_CACHE_HOME="$STATE_DIR/agents/main/qmd/xdg-cache"
qmd status
'
QMD Status

Index: /home/node/.openclaw/agents/main/qmd/xdg-cache/qmd/index.sqlite
Size:  3.3 MB

Documents
  Total:    18 files indexed
  Vectors:  31 embedded
  Pending:  1 need embedding (run 'qmd embed')
  Updated:  1h ago

No collections. Run 'qmd collection add .' to index markdown files.

<truncated>

I believe they suggest that the periodic updates/embeds are not running as expected as the Updated status keeps aging from 10m ago to 1h ago instead of refreshing, and the pending embedding keeps staying pending.

near chasmBOT
#

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

paper kettleBOT
#

Two things in your output jump out, and one of them is expected behavior in the current OpenClaw QMD integration:

1) “Pending: 1 need embedding” can be normal (depending on searchMode)

OpenClaw only runs qmd embed automatically when QMD is configured to use a vector-capable mode (memory.qmd.searchMode = "vsearch" or "query").

If you’re on the default searchMode: "search" (BM25-only), OpenClaw intentionally skips the embed step — so QMD can show Pending: 1 need embedding forever and that’s not necessarily a bug (those vectors just aren’t needed for BM25 search).

If you do want periodic embeddings, set:

memory: {
  backend: "qmd",
  qmd: {
    searchMode: "vsearch", // or "query" (slower, more “full fat”)
  }
}
#

Docs: https://docs.openclaw.ai/concepts/memory#qmd-backend-experimental

2) “Updated: 10m ago” → “Updated: 1h ago” doesn’t prove the timer isn’t running

qmd status’s “Updated” is QMD’s notion of last index update, and it may not move if QMD decides there’s nothing to do (or if OpenClaw fell back to the builtin backend due to a QMD error).

The most useful next check is: is OpenClaw still actually using the QMD backend, and does it think it’s updating?

Please paste these 3 outputs

  1. Version (important because the QMD startup arming behavior changed recently):
openclaw --version
  1. Deep status (this should show which memory backend is active + QMD timestamps like lastUpdateAt):
openclaw status --deep
#
  1. Gateway logs filtered for QMD failures/timeouts/backoff (OpenClaw only logs QMD on errors; success is mostly silent):
docker compose logs openclaw-gateway --since 2h | rg -i "qmd (update failed|embed failed|timed out|backing off|collection add failed|unavailable|falling back)"

If you enable embeddings and it still stays pending

On CPU-only hosts, qmd embed can exceed OpenClaw’s defaults (embed timeout is 120s by default; embed interval is 60m by default). You can bump them:

memory: {
  backend: "qmd",
  qmd: {
    searchMode: "vsearch",
    update: {
      embedInterval: "10m",
      embedTimeoutMs: 600000,