#plugin.entries webSearch

1 messages · Page 1 of 1 (latest)

mental dragon
#

I'm seeing the following error in the logs:
error gateway {"subsystem":"gateway"} request handler failed: Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix".

OpenClaw version 2026.4.14 (323493f)

I have run openclaw doctor --fix but the error remains.

tawdry oracleBOT
last daggerBOT
#

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

worldly gardenBOT
#

Yep, that error means there is still legacy provider config sitting under tools.web.search.

I checked the docs and the migration code. doctor --fix is supposed to move things like:

  • tools.web.search.apiKeyplugins.entries.brave.config.webSearch.apiKey
  • tools.web.search.grok.*plugins.entries.xai.config.webSearch.*
  • tools.web.search.kimi.*plugins.entries.moonshot.config.webSearch.*
  • tools.web.search.gemini.*plugins.entries.google.config.webSearch.*

The two most common reasons it still happens are:

  1. the CLI fixed a different config file than the gateway is actually using
  2. there is still a leftover provider block under tools.web.search

Can you run these and paste the redacted output?

#
openclaw config file
openclaw config get tools.web.search --json
openclaw config validate --json

If tools.web.search still contains apiKey or provider objects like brave, grok, kimi, gemini, firecrawl, etc, that is the problem. Those need to live under plugins.entries.<plugin>.config.webSearch instead.

Example:

// old
tools: {
  web: {
    search: {
      provider: "grok",
#
      grok: { apiKey: "..." }
    }
  }
}

// new
tools: {
  web: {
    search: {
      provider: "grok"
    }
  }
},
plugins: {
  entries: {
#
    xai: {
      enabled: true,
      config: {
        webSearch: { apiKey: "..." }
      }
    }
  }
}

After fixing it, restart the gateway:

openclaw gateway restart
mental dragon
#

claw@clawserv:~$ openclaw config file

🦞 OpenClaw 2026.4.14 (323493f) — Say "stop" and I'll stop—say "ship" and we'll both learn a lesson.

~/.openclaw/openclaw.json
claw@clawserv:~$ openclaw config get tools.web.search --json
{
"enabled": true
}
claw@clawserv:~$ openclaw config validate --json
{"valid":true,"path":"/home/claw/.openclaw/openclaw.json"}

worldly gardenBOT
#

Nice, that narrows it down a lot.

tools.web.search = { enabled: true } is valid, so the gateway is not unhappy with the current saved config file.

I checked the source, and that exact log can also happen on a config write request (config.set / config.apply), not just on startup. So the likely situation is:

  1. your live config is clean
  2. some client is still sending an old raw config payload with legacy tools.web.search.<provider> fields

Most likely culprits:

  • a stale Control/Dashboard tab that loaded config before doctor --fix
  • another tool/automation doing config writes
  • an included/split config file that still has the old path

A couple quick checks:

#
rg -n 'tools\.web\.search(\.|\s*:)' ~/.openclaw/openclaw.json

If you use split config / includes, search those files too.

Also, if this happens when using the Control UI, I’d try:

  • close the config page
  • reopen / hard refresh
  • then save again

Because config validate --json is clean, I’m leaning more toward stale client payload than a bad gateway config.

Two useful follow-ups:

  1. What action triggers the log line?
    For example, opening Control UI, clicking Save, plugin toggle, etc.
#
  1. Paste 10 to 20 lines around the error from the gateway log.
    If it’s coming from a write path, the surrounding lines usually make that obvious.

Config docs: https://docs.openclaw.ai/cli/config

If you want, paste the surrounding log lines and I’ll help pin down which request is sending the stale config.

mental dragon
#

rg found no results. I've been trying to disable skills that I don't use, it seems to happen when I disable a skill. also, seems like the disabling is not sticking.

14:54:01-04:00 error gateway {"subsystem":"gateway"} request handler failed: Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix".
14:54:01-04:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✗ skills.update 93ms errorCode=UNAVAILABLE errorMessage=Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix". conn=23c3e395…a0e4 id=b5911f0e…2896

worldly gardenBOT
#

Ah, that explains the weirdness.

Because the failing RPC is skills.update, the skill toggle itself is not the root problem. The config write is failing, so the disable never gets persisted, which is why it doesn’t stick.

I checked the code path. skills.update writes skills.entries.<skillKey>, but the write layer can still reject the save if it sees a legacy raw config source for web search. That also explains why:

  • openclaw config validate --json says valid
  • but skills.update still blows up with the legacy tools.web.search error

That usually means one of these:

  1. there is an included / split config file somewhere under ~/.openclaw
  2. or this is a real bug in 2026.4.14 in the write path

I’d check recursively, not just the root file:

#
rg -n 'tools\.web\.search|\$include' ~/.openclaw

If that shows an include, inspect that file too. My hunch is the stale web-search block is hiding there.

Why this happens:

  • read path has a compatibility shim for old web-search config
  • write path is stricter
  • skills.update hits the write path, so it fails even though plain validation looks clean

If the recursive rg still finds nothing at all, then I think this is bug-worthy. I’d file it with exactly this evidence:

  • openclaw config validate --json passes
  • skills.update fails
  • skill toggles don’t persist
  • error mentions legacy tools.web.search
#

Issues: https://github.com/openclaw/openclaw/issues

Temporary workaround, if you just want the toggle to stick now: edit ~/.openclaw/openclaw.json manually under skills.entries.<skillKey>.enabled, then restart:

openclaw gateway restart

If you want, paste the recursive rg output and I’ll help narrow down whether it’s an include vs an actual bug.

mental dragon
#

rg recursive only found a hit in a session file.

worldly gardenBOT
#

Got it. If the only recursive hit is a session file, I’d treat that as a red herring.

At this point, I think you’ve probably hit a real skills.update / config-write bug in 2026.4.14, not an actually bad live config.

Why I’m saying that:

  • openclaw config validate --json passes
  • tools.web.search looked clean
  • recursive search didn’t find legacy config in ~/.openclaw
  • the failure is specifically on skills.update
  • the skill toggle not sticking matches the write failing before persist

So the short version is: the disable action is failing during save, which is why it keeps bouncing back.

Workaround for now

Edit the skill flag directly in ~/.openclaw/openclaw.json under:

#
skills: {
  entries: {
    "<skillKey>": {
      enabled: false
    }
  }
}

Then restart:

openclaw gateway restart

I’d file this as a bug

#

Please open an issue here:
https://github.com/openclaw/openclaw/issues

I’d include this repro summary:

  • OpenClaw 2026.4.14 (323493f)
  • openclaw config validate --json returns valid
  • openclaw config get tools.web.search --json shows only { "enabled": true }
  • recursive rg under ~/.openclaw only finds tools.web.search in a session file
  • disabling a skill triggers skills.update
  • gateway logs:
    • request handler failed: Error: Config validation failed: tools.web.search...
    • res ✗ skills.update ...
  • skill disable does not persist

Docs:
https://docs.openclaw.ai/cli/config

mental dragon
#

I updated to latest version,

still failing. yes, help me write up the issue for posting.
21:17:11-04:00 error gateway {"subsystem":"gateway"} request handler failed: Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix".
21:17:11-04:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✗ skills.update 119ms errorCode=UNAVAILABLE errorMessage=Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix". conn=b89a2394…e5ca id=88ed9a05…01c6

#

claw@clawserv:~/.openclaw/cron/instructions$ openclaw --version
OpenClaw 2026.4.15 (041266a)

worldly gardenBOT
#

Yep, if it still reproduces on latest, I’d file it. I can’t post it for you, but here’s a clean draft you can paste into GitHub:

Title
skills.update fails with legacy tools.web.search validation error even though config validates cleanly

Body

## Summary

Disabling a skill fails via `skills.update` with this error:

```text
Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix".

This happens even though the active config validates cleanly and tools.web.search does not appear to contain legacy provider-owned config.

#

## Version

- OpenClaw: `<paste exact output of openclaw --version here>`

## What I checked

- Ran `openclaw doctor --fix`
- Checked active config file with:
  ```bash
  openclaw config file

Output:

~/.openclaw/openclaw.json
#

- Checked `tools.web.search`:
  ```bash
  openclaw config get tools.web.search --json

Output:

{
  "enabled": true
}
  • Validated config:
    openclaw config validate --json
#
  Output indicated the config is valid.

- Searched recursively under `~/.openclaw` for `tools.web.search`
  - Only hit was in a session file, not the active config.

- Updated to latest version and reproduced again.

## Reproduction

1. Open the Skills UI / settings surface that triggers `skills.update`
2. Disable a skill
3. Save/apply the change
4. The change does not stick
5. Gateway logs show `skills.update` failing with the legacy `tools.web.search` validation error
#
## Expected behavior

Disabling a skill should persist successfully, and unrelated web-search legacy validation should not block `skills.update`.

## Actual behavior

The skill toggle does not persist, and the gateway logs:

```text
21:17:11-04:00 error gateway {"subsystem":"gateway"} request handler failed: Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix".
21:17:11-04:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✗ skills.update 119ms errorCode=UNAVAILABLE errorMessage=Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix". conn=b89a2394…e5ca id=88ed9a05…01c6

Notes

#
This looks like either:

- `skills.update` is hitting a stricter config write path than `config validate`
- or some legacy web-search check is being triggered incorrectly during unrelated skill config writes

Happy to provide more logs if needed.

If you want, paste your exact new version string and I’ll tighten the draft one last time before you post it.

#

Perfect, I’d update the draft to this exact version:

Version

- OpenClaw: `2026.4.15 (041266a)`

Here’s the tightened final version to paste:

## Summary

Disabling a skill fails via `skills.update` with this error:

```text
Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix".
#

This still reproduces on `OpenClaw 2026.4.15 (041266a)` even though the active config validates cleanly and `tools.web.search` does not appear to contain legacy provider-owned config.

## Version

- OpenClaw: `2026.4.15 (041266a)`

## What I checked

- Ran `openclaw doctor --fix`
- `openclaw config file` points to:
  ```text
  ~/.openclaw/openclaw.json
  • openclaw config get tools.web.search --json returns:
#

{
"enabled": true
}

- `openclaw config validate --json` reports the config as valid
- Recursive search under `~/.openclaw` for `tools.web.search` only found a session file, not the active config
- Updated to latest available version and reproduced again

## Reproduction

1. Open the Skills UI / settings surface that triggers `skills.update`
2. Disable a skill
3. Save/apply the change
4. The change does not stick
5. Gateway logs show `skills.update` failing with the legacy `tools.web.search` validation error
#
## Expected behavior

Disabling a skill should persist successfully, and unrelated web-search legacy validation should not block `skills.update`.

## Actual behavior

The skill toggle does not persist, and the gateway logs:

```text
21:17:11-04:00 error gateway {"subsystem":"gateway"} request handler failed: Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix".
21:17:11-04:00 info gateway/ws {"subsystem":"gateway/ws"} ⇄ res ✗ skills.update 119ms errorCode=UNAVAILABLE errorMessage=Error: Config validation failed: tools.web.search: tools.web.search provider-owned config moved to plugins.entries.<plugin>.config.webSearch. Run "openclaw doctor --fix". conn=b89a2394…e5ca id=88ed9a05…01c6

Notes

#
This looks like either:

- `skills.update` is hitting a stricter config write path than `config validate`
- or legacy web-search validation is being triggered incorrectly during unrelated skill config writes

I think that’s solid enough to post.