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

# Работа в редакторе

> Поиск по документу, переменные агента, проверка ошибок и тест сценария.

# Работа в редакторе

Редактор агента — это холст со сценарием, палитра нод слева и инспектор выбранной ноды справа. Здесь собрано то, что помогает **собирать и проверять** сценарий: поиск по документу, переменные, вкладка ошибок и тест. Что умеет каждая нода — на странице [Ноды сценария](/ru/v4/platform/agents/nodes).

## Поиск по документу агента

Кнопка **🔍 Поиск** — **первая во втором ряду шапки редактора**, слева от **«Выровнять схему»**; подсказка «Найти в документе». Она открывает плавающую панель поиска над холстом. То же делает **Cmd/Ctrl + F**. В редакторе компонента кнопка есть в его собственной шапке.

Поиск идёт по именам нод, промптам, условиям переходов, авторским полям нод и функциям конвейера. Словари, выходные переменные и внутренние идентификаторы в индекс намеренно не входят: фрагмент JSON в результатах нечитаем и может показать секрет.

Единица навигации — вхождение, а не нода: три совпадения в одной ноде дают три шага. Enter — следующее, Shift+Enter — предыдущее, Esc — закрыть; счётчик сквозной через виды **«Диалог»** и **«Конвейер»**, и переход через границу сам переключает вид. Потолок — 500 вхождений, дальше панель честно говорит, что показывает первые.

<Note>
  **Cmd/Ctrl + F уступает полям ввода.** Если курсор стоит в промпте, в текстовом поле или в редакторе кода, сочетание достанется полю — откроется обычный поиск браузера, а не панель. Это сделано нарочно: в длинном промпте автор ждёт поиска именно по промпту. Снимите фокус кликом по холсту или нажмите кнопку в шапке.

  Поиск браузера холст заменить не может: он видит только короткие превью на карточках и не умеет промотать холст к найденному.
</Note>

## Переменные агента

В агенте можно создавать переменные и использовать их для передачи данных между нодами. Откройте вкладку **«Переменные агента»**, добавьте переменную и укажите её имя, тип и описание.

Переменные помогают сохранять данные из разговора и результаты действий агента. Их можно использовать:

* в инструкциях и промптах нод, например `{{customer_name}}`
* в параметрах Function и MCP Tool
* в выходных данных Code и Extract Variables
* в условиях переходов Logic Split
* в сообщениях Conversation и End
* в webhook-уведомлениях и пост-колл аналитике

Используйте понятные уникальные имена и добавляйте описание, чтобы агент правильно понимал назначение переменной. Значение переменной может появиться после ответа абонента, извлечения данных или выполнения внешнего действия, поэтому проверяйте, что нужная нода выполняется до её использования.

### Переменные, которые есть в каждом звонке

Десять переменных заполняются в начале любого звонка, до первого слова агента, поэтому их можно использовать сразу — в промпте, в условии перехода и в параметрах **Function**. Конструктор условий и подсказки подстановки предлагают их наравне с остальными.

| Переменная        | Значение                                                                                        |
| ----------------- | ----------------------------------------------------------------------------------------------- |
| `{{direction}}`   | `inbound`, `outbound` или `web` для звонка через Web SDK                                        |
| `{{from_number}}` | у входящего — номер звонящего, у исходящего — номер-определитель, с которого набирает платформа |
| `{{to_number}}`   | у входящего — набранный номер, у исходящего — номер назначения                                  |

Номера приходят только цифрами, без `+` и разделителей — приводите их к читаемому виду нодой **Code**, прежде чем агент произнесёт номер абоненту. То, что известно о самом звонке, перекрывает значение по умолчанию с вкладки Variables; данные кампании, Web API и маппинг SIP-заголовка применяются после этого и побеждают оба. За чат-тестом звонка нет, поэтому там эти три сохраняют значения с вкладки Variables.

#### Дата и время звонка

Ещё семь переменных несут дату и время самого разговора. Их считает платформа, в файл контактов их класть не нужно.

| Переменная          | Значение                                                        | Пример        |
| ------------------- | --------------------------------------------------------------- | ------------- |
| `{{call_date}}`     | дата, ISO                                                       | `2026-09-24`  |
| `{{call_date_us}}`  | дата, американская форма                                        | `09/24/2026`  |
| `{{call_time}}`     | время, 24 часа                                                  | `14:05`       |
| `{{call_time_us}}`  | время, 12 часов                                                 | `2:05 PM`     |
| `{{call_weekday}}`  | день недели, по-английски                                       | `Thursday`    |
| `{{call_timezone}}` | пояс, в котором всё посчитано                                   | `Asia/Almaty` |
| `{{today}}`         | `call_date_us` на американском профиле рынка, иначе `call_date` | `2026-09-24`  |

