Перейти к основному содержимому

Виджеты для сайта

Встраивайте голосового агента на любой сайт, чтобы посетители могли начать голосовой разговор прямо из браузера. Вкладка Widgets предоставляет embed-коды, опции кастомизации и настройки безопасности доменов.

Ищете callback-виджет?

Callback Widget работает совсем иначе, чем виджеты на этой странице — вместо старта голосового звонка в браузере он собирает телефонный номер посетителя, и ваш агент сам перезванивает. См. отдельную страницу Callback Widget.

Типы виджетов​

Hanc.AI предлагает четыре типа браузерных виджетов плюс отдельный Callback Widget для телефонных callback:

ВиджетИмя тегаОписаниеЛучше всего для
Floating Widgethanc-ai-floating-callOrb-кнопка, плавающая над вашей страницейВсегда видимый призыв к действию
Pill Widgethanc-ai-pill-callКомпактная пилюлевидная кнопка, размещённая inline в вашем контентеМинимальный footprint внутри существующего макета
Pill Floating Widgethanc-ai-pill-floating-callТа же компактная форма pill, что и у Pill, но плавает со страницей, как виджет FloatingКогда нужна эстетика pill, следующая за посетителем при скролле
Inline Widgethanc-ai-inline-callПолноразмерная кнопка вызова, встроенная в контент страницыВыделенные секции «Поговорить с нами»
Callback Widgethanc-ai-callbackФорма для номера телефона; агент перезванивает посетителюЛидген-страницы, high-intent лендинги — см. Callback Widget

Общие атрибуты​

Все типы виджетов поддерживают эти ключевые атрибуты:

АтрибутОбязательноОписаниеПо умолчанию
agent-idДаУникальный идентификатор агента—
voice-service-urlНетПереопределить URL голосового сервисаАвтоопределение
api-base-urlНетПереопределить базовый URL APIАвтоопределение

Атрибуты отображения​

АтрибутОписаниеЗначенияПо умолчанию
positionПозиция виджета на страницеbottom-right, bottom-left, top-right, top-left, staticbottom-right
sizeРазмер виджета в пикселяхЧисло120
themeИмя цветовой темыСм. Цветовые темыdefault

Атрибуты текста кнопки​

АтрибутОписаниеПо умолчанию
button-start-textТекст на бездействующей кнопке"Call"
button-connecting-textТекст при соединении"Connecting..."
button-end-textТекст во время активного звонка—

Атрибуты Terms​

АтрибутОписаниеПо умолчанию
terms-enabledВключить диалог согласия до звонкаfalse
terms-contentMarkdown-форматированный текст согласия""
terms-urlСсылка на вашу страницу Terms & Conditions"https://hanc.ai/terms"
privacy-urlСсылка на вашу страницу Privacy Policy"https://hanc.ai/privacy"
к сведению

Terms-атрибуты, заданные на HTML-элементе, переопределяются настройками виджета агента, полученными из API, если только skip-fetch не выставлен в true.

Атрибуты звука​

АтрибутОписаниеПо умолчанию
sound-enabledВключить звуки старта/окончания звонкаtrue
sound-volumeГромкость звуковых эффектов0.25
sound-presetИдентификатор пресета звука"1"

Цветовые темы​

Кастомизируйте внешний вид виджета с помощью 11 встроенных цветовых тем:

ТемаЗначение
Defaultdefault
Purplepurple
Blueblue
Cyancyan
Emeraldemerald
Amberamber
Tangerinetangerine
Roserose
Emberember
Blackblack
Whitewhite

У каждой темы есть тёмный и светлый варианты. Задайте тему через атрибут theme в embed-коде или сконфигурируйте её в настройках виджета агента.


Примеры встраивания​

Floating Widget​

<hanc-ai-floating-call agent-id="YOUR_AGENT_ID"></hanc-ai-floating-call>
<script src="https://unpkg.com/hanc-webrtc-widgets" async type="text/javascript"></script>

Floating Widget с темой и позицией​

