Render a document (PDF / HTML / PPTX / DOCX) and save it to the workspace.
This tool has two input pipelines — pass **exactly one** of `content_html` or `content_markdown`.
# Pipeline A — `content_html` (canonical for decks, proposals, designed pages)
You author full HTML+CSS. A baked-in design-system preamble ships first
(`<style>` with Inter/Manrope as data-URI fonts, CSS-variable palette tokens,
8px spacing scale, and pre-styled layout helpers); your markup and any of
your own `<style>` blocks land after the preamble so you can override
anything. Chromium renders the assembled document into a static PDF —
JavaScript is disabled and DNS is blackholed, so external font / image /
script fetches will fail by configuration.
Required when this pipeline is used:
- `title` — human-readable, used for PDF metadata and the saved filename.
- `content_html` — the `<body>` and any custom `<style>` blocks. The
renderer wraps this in `<html>…</html>` and injects the preamble + a
canonical `<meta charset>` + `<title>`. Do NOT emit `<script>`,
`<iframe>`, `<object>`, `<embed>`, `<meta>`, `<link>`, `<base>`,
`<form>`, or event handlers — the sanitizer strips them.
- `output_type` — `"pdf"` or `"html"`. (`"pptx"` and `"docx"` require
`content_markdown` since they need structured markdown intermediates.)
Optional:
- `page_preset` — `"slide_16_9"` (default for any deck), `"a4"` (default
for flowing documents — used if omitted), `"letter"`, or `"none"` (you
declare your own `@page` rule).
- `design_tokens` — flat dict overriding the preamble's CSS variables.
Whitelisted keys: `brand_primary`, `accent`, `surface_dark` (hex color),
`font_display`, `font_body` (font name from ['Inter', 'Manrope', 'monospace', 'sans-serif', 'serif', 'system-ui', 'ui-monospace', 'ui-sans-serif', 'ui-serif']).
- `language` — BCP-47 tag (default `"en"`). Drives `<html lang>`.
## Slide structure (`page_preset="slide_16_9"`)
Each slide is `<section class="slide …">…</section>`. The base `.slide`
class is what sizes it to the viewport and forces the page break — do
not drop it. Composable variants (apply alongside `.slide`):
- `.slide-cover` — gradient hero, big display title.
- `.slide-split` — two equal columns, image + narrative.
- `.slide-stats` — three-up KPI cards (use `<div class="stat">` with
`.stat-value` + `.stat-label` inside).
- `.slide-quote` — centered pull quote + `<cite>` attribution.
Layout helpers (work in any preset): `.grid-2`, `.grid-3`, `.split`,
`.stack`, `.cluster`, `.callout`, `.muted`, `.kbd`.
## Speaker notes
`<aside class="notes">…text…</aside>` inside a `<section class="slide">`.
The sanitizer strips them from the rendered PDF and returns them as
`slide_notes[]` (parallel to slide order). Orphan notes outside any slide
are dropped with a warning.
## Images
Only these `src` schemes resolve:
- `file:NNN` — workspace `file_id`.
- `data:image/...;base64,...` — inline.
- `https://<host>` where `<host>` ∈ `DOCUMENTS_MEDIA_URL_ALLOWLIST`.
Other URLs are dropped and replaced with an HTML comment placeholder.
# Pipeline B — `content_markdown` (invoice / contract only)
Required:
- `title`, `content_markdown`, `output_type`.
Optional:
- `theme` — `"invoice"` or `"contract"`. Triggers the corresponding
exemplar styling and (for invoices) the arithmetic validator that
fail-closes on missing or mismatched totals.
- `language` — BCP-47 (default `"en"`).
# Delivery contract (CRITICAL)
After this tool returns `file_id`, deliver the file with
`messages.send(attachments=[file_id], text="<short caption>")`. Embedding
the file_id in a markdown link, `sandbox:` URL, or `/api/files/<id>/download`
text will render as plain text on the recipient's channel — the
`attachments` parameter is the only way the file actually attaches.
# Exemplars
INVOICE (English):
# Invoice INV-{YYYYMMDD-HHMMSS}
**From:** {Issuer Legal Name}, {Address}, {Tax ID}
**To:** {Customer Name}, {Customer Address}, {Customer Tax ID}
**Issue date:** {YYYY-MM-DD} **Due date:** {YYYY-MM-DD}
| Description | Qty | Unit price | Total |
|---|---:|---:|---:|
| {Service 1} | 1 | 1500.00 | 1500.00 |
| {Service 2} | 2 | 500.00 | 1000.00 |
**Subtotal:** USD 2500.00
**Tax (20%):** USD 500.00
**Total:** USD 3000.00
**Payment:** {bank details OR crypto wallet — never both}
INVOICE (Russian):
# Счёт-фактура № INV-{YYYYMMDD-HHMMSS}
**От:** {Юридическое название организации}, {Адрес}, ИНН {Tax ID}
**Кому:** {Название клиента}, {Адрес клиента}, ИНН {Tax ID}
**Дата:** {YYYY-MM-DD} **Срок оплаты:** {YYYY-MM-DD}
| Описание | Кол-во | Цена | Сумма |
|---|---:|---:|---:|
| {Услуга 1} | 1 | 1500.00 | 1500.00 |
| {Услуга 2} | 2 | 500.00 | 1000.00 |
**Подытог:** USD 2500.00
**НДС (20%):** USD 500.00
**Итого:** USD 3000.00
**Реквизиты:** {банковские реквизиты ИЛИ криптокошелёк — не оба сразу}
CONTRACT (English):
# Service Agreement
**Between:** {Provider Legal Name}, {Address} ("Provider")
**And:** {Client Legal Name}, {Address} ("Client")
**Effective date:** {YYYY-MM-DD}
## 1. Scope of services
{Concise description of what Provider agrees to deliver.}
## 2. Term
This Agreement begins on the Effective date and continues until {termination
condition or end date}.
## 3. Compensation
Client pays Provider {amount and currency} according to {payment schedule}.
## 4. Confidentiality
Both parties agree to keep proprietary information of the other party
confidential during and after the term of this Agreement.
## 5. Termination
Either party may terminate with {N} days' written notice.
## 6. Governing law
{Jurisdiction}.
---
**Provider:** ____________________ **Client:** ____________________
{Provider signatory name} {Client signatory name}
CONTRACT (Russian):
# Договор оказания услуг
**Между:** {Юридическое название Исполнителя}, {Адрес} ("Исполнитель")
**И:** {Юридическое название Заказчика}, {Адрес} ("Заказчик")
**Дата вступления в силу:** {YYYY-MM-DD}
## 1. Предмет договора
{Краткое описание услуг, которые Исполнитель обязуется оказать.}
## 2. Срок действия
Договор вступает в силу с указанной даты и действует до {условие прекращения
или дата окончания}.
## 3. Стоимость и порядок оплаты
Заказчик оплачивает услуги Исполнителя в размере {сумма и валюта} в порядке
{график платежей}.
## 4. Конфиденциальность
Стороны обязуются сохранять конфиденциальность сведений, полученных в ходе
исполнения настоящего Договора, в течение срока его действия и после его
прекращения.
## 5. Расторжение
Любая из сторон вправе расторгнуть Договор, направив письменное уведомление
не менее чем за {N} дней.
## 6. Применимое право
{Юрисдикция}.
---
**Исполнитель:** ____________________ **Заказчик:** ____________________
{ФИО подписанта Исполнителя} {ФИО подписанта Заказчика}
Connector