Kanál

Akce

Propojte asistenta s vlastními systémy. Vlastní akce mu umožní volat vaše HTTP API během konverzace; předpřipravené akce stačí zapnout.

Chování

Co jsou akce

Akce je něco, co asistent umí během konverzace UDĚLAT, nad rámec odpovídání ze znalostní báze.

Vlastní akce je HTTPS požadavek, který si nadefinujete: název, popis, URL a volitelné vstupy. Když se návštěvník zeptá na něco, co akce umí zodpovědět (stav objednávky, dostupnost zboží, termín doručení), asistent doplní vstupy, zavolá váš endpoint a JSON odpověď zapracuje do své odpovědi.

Předpřipravená akce je vestavěná schopnost, kterou spravuje Breezaro. Nenastavujete žádné URL, jen ji zapnete. Prvními jsou Zavolat operátora a Vyhledávání v produktech.

Krok za krokem

Vytvořte první vlastní akci

Pět kroků od prázdného formuláře k funkční akci. Připravte si URL endpointu svého API.

  1. Vytvořte akci
    V dashboardu otevřete Vlastní akce a zvolte Nová akce. Pojmenujte ji Stav objednávky a popište: Vyhledá objednávku podle čísla a vrátí stav doručení.
  2. Nasměrujte ji na endpoint
    Zvolte metodu GET a vložte URL svého endpointu. HTTPS je povinné a hostname nesmí obsahovat zástupný symbol. Pomocí {{variable}} vložíte vstup kamkoli do cesty nebo query.
  3. Přidejte vstup
    Přidejte vstup orderId s krátkým popisem (Číslo objednávky zákazníka). Asistent jeho hodnotu vyčte z konverzace a pošle ji jako query parametr.
  4. Otestujte
    Spusťte vestavěný test se vzorovým orderId. Uvidíte přesnou odpověď, kterou by asistent dostal. Akci nelze zapnout, dokud test neprojde.
  5. Zapněte ji
    Přepněte přepínač. Od té chvíle asistent při dotazu na objednávku zavolá vaši akci a odpoví aktuálními daty.
breezaro.com
Editor vlastní akce v Breezaro s metodou, adresou, vstupy a tajnými hlavičkami
Editor akce: metoda, adresa, vstupy a šifrované tajné hlavičky

Pošlete s sebou konverzaci

Kdekoli v adrese, hlavičce nebo těle můžete napsat {{conversation.id}} a Breezaro to nahradí id konverzace, ze které požadavek odešel. Doplňujeme ho my, nikdy ne asistent, takže je to vždy konverzace, která opravdu běží, a ne ta, kterou by pojmenoval model.

Právě tímhle svážete záznam v cizím systému zpátky s chatem, který ho vytvořil. Pošlete ho v poli, které si druhá strana pamatuje a vrací: Cal.com bere objekt „metadata“ a posílá ho zpátky ve svém webhooku, takže rezervace vzniklá přes asistenta dorazí i s konverzací, ze které pochází. To id pak otevřete v Konverzacích a díváte se rovnou na ten chat.

Chování

Zapisující akce

Akce, která ve vašem systému něco změní, nikdy neproběhne jen na slovo asistenta. Návštěvník ji nejdřív potvrdí tlačítkem.

Když asistent vyhodnotí, že se zapisující akce hodí, váš endpoint nezavolá. Místo toho pošle do chatu kartu: nahoře název akce, pod ním každou hodnotu, kterou by odeslal, řádek po řádku. Návštěvník si tak přečte přesný termín, e-mail i částku dřív, než se cokoli stane.

Pod hodnotami jsou dvě tlačítka, Potvrdit a Zrušit. Volání uvolní teprve stisk tlačítka Potvrdit: klik zaznamená Breezaro a jedině tento záznam akci pustí dál. Asistent tlačítko stisknout nemůže a nemůže ho nahradit ani větou typu „ano, pokračuj“.

Tlačítko Zrušit návrh zahodí a neodešle se nic. Konverzace běží dál, takže návštěvník, který chtěl jiný termín, si o něj řekne a dostane novou kartu. Každá karta platí na jedno použití.

Nastavení

Import z cURL

Pokud už máte funkční curl příkaz (z dokumentace vašeho API nebo z nástroje jako Postman), vložte ho v editoru akce do Import z cURL. Metoda, URL, hlavičky i tělo se předvyplní.

Chování

Předpřipravené akce

Hotové akce, které zapínáte pro každého asistenta zvlášť.

Zavolat operátora: když návštěvník požádá o člověka, zasekne se nebo je frustrovaný, asistent eskaluje okamžitě bez doplňujících otázek, upozorní váš tým (e-mail, push notifikace a notifikace v dashboardu s důvodem, a se jménem návštěvníka, pokud ho už uvedl) a pozastaví odpovědi AI v dané konverzaci. Návštěvník může dál psát; vše se ukládá a čeká na vás v inboxu.

Pauza končí ve chvíli, kdy operátor konverzaci převezme (nebo asistenta obnoví). Opakované žádosti ve stejné konverzaci jsou omezené, aby se váš inbox nezahltil.

Vyhledávání v produktech: aktivuje se automaticky, jakmile má asistent připojený katalog produktů. Asistent ve vašich produktech vyhledává a doporučuje je s aktuálními cenami a dostupností. Spravujete v Zdroje → Produkty.

Šablony

Začněte se šablonou

Rychlejší cesta k funkční akci: v galerii vyberete šablonu a editor se rovnou předvyplní.

Galerie předpřipravených akcí obsahuje i celé šablony, nejen přepínače. První je Stav objednávky (WooCommerce): volbou „Použít šablonu“ otevřete editor vlastní akce s už vyplněným názvem, popisem, požadavkem, vstupy i navrhovanými poli odpovědi.

Vzniklá akce patří vám: jde o běžnou vlastní akci, kterou můžete upravovat, testovat i smazat stejně jako kteroukoli jinou, a počítá se do vašeho limitu akcí.

Chování

Co uvidí AI

Spustíte testovací volání a pak asistentovi přesně určíte, které části odpovědi smí vidět.

Po úspěšném testu se odpověď zobrazí jako strom se zaškrtávacími políčky. Zaškrtnete pole, která smí asistent použít ve svých odpovědích; vše nezaškrtnuté se k modelu nikdy nedostane, ať endpoint vrátí cokoli.

breezaro.com
Strom výběru polí odpovědi v testovacím kroku
Výběr polí: vyberte, která pole odpovědi smí asistent použít
Soukromí

Ověření vlastnictví

Volitelné pravidlo, které zabrání tomu, aby si přes stejnou akci jeden návštěvník přečetl data jiného návštěvníka.

Vyberete vstup a pole odpovědi, které se musí shodovat, například e-mail návštěvníka proti fakturačnímu e-mailu objednávky. Akce odpoví, jen když se shodují, přesně jako to ve výchozím nastavení dělá šablona Stav objednávky (WooCommerce). Ověření může kombinovat jednu nebo více podmínek a vyžadovat, aby platily všechny, nebo aby stačila jedna. Podmínky, které čtou ověřenou identitu, tvoří vlastní skupinu a ta musí platit vždy: „stačí jedna" může vybírat mezi dvěma podmínkami na identitu, ale nikdy nedovolí, aby identitu nahradila hodnota, kterou návštěvník zadal.

Při neshodě vidí asistent stejný výsledek jako u skutečně neexistujícího záznamu, takže nepozná špatné číslo objednávky od cizí objednávky. Opakované neúspěšné pokusy ve stejné konverzaci se omezují, takže se hádání nevyplatí.

Odpověď, která vrací seznam, se kontroluje záznam po záznamu: vyberete pole uvnitř seznamu a každý záznam pak musí ověřenou hodnotu někde pod sebou nést, jinak se celá odpověď odmítne. To je podstatné tam, kde seznam ohraničuje jedině filtr ve vašem dotazu, protože filtr, který se přestane uplatňovat, se vrátí jako obyčejná dvoustovka plná cizích záznamů. Prázdný seznam projde, není v něm co ukázat.

Jeden záznam bez ověřování

Shoda výše nemusí být e-mail. Když si zákazník může objednat jako host, nemusí existovat žádný e-mail, se kterým by šlo ověření identity porovnat, použijte proto přímo objednávku. Přidejte číslo objednávky a ještě jeden údaj, který zná jen její majitel, například PSČ, kam se objednávka posílá, nebo poslední číslice telefonu na objednávce, jako dva běžné vstupy, a v endpointu obě hodnoty zkontrolujte společně, než cokoli vrátíte. Jde o stejné ověření vlastnictví jako výše, jen porovnávané proti údajům samotné objednávky místo kontaktní adresy, takže nepotřebuje ověřeného návštěvníka, kartu ani přepínač: funguje už dnes.

Oba přístupy znamenají při prázdném výsledku něco jiného. Dotaz podmíněný ověřenou identitou, „moje objednávky“, nenašel nic pod ověřeným kontaktem tohoto konkrétního návštěvníka. Neznamená to, že návštěvník nemá žádné objednávky vůbec: objednávka může být vedená pod jinou adresou, nebo bez ní. Popis akce naformulujte tak, aby asistent příště nabídl vyhledání podle čísla objednávky, nebo člověka, místo aby návštěvníkovi řekl, že u nás nic nemá.

Chování

Ověření návštěvníci

Podmiňte akci ověřenou identitou, aby dotaz jako „moje objednávky“ odpověděl daty toho konkrétního návštěvníka, nikdy tím, co zrovna napíše.

Zapněte „Vyžaduje ověřeného návštěvníka“ v editoru akce a asistent dál nabízí pomoc; akci ale nespustí, dokud se identita návštěvníka nepotvrdí. Ověření proběhne jednou za konverzaci: buď návštěvník napíše kód, který mu pošlete e-mailem na adresu, kterou uvede, nebo identitu bez jakékoli interakce potvrdí přímo váš server (Podepsané ověření identity níže). Jakmile se identita potvrdí, zůstává svázaná s danou konverzací; nový chat začíná od začátku.

U e-mailového kódu se při první potřebě ověřené identity otevře karta s žádostí o e-mailovou adresu. Po jejím odeslání přijde na tuto adresu šestimístný kód a karta pak vyžádá tento kód; správný kód ověření dokončí a asistent akci zopakuje. Podepsané ověření tento krok úplně přeskočí: karta se vůbec nezobrazí, protože identita dorazí potvrzená už s načtením stránky.

Jakmile je návštěvník ověřený, odkažte se na jeho identitu kdekoli v URL, hlavičkách nebo těle akce pomocí čtyř zástupných symbolů:

{{visitor.email}}
Ověřená e-mailová adresa.
{{visitor.name}}
Jméno návštěvníka, pokud ho způsob ověření poskytl.
{{visitor.externalId}}
Vaše vlastní id zákazníka, dostupné jen po podepsaném ověření.
{{visitor.phone}}
Ověřené telefonní číslo, dostupné jen na WhatsAppu, ve formátu E.164 (například +14155552671).
Nastavení

Podepsané ověření identity

Pro návštěvníka, který je už přihlášený na vašem webu: identitu za něj potvrdí váš server, takže ho v chatu nic nezdržuje.

Jde o stejný vzor, jaký používá Intercom, Crisp i Zendesk. Váš backend podepíše krátkodobé potvrzení o návštěvníkovi tajným klíčem, který zná jen on, a předá ho widgetu přes malé veřejné API, window.breezaro, vedle stávajícího vkládacího kódu. Není potřeba e-mail, kód ani karta: ověření proběhne ve chvíli, kdy se stránka načte. Provozovatelé, kteří tohle nepotřebují, si ponechají svůj současný jednořádkový kód beze změny; dvoudílná podoba níže je jen pro podepsané ověření.

Podpisový tajný klíč vygenerujete jednou, v Kanály → Widget; zobrazí se přesně jednou, jako čistý text, a přesně tuto hodnotu váš server použije jako klíč pro HMAC, nic se nedekóduje ani nepřevádí. Jeho obnovením okamžitě přestanou platit všechny podpisy vytvořené starým klíčem: návštěvník uprostřed konverzace si ponechá už ověřenou identitu, ale jakékoli nové volání identify() podepsané starým klíčem začne od okamžiku obnovy selhávat.

HTML
<script>
  const BREEZARO_APP_ID = 'YOUR_APP_ID';
  window.breezaro =
    window.breezaro ||
    function () {
      if (arguments[0] === 'identify') {
        let resetId = null;
        try {
          const reset = JSON.parse(
            localStorage.getItem('breezaro-widget_reset_' + BREEZARO_APP_ID),
          );
          resetId = typeof reset?.id === 'string' ? reset.id : null;
        } catch {}
        arguments[3] = { resetId };
      }
      (window.breezaro.q = window.breezaro.q || []).push(arguments);
    };
  breezaro('identify', {
    email: 'jan@example.com',
    name: 'Jan Novák',
    externalId: '12345',
    issuedAt: 1785400000,
    nonce: '2c12df4ca7384da4aeb0902655b13c6f',
    hmac: '<computed on your server>',
  });
</script>
<script
  src="https://breezaro.com/breezaro-widget.js"
  data-app-id="YOUR_APP_ID"
  defer></script>

Vložený blok volání jen zařadí do fronty; loader skript, beze změny až na to, že teď stojí až za ním, frontu vyprázdní hned po inicializaci, takže na pořadí obou tagů, ani na pomalou síť u druhého z nich, nezáleží a volání se neztratí. Všechno v tomto balíčku kromě hmac jsou běžná data, která už váš server má; hmac je jediné pole, které musí váš server spočítat.

hmac je HMAC-SHA256 nad kanonickým řetězcem sestaveným ze šesti polí spojených znakem nového řádku, přesně v tomto pořadí:

appId\nexternalId\nemail\nname\nissuedAt\nnonce
App id
podepsané, ale nikdy neposílané uvnitř volání identify(). Je to stejná hodnota jako data-app-id ve vašem vkládacím kódu; widget ji už zná a sám ji připojí.
Chybějící externalId nebo name: na daném místě prázdný řetězec, ne slovo null a ne chybějící řádek. Kanonický řetězec má vždy přesně šest řádků.
issuedAt
aktuální čas v celých Unixových sekundách, ne v milisekundách, převedený přímo na svůj desítkový řetězec.
Podpis
HMAC-SHA256 tohoto řetězce, zakódovaný jako hex, s klíčem přesně v podobě, v jaké se tajný klíč zobrazil. Klíč předem nedekódujte z hex, používá se jako čistý text.
Maximální stáří
přijímá se do jedné hodiny od issuedAt, s pěti minutami tolerance pro posun hodin dopředu. Cokoli starší, nebo posunuté dál do budoucnosti, se odmítne stejně jako špatný podpis, bez možnosti poznat, co přesně nastalo.
Řídicí znaky: znak nového řádku nebo jiný řídicí znak kdekoli v appId, externalId, email, name nebo nonce způsobí odmítnutí celého balíčku ještě před tím, než se vůbec zkontroluje podpis.
Délkové limity: appId smí mít nejvýše 64 znaků, externalId, email a name nejvýše 200 znaků, nonce 16 až 100 znaků a email navíc musí být platná e-mailová adresa. Překročení kteréhokoli z těchto limitů skončí odmítnutím ještě před kontrolou podpisu, s obecnou chybou, která neprozradí, které pole nebo limit selhal.
nonce: nová kryptograficky náhodná hodnota pro každý payload, vložená jako šestý a poslední řádek kanonického řetězce. Zabrání tomu, aby dvě zařízení dostala ve stejné sekundě stejné přístupové údaje. Nikdy ji neodvozujte pouze z issuedAt.

Nic dalšího podpis nepokrývá: ani konverzaci návštěvníka, ani jeho session v prohlížeči, nic, co jste už nevložili do jednoho z těch šesti polí.

const { createHmac, randomUUID } = require('node:crypto');

function signVisitorIdentify({ appId, email, name, externalId, secret }) {
  const issuedAt = Math.floor(Date.now() / 1000);
  const nonce = randomUUID();
  const canonical = [
    appId,
    externalId ?? '',
    email,
    name ?? '',
    String(issuedAt),
    nonce,
  ].join('\n');
  const hmac = createHmac('sha256', secret).update(canonical).digest('hex');

  return { email, name, externalId, issuedAt, nonce, hmac };
}

Zavolejte tuto funkci s vaším app id, podpisovým tajným klíčem z Kanály → Widget a vším, co o návštěvníkovi víte, a její návratovou hodnotu pak vykreslete do volání identify() dřív, než stránku odešlete. Na každé načtení stránky vygenerujte nový issuedAt a nonce, a tím pádem i nový hmac, místo abyste jeden podepsaný balíček používali opakovaně napříč návštěvami.

Soukromí

Limity a bezpečnost

Vlastní akce jsou záměrně omezené, aby špatně nastavený endpoint nemohl poškodit asistenta ani návštěvníky.

  • Pouze HTTPS, pouze GET a POST. Požadavky na privátní či interní síťové adresy jsou blokované.
  • Odpověď musí být JSON, do 16 KB a do 10 sekund; cokoli jiného je odmítnuto.
  • Tajné hlavičky jsou šifrované a po uložení se už nikdy nezobrazí.
  • Asistent smí v jedné odpovědi zavolat nejvýše dvě akce.
  • Akci lze zapnout až po úspěšném testu.
  • Akce jsou dostupné od tarifu Pro výše (a během zkušební doby).
  • Každé volání akce se účtuje jako jedna odpověď navíc podle kreditové sazby zvoleného modelu (model za 1 kredit přičte 1 kredit, model za 3 kredity přičte 3).
  • Akce, které mění data, se nejprve navrhnou a proběhnou až po stisku tlačítka Potvrdit na kartě, nejvýše jednou na jeden návrh, a jen v chatovacím widgetu na webu.