Integracja JS API

FlowHunt JavaScript API Chatbot Integration

FlowHunt JS API daje pelna kontrole nad sposobem integracji chatbota z Twoja strona internetowa. Korzystajac z kodu integracyjnego v2, mozesz osadzic chatbota, subskrybowac zdarzenia cyklu zycia i interakcji, przekazywac dynamiczne dane za pomoca zmiennych przeplywu, uruchamiac wyzwalacz Chat Hook w trakcie rozmowy za pomoca sendHook(), sledzic interakcje za pomoca parametrow URL i programowo sterowac oknem czatu.

Ten przewodnik obejmuje kazdy aspekt JS API z przykladami kodu, ktore mozesz skopiowac i dostosowac do swojego projektu.

Kod integracyjny (v2)

Skopiuj i wklej ponizszy fragment do swojego HTML tuz przed zamykajacym tagiem </body>. Zastap YOUR_CHATBOT_ID i YOUR_WORKSPACE_ID wartosciami z ustawien chatbota FlowHunt.

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      // The chatbot is ready — use chatbotManager here
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

Identyfikator chatbota w nazwie zmiennej globalnej (window.FHChatbot_YOUR_CHATBOT_ID) uzywa podkreslnikow zamiast myslnikow.

Nadpisywanie konfiguracji za pomoca setConfig()

Przed wywolaniem init() mozesz nadpisac domyslne ustawienia chatbota za pomoca setConfig():

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
      headerTitle: 'Support Assistant',
      maxWindowWidth: '700px',
      showChatButton: false,
      flowVariables: {
        userId: '12345',
        plan: 'enterprise',
      },
      urlSuffix: '?utm_source=chatbot',
    });

    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      // Chatbot initialised with custom config
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

Dostepne opcje konfiguracyjne

OpcjaTypOpis
headerTitlestringNiestandardowy tekst naglowka
maxWindowWidthstringMaksymalna szerokosc okna czatu (np. "700px")
maxWindowHeightstringMaksymalna wysokosc okna czatu
inputPlaceholderstringTekst zastepczy pola wiadomosci
showChatButtonbooleanPokaz lub ukryj domyslny plywajacy przycisk czatu
openChatPanelbooleanAutomatycznie otworz panel czatu przy ladowaniu strony
flowVariablesobjectPary klucz-wartosc z niestandardowymi danymi przekazywanymi do przeplywu. Wartosci moga byc dowolnym typem mozliwym do serializacji do JSON (string, liczba, boolean, obiekt, tablica).
urlSuffixstringCiag zapytania dolaczany do wszystkich URL-i generowanych przez chatbota
cookieConsentbooleanWlacz trwalosc sesji za pomoca plikow cookie
embeddedstringUstaw, aby wlaczyc tryb osadzony (bez przycisku zamykania)
themestringTryb motywu

Zmienne przeplywu: Przekazywanie dynamicznych danych

flowVariables sa scalane do kazdej sesji tworzonej przez chatbota. Sa zazwyczaj uzywane jako statyczny kontekst (znany w momencie ladowania strony): identyfikator uzytkownika, plan, biezacy jezyk itp.

window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
  flowVariables: {
    userId: getCurrentUserId(),
    userEmail: getCurrentUserEmail(),
    currentPage: window.location.pathname,
    plan: 'enterprise',
  },
});

Jesli uzytkownik nawiguje po otwarciu czatu, wartosci przekazane tutaj staja sie nieaktualne. Aby zaktualizowac je w trakcie rozmowy, wywolaj chatbotManager.sendHook() z options.flowVariables — patrz Komunikacja host → przeplyw w trakcie rozmowy ponizej.

Sufiks URL: Sledzenie interakcji chatbota

Parametr urlSuffix dolacza ciag zapytania do kazdego URL-a generowanego przez chatbota. Jest to przydatne do sledzenia ruchu generowanego przez chatbota w narzedziach analitycznych:

window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
  urlSuffix: '?utm_source=chatbot&utm_medium=widget',
});

Przypadki uzycia:

  • Sledzenie konwersji z interakcji chatbota w Google Analytics.
  • Analiza zachowan uzytkownikow po interakcji z chatbotem.
  • Przypisywanie kampanii, ktore napedzaja zaangazowanie w chatbota.

Logo

Gotowy na rozwój swojej firmy?

Rozpocznij bezpłatny okres próbny już dziś i zobacz rezultaty w ciągu kilku dni.