<hanc-ai-floating-call
agent-id="YOUR_AGENT_ID"
theme="emerald"
position="bottom-left"
size="140"
></hanc-ai-floating-call>
<script src="https://unpkg.com/hanc-webrtc-widgets" async type="text/javascript"></script>

Pill Widget​

<hanc-ai-pill-call agent-id="YOUR_AGENT_ID"></hanc-ai-pill-call>
<script src="https://unpkg.com/hanc-webrtc-widgets" async type="text/javascript"></script>

Inline Widget​

<hanc-ai-inline-call agent-id="YOUR_AGENT_ID"></hanc-ai-inline-call>
<script src="https://unpkg.com/hanc-webrtc-widgets" async type="text/javascript"></script>
Закрепление версии виджета

URL скрипта выше всегда грузит последнюю выпущенную версию виджета — ваш сайт автоматически подхватывает улучшения, а @latest используется по умолчанию, когда версия не указана. Если нужно зафиксировать конкретный релиз, закрепите его явно, добавив нужную версию, например https://unpkg.com/hanc-webrtc-widgets@X.Y.Z.


События виджета​

Виджеты генерируют события, которые можно слушать в JavaScript:

СобытиеОписание
status-changedСрабатывает при смене статуса звонка
connectingЗвонок устанавливается
connectedЗвонок активен
idleНет активного звонка
errorПроизошла ошибка
audio-trackПолучен удалённый аудиотрек (для визуализации)
local-audio-trackЛокальный аудиотрек микрофона (для визуализации)
microphone-enabledМикрофон был включён
microphone-disabledМикрофон был выключен
call-startСрабатывает при успешном старте звонка
call-endСрабатывает при завершении звонка

Пример: слушаем события​

const widget = document.querySelector('hanc-ai-floating-call');

widget.addEventListener('call-start', () => {
console.log('Call started');
});

widget.addEventListener('call-end', () => {
console.log('Call ended');
});

Как разрешить агенту открывать страницы​

Во время звонка из браузера агент может попросить ваш сайт открыть страницу — «давайте покажу тарифы» — и посетитель видит это, не прерывая разговор.

Решение остаётся за вашей страницей. Агент присылает запрос, ваш код решает, что он означает. Открыть адрес, переключить вкладку, прокрутить к разделу и раскрыть аккордеон — всё это допустимые ответы.

Нужны три шага, и по отдельности ни один не работает.

Шаг 1 — Скажите агенту, какие страницы есть​

Агент не видит карту вашего сайта. Он просит только тот путь, который вы ему дали, — перечислите их в промпте агента или в базе знаний:

Страницы сайта:
/pricing — тарифы и цены
/contact — форма связи и телефон
/product/crm — CRM

Пропустите этот шаг — и агенту нечего просить, он просто не попытается.

Шаг 2 — Обработайте запрос на своей странице​

Добавьте это один раз, где угодно после скрипта виджета. Событие всплывает по документу, так что document — подходящее место:

<script>
document.addEventListener('agent-command', (event) => {
const { type, payload } = event.detail;

if (type === 'navigate') {
// SPA: переход без перезагрузки — звонок продолжается.
router.push(payload.path);

// Обычный сайт: открыть вторую вкладку, эта (и звонок) останется жива.
// window.open(payload.path, '_blank');

event.preventDefault(); // ← это и говорит агенту «принято»
}
});
</script>
Полная перезагрузка страницы обрывает звонок

Звонок живёт в этой странице. window.location.href = … выгружает документ, и разговор уходит вместе с ним — посетителя обрывает на полуслове. Если есть роутер, переходите без перезагрузки; иначе открывайте страницу в новой вкладке. Переподключения нет: перезагрузку не переживает ничто.

preventDefault() обязателен

Это единственный способ сказать «я обработал». Без него агенту сообщат, что сайт не поддерживает навигацию: он перестанет пытаться до конца звонка и вернётся к объяснениям, куда нажать. В консоли ничего не появится — страница просто выглядит так, будто проигнорировала запрос, потому что так и есть.

Шаг 3 — Проверьте​

