У каждого агента есть ровно одна опубликованная версия — та, которая отвечает на реальные звонки, — и не больше одного draft (черновика) — того, который вы редактируете. Сохранение никогда не затрагивает опубликованную версию. Ее меняет только Publish. Именно это позволяет переделывать живого агента посреди рабочего дня так, что ни один звонящий этого не заметит.

Две версии, которые важны

Все остальное — archived: снимок версии, которая раньше была опубликованной, доступный только для чтения.

Жизненный цикл

  1. Откройте редактор. Если draft существует, вы всегда видите draft. Если нет — видите опубликованную версию.
  2. Сохраните. Первое сохранение после публикации создает новый draft со следующим номером версии. Все последующие сохранения обновляют этот же draft на месте — версии не накапливаются.
  3. Протестируйте. Тестовые звонки из редактора идут по draft.
  4. Опубликуйте. Draft становится опубликованной версией, а прежняя опубликованная версия становится archived.
Пока у вас есть неопубликованный draft, опубликованная версия продолжает без изменений обслуживать все реальные звонки. Недоделанный draft не может «протечь» в продакшн — единственный путь туда лежит через кнопку Publish.

Какая версия используется при звонке?

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

Run привязан к версии, на которой начался

Когда звонок стартует, run привязывается к конкретной версии, и pipeline выполняет именно этот снимок в течение всего звонка. Публикация во время идущего звонка не подменяет агента у собеседника: текущий звонок доигрывает на своей версии, а новую подхватит следующий. Каждая запись run хранит версию, на которой она выполнялась, поэтому всегда можно понять, какое определение породило конкретный transcript. В CSV-отчетах это столбец Agent Definition ID — см. Использование и биллинг.

Публикация

Нажмите Publish в шапке редактора. Кнопка появляется только при наличии draft и заблокирована, если есть несохраненные изменения или ошибки валидации. Публикация — это и есть тот рубеж, где агент проверяется целиком. Draft намеренно разрешено оставлять «сломанным» (нужно уметь сохраняться на середине мысли), но опубликованную версию исполняет runtime, поэтому она обязана пройти:
  • Валидацию схемы — у каждого узла и ребра заполнены обязательные поля
  • Валидацию графа — граф корректен и достижим
  • Уникальность триггеров — ни один trigger path не конфликтует с другим агентом
Если какая-то проверка не проходит, публикация отклоняется, а проблемные узлы и ребра перечисляются вместе с ошибкой — так к ним можно перейти сразу. Публикация без draft — ошибка: продвигать нечего.

История версий

Откройте иконку часов в шапке редактора, чтобы увидеть историю: новые сверху, по десять за раз, кнопка Load more подгружает более старые. В каждой записи видны номер версии, статус (Draft, Published или пусто для archived) и время создания либо публикации. Выбор старой версии загружает ее на канвас только для чтения. Редактор говорит об этом прямо: появляется баннер режима чтения, а кнопки Save, Publish и Phone Call скрываются. Вы можете посмотреть точный граф, на котором шел прошлый звонок, без риска затереть текущую работу. Нажмите Back to Draft, чтобы выйти из режима чтения. Если draft есть, вы вернетесь в него; если нет — он будет создан из текущей опубликованной версии, и вы продолжите работу в нем.
Кнопки «восстановить эту старую версию» в один клик нет. Чтобы вернуться к старой версии, откройте ее в панели истории, посмотрите, что в ней было, и воспроизведите изменение в своем draft.

Дублирование агента

Duplicate (в меню шапки редактора) создает независимую копию с именем <оригинал> - Duplicate и открывает ее. В копию переносятся:
  • Последнее состояние — draft, если он есть, иначе опубликованная версия
  • Workflow configurations (модели, голос, настройки перебивания и т. д.)
  • Context variables
  • Загруженный файл фонового шума, если он был
Копия получает новые trigger UUID — и это сделано намеренно. Trigger path должен быть уникальным среди всех агентов, поэтому дубликат не может унаследовать Agent UUID и trigger paths оригинала. Внешняя система, которая вызывала оригинал, продолжит вызывать оригинал; чтобы она попадала в копию, укажите в ней новые идентификаторы. Копия не забирает runs и историю версий оригинала — она начинает свою собственную. Сделайте дубликат перед рискованной переделкой, если хотите иметь запасной вариант, которому все еще можно звонить, пока вы экспериментируете.

Статус агента: active и archived

Отдельно от версий сам агент бывает active или archived. Архивируйте его из меню в списке агентов, разархивируйте — из списка архивных. Архивация ничего не удаляет: версии, runs и transcripts остаются, а разархивация возвращает агента ровно в прежнее состояние.
Архивация — это не аварийный выключатель для входящей телефонии. Эндпоинты API-триггера отказывают архивному агенту, но архивный агент, который все еще привязан к номеру телефона, продолжит отвечать на входящие звонки на этот номер. Чтобы прекратить входящие звонки, отвяжите агента от номера в настройках телефонии.