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.
Ante answers questions out loud with its language model running on the 0G
Compute Network instead of a hosted provider.
The conversation app is an OpenAI Realtime API client, so rather than rewrite
its conversation loop, this adds a local server that speaks the realtime
protocol and is backed by 0G. The app reaches it through two lines of .env;
its tool system, movement manager, personality system and web UI are unchanged.
The realtime API is speech-to-speech over one socket while 0G exposes ordinary
request/response models, so the server reassembles the stages behind that
interface: 0G Whisper for hearing, 0G glm-5.2 for thinking, and Piper on the
robot for speaking. Speech synthesis is local because the network has no
synthesis provider; transcription is remote because the Wireless robot's CM4
cannot run Whisper.
Signing and settlement are delegated to `0g-compute-cli inference serve`, so no
private key or single-use request header is handled here.
Reasoning is stripped before sy…