Skip to content

[Bug]: Webchat UI shows nothing when Anthropic provider returns billing error — gateway decides surface_error but client never renders it #70124

@kr4bat

Description

@kr4bat

Bug type

Crash (process/app exits or hangs)

Beta release blocker

No

Summary

When the Anthropic provider rejects a request with invalid_request_error
("Your credit balance is too low to access the Anthropic API"), the gateway
correctly detects this and makes the decision surface_error with
reason=billing. However, the webchat control-ui client shows no error,
no message, no indication of failure — the UI just sits as if the request
is still in flight.

This is the opposite failure mode of #13935 (where a billing error is
shown inappropriately) and a UI-specific variant of #24622 (gateway hang
on billing error).

Environment

  • OpenClaw: ghcr.io/openclaw/openclaw:latest (Docker)
  • Deployment: docker compose, gateway container openclaw-openclaw-gateway-1
  • Webchat client: openclaw-control-ui webchat v2026.4.21
  • Host: Ubuntu 20.04
  • Provider: anthropic (API key, credit-depleted account for repro)
  • Model tested: anthropic/claude-haiku-4-5-20251001
    (also reproducible with anthropic/claude-opus-4-7)

Steps to reproduce

  1. Configure an Anthropic provider with an API key whose credit balance is zero.
  2. Open the webchat UI, send any message.
  3. Observe: no response, no error, no indication of failure in the UI.

Expected behavior

The webchat UI should render the provider error (or at minimum a generic
"provider rejected request — check gateway logs" message) so the operator
knows to check billing. The gateway's own log line
decision=surface_error reason=billing suggests the backend intended
to surface this to the client.

Actual behavior

UI shows nothing. Gateway log contains the full error but it never reaches
the webchat client.

OpenClaw version

2026.4.21

Operating system

Ubuntu 20.04 LTS (host); gateway runs inside Docker container

Install method

Docker Compose; image ghcr.io/openclaw/openclaw:latest pulled from GHCR. Config at /data/backup/docker-work/openclaw/ on host, mounted to /home/node/.openclaw/openclaw.json in container.

Model

claude47 / anthropic/claude-haiku-4-5-20251001 (also reproduced with anthropic/claude-opus-4-7)

Provider / routing chain

webchat (openclaw-control-ui webchat v2026.4.21) → gateway container (openclaw-openclaw-gateway-1) on host port 18789 → [agent/embedded] runtime → anthropic provider (direct, no intermediate proxy/router) → api.anthropic.com

Additional provider/model setup details

  • Anthropic provider configured directly with API key (no OpenRouter, no LiteLLM, no other router in path).
  • Auth profile: sha256:154a23a3efe6 (from gateway log).
  • Reasoning: off (agents.defaults.thinkingDefault=off).
  • No fallback models configured for the agent — the run hits exactly one provider and surfaces the error rather than failing over.
  • Repro account: Anthropic API key with zero remaining credit balance,
    which causes the API to return HTTP 400 with
    type=invalid_request_error, message="Your credit balance is too low..."
  • Model switching was done via a helper script (oc-ai-switch.sh preset "haiku45")
    which edits openclaw.json and restarts the gateway container;
    the bug reproduces identically regardless of which model string is active,
    since the failure is at the provider-auth layer before model dispatch.

Logs, screenshots, and evidence

Here's the "Logs, screenshots, and evidence" block for the issue form:
markdown

## Gateway log — relevant excerpt

Host: `docker logs openclaw-openclaw-gateway-1`, filtered to the failing run.
API key on purpose has zero credit balance (account under test) to repro.

2026-04-22T09:18:20.212+00:00 [gateway] agent model: anthropic/claude-haiku-4-5-20251001 2026-04-22T09:18:20.213+00:00 [gateway] ready (5 plugins: acpx, browser, device-pair, phone-control, talk-voice; 4.5s)

2026-04-22T09:41:29.171+00:00 [agent/embedded] embedded run agent end: runId=010f1588-6c76-4750-a215-bee3dbfb8ad9 isError=true model=claude-haiku-4-5-20251001 provider=anthropic error=LLM request rejected: Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits. rawError=400 {"type":"error","error":{"type":"invalid_request_error", "message":"Your credit balance is too low to access the Anthropic API. ..."}}

2026-04-22T09:41:34.326+00:00 [agent/embedded] auth profile failure state updated: runId=010f1588-6c76-4750-a215-bee3dbfb8ad9 profile=sha256:154a23a3efe6 provider=anthropic reason=billing window=disabled reused=false

2026-04-22T09:41:34.334+00:00 [agent/embedded] embedded run failover decision: runId=010f1588-6c76-4750-a215-bee3dbfb8ad9 stage=assistant decision=surface_error reason=billing from=anthropic/claude-haiku-4-5-20251001 profile=sha256:154a23a3efe6

2026-04-22T09:41:34.885+00:00 [ws] webchat disconnected code=1001 reason=n/a conn=233db546-38c7-4ba4-9c74-c1c618571942

2026-04-22T09:41:35.266+00:00 [ws] webchat connected conn=c2430169-1c5a-4061-9f0e-9f5d9ef8a52a remote=172.18.0.1 client=openclaw-control-ui webchat v2026.4.21


Reproduced twice in the same session (runIds `010f1588-…` and `895220f9-…`)
with identical `decision=surface_error reason=billing` outcome. In both
cases the webchat UI showed nothing — no error banner, no message,
no indication that the request had failed.

## Image / build evidence

$ docker inspect ghcr.io/openclaw/openclaw:latest
--format '{{index .Config.Labels "org.opencontainers.image.version"}}' 2026.4.21

$ docker inspect ghcr.io/openclaw/openclaw:latest
--format '{{index .Config.Labels "org.opencontainers.image.revision"}}' f788c88b4c508c335336fb292afed8c900656d6d

$ docker inspect ghcr.io/openclaw/openclaw:latest --format '{{index .RepoDigests 0}}' ghcr.io/openclaw/openclaw@sha256:01325e7d5c0e273d9f3495fd39b8b811c28b120be4dbe5acee0e12a433e3d2a2


Image created: `2026-04-22T02:30:45Z`
Base: `docker.io/library/node:24-bookworm`
  (digest `sha256:3a09aa6354567619221ef6c45a5051b671f953f0a1924d1f819ffb236e520e6b`)

## Container health at time of repro

$ docker ps --filter name=openclaw-openclaw-gateway CONTAINER ID IMAGE STATUS PORTS f5886a21f89f ghcr.io/openclaw/openclaw:latest Up 29 minutes (healthy) 0.0.0.0:18789-18790->18789-18790/tcp


Container reports healthy throughout — this is not a crash or startup
problem, it is a client-surfacing gap.

## Config at time of repro

$ docker exec openclaw-openclaw-gateway-1
cat /home/node/.openclaw/openclaw.json | grep -E '"model"|thinkingDefault' "model": { "thinkingDefault": "off"


## Screenshots

No screenshot attached — there is nothing visible to capture. The webchat
message input accepts the prompt, the UI shows no spinner, no error, no
response. From the operator's perspective the UI is indistinguishable
from an idle state after sending a message. Happy to record a short screen
capture on request.

Impact and severity

No response

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingbug:crashProcess/app exits unexpectedly or hangs

    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