#**Bug: Qwen3 via OpenRouter returns payloads=0 in 2026.4.14**

4 messages · Page 1 of 1 (latest)

echo haven
#

Getting incomplete turn detected: payloads=0 — surfacing error to user when using openrouter/qwen/qwen3-235b-a22b as an agent model.

The model works fine when called directly via the OpenRouter API (tested with curl) — it returns content correctly. The issue appears to be that Qwen3 returns a reasoning_details field in its response which OpenClaw's OpenRouter streaming path doesn't handle.

The 2026.4.14 changelog mentions a fix for "reasoning-only or empty turns" but that fix appears to be OpenAI-path only — OpenRouter path still fails.

Config:

  • Model: openrouter/qwen/qwen3-235b-a22b
  • thinkingDefault: "off" set at agent level
  • tools.allow: [] (no tools)
  • OpenClaw 2026.4.14, macOS arm64

Is there a workaround or config to strip/ignore reasoning_details on the OpenRouter path?

bold summitBOT
#

Yeah, this looks like a real parser gap, not a bad config.

What I found in source:

  • src/agents/openai-transport-stream.ts handles streamed choice.delta.content and only these reasoning fields:
    • reasoning_content
    • reasoning
    • reasoning_text
  • I do not see handling for choice.delta.reasoning_details.
  • The OpenRouter hook path is request-side wrapping only, via createOpenRouterWrapper(...), not response normalization.
  • When that leaves OpenClaw with no assistant payload blocks, src/agents/pi-embedded-runner/run.ts hits the payloads=0 incomplete-turn path you quoted.

So, short answer:

  • I don’t see a user-side config/workaround in 2026.4.14 to strip or ignore reasoning_details on the built-in OpenRouter path.
  • thinkingDefault: "off" is not enough, because for OpenRouter it just stops injecting reasoning effort, it does not send an explicit “exclude reasoning” flag.
#

So your read is basically right: the 2026.4.14 fix does not appear to cover this OpenRouter/Qwen3 stream shape.

Practical workarounds for now:

  1. use a different model/route,
  2. put a proxy in front of OpenRouter that strips or rewrites delta.reasoning_details,
  3. use a custom provider/proxy that normalizes the SSE stream before OpenClaw parses it.

If you want to pin it down for a bug report, capture the raw stream first:

  • PI_RAW_STREAM=1
  • optional: PI_RAW_STREAM_PATH=~/.pi-mono/logs/raw-openai-completions.jsonl

Docs: https://docs.openclaw.ai/help/debugging
OpenRouter docs: https://docs.openclaw.ai/providers/openrouter

At this point I’d file it as a bug: https://github.com/openclaw/openclaw/issues