Будущая система плагинов позволит сторонним расширениям через хуки жизненного цикла, пользовательские рендереры и обработчики действий. Создавайте анализ настроений, интеграции CRM, пользовательскую модерацию — все без изменения основного кода. Песочница для безопасности и стабильности.
Каждый бизнес имеет уникальные потребности, которые общие решения не могут полностью удовлетворить. Запланированная система плагинов позволит разработчикам расширять функциональность виджета с помощью пользовательских возможностей — без форкинга кода или потери путей обновления.
Стандартные виджеты не могут предсказать каждое бизнес-требование. Вам может понадобиться:
Плагины регистрируются во время инициализации виджета и получают обратные вызовы в ключевые моменты жизненного цикла:
onBeforeMessageSend — предварительная обработка пользовательских сообщений перед отправкой на бэкендonAfterMessageReceive — постобработка ответов ИИ перед рендерингомonConversationStart — инициализация состояния плагина, когда начинается разговорonConversationEnd — очистка ресурсов, регистрация аналитикиonWidgetOpen / onWidgetClose — отслеживание вовлеченности, запуск побочных эффектовonError — пользовательская обработка или отчет об ошибкахПредобработчики модифицируют пользовательские сообщения перед отправкой:
- Проверка орфографии и автозамена
- Фильтр ненормативной лексики или модерация контента
- Извлечение данных (обнаружение электронных адресов, номеров телефонов, идентификаторов заказов)
- Обнаружение настроений
Постобработчики модифицируют ответы ИИ перед рендерингом:
- Улучшение Markdown (преобразование таблиц в интерактивные компоненты)
- Обогащение ссылок (предварительный просмотр URL-адресов, раскрытие метаданных)
- Фильтрация соблюдения (редактирование PII, чувствительных финансовых данных)
Плагины не могут компрометировать безопасность или стабильность виджета:
WidgetSDK.registerPlugin({
name: 'sentiment-analyzer',
version: '1.0.0',
hooks: {
onBeforeMessageSend: async (message, context) => {
const sentiment = await analyzeSentiment(message.text);
return { ...message, metadata: { sentiment } };
},
onAfterMessageReceive: (message, context) => {
if (message.metadata?.sentiment < -0.5) {
context.escalateToHuman(message);
}
return message;
}
}
});