> ## Documentation Index
> Fetch the complete documentation index at: https://docs.brosbots.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Przepływ rozmowy (pod spodem)

> Graf węzłów, na którym działa agent: węzeł globalny, etapy rozmowy, ścieżki, ekstrakcja zmiennych i webhooki. Kanwa przepływu jest na razie ukryta - całą konfigurację robisz w edytorze agenta.

<Note>
  **Kanwa przepływu jest obecnie ukryta w panelu.** Zakładka **Przepływ** w
  edytorze agenta nie jest widoczna dla żadnego planu - agentów konfigurujesz
  w całości w [edytorze agenta](/pl/voice-agent/agent-editor). Ta strona
  tłumaczy, co dzieje się pod spodem, i pokazuje, gdzie dziś ustawia się to,
  co kiedyś ustawiało się na kanwie.
</Note>

## Czym jest przepływ

Przepływ (workflow) to graf połączonych węzłów reprezentujących etapy
rozmowy. Ścieżki (krawędzie) określają, kiedy agent przechodzi między
etapami - przejścia wybiera LLM na podstawie przebiegu rozmowy.

Graf nadal działa: buduje go za Ciebie generowanie AI i szablony branżowe,
a zmiany z edytora agenta zapisują się prosto do niego. Nie musisz go
oglądać, żeby agent działał.

## Typy węzłów i gdzie się je dziś ustawia

| Węzeł | Co robi | Gdzie to ustawiasz dziś |
| - | - | - |
| **Węzeł globalny** | Wspólny prompt dołączany do wszystkich etapów: kontekst firmy, ton, obsługa obiekcji, zasady. Jeden na agenta. | Zakładka **Rola** → prompt systemowy |
| **Start Call** | Rozpoczyna rozmowę i definiuje powitanie. Jeden na agenta. | Zakładka **Rola** → pierwsza wiadomość i „kto mówi pierwszy" |
| **Węzeł Agent** | Etap rozmowy z własnym promptem; krawędzie wychodzące to ścieżki do wyboru przez LLM. | Etapy rozmowy opisujesz w prompcie systemowym; szablony tworzą je za Ciebie |
| **End Call** | Ostatnia wypowiedź tuż przed rozłączeniem. Jeden na agenta. | Zakładka **Ustawienia** → **Frazy kończące rozmowę**, oraz narzędzie **Zakończ rozmowę** |
| **Webhook** | Wysyła po rozmowie payload JSON na wskazany adres. | Zakładka **Integracje** → **Webhook po rozmowie** albo **Własny webhook (HTTP)** |

