Операторы
Оператор — это узел, который выполняет детерминированное действие: без 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).