enВойти в Senler

Custom actions виджета

customActions нужны, когда ответ виджета должен содержать кнопку, которую обрабатывает ваш сайт: открыть заказ, показать тариф, запустить собственный сценарий или изменить локальное состояние интерфейса. Сначала реализуйте и защитите действие на стороне сайта, затем объявите его виджету.

Отдельной формы для customActions в кабинете нет: сайт передаёт их при SenlerWidget.init(...) или позже через SenlerWidget.updateRuntime(...). Поэтому здесь приведён пример интеграции, а внешний вид кнопки посетителя показан в статье «Интерфейс виджета».

Что происходит после ответа

Страница передаёт объект customActions. Ключ — техническое имя действия, значение — обязательный handler и необязательные title, description, payloadSchema.

Агент получает только имя, заголовок, описание и схему данных. Сам handler остаётся на странице. По умолчанию он вызывается после нажатия посетителя на кнопку custom_action и получает { name, payload, button_text }.

Объявите действие

SenlerWidget.init({
  channel_id: "xxx",
  customActionsLanguage: "ru",
  customActions: {
    "site.openOrder": {
      title: "Открыть заказ",
      description: "Открывает карточку заказа по order_id.",
      payloadSchema: {
        type: "object",
        properties: {
          order_id: { type: "string" },
        },
        required: ["order_id"],
        additionalProperties: false,
      },
      handler({ payload }) {
        const orderId = String(payload?.order_id || "");
        if (!canViewOrder(orderId)) return;
        openOrder(orderId);
      },
    },
  },
});

canViewOrder и openOrder в примере обозначают ваши функции проверки доступа и открытия карточки. Реализуйте их на стороне сайта; скрипт-загрузчик не создаёт готовых глобальных функций с такими именами.

Если title и description написаны на одном языке, укажите customActionsLanguage: "ru" или "en". Параметр не переводит текст, а сообщает AI язык описаний. Без него используется двуязычный поиск по русским и английским описаниям.

Опишите входные данные

Имя берётся из ключа объекта customActions. Оно должно начинаться с латинской буквы, быть не длиннее 120 символов и может содержать латинские буквы, цифры, _, ., : и -.

В одном контексте можно объявить до 20 действий. title ограничен 80 символами, description — 240 символами. Сам payloadSchema должен быть обычным объектом схемы. Корневое поле type можно опустить; если оно задано, поддерживается только "object". Глубина схемы — не более 8 уровней, сериализованный размер одной схемы — не более 1200 символов, а всех передаваемых описаний действий вместе — не более 6000 символов. В общий размер входят имена, заголовки, описания и схемы.

Поддерживается ограниченное подмножество JSON Schema: типы object, string, number, integer, boolean, array, null и поля properties, required, additionalProperties, items, enum, title, description, default, examples, minLength, maxLength, pattern, minimum, maximum, minItems, maxItems. Другие поля отклоняются при инициализации. Не передавайте секреты в schema, description или payload.

custom_action.name нельзя придумывать динамически: агент использует только имена, явно переданные текущей страницей. Если страница не объявила действие, виджет не должен обещать или выполнять такую кнопку.

Проверьте действие на сайте

payload формируется по ответу агента и приходит в браузер вместе с кнопкой, поэтому считайте его недоверенными входными данными. handler должен заново проверить типы, права пользователя, существование объекта и допустимость операции. Для удаления, оплаты и других значимых изменений оставляйте обычное подтверждение сайта.

Скрипт-загрузчик вызывает handler синхронно и не ожидает возвращённый Promise. Если обработка асинхронная, самостоятельно обработайте ошибку и покажите результат пользователю внутри сайта.

Обновление действий при навигации

Действия можно заменить без пересоздания виджета:

SenlerWidget.updateRuntime({
  customActions: buildActionsForCurrentPage(),
  customActionsLanguage: "ru",
});

Скрипт-загрузчик передаёт новые описания в виджет, а handler остаётся на странице сайта и заменяет предыдущий обработчик с тем же именем.

updateRuntime заменяет весь текущий набор действий. Передавайте полный набор для новой страницы, а не только добавленные имена.

Автоматическое выполнение

По умолчанию действие представляется пользователю кнопкой. autoExecuteCustomActionNames разрешает автоматически выполнить только перечисленные имена в текущем сценарии Public API. Кнопки этих действий не показываются в сообщении. Из одного ответа автоматически выполняется первое подходящее действие, поэтому проектируйте такой ответ с одной автоматической операцией; остальные перечисленные кнопки также будут скрыты.

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

Чем custom action отличается от действий по элементам

Custom action объявляет собственную бизнес-операцию сайта и вызывает ваш handler. Действия по элементам (highlight, click, fill и другие) работают с размеченным DOM по data-ai-context-id. Не используйте custom action только ради подсветки обычной кнопки.

Переходы по ссылкам

open_url обрабатывается страницей сайта: target: "self" меняет текущую страницу, без self ссылка открывается в новой вкладке.

Для внутренних переходов сайта лучше объявить custom_action: так сайт сам проверит payload и выполнит переход через свой маршрутизатор.

Что подключать дальше

Если действие должно не просто открыть страницу или изменить состояние сайта, а подготовить AI-правку конкретного поля с просмотром до применения, используйте inline-правки. Полный список runtime-параметров и событий находится в справочнике Public API.