Позвоните своему агенту с сайта и попросите открыть страницу по названию. Должно произойти два события: страница открылась, и агент сказал что-то вроде «вот цены», а не «найдите их в меню».


Как отвечать агенту данными​

Некоторые команды — это вопросы, а не указания. Приходят они так же, но отвечать нужно через respond():

КомандаО чём спрашивает агентЧем отвечаете
navigate«открой этот путь»ничем — достаточно preventDefault()
page_context«что сейчас перед посетителем?»чем угодно полезным: путь, заголовок, товар
cart_state«что у него в корзине?»позиции, суммы, валюта
<script>
document.addEventListener('agent-command', (event) => {
const { type, respond } = event.detail;

if (type === 'page_context') {
event.preventDefault();
respond({ path: location.pathname, title: document.title });
}
});
</script>

На ответ после preventDefault() есть около секунды, так что await допустим, а медленный запрос к API — нет. Отвечайте тем, что уже под рукой.


Что агент может просить, а что нет​

  • Только пути внутри вашего сайта. Путь обязан начинаться с /. Всё, что уводит с домена — //evil.com, https://…, обратные слэши — отсекается до того, как дойдёт до страницы. Увести посетителя на чужой сайт агент не может.
  • Только звонки из браузера. На телефонном звонке открывать нечего, поэтому там таких команд нет.
  • Одного отказа достаточно. Если страница не подтвердила первый запрос, агент перестаёт спрашивать до конца звонка. Он не будет пытаться снова и — что важнее — не скажет посетителю, что открыл то, чего не открывал.
Ничего не происходит?

Выводите каждую команду до того, как фильтруете: document.addEventListener('agent-command', e => console.log(e.detail)). Видите в консоли navigate — агент свою часть сделал, значит дело в preventDefault() или в вашем обработчике. Не видите ничего — агенту не сказали, что такой путь существует; вернитесь к шагу 1.


Технические требования​

Виджеты требуют, чтобы браузер посетителя поддерживал:

  • WebGL 2.0 — для отрисовки
  • Web Audio API — для обработки звука
  • WebRTC — для реал-тайм голосовой связи

Все современные браузеры (Chrome, Firefox, Safari, Edge) поддерживают эти технологии.


Ограничения доменов​

Контролируйте, какие сайты могут встраивать виджет вашего агента.

Всегда разрешённые домены​

Следующие домены всегда разрешены, независимо от конфигурации:

  • hanc.ai (и поддомены)
  • hanc.me (и поддомены)
  • localhost

Allow All Domains​

По умолчанию ваш виджет можно встраивать на любой сайт. Переключите «Allow all domains» в настройках виджета, чтобы ограничить это.

Ограничение конкретными доменами​

При ограничении добавьте каждый домен, которому должно быть разрешено встраивание:

  • Вводите имена доменов без https:// (например, example.com)
  • Поддомены нужно добавлять отдельными записями (например, www.example.com, shop.example.com)
  • Порты можно указывать (например, localhost:3000)
  • Максимум 50 доменов можно добавить в whitelist
Безопасность

Для продакшен-агентов ограничивайте виджеты своими собственными доменами, чтобы предотвратить несанкционированное встраивание.


Terms & Conditions​

Включите диалог согласия до того, как звонящие смогут начать разговор.

Конфигурация​

НастройкаОписание
Enable TermsПереключатель диалога terms
Terms ContentMarkdown-форматированный текст согласия, показываемый пользователям (макс. 5000 символов)
Terms URLСсылка на вашу полную страницу Terms & Conditions
Privacy URLСсылка на вашу страницу Privacy Policy

Когда включено:

  • Пользователи видят диалог согласия до старта звонка
  • Они должны нажать «Agree», чтобы продолжить
  • Согласие хранится локально в браузере
  • Кнопка Reset Consent очищает сохранённое согласие для тестирования

Форматирование контента​

Контент terms поддерживает форматирование Markdown:

  • Используйте #### для заголовков
  • Используйте **bold** для акцента
  • Используйте переводы строк для читаемости

Связанное​