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

  1. Retry the request — empty completions are typically transient
  2. If deterministic, simplify the prompt to check whether the route produces any text
  3. 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

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


AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16). Data as JSON: /api/errors/900827775f8a10a3. Report an issue: GitHub.