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.
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:
| Widget | Nazwa znacznika | Opis | Najlepszy dla |
|---|---|---|---|
| Widget pływający | hanc-ai-floating-call | Przycisk-kula, który unosi się nad stroną | Zawsze widoczne wezwanie do działania |
| Widget pigułka | hanc-ai-pill-call | Kompaktowy przycisk w kształcie pigułki umieszczony inline w treści | Minimalny ślad wewnątrz istniejącego układu |
| Widget pływająca pigułka | hanc-ai-pill-floating-call | Ten sam kompaktowy kształt pigułki co Pigułka, ale unosi się ze stroną jak widget Pływający | Gdy chcesz estetyki pigułki, która podąża za odwiedzającym podczas przewijania |
| Widget inline | hanc-ai-inline-call | Przycisk połączenia pełnego rozmiaru osadzony w treści strony | Dedykowane sekcje „Porozmawiaj z nami" |
| Widget oddzwaniania | hanc-ai-callback | Formularz numeru telefonu; agent oddzwania do odwiedzającego | Strony generujące leady, strony docelowe o wysokiej intencji — zobacz Widget oddzwaniania |
Wspólne atrybuty
Wszystkie typy widgetów obsługują te podstawowe atrybuty:
| Atrybut | Wymagany | Opis | Domyślnie |
|---|---|---|---|
agent-id | Tak | Unikalny identyfikator Twojego agenta | — |
voice-service-url | Nie | Nadpisz URL usługi głosowej | Wykrywany automatycznie |
api-base-url | Nie | Nadpisz bazowy URL API | Wykrywany automatycznie |
Atrybuty wyświetlania
| Atrybut | Opis | Wartości | Domyślnie |
|---|---|---|---|
position | Pozycja widgetu na stronie | bottom-right, bottom-left, top-right, top-left, static | bottom-right |
size | Rozmiar widgetu w pikselach | Liczba | 120 |
theme | Nazwa motywu kolorystycznego | Zobacz Motywy kolorystyczne | default |
Atrybuty tekstu przycisku
| Atrybut | Opis | Domyślnie |
|---|---|---|
button-start-text | Tekst pokazywany na bezczynnym przycisku | "Call" |
button-connecting-text | Tekst pokazywany podczas łączenia | "Connecting..." |
button-end-text | Tekst pokazywany podczas aktywnego połączenia | — |
Atrybuty regulaminu
| Atrybut | Opis | Domyślnie |
|---|---|---|
terms-enabled | Włącz okno zgody przed połączeniem | false |
terms-content | Tekst zgody sformatowany w Markdown | "" |
terms-url | Link do Twojej strony Regulaminu | "https://hanc.ai/terms" |
privacy-url | Link do Twojej strony Polityki prywatności | "https://hanc.ai/privacy" |
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
| Atrybut | Opis | Domyślnie |
|---|---|---|
sound-enabled | Włącz dźwięki rozpoczęcia/zakończenia połączenia | true |
sound-volume | Głośność efektów dźwiękowych | 0.25 |
sound-preset | Identyfikator presetu dźwięku | "1" |
Motywy kolorystyczne
Dostosuj wygląd widgetu za pomocą 11 wbudowanych motywów kolorystycznych:
| Motyw | Wartość |
|---|---|
| Default | default |
| Purple | purple |
| Blue | blue |
| Cyan | cyan |
| Emerald | emerald |
| Amber | amber |
| Tangerine | tangerine |
| Rose | rose |
| Ember | ember |
| Black | black |
| White | white |
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>
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:
| Zdarzenie | Opis |
|---|---|
status-changed | Uruchamiane, gdy zmienia się status połączenia |
connecting | Połączenie jest nawiązywane |
connected | Połączenie jest aktywne |
idle | Brak aktywnego połączenia |
error | Wystąpił błąd |
audio-track | Odebrano zdalną ścieżkę audio (do wizualizacji) |
local-audio-track | Lokalna ścieżka audio mikrofonu (do wizualizacji) |
microphone-enabled | Mikrofon został włączony |
microphone-disabled | Mikrofon został wyłączony |
call-start | Uruchamiane, gdy połączenie rozpocznie się pomyślnie |
call-end | Uruchamiane, 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>
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 opcjonalneTo 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():
| Polecenie | O co pyta agent | Czym 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ł.
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
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
| Ustawienie | Opis |
|---|---|
| Włącz regulamin | Przełącznik okna regulaminu wł./wył. |
| Treść regulaminu | Tekst zgody sformatowany w Markdown pokazywany użytkownikom (maks. 5 000 znaków) |
| URL regulaminu | Link do Twojej pełnej strony Regulaminu |
| URL prywatności | Link 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
- Widget oddzwaniania — Oddzwaniania telefoniczne dla odwiedzających, którzy wolą nie rozmawiać w przeglądarce
- Przegląd agentów głosowych
- Ustawienia — Ustawienia agenta, w tym konfiguracja widgetu
- Integracje — Klucze API i konfiguracja numeru telefonu