#Proper Memory ConfigurationI

15 messages · Page 1 of 1 (latest)

north otter
#

I want to use qmd+lossless-claw+memory-wiki+active-memory. What is the proper openclaw.json confirguration? Here are the relevant parts of my extant openclaw.json at the moment:

      "memory-wiki": {
        "enabled": true,
        "config": {
          "vaultMode": "bridge",
          "vault": {
            "path": "/Users/REDACTED/.openclaw/wiki/main",
            "renderMode": "obsidian"
          },
          "obsidian": {
            "enabled": true,
            "useOfficialCli": true
          },
          "ingest": {
            "autoCompile": true,
            "maxConcurrentJobs": 1,
            "allowUrlIngest": true
          },
          "search": {
            "backend": "shared",
            "corpus": "all"
          },
          "context": {
            "includeCompiledDigestPrompt": false
          },
          "render": {
            "preserveHumanBlocks": true,
            "createBacklinks": true,
            "createDashboards": true
          },
          "unsafeLocal": {
            "paths": [],
            "allowPrivateMemoryCoreAccess": false
          },
          "bridge": {
            "enabled": true,
            "readMemoryArtifacts": true,
            "indexDreamReports": true,
            "indexDailyNotes": true,
            "indexMemoryRoot": true,
            "followMemoryEvents": true
          }
        }
      },

and

  "memory": {
    "backend": "qmd",
    "citations": "auto"
  },

