Funkcje niestandardowe
Funkcje niestandardowe pozwalają Twojemu botowi AI łączyć się z innymi systemami podczas rozmów na żywo. Zamiast mówić „Sprawdzę to i wrócę z odpowiedzią”, bot może sprawdzić status zamówienia, zweryfikować stan magazynowy lub utworzyć rekord w Twoim systemie CRM (system zarządzania relacjami z klientami – oprogramowanie używane do śledzenia potencjalnych klientów i klientów, takie jak HubSpot lub Salesforce) – wszystko w czasie rzeczywistym, podczas gdy klient czeka.
Funkcje niestandardowe a webhooki
Jest to najczęstszy punkt nieporozumień, więc warto go wyjaśnić, zanim zaczniesz cokolwiek budować.
| Webhooki | Funkcje niestandardowe | |
|---|---|---|
| Kierunek | Jednokierunkowy (wyślij i zapomnij) | Dwukierunkowy (wywołaj i czekaj) |
| Co robi bot | Wysyła powiadomienie, gdy coś się wydarzy, a następnie kontynuuje działanie. | Wywołuje funkcję, wstrzymuje się, czeka na odpowiedź i wykorzystuje otrzymane dane, aby kontynuować rozmowę. |
| Widoczność dla rozmowy | Wynik operacji jest niewidoczny dla bota — bot nigdy nie dowiaduje się, co się stało. | Odpowiedź jest przekazywana bezpośrednio do AI, dzięki czemu bot może ją zacytować, przeanalizować i odpowiedzieć na jej podstawie klientowi. |
| Najlepsze do | Rejestrowania zdarzeń, synchronizacji danych z CRM, wyzwalania zewnętrznych automatyzacji (Zapier, Make, n8n). | Wszystkiego, gdzie bot potrzebuje odpowiedzi, zanim będzie mógł odpowiedzieć — wyszukiwania na żywo, cen w czasie rzeczywistym, generowania treści w locie. |
Kiedy co wybrać: Jeśli musisz tylko poinformować inny system, że coś się wydarzyło, użyj webhooka – jednokierunkowej zautomatyzowanej wiadomości wysyłanej do innego systemu (zobacz Ustawienia → Integracje → Webhooki). Jeśli bot musi dowiedzieć się czegoś z innego systemu przed kontynuowaniem rozmowy, użyj funkcji niestandardowej.
Przykłady tego, co umożliwiają funkcje niestandardowe
Ponieważ odpowiedź wraca do rozmowy, funkcje niestandardowe otwierają możliwości, których webhooki po prostu nie mają:
- Sprawdzanie stanów magazynowych w Shopify lub WooCommerce na żywo — Zanim bot poda cenę klientowi, sprawdza stan magazynowy w czasie rzeczywistym i odpowiada „Tak, mamy 12 sztuk w rozmiarze M” zamiast „sprawdzę to i wrócę z odpowiedzią”.
- Dynamiczne ceny z Arkuszy Google — Twój zespół sprzedaży aktualizuje ceny w arkuszu; bot odczytuje najnowszy wiersz w trakcie rozmowy i podaje aktualną cenę bez konieczności ingerencji w konfigurację AI.
- Agent oddzwaniający Voice-AI — Gdy bot zakwalifikuje potencjalnego klienta, uruchamia agenta głosowego (na przykład dzwoniącego opartego na ElevenLabs), aby oddzwonił do klienta w ciągu kilku minut, i potwierdza klientowi: „świetnie, proszę spodziewać się telefonu w ciągu najbliższych 5 minut”.
- Niestandardowa wycena w PDF, generowana i wysyłana e-mailem w trakcie czatu — Bot zbiera wymagania, wywołuje Twój generator wycen, otrzymuje adres URL do pliku PDF i mówi klientowi: „Właśnie wysłałem wycenę na Twój adres e-mail — sprawdź skrzynkę odbiorczą”.
Co mogą robić funkcje niestandardowe?
Pomyśl o funkcjach niestandardowych jako o nadaniu botowi supermocy wykraczających poza zwykłe czatowanie. Oto przykłady z życia wzięte:
- Śledzenie zamówień - Klient pyta „Gdzie jest moje zamówienie?”, a bot sprawdza Twój system e-commerce i odpowiada, podając status przesyłki oraz link do śledzenia
- Sprawdzanie stanów magazynowych - „Czy macie to w rozmiarze 10?” Bot sprawdza Twój system magazynowy i udziela odpowiedzi w czasie rzeczywistym
- Aktualizacje CRM - Gdy bot zakwalifikuje potencjalnego klienta, automatycznie tworzy lub aktualizuje rekord w HubSpot, Salesforce lub dowolnym innym systemie CRM
- Generowanie wycen - Bot zbiera wymagania klienta i generuje spersonalizowaną wycenę z Twojego systemu cenników
- Rezerwacje - Bot tworzy spotkanie w Twoim zewnętrznym systemie rezerwacji
- Weryfikacja rabatów - „Czy ten kod kuponu jest ważny?” Bot sprawdza i potwierdza
- Wyszukiwanie konta - Powracający klient jest automatycznie rozpoznawany, a szczegóły jego konta są pobierane
Klient nigdy nie widzi tego, co dzieje się za kulisami. Po prostu doświadcza kontaktu z botem, który potrafi odpowiedzieć na jego pytania, korzystając z rzeczywistych, aktualnych informacji.
Jak działają funkcje niestandardowe (wersja uproszczona)
Oto co dzieje się, gdy funkcja niestandardowa jest wyzwalana podczas rozmowy:
- Klient pyta o coś, co wymaga danych w czasie rzeczywistym (np. „Gdzie jest moje zamówienie?”)
- Bot rozpoznaje, że aby odpowiedzieć, musi użyć funkcji niestandardowej
- Bot zbiera wszelkie brakujące informacje od klienta (np. „Jaki jest numer Twojego zamówienia?”)
- Platforma wysyła żądanie do Twojego systemu (Twojej strony internetowej, CRM lub innego narzędzia) z odpowiednimi szczegółami
- Twój system odpowiada danymi (np. statusem zamówienia, numerem śledzenia, datą dostawy)
- Bot odczytuje odpowiedź i tworzy naturalną odpowiedź: „Twoje zamówienie ORD-4582 zostało wysłane i powinno dotrzeć do piątku!”
Ile kosztuje wywołanie funkcji niestandardowej
Każde wywołanie funkcji niestandardowej jest rozliczane zgodnie z poziomem jakości AI Twojego Agenta:
| Poziom jakości AI | Kredyty za wywołanie funkcji niestandardowej | Z podłączonym własnym kluczem Anthropic (BYOK) |
|---|---|---|
| Pro | 1 kredyt | 0 kredytów — działa na Twoim kluczu |
| Economy (przestarzałe) | 0,5 kredytu | 0 kredytów — działa na Twoim kluczu |
| Max | 0,25 kredytu | nadal 0,25 kredytu, naliczane nawet przy podłączonym własnym kluczu |
| Mini | 0,15 kredytu | nadal 0,15 kredytu, naliczane nawet przy podłączonym własnym kluczu |
Konfigurowanie funkcji niestandardowej (krok po kroku)
- W głównym pasku bocznym, w sekcji AI Studio, kliknij Custom Functions.
- Kliknij zielony przycisk + Add Function (lub New function) w prawym górnym rogu.
Lista funkcji niestandardowych wyświetla tabelę z następującymi kolumnami:
| Kolumna | Co pokazuje |
|---|---|
| Name | Nazwa funkcji (np. check_order_status) |
| Description | Krótkie podsumowanie działania funkcji (skrócone do 50 znaków w tabeli) |
| Method | Użyta metoda HTTP, pokazana jako kolorowy znacznik: GET (niebieski), POST (zielony), PUT (pomarańczowy), DELETE (czerwony) |
| Created | Data utworzenia funkcji |
Dzięki temu łatwo jest przejrzeć swoje funkcje i szybko znaleźć tę, której potrzebujesz.
Krok 1: Nadaj nazwę i opis
| Pole | Co wpisać | Przykład |
|---|---|---|
| Name | Krótka nazwa używająca liter, cyfr i podkreśleń | check_order_status |
| Description | Wyjaśnij, co robi ta funkcja (AI czyta to, aby zdecydować, kiedy jej użyć) | „Wyszukuje aktualny status zamówienia klienta za pomocą numeru zamówienia” |
| Purpose (AI Action) | Powiedz AI dokładnie, kiedy i jak użyć tej funkcji | „Użyj tego, gdy klient pyta o status zamówienia, wysyłkę lub dostawę. Najpierw poproś o numer zamówienia.” |
Wskazówka: Bądź bardzo precyzyjny w opisie i celu. Im jaśniej określisz, kiedy funkcja powinna być użyta, tym bardziej niezawodnie bot będzie z niej korzystał we właściwym momencie.
Krok 2: Skonfiguruj połączenie
Musisz wskazać aplikacji, gdzie wysłać żądanie:
| Pole | Co wpisać | Przykład |
|---|---|---|
| URL | Adres internetowy punktu końcowego Twojego systemu (konkretny adres w Twoim systemie, który odbiera żądanie i odsyła dane) | https://api.yourstore.com/v1/orders/status |
| Metoda | Typ wysyłanego żądania | Zobacz opcje poniżej |
Którą metodę wybrać:
| Metoda | Kiedy używać |
|---|---|
| GET | Wyszukiwanie informacji (status zamówienia, stan magazynowy, szczegóły konta) |
| POST | Tworzenie nowych rekordów (zgłoszenia do pomocy technicznej, leady, rezerwacje) lub złożone wyszukiwania |
| PUT | Całkowita aktualizacja istniejącego rekordu |
| PATCH | Aktualizacja części istniejącego rekordu |
| DELETE | Usuwanie rekordu |
Jeśli nie masz pewności, której użyć, skonsultuj się z programistą lub sprawdź dokumentację systemu, z którym się łączysz. GET (do wyszukiwania) i POST (do tworzenia rekordów) są najczęściej używane.
Krok 3: Dodaj nagłówki uwierzytelniania
Większość systemów wymaga uwierzytelnienia, aby zaakceptować żądania. Dodaj wszelkie wymagane nagłówki:
| Nagłówek | Przykładowa wartość |
|---|---|
Authorization |
Bearer your-api-key-here |
Content-Type |
application/json |
Wartości nagłówków zawierające klucz lub hasło, takie jak Authorization lub X-API-Key, po wpisaniu są wyświetlane jako kropki. Kliknij ikonę oka obok wartości, aby ją zobaczyć.
Wskazówka dotycząca bezpieczeństwa: Używaj dedykowanego klucza API z ograniczonymi uprawnieniami. Nie używaj danych logowania na poziomie administratora.
Gdzie znaleźć klucze API: Sprawdź ustawienia lub sekcję dla programistów w systemie, z którym się łączysz (np. CRM, platforma e-commerce lub narzędzie do rezerwacji).
Krok 4: Zdefiniuj dane wejściowe (co wysyła bot)
Parametry wejściowe to informacje, które bot zbiera podczas rozmowy i wysyła do Twojego systemu.
Dla każdego parametru określasz:
| Właściwość | Co oznacza |
|---|---|
| Nazwa | Nazwa parametru (musi być zgodna z tym, czego oczekuje Twój system) |
| Typ | Rodzaj danych (tekst, liczba, prawda/fałsz itp.) |
| Opis | Poinformuj sztuczną inteligencję, czym są te informacje i gdzie znaleźć je w rozmowie |
| Wymagane | Jeśli ustawiono na Tak, bot poprosi klienta o te informacje przed kontynuowaniem |
Dostępne typy parametrów:
| Typ | Co to oznacza |
|---|---|
| string | Tekst (nazwy, numery zamówień, adresy) |
| number | Wartość liczbowa (ilość, cena) |
| boolean | Prawda lub fałsz (wartości tak/nie) |
| array | Lista elementów. Wysyłana jako rzeczywista lista JSON — w Uruchom test możesz wpisać ją jako [8624], ["a", "b"] lub po prostu oddzielić przecinkami (8624, 8625), a zostanie ona przekonwertowana za Ciebie. Jeśli Twoje API jest rygorystyczne co do zawartości listy — np. tylko liczby — ustaw opcjonalny Typ elementu obok typu, a każda wartość na liście zostanie do niego przekonwertowana. |
| query_param | Tekst wysyłany jako parametr URL zamiast w treści żądania. Użyj tego, gdy Twoje API oczekuje danych w adresie URL (np. ?order_id=123). |
Każdy parametr posiada również opcjonalne pole Ścieżka treści żądania (Request body path). Zazwyczaj parametr jest wysyłany jako pole najwyższego poziomu w treści żądania (lub jako wartość ciągu zapytania dla typu query_param). Jeśli Twój punkt końcowy oczekuje zagnieżdżenia — np. {"order": {"id": "ORD-123"}} — ustaw ścieżkę na order.id, a platforma automatycznie zagnieździ tam wartość.
Przykład: Dla wyszukiwania statusu zamówienia możesz zdefiniować:
- order_number (string, wymagane): „Numer zamówienia klienta. Zazwyczaj zaczyna się od ORD- i następuje po nim ciąg cyfr. Zapytaj klienta o ten numer, jeśli go nie podał.”
- email (string, opcjonalne): „Adres e-mail klienta do dodatkowej weryfikacji. Potrzebny tylko wtedy, gdy sam numer zamówienia nie pozwala na znalezienie dopasowania.”
Co Twój system otrzymuje automatycznie
Oprócz zdefiniowanych przez Ciebie parametrów wejściowych, platforma automatycznie dołącza dane systemowe do każdego żądania. Twój punkt końcowy otrzymuje je w polu system:
| Pole systemowe | Zawartość |
|---|---|
system.contactId |
Identyfikator platformy kontaktu w konwersacji |
system.campaignId |
Identyfikuje agenta AI obsługującego konwersację, w formacie agent:<agentId> (pole zachowuje swoją starszą nazwę) |
system.userId |
Twój identyfikator użytkownika |
system.channel |
Kanał komunikacji (np. "whatsapp", "instagram") |
system.contact |
Pełny rekord kontaktu (imię i nazwisko, telefon, e-mail, tagi itp.) |
system.campaign |
Ustawienia agenta AI obsługującego konwersację (pole zachowuje swoją starszą nazwę) |
system.test |
true jeśli jest to test w trybie wypróbowania, false dla konwersacji na żywo |
system.callback_url |
Tylko gdy włączona jest opcja Wynik później: link, na który należy wysłać wynik (zobacz Długotrwałe zadania) |
system.callback_expires_at |
Tylko gdy włączona jest opcja Wynik później: czas wygaśnięcia tego linku |
Jest to przydatne, jeśli Twój system musi zidentyfikować kontakt, sprawdzić, który agent wywołał funkcję lub zachowywać się inaczej podczas testowania.
Gdy sprawdzenie uzupełniające wywołuje Twoją funkcję (zobacz Wysyłaj tylko, gdy sprawdzenie przejdzie pomyślnie), żądanie różni się od wywołania w trakcie konwersacji: nie posiada parametrów wejściowych, a pole
systemzawiera tylkosystem.contact(wraz z jegoid) oraz bloksystem.follow_up(type,cycle_number,follow_up_number,reason,campaign_id,agent_id). Nie zawiera obiektucampaign. Ustawienie Pomiń dane systemowe ma zastosowanie również do tego wywołania.
Nie potrzebujesz danych systemowych? Włącz przełącznik Pomiń dane systemowe w kreatorze funkcji. Bot wyśle wtedy tylko zdefiniowane przez Ciebie parametry wejściowe — bez danych kontaktu czy agenta. Użyj tego, jeśli Twój punkt końcowy odrzuca nieoczekiwane pola lub po prostu chcesz uzyskać mniejszy ładunek danych.
Krok 5: Przetestuj, a następnie pozwól botowi odczytać odpowiedź
Zazwyczaj nie musisz w ogóle mapować pól odpowiedzi. Gdy Twój punkt końcowy odpowie, bot odczyta całą odpowiedź JSON i użyje Opisu oraz Celu (Działanie AI) Twojej funkcji — wraz z opisem każdego parametru — aby ustalić, co jest istotne i przedstawić to w naturalny sposób. Jasny opis samej funkcji („Pobiera aktualny status zamówienia klienta, w tym informacje o wysyłce i śledzeniu”) wykonuje tutaj więcej pracy niż mapowanie pole po polu.
Jeśli Twój punkt końcowy zwraca dużą odpowiedź, a chcesz, aby bot widział tylko kilka konkretnych wartości, otwórz sekcję Mapowanie odpowiedzi (domyślnie zwiniętą, tuż nad przyciskiem Test). Każdy wiersz wybiera jedno pole najwyższego poziomu z odpowiedzi: Pole odpowiedzi to nazwa pola w odpowiedzi JSON Twojego API, a Pole wyjściowe to nazwa, pod którą bot je otrzymuje. Po wypełnieniu co najmniej jednego wiersza bot otrzyma tylko zmapowane wartości zamiast pełnej treści odpowiedzi. Pozostaw sekcję pustą, aby zachować domyślne zachowanie pełnej odpowiedzi.
Zanim zapiszesz, użyj sekcji Test na dole kreatora, aby wysłać żądanie dokładnie tak, jak zostało skonfigurowane, i zobaczyć rzeczywistą odpowiedź bez opuszczania aplikacji:
Odpowiedź, którą tutaj widzisz, to surowa odpowiedź punktu końcowego. Jeśli powyżej skonfigurowano Mapowanie odpowiedzi, bot w rzeczywistym czacie otrzyma tylko te zmapowane pola — test zawsze pokazuje pełną, surową odpowiedź, aby można było zobaczyć, co jest dostępne do zmapowania. Jeśli coś wygląda nie tak (nieoczekiwane nazwy pól, dodatkowe zagnieżdżenie), popraw to w swoim punkcie końcowym lub dostosuj mapowanie.
Przypisywanie funkcji do agenta
Po utworzeniu funkcji niestandardowej musisz wskazać każdemu agentowi, z jakich funkcji może korzystać:
- Otwórz Agenta w sekcji AI Studio → Agenci AI.
- Przejdź do zakładki Możliwości AI.
- Zobaczysz listę wszystkich utworzonych przez siebie funkcji niestandardowych. Włącz każdą funkcję, którą ma móc wywoływać bot tego Agenta.
- Kliknij Zapisz zmiany na dole. Wybory zostaną zastosowane dopiero po zapisaniu.
Dla bota danego agenta dostępne są tylko przypisane funkcje. Zapobiega to przypadkowemu użyciu przez bota funkcji, które nie są istotne.
Testowanie funkcji niestandardowych
Przed uruchomieniem przetestuj wszystko dokładnie:
- Uruchom wbudowany test - Użyj sekcji Test wewnątrz kreatora funkcji (patrz wyżej), aby szybko sprawdzić działanie bez opuszczania aplikacji — wpisz realistyczne wartości i kliknij Uruchom test.
- Przetestuj bezpośrednio punkt końcowy swojego systemu - W przypadku pełnej listy kontrolnej poniżej, dedykowane narzędzie takie jak Postman (lub Twój programista) pozwala na głębszą analizę niż pojedynczy test.
- Przetestuj w trybie wypróbowania (Try Out) - Zasymuluj rozmowę, w której klient pyta o coś, co powinno wywołać funkcję.
- Sprawdź odpowiedź - Upewnij się, że bot poprawnie odczytuje i prezentuje dane.
- Przetestuj scenariusze błędów - Co się stanie, jeśli klient poda nieprawidłowy numer zamówienia? Co jeśli Twój system jest tymczasowo niedostępny?
Gdy test zwraca błąd 401 lub 403
Błąd 401 lub 403 oznacza, że Twój punkt końcowy otrzymał żądanie, ale je odrzucił. Wskazówką jest to, że w Twoich logach nic się nie pojawia — większość narzędzi odrzuca nieautoryzowane wywołanie, zanim jeszcze rozpocznie przepływ pracy, więc po Twojej stronie nic nie widać i wygląda to tak, jakby żądanie nigdy nie dotarło.
Prawie zawsze jest to niedopasowanie uwierzytelniania: Twój punkt końcowy wymaga jednego rodzaju poświadczeń, a funkcja wysyła inne. Sprawdź, czy nagłówek dodany w Kroku 3 jest dokładnie tym, którego oczekuje Twój system.
Najczęstszą wersją tego problemu jest webhook chroniony za pomocą Basic Auth (n8n, Make i większość narzędzi hostowanych samodzielnie oferuje to jako pole wyboru w samym webhooku), podczas gdy funkcja wysyła niestandardowy nagłówek z kluczem tajnym, taki jak X-My-Secret. Basic Auth akceptuje tylko nagłówek Authorization, więc niestandardowy nagłówek jest ignorowany, a wywołanie odrzucane. Masz dwie opcje:
- Wyłącz Basic Auth w webhooku i sprawdź swój niestandardowy nagłówek bezpośrednio wewnątrz przepływu pracy.
- Pozostaw włączone Basic Auth i dodaj do funkcji nagłówek
Authorization, którego wartością jest słowoBasic, a po nim Twój zakodowany w base64username:password.
Oba rozwiązania działają — po prostu upewnij się, że obie strony są ze sobą zgodne.
Gdy test zwraca błąd 404
Adres URL punktu końcowego jest nieprawidłowy lub przepływ pracy nie został opublikowany. W przypadku n8n każdy webhook ma oddzielny adres URL Test oraz Production, a ten testowy nasłuchuje tylko wtedy, gdy masz otwarty edytor. Skopiuj adres URL wersji produkcyjnej (Production) i upewnij się, że przepływ pracy jest aktywny.
Wyświetlanie błędów w Try Out i Chats
Gdy AI wywołuje funkcję niestandardową podczas konwersacji, a wywołanie kończy się niepowodzeniem, na przykład z powodu błędnych danych uwierzytelniających, niedziałającego punktu końcowego lub przekroczenia limitu czasu, konwersacja teraz to pokazuje: w wątku pojawia się czerwony znacznik “(nazwa funkcji) nie powiodła się”, zarówno w zakładce Wypróbuj agenta, jak i w rzeczywistych konwersacjach w Czatach. Kliknij znacznik, aby rozwinąć szczegóły: kod statusu zwrócony przez Twój punkt końcowy oraz treść odpowiedzi, co zazwyczaj wystarcza, aby dowiedzieć się dokładnie, co należy naprawić (kod 401 z komunikatem “unauthorized” oznacza nagłówek uwierzytelniania, przekroczenie limitu czasu oznacza, że Twój punkt końcowy działał dłużej niż 30 sekund; w przypadku zadania wymagającego więcej czasu, zobacz Długotrwałe zadania).
Pomyślne wywołania również wyświetlają znacznik — kliknij go, aby zobaczyć, co faktycznie zwrócił Twój punkt końcowy. Jest to najszybszy sposób na debugowanie integracji od początku do końca: przeprowadź rozmowę testową w Try Out, a następnie kliknij znacznik funkcji, aby zobaczyć rzeczywisty wynik żądania bez opuszczania strony.
Gdy narzędzie ciągle zawodzi w rzeczywistych rozmowach
Jeśli ta sama funkcja niestandardowa zawiedzie 3 razy w ciągu 24 godzin podczas rozmowy prowadzonej przez Twojego agenta AI, otrzymasz jedno powiadomienie dziennie: e-mailem, w sekcji powiadomień (ikona dzwonka) oraz jako powiadomienie push, jeśli zostało włączone. Powiadomienie wskazuje narzędzie, pokazuje ostatni błąd i zawiera linki do odpowiednich czatów, ponieważ agent poinformuje te kontakty o wystąpieniu problemu technicznego. Wiersz funkcji w Ustawieniach będzie wyświetlał status Failing (Niepowodzenie) wraz z liczbą błędów i ostatnim błędem, dopóki narzędzie nie zacznie ponownie działać; jedno udane wywołanie wyczyści ten status. Możesz wyłączyć te powiadomienia w sekcji Ustawienia → Powiadomienia → Błędy narzędzi.
Pełny przykład: Wyszukiwanie statusu zamówienia
Oto w pełni skonfigurowany przykład, którego możesz użyć jako szablonu:
Podstawowe informacje:
- Nazwa:
check_order_status - Opis: “Pobiera aktualny status zamówienia klienta, w tym informacje o wysyłce i śledzeniu”
- Działanie AI: “Wywołaj to, gdy klient pyta o status swojego zamówienia, gdzie znajduje się jego paczka lub kiedy dotrze. Zawsze najpierw pytaj o numer zamówienia.”
Połączenie:
- URL:
https://api.mystore.com/orders/lookup - Metoda: POST
Nagłówki:
Authorization:Bearer sk_live_abc123Content-Type:application/json
Parametry wejściowe:
order_number(tekst, wymagane): „Numer zamówienia podany przez klienta”customer_email(tekst, opcjonalne): „Adres e-mail klienta do dodatkowej weryfikacji”
Mapowanie odpowiedzi nie jest wymagane — dzięki jasnemu opisowi i ustawionej powyżej akcji AI, bot odczytuje dowolny plik JSON zwracany przez Twój punkt końcowy (status, numer śledzenia, data dostawy, przedmioty) i samodzielnie decyduje, jak o tym poinformować.
Jak wygląda konwersacja:
Klient: Hej, gdzie jest moje zamówienie?
Bot: Cześć! Chętnie sprawdzę Twoje zamówienie. Czy możesz podać mi numer zamówienia?
Klient: To ORD-78234
Bot: Już sprawdzam…
Twoje zamówienie ORD-78234 zostało wysłane i jest w drodze! Przewidywana data dostawy to 10 marca. Możesz śledzić przesyłkę tutaj: https://tracking.example.com/1Z999AA1
Czy mogę pomóc w czymś jeszcze?
Kompletny przykład: Status zamówienia w Shopify
Jeśli sklep działa na platformie Shopify, nie potrzebujesz programisty do stworzenia punktu końcowego wyszukiwania — własny system Shopify może bezpośrednio odpowiadać na pytania dotyczące zamówień. (W przypadku pytań o produkty i stany magazynowe w sklepie Shopify w ogóle nie potrzebujesz niestandardowej funkcji: połącz się z wbudowanym serwerem sklepu — zobacz Połącz sklep Shopify.)
Najpierw utwórz token dostępu w Shopify. Shopify wprowadziło zmiany w 2026 roku: aplikacji nie można już tworzyć w panelu administracyjnym Shopify, a nowy ekran tworzenia aplikacji udostępnia identyfikator klienta (Client ID) oraz klucz tajny klienta (Client secret) zamiast gotowego tokena. Poniższe kroki pozwolą przekształcić je w stały token. Przeznacz na to około dziesięciu minut, raz na sklep. (Jeśli sklep ma już starszą aplikację utworzoną w poprzedni sposób, istniejący token będzie nadal działał — przejdź od razu do funkcji niestandardowej poniżej.)
- Przejdź do pulpitu nawigacyjnego Shopify Dev pod adresem dev.shopify.com, otwórz swoją organizację i kliknij Apps → Create app. Nazwij ją np.
Order lookup. - Nadaj aplikacji uprawnienie read_orders, opublikuj wersję i zainstaluj aplikację w sklepie.
- Otwórz Ustawienia aplikacji i dodaj adres internetowy sklepu (na przykład
https://www.yourstore.com/) do dozwolonych adresów URL przekierowania. Zapisz. - Nadal w Ustawieniach skopiuj Client ID oraz Client secret.
- W przeglądarce, w której jesteś zalogowany do panelu administracyjnego Shopify tego sklepu, otwórz poniższy adres, zastępując nazwę sklepu, identyfikator klienta i adres przekierowania własnymi danymi:
https://YOUR-STORE.myshopify.com/admin/oauth/authorize?client_id=YOUR-CLIENT-ID&scope=read_orders&redirect_uri=https://www.yourstore.com/&state=12345Zatwierdź ekran, który się pojawi. Przeglądarka przekieruje Cię na Twój adres przekierowania, a pasek adresu będzie teraz zawierałcode=oraz długą wartość — skopiuj tę wartość. Jest ona ważna tylko przez kilka minut, więc przejdź od razu do następnego kroku. - Wymień ten kod na token, co możesz zrobić wewnątrz Your AI Connector. W kreatorze funkcji niestandardowych ustaw Metodę na POST, a URL na
https://YOUR-STORE.myshopify.com/admin/oauth/access_token, dodaj trzy tekstowe parametry wejściowe o nazwachclient_id,client_secreticode, a następnie kliknij Test, wypełnij trzy wartości i uruchom go. Odpowiedź zawieraaccess_token— to Twój stały token. Skopiuj go w bezpieczne miejsce, a następnie wyczyść kreator i skonfiguruj właściwą funkcję poniżej.
Następnie skonfiguruj funkcję niestandardową:
Podstawowe informacje:
- Nazwa:
check_shopify_order - Opis: “Wyszukuje zamówienie w systemie Shopify sklepu i zwraca jego status, informacje o śledzeniu oraz pozycje”
- Akcja AI: “Wywołaj to, gdy klient zapyta o status swojego zamówienia lub dostawę. Zawsze najpierw poproś o numer zamówienia.”
Połączenie:
- URL:
https://YOUR-STORE.myshopify.com/admin/api/2026-01/orders.json?status=any— zastąpYOUR-STOREnazwą.myshopify.comsklepu (ten adres używa technicznej domeny Shopify, a nie niestandardowej domeny sklepu) - Metoda: GET
Nagłówki:
X-Shopify-Access-Token:shpat_...(token uzyskany powyżej)
Parametry wejściowe:
name(query_param, wymagane): “Numer zamówienia klienta dokładnie w takiej formie, w jakiej widnieje w potwierdzeniu zamówienia, włącznie ze znakiem # — na przykład #1001. Jeśli klient go nie podał, poproś go o to.”
Mapowanie odpowiedzi nie jest wymagane — bot odczytuje zwrócone zamówienie (status płatności, status realizacji, śledzenie, pozycje) i odpowiada w naturalny sposób.
Warto wiedzieć: token utworzony w ten sposób może widzieć zamówienia z ostatnich 60 dni — to wystarczająco dużo do codziennych pytań wsparcia, ale nie stanowi pełnej historii zamówień.
Kompletny przykład: Rezerwacja wizyty
Podstawowe informacje:
- Nazwa:
create_booking - Opis: „Tworzy nową wizytę w naszym systemie rezerwacji”
- Akcja AI: „Użyj tego po potwierdzeniu daty, godziny i danych kontaktowych z klientem. Nie wywołuj funkcji, dopóki klient wyraźnie nie potwierdzi chęci rezerwacji.”
Połączenie:
- URL:
https://booking.mycompany.com/api/appointments - Metoda: POST
Parametry wejściowe:
date(tekst, wymagane): „Data wizyty w formacie RRRR-MM-DD”time(tekst, wymagane): „Godzina wizyty w formacie GG:MM”name(tekst, wymagane): „Imię i nazwisko klienta”phone(tekst, wymagane): „Numer telefonu klienta”service_type(tekst, wymagane): „Rodzaj rezerwowanej usługi”
Kompletny przykład: Dodawanie subskrybenta newslettera do systemu CRM
Bardzo powszechny schemat: bot kończy odpowiadać, oferuje newsletter, kontakt odpowiada swoim adresem e-mail, a ten adres powinien natychmiast trafić do Twojego narzędzia e-mailowego. Większość systemów CRM (FluentCRM, ActiveCampaign, MailerLite, Brevo i inne) akceptuje w tym celu proste żądanie POST, więc nie jest potrzebna żadna platforma automatyzacji pomiędzy nimi.
Ten przykład wykorzystuje FluentCRM na WordPressie. Schemat jest taki sam dla każdego innego narzędzia, które udostępnia „przychodzący webhook” lub punkt końcowy „utwórz subskrybenta”.
Najpierw pobierz adres URL ze swojego systemu CRM. W WordPressie otwórz FluentCRM → Ustawienia → Przychodzące webhooki (Incoming Webhooks) i utwórz webhook. Wybierz listę, tagi i status subskrypcji, które powinny otrzymać nowe kontakty, a następnie skopiuj wygenerowany adres URL webhooka. Wszystko, co tutaj ustawisz, zostanie zastosowane automatycznie, więc bot musi jedynie wysłać adres e-mail.
Następnie skonfiguruj funkcję niestandardową:
Podstawowe informacje:
- Nazwa:
add_newsletter_subscriber - Opis: “Dodaje osobę do naszej listy newslettera przy użyciu adresu e-mail podanego na czacie”
- Akcja AI: “Użyj tego w momencie, gdy kontakt wyrazi zgodę na subskrypcję newslettera i poda swój adres e-mail. Nie wywołuj tej funkcji, zanim użytkownik faktycznie poda adres, i nie wywołuj jej dwukrotnie dla tej samej osoby.”
Połączenie:
- URL: adres URL webhooka skopiowany z Twojego CRM
- Metoda: POST
Parametry wejściowe:
email(ciąg znaków, wymagane): “Adres e-mail podany przez kontakt w rozmowie”first_name(ciąg znaków, opcjonalne): “Imię kontaktu, jeśli zostało podane”
Pomiń dane systemowe: włącz tę opcję (on). Twój CRM potrzebuje tylko powyższych pól, a mniejszy ładunek danych pozwala uniknąć błędów w narzędziach, które odrzucają nieoczekiwane pola.
Mapowanie odpowiedzi: tutaj nie jest potrzebne. Nic nie musi wracać, aby bot mógł kontynuować działanie.
Nie zapomnij włączyć funkcji dla Agenta, który prowadzi konwersację (zobacz Przypisywanie funkcji do Agenta). Jest to najczęstszy powód, dla którego poprawnie zbudowana funkcja nigdy nie jest wyzwalana.
Wskazówka: bot posiada również wbudowane narzędzie Aktualizuj e-mail kontaktu (Update Contact Email), które zapisuje adres w rekordzie kontaktu wewnątrz platformy. Jest to oddzielne rozwiązanie od tej funkcji i warto używać ich razem — wbudowane narzędzie dba o kompletność Twojego rekordu kontaktu, a niestandardowa funkcja przesyła adres do Twojego systemu CRM.
Wskazówki dotyczące niezawodnych funkcji niestandardowych
-
Upewnij się, że powtarzane żądania są bezpieczne. Jeśli to samo żądanie zostanie przypadkowo wysłane dwukrotnie, nie powinno to tworzyć zduplikowanych rekordów. Problemy z siecią mogą czasami to powodować.
-
Zwracaj jasne komunikaty o błędach. Jeśli coś pójdzie nie tak po stronie Twojego systemu, zwróć czytelny dla człowieka błąd. Bot przekaże go klientowi w uprzejmy sposób.
-
Utrzymuj czas odpowiedzi poniżej 10 sekund. Jeśli Twój system potrzebuje więcej czasu, rozważ najpierw zwrócenie szybkiego potwierdzenia przyjęcia zgłoszenia.
-
Obsługuj wygasłe lub nieprawidłowe dane uwierzytelniające. Jeśli Twój klucz API wygaśnie, upewnij się, że komunikat o błędzie jest jasny, aby bot wiedział, że powinien powiadomić człowieka zamiast ponawiać próbę.
-
Pisz szczegółowe opisy. AI wykorzystuje Twoje opisy, aby ustalić, kiedy wywołać funkcję i jak wyodrębnić odpowiednie informacje z konwersacji. Niejasne opisy prowadzą do błędów.
-
Testuj na rzeczywistych konwersacjach. Funkcja „Try Out” jest świetna do wstępnych testów, ale monitoruj swoje pierwsze kilka konwersacji na żywo, aby upewnić się, że wszystko działa poprawnie przy rzeczywistych zapytaniach klientów.
-
Przechowuj logi po swojej stronie. Poproś programistę o logowanie żądań przychodzących z aplikacji, aby można było szybko debugować wszelkie problemy.
-
Jeśli Twój firewall wymaga listy dozwolonych adresów IP, każde wywołanie funkcji niestandardowej (oraz każde sprawdzenie uzupełniające) jest wysyłane z jednego stałego adresu IPv4, tego samego, którego używają nasze webhooki; bez zakresów, bez IPv6, bez rotacji. Skontaktuj się z działem wsparcia, a podamy Ci ten adres. Włącz podpisywanie żądań i sprawdzaj podpis jako właściwe zabezpieczenie, a adres IP traktuj jako dodatkowy filtr.
-
Użyj publicznego, docelowego adresu URL. Adres URL Twojej funkcji musi być publicznym adresem internetowym (HTTP/HTTPS). Adresy wewnętrzne, localhost oraz adresy sieci prywatnych są odrzucane ze względów bezpieczeństwa, a platforma nie podąża za przekierowaniami — wskaż funkcję bezpośrednio na docelowy adres URL, a nie na taki, który do niego przekierowuje.
Długotrwałe zadania: pobierz wynik później
Zazwyczaj funkcja niestandardowa musi odpowiedzieć w ciągu 30 sekund, podczas gdy kontakt czeka na odpowiedź. Niektóre zadania trwają dłużej: renderowanie wideo, sprawdzanie zdolności kredytowej, oczekiwanie na zatwierdzenie czegoś przez osobę po Twojej stronie. W takich przypadkach włącz opcję Wynik później (długotrwałe). Wywołanie AI tylko rozpoczyna zadanie. Twój serwis odpowiada natychmiast, AI informuje kontakt, że wynik jest w drodze i kontynuuje konwersację, a Twój serwis wysyła wynik na link zwrotny (callback), gdy tylko zadanie zostanie ukończone.
Kiedy tego używać
Używaj tej opcji, gdy Twój serwis nie może niezawodnie odpowiedzieć w ciągu 30 sekund. Pozostaw ją wyłączoną dla szybkich zapytań (status zamówienia, sprawdzenie stanu magazynowego, cena): są one prostsze jako zwykłe wywołanie, ponieważ AI odpowiada wynikiem w tej samej wiadomości.
Ustawienia w edytorze
Znajdziesz je w edytorze funkcji niestandardowych, obok opcji Pomiń dane systemowe.
| Ustawienie | Co robi |
|---|---|
| Wynik później (długotrwałe) | Zmienia funkcję w sygnał startowy. Twój serwis ma 30 sekund na odpowiedź na pierwsze wywołanie (dowolny status 2xx, treść jest ignorowana), a następnie czas do Czekaj do na wysłanie wyniku. |
| Kiedy nadejdzie wynik | AI napisze następną wiadomość (domyślnie): AI odczytuje wynik i pisze kolejną wiadomość własnym głosem, zgodnie z Celem (Działaniem AI) funkcji. Wyślij tekst bez zmian: tekst, który prześlesz, jest wysyłany do kontaktu słowo w słowo. |
| Czekaj do | Jak długo link zwrotny pozostaje ważny, w godzinach, od 1 do 168 (7 dni). Domyślnie jest to 24. |
Co otrzymuje Twój serwis
Przy włączonym przełączniku każde wywołanie zawiera link zwrotny w trzech miejscach, oprócz wszystkiego, co opisano powyżej (Twoje parametry wejściowe, blok system i nagłówki podpisu):
| Gdzie | Co zawiera |
|---|---|
Nagłówek X-Callback-Url |
Link zwrotny. |
Pole treści callback_url |
Ten sam link, dla POST, PUT, PATCH i DELETE. Dla GET i HEAD jest to zamiast tego parametr zapytania o nazwie callback_url. |
system.callback_url i system.callback_expires_at |
Link oraz czas jego wygaśnięcia (data i godzina w formacie ISO 8601). Pomijane, gdy włączona jest opcja Pomiń dane systemowe. |
Link jest unikalny dla każdego wywołania, przypisany do danego kontaktu i danego wywołania, działa jednorazowo i wygasa po czasie określonym w Czekaj do. Nie potrzebujesz klucza API, aby go użyć: sam link stanowi uprawnienie. Traktuj go jak hasło i nigdy nie zapisuj w publicznych logach.
Wysyłanie wyniku
Gdy zadanie zostanie ukończone, wyślij żądanie POST na link zwrotny:
POST https://api.<your host>/v1/custom-functions/callback/d3f9...
Content-Type: application/json
{
"result": { "video_url": "https://cdn.example.com/spring-offer.mp4", "duration_seconds": 42 },
"message": "Your video is ready: https://cdn.example.com/spring-offer.mp4"
}
resultto, co czyta AI. Może to być tekst lub obiekt JSON.messagejest opcjonalne. Przy ustawieniu Wyślij tekst bez zmian, kontakt otrzymujemessage, gdy go wyślesz, w przeciwnym razieresult, gdy jest to tekst.media_urljest opcjonalne: linkhttpsdo pliku (obrazu, wideo, audio lub dokumentu), który kontakt otrzymuje jako prawdziwy załącznik, a nie jako link. Zobacz Wysyłanie pliku poniżej.- Możesz również wysłać treść w formacie zwykłego tekstu za pomocą
Content-Type: text/plain. Jest ona traktowana jakoresult. - Treść może mieć maksymalnie 64 KB.
Co zwraca link zwrotny (callback):
| Status | Treść | Znaczenie |
|---|---|---|
202 |
{"ok":true,"received":true} |
Wynik został odebrany. |
200 |
{"ok":true,"duplicate":true} |
Ten link już otrzymał wynik. Nic się nie dzieje za drugim razem, więc ponowienie próby jest zawsze bezpieczne. |
400 |
Treść jest nieprawidłowa. | |
404 |
Link jest nieznany. Sprawdź, czy użyłeś dokładnego linku z żądania. | |
410 |
Link wygasł. AI otrzymało już informację, że wynik nigdy nie nadszedł. | |
413 |
Treść przekracza 64 KB. | |
429 |
Ponad 20 zapytań w ciągu minuty do tego samego linku. Odczekaj i spróbuj ponownie. |
Pełny przykład: wideo, którego przygotowanie zajmuje trzy minuty
- AI wywołuje Twoją funkcję. Otrzymujesz (w skrócie):
POST https://api.example.com/render
X-Callback-Url: https://api.<your host>/v1/custom-functions/callback/d3f9...
Content-Type: application/json
{
"video_title": "Spring offer",
"callback_url": "https://api.<your host>/v1/custom-functions/callback/d3f9...",
"system": {
"contactId": "...",
"callback_url": "https://api.<your host>/v1/custom-functions/callback/d3f9...",
"callback_expires_at": "2026-10-20T19:15:00.000Z"
}
}
- Twój serwis rozpoczyna renderowanie i odpowiada natychmiast:
{ "status": "started" }
- AI informuje kontakt, że wideo jest przygotowywane i kontynuuje rozmowę.
- Trzy minuty później Twój serwis wysyła wynik pod link zwrotny:
{ "result": { "video_url": "https://cdn.example.com/spring-offer.mp4", "duration_seconds": 42 } }
- AI pisze kolejną wiadomość własnymi słowami, na przykład „Twoje wideo jest gotowe: https://cdn.example.com/spring-offer.mp4”.
Używasz Zapier lub Make? Pozwól, aby webhook wyzwalający odebrał wywołanie, a ostatnim krokiem przepływu niech będzie POST do callback_url z danymi wyzwalacza.
Co dzieje się na czacie
Wynik jest zapisywany w konwersacji jako wpis funkcji, więc widzisz go w skrzynce odbiorczej tak samo, jak każde inne wywołanie funkcji niestandardowej. Następnie, w zależności od ustawienia Kiedy nadejdzie wynik, AI pisze i wysyła kolejną wiadomość (kosztuje to jedną odpowiedź AI, tak jak każda wiadomość AI) lub Twój tekst jest wysyłany bez zmian. Przy ustawieniu Wyślij tekst bez zmian, pole message jest wysyłane, gdy je dołączysz, w przeciwnym razie result, gdy jest to zwykły tekst; jeśli wyślesz tylko obiekt bez tekstu, AI napisze wiadomość samodzielnie.
Jeśli AI jest wyłączone dla danego kontaktu w momencie nadejścia wyniku (członek zespołu przejął rozmowę, AI zostało wstrzymane, agent jest niedostępny lub wyczerpał kredyty), wynik nadal jest zapisywany w konwersacji, ale żadna wiadomość nie jest wysyłana. Nie zostanie ona wysłana również później, gdy AI zostanie ponownie włączone. Członek zespołu widzi wynik na czacie i może z niego skorzystać.
W zakładce Wypróbuj agenta cały proces również działa: wynik pojawia się na czacie testowym.
Wysyłanie pliku (wideo, obraz, PDF)
Wynik będący plikiem, na przykład wideo wyrenderowane przez Twoją usługę w tle, dociera do kontaktu jako załącznik, który może on otworzyć w czacie, w obu trybach. Platforma znajduje plik w Twoim wywołaniu zwrotnym (callback) w następujący sposób:
media_urlw treści, gdy ją wyślesz.- W przeciwnym razie pole pliku w obiekcie
result:file_url,video_url,image_url,pdf_url,document_url,audio_url,attachment_urllubdownload_url. - W przeciwnym razie pierwszy link
httpsw tekście, który kończy się rozszerzeniem pliku, takim jak.mp4,.jpg,.pnglub.pdf.
Przy ustawieniu AI pisze następną wiadomość, AI pisze tekst, a plik jest dołączany do tej wiadomości (AI otrzymuje polecenie, aby nie wklejać linku). Przy ustawieniu Wyślij tekst bez zmian, Twój message jest podpisem załącznika.
{
"result": { "status": "done", "title": "Spring offer" },
"message": "Your video is ready.",
"media_url": "https://cdn.example.com/spring-offer.mp4"
}
Pliki mogą mieć rozmiar do 16 MB i muszą być dostępne przez https. Każdy kanał obsługuje różne typy: na przykład kanały e-mail i WhatsApp obsługują wideo, obrazy, audio i dokumenty, natomiast SMS nie obsługuje plików. Gdy kanał nie może obsłużyć pliku lub plik jest zbyt duży, kontakt nadal otrzymuje wiadomość z linkiem do pliku dodanym na końcu.
Co jeśli wynik nigdy nie nadejdzie
Jeśli nic nie zostanie wysłane przed upływem czasu Czekaj do, AI otrzymuje informację, że wynik nigdy nie nadszedł, dzięki czemu może poinformować o tym kontakt. Wpis z kodem APP-3103 pojawi się w sekcji Ustawienia → Dziennik błędów, a Ty otrzymasz powiadomienie o błędzie narzędzia.
Limity w skrócie
- Jeden wynik na link wywołania zwrotnego (callback). Późniejsze wpisy pod ten sam link są traktowane jako duplikaty i niczego nie zmieniają.
- Do 64 KB na wynik.
- Jeden plik na wynik, do 16 MB, przez
https. - Do 20 wpisów na minutę na jeden link.
- Czekaj do od 1 do 168 godzin.
- Twoja usługa nadal ma 30 sekund na odpowiedź na pierwsze wywołanie.
Weryfikacja, czy wywołanie rzeczywiście pochodzi od nas
Każdy, kto pozna adres URL Twojej funkcji, może wysłać do niej fałszywe żądanie. Długi klucz tajny w nagłówku uwierzytelniania pomaga, ale jest to ta sama wartość przy każdym wywołaniu, więc każdy, kto zobaczy jedno żądanie (w logach lub na zrzucie ekranu), może je wykorzystać ponownie. Podpisywanie żądań rozwiązuje ten problem: każde wywołanie zawiera podpis, który może wygenerować tylko osoba posiadająca Twój klucz tajny, a który wygasa po kilku minutach.
Podpisywanie jest opcjonalne i domyślnie wyłączone. Jest to ustawienie dla całego konta: jeden klucz tajny podpisuje wszystkie funkcje niestandardowe.
Włączanie podpisywania
- Otwórz Funkcje niestandardowe (Custom Functions).
- Poniżej listy funkcji znajdź kartę Podpisywanie żądań (Request signing) i kliknij Włącz podpisywanie (Turn on signing).
- Kliknij Pokaż (Show), skopiuj klucz tajny (zaczyna się od
whsec_) i zapisz go w systemie, który odbiera wywołania. Traktuj go jak hasło.
Z tej samej karty możesz ponownie skopiować klucz tajny, Zrotować go (stary przestaje działać natychmiast) lub Wyłączyć podpisywanie.
Co wysyłamy
Gdy podpisywanie jest włączone, każde wywołanie funkcji niestandardowej zawiera dwa dodatkowe nagłówki: wywołania AI podczas czatu, warunki wysyłania uzupełniającego oraz przycisk Uruchom test (Run Test) w edytorze.
| Nagłówek | Znaczenie |
|---|---|
X-Webhook-Signature |
Podpis w formacie v1=<hex>. |
X-Webhook-Timestamp |
Czas wysłania w formacie znacznika czasu Unix w sekundach. |
Każde wywołanie, podpisane lub nie, zawiera również User-Agent: Custom-Function/1.0, chyba że ustawisz własny nagłówek User-Agent.
Nagłówki i podpis działają dokładnie tak samo jak w przypadku podpisanych webhooków, więc jeśli już weryfikujesz nasze webhooki, ten sam kod zadziała tutaj. Różni się tylko klucz tajny.
Jak weryfikować
Podpis to HMAC-SHA256 ciągu <timestamp>.<raw request body>, przy użyciu Twojego klucza tajnego jako klucza szyfrującego. Sprawdź go względem surowego (raw) ciała żądania, czyli dokładnych bajtów, które otrzymałeś: parsowanie JSON-a i ponowne zamienianie go na tekst może zmienić bajty, przez co podpis nie będzie pasował.
Funkcja używająca metody GET (lub POST bez danych do wysłania) nie ma ciała, więc podpisywany ciąg to po prostu <timestamp>. z pustym ciałem. Podpis potwierdza wtedy, że wywołanie pochodzi od nas i jest aktualne, ale nie obejmuje ciągu zapytania (query string).
Przykład w Node.js:
const crypto = require("crypto");
function verify(rawBody, headers, secret) {
const timestamp = headers["x-webhook-timestamp"];
const signature = headers["x-webhook-signature"] || ""; // "v1=<hex>"
// Reject anything older than 5 minutes so a captured request can't be replayed later.
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest("hex");
const received = signature.replace("v1=", "");
return received.length === expected.length && crypto.timingSafeEqual(Buffer.from(received), Buffer.from(expected));
}
Przykład w Pythonie:
import hashlib, hmac, time
def verify(raw_body: bytes, headers, secret: str) -> bool:
timestamp = headers.get("X-Webhook-Timestamp", "")
signature = headers.get("X-Webhook-Signature", "").replace("v1=", "")
if not timestamp or abs(time.time() - int(timestamp)) > 300:
return False
expected = hmac.new(secret.encode(), f"{timestamp}.".encode() + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(signature, expected)
Przetestuj to za pomocą Uruchom test w edytorze: gdy podpisywanie jest włączone, wywołanie testowe jest podpisywane dokładnie tak samo jak rzeczywiste, więc funkcja, która przejdzie test, przejdzie również Twoją weryfikację podczas prawdziwych czatów.
Używasz API? Ten sam klucz tajny można odczytać, wygenerować, zrotować lub usunąć za pomocą
GET,POSTiDELETEw/v1/custom-functions/signing-secret.
Limity wykonania
Każda funkcja niestandardowa posiada opcjonalną sekcję Limity wykonania na dole edytora. Kontroluje ona, jak często sztuczna inteligencja może uruchamiać funkcję oraz czy wcześniejszy wynik może zostać użyty ponownie. Wszystkie te ustawienia są opcjonalne — pozostawienie ich pustych sprawia, że funkcja działa dokładnie tak, jak wcześniej.
Funkcja tylko do odczytu. Włącz tę opcję, jeśli Twoja funkcja jedynie odczytuje dane — np. wyszukuje akcje, sprawdza cenę lub status zamówienia — i nigdy niczego nie tworzy ani nie zmienia. Gdy chwilowy problem z siecią przerwie odpowiedź AI, platforma będzie mogła bezpiecznie ponowić próbę konwersacji, zamiast pozostawiać klienta bez odpowiedzi. Włączaj tę opcję tylko wtedy, gdy funkcja rzeczywiście nigdy niczego nie zapisuje: funkcje tworzące rekordy muszą mieć tę opcję wyłączoną, aby ponowienie próby nie spowodowało przypadkowego dwukrotnego uruchomienia. Funkcje korzystające z metody GET są automatycznie traktowane jako tylko do odczytu, ponieważ żądania GET służą wyłącznie do pobierania danych; funkcje POST, PUT, PATCH i DELETE wymagają użycia tego przełącznika.
Serwuj wynik z pamięci podręcznej przy powtórnych wywołaniach. Gdy AI wywoła funkcję ponownie z tymi samymi danymi wejściowymi (na przykład klient zada to samo pytanie dwa razy), zamiast ponownie wywoływać Twój punkt końcowy, zostanie użyty poprzedni wynik. Wyniki z pamięci podręcznej są przechowywane do 24 godzin, a wywołanie z innymi danymi wejściowymi zawsze trafia bezpośrednio do Twojego punktu końcowego.
Maks. liczba uruchomień na konwersację. Sztywny limit liczby uruchomień funkcji w ramach jednej konwersacji. Ustaw wartość 1 dla funkcji, które powinny zostać wywołane tylko raz na czat — np. generowanie wyceny, wyzwalanie oddzwonienia, uruchamianie automatyzacji. Po osiągnięciu limitu AI otrzymuje informację, że funkcja została już uruchomiona, wraz z ostatnim uzyskanym wynikiem, dzięki czemu nadal może odpowiedzieć klientowi, zamiast milczeć.
Maks. liczba uruchomień w oknie czasowym. Limit częstotliwości w czasie: na przykład maksymalnie 5 uruchomień w ciągu 60 minut. Przydatne dla funkcji, które wywołują płatne usługi stron trzecich lub uruchamiają bardziej obciążające automatyzacje. Oba pola muszą zostać wypełnione razem (liczba uruchomień oraz okno czasowe w minutach, do 7 dni).
Wysyłanie ofert, umów lub faktur na LinkedIn. Kiedy sztuczna inteligencja odpowiada na LinkedIn, pisze z własnej skrzynki odbiorczej właściciela konta, dlatego nie powinna wysyłać ofert, umów, wycen, faktur, linków do płatności ani udzielać dostępu w imieniu właściciela, chyba że właściciel wyraził na to zgodę. W trybie Automatycznym (domyślnym) funkcja, której nazwa lub opis wskazuje na wysyłanie takich elementów, nie jest uruchamiana na LinkedIn: sztuczna inteligencja otrzymuje informację, że nic nie zostało wysłane, i powiadamia rozmówcę, że właściciel zajmie się tym osobiście. Wybierz Dozwolone, aby mimo wszystko pozwolić na uruchomienie funkcji na LinkedIn, lub Nigdy na LinkedIn, aby zablokować funkcję, której automatyczna kontrola mogłaby nie wykryć. Inne kanały nie są objęte tym ograniczeniem i w przeciwieństwie do powyższych limitów, to ustawienie ma zastosowanie również w trybie wypróbowania (Try Out).
Kilka rzeczy, o których warto wiedzieć:
- Limity zliczają tylko udane uruchomienia. Wywołanie, które zakończyło się niepowodzeniem po stronie Twojego punktu końcowego, nie zużywa limitu.
- Gdy uruchomienie jest blokowane przez limit, klient nigdy nie pozostaje bez odpowiedzi — AI otrzymuje informację o przyczynie i pracuje z informacjami, które już posiada.
- Limity mają zastosowanie wszędzie tam, gdzie działa funkcja: w regularnych czatach na każdym kanale oraz w funkcjach zarządzanych przez automatyzację. Konwersacje testowe w trybie „Wypróbuj” nie są zliczane ani limitowane.
Wbudowane narzędzia bota
Oprócz niestandardowych funkcji, które tworzysz samodzielnie, platforma jest dostarczana z biblioteką gotowych narzędzi, z których bot AI może korzystać podczas rozmowy. Obejmują one najczęstsze zadania, jakie musi wykonać bot — powiadamianie członka zespołu, umawianie spotkań, tagowanie kontaktu, przeszukiwanie witryny, planowanie działań następczych i inne — dzięki czemu nie musisz ich konfigurować od zera.
Bot decyduje, kiedy użyć każdego narzędzia, w oparciu o to, co dzieje się w konwersacji i jak skonfigurowany jest Twój Agent. Większość tych narzędzi włącza się automatycznie po aktywowaniu powiązanej funkcji (na przykład narzędzia do rezerwacji stają się dostępne dopiero po połączeniu kalendarza i włączeniu rezerwacji).
Koszt w kredytach: Każde wywołanie narzędzia jest rozliczane zgodnie z poziomem jakości AI Twojego Agenta, a samodzielnie utworzone funkcje niestandardowe są rozliczane w ten sam sposób:
| Poziom jakości AI | Kredyty za wywołanie narzędzia | Z podłączonym własnym kluczem Anthropic (BYOK) |
|---|---|---|
| Pro | 1 kredyt | 0 kredytów — działa na Twoim kluczu |
| Economy (przestarzałe) | 0,5 kredytu | 0 kredytów — działa na Twoim kluczu |
| Max | 0,25 kredytu | nadal 0,25 kredytu, naliczane nawet przy podłączonym własnym kluczu |
| Mini | 0,15 kredytu | nadal 0,15 kredytu, naliczane nawet przy podłączonym własnym kluczu |
Narzędzia dla zespołu i zadań
| Narzędzie | Co robi | Kiedy bot go używa |
|---|---|---|
| Powiadom członka zespołu | Wstrzymuje bota dla tego kontaktu i wysyła e-mail do zespołu z informacją, że potrzebny jest człowiek. Czat jest oznaczany, aby członek zespołu mógł go przejąć. | Gdy klient prosi o rozmowę z człowiekiem, jest sfrustrowany lub pyta o coś, na co bot nie ma uprawnień lub nie potrafi odpowiedzieć. |
| Utwórz zadanie | Tworzy nowe zadanie na tablicy zadań, opcjonalnie powiązane z kontaktem i rozmową. Bot kontynuuje odpowiadanie w normalny sposób — zadanie jest tylko notatką dla zespołu, aby podjąć dalsze działania. | W przypadku spraw niepilnych, takich jak prośba o nową funkcję, szansa na sprzedaż dodatkową lub prośba o oddzwonienie, którą zespół powinien zająć się później. |
| Zasugeruj aktualizację FAQ | Gdy bot napotka pytanie, na które nie potrafi dobrze odpowiedzieć, tworzy zadanie z prośbą do zespołu o dodanie odpowiedzi do bazy wiedzy. | Gdy kontakt pyta o coś, co nie jest objęte istniejącymi FAQ — dzięki temu luka zostanie naprawiona na przyszłość. |
| Dodaj kontekst do sugestii FAQ | Jeśli inny kontakt zapyta później o podobną kwestię z innej perspektywy, bot dołączy ten kontekst do istniejącej sugestii FAQ zamiast tworzyć zduplikowane zadanie. | Automatycznie — utrzymuje porządek na liście zadań, gdy wiele osób zgłasza ten sam brak w wiedzy. |
Narzędzia kontaktu
| Narzędzie | Co robi | Kiedy bot go używa |
|---|---|---|
| Tagowanie | Uruchamia się automatycznie po każdej odpowiedzi bota — nie jest to narzędzie, które bot obsługujący klienta decyduje się wywołać. System analizuje ostatnią rozmowę i stosuje odpowiednie tagi, ponownie wykorzystując istniejące tagi, gdzie to możliwe (i tworząc nowy tylko wtedy, gdy jest to konieczne). | Automatycznie — zawsze, gdy rozmowa ujawnia coś, co warto segmentować, np. zainteresowanie, intencję, jakość leada lub język. |
| Aktualizuj imię kontaktu | Zapisuje imię i/lub nazwisko kontaktu, gdy ten je udostępni. | Gdy klient się przedstawia lub poprawia swoje imię. |
| Aktualizuj e-mail kontaktu | Zapisuje adres e-mail kontaktu, gdy ten go udostępni. | Gdy klient podaje adres e-mail — w celu wysyłki newsletterów, paragonów, wyszukiwania konta itp. |
Narzędzia spotkań i rezerwacji
Te narzędzia są dostępne tylko wtedy, gdy w Agencie włączone są rezerwacje i skonfigurowany jest typ wydarzenia w kalendarzu.
| Narzędzie | Co robi | Kiedy bot go używa |
|---|---|---|
| Sprawdź dostępne terminy | Sprawdza, jakie terminy są wolne w połączonym kalendarzu dla danego dnia lub zakresu dat. | Gdy klient chce dokonać rezerwacji, a bot musi zaoferować rzeczywistą dostępność. |
| Umów spotkanie | Tworzy spotkanie w kalendarzu i potwierdza rezerwację klientowi. | Po tym, jak klient potwierdzi konkretną datę i godzinę. |
| Przenieś spotkanie | Zmienia termin istniejącego spotkania na nową datę i godzinę. | Gdy klient prosi o zmianę terminu. |
| Anuluj spotkanie | Anuluje istniejące spotkanie. | Gdy klient prosi o anulowanie. |
| Wyszukaj spotkania | Pobiera istniejące spotkania kontaktu, aby bot wiedział, co jest już zaplanowane. | Gdy klient pyta „kiedy mam spotkanie?” lub przed zaoferowaniem zmiany terminu. |
Narzędzia wiedzy i internetowe
| Narzędzie | Co robi | Kiedy bot go używa |
|---|---|---|
| Przeszukaj Twoją witrynę | Skanuje adresy URL dodane do listy dynamicznych adresów URL Agenta, aby znaleźć strony produktów, artykuły lub inne treści odpowiadające na pytanie klienta. Dostępne tylko wtedy, gdy Wyszukiwanie w sieci AI jest włączone i dodano co najmniej jeden dynamiczny adres URL. Jeśli Wyszukiwanie w sieci AI jest wyłączone, bot nie może czytać stron ani linków — nawet tych, które klient wkleja do czatu. | Gdy klient pyta o coś, co prawdopodobnie znajduje się w Twojej witrynie — produkty, ceny, lokalizacje, zasady. |
| Sprawdź link | Odczytuje zawartość określonego adresu URL, aby bot mógł odpowiedzieć na pytania dotyczące tej strony. Dostępne tylko wtedy, gdy Wyszukiwanie w sieci AI jest włączone i dodano co najmniej jeden dynamiczny adres URL. Jeśli Wyszukiwanie w sieci AI jest wyłączone, bot nie może czytać stron ani linków — nawet tych, które klient wkleja do czatu. | Gdy klient udostępnia link lub pyta o konkretną stronę w Twojej witrynie. |
| Przeszukaj sieć | Uruchamia publiczne wyszukiwanie w Google i zwraca najlepsze wyniki, dzięki czemu bot może odpowiadać na pytania wykraczające poza Twoją własną zawartość. | Gdy klient pyta o coś ogólnego (np. wskazówki dojazdu, informacje publiczne), czego nie ma w Twojej bazie wiedzy. Używane tylko wtedy, gdy wyszukiwanie w sieci jest włączone. |
Narzędzia do działań następczych (Follow-Up)
Te narzędzia wymagają włączenia działań następczych (follow-ups) w Twoim Agencie.
| Narzędzie | Co robi | Kiedy bot go używa |
|---|---|---|
| Zaplanuj inteligentne działanie następcze | Planuje inteligentną wiadomość następczą przy użyciu Twojej sekwencji działań — wybiera odpowiedni szablon i czas na podstawie konwersacji. | Gdy klient milczy lub prosi bota o „sprawdzenie później”. |
| Zaplanuj działanie następcze | Planuje podstawowe działanie następcze w określonym czasie. | Gdy bot musi popchnąć konwersację do przodu w określonym momencie. |
Uruchamianie funkcji niestandardowych
| Narzędzie | Co robi | Kiedy bot go używa |
|---|---|---|
| Uruchom funkcję niestandardową | Wykonuje jedną z funkcji niestandardowych, które utworzyłeś i przypisałeś do Agenta (zobacz resztę tej strony). | Gdy zapytanie klienta pasuje do celu jednej z Twoich funkcji niestandardowych. |
| Wyślij plik z wyniku narzędzia | Wysyła obraz, wideo, plik audio lub dokument, którego link został zwrócony przez jedną z Twoich funkcji niestandardowych lub serwerów MCP, jako rzeczywisty załącznik, zamiast wklejania linku. Dostępne, gdy agent ma co najmniej jedną funkcję niestandardową lub serwer MCP. | Gdy wynik narzędzia zawiera plik, o którego pokazanie poprosił kontakt. Zobacz Pliki z własnych narzędzi. |
Narzędzia do rezerwacji w restauracjach (Zenchef i Formitable)
Te narzędzia są dostępne tylko wtedy, gdy połączona jest integracja Zenchef lub Formitable. Pozwalają one botowi na kompleksowe zarządzanie rezerwacjami w restauracji.
| Narzędzie | Co robi | Kiedy bot go używa |
|---|---|---|
| Sprawdź dostępność restauracji | Wyszukuje wolne terminy rezerwacji dla danej daty, liczby osób i (opcjonalnie) strefy stolików. | Gdy gość prosi o rezerwację stolika. |
| Utwórz rezerwację w restauracji | Tworzy nową rezerwację. | Po potwierdzeniu przez gościa konkretnego terminu. |
| Zaktualizuj rezerwację w restauracji | Zmienia datę, godzinę, liczbę osób lub uwagi w istniejącej rezerwacji. | Gdy gość prosi o modyfikację swojej rezerwacji. |
| Anuluj lub zmień status rezerwacji | Anuluje rezerwację lub aktualizuje jej status (np. potwierdzona, nieobecność). | Gdy gość anuluje rezerwację lub gdy bot musi oznaczyć zmianę statusu. |
| Wyszukaj rezerwacje | Znajduje istniejące rezerwacje pasujące do kryteriów, takich jak imię i nazwisko, e-mail lub data. | Gdy powracający gość pyta o istniejącą rezerwację. |
| Zaktualizuj profil gościa | Aktualizuje profil gościa w systemie restauracji (preferencje, uwagi, dane kontaktowe). | Gdy gość udostępnia preferencje żywieniowe, nowy numer telefonu lub inne informacje na poziomie profilu. |
| Wyświetl produkty restauracji | Pobiera listę menu, zestawów lub dodatków dostępnych do rezerwacji. | Gdy gość pyta „jakie macie zestawy menu?” lub bot musi dołączyć menu do rezerwacji. |
Włączanie i wyłączanie narzędzi
Większość narzędzi jest kontrolowana w zakładce Możliwości AI Agenta:
- Narzędzia do rezerwacji włączają się, gdy aktywujesz rezerwacje i połączysz kalendarz w karcie Rezerwacje w tej samej zakładce Możliwości AI
- Narzędzia do działań następczych włączają się, gdy aktywujesz działania następcze
- Narzędzia restauracyjne włączają się, gdy połączysz konto Zenchef lub Formitable
- Wyszukiwanie w sieci ma własny przełącznik w zakładce FAQ i wiedza
- Narzędzia zadań można wyłączyć dla każdego Agenta za pomocą przełącznika Pozwól AI tworzyć zadania (są domyślnie włączone; ogólnokontowy przełącznik zadań w Ustawienia → Profil → Funkcje wyłącza cały system zadań wszędzie)
- Narzędzia do aktualizacji kontaktów są kontrolowane w tej samej zakładce Możliwości AI — określają, czy AI może zmieniać nazwy kontaktów lub zapisywać na nich dodatkowe zebrane informacje
- Narzędzia alertów są zawsze dostępne; tagowanie uruchamia się automatycznie po każdej odpowiedzi bota (nie jest to narzędzie, które bot wybiera do wywołania)
Jeśli chcesz, aby bot przestał używać konkretnego wbudowanego narzędzia, najczystszym sposobem jest wyłączenie podstawowej funkcji (na przykład wyłącz rezerwacje, aby wyłączyć wszystkie narzędzia do rezerwacji).
Funkcje zarządzane przez automatyzację
Niektóre wpisy na stronie Funkcji niestandardowych mogą być oznaczone etykietą Zarządzane przez automatyzację. Nie zostały one utworzone w tym miejscu — pochodzą z automatyzacji z wyzwalaczem Funkcja agenta AI, który nadaje agentowi umiejętność, której kroki budujesz wizualnie na kanwie automatyzacji, zamiast wskazywać zewnętrzny adres internetowy.
Zarządzana funkcja jest obsługiwana automatycznie: jej nazwa, opis i pola zawsze odpowiadają ustawieniom wyzwalacza automatyzacji, dlatego nie można jej edytować ani usuwać z tej strony — użyj linku Otwórz automatyzację, aby wprowadzić zmiany w samej automatyzacji. Nadal możesz jednak w standardowy sposób wybierać, którzy agenci mają do niej dostęp: na karcie Zdolności AI danego agenta pojawia się ona obok innych zdolności wraz ze zwykłym przełącznikiem włączania/wyłączania (jeśli automatyzacja jest wstrzymana, w wierszu pojawi się stosowna informacja — zdolność stanie się aktywna po włączeniu automatyzacji). Wszystkie pozostałe aspekty jej działania są identyczne jak w przypadku każdej innej funkcji niestandardowej: sztuczna inteligencja decyduje, kiedy ją wywołać, zbiera zdefiniowane przez Ciebie szczegóły i może wykorzystać odpowiedź automatyzacji w tej samej konwersacji.
Jeśli wybierasz między tymi dwoma rozwiązaniami: skieruj zwykłą funkcję niestandardową do systemu, który ma już adres do wywołania; zbuduj automatyzację z wyzwalaczem funkcji Agenta AI, gdy wolisz złożyć pracę z kilku kroków — wyszukać coś w arkuszu kalkulacyjnym lub bazie danych, rozgałęzić warunek, utworzyć rekordy — bez konieczności uruchamiania własnego serwera. Zobacz Automatyzacje.
Wymagania planu
Funkcje niestandardowe są dostępne w planach, które zawierają tę funkcjonalność. Sprawdź swoją subskrypcję, aby potwierdzić dostępność.
Następne kroki
- Podłączanie serwerów MCP do Twojego bota — gotowy zestaw narzędzi zamiast pojedynczych funkcji.
- Agenci AI — strona główna grupy AI Studio, w której znajdują się funkcje niestandardowe i gdzie są one przypisywane do bota.