Skip to main content

Переменные: откуда берутся и куда попадают

Цель модуля: научиться передавать данные внутрь звонка, вытаскивать сказанное клиентом и считать производные значения.
Переменные звонка (dynamic variables) — это память разговора. Три источника:
  1. Приходят снаружи — из кампании обзвона (колонки файла контактов), из вызова публичного API или из SIP-заголовков входящего звонка. Именно так агент знает, к какому врачу и на какое время записан клиент.
  2. Извлекаются из разговора — узлом Extract Variables.
  3. Считаются — узлом Code или из ответа Function.
На вкладке Переменные агента задаются значения по умолчанию — они же служат тестовыми данными в чат-тесте. Пустая переменная подставляется пустой строкой, звонок из-за неё не падает.
Панель переменных агента со значениями по умолчанию

Переменные агента. Значения здесь — дефолты и тестовые данные; в бою их перекрывают данные кампании или API.

Панель переменных агента со значениями по умолчанию
Ещё три переменные есть в любом звонке с первого слова, их не надо ни объявлять, ни передавать: {{direction}} (inbound, outbound или web), {{from_number}} и {{to_number}}. У входящего звонка from_number — номер звонящего, to_number — набранный номер; у исходящего наоборот. Номера приходят цифрами, без + и скобок, — если агент произносит номер вслух, приведите его к читаемому виду нодой Code. Данные кампании, Web API и SIP-заголовков применяются после и перекрывают эти значения; в чат-тесте звонка нет, поэтому там работают дефолты с вкладки.
Инспектор узла Extract Variables: три извлекаемые переменные

Extract Variables — немой узел: одним structured-вызовом достаёт из сказанного дату, время и «к тому же врачу?». Тип enum с вариантами yes, no даёт значение, по которому потом можно строить формулу.

Инспектор узла Extract Variables: три извлекаемые переменные
Описание переменной — это инструкция модели, а не комментарий для коллеги. «Желаемая дата визита в формате YYYY-MM-DD» работает; «дата» — нет.
Инспектор узла Code: код на Python и выходные переменные

Code — Python в песочнице: собрать строку, нормализовать телефон, посчитать разницу дат. Читает vars, отдаёт значения через result; какие переменные забрать — перечислено в «Выходных переменных». Сети и файлов в песочнице нет — за этим идут в Function.

Инспектор узла Code: код на Python и выходные переменные
Инспектор узла Code с вызовом now(Asia/Almaty) и переменными результата

Code с часами: подпись поля прямо перечисляет, что есть в песочнице — vars, now и безопасные builtins. Значения из result перечислены в «Переменных результата» и дальше живут как переменные звонка.

В песочнице есть часы: now("Asia/Almaty") возвращает время в указанной зоне IANA словарём — date, time, hour, minute, dow (1–7, понедельник первый), iso, epoch и остальное. Зона обязательна: now() без аргумента или с незнакомой зоной — ошибка и уход по ветке ошибки узла. import datetime в песочнице не работает, так что «который час» спрашивают именно так — внешний сервис времени для этого не нужен.
Имена vars, result и now принадлежат самой песочнице — переменную результата так называть нельзя, она всегда осталась бы пустой. Валидатор про это предупреждает, а не блокирует публикацию.

Где {{переменная}} подставляется

Плейсхолдер разворачивается во всём авторском тексте, а не только в инструкции узла: в общем промпте агента, в условиях переходов (включая глобальные), в сводке целей, в описаниях и аргументах функций, в полях извлечения, в промпте flex-режима и в подсказке распознавания автоответчика.
Общий промпт разворачивает плейсхолдеры. Скрипт, положенный в «Общий промпт», доезжает до модели с подставленными значениями — копировать текст в инструкции узлов ради подстановки не нужно.Имя, которого в звонке нет, остаётся текстом: модель увидит {{имя}}. Пустая подстановка сделала бы опечатку невидимой — вместо явного сигнала агент заговорил бы с дырой в фразе.
Грабли: немой узел молчит, но время тратитExtract Variables — это ещё один вызов модели, а Code — исполнение кода. В голосовом звонке они стоят между репликой клиента и ответом агента, то есть напрямую добавляются к паузе перед ответом. Не ставьте три немых узла подряд там, где хватит одного, и не давайте им «тяжёлую» reasoning-модель — инспектор об этом предупреждает.