Функции до звонка
Функции до звонка выполняются перед разговором — у исходящих до набора номера, у входящих после соединения, но до первой реплики агента. Их результат ложится в переменные звонка, и агент знает их с первого слова. Когда именно запускается блок и какой у него бюджет — на странице Функции до и после звонка.Добавить функцию до звонка
В блоке «Функции до звонка» нажмите «+ Добавить» и выберите вид:- Своя функция — HTTP-запрос по адресу вашей системы;
- Код — короткий скрипт на Python в песочнице.
Общие поля
- Название — заголовок карточки и панели. Это только подпись; на переменные она не влияет.
- Описание — текст для вас и коллег.
- Когда выполнять — «После предыдущей» или «Параллельно с предыдущей» (см. Порядок и параллельность).
Своя функция (HTTP)
- Имя — вот это и есть префикс переменных результата. Функция с именем
crmзапишетcrm_status,crm_success,crm_error,crm_result. Не путайте с полем «Название». - Режим выполнения — «Заглушка (постоянный ответ)» или «HTTP (реальный вызов)». Пока собираете сценарий, держите заглушку: наружу ничего не уходит.
- Метод, URL, заголовки, параметры строки запроса, тело — в любом из этих полей работает подстановка
{{переменная}}. - Переменные из ответа (переменная ← JSONPath) — слева имя переменной, которое увидит сценарий, справа путь в JSON-ответе, например
$.data.balance. Переменной становится только то, что перечислено здесь. - Таймаут, сек — по умолчанию 10, максимум 30.
- Повторы и Пауза между повторами, сек — по умолчанию 0, то есть повторов нет. Повтор срабатывает на сетевой ошибке, таймауте и ответе 5xx; на 4xx — нет. Помните, что повторы идут внутри таймаута блока.
- Успешные статусы ответа — по умолчанию
2xx; можно перечислить свои коды и диапазоны, например200-299, 404.

Код
- Код — Python-песочница. Доступны
vars(словарь переменных звонка),metadata(метаданные звонка),http(...)(запрос с той же политикой адресов, что у своей функции) иnow("Asia/Almaty"). Импортов, файлов иprintв песочнице нет. - Переменные результата (через запятую) — имена, которые ваш код положил в
result; они станут динамическими переменными звонка. Имя, которое код не заполнил, останется пустым. Именаvars,result,now,metadataиhttpзаняты самой песочницей: переменная с таким именем в звонок не попадёт, и редактор про это предупредит. - Таймаут выполнения, сек — по умолчанию 10, максимум 30.

Переменные, которые появляются после функции
Своя функция всегда пишет служебный набор, даже если маппинг ответа пуст:
Плюс всё, что вы перечислили в «Переменных из ответа». При совпадении имён ваша переменная из маппинга побеждает служебную.
Функция-код пишет
<идентификатор>_success и <идентификатор>_error — префикс у неё не «Имя», а внутренний идентификатор карточки (cf1, cf2), — плюс перечисленные переменные результата.
Порядок и параллельность
Карточки идут сверху вниз в том порядке, в каком их выполняет система. Одна строка — один шаг. Чтобы две функции пошли одновременно, перетащите карточку одной на строку другой; при перетаскивании подсказка покажет «Пойдёт вместе с этой строкой». Строка из двух и более карточек обведена пунктиром и подписана «параллельно · N». Чтобы вернуть очередь — перетащите карточку в зазор между строками («Станет отдельной строкой»). Без мыши то же самое делают:- поле «Когда выполнять» в форме функции — «После предыдущей» или «Параллельно с предыдущей»;
- клавиши на выделенной карточке:
Alt+↑иAlt+↓переносят карточку на строку выше или ниже,Alt+→отправляет её в строку выше,Alt+←возвращает в свою строку.
- Видимость переменных — по строкам, а не по стрелкам. Функция строки k видит переменные всех предыдущих строк целиком, а не только тех, за кем её поставили. Результаты одной строки вливаются в общий набор после того, как строка закончилась полностью, в порядке карточек слева направо — поэтому глобальные
http_*остаются от последней карточки строки. - Две функции одной строки не могут писать одно и то же. Одинаковый префикс («Имя») или пересекающиеся имена переменных результата внутри одной строки — ошибка: результат зависел бы от того, кто успел первым. В соседних строках это допустимо, там побеждает более поздняя.
- Сбой не отменяет следующие. Если функция упала или не уложилась в таймаут, зависящая от неё всё равно стартует и увидит
<имя>_success = "false". - Между блоками «до» и «после» карточка не переносится: у функции нет смены фазы.

Проверить, не звоня никому
Одну функцию. Выберите карточку. Внизу панели у своей функции две кнопки: «Проверить» — реальный вызов по вашему адресу — и «Проверить с заглушкой» — тот же прогон, но с принудительным режимом заглушки, наружу ничего не уходит. У функции-кода кнопка одна: «Выполнить код». У функций до звонка рядом стоит «Бюджет пробного вызова» с двумя значениями — «До первой реплики (входящие, web)» и «До набора номера (исходящие)»: так видно, что медленный запрос не проходит по первому бюджету и проходит по второму. Результат показывается под кнопками и на карточке: «Успех», «Ошибка», «Таймаут» или «Пропущена (бюджет исчерпан)», время в миллисекундах, код ответа и список записанных переменных. Если функция до звонка вернула решение о звонке, тут же будет строка «Решение: набирать / отменить набор / отложить контакт» и предупреждение, если значение не распознано. Весь блок. Когда функций в блоке больше одной, появляется кнопка «Проверить блок»: она прогоняет их так, как они пойдут в реальном звонке. В ответе — «Блок целиком — N ms» и разбивка по строкам: «Строка 1:», «Строка 2:» и статус каждой функции. Это самый быстрый способ убедиться, что параллельность настроена так, как вы задумали. Результат пробного вызова живёт до перезагрузки страницы и в сценарий не сохраняется.

Поздняя доставка результата
У входящих и web-звонков функция, не уложившаяся в бюджет до первой реплики, не обрывается. Агент начинает говорить по бюджету, а функция дорабатывает в фоне со своим собственным таймаутом, и результат вливается в идущий разговор — его увидит следующий узел сценария, читающий переменные. В истории на такую функцию два события: сначала «ждём результат», потом окончательный статус. Уже произнесённая реплика не переигрывается: если агент поздоровался без имени, задним числом он его не подставит. Границы:- у исходящих поздней доставки нет — им хватает 60 секунд до набора;
- в realtime-режиме поздние данные попадают в переменные и в инструменты, но не в уже собранный системный промпт;
- чат-тест в редакторе остаётся синхронным.