ntro.capabilities.files does that turn.
Install
The API
One public coroutine:CellGrid-shaped object with two key surfaces:
Both fields are populated by both formats. The downstream AI extraction step typically reads
plain_text and passes cells as structured_context so the model can disambiguate when layout matters.
PDF parsing — format="pdf"
Backed by pdfplumber. Best for:
- Scanned-and-OCR’d documents (invoices, statements, contracts)
- Form-style documents with key-value pairs
- Documents with tables that have visible borders
document-ingest runbook:
- The bytes come from the tenant data plane (Postgres), not the activity payload. Signals carry only the
document_refso payloads stay small. - Both
grid.cellsandgrid.plain_textflow into theRawDocumentso the next step (AI extraction) has both.
Excel parsing — format="xlsx"
Backed by openpyxl. Best for:
- Trial balances exported from Xero / SAP / Sage
- Investor registers, capital call schedules, NAV templates
- Anything where preserving sheet / cell coordinates matters
nav-monthly-journals runbook:
Choosing between cells and plain_text
When you hand the result to AI extraction, passing both as in the examples above is the safe default — it costs nothing and gives the model the most signal.
Related
Private AI
The natural next step —
ai.extract() consumes what files.parse() produces.Data
Where parsed documents typically come from (
storage.read or the data plane).