and

  "plugins": {
    "enabled": true,
    "allow": [
      "lossless-claw",
      "memory-core",
      "memory-wiki",
      "active-memory"
    ],
    "slots": {
      "memory": "memory-core",
      "contextEngine": "lossless-claw"
    },
    "entries": {
      "active-memory": {
        "enabled": true,
        "config": {
          "agents": [
            "main"
          ],
          "allowedChatTypes": [
            "direct"
          ],
          "queryMode": "recent",
          "promptStyle": "balanced",
          "timeoutMs": 15000,
          "maxSummaryChars": 220,
          "persistTranscripts": false,
          "logging": true,
          "enabled": true,
          "modelFallback": "openai-codex/gpt-5.4-mini"
        }
      },

and

      "memory-core": {
        "enabled": true,
        "config": {
          "dreaming": {
            "enabled": true,
            "frequency": "0 3 * * *",
            "timezone": "America/New_York"
          }
        }
      },

and

      "memorySearch": {
        "sources": [
          "memory"
        ],
        "experimental": {
          "sessionMemory": false
        },
        "query": {
          "hybrid": {
            "enabled": true,
            "vectorWeight": 0.7,
            "textWeight": 0.3,
            "mmr": {
              "enabled": true,
              "lambda": 0.7
            },
            "temporalDecay": {
              "enabled": true,
              "halfLifeDays": 30
            }
          }
        },
        "cache": {
          "enabled": true
        },
        "enabled": true,
        "extraPaths": [
          "/Users/REDACTED/.openclaw/workspace/.learnings",
          "/Users/REDACTED/.openclaw/workspace/granola-sync",
          "/Users/REDACTED/Personal Vault"
        ],
        "provider": "openai",
        "fallback": "gemini"
      },
      "contextPruning": {
        "mode": "cache-ttl",
        "ttl": "1h",
        "keepLastAssistants": 3
      },
      "compaction": {
        "mode": "safeguard",
        "reserveTokensFloor": 20000,
        "memoryFlush": {
          "enabled": true,
          "softThresholdTokens": 4000,
          "prompt": "Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store.",
          "systemPrompt": "Session nearing compaction. Store durable memories now."
        }
      },
empty cedarBOT
#

Let me verify the docs path and then I’ll map the clean config combo for you.

#

I found one likely gotcha already: memorySearch is documented under agents.defaults.memorySearch, not top-level. I’m checking whether contextPruning and compaction belong there too so I can give you one clean working block instead of half-right fragments.

#

Assuming a recent build, the clean config shape is basically this. The big fix is that memorySearch, contextPruning, and compaction should live under agents.defaults, not at top level.

{
  memory: {
    backend: "qmd",
    citations: "auto",
    qmd: {
      includeDefaultMemory: true,
      update: {
        interval: "5m",
        debounceMs: 15000,
        onBoot: true
      },
      limits: {
        maxResults: 6,
#
        timeoutMs: 4000
      }
    }
  },

  agents: {
    defaults: {
      memorySearch: {
        enabled: true,
        sources: ["memory"],
        experimental: {
          sessionMemory: false
        },
        provider: "openai",
        fallback: "gemini",
#
        query: {
          hybrid: {
            enabled: true,
            vectorWeight: 0.7,
            textWeight: 0.3,
            mmr: {
              enabled: true,
              lambda: 0.7
            },
            temporalDecay: {
              enabled: true,
              halfLifeDays: 30
            }
          }
        },
#
        cache: {
          enabled: true
        },
        extraPaths: [
          "/Users/REDACTED/.openclaw/workspace/.learnings",
          "/Users/REDACTED/.openclaw/workspace/granola-sync",
          "/Users/REDACTED/Personal Vault"
        ]
      },

      contextPruning: {
        mode: "cache-ttl",
        ttl: "1h",
        keepLastAssistants: 3
      },
#

      compaction: {
        mode: "safeguard",
        reserveTokensFloor: 20000,
        memoryFlush: {
          enabled: true,
          softThresholdTokens: 4000,
          prompt: "Write any lasting notes to memory/YYYY-MM-DD.md; reply with the exact silent token NO_REPLY if nothing to store.",
          systemPrompt: "Session nearing compaction. Store durable memories now."
        }
      }
    }
  },

  plugins: {
#
    enabled: true,
    allow: [
      "lossless-claw",
      "memory-core",
      "memory-wiki",
      "active-memory"
    ],
    slots: {
      memory: "memory-core",
      contextEngine: "lossless-claw"
    },
    entries: {
      "lossless-claw": {
        enabled: true
      },
#

      "memory-core": {
        enabled: true,
        config: {
          dreaming: {
            enabled: true,
            frequency: "0 3 * * *",
            timezone: "America/New_York"
          }
        }
      },

      "memory-wiki": {
        enabled: true,
        config: {
#
          vaultMode: "bridge",
          vault: {
            path: "/Users/christopherallbritton/.openclaw/wiki/main",
            renderMode: "obsidian"
          },
          obsidian: {
            enabled: true,
            useOfficialCli: true
          },
          ingest: {
            autoCompile: true,
            maxConcurrentJobs: 1,
            allowUrlIngest: true
          },
          search: {
#
            backend: "shared",
            corpus: "all"
          },
          context: {
            includeCompiledDigestPrompt: false
          },
          render: {
            preserveHumanBlocks: true,
            createBacklinks: true,
            createDashboards: true
          },
          unsafeLocal: {
            paths: [],
            allowPrivateMemoryCoreAccess: false
          },
#
          bridge: {
            enabled: true,
            readMemoryArtifacts: true,
            indexDreamReports: true,
            indexDailyNotes: true,
            indexMemoryRoot: true,
            followMemoryEvents: true
          }
        }
      },

      "active-memory": {
        enabled: true,
        config: {
          enabled: true,
#
          agents: ["main"],
          allowedChatTypes: ["direct"],
          queryMode: "recent",
          promptStyle: "balanced",
          timeoutMs: 15000,
          maxSummaryChars: 220,
          persistTranscripts: false,
          logging: true
        }
      }
    }
  }
}

A few important notes:

#
  • Keep plugins.slots.memory: "memory-core" even with memory.backend: "qmd".
    memory-core is still the active memory plugin, dreaming owner, etc. QMD is the backend.

  • Your current active-memory.allowedChatTypes: ["direct"] means it will not run in Discord threads/channels.
    If you want it in threads too, use for example:

    allowedChatTypes: ["direct", "channel"]
    
  • I would get this working without active-memory.config.modelFallback first, unless you know that model ref resolves cleanly in your install.

  • If you want named QMD collections instead of plain extraPaths, use memory.qmd.paths. For your current setup, agents.defaults.memorySearch.extraPaths is fine.

Docs: