#Web_search accessibility issues

1 messages · Page 1 of 1 (latest)

fervent widget
#

Hey all — following up on my earlier thread about the embedded agent timeout issue.

Quick update: I've made some progress. The timeout with Anthropic is still present (same bug as before), but I've switched to Grok (xai/grok-3) as my provider and that's working fine.

New issue I've run into: web_search isn't appearing in the agent's available toolkit, even though it's configured correctly.

Here's my setup:
• tools.web.search.enabled = true
• tools.web.search.provider = perplexity
• tools.profile = full
• Perplexity API key is set and the API is reachable from Node.js
• openclaw config get tools.web.search.enabled returns true

When I ask the agent what tools it has available, web_search isn't listed. It falls back to web_fetch instead.

Anything I'm missing to get web_search exposed to the agent? Is there an additional config step required beyond setting the provider and API key?

Also flagging a separate issue while I'm here: the Telegram provider hardcodes dnsResultOrder=ipv4first, which breaks connectivity for anyone whose ISP blocks IPv4 to api.telegram.org (mine does — curl connects fine via IPv6 but Node/undici gets ECONNRESET on IPv4). Would be great to have a config option to prefer IPv6 or disable the hardcoded override.

Happy to provide logs or config dumps for either issue. Thanks!

raw pelicanBOT
#

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

analog siloBOT
#

web_search not showing is almost always tool policy filtering, not the web provider config.

1) Check you’re not accidentally allowlisting tools (and forgetting web_search)

Even with tools.profile: "full", if you set any tools.allow (global or per-agent / per-provider), it becomes the gate.

Fix is to include web_search (or just group:web):

{
  tools: {
    // profile: "full", // fine either way
    allow: ["group:web"], // expands to web_search + web_fetch
    // or: allow: ["web_search", "web_fetch"]
  },
}
#

Also check you didn’t deny it somewhere:

  • tools.deny / agents.*.tools.deny
  • tools.byProvider["xai"]... / agents.*.tools.byProvider... (easy to forget)

Docs: https://docs.openclaw.ai/tools (see “Tool profiles” + group:web)

2) Perplexity key location (common gotcha)

For Perplexity, the key is not tools.web.search.apiKey (that one is Brave). It’s:

  • tools.web.search.perplexity.apiKey or
  • env PERPLEXITY_API_KEY / OPENROUTER_API_KEY (in the Gateway process environment)

Docs: https://docs.openclaw.ai/perplexity and https://docs.openclaw.ai/tools/web

If you paste these three, I can tell you immediately which layer is filtering it:

  • openclaw --version
#
  • openclaw config get tools.allow
  • openclaw config get tools.deny

Telegram DNS: it’s not hardcoded anymore (and there is a config knob)

There’s already:

  • channels.telegram.network.dnsResultOrder = "ipv4first" or "verbatim"
  • env override OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=...

Docs (troubleshooting section): https://docs.openclaw.ai/channels/telegram

What’s missing today is a true "ipv6first" option (schema currently only allows ipv4first|verbatim). If verbatim doesn’t solve it for your resolver, that part should be a GitHub issue request.

gray wren
#

I really wander if this is a xai issue. I cannot get it to find web_search ether.

analog siloBOT
#

Not an xAI thing in itself.

web_search is a core OpenClaw tool and it’s exposed (or not) purely based on tool policy + web tool enablement, not on whether your LLM provider is Anthropic vs xAI.

The two common reasons it “doesn’t exist” for an agent:

  1. You (or the agent) are under an allowlist that doesn’t include it

    • Any tools.allow (global), or agents.*.tools.allow, or tools.byProvider["xai"...].allow will hide tools unless explicitly allowed.
    • Fix: include web_search or group:web (which is web_search + web_fetch)
    • Docs: https://docs.openclaw.ai/tools (see group:web)
  2. Web search is disabled / not actually configured on the Gateway side

If you paste these outputs, it’ll be obvious which bucket you’re in:

#
  • openclaw --version
  • openclaw config get tools.allow
  • openclaw config get tools.byProvider
  • (and if you have an agent override) openclaw config get agents.list
gray wren
#

OpenClaw 2026.3.13 (61d171a)
Config path not found: tools.allow
Config path not found: tools.byProvider

#

Config path not found: agents.list

analog siloBOT
#

That Config path not found: ... from openclaw config get just means the key isn’t present in your config file, not that the setting doesn’t exist.

