Gateway
Skills and model providers
Skill symlink skipped as path escape
Use when logs include:
Skipping escaped skill path outside its configured root: ... reason=symlink-escapeEvery skill root is a containment boundary. A symlink under ~/.agents/skills, <workspace>/.agents/skills, <workspace>/skills, or ~/.openclaw/skills is skipped when its real target resolves outside that root, unless the target is explicitly trusted.
Inspect the link:
ls -l ~/.agents/skills/<name>realpath ~/.agents/skills/<name>openclaw config get skills.loadIf the target is intentional, configure both the direct skill root and the allowed symlink target:
{ skills: { load: { extraDirs: ["~/path/to/skills"], allowSymlinkTargets: ["~/path/to/skills"], }, },}Then start a new session or wait for the skills watcher to refresh. Restart the gateway if the running process predates the config change.
Do not use broad targets such as ~, /, or a whole synced project folder. Keep allowSymlinkTargets scoped to the real skill root that contains trusted SKILL.md directories.
Skill Workshop does not use these trusted discovery targets. It writes only
inside the active agent's <state-dir>/agents/<agentId>/agent/workshop-skills.
Related:
Anthropic 429 extra usage required for long context
Use when logs/errors include: HTTP 429: rate_limit_error: Extra usage is required for long context requests.
openclaw logs --followopenclaw models statusopenclaw config get agents.defaults.modelsLook for:
- Selected Anthropic model is a GA-capable 1M Claude 4.x model (Opus 4.6/4.7/4.8, Sonnet 4.6), or the model config still carries legacy
params.context1m: true. - Current Anthropic credential is not eligible for long-context usage.
- Requests fail only on long sessions/model runs that need the 1M context path.
Fix options:
Use a standard context window
Switch to a standard-window model, or remove legacy context1m from older
model config that is not GA-capable for 1M context.
Use an eligible credential
Use an Anthropic credential that is eligible for long-context requests, or switch to an Anthropic API key.
Configure fallback models
Configure fallback models so runs continue when Anthropic long-context requests are rejected.
Related:
Upstream 403 blocked responses
Use when an upstream LLM provider returns a generic 403 such as Your request was blocked.
Do not assume this is always an OpenClaw configuration issue. The response can come from an upstream security layer such as a CDN, WAF, bot-management rule, or reverse proxy in front of an OpenAI-compatible endpoint.
openclaw statusopenclaw gateway statusopenclaw logs --followLook for:
- Multiple models under the same provider failing the same way.
- HTML or generic security text instead of a normal provider API error.
- Provider-side security events for the same request time.
- A tiny direct
curlprobe succeeding while normal SDK-shaped requests fail.
Fix the provider-side filtering first when evidence points to a WAF/CDN block. Prefer a narrowly scoped allow or skip rule for the API path OpenClaw uses, and avoid disabling protection for the whole site.
Related:
Local OpenAI-compatible backend passes direct probes but agent runs fail
Use when:
curl ... /v1/modelsworks.- Tiny direct
/v1/chat/completionscalls work. - OpenClaw model runs fail only on normal agent turns.
curl http://127.0.0.1:1234/v1/modelscurl http://127.0.0.1:1234/v1/chat/completions \ -H 'content-type: application/json' \ -d '{"model":"<id>","messages":[{"role":"user","content":"hi"}],"stream":false}'openclaw infer model run --model <provider/model> --prompt "hi" --jsonopenclaw logs --followLook for:
- Direct tiny calls succeed, but OpenClaw runs fail only on larger prompts.
model_not_foundor 404 errors even though direct/v1/chat/completionsworks with the same bare model id.- Backend errors about
messages[].contentexpecting a string. - Intermittent
incomplete turn detected ... stopReason=stop payloads=0warnings with an OpenAI-compatible local backend. - Backend crashes that appear only with larger prompt-token counts or full agent runtime prompts.
Common signatures
model_not_foundwith a local MLX/vLLM-style server: verifybaseUrlincludes/v1,apiis"openai-completions"for/v1/chat/completionsbackends, andmodels.providers.<provider>.models[].idis the bare provider-local id. Select it with the provider prefix once, for examplemlx/mlx-community/Qwen3-30B-A3B-6bit; keep the catalog entry asmlx-community/Qwen3-30B-A3B-6bit.messages[...].content: invalid type: sequence, expected a string: backend rejects structured Chat Completions content parts. Fix: setmodels.providers.<provider>.models[].compat.requiresStringContent: true.validation.keysor allowed message keys like["role","content"]: backend rejects OpenAI-style replay metadata on Chat Completions messages. Fix: setmodels.providers.<provider>.models[].compat.strictMessageKeys: true.incomplete turn detected ... stopReason=stop payloads=0: the backend completed the Chat Completions request but returned no user-visible assistant text for that turn. OpenClaw retries replay-safe empty OpenAI-compatible turns once; persistent failures usually mean the backend is emitting empty/non-text content or suppressing final-answer text.- Direct tiny requests succeed, but OpenClaw agent runs fail with backend/model crashes (for example Gemma on some
llama-serverbuilds behindllmman): OpenClaw transport is likely already correct; the backend is failing on the larger agent-runtime prompt shape. - Failures shrink after disabling tools but do not disappear: tool schemas were part of the pressure, but the remaining issue is still upstream model/server capacity or a backend bug.
Fix options
- Set
compat.requiresStringContent: truefor string-only Chat Completions backends. - Set
compat.strictMessageKeys: truefor strict Chat Completions backends that only acceptroleandcontenton each message. - Set
compat.supportsTools: falsefor models/backends that cannot handle OpenClaw's tool schema surface reliably. - Lower prompt pressure where possible: smaller workspace bootstrap, shorter session history, lighter local model, or a backend with stronger long-context support.
- If tiny direct requests keep passing while OpenClaw agent turns still crash inside the backend, treat it as an upstream server/model limitation and file a repro there with the accepted payload shape.
Related: