async fn collect_vlm_text( vlm: &VlmClient, messages: &[Message], ) -> Option<String>
Run one non-streaming VLM completion and return the full text (drains the stream). Returns None on any stream error.
None