**В каком поясе считается дата.** Платформа берёт первый подходящий: сутки контакта, если кампания звонит по местному времени контакта; иначе пояс, выбранный для отображения; иначе пояс организации; иначе UTC. Пояс, который не удалось разобрать, даёт UTC — и `{{call_timezone}}` честно покажет `UTC`, так что промах виден в истории звонка.

<Note>
  **Не возите дату колонкой файла.** Значение из файла замерзает в момент загрузки, и на повторном наборе агент назовёт дату загрузки, а не сегодняшнюю. Эти семь переменных пересчитываются на каждом звонке, включая повторы.
</Note>

## Проверка ошибок

Во вкладке **«Проверка»** можно посмотреть возможные ошибки и предупреждения в настройках агента и его сценарии. Нажмите **«Проверить снова»**, чтобы повторно запустить проверку после внесения изменений. Если проблем нет, вкладка покажет сообщение **«Проблем не найдено»**.

Ошибки блокируют публикацию, предупреждения — нет. Проверка смотрит не только на граф: при публикации, при запуске кампании и при создании демо-ссылки платформа заодно собирает те же объекты распознавания и синтеза, что и настоящий звонок, и сообщает о сломанных настройках провайдера, ненайденной базе знаний или аудиофайле и неопубликованном агенте-назначении перевода до того, как агент уедет в работу.

## Проверка перед запуском

Используйте инструменты тестирования, чтобы убедиться, что агент работает как задумано:

* прогоняйте примерные диалоги в чате
* сделайте голосовой тест
* проверьте, что агент следует ожидаемому пути
* меняйте промпт и действия, если логика работает неправильно

### Запуск теста с выбранной ноды

Выделите ноду на канвасе — и в тест-панели появится кнопка **«▶ С ноды `<имя>`»**. Сессия начнётся сразу с этой ноды, не проходя путь от **Begin**; **«↺ Заново»** перезапускает с неё же. Работает и в чате, и в голосовом тесте, а в записи сессии старт с ноды помечен отдельным событием. Без выделения и на ноде **Begin** кнопки нет.

<Warning>
  **Переменные пути при этом не заполняются.** Сессия получает только значения по умолчанию из флоу, поэтому нода, читающая переменную с более раннего шага, увидит пустое значение. Синтетической истории разговора тоже нет — транскрипт начинается прямо с выбранной ноды.

  Поле стартовой ноды принимают **только тестовые входы**: ни [Web API](/ru/v4/web-api), ни телефония, ни передача звонка другому агенту его не знают. Стартовать внутрь опубликованного компонента нельзя — в черновике нода-компонента разворачивается в свою точку входа.
</Warning>

## Когда абонент замолкает на середине фразы

Живые люди делают паузы. «Да…» *(пауза)* «…нет, не хочу» — это одна реплика, но платформа слышит конец реплики в её середине. От этого сценарий защищают два поведения.

**Непроизнесённый переход можно откатить.** Если ход оборвался до того, как агент издал звук, а абонент затем продолжил содержательной репликой, платформа считает переход несостоявшимся: фрагменты склеиваются, и реплика целиком классифицируется из того узла, где началась, — «да… нет, не хочу» не попадает на классификацию внутрь ветки **«Согласие»**. Решение принимается по тому, что произошло дальше: агент успел заговорить — переход фиксируется; продолжение оказалось шумом или пустым — реплика текущего узла переигрывается. Ход, сделавший внешний вызов в ваши системы, фиксируется всегда, потому что такой вызов откатить нельзя. Склеивается не больше четырёх фрагментов; всё, что выходит за эту рамку, обрабатывается обычным путём.

**Узел, который произносит фразу и сразу уходит, не уйдёт молча.** Узел, чья задача — сказать одну строку и двинуться дальше («Соединяю» перед переводом, например), исполняется на входе и только после этого уходит по своему единственному ребру: перебить его в промежутке между приходом и произнесением фразы нельзя. А фраза считается сказанной только после записи в историю разговора, поэтому отменённый ход не выдаёт непроигранную строку за произнесённую.
