Таблицы

Таблица в Flow — это прямоугольник из строк и колонок, приехавший из CSV-файла или листа Excel. Четырнадцать нод умеют его читать, фильтровать, соединять, группировать и класть обратно в файл. Базы данных здесь нет: таблица считается внутри запуска, в памяти, и исчезает вместе с ним.

Сами ноды доступны на бесплатном тарифе, но регулярная обработка выгрузок — нет: запуск по расписанию и по вебхуку работает только на платном, а на бесплатном весь запуск обязан уложиться в 120 секунд и один загружаемый файл не может быть больше 10 МБ. Точные значения обоих тарифов — в лимитах.

Порт «таблица»

У портов df-нод объявлен тип данных dataframe. По ребру едет вся таблица целиком, а не строка за строкой: группировка, сортировка и соединение определены на всём наборе строк сразу, поэтому «поток строк» им попросту не подошёл бы — ноду всё равно пришлось бы ждать, пока приедет последняя строка.

Отсюда два следствия, которые видно сразу.

Ходить по строкам таблица не даёт. Чтобы обработать каждую строку по отдельности — например, отправить по письму на строку, — таблицу сначала переводят в список объектов нодой convert, а список уже скармливают циклу.

В журнале лежит превью, а не таблица. Живая таблица существует только в памяти запуска; в историю запусков, в SSE-поток и на панель Результат уходит снимок: имена колонок, типы, размер вида 12480×7 и первые 50 строк. Это сделано, чтобы таблица на сотню мегабайт не поехала в базу по копии на каждом шаге — см. таймауты и бюджеты.

Откуда берутся файлы

Из файлового хранилища воркспейса — того же, где лежат вложения чата и всё, что вы загрузили руками во вкладке «Файлы». По умолчанию df-ноды читают и пишут хранилище своего воркспейса, и порт хранилища у них даже не нарисован: в конфигурации достаточно указать путь и, если надо, подпапку. Порт появляется, только когда вы переключаете источник подключения на внешний — тогда рядом ставится нода-хранилище, и тот же граф начинает работать с чужим диском по WebDAV.

Путь — шаблон, поэтому reports/{{ variables.session_id }}.csv даёт по файлу на сессию.

Конвейер

Вход
Читать CSV
DF: фильтр строк
DF: группировка
Записать XLSX
Выход
  • Исполнение
  • Исполнение + данные
Прочитать выгрузку, отфильтровать строки, свести по группам, записать результат обратно в хранилище.

Ноды чтения запускаются обычным ребром запуска, а всем остальным вход с таблицей служит одновременно и триггером: пришла таблица — нода отработала. Поэтому конвейер выглядит цепочкой без единой развилки, и порядок шагов в нём — это буквально порядок операций.

Последняя нода в цепочке возвращает уже не таблицу, а отчёт о записи: путь, сколько байт и сколько строк записано. Его удобно отдать в 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. Таблицы при этом остаются на сервере — модель получает короткий хендл и передаёт его следующему инструменту, а не таскает данные через свой контекст.