Przejdź do głównej zawartości

Widgety witryny

Osadź swojego agenta głosowego na dowolnej stronie, aby odwiedzający mogli rozpocząć rozmowę głosową bezpośrednio z przeglądarki. Zakładka Widgety dostarcza kody osadzania, opcje dostosowywania oraz ustawienia zabezpieczeń domeny.

Szukasz widgetu oddzwaniania?

Widget oddzwaniania działa bardzo inaczej niż widgety na tej stronie — zamiast rozpoczynać rozmowę głosową w przeglądarce, zbiera numer telefonu odwiedzającego i sprawia, że Twój agent oddzwania. Zobacz dedykowaną stronę Widget oddzwaniania.

Typy widgetów

Hanc.AI oferuje cztery typy widgetów w przeglądarce oraz osobny Widget oddzwaniania dla oddzwaniań telefonicznych:

WidgetNazwa znacznikaOpisNajlepszy dla
Widget pływającyhanc-ai-floating-callPrzycisk-kula, który unosi się nad stronąZawsze widoczne wezwanie do działania
Widget pigułkahanc-ai-pill-callKompaktowy przycisk w kształcie pigułki umieszczony inline w treściMinimalny ślad wewnątrz istniejącego układu
Widget pływająca pigułkahanc-ai-pill-floating-callTen sam kompaktowy kształt pigułki co Pigułka, ale unosi się ze stroną jak widget PływającyGdy chcesz estetyki pigułki, która podąża za odwiedzającym podczas przewijania
Widget inlinehanc-ai-inline-callPrzycisk połączenia pełnego rozmiaru osadzony w treści stronyDedykowane sekcje „Porozmawiaj z nami"
Widget oddzwanianiahanc-ai-callbackFormularz numeru telefonu; agent oddzwania do odwiedzającegoStrony generujące leady, strony docelowe o wysokiej intencji — zobacz Widget oddzwaniania

Wspólne atrybuty

Wszystkie typy widgetów obsługują te podstawowe atrybuty:

AtrybutWymaganyOpisDomyślnie
agent-idTakUnikalny identyfikator Twojego agenta
voice-service-urlNieNadpisz URL usługi głosowejWykrywany automatycznie
api-base-urlNieNadpisz bazowy URL APIWykrywany automatycznie

Atrybuty wyświetlania

AtrybutOpisWartościDomyślnie
positionPozycja widgetu na stroniebottom-right, bottom-left, top-right, top-left, staticbottom-right
sizeRozmiar widgetu w pikselachLiczba120
themeNazwa motywu kolorystycznegoZobacz Motywy kolorystycznedefault

Atrybuty tekstu przycisku

AtrybutOpisDomyślnie
button-start-textTekst pokazywany na bezczynnym przycisku"Call"
button-connecting-textTekst pokazywany podczas łączenia"Connecting..."
button-end-textTekst pokazywany podczas aktywnego połączenia

Atrybuty regulaminu

AtrybutOpisDomyślnie
terms-enabledWłącz okno zgody przed połączeniemfalse
terms-contentTekst zgody sformatowany w Markdown""
terms-urlLink do Twojej strony Regulaminu"https://hanc.ai/terms"
privacy-urlLink do Twojej strony Polityki prywatności"https://hanc.ai/privacy"
informacja

Atrybuty regulaminu ustawione na elemencie HTML są nadpisywane przez ustawienia widgetu agenta pobierane z API, chyba że skip-fetch jest ustawione na true.

Atrybuty dźwięku

AtrybutOpisDomyślnie
sound-enabledWłącz dźwięki rozpoczęcia/zakończenia połączeniatrue
sound-volumeGłośność efektów dźwiękowych0.25
sound-presetIdentyfikator presetu dźwięku"1"

Motywy kolorystyczne

Dostosuj wygląd widgetu za pomocą 11 wbudowanych motywów kolorystycznych:

MotywWartość
Defaultdefault
Purplepurple
Blueblue
Cyancyan
Emeraldemerald
Amberamber
Tangerinetangerine
Roserose
Emberember
Blackblack
Whitewhite

Każdy motyw ma warianty ciemny i jasny. Ustaw motyw za pomocą atrybutu theme w kodzie osadzenia lub skonfiguruj go w ustawieniach widgetu agenta.


