Skip to content

[Bug]: Empty assistant turn (thinking-only, no text, no toolCall) recorded as finalStatus="success" → user sees generic "Something went wrong" error #82394

@jonhartman

Description

@jonhartman

Bug type

Behavior bug (incorrect output/state without crash)

Beta release blocker

No

Summary

Summary

When the model returns a turn containing only a thinking content block (empty text, no toolCall) and stopReason: "stop", OpenClaw records the turn as finalStatus: "success" and emits zero visible content to the channel. The user sees the generic fallback:

⚠️ Something went wrong while processing your request. Please try again, or use /new to start a fresh session.

The trajectory file shows the run as successful, which makes this hard to diagnose from logs alone.

Environment

  • OpenClaw version: 2026.5.3-1 (gitSha 8c56752)
  • Node: v22.22.2
  • OS: Linux 6.1.166-197.305.amzn2023.x86_64 (x64) — Amazon Linux 2023
  • Provider/Model: amazon-bedrock / openai.gpt-oss-120b-1:0
  • Model API: bedrock-converse-stream
  • Channel: Telegram (direct)
  • Reasoning/Thinking config: thinkLevel: "off", reasoningLevel: "off", fastMode: false

Reproduction

  1. Configure agent with amazon-bedrock/openai.gpt-oss-120b-1:0 as default model, reasoning off.
  2. Send via Telegram direct message: I will be returning a car to Boston Logan International Airport find out what bus information I need to take to get to terminal B and how I do that
  3. Observe: user receives the generic "Something went wrong" fallback.
  4. Retry the same prompt — fails identically (reproduced 2x within ~90s on this host).

Expected behavior

Either:

  • The model produces visible text or a proper toolCall, or
  • OpenClaw detects the empty-output condition and surfaces a specific error / triggers a retry / falls back, instead of marking the turn success and emitting the generic fallback.

Actual behavior (data from *.trajectory.jsonl)

Two affected sessions, identical pattern:

Session ID Started Ended Duration finalStatus
bb443ce4-243e-4127-8d1b-9eeb05b8f9ce 2026-05-14T19:52:17.942Z 2026-05-14T19:52:23.004Z ~5s success
4b43ead6-72a2-463d-a0f0-034a746cd895 2026-05-14T19:53:56.352Z 2026-05-14T19:53:57.763Z ~1.4s success

Final assistant message content array (both sessions):

[
  {"type":"text","text":""},
  {"type":"thinking","thinking":"<model reasoning about calling web_search>","thinkingSignature":""}
]

Relevant fields from model.completed / trace.artifacts:


stopReason: "stop" (not error, not toolUse)
assistantTexts: []
toolMetas: []
didSendViaMessagingTool: false
aborted: false, timedOut: false, idleTimedOut: false, promptErrorSource: null
usage: 141 output tokens (session 1), 83 output tokens (session 2) — all consumed by the thinking block
finalStatus: "success" ← surfaced as success despite zero deliverable content

Notably, the corresponding session .jsonl files were never written — only the .trajectory.jsonl files exist for these two runs. A later success on the same prompt (session 3a5760f4-..., 2026-05-15T14:21:12Z) did write a .jsonl.


Two distinct issues here

Model side: Despite reasoningLevel: "off" in OpenClaw config, the model emitted only thinking content. Either OpenClaw isn't translating "off" into the correct Bedrock Converse API parameter, or openai.gpt-oss-120b-1:0 on Bedrock doesn't honor that flag. (Cannot determine which without the outbound request payload.)

OpenClaw side (this issue's primary ask): Regardless of model behavior, the runtime should detect "turn has empty visible text AND no tool call" and:

Retry, or
Surface a specific actionable error (e.g., "model returned no visible content"), or
Fall back to a configured secondary model
…rather than marking the run success and letting the channel emit the generic fallback.


Suggested fix surface area

Wherever finalStatus is computed for a model turn (likely in the runtime that produces model.completed / trace.artifacts), add a check: if assistantTexts is empty AND toolMetas is empty AND stopReason === "stop", treat the turn as a failed/empty completion and route to retry/fallback/error instead of success.
Consider also: ensure .jsonl session file is flushed even when the turn produces no visible content, so debugging is easier.

### Steps to reproduce

Send above telegram message. The subsequent error is received every time.

### Expected behavior

The web_search tool should be called and the results remitted via the agent.

### Actual behavior

Please reference summary

### OpenClaw version

Unknown (have since upgraded)

### Operating system

AWS Linux 2023

### Install method

npm

### Model

amazon‑bedrock / openai.gpt‑oss‑120b‑1:0

### Provider / routing chain

Telegram -> OpenClaw

### Additional provider/model setup details

_No response_

### Logs, screenshots, and evidence

```shell

Impact and severity

No response

Additional information

No response

Metadata

Metadata

Assignees

Labels

P2Normal backlog priority with limited blast radius.bugSomething isn't workingclawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.impact:auth-providerAuth, provider routing, model choice, or SecretRef resolution may break.impact:message-lossChannel message delivery can be lost, duplicated, or misrouted.

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions