Download any Rent Manager report.
Format selection rules — IMPORTANT:
• **PDF is the default for downloads.** If the user says "download
the report", "send me the report", "give me a copy of X",
"I want X for my records", or any similar phrasing without
naming a format → leave ``format`` unset (defaults to pdf).
• **For ANY Excel-related request, use ``xls`` (NOT xlsx).** This
includes: "Excel file", "spreadsheet", "in Excel", ".xls",
"Microsoft Excel", "give me an XLS", "Excel version", and any
similar phrasing. Rent Manager renders xls with much nicer
formatting (column widths, headers, group totals) than xlsx,
so xls is the preferred Excel format for this product.
• **Only use ``xlsx`` when the user explicitly types "xlsx"** —
e.g. "download the P&L as xlsx" or "give me the .xlsx file".
Any other Excel phrasing → xls.
• ``csv`` (or json / txt / html / xml) only when the user wants
to *see* the data in chat — those small text formats are
inlined into the response so the model can read them directly.
Phrasings like "show me", "display", "what's in X", "summarize
X" → csv.
Available formats: ``pdf`` (default), ``xls``, ``xlsx``, ``excel``
(alias → xls), ``spreadsheet`` (alias → xls), ``csv``, ``json``,
``txt``, ``html``, ``xml``.
Output behavior by format:
• **csv / json / txt / html / xml** — small files (≤1 MiB) are
ALSO inlined in the response so the model can read the contents
directly.
• **pdf / xlsx / xls** — saved to the per-tenant file store and
returned as a signed ``/files/<id>?sig=...`` URL the user can
click directly in chat.
For analytical questions prefer the ``analyze_*`` wrappers — they're
faster and return computed answers directly. For any P&L / Profit and
Loss / T12 request use ``analyze_pl_trend`` (12-month recap report,
the default P&L view).
Custom ReportWriter reports: set ``report_writer=True`` to download a
custom report from RM's ReportWriter (the IDs shown as kind "rw" in
``list_reports(live=True)``). These live in a separate ID namespace that
collides with the canned reports, so the flag is required to disambiguate.
They carry their own saved filters and run portfolio-wide; pass any ad-hoc
parameters via ``extra_params``. (The ``start_date``/``end_date``/
``property_id``/``portfolio`` scoping args do NOT apply to ReportWriter
reports.)