docs/concepts/experimental-features.md
Experimental features in OpenClaw are opt-in preview surfaces. They are behind explicit flags because they still need real-world mileage before they deserve a stable default or a long-lived public contract.
Treat them differently from normal config:
| Surface | Key | Use it when | More |
|---|---|---|---|
| Local model runtime | agents.defaults.experimental.localModelLean, agents.list[].experimental.localModelLean | A smaller or stricter local backend chokes on OpenClaw's full default tool surface | Local Models |
| Memory search | agents.defaults.memorySearch.experimental.sessionMemory | You want memory_search to index prior session transcripts and accept the extra storage/indexing cost | Memory configuration reference |
| Codex harness | plugins.entries.codex.config.appServer.experimental.sandboxExecServer | You want native Codex app-server 0.132.0 or newer to target an OpenClaw sandbox-backed exec-server instead of disabling Code Mode | Codex harness reference |
| Structured planning tool | tools.experimental.planTool | You want the structured update_plan tool exposed for multi-step work tracking in compatible runtimes and UIs | Gateway configuration reference |
agents.defaults.experimental.localModelLean: true is a pressure-release valve for weaker local-model setups. When it is on, OpenClaw drops three default tools — browser, cron, and message — from the agent's tool surface for every turn. It also defaults that run to structured Tool Search controls when tools.toolSearch is not explicitly configured, so larger plugin, MCP, or client tool catalogs stay behind tool_search, tool_describe, and tool_call instead of being dumped into the prompt. Runs that require direct message delivery keep that tool direct instead of enabling the lean-mode Tool Search default. Use agents.list[].experimental.localModelLean to enable or disable the same behavior for one configured agent.
These three tools have the largest descriptions and the most parameter shapes in the default OpenClaw runtime. On a small-context or stricter OpenAI-compatible backend that is the difference between:
Removing them does not silently rewire OpenClaw — it just makes the direct tool list shorter. The model still has read, write, edit, exec, apply_patch, web search/fetch (when configured), memory, and session/agent tools available. Extra catalogs remain callable through Tool Search unless you explicitly set tools.toolSearch: false.
Enable lean mode when you have already proved the model can talk to the Gateway but full agent turns misbehave. The typical signal chain is:
openclaw infer model run --gateway --model <ref> --prompt "Reply with exactly: pong" succeeds.localModelLean: true clears the failure.If your backend handles the full default runtime cleanly, leave this off. Lean mode is a workaround, not a default. It exists because some local stacks need a smaller tool surface to behave; hosted models and well-resourced local rigs do not.
Lean mode also does not replace tools.profile, tools.allow/tools.deny, or the model compat.supportsTools: false escape hatch. If you need a permanent narrower tool surface for a specific agent, prefer those stable knobs over the experimental flag.
If you already tune Tool Search globally, OpenClaw leaves that operator config alone. Set tools.toolSearch: false to opt out of the lean-mode Tool Search default.
{
agents: {
defaults: {
experimental: {
localModelLean: true,
},
},
},
}
For one agent only:
{
agents: {
list: [
{
id: "local",
model: "lmstudio/gemma-4-e4b-it",
experimental: {
localModelLean: true,
},
},
],
},
}
Restart the Gateway after changing the flag, then confirm the trimmed tool list with:
openclaw status --deep
The deep status output lists the active agent tools; browser, cron, and message should be absent when lean mode is on unless the current delivery mode forces direct message replies.
If a feature is experimental, OpenClaw should say so plainly in docs and in the config path itself. What it should not do is smuggle preview behavior into a stable-looking default knob and pretend that is normal. That's how config surfaces get messy.