Przykłady osadzenia

Widget pływający

<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>

Widget pływający z motywem i pozycją

<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>

Widget pigułka

<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>

Widget inline

<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>
Przypinanie wersji widgetu

Powyższy URL skryptu zawsze ładuje najnowszy wydany widget — Twoja witryna automatycznie pobiera ulepszenia, a @latest jest domyślne, gdy nie podano wersji. Jeśli musisz zablokować się do stałego wydania, przypnij jawnie, dołączając żądaną wersję, np. https://unpkg.com/hanc-webrtc-widgets@X.Y.Z.


Zdarzenia widgetu

Widgety emitują zdarzenia, których możesz nasłuchiwać w JavaScript:

ZdarzenieOpis
status-changedUruchamiane, gdy zmienia się status połączenia
connectingPołączenie jest nawiązywane
connectedPołączenie jest aktywne
idleBrak aktywnego połączenia
errorWystąpił błąd
audio-trackOdebrano zdalną ścieżkę audio (do wizualizacji)
local-audio-trackLokalna ścieżka audio mikrofonu (do wizualizacji)
microphone-enabledMikrofon został włączony
microphone-disabledMikrofon został wyłączony
call-startUruchamiane, gdy połączenie rozpocznie się pomyślnie
call-endUruchamiane, gdy połączenie się kończy

Przykład: nasłuchiwanie zdarzeń

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

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

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

Jak pozwolić agentowi otwierać strony

Podczas rozmowy z przeglądarki agent może poprosić Twoją witrynę o otwarcie strony — „pokażę cennik” — a odwiedzający widzi to, nie przerywając rozmowy.

Decyduje Twoja strona. Agent wysyła prośbę, a Twój kod ustala, co ona znaczy. Otwarcie adresu, przełączenie zakładki, przewinięcie do sekcji, rozwinięcie akordeonu — wszystko to poprawne odpowiedzi.

Potrzebne są trzy kroki i żaden nie działa osobno.

Krok 1 — Powiedz agentowi, jakie strony istnieją

Agent nie widzi mapy Twojej witryny. Prosi wyłącznie o ścieżki, które mu podałeś — wypisz je w promptcie agenta lub w bazie wiedzy:

Strony naszej witryny:
/pricing — plany i ceny
/contact — formularz kontaktowy i telefon
/product/crm — CRM

Bez tego kroku agent nie ma o co prosić i nawet nie spróbuje.

Krok 2 — Obsłuż prośbę na swojej stronie

Dodaj to raz, gdziekolwiek po skrypcie widżetu. Zdarzenie bąbelkuje w górę strony, więc document jest dobrym miejscem:

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

if (type === 'navigate') {
// SPA: nawigacja bez przeładowania — rozmowa trwa dalej.
router.push(payload.path);

// Klasyczna witryna: otwórz drugą kartę, ta (i rozmowa) pozostanie żywa.
// window.open(payload.path, '_blank');

event.preventDefault(); // ← to mówi agentowi „obsłużone”
}
});
</script>
Pełne przeładowanie strony kończy rozmowę

Rozmowa żyje w tej stronie. window.location.href = … usuwa dokument, a rozmowa znika razem z nim — odwiedzający zostaje przerwany w pół zdania. Jeśli masz router, nawiguj po stronie klienta; w przeciwnym razie otwórz stronę w nowej karcie. Nie ma ponownego łączenia: przeładowania nie przetrwa nic.

preventDefault() nie jest opcjonalne

To jedyny sposób, by powiedzieć „zajęłem się tym”. Bez niego agent dowiaduje się, że witryna nie obsługuje nawigacji: przestaje próbować do końca rozmowy i wraca do opisywania, gdzie kliknąć. W konsoli nic się nie pojawi — strona po prostu wygląda, jakby zignorowała prośbę, bo ją zignorowała.

Krok 3 — Sprawdź

Zadzwoń do swojego agenta z witryny i poproś o stronę po nazwie. Powinny wydarzyć się dwie rzeczy: strona się otwiera, a agent mówi coś w rodzaju „oto ceny” zamiast „znajdzie je Pan w menu”.


Jak odpowiadać agentowi danymi

Niektóre polecenia to pytania, nie instrukcje. Przychodzą tak samo, ale odpowiada się przez respond():

PolecenieO co pyta agentCzym odpowiadasz
navigate„otwórz tę ścieżkę”niczym — wystarczy preventDefault()
page_context„na co patrzy odwiedzający?”czymkolwiek przydatnym: ścieżka, tytuł, produkt
cart_state„co ma w koszyku?”pozycje, sumy, waluta
<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>

Po preventDefault() masz około sekundy na odpowiedź — await jest w porządku, wolne wywołanie API już nie. Odpowiadaj tym, co i tak już masz.


O co agent może, a o co nie może prosić

  • Tylko ścieżki w obrębie Twojej witryny. Ścieżka musi zaczynać się od /. Wszystko, co mogłoby wyprowadzić poza Twoją domenę — //evil.com, https://…, ukośniki wsteczne — jest odrzucane, zanim dotrze do strony. Agent nie wyśle Twoich odwiedzających gdzie indziej.
  • Tylko rozmowy z przeglądarki. Podczas rozmowy telefonicznej nie ma czego otwierać, więc tam te polecenia nie istnieją.
  • Jedna odmowa wystarczy. Jeśli Twoja strona nie potwierdzi pierwszej prośby, agent przestaje pytać do końca rozmowy. Nie spróbuje ponownie i — co ważniejsze — nie powie odwiedzającemu, że coś otworzył, skoro nie otworzył.
Nic się nie dzieje?

Loguj każde polecenie zanim je odfiltrujesz: document.addEventListener('agent-command', e => console.log(e.detail)). Jeśli widzisz w konsoli navigate, agent zrobił swoje, a brakuje preventDefault() albo Twojej obsługi. Jeśli nie widzisz nic, agentowi nigdy nie powiedziano, że taka ścieżka istnieje — wróć do kroku 1.


Wymagania techniczne

Widgety wymagają, aby przeglądarka odwiedzającego obsługiwała:

  • WebGL 2.0 — do renderowania
  • Web Audio API — do przetwarzania dźwięku
  • WebRTC — do komunikacji głosowej w czasie rzeczywistym

Wszystkie nowoczesne przeglądarki (Chrome, Firefox, Safari, Edge) obsługują te technologie.


Ograniczenia domeny

Kontroluj, które strony mogą osadzać widget Twojego agenta.

Zawsze dozwolone domeny

Następujące domeny są zawsze dozwolone niezależnie od konfiguracji:

  • hanc.ai (i subdomeny)
  • hanc.me (i subdomeny)
  • localhost

Zezwól na wszystkie domeny

Domyślnie Twój widget może być osadzany na dowolnej stronie. Przełącz „Zezwól na wszystkie domeny" w ustawieniach widgetu, aby to ograniczyć.

Ogranicz do konkretnych domen

Gdy ograniczone, dodaj każdą domenę, która powinna być dozwolona:

  • Wprowadzaj nazwy domen bez https:// (np. example.com)
  • Subdomeny wymagają osobnych wpisów (np. www.example.com, shop.example.com)
  • Można określić porty (np. localhost:3000)
  • Maksymalnie 50 domen można umieścić na białej liście
Bezpieczeństwo

Dla agentów produkcyjnych ogranicz widgety do własnych domen, aby zapobiec nieautoryzowanemu osadzaniu.


Regulamin

Włącz okno zgody, zanim dzwoniący będą mogli rozpocząć rozmowę.

Konfiguracja

UstawienieOpis
Włącz regulaminPrzełącznik okna regulaminu wł./wył.
Treść regulaminuTekst zgody sformatowany w Markdown pokazywany użytkownikom (maks. 5 000 znaków)
URL regulaminuLink do Twojej pełnej strony Regulaminu
URL prywatnościLink do Twojej strony Polityki prywatności

Gdy włączone:

  • Użytkownicy widzą okno zgody przed rozpoczęciem połączenia
  • Muszą kliknąć „Zgadzam się", aby kontynuować
  • Zgoda jest przechowywana lokalnie w przeglądarce
  • Przycisk Resetuj zgodę czyści zapisaną zgodę do testów

Formatowanie treści

Treść regulaminu obsługuje formatowanie Markdown:

  • Użyj #### dla nagłówków
  • Użyj **bold** dla wyróżnienia
  • Używaj podziałów wierszy dla czytelności

Powiązane