[DGX Spark][Agent&Skills] agent does not auto-invoke web_search on a natural prompt with the default local model (qwen3.6:35b, progressive tool disclosure)
- Dominant language
- TypeScript
- Stars
- 22.5k
- Forks
- 3.1k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 715
Description
## Description
On a DGX Spark using the default local model (Ollama qwen3.6:35b) under the default progressive tool disclosure, the OpenClaw agent does **not** automatically invoke the `web_search` tool when given a natural-language "search the web" instruction — it answers from the model's training knowledge instead (and explicitly states it cannot access web search). The web-search plumbing is fully correct: the `brave` policy preset is applied, egress to `api.search.brave.com` works, and `web_search` returns real results when it is explicitly forced. The gap is that the default Spark local model does not reliably **choose** to call `web_search` on natural language, so the web-search skill is effectively unusable via ordinary prompts for a Spark user on the default configuration.
This is an enhancement request for the default DGX Spark experience (the primary demo path), not a plumbing defect.
**Platform scope:** Reproduced on DGX Spark (GB10, aarch64) with the default local model (Ollama qwen3.6:35b, progressive tool disclosure). The same test on a strong cloud model (Nemotron-3-Super-120B) DID auto-invoke `web_search` on the identical natural prompt — so the gap is tied to the default local-model config and is expected on other weak local-model setups.
**Regression:** Unknown — not a regression; a default-config UX gap.
## Environment
```text
Device: DGX Spark (GB10, aarch64)
OS: Ubuntu 24.04 (DGX Spark 7.5.0)
Architecture: aarch64
Node.js: v22.23.1
npm: 10.9.8
Docker: 29.2.1
OpenShell CLI: 0.0.85
NemoClaw: v0.0.89
OpenClaw: 2026.6.10
```
## Steps to Reproduce
1. On a DGX Spark, onboard an OpenClaw sandbox on the default local model (Ollama qwen3.6:35b), enabling Brave web search (enter a Brave Search API key at the web-search step). Confirm the brave preset is applied:
```bash
nemoclaw {sandbox} policy-list # -> "brave [from balanced tier]" shown as applied
```
2. Give the agent a **natural** "search the web" prompt:
```bash
nemoclaw {sandbox} exec -- openclaw agent --session-id s1 \
-m "What is NVIDIA NemoClaw? Search the web and give me a summary."
```
3. Observe the response.
4. For comparison, force an explicit tool call:
```bash
nemoclaw {sandbox} exec -- openclaw agent --session-id s2 \
-m "Use tool_call to invoke web_search with query 'NVIDIA NemoClaw GitHub'. Report the real titles and URLs."
```
## Expected Result
On the default DGX Spark configuration, a natural "search the web" instruction reliably triggers the `web_search` tool and the agent returns a summary built from real search results — without the user needing to know how to force an explicit `tool_call`.
Possible directions (enhancement): default to `--tool-disclosure=direct` on Spark so the model does not have to discover-then-call the tool; and/or ship a stronger default tool-calling local model; and/or add a system-prompt nudge that maps web-search intents to the `web_search` tool.
## Actual Result
**Step 2 (natural prompt)** — the agent does NOT call `web_search`; it answers from training knowledge:
```text
"Based on the system context ... I CAN'T ACCESS WEB SEARCH RESULTS to confirm from external sources."
(the answer is full of "appears to be" / "likely" — inferred, not searched)
```
When told "call web_search now" the model confuses `web_search` with `tool_search` (the progressive tool-discovery tool) and queries the tool catalog for the phrase instead of searching the web -> `[]`.
The `web_search` tool IS present and discoverable:
```text
tool_search "web search" -> web_search: "Search web for current info; returns normalized provider results."
```
**Step 4 (explicitly forced tool_call)** — `web_search` works and returns REAL Brave results:
```text
1. GitHub - NVIDIA/NemoClaw ... https://github.com/NVIDIA/NemoClaw
2. GitHub - NVIDIA/nemoclaw-community ... https://github.com/NVIDIA/nemoclaw-community
5. NVIDIA NemoClaw: Deploy Safer AI ... https://www.nvidia.com/en-us/ai/nemoclaw/
```
(Brave API key valid, egress to `api.search.brave.com` works, results are real.)
## Logs
```text
# Natural prompt (default Spark local model qwen3.6:35b) — no web_search call:
"... I can't access web search results to confirm from external sources ..."
# Forced tool_call — web_search returns real data:
web_search(query="NVIDIA NemoClaw GitHub") ->
https://github.com/NVIDIA/NemoClaw , https://www.nvidia.com/en-us/ai/nemoclaw/ , ...
# Contrast: on a strong cloud model (Nemotron-3-Super-120B) the SAME natural prompt auto-invoked
# web_search (Brave API GET api.search.brave.com/res/v1/web/search confirmed ALLOWED in OCSF logs).
# Related (prior, closed): #2733 — "Tool-call reliability: detect/document Ollama tool-call-leak
# failure mode and recommend vLLM with parser flag for tool-calling agents." Related theme, but this
# report is specifically web_search NOT auto-invoking on a natural prompt with the default Spark
# local model + progressive tool disclosure.
```
Contributor guide
Research direction
Start with the DGX Spark onboarding path and the default progressive tool-disclosure configuration, then reproduce the natural-prompt and forced-tool_call commands described here. Compare behavior with the strong cloud model and inspect how web_search is exposed to the default local model. Done means the default Spark experience reliably invokes web_search for a natural web-search request without requiring an explicit tool_call.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- node.js, ollama, typescript, ubuntu
- Domain
- ai, tooling
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100