Przełączniki, które kiedyś siedziały przy węzłach, są dziś w zakładce
**Ustawienia** edytora agenta: **Wykrywanie poczty głosowej** (dawniej
„Detect Voicemail" w Start Call) oraz **Czułość na przerwanie** (dawniej
„Allow Interruption"). Prompt globalny nie ma już przełącznika - prompt
systemowy z zakładki **Rola** trafia do każdego etapu.

## Ekstrakcja zmiennych

Agent może wyciągać z rozmowy ustrukturyzowane dane (imię, budżet, termin).
Definiujesz je w zakładce **Zmienne** w karcie **Dane zbierane przez asystenta** - nazwa, typ
i opis. Trafiają do `gathered_context` i są dostępne w webhookach, SMS-ach
i integracjach. Szczegóły: [Zmienne szablonowe](/pl/voice-agent/template-variables).

## Payload webhooka po rozmowie

Integracja **Webhook po rozmowie** wysyła po każdej zakończonej rozmowie
stały event `call.completed` (JSON podpisany nagłówkiem
`X-Brosbots-Signature`):

```json theme={null}
{
  "event": "call.completed",
  "sent_at": "2026-09-19T10:15:00+00:00",
  "data": {
    "workflow_run_id": 12345,
    "workflow_id": 42,
    "workflow_name": "Recepcja kliniki",
    "duration_seconds": 184,
    "initial_context": { "first_name": "Anna" },
    "gathered_context": { "rsvp": "tak" },
    "recording_url": "recordings/12345.wav",
    "transcript_url": "transcripts/12345.txt",
    "recording_download_url": "https://...",
    "transcript_download_url": "https://..."
  }
}
```

| Pole | Znaczenie |
| - | - |
| `duration_seconds` | Czas trwania rozmowy w sekundach |
| `recording_download_url` / `transcript_download_url` | Linki HTTPS do nagrania (WAV) i transkrypcji (tekst). Nie wygasają i nie wymagają klucza API; przestają działać, gdy usuniesz rozmowę albo plik usunie polityka retencji. `null` dla rozmów czatowych |
| `recording_url` / `transcript_url` | Klucze plików w magazynie, **nie adresy URL**. Zostają dla zgodności z istniejącymi integracjami; do pobierania używaj pól `*_download_url` |

Webhook wychodzi zaraz po rozmowie, często zanim nagranie zostanie zapisane.
Link działa mimo to: otwarty kilka sekund później prowadzi już do pliku.
Każdy, kto ma link, może odsłuchać nagranie - traktuj go jak dane osobowe.

### Odpowiedzi SMS (`sms.received`)

Ta sama integracja może też dostawać odpowiedzi na SMS-y wysłane przez agenta.
Zaznacz `sms.received` w kroku **Zdarzenia** kreatora webhooków (albo wpisz
w polu **Events** integracji w katalogu). Bez tego endpoint
dostaje tylko `call.completed`, jak dotąd.

```json theme={null}
{
  "event": "sms.received",
  "sent_at": "2026-10-01T10:15:03+00:00",
  "data": {
    "sms_id": 981,
    "from_number": "+48600100200",
    "to_number": "+48510000777",
    "text": "Tak, potwierdzam wizytę",
    "workflow_id": 42,
    "workflow_run_id": 12345,
    "received_at": "2026-10-01T10:15:01+00:00"
  }
}
```

`workflow_run_id` i `workflow_id` są wypełnione, gdy odpowiedź przyszła na SMS
wysłany w trakcie rozmowy albo po niej (z ostatnich 7 dni). W przeciwnym razie
mają wartość `null`.

### Pozostałe zdarzenia

Te zdarzenia też trzeba włączyć: w kroku **Zdarzenia** kreatora albo w polu
**Events** (po przecinku), np. `sms.received, campaign.completed`. Zakładanie
webhooka, wybór agentów i sprawdzanie podpisu: [Webhooki](/pl/integrations/webhooks).

| Zdarzenie | Kiedy | Najważniejsze pola `data` |
| - | - | - |
| `call.started` | rozmowa się zaczyna (telefon, widget, test) | `workflow_run_id`, `workflow_id`, `workflow_name`, `direction`, `phone_number`, `channel`, `campaign_id`, `started_at` |
| `campaign.completed` | kampania obdzwoniła wszystkie kontakty | podsumowanie (`contacts`, `calls`, `answered`, `answer_rate`, `talk_minutes`, `avg_duration_seconds`, `by_disposition`) i `rows`: jeden wiersz na kontakt (`phone_number`, `name`, `disposition`, `duration_seconds`, `attempts`, `last_called_at`, `workflow_run_id`, `collected`) |
| `balance.low` | saldo spada do progu ostrzeżenia albo poniżej zera | `balance`, `in_debt`, `minutes_left` (`null` w ostrzeżeniu dziennym) |
| `lead.dropped` | lead, do którego agent nie zadzwonił (brak środków, zajęte kanały, limit) | `lead_id`, `workflow_id`, `workflow_name`, `source`, `phone_number`, `name`, `status`, `reason`, `attempts`, `created_at` |

`call.started` wychodzi bez czekania na odpowiedź endpointu, więc nie opóźnia
powitania. `rows` w `campaign.completed` ma najwyżej 2000 wierszy
(`rows_truncated: true`, gdy jest ich więcej); pełny raport jest w panelu
kampanii jako CSV i pod `GET /api/v1/campaigns/{id}/report`.

<Note>
  Agenci utworzeni wcześniej mogą mieć w grafie **węzeł Webhook** z własnym,
  szablonowym payloadem (`{{workflow_run_id}}`, `{{initial_context.*}}`,
  `{{gathered_context.*}}`, `{{recording_url}}`, `{{transcript_url}}`,
  `{{cost_info.call_duration_seconds}}`; `{{recording_url}}` i
  `{{transcript_url}}` to klucze plików, nie linki). Takie węzły nadal się wykonują, ale
  że kanwa jest ukryta, nowych nie dodasz ani nie zmienisz istniejących -
  nowe webhooki zakładaj w **Integracjach**.
</Note>

## Ścieżki i wywołania narzędzi

Przejścia między węzłami są realizowane jako wywołania narzędzi (tool
calls) przez LLM - opis ścieżki działa jak opis narzędzia. Dlatego opisy
narzędzi, które podpinasz w zakładce **Narzędzia**, pisz jasno i akcyjnie:
to po nich LLM decyduje, kiedy ich użyć. Słowo **„tool"** jest zarezerwowane
i nie należy go używać w nazwach własnych narzędzi.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.