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

# Контекст і змінні

> Як дані потрапляють у розмову, рухаються крізь неї і виходять з неї

Платформа має просту модель даних для передачі інформації через дзвінок. Розуміння цієї моделі — ключове для створення агентів, що звучать персоналізовано, і для отримання корисних результатів після дзвінка.

## Три обʼєкти контексту

```
initial_context ──► Агент ──► gathered_context
                       │
                 [template variables](/voice-agent/template-variables)
                 (використовуються в промптах)
```

### initial\_context

Дані, доступні агенту ще до початку дзвінка — імʼя контакту, деталі рахунку, інформація про запис на прийом — усе, що агент має знати заздалегідь. Задається з кількох джерел:

* **[Запуск через API](/voice-agent/api-trigger)** — передається в тілі запиту при виклику `POST /public/agent/{uuid}` або `POST /telephony/initiate-call`
* **[Дані з довідника](/core-concepts/contacts-directory)** — колонки файлу автоматично стають полями `initial_context` для дзвінка кожного контакту, окрім службових (див. нижче)
* **[Запит даних перед дзвінком](/voice-agent/pre-call-data-fetch)** — доповнення контексту даними з вашої CRM чи ERP через HTTP-запит на початку дзвінка, до того як агент почне говорити
* **[Налаштування агента](/voice-agent/template-variables#using-template-variables-for-testing)** — задання тестових значень змінних контексту на агенті; вони використовуються в тестових дзвінках із редактора сценарію й ігноруються в реальних дзвінках

### Службові колонки довідника

З файлу довідника в `initial_context` потрапляють **не всі** колонки. Три види службових платформа забирає собі:

| Колонка у файлі | Що з нею | Як звертатися в промпті |
| - | - | - |
| номер телефону (`phone_number`, `phone`, «телефон», «номер») | стає номером, на який дзвонять | `{{phone_number}}` — рівно 12 цифр, без `+` |
| зовнішній ID (`ext_customer_id`, `ext_id`, `client_id`) | разом із номером утворює ключ запису | завжди `{{ext_customer_id}}`, хоч би як звалася колонка |
| стоп-лист (`stop_list`, `stop`, «стоп») | вирішує, чи дзвонити | в промпті недоступна |

Тобто якщо ваша колонка з ідентифікатором зветься `client_id`, у промпті це все одно `{{ext_customer_id}}` — `{{client_id}}` не спрацює, і кампанія не створиться з помилкою про відсутню колонку. Додатково доступний `{{record_key}}` — внутрішній ключ запису (`ext:<ваш ID>|<номер>` або `phone:<номер>`).

Усі інші колонки доступні під своїми назвами.

### Змінні шаблону

Значення з `initial_context` доступні в промпті агента через синтаксис `{{подвійні_фігурні_дужки}}`.

```
Ви телефонуєте {{customer_name}} щодо тарифу {{plan}},
який поновлюється {{renewal_date}}. Будьте доброзичливі й уточніть,
чи хоче клієнт продовжити.
```

Коли дзвінок починається, платформа підставляє значення перед тим, як надіслати промпт у LLM — тож агент говорить природно, ніби вже знає контакт.

### Fallback-значення (запасні значення)

Якщо змінна може бути відсутньою або порожньою, використовуйте вертикальну риску (`|`), щоб задати значення за замовчуванням:

```
Вітаю, {{customer_name | шановний клієнте}}, ми телефонуємо щодо вашого тарифу {{plan | поточного}}.
```

Якщо `customer_name` не задано, агент скаже "Вітаю, шановний клієнте" замість пропуску. Синтаксис:

```
{{назва_змінної | запасне_значення}}
```

Якщо змінна присутня й не порожня, запасне значення ігнорується і використовується реальне значення.

### Змінні за замовчуванням

Вбудовані змінні поточного часу й дня тижня, доступні в будь-якому промпті без налаштування `initial_context`.

| Змінна | Опис | Приклад значення |
| - | - | - |
| `{{current_time}}` | Поточний час у UTC (або визначеному часовому поясі) | `2026-04-02 14:30:45 UTC` |
| `{{current_time_<TIMEZONE>}}` | Поточний час у вказаному часовому поясі | `2026-04-02 20:00:45 IST` |
| `{{current_weekday}}` | Назва поточного дня тижня в UTC (або визначеному часовому поясі) | `Thursday` |
| `{{current_weekday_<TIMEZONE>}}` | Назва поточного дня тижня у вказаному часовому поясі | `Thursday` |

Замініть `<TIMEZONE>` на [назву часового поясу IANA](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones), наприклад `Europe/Kyiv`, `Asia/Kolkata` чи `America/New_York`.

```
Сьогодні {{current_weekday}}, зараз {{current_time_Europe/Kyiv}}.
```

<Note>
  Якщо ви додали суфікс часового поясу до `current_time` **або** `current_weekday`, друга змінна без суфікса автоматично використає той самий часовий пояс замість UTC. Наприклад, якщо в промпті є і `{{current_time_Europe/Kyiv}}`, і `{{current_weekday}}`, день тижня теж буде визначено для `Europe/Kyiv`.
</Note>

### Змінні телефонії

Для телефонних дзвінків (вхідних і вихідних) платформа автоматично додає ці змінні в `initial_context`:

| Змінна | Опис | Приклад |
| - | - | - |
| `{{caller_number}}` | Номер телефону, з якого здійснено дзвінок | `+380501234567` |
| `{{called_number}}` | Номер телефону, на який здійснено дзвінок | `+380441234567` |

Для **вхідних** дзвінків `caller_number` — це номер клієнта, а `called_number` — ваш номер платформи. Для **вихідних** — навпаки: `caller_number` це ваш номер платформи, а `called_number` — номер клієнта.

```
Ви розмовляєте з абонентом за номером {{caller_number}}.
```

### gathered\_context

Дані, які агент видобуває *під час* дзвінка — протилежний напрямок відносно `initial_context`. Використовуйте, щоб перетворити розмову на структуровані дані: чого хоче клієнт, чи підтвердив він щось, яке значення назвав уголос.

#### Як заповнюється

Увімкніть **видобування** на вузлі [Агента](/voice-agent/agent) чи [Завершення дзвінка](/voice-agent/end-call) і визначте одну або кілька змінних для видобування. У кожної змінної є:

| Поле | Опис |
| - | - |
| `name` | Ключ, під яким вона зʼявиться в `gathered_context` |
| `type` | `string`, `number` або `boolean` |
| `prompt` | Опис природною мовою того, що шукати, наприклад *"Чи підтвердив клієнт запис на прийом?"* |

<img src="https://mintcdn.com/ukr-gsm/pisYMZLRPGIEw4_r/images/extracted_variables.png?fit=max&auto=format&n=pisYMZLRPGIEw4_r&q=85&s=70a4f836590f1e812c93220396915782" alt="Видобуті змінні" style={{border: "1px solid #d1d5db", borderRadius: "8px", maxWidth: "100%"}} width="2382" height="1317" data-path="images/extracted_variables.png" />

Коли розмова досягає цього вузла, LLM читає транскрипт до цього моменту й заповнює кожну змінну на основі її `prompt`. Якщо значення неможливо визначити з розмови, змінна лишається порожньою, а не вгадується — тож формулюйте `prompt` достатньо конкретно, щоб LLM точно знала, що вважати збігом.

Видобування можна додати на кілька вузлів. Видобуті змінні кожного вузла обʼєднуються в один обʼєкт `gathered_context` у міру просування дзвінка за ключем `name` — повторіть `name` на пізнішому вузлі, якщо хочете перезаписати попереднє значення.

#### Як звертатися до неї далі

`gathered_context` **не доступна в промптах агента** — промпт може посилатися лише на поля `initial_context`, оскільки видобування зазвичай відбувається вже після тієї частини розмови, де це знадобилось би. Щоб використати видобуті дані, надішліть їх через вузол:

| Де | Синтаксис | Примітки |
| - | - | - |
| Тіло [вузла вебхука](/voice-agent/webhook) | `{{gathered_context.field_name}}` | З префіксом, оскільки шаблон тіла може також посилатись на `initial_context` |
| [Запис виконання](/developer/webhooks#payload-context-variables) (API / кабінет) | обʼєкт `gathered_context` | Повертається після завершення виконання, разом із `recording_url` і `transcript_url` |

```json theme={null}
{
  "customer": "{{initial_context.customer_name}}",
  "resolution": "{{gathered_context.resolution}}",
  "callback_requested": "{{gathered_context.wants_callback}}"
}
```

Повний перелік змінних, доступних поруч із `gathered_context` у шаблоні тіла, дивіться в [Вебхуках](/developer/webhooks).

## Приклад руху даних

```mermaid theme={null}
sequenceDiagram
    participant App as Ваша система
    participant Dog as Платформа
    participant LLM as LLM

    App->>Dog: initial_context: {customer_name: "Олена", plan: "преміум"}
    Dog->>LLM: Промпт із підставленими {{customer_name}} і {{plan}}
    LLM-->>Dog: Відповідь у розмові
    Note over Dog,LLM: Розмова триває...
    Dog->>LLM: Видобути: чи підтвердив клієнт продовження?
    LLM-->>Dog: gathered_context: {renewal_confirmed: true}
    Dog-->>App: Запис виконання з gathered_context
```

## Де доступні змінні

| Місце | Доступні змінні |
| - | - |
| Промпти вузлів агента | Поля `initial_context` через `{{назва_змінної}}` |
| Умови переходів | Оцінюються за живою розмовою — явний синтаксис змінних не потрібен |
| Шаблони тіла вебхука | Усі обʼєкти контексту через `{{initial_context.field}}`, `{{gathered_context.field}}` тощо |
| Дані з довідника | Колонки завантаженого файлу, окрім службових, автоматично стають полями `initial_context` |
