Таблицы
Таблица в Flow — это прямоугольник из строк и колонок, приехавший из CSV-файла или листа Excel. Четырнадцать нод умеют его читать, фильтровать, соединять, группировать и класть обратно в файл. Базы данных здесь нет: таблица считается внутри запуска, в памяти, и исчезает вместе с ним.
Сами ноды доступны на бесплатном тарифе, но регулярная обработка выгрузок — нет: запуск по расписанию и по вебхуку работает только на платном, а на бесплатном весь запуск обязан уложиться в 120 секунд и один загружаемый файл не может быть больше 10 МБ. Точные значения обоих тарифов — в лимитах.
Порт «таблица»
У портов df-нод объявлен тип данных dataframe. По ребру едет вся
таблица целиком, а не строка за строкой: группировка, сортировка и соединение определены
на всём наборе строк сразу, поэтому «поток строк» им попросту не подошёл бы — ноду всё
равно пришлось бы ждать, пока приедет последняя строка.
Отсюда два следствия, которые видно сразу.
Ходить по строкам таблица не даёт. Чтобы обработать каждую строку по отдельности — например, отправить по письму на строку, — таблицу сначала переводят в список объектов нодой convert, а список уже скармливают циклу.
В журнале лежит превью, а не таблица. Живая таблица существует только в памяти
запуска; в историю запусков, в SSE-поток и на панель Результат
уходит снимок: имена колонок, типы, размер вида 12480×7 и первые 50 строк. Это сделано,
чтобы таблица на сотню мегабайт не поехала в базу по копии на каждом шаге —
см. таймауты и бюджеты.
Откуда берутся файлы
Из файлового хранилища воркспейса — того же, где лежат вложения чата и всё, что вы загрузили руками во вкладке «Файлы». По умолчанию df-ноды читают и пишут хранилище своего воркспейса, и порт хранилища у них даже не нарисован: в конфигурации достаточно указать путь и, если надо, подпапку. Порт появляется, только когда вы переключаете источник подключения на внешний — тогда рядом ставится нода-хранилище, и тот же граф начинает работать с чужим диском по WebDAV.
Путь — шаблон, поэтому reports/{{ variables.session_id }}.csv даёт по файлу на сессию.
Конвейер
- Исполнение
- Исполнение + данные
Ноды чтения запускаются обычным ребром запуска, а всем остальным вход с таблицей служит одновременно и триггером: пришла таблица — нода отработала. Поэтому конвейер выглядит цепочкой без единой развилки, и порядок шагов в нём — это буквально порядок операций.
Последняя нода в цепочке возвращает уже не таблицу, а отчёт о записи: путь, сколько байт и сколько строк записано. Его удобно отдать в exit или подставить в текст ответа.
Все четырнадцать нод
| Нода | Что делает | Что возвращает |
|---|---|---|
| df_read_csv | Читает CSV из хранилища: разделитель, кодировка, номер строки заголовка, лимит строк | Таблицу |
| df_read_xlsx | Читает лист книги xlsx — по имени или по номеру (0 = первый) | Таблицу |
| df_query | Оставляет строки, подходящие под выражение: revenue > 1000 and country == 'DE' | Таблицу |
| df_select | Выбирает, переименовывает и выбрасывает колонки | Таблицу |
| df_sort | Сортирует по одной или нескольким колонкам, каждая — по возрастанию или убыванию | Таблицу |
| df_groupby_agg | Группирует по колонкам и считает агрегаты: sum, mean, min, max, count, nunique, first, last, std, median | Таблицу: строка на группу |
| df_merge | Соединяет две таблицы по общим ключам: inner, left, right, outer, cross | Таблицу |
| df_concat | Склеивает две таблицы по строкам (одна под другой) или по колонкам (бок о бок) | Таблицу |
| df_drop_duplicates | Убирает повторы по набору колонок; оставить можно первое или последнее вхождение | Таблицу |
| df_update | Присваивает значения колонкам в строках, попавших под условие; пустое условие — все строки | Таблицу |
| convert | Переводит json, csv и dataframe друг в друга | Значение выбранного типа |
| df_write_csv | Записывает таблицу в CSV, перезаписывая файл целиком | Путь, байты, число строк |
| df_write_xlsx | Записывает таблицу в лист xlsx, перезаписывая файл целиком | Путь, байты, число строк |
| dataframe_tool | Отдаёт агенту десять инструментов над таблицами | Не шаг графа: подключается к агенту |
Поля каждой ноды, её порты и пример графа — на странице справочника.
Конвертация: единственный явный способ
convert — это шаг графа со своим временем и своей ошибкой, и в этом
его смысл: конвертацию видно на холсте. Зарегистрированы четыре направления:
json → dataframe, dataframe → json, dataframe → csv, csv → dataframe. Пары
csv ↔ json среди них нет — она собирается из двух нод через dataframe, и редактор
скажет об этом до запуска, а не в середине.
Таблица и коллекция — разные вещи
Их легко перепутать: и то и другое похоже на таблицу с колонками. Разница в сроке жизни.
- Таблица живёт внутри запуска. Она приезжает из файла, проходит цепочку нод и
исчезает, когда запуск закончился. Единственный способ её сохранить — записать в файл
нодой
df_write_csvилиdf_write_xlsx. - Коллекция документов переживает запуск. Это хранилище воркспейса: следующий запуск увидит то, что записал предыдущий, документы можно выбирать по полям и редактировать руками в интерфейсе.
Правило простое: разовая обработка файла — таблица; данные, которые должны быть на месте завтра, — коллекция. Смысловой поиск по тексту — вообще база знаний.
Границы
- Размер файла. У чтения и записи есть потолок в байтах: по умолчанию 25 МиБ на чтение и 50 МиБ на запись. Поле лежит в разделе Дополнительно и уменьшается, но не увеличивается — потолок и есть максимум.
- Время. Нода не может работать дольше 600 секунд, а весь запуск ограничен тарифом (на бесплатном — 120 секунд). Разбор большой выгрузки упирается в это раньше, чем в память; см. таймауты и бюджеты.
- Место. Записанный файл считается в квоту файлового хранилища владельца — общую на все его воркспейсы.
- Отказы. Недоступное хранилище, битый CSV, отсутствующая колонка — это ошибка ноды, а
не пустая таблица: запуск падает, если вы не нарисовали ветку
on_error. Про то, как её нарисовать, — в обработке ошибок.
Таблицы в руках агента
dataframe_tool подключается к агенту и даёт модели десять инструментов: загрузить CSV или лист xlsx, посмотреть схему и выборку, отфильтровать, выбрать колонки, соединить, сгруппировать, выгрузить в JSON, сохранить в CSV или xlsx. Таблицы при этом остаются на сервере — модель получает короткий хендл и передаёт его следующему инструменту, а не таскает данные через свой контекст.