Документация

Детерминированные операторы

Узлы действий, которые обходят LLM — HTTP, БД, преобразования, вычисления.

Операторы

Оператор — это узел, который выполняет детерминированное действие: без LLM, без случайности. Для любого заданного входа вывод предсказуем.

Зачем их использовать

Любая логика, которую можно записать явно, должна быть записана явно. LLM, который «вычисляет итог» или «форматирует дату», — это анти-паттерн: он медленнее, дороже и может ошибаться.

Практическое правило: если вы можете написать функцию в 5 строк на Python — это оператор, а не agent.

Доступные типы

operator HTTP

Выполняет HTTP-вызов (REST, GraphQL). Конфигурация:

  • URL (с плейсхолдерами из контекста)
  • Метод, заголовки, тело
  • Аутентификация: bearer, basic, api_key_header (пользовательский заголовок) или oauth2 (см. ниже)
  • Отображение ответа в слоты

operator DB

Выполняет запрос к базе данных, зарегистрированной в разделе Администрирование → Базы данных. Поддерживает Postgres, MySQL, MongoDB и внутреннюю базу данных betool для пользовательских таблиц.

file_transform

Преобразует файл. Встроенные преобразователи:

  • Чтение (PDF с OCR, DOCX, XLSX, CSV)
  • Разбиение на фрагменты (по страницам, по токен-чанкам)
  • Конвертация (HTML → текст, Markdown ↔ HTML)
  • Извлечение структуры (JSON из схемы)

compute

Вычисления и агрегации над слотами контекста:

  • Filter / map / reduce над списками
  • Постолбцовая статистика (count, total, pct)
  • Проекции схемы
  • Составные логические условия

payload_mapper

Составляет выходной payload из слотов контекста. Полезно для подготовки тела нижестоящего HTTP-оператора.

code_step

Когда детерминированная логика выходит за пределы возможностей compute, шаг с кодом выполняет пользовательский код в песочнице — заблокированный ревью человеком. См. Управляемые шаги с кодом.

Аутентификация и секреты

Операторы, которые взаимодействуют с внешней системой (HTTP, DB), ссылаются на учётную запись, зарегистрированную в организации. Учётные данные никогда не видны внутри самого pipeline — ссылка идёт только на имя учётной записи.

В результате ротация пароля не требует правок ни в одном pipeline.

Исходящий OAuth2 (client_credentials)

Для API, требующих токен OAuth2 (корпоративное облако, ERP, сторонние провайдеры), HTTP-оператор поддерживает режим oauth2. Вы регистрируете учётные данные OAuth2 в организации — token_url, client_id, client_secret, scope — а узел ссылается только на нечувствительный идентификатор.

В момент вызова betool получает токен и переиспользует его, пока он остаётся действительным; при истечении срока он лениво обновляется, без фоновой задачи. client_secret никогда не возвращается административным API (раскрывается только индикатор has_secret), а полученный токен размещается как Authorization: Bearer … в исходящем запросе.

Ротация секрета после ротации на стороне провайдера не требует правок pipeline: следующий вызов обновит его автоматически.

Идемпотентность

Любой оператор, который производит побочный эффект (HTTP POST, DB INSERT, отправка email), должен быть спроектирован с идемпотентностью на стороне получателя. Рекомендуемая практика:

  • Включайте idempotency_key в payload (обычно exchange_id).
  • Проверяйте на стороне получателя, был ли ключ уже обработан.

betool не повторяет автоматически сбойный оператор: оркестрация стратегии повторов — ответственность вашего pipeline (loop + condition).