Komunikacja host → przeplyw w trakcie rozmowy

Dodane w kwietniu 2026 jako czesc funkcji FlowHunt Chat Hook.

W aplikacjach jednostronicowych (SPA) okno czatu zwykle pozostaje otwarte, gdy uzytkownik nawiguje miedzy ekranami. Po uruchomieniu czatu wartosci flowVariables przekazane przez setConfig() staja sie nieaktualne i nie ma sposobu, aby zasygnalizowac przeplywowi cos, co wydarzylo sie na stronie hosta. Pojedyncza metoda menedzera — sendHook(name, payload, options?) — pokrywa zarowno przypadki “uruchom wyzwalacz”, jak i “po prostu zaktualizuj kontekst”:

  • Przekaz name i (opcjonalnie) payload, aby uruchomic wyzwalacz Chat Hook przeplywu. Autor przeplywu umieszcza jeden wezel Chat Hook na kanwie i rozgalezia logike na podstawie {ChatHook.hook_name}, aby zdecydowac, co zrobic.
  • Przekaz options.flowVariables, aby jednoczesnie scalic zmienne sesji — wartosci sa utrwalane przed uruchomieniem wyzwalacza i pozostaja dostepne dla reszty sesji.
  • Jesli przeplyw nie ma wyzwalacza Chat Hook, wywolanie jest cichym 200 no-op: options.flowVariables nadal jest scalane, ale zaden wyzwalacz nie dziala i nie sa pobierane zadne kredyty. Oznacza to, ze strony hosta moga wywolywac sendHook() optymistycznie, nie wiedzac, czy autor przeplywu juz podlaczyl wyzwalacz.

sendHook() jest bezpiecznym no-op przed istnieniem sesji (wewnetrznie buforowane i wysylane, gdy sesja zostanie utworzona) i nigdy nie rzuca wyjatku do strony hosta — bledy sieci sa logowane wylacznie przez console.warn.

Limity wejsciowe

Ograniczenia po stronie serwera i klienta dotyczace sendHook(). Ich naruszenie nie powoduje awarii — backend zwraca HTTP 422, a menedzer loguje przez console.warn bez rzucania wyjatku.

OgraniczenieLimitGdzie egzekwowanePrzy naruszeniu
Dlugosc name w sendHook1–256 znakowBackend (Pydantic)HTTP 422, wyzwalacz nie uruchamia sie
Liczba kluczy w options.flowVariables≤ 64Backend (Pydantic)HTTP 422, nic nie jest utrwalane
Dlugosc kazdego klucza w options.flowVariables≤ 128 znakowBackend (Pydantic)HTTP 422, nic nie jest utrwalane
Wywolania przed sesja buforowane przez menedzera50Widget (w przegladarce)Najstarsze wywolanie w kolejce jest odrzucane i logowane przez console.warn

Limit bufora przed sesja ma znaczenie tylko na stronach, gdzie tworzenie sesji nie powodzi sie w nieskonczonosc (np. trwaly blad sieci). W normalnych warunkach kolejka jest oprozniana, gdy tylko uruchomi sie onFHChatbotSessionCreated.

1. Dodawanie wyzwalacza Chat Hook (po stronie autora przeplywu)

  1. Otworz przeplyw powiazany z Twoim chatbotem w edytorze FlowHunt.
  2. Przeciagnij wezel wyzwalacza Chat Hook na kanwe. Edytor wymusza pojedynczy wyzwalacz na przeplyw — wiele nie jest dozwolone.
  3. (Opcjonalnie) Wlacz Validate Payload Schema i zdefiniuj JSON Schema, ktoremu musi odpowiadac przychodzacy payload. Walidacja odbywa sie wewnatrz kroku — niezgodnosc objawia sie jako zdarzenie bledu przeplywu (endpoint nadal zwraca 200; blad jest widoczny przez onFHError).
  4. Podlacz wyjscia wyzwalacza (hook_name, payload, flow_variables) do dowolnych dalszych krokow, ktore chcesz uruchomic (Generator, Chat Output, Tool Calls, galezie warunkowe na hook_name itd.).
  5. Opublikuj przeplyw.

2. Rozgalezianie na rozne nazwy hookow wewnatrz przeplywu

name przekazywane przez strone hosta do sendHook() jest etykieta dla Twojego przeplywu, na ktorej rozgaleziasz logike, a nie kluczem routingu — backend nie dopasowuje nazw do wezlow. Zamiast tego pojedynczy wyzwalacz Chat Hook przeplywu uruchamia sie i udostepnia nazwe jako {ChatHook.hook_name}, do ktorej odwolujesz sie w logice swojego przeplywu, aby zdecydowac, co zrobic.

