Hmbown/CodeWhale · error
Antigravity cloud-code stream ended without a text part
Error message
Antigravity cloud-code stream ended without a text part
What it means
The Antigravity cloud-code stream finished (EOF or `[DONE]`) but no text part was ever extracted — `started` stayed false, so no MessageStart was emitted. The client yields this error instead of fabricating an empty assistant message, so callers cannot mistake an empty completion for a successful one.
Source
Thrown at crates/tui/src/client/cloud_code.rs:271
});
yield Ok(StreamEvent::ContentBlockStart {
index: 0,
content_block: ContentBlockStart::Text {
text: String::new(),
},
});
}
yield Ok(StreamEvent::ContentBlockDelta {
index: 0,
delta: Delta::TextDelta { text },
});
}
}
if started {
yield Ok(StreamEvent::ContentBlockStop { index: 0 });
yield Ok(StreamEvent::MessageStop);
} else {
yield Err(anyhow::anyhow!(
"Antigravity cloud-code stream ended without a text part"
));
}
};
Ok(Box::pin(stream))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::models::{Message, MessageRequest, SystemBlock, SystemPrompt};
fn text_request(model: &str, prompt: &str) -> MessageRequest {
MessageRequest {
model: model.to_string(),
messages: vec![Message {
role: "user".to_string(),View on GitHub (pinned to 8880682c63)
Solutions
- Retry the request — empty completions are typically transient
- If deterministic, simplify the prompt to check whether the route produces any text
- Capture the raw frames and report them so the extractor can be extended if a real text part went unmapped
Defensive patterns
Strategy: retry
Type guard
fn is_empty_cloud_code_stream(err: &anyhow::Error) -> bool {
err.to_string().contains("ended without a text part")
} Try / catch
match stream.next().await {
Some(Err(e)) if is_empty_cloud_code_stream(&e) => {
backoff_retry().await; // empty completions are usually transient
}
Some(Err(e)) => return Err(e),
other => { /* forward */ }
} Prevention
- Retry empty completions once before treating them as a route failure
- Do not accept an empty assistant turn as success — the guard exists to prevent that
- Capture raw frames if a route is deterministically textless, and report them
When it happens
Trigger: The provider returned only non-text frames (thought/usage/metadata events, empty candidates) for the whole turn; a transient empty completion; the model produced a response whose parts the extractor does not recognize.
Common situations: Very short or refused completions; route hiccups returning wrapper frames with no content; prompts that elicit tool-only or empty responses.
Related errors
- Antigravity cloud-code is stream-only; blocking create_messa
- Stream read error: {e}
- SSE stream idle timeout after {}s — no data received (bytes_
- {err}
- Antigravity cloud-code SSE is not JSON: {err}
AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16).
Data as JSON: /api/errors/900827775f8a10a3.
Report an issue: GitHub.