0G providers report refusals such as an unfunded sub-account in the body of an
HTTP 200, so raise_for_status() passes and the transcript came back empty. A
robot that has no funds and a robot that heard nothing were indistinguishable:
both produced silence with no explanation.
Both the transcription and chat clients now inspect the response body and raise
ZeroGRequestError, which the realtime layer forwards to the app as an error
event carrying the provider's own remediation command.
Verified against the live unfunded whisper provider: the insufficient-balance
message now reaches the client as a provider_refused error event.