# Generate file

Rend une valeur du run en PDF, CSV, XLSX, HTML, TXT ou Markdown et renvoie une URL signée de téléchargement.

## Vue d'ensemble

Generate file prend une valeur du contexte (par défaut `last_output`), la rend dans le format demandé, la persiste en stockage et écrit une URL signée éphémère dans `ctx.file_url`. Le nœud suivant peut la poster où que ce soit — message Slack, webhook HTTP, réponse API — sans accéder aux octets du fichier. Quand le nœud suivant est **Send Email**, le fichier est attaché automatiquement par défaut au lieu d'envoyer seulement le lien.

Règles de rendu :

| Format | Forme attendue | Moteur |
| --- | --- | --- |
| `pdf` | Markdown / texte | Markdown → HTML → WeasyPrint |
| `html` | Markdown / texte | Markdown → HTML stylé |
| `markdown` | Tout texte | Fichier UTF-8 |
| `txt` | Tout texte | Fichier UTF-8 |
| `csv` | Tableau de dicts ou chaîne CSV brute | DictWriter |
| `excel` (`.xlsx`) | Tableau de dicts ou CSV brut | openpyxl |

Le nœud expose aussi `ctx.last_output_parsed` = `{format, filename, size_bytes, url, preview_url, public_id}` pour les nœuds aval qui veulent plus que l'URL.

## Configuration

| Champ | Description |
| --- | --- |
| `format` | `pdf`, `html`, `markdown`, `txt`, `csv`, `excel`. Défaut `pdf`. |
| `filename` | Template, défaut `report-{ts}`. `{ts}` = horodatage UTC `YYYYMMDD-HHMMSS`. Extension ajoutée automatiquement. |
| `inputField` | Clé du contexte à rendre. Défaut `last_output`. Pointez une clé d'état (`report_data`) pour piocher autre chose. |
| `label` | Label optionnel, stocké en métadonnée. |

## Exemple

Rapport mensuel PDF envoyé aux ops :

```
Agent (rédige le rapport en markdown)
  → Generate file (format: pdf, filename: ops-report-{ts})
  → Send Email (fichier attaché automatiquement)
```

Export CSV :

```
Agent (renvoie un tableau JSON de dicts) → Generate file (format: csv, filename: leads-{ts})
```

## Pièges

- Les URLs signées sont éphémères. Ne les stockez pas — régénérez si besoin (la ligne fichier reste en base).
- En CSV/Excel, `inputField` **doit** être un tableau de dicts (clés homogènes) ou une chaîne CSV brute. Un Markdown libre lèvera une erreur.
- Le rendu PDF passe par WeasyPrint et supporte du Markdown basique (tables, code, titres). CSS complexe ou images ne s'affichent pas — restez sobre.
- `{ts}` est le seul token natif du filename. Utilisez **Set state** + template pour injecter autre chose (`order-{order_id}`).
- Les fichiers sont rattachés au propriétaire du workflow. Les URLs signées cross-compte sont rejetées.

---

*Source: https://agentbuilder.systalink.sn/docs/node-generate-file — human documentation.*
*Other language: [/docs-md/en/node-generate-file.md](/docs-md/en/node-generate-file.md).*
*Machine-readable index: [/llms.txt](/llms.txt).*
