# Text, Markdown and labeled CSV readers accept text streams

> Agno's TextReader, MarkdownReader and FieldLabeledCSVReader now read StringIO objects and files opened in text mode. Those inputs used to return no documents.

- Published: 2026-09-16
- Author: RaycarlLei
- Categories: Changelog
- Canonical: https://www.agno.com/articles/text-markdown-and-labeled-csv-readers-accept-text-streams
- Markdown: https://www.agno.com/articles/text-markdown-and-labeled-csv-readers-accept-text-streams.md

Agno's `TextReader`, `MarkdownReader` and `FieldLabeledCSVReader` now decode only bytes and accept text as it is. They used to decode every input as bytes, so a text stream raised an error inside the reader, which caught it and handed you an empty list:

```python
from io import StringIO

from agno.knowledge.reader.text_reader import TextReader

documents = TextReader(chunk=False).read(StringIO("Refunds are processed within 5 business days."))
# Before: []
# Now: one document with the text
```

`async_read()` works the same way, with or without chunking. The readers still decode binary streams with their configured encoding, UTF-8 by default.

Learn more about [readers](https://docs.agno.com/knowledge/concepts/readers/overview), the [Markdown reader](https://docs.agno.com/knowledge/concepts/readers/markdown-reader) and the [field-labeled CSV reader](https://docs.agno.com/reference/knowledge/reader/field-labeled-csv) in the documentation.
