Investigation Summary
- The model is a reasoning model: vLLM is launched with
--reasoning-parser nemotron_v3, and a direct API call returns ~130 of 149 completion tokens in the reasoning field before any content (with max_tokens: 20, content is null and finish_reason: "length").
- OpenClaw is configured as if it is not:
openclaw.json shows "reasoning": false on the model entry, and the container env shows NEMOCLAW_REASONING=false.
- The config generator supports the flag —
scripts/generate-openclaw-config.mts contains const reasoning = (env.NEMOCLAW_REASONING || "false") === "true"; and Dockerfile has ARG NEMOCLAW_REASONING=false — but passing NEMOCLAW_REASONING=true to the installer, to rebuild --yes, and to the installer with NEMOCLAW_RECREATE_SANDBOX=1 leaves the baked value unchanged in all three cases.
- Resulting failure: agent runs abort with
LLM idle timeout (120s): no response from model while logs show lastProgress=model_call:stream_progress lastProgressAge=117s — the stream is open and emitting reasoning tokens, but they are not credited as progress.
- Unknown: whether the intended path to set this on an existing sandbox is a different command/flag, and whether the idle timer is designed to ignore reasoning-token progress or this is unintended.
Description
On a local reasoning model (Nemotron 3 Super via vLLM with --reasoning-parser nemotron_v3), agent runs consistently fail with LLM idle timeout (120s): no response from model, even for simple single-tool requests such as "check my email".
The model is working correctly. A direct call to the vLLM endpoint returns a valid response quickly, but the majority of generated tokens are emitted in the reasoning field before any content appears. During an agent run the stream is open and progressing (lastProgress=model_call:stream_progress), yet the idle detector fires at 120s because no content has arrived.
The generated openclaw.json declares "reasoning": false for this model. scripts/generate-openclaw-config.mts reads NEMOCLAW_REASONING to set that value, and the Dockerfile exposes ARG NEMOCLAW_REASONING=false, but there appears to be no user-facing way to set it to true on an existing sandbox — the env var is not picked up by the installer's recovery path, by rebuild, or by recreate.
Expected: either a supported way to declare a local model as a reasoning model on an existing sandbox, or reasoning-token stream progress should reset the idle timer so runs are not aborted while the model is actively generating.
Reproduction Steps
- Onboard a sandbox on DGX Spark using a local vLLM endpoint serving a reasoning model (Nemotron 3 Super, launched with
--reasoning-parser nemotron_v3).
- Confirm the model emits reasoning before content:
curl -s http://localhost:8000/v1/chat/completions -H "Content-Type: application/json"
-d '{"model":"nemotron-3-super","messages":[{"role":"user","content":"Say hello"}],"max_tokens":20}'
→ "content": null, finish_reason: "length", all tokens in reasoning.
- Observe the generated config declares the model as non-reasoning:
ssh openshell- "cat /sandbox/.openclaw/openclaw.json | python3 -m json.tool | grep -A2 -B2 reasoning"
→ "reasoning": false
- Attempt to set the flag, in three ways:
a. Installer: NEMOCLAW_REASONING=true NEMOCLAW_INSTALL_REF=v0.0.92 ... ./nemoclaw.sh
b. Rebuild: NEMOCLAW_REASONING=true nemoclaw rebuild --yes
c. Recreate: NEMOCLAW_REASONING=true NEMOCLAW_RECREATE_SANDBOX=1 ... ./nemoclaw.sh
- After each attempt, verify it did not take:
docker inspect $(docker ps -q --filter name=openshell-) --format '{{json .Config.Env}}' | python3 -m json.tool | grep -i reasoning
→ NEMOCLAW_REASONING=false
- Send the agent any request requiring a tool call. The run aborts at 120s with
LLM idle timeout.
Environment
- Platform: NVIDIA DGX Spark (GB10, aarch64), 128GB unified memory
- Host OS: Ubuntu 24.04 / DGX OS 7.5.0, kernel 6.17.0-1021-nvidia
- GPU driver: 580.159.03, CUDA 13.0
- NemoClaw: v0.0.92
- OpenShell: 0.0.85 (docker driver)
- OpenClaw: 2026.7.1
- Node.js: v22.22.2
- Inference: vLLM v0.18.1-cu130 (Docker), serving
nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4
launched with --reasoning-parser nemotron_v3 --enable-auto-tool-choice --tool-call-parser qwen3_coder
- Relevant config:
agents.defaults.timeoutSeconds: 600, thinkingDefault: "off",
container env NEMOCLAW_MAX_TOKENS=4096, NEMOCLAW_TOOL_DISCLOSURE=progressive
- Observed generation rate: ~12 tokens/sec
Debug Output
Full nemoclaw debug --quick output available; the relevant excerpts are in the Logs section above. Happy to attach the complete tarball if useful.
Logs
### 1. Gateway declares the model as non-reasoning
2026-07-24T05:37:46.869+00:00 [gateway] agent model: inference/nemotron-3-super (thinking=off, fast=off)
### 2. But vLLM is serving it WITH a reasoning parser
~/vllm/start-super.sh:
--reasoning-parser nemotron_v3
--enable-auto-tool-choice
--tool-call-parser qwen3_coder
### 3. And the model demonstrably emits reasoning before content
$ curl -s http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" \
-d '{"model":"nemotron-3-super","messages":[{"role":"user","content":"Say hello"}],"max_tokens":20}'
"content": null,
"finish_reason": "length",
"reasoning": "We are to say hello.\n The instruction is simple: \"Say hello\"\n We'll output the string"
Same request with max_tokens=500 completes normally in 12.4s:
149 completion tokens total, ~130 emitted as `reasoning`,
content = "Hello! 👋 How can I assist you today?"
### 4. Config and container env both show reasoning disabled
$ ssh openshell-<sandbox> "cat /sandbox/.openclaw/openclaw.json | python3 -m json.tool | grep -A2 -B2 reasoning"
"id": "nemotron-3-super",
"name": "inference/nemotron-3-super",
"reasoning": false,
$ docker inspect $(docker ps -q --filter name=openshell-<sandbox>) --format '{{json .Config.Env}}' | grep -i reasoning
"NEMOCLAW_REASONING=false"
(unchanged after passing NEMOCLAW_REASONING=true to the installer,
to `rebuild --yes`, and to the installer with NEMOCLAW_RECREATE_SANDBOX=1)
### 5. Result: agent runs abort while the model is still streaming
2026-07-23T23:50:43.177 [provider-transport-fetch] [model-fetch] start provider=inference
api=openai-completions model=nemotron-3-super method=POST
url=https://inference.local/v1/chat/completions timeoutMs=undefined
2026-07-23T23:50:43.224 [provider-transport-fetch] [model-fetch] response
status=200 elapsedMs=46 contentType=text/event-stream; charset=utf-8
2026-07-23T23:53:25.630 [diagnostic] long-running session: state=processing age=145s
activeWorkKind=model_call lastProgress=model_call:stream_progress
lastProgressAge=117s recovery=none
2026-07-23T23:53:30.536 [agent/embedded] embedded run failover decision: stage=assistant
decision=surface_error reason=timeout from=inference/nemotron-3-super
rawError=LLM idle timeout (120s): no response from model
The stream opens in 46ms and is actively producing reasoning tokens,
but the idle detector fires at 120s because no `content` has arrived.
### Related (possibly separate issue): Telegram webhook management fails at startup
2026-07-24T05:37:49.635 [telegram] deleteWebhook failed: Network request for 'deleteWebhook' failed!
2026-07-24T05:37:49.639 [telegram] deleteMyCommands failed: Network request for 'deleteMyCommands' failed!
2026-07-24T05:37:49.653 [telegram] setMyCommands failed: Network request for 'setMyCommands' failed!
[telegram] [default] bridge did not start within 15s; check channels.telegram.enabled, plugin entries, and gateway log
Checklist
Investigation Summary
--reasoning-parser nemotron_v3, and a direct API call returns ~130 of 149 completion tokens in thereasoningfield before anycontent(withmax_tokens: 20,contentisnullandfinish_reason: "length").openclaw.jsonshows"reasoning": falseon the model entry, and the container env showsNEMOCLAW_REASONING=false.scripts/generate-openclaw-config.mtscontainsconst reasoning = (env.NEMOCLAW_REASONING || "false") === "true";andDockerfilehasARG NEMOCLAW_REASONING=false— but passingNEMOCLAW_REASONING=trueto the installer, torebuild --yes, and to the installer withNEMOCLAW_RECREATE_SANDBOX=1leaves the baked value unchanged in all three cases.LLM idle timeout (120s): no response from modelwhile logs showlastProgress=model_call:stream_progress lastProgressAge=117s— the stream is open and emitting reasoning tokens, but they are not credited as progress.Description
On a local reasoning model (Nemotron 3 Super via vLLM with
--reasoning-parser nemotron_v3), agent runs consistently fail withLLM idle timeout (120s): no response from model, even for simple single-tool requests such as "check my email".The model is working correctly. A direct call to the vLLM endpoint returns a valid response quickly, but the majority of generated tokens are emitted in the
reasoningfield before anycontentappears. During an agent run the stream is open and progressing (lastProgress=model_call:stream_progress), yet the idle detector fires at 120s because nocontenthas arrived.The generated
openclaw.jsondeclares"reasoning": falsefor this model.scripts/generate-openclaw-config.mtsreadsNEMOCLAW_REASONINGto set that value, and the Dockerfile exposesARG NEMOCLAW_REASONING=false, but there appears to be no user-facing way to set it totrueon an existing sandbox — the env var is not picked up by the installer's recovery path, byrebuild, or by recreate.Expected: either a supported way to declare a local model as a reasoning model on an existing sandbox, or reasoning-token stream progress should reset the idle timer so runs are not aborted while the model is actively generating.
Reproduction Steps
--reasoning-parser nemotron_v3).curl -s http://localhost:8000/v1/chat/completions -H "Content-Type: application/json"
-d '{"model":"nemotron-3-super","messages":[{"role":"user","content":"Say hello"}],"max_tokens":20}'
→
"content": null,finish_reason: "length", all tokens inreasoning.ssh openshell- "cat /sandbox/.openclaw/openclaw.json | python3 -m json.tool | grep -A2 -B2 reasoning"
→
"reasoning": falsea. Installer: NEMOCLAW_REASONING=true NEMOCLAW_INSTALL_REF=v0.0.92 ... ./nemoclaw.sh
b. Rebuild: NEMOCLAW_REASONING=true nemoclaw rebuild --yes
c. Recreate: NEMOCLAW_REASONING=true NEMOCLAW_RECREATE_SANDBOX=1 ... ./nemoclaw.sh
docker inspect $(docker ps -q --filter name=openshell-) --format '{{json .Config.Env}}' | python3 -m json.tool | grep -i reasoning
→
NEMOCLAW_REASONING=falseLLM idle timeout.Environment
nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4launched with
--reasoning-parser nemotron_v3 --enable-auto-tool-choice --tool-call-parser qwen3_coderagents.defaults.timeoutSeconds: 600,thinkingDefault: "off",container env
NEMOCLAW_MAX_TOKENS=4096,NEMOCLAW_TOOL_DISCLOSURE=progressiveDebug Output
Full nemoclaw debug --quick output available; the relevant excerpts are in the Logs section above. Happy to attach the complete tarball if useful.
Logs
Checklist