What this usually means in practice:

  • you think you’re on tools.profile: "full", but it’s probably unset → and the runtime default profile (often "coding" on local setups) does not include group:web, so web_search never gets exposed to the agent.

Try this:

openclaw config get tools.profile
  • If that also says “path not found”, you’re not actually setting it.

To force web tools on globally:

#
openclaw config set tools.profile '"full"' --strict-json

(or if you want to keep a restrictive profile and just add web tools, you can add group:web via the tool allowlist/additions in config — but the simplest “make it appear” fix is setting profile to full.)

Docs for what’s in each profile / group:web: https://docs.openclaw.ai/tools

For the Telegram DNS thing: there’s already channels.telegram.network.dnsResultOrder (ipv4first or verbatim) documented here: https://docs.openclaw.ai/channels/telegram (plus env override OPENCLAW_TELEGRAM_DNS_RESULT_ORDER). There isn’t an ipv6first mode yet; that part would be a GitHub issue request.

#

Yep — agents.list being “path not found” is totally normal if you never configured multiple agents. In that case you’re just running with agents.defaults + runtime defaults.

Same deal for tools.allow / tools.byProvider: openclaw config get … only works for keys that are actually present in your config file, not for implicit defaults.

For the web_search visibility problem, the quickest “force it on” fix (especially if you’re currently on the default "coding" tool profile) is to explicitly set:

openclaw config set tools.profile '"full"' --strict-json
openclaw gateway restart

After that, the agent should see web_search (assuming tools.web.search.enabled isn’t set to false).

If you want, paste:

  • openclaw config get tools.profile
  • openclaw config get tools.web.search
    (and if either says “path not found”, that just means it’s still relying on defaults)
gray wren
#

openclaw config get tools.profile returns full

openclaw config get tools.web.search returns

{
"enabled": true,
"provider": "brave",
"apiKey": "OPENCLAW_REDACTED"
}

analog siloBOT
#

That config dump actually explains what you’re seeing.

1) Your web search config is currently Brave, not Perplexity

You’ve got:

tools.web.search = { enabled: true, provider: "brave", apiKey: ... }

So if you meant Perplexity, you’d need:

  • tools.web.search.provider: "perplexity"
  • plus tools.web.search.perplexity.apiKey (or PERPLEXITY_API_KEY in the Gateway env)

Docs: https://docs.openclaw.ai/perplexity

2) The bigger gotcha: if your agent model provider is xAI/Grok, OpenClaw hides its own web_search tool

#

This is intentional right now. xAI/Grok providers already expose a native web_search tool on their side, and sending OpenClaw’s web_search alongside it causes duplicate tool name request failures — so OpenClaw filters web_search out when the model provider is xAI.

Net effect: with xai/grok-* as the agent model, you’ll see web_fetch, but not OpenClaw’s web_search (so your Perplexity/Brave web_search provider config won’t matter because the tool isn’t being offered to the model).

Workarounds:

  • Use a non‑xAI model for the agent if you want OpenClaw web_search (Perplexity/Brave/etc).
  • Or stick with Grok and use Grok’s built-in web search (but then it’s Grok doing the searching, not OpenClaw’s Perplexity/Brave provider).
  • If you really want “Grok brain + Perplexity web_search”, the practical route today is a second agent (non‑xAI) just for searching.

If you want this changed (e.g. OpenClaw renames its tool on xAI to avoid collisions), that’s a GitHub issue: https://github.com/openclaw/openclaw/issues

Telegram DNS note

It’s not hardcoded anymore — you can set:

  • channels.telegram.network.dnsResultOrder: "verbatim" (or env OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=verbatim)

Docs: https://docs.openclaw.ai/channels/telegram

gray wren
#

interesting, I asked my xAi model about recent events and it definatly has up to date info. where is this tidbit about web_search being hidden for xAi found?

analog siloBOT
#

It’s not a rumor — it’s in the OpenClaw source, and it’s intentional right now.

In your exact version (61d171a), OpenClaw filters out its own web_search tool whenever the model provider is xAI/Grok, because xAI already has a native tool with the same name and the request can fail with a duplicate-tool-name error.

Code (commit 61d171a):

You’ll see:

// xAI/Grok providers expose a native web_search tool; sending OpenClaw's
// web_search alongside it causes duplicate-name request failures.
return tools.filter((tool) => tool.name !== "web_search");