Контекст страницы
Контекст — это явные данные, которые сайт прикладывает к сообщению, чтобы агент понимал текущую ситуацию. Например: «Открыт раздел оплаты» или «Пользователь спрашивает о заказе № 123». Начните с одной плашки страницы и добавляйте бизнес-сущности только там, где они действительно нужны.
Что получает агент
Агент получает элементы контекста целиком: их тип, роль, понятную подпись и переданные объекты ref, snapshot и payload. Перед отправкой посетитель видит элементы без hidden: true в меню «Контекст» поля сообщения. После отправки видимые элементы показаны плашками рядом с сообщением. Скрытые элементы также сохраняются и передаются агенту.
Контекст не читает произвольное состояние страницы. Системные данные текущего лида Senler передаёт отдельно из его профиля; заказ, проект и другие данные сайта нужно явно добавить в контекст. Не добавляйте секреты, токены, платёжные данные и сведения, которые этот посетитель не должен видеть. Если инструкции агента нужен точный ID или профильное поле лида, используйте системные переменные лида, а не дублируйте эти значения в каждом contextItems.
Выберите вид контекста
- Контекст страницы для интерфейса чата задаётся через
contextProviderприSenlerWidget.initи заменяется черезSenlerWidget.setPageContext(items)при навигации. Он предлагается со следующими сообщениями, которые посетитель отправляет из поля ввода. - Контекст программного запроса передаётся явно как
contextItemsвSenlerWidget.ask({ text, contextItems }). Этот вызов не подхватывает плашки изsetPageContext, контекст черновика или выбранный в интерфейсе элемент. - Общий JSON-контекст для
askзадаётся черезsetContext; параметрcontextдополняет или переопределяет его для одного запроса.
Если посетитель должен сам написать вопрос об объекте, передайте одноразовые contextItems в selectDialog или startNewDialog. Они появятся в поле ввода и перейдут в сообщение при отправке. Если отправка не удалась, кнопка «Повторить» у сообщения использует тот же контекст; прикреплять его заново не нужно.
Пример для конкретного заказа находится в контексте сообщения; все поля, лимиты и правила объединения описаны в формате элемента контекста.
Передайте текущую страницу
contextProvider вызывается один раз при инициализации и должен сразу вернуть готовый массив: асинхронный Promise не поддерживается. Если название страницы или сущность загружается позже, сначала верните базовый элемент контекста, а после загрузки вызовите SenlerWidget.setPageContext(items).
Если вместо функции передать другое значение, init завершится синхронной ошибкой. Если сама функция выбросит исключение или вернёт некорректный массив, скрипт-загрузчик выведет предупреждение [SenlerWidget] contextProvider callback failed в консоль и продолжит запуск без этого контекста. Поэтому отдельно проверьте плашку страницы в готовом виджете.
function buildPageContext() {
return [
{
id: `page:${window.location.pathname}`,
kind: "page",
role: "technical",
display: {
label: document.title || "Текущая страница",
subtitle: window.location.pathname,
},
ref: {
url: window.location.href,
route: window.location.pathname,
},
},
];
}
SenlerWidget.init({
channel_id: "xxx",
contextProvider: buildPageContext,
});
В SPA после каждой смены маршрута заменяйте контекст без переинициализации:
SenlerWidget.setPageContext(buildPageContext());
setPageContext(items) заменяет весь постоянный контекст, а не дополняет предыдущий массив. Передавайте в него полный актуальный набор.
Чтобы убрать постоянный контекст, вызовите SenlerWidget.setPageContext([]).
Для программного вопроса о той же странице передайте актуальный массив непосредственно в ask:
await SenlerWidget.ask({
text: "Помоги разобраться с текущей страницей.",
contextItems: buildPageContext(),
});
Контекст в виде JSON
Если для интеграции достаточно одного объекта без отдельных плашек сущностей, используйте SenlerWidget.setContext(context):
SenlerWidget.setContext({ section: "orders", orderId: "123" });
const result = await SenlerWidget.ask({
text: "Объясни состояние заказа.",
context: { orderId: "456" },
});
В этом запросе сохраняется section: "orders", а orderId заменяется на "456". Объекты объединяются только на верхнем уровне: вложенный объект из запроса заменяет соответствующий объект целиком. Параметр context у ask не меняет постоянное значение.
Каждый вызов ask сохраняет собственный снимок данных до ожидания в очереди. Последующий переход на другую страницу не изменяет уже отправленный запрос. Допускается JSON-объект размером до 16 000 байт и вложенностью до 8 уровней; функции, циклические ссылки и небезопасные имена ключей не принимаются.
setContext также заменяет плашки постоянного контекста в интерфейсе чата одной плашкой «Context». Выберите один способ управления постоянным контекстом: последующий setPageContext меняет плашки интерфейса, но не очищает JSON, сохранённый для ask. Для нескольких плашек, собственных подписей и флага hidden используйте setPageContext для ручной отправки и явно передавайте contextItems в ask. Вызов setContext({}) очищает сохранённый JSON и постоянные плашки.
Когда обновлять контекст
- При переходе на другую страницу вызовите
setPageContext. - При открытии другой карточки на том же маршруте также передайте новый полный массив.
- Для единичного вопроса используйте
contextItems, не подменяя ими постоянный контекст. - Если пользователь должен сам выбрать кнопку или поле, включите выбор элемента; не создавайте выбранный элемент вручную.
Что настраивать дальше
Когда плашки страницы и бизнес-сущности передаются корректно, добавьте важным кнопкам, полям и карточкам стабильную разметку data-ai-*. Контекст объясняет агенту ситуацию, а разметка позволяет связать ответ с конкретным элементом сайта.