Przykladowy prompt systemowy:

If {ChatHook.hook_name} is "screen_changed", briefly summarise the page at
{ChatHook.payload.url}. If it is "user_action", acknowledge the action and
update memory. Otherwise, continue the conversation normally.

Dla bardziej zlozonego routingu podlacz krok warunkowy do {ChatHook.hook_name} i rozgaleziaj na wiele dalszych sciezek.

3. chatbotManager.sendHook(name, payload, options?)

chatbotManager.sendHook(
  name: string,
  payload?: Record<string, unknown>,
  options?: { flowVariables?: Record<string, unknown> }
): Promise<void>;

Argumenty

ArgumentTypWymaganyOpis
namestringtakEtykieta przekazywana do przeplywu jako {ChatHook.hook_name}. Wyzwalacz uruchamia sie niezaleznie od wartosci; logika Twojego przeplywu rozgalezia na jej podstawie.
payloadobjectniePayload JSON przekazywany do wyzwalacza jako {ChatHook.payload}. Walidowany wzgledem schematu wezla, jesli jest wlaczony. Domyslnie {}.
options.flowVariablesobjectnieZmienne sesji do scalenia przed uruchomieniem wyzwalacza. Dostepne dla dalszych krokow i przyszlych wiadomosci uzytkownika.

Zachowanie

  • Wywolanie przed onFHChatbotSessionCreated jest bezpieczne; wywolanie jest buforowane i wysylane, gdy sesja zaczyna istniec. Bufor ma limit — patrz Limity wejsciowe powyzej.
  • Jesli przeplyw nie ma wyzwalacza Chat Hook, zadanie jest cichym 200 no-op — wiec strony hosta moga wywolywac sendHook() optymistycznie, zanim autor przeplywu podlaczy wyzwalacz. options.flowVariables jest nadal utrwalane nawet w tym przypadku, wiec to samo wywolanie sluzy jako aktualizacja samego kontekstu.
  • Jesli wyzwalacz Chat Hook ma wlaczona walidacje schematu i payload jej nie przejdzie, walidacja odbywa sie wewnatrz kroku — endpoint zwraca 200, ale przeplyw emituje zdarzenie bledu kroku (obserwowalne przez onFHError).
  • name i options.flowVariables sa ograniczone — patrz Limity wejsciowe powyzej. Naruszenia zwracaja HTTP 422 i nic nie jest utrwalane.
  • Udane wywolania emituja zdarzenie onFHChatbotFlowVariablesUpdate, jesli dostarczono options.flowVariables (patrz Dokumentacja zdarzen).
  • Nigdy nie rzuca wyjatku. Niepowodzenia sieci i odpowiedzi inne niz 2xx sa logowane przez console.warn.

Przyklad — proaktywna sugestia przy nawigacji w SPA

window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
  window.addEventListener('hashchange', function () {
    chatbotManager.sendHook('screen_changed', {
      url: window.location.href,
      screen_name: getScreenName(),
    }, {
      flowVariables: { current_page_url: window.location.href },
    });
  });
});

Przyklad — aktualizacja samego kontekstu (brak podlaczonego Chat Hook)

Jesli przeplyw nie ma wyzwalacza Chat Hook, wywolanie jest cichym 200 — wiec to samo API moze utrzymywac flow_variables w synchronizacji bez uruchamiania czegokolwiek:

window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
  window.addEventListener('hashchange', function () {
    chatbotManager.sendHook('navigate', {}, {
      flowVariables: {
        current_page_url: window.location.href,
        screen_name: getScreenName(),
      },
    });
  });
});

4. Jak autor przeplywu konsumuje te wartosci

  • {ChatHook.hook_name} i {ChatHook.payload.foo} — wartosci przekazane przez sendHook('x', { foo: 1 }) sa udostepniane na sciezce wykonania wyzwalacza Chat Hook. Tylko dostepne na sciezce uruchomionej przez wywolanie hooka.
  • {flow_variables.foo} — wartosci przekazane przez options.flowVariables sa scalane do worka zmiennych sesji przed uruchomieniem wyzwalacza. Kazda sciezka wykonania (wlacznie z normalnymi wiadomosciami uzytkownika uruchamianymi przez Chat Input) moze je odczytywac.

Jesli chcesz, aby nastepna wiadomosc uzytkownika widziala nowa wartosc, umiesc ja w options.flowVariables — sam payload wplywa tylko na uruchomienie wykonania zainicjowane przez ten hook.


Dokumentacja zdarzen

FlowHunt JS API wysyla 11 niestandardowych zdarzen na obiekcie window. Wszystkie zdarzenia uzywaja API CustomEvent z ustawieniami bubbles: true i composed: true.

onFHChatbotReady

Uruchamiane, gdy widget chatbota zostal w pelni wyrenderowany i jest gotowy do uzycia.

  • Dane zdarzenia: brak.
  • Kiedy: po zamontowaniu DOM widgetu i gdy przycisk czatu jest widoczny.

onFHChatbotSessionCreated

Uruchamiane, gdy na serwerze tworzona jest nowa sesja czatu.

  • Dane zdarzenia: event.detail.sessionId — identyfikator nowo utworzonej sesji.
  • Kiedy: po udanym wywolaniu API tworzenia sesji.

onFHChatbotWindowOpened

Uruchamiane, gdy uzytkownik otwiera okno czatu. Nie uruchamiane w trybie osadzonym.

onFHChatbotWindowClosed

Uruchamiane, gdy uzytkownik zamyka okno czatu. Nie uruchamiane w trybie osadzonym.

onFHMessageSent

Uruchamiane, gdy uzytkownik wysyla wiadomosc.

event.detail.metadata = {
  content: 'Hello, I need help with...',
  createdAt: '2026-02-19T10:30:00.000Z',
};

onFHMessageReceived

Uruchamiane, gdy chatbot odbiera i wyswietla odpowiedz.

event.detail.metadata = {
  flow_id: 'abc123',
  message_id: 'msg_456',
  message: 'Sure, I can help you with that!',
  sender: {
    sender_name: 'Support Agent',
    sender_avatar: 'https://example.com/avatar.png',
  },
};

sender jest opcjonalne i wystepuje tylko wtedy, gdy zaangazowany jest ludzki agent.

onFHFormDataSent

Uruchamiane, gdy uzytkownik przesyla dane formularza przez chatbota.

event.detail.metadata = {
  objectData: { name: 'John', email: 'john@example.com' },
  createdAt: '2026-02-19T10:31:00.000Z',
};

onFHFeedback

Uruchamiane, gdy uzytkownik daje ocene kciuk w gore / kciuk w dol na wiadomosc chatbota.

event.detail.metadata = {
  message_id: 'msg_456',
  content: 'Optional feedback text',
  feedback: 'P', // 'P' = positive, 'N' = negative
};

onFHToolCall

Uruchamiane, gdy narzedzie lub akcja jest wykonywana podczas przetwarzania przeplywu. Uruchamiane tylko w trybach flowAssistant i flowAssistantV3.

event.detail.metadata = {
  metadata: {
    flow_id: 'abc123',
    message_id: 'msg_789',
    message: 'Calling search API...',
  },
  createdAt: '2026-02-19T10:32:00.000Z',
};

onFHError

Uruchamiane, gdy podczas dzialania chatbota wystapi blad.

event.detail.metadata = {
  metadata: {
    flow_id: 'abc123',
    message_id: 'msg_err',
    message: 'Flow execution failed',
  },
  createdAt: '2026-02-19T10:33:00.000Z',
};

onFHChatbotFlowVariablesUpdate

Dodane w kwietniu 2026.

Uruchamiane po udanym wywolaniu chatbotManager.sendHook(...), ktore dostarczylo options.flowVariables. Nie uruchamiane dla wywolan sendHook() pomijajacych flowVariables.

event.detail = {
  variables: {
    current_page_url: 'https://example.com/products',
    screen_name: 'products',
  },
};

Uzyj go do obserwacji scalonych zmiennych (np. do synchronizacji wlasnego stanu po stronie hosta, do debugowania lub do ponownego renderowania elementu UI zaleznego od tych samych danych).


Subskrybowanie zdarzen

Istnieja dwa sposoby subskrybowania zdarzen chatbota.

Metoda 1: Nasluchiwacze zdarzen okna

Uzyj window.addEventListener w dowolnym miejscu swojej strony. Dziala to nawet przed zaladowaniem chatbota:

<script>
document.addEventListener('DOMContentLoaded', function () {
  window.addEventListener('onFHChatbotReady', function () {
    console.log('Chatbot is ready');
  });

  window.addEventListener('onFHChatbotSessionCreated', function (event) {
    console.log('Session created:', event.detail.sessionId);
  });

  window.addEventListener('onFHChatbotWindowOpened', function () {
    console.log('Chat window opened');
  });

  window.addEventListener('onFHChatbotWindowClosed', function () {
    console.log('Chat window closed');
  });

  window.addEventListener('onFHMessageSent', function (event) {
    console.log('User sent:', event.detail.metadata.content);
  });

  window.addEventListener('onFHMessageReceived', function (event) {
    console.log('Bot replied:', event.detail.metadata.message);
  });

  window.addEventListener('onFHFormDataSent', function (event) {
    console.log('Form submitted:', event.detail.metadata.objectData);
  });

  window.addEventListener('onFHFeedback', function (event) {
    var fb = event.detail.metadata;
    console.log('Feedback on message', fb.message_id, ':', fb.feedback);
  });

  window.addEventListener('onFHToolCall', function (event) {
    console.log('Tool called:', event.detail.metadata);
  });

  window.addEventListener('onFHError', function (event) {
    console.error('Chatbot error:', event.detail.metadata);
  });

  window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
    console.log('Variables merged:', event.detail.variables);
  });
});
</script>

Aby usunac nasluchiwacz, zachowaj referencje do funkcji obslugi:

var handleMessage = function (event) {
  console.log(event.detail.metadata);
};
window.addEventListener('onFHMessageReceived', handleMessage);
// Later …
window.removeEventListener('onFHMessageReceived', handleMessage);

Metoda 2: Metody callback menedzera

Wewnatrz callbacku init() uzyj wbudowanych metod menedzera chatbota:

window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
  chatbotManager.onSessionCreated(function () {
    console.log('Session created');
  });

  chatbotManager.onWindowOpened(function () {
    console.log('Window opened');
  });

  chatbotManager.onWindowClosed(function () {
    console.log('Window closed');
  });

  chatbotManager.onMessageSent(function (event) {
    console.log('User sent:', event.metadata);
  });

  chatbotManager.onMessageReceived(function (event) {
    console.log('Bot replied:', event.metadata);
  });

  chatbotManager.onFormDataSent(function (event) {
    console.log('Form data:', event.metadata);
  });

  chatbotManager.onFeedback(function (event) {
    console.log('Feedback:', event.metadata);
  });

  chatbotManager.onToolCall(function (event) {
    console.log('Tool call:', event.metadata);
  });

  chatbotManager.onError(function (event) {
    console.error('Error:', event.metadata);
  });
});

Dokumentacja metod menedzera

MetodaParametryOpis
onSessionCreated(fn)fn: () => voidNasluchuj tworzenia sesji
onWindowOpened(fn)fn: () => voidNasluchuj otwierania okna
onWindowClosed(fn)fn: () => voidNasluchuj zamykania okna
onMessageSent(fn)fn: (event) => voidNasluchuj wiadomosci uzytkownika
onMessageReceived(fn)fn: (event) => voidNasluchuj odpowiedzi bota
onFormDataSent(fn)fn: (event) => voidNasluchuj wysylania formularzy
onFeedback(fn)fn: (event) => voidNasluchuj opinii uzytkownikow
onToolCall(fn)fn: (event) => voidNasluchuj wykonan narzedzi
onError(fn)fn: (event) => voidNasluchuj bledow
openChat()Otwiera panel czatu
closeChat()Zamyka panel czatu
sendHook(name, payload?, options?) (nowe)name: string, payload?: object, options?: { flowVariables?: object }Uruchamia wyzwalacz Chat Hook w dzialajacym przeplywie (lub po cichu scala options.flowVariables, jesli zaden wyzwalacz nie jest podlaczony)

Niestandardowa aktywacja czatu: Ukryj przycisk i otworz po kliknieciu

Aby w pelni kontrolowac, kiedy chatbot sie pojawia, ukryj domyslny plywajacy przycisk i otworz czat programowo — na przyklad z wlasnego niestandardowego przycisku.

<button id="my-chat-button">Chat with us</button>

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });

    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      document.getElementById('my-chat-button')
        .addEventListener('click', function () {
          chatbotManager.openChat();
        });
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

Pokaz niestandardowy przycisk dopiero gdy chatbot jest gotowy

Mozesz polaczyc ukryta aktywacje z nasluchiwaczami zdarzen, aby tworzyc zaawansowane interakcje:

<button id="open-chat" style="display:none;">Need help?</button>

<script>
  window.addEventListener('onFHChatbotReady', function () {
    document.getElementById('open-chat').style.display = 'block';
  });
</script>

<script id="fh-chatbot-script-YOUR_CHATBOT_ID">
  var currentScript = document.currentScript
    || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

  var script = document.createElement('script');
  script.async = true;
  script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
    + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

  script.onload = function () {
    window.FHChatbot_YOUR_CHATBOT_ID.setConfig({ showChatButton: false });

    window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
      document.getElementById('open-chat')
        .addEventListener('click', function () {
          chatbotManager.openChat();
        });
    });
  };

  if (currentScript && currentScript.parentNode) {
    currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
  } else {
    document.head.appendChild(script);
  }
</script>

Kompletny przyklad integracji

Pelny dzialajacy przyklad demonstrujacy nadpisywanie konfiguracji, sledzenie zdarzen, niestandardowa aktywacje czatu i nowa metode sendHook() razem:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>FlowHunt Chatbot Integration</title>
  </head>
  <body>
    <h1>My Website</h1>
    <button id="open-chat-btn">Talk to our AI assistant</button>
    <button id="close-chat-btn">Close chat</button>

    <!-- Subscribe to events before the chatbot loads -->
    <script>
      document.addEventListener('DOMContentLoaded', function () {
        window.addEventListener('onFHChatbotReady', function () {
          console.log('Chatbot widget is ready');
        });

        window.addEventListener('onFHChatbotSessionCreated', function (event) {
          console.log('New chat session started:', event.detail.sessionId);
        });

        window.addEventListener('onFHMessageSent', function (event) {
          console.log('User message:', event.detail.metadata.content);
        });

        window.addEventListener('onFHMessageReceived', function (event) {
          console.log('Bot response:', event.detail.metadata.message);
        });

        window.addEventListener('onFHChatbotFlowVariablesUpdate', function (event) {
          console.log('Context updated:', event.detail.variables);
        });

        window.addEventListener('onFHError', function (event) {
          console.error('Chatbot error:', event.detail.metadata);
        });
      });
    </script>

    <!-- FlowHunt integration -->
    <script id="fh-chatbot-script-YOUR_CHATBOT_ID">
      var currentScript = document.currentScript
        || document.getElementById('fh-chatbot-script-YOUR_CHATBOT_ID');

      var script = document.createElement('script');
      script.async = true;
      script.src = 'https://app.flowhunt.io/api/chatbot/YOUR_CHATBOT_ID'
        + '?workspace_id=YOUR_WORKSPACE_ID&v=2';

      script.onload = function () {
        window.FHChatbot_YOUR_CHATBOT_ID.setConfig({
          showChatButton: false,
          headerTitle: 'AI Assistant',
          maxWindowWidth: '600px',
          flowVariables: {
            source: 'website',
            current_page_url: window.location.href,
          },
          urlSuffix: '?utm_source=chatbot',
        });

        window.FHChatbot_YOUR_CHATBOT_ID.init(function (chatbotManager) {
          // Open / close from custom buttons
          document.getElementById('open-chat-btn')
            .addEventListener('click', function () {
              chatbotManager.openChat();
            });
          document.getElementById('close-chat-btn')
            .addEventListener('click', function () {
              chatbotManager.closeChat();
            });

          // Keep the flow's context in sync with SPA navigation and
          // optionally fire the Chat Hook trigger (if the flow has one wired).
          // If the flow has no Chat Hook, the call is a silent 200 — the
          // flow_variables still get merged, so the same line covers both
          // "notify the flow" and "just update context".
          window.addEventListener('hashchange', function () {
            chatbotManager.sendHook('screen_changed', {
              url: window.location.href,
            }, {
              flowVariables: { current_page_url: window.location.href },
            });
          });
        });
      };

      if (currentScript && currentScript.parentNode) {
        currentScript.parentNode.insertBefore(script, currentScript.nextSibling);
      } else {
        document.head.appendChild(script);
      }
    </script>
  </body>
</html>

Najczęściej zadawane pytania

Dowiedz się więcej

interactive-mcp
interactive-mcp

interactive-mcp

Zintegruj FlowHunt z interactive-mcp, aby umożliwić bezpieczną, interaktywną komunikację w czasie rzeczywistym między dużymi modelami językowymi a użytkownikami...

4 min czytania
AI interactive-mcp +7