* refactor(config): consolidate media model lists * refactor(config): unify memory configuration * refactor(config): consolidate TTS ownership * refactor(config): move typing policy to agents * refactor(config): retire product-level config surfaces * refactor(config): share scoped tool policy type * chore(config): refresh generated baselines * fix(config): honor agent typing overrides * fix(config): migrate sibling config consumers * refactor(infra): keep base64url decoder private * fix(config): strip invalid legacy TTS values * chore(config): refresh rebased baseline hash * fix(doctor): route legacy messages.tts.realtime voice to talk during tts move * refactor(config): polish final layout names * refactor(config): freeze retired tuning defaults * feat(config): add fast mode default symmetry * refactor(config): key agent entries by id * docs(config): update final layout reference * test(config): cover final layout migrations * chore(config): refresh final layout baselines * fix(config): align final layout runtime readers * fix(config): align remaining readers * fix(config): stabilize final layout migrations * fix(config): finalize config projection proof * fix(config): address final layout review * docs(release): preserve historical config names * fix(config): complete keyed agent migration * fix(config): close final migration gaps * fix(config): finish full-branch review * fix(config): complete runtime secret detection * fix(config): close final review findings * fix(config): finish canonical docs and heartbeat migration * fix(config): integrate latest main after rebase * refactor(env): isolate test-only controls * refactor(env): isolate build and development controls * refactor(env): collapse process identity indirection * refactor(env): remove duplicate config and temp aliases * docs(env): define the operator-facing allowlist * ci(env): ratchet production variable count * fix(env): remove stale provider helper import * fix(env): make ratchet sorting explicit * test(env): keep test seam in dead-code audit * test(env): cover ratchet growth and boundary; document surface budgets * docs(config): document tier-eval consolidations * docs(config): clarify speech preference ownership * test(memory): align retired tuning fixtures * refactor(memory): freeze engine heuristics * refactor(config): apply tier-eval tranche * refactor(tts): move persona shaping to providers * refactor(compaction): move prompt policy to providers * test(config): align hookified prompt fixtures * chore(deadcode): classify test-only exports * chore(github): remove unused spawn helper * chore(deadcode): classify queue diagnostics * chore(deadcode): remove unused lane snapshot export * chore(plugin-sdk): ratchet consolidated surface * fix(config): integrate latest main after rebase
5.6 KiB
summary, read_when, title, sidebarTitle
| summary | read_when | title | sidebarTitle | ||||
|---|---|---|---|---|---|---|---|
| Run local GGUF text inference and memory embeddings in OpenClaw with llama.cpp |
|
llama.cpp Provider | llama.cpp Provider |
llama-cpp is the official external provider plugin for in-process local GGUF
text inference and embeddings. It registers text provider llama-cpp,
embedding provider local, and owns the node-llama-cpp native runtime.
Install it before using either local inference or local memory embeddings:
openclaw plugins install @openclaw/llama-cpp-provider
The main openclaw npm package does not include node-llama-cpp. Keeping the
native dependency in this plugin prevents normal OpenClaw npm updates from
deleting a manually installed runtime inside the OpenClaw package directory.
Local text inference
Choose Local model (llama.cpp) during interactive onboarding. OpenClaw asks before downloading the default model:
hf:bartowski/Qwen_Qwen3-4B-Instruct-2507-GGUF/Qwen_Qwen3-4B-Instruct-2507-Q4_K_M.gguf
The Qwen3 4B Instruct 2507 Q4_K_M file is about 2.5 GB. Budget roughly 3 GB of RAM for model weights, plus context and OpenClaw runtime overhead. The default context is automatically sized with an 8,192-token cap so it remains practical on 8 GB machines. Configure a larger context only when the machine has enough memory.
The onboarding discovery check is read-only. It offers llama.cpp automatically only when the default or configured GGUF file is already in the model cache; it never downloads during discovery. Ollama and LM Studio remain separate local service choices and keep their own discovery flows. Manually choosing llama.cpp is the path that prompts for the default model download.
The provider uses the GGUF model's embedded chat template and native node-llama-cpp function calling. Text streams token by token. Tool calls return to OpenClaw for execution rather than running inside node-llama-cpp.
Use another GGUF model
Add a model to models.providers.llama-cpp. Put a local path or full hf: file
URI in params.modelPath:
{
models: {
mode: "merge",
providers: {
"llama-cpp": {
baseUrl: "local://llama-cpp",
api: "openai-completions",
params: {
modelCacheDir: "~/.node-llama-cpp/models",
},
models: [
{
id: "my-local-model",
name: "My local GGUF",
reasoning: false,
input: ["text"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 8192,
maxTokens: 2048,
params: {
modelPath: "~/Models/my-model.Q4_K_M.gguf",
contextSize: 8192,
},
compat: { supportsTools: true },
},
],
},
},
},
agents: {
defaults: {
model: { primary: "llama-cpp/my-local-model" },
},
},
}
Inference never downloads a missing model implicitly. For a custom hf: URI,
download the GGUF into modelCacheDir first. Discovery uses node-llama-cpp's
own read-only cache resolver, including repository, branch, and split-file naming.
Memory embedding configuration
Set memory.search.provider to local:
{
memory: {
search: {
provider: "local",
local: {
modelPath: "hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf",
},
},
},
}
local.modelPath defaults to the hf: URI shown above (embeddinggemma-300m-qat-Q8_0.gguf).
Point it at a different hf: URI or a local .gguf file to use another
model. local.modelCacheDir overrides where downloaded models are cached
(default: ~/.node-llama-cpp/models), and local.contextSize accepts an
integer or "auto".
When local.contextSize is numeric, the provider also gives that requirement
to node-llama-cpp's automatic GPU-layer placement. This lets node-llama-cpp fit
the model and embedding context together while retaining its memory-safety
checks. With "auto", node-llama-cpp keeps its normal automatic placement.
Native runtime
Use Node 24 for the smoothest native install path. Source checkouts using pnpm may need to approve and rebuild the native dependency:
pnpm approve-builds
pnpm rebuild node-llama-cpp
Memory runtime diagnostics
Run openclaw memory status --deep after the provider has loaded to inspect
the selected backend and build, device names, GPU offloaded layers, requested
context size, and the last observed VRAM or unified-memory snapshot. The VRAM
values include an observation timestamp because passive status reads do not
reload the model or poll the device.
The same last-known facts can appear in openclaw doctor when the running
Gateway has already used the local provider. A normal status or doctor command
does not load a model just to collect diagnostics.
Troubleshooting
If node-llama-cpp is missing or fails to load, OpenClaw reports the failure
with:
- Install the plugin:
openclaw plugins install @openclaw/llama-cpp-provider. - Use Node 24 for native installs/updates.
- From a pnpm source checkout:
pnpm approve-builds, thenpnpm rebuild node-llama-cpp.
For local inference without an in-process native dependency, use the Ollama or
LM Studio provider instead. For lower-friction local embeddings, set
memory.search.provider to a remote embedding provider such as lmstudio,
ollama, openai, or voyage instead.