> ## Documentation Index
> Fetch the complete documentation index at: https://docs.riggery.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Files extract

> Прочитать таблицы из файла на этом Instance. Шаг отдаёт сводку; импорт берёт тот же ID файла.

**Files extract** читает таблицы из одного файла, который уже лежит на этом Instance (загрузка, Telegram, почта, webhook или агент). Строка каталога: извлечь таблицы из файла.

**Смотреть результаты** — markdown-**сводка**, не все строки. Таблицы остаются у файла. В State их кладёт [State import from file](/ru/graph/tools/state-import-from-file) с **тем же ID файла**.

Входящие CSV/XLSX могут сразу попасть в State на триггере: [Входящие файлы](/ru/graph/triggers#inbound-files).

<h2 id="how">
  Как выполняется
</h2>

<Steps>
  <Step title="Разобрать ID файла">
    Один непрозрачный id. См. [ID файла](#file-id).
  </Step>

  <Step title="Найти таблицы">
    CSV и XLSX: одна таблица на лист, в этом шаге. PDF: Docling; шаг ждёт до **Ожидание (мс)**.
  </Step>

  <Step title="Записать сводку">
    Статус, счётчики, необязательные warning/error, короткий **Sample**, при наличии **Document text**. Тот же **ID файла** позже переиспользует извлечение. Если в сводке всё ещё queued или running — запустите снова или увеличьте **Ожидание (мс)**.
  </Step>
</Steps>

<h2 id="input">
  Вход
</h2>

Вкладка инспектора **Настройки**. Правила пустого поля на графе: [Предыдущие узлы](/ru/graph/previous-nodes). **Вставить значение** здесь нет; `{{…}}` можно вписать руками.

У инструмента на агенте оба поля могут быть **Решает агент** или **Фиксировано**. На узле графа значения вводите вы.

| Поле              | Обязательно | Пустое                | Заметки                                                                                       |
| ----------------- | ----------- | --------------------- | --------------------------------------------------------------------------------------------- |
| **ID файла**      | Да          | Ошибка                | Непрозрачный id файла Instance. Не имя файла. [Подробнее](#file-id).                          |
| **Ожидание (мс)** | Нет         | По умолчанию: `90000` | Сколько ждать, пока извлечение PDF ещё идёт. 1000–300000. CSV/XLSX заканчиваются в этом шаге. |

<h3 id="file-id">
  ID файла
</h3>

Пустое поле **не** берёт Result предыдущего узла — узел падает. Ребро [Files list](/ru/graph/tools/files-list) без заполненного поля тоже падает: Result списка — каталог, не один id.

Нужен id файла Instance, `id` в массиве [Photos / Files](/ru/graph/previous-nodes#attachments) или `artifactId` в сводке этого шага. Не имя файла (`rates.csv`), не целиком **Message: Files** / **Photos** (JSON-массив), не markdown Result этого шага.

**Решает агент:** модель может взять id из Files list или вложений этого хода. **Фиксировано** / граф: вставьте один id или подстановку, которая раскрывается **только** в этот id (например `{{Input}}`, если тестовый ввод — сам id).

<h2 id="output">
  Выход
</h2>

На следующем узле **Предыдущие узлы** показывает **`Files extract`: Result** (`{{Files extract.text}}`, пока имя уникально).

| Выход   | В меню | Тип            | Следующий узел получит                                                                                                                             |
| ------- | ------ | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| Result  | Да     | Markdown-текст | Сводка.                                                                                                                                            |
| Таблицы | Нет    | —              | Лежат у файла. [State import from file](/ru/graph/tools/state-import-from-file) читает их по тому же **ID файла**, не по `{{Files extract.text}}`. |

```md theme={null}
## Extract ready

- artifactId: cmtzo4vku002vaxpvc1p9irxo
- name: "rates.csv"
- engine: tabular
- tables: 1
- rows: 42
- markdownChars: 0

Next: state.import_from_file with artifactId=cmtzo4vku002vaxpvc1p9irxo and a collection name.

### Sample
```

`engine`: `tabular` (CSV/XLSX) или `docling` (PDF).

| Сводка начинается с             | Значение                                                                            |
| ------------------------------- | ----------------------------------------------------------------------------------- |
| `## Extract ready`              | Таблицы у файла. Импорт берёт `artifactId`.                                         |
| `## Extract queued` / `running` | Ещё работает; вызовите снова с тем же id или увеличьте **Ожидание (мс)**.           |
| `## Extract failed`             | Строка `error:`. Исправьте файл и повторите.                                        |
| **No tables found**             | Проза: [Memory upload](/ru/graph/tools/memory-upload). Не выдумывайте строки State. |

**Document text** — проза без таблиц в сводке. Прочитайте перед маппингом записей. **Sample** — несколько строк на таблицу, те же колонки, что запишет импорт. Не копируйте их в [State upsert](/ru/graph/tools/state-upsert).

<h2 id="next">
  После этого шага
</h2>

**Files extract** → **State import from file** (**Коллекция**, **Заменить коллекцию**). Сценарий: [Таблицы в State](/ru/journeys/tables).
