Одна инструкция вместо трёх копий: условия по каналу, блок выбора, свои переменные и фильтры движка Liquid2 в промпте агента.
Шаблон в инструкции — это правила, по которым платформа собирает текст промпта перед каждым ответом. Одна инструкция подставляет артикулы Ozon, Wildberries или Яндекс.Маркета по коду канала, приветствие меняет по дню недели, пустое поле закрывает запасным словом. Движок Python Liquid2 с условиями, выбором и фильтрами находится на стадии бета-тестирования.
Инструкция писалась один раз и под один канал. Потом добавился второй, и текст скопировали целиком, поменяв три строки с артикулами. Потом третий. Теперь в кабинете живут три почти одинаковых промпта, и правка про доставку вносится трижды, а в пятницу вечером — дважды, потому что про третью копию забыли.
Шаблон — это инструкция, в которую добавлены правила сборки: что подставить значением, что включить по условию, что спрятать. Платформа выполняет эти правила в момент прихода сообщения и отдаёт модели готовый текст. Агент видит обычный промпт без единой скобки и про сборку не догадывается.
Синтаксис взят у движка Python Liquid2 и состоит из двух конструкций. Двойные фигурные скобки выводят значение. Скобка с процентом держит логику: условие, выбор, присваивание, комментарий. Документация отдельно предупреждает о двух вещах: переменные внутри шаблона пишутся иначе, чем в обычной инструкции, и комментарии тоже оформляются по-своему.
Шаблоны находятся на стадии бета-тестирования. Документация прямо просит сообщать о найденных ошибках в поддержку, поэтому шаблонную инструкцию имеет смысл сначала прогнать по тестовому диалогу — по одной проверке на каждую ветку условия.
Проверьте на своих диалогах.Регистрация без карты, 500 ₽ на тест по промокоду BLOG500
Собрать агентаСамый частый повод завести шаблон — данные, которые отличаются только кодом канала. Артикулы одного колеса на трёх маркетплейсах выглядят по-разному, всё остальное в инструкции совпадает дословно. Условие решает это одним блоком:
Ты — сотрудник компании «Мои колёса».
Если клиент спрашивает про артикулы колёс, отправь ему эти:
{% if channel_name == "ozon" %}
OZ123, OZ456, OZ789
{% elsif channel_name == "wildberries" %}
WB124954309, WB30924, WB12093
{% else %}
YM123, YM123123
{% endif %}
Ветка if проверяется первой, elsif подхватывает, если предыдущая не сработала, и таких веток может быть сколько угодно. else — запасной вариант на случай, когда не совпало ничего. Без else и при несовпадении всех условий в инструкцию не добавится ничего. Кусок про артикулы просто исчезнет, агент ответит уверенно и без них. Так что запасная ветка нужна везде, где текст обязателен.
Значение channel_name берётся из шапки экспорта диалога, там же лежат поля, которые принёс канал. Что это за поля и откуда они появляются, объясняют переменные ИИ-агента; внутри шаблона важно одно — они доступны в двойных скобках по имени.
Пять elsif подряд превращают инструкцию в лестницу, которую страшно править. Для случая, когда сравнивается одно и то же значение, в движке есть блок выбора:
Если клиент спрашивает про артикулы колёс, отправь ему эти:
{% case channel_type %}
{% when 'ozon' %}
OZ123, OZ456, OZ789
{% when 'wildberries' %}
WB124954309, WB30924, WB12093
{% when 'yandex_market' %}
YM123, YM123123
{% endcase %}
if берут, когда проверки разные по смыслу: день недели в одной ветке, наличие почты в другой. case берут, когда варианты — это значения одной переменной: канал, тип клиента, статус сделки. Запасная ветка else работает в обоих.
Тот же блок закрывает и сценарий с расписанием: день недели вычисляется из системного времени, и в промпт уходит приветствие с припиской про выходные. Дежурный текст «операторы сейчас не работают» перестаёт зависеть от того, вспомнил ли кто-то выключить его в понедельник утром.
assign собирает данные площадки в одном местеЕсли про каждый канал нужно знать три вещи — название площадки, артикулы колёс и артикулы рулей — условия расползаются по всему тексту. Тег assign создаёт свою переменную, и тогда блок выбора стоит один раз в начале, а дальше идёт обычный человеческий текст:
{% assign platform = '' %}
{% assign wheels_articles = '' %}
{% case channel_type %}
{% when 'wildberries' %}
{% assign platform = 'Wildberries' %}
{% assign wheels_articles = 'WB123, WB456, WB789' %}
{% when 'ozon' %}
{% assign platform = 'Ozon' %}
{% assign wheels_articles = 'OZ1212313, OZ452346' %}
{% endcase %}
Ты — сотрудник компании «Мои колёса». Твоя задача — отвечать на вопросы
под товарами на {{ platform }}.
Если клиент спрашивает про новые колёса, отправь артикулы: {{ wheels_articles }}
Дальше по инструкции название площадки и списки артикулов подставляются одной строкой, сколько бы раз они ни понадобились. Правка нового артикула занимает одно место вместо трёх копий промпта. Заодно видно, зачем пустые значения объявлены сверху: канал, который не попал ни в одну ветку, получит пустые строки вместо ошибки.
Значение из канала редко приходит в том виде, в каком его хочется вставить в текст. Имя набрано капсом, вокруг него пробелы, почты в этом канале нет вовсе. Фильтр ставится после переменной через вертикальную черту и чинит значение на лету, причём фильтры можно ставить цепочкой.
| Фильтр | Что делает |
|---|---|
capitalize | первая буква заглавная, остальные строчные: «иВАн» становится «Иван» |
default | подставляет запасное значение, когда переменной нет в канале |
downcase, upcase | приводит строку целиком к нижнему или верхнему регистру |
truncate, truncatewords | обрезает текст по числу символов или слов и ставит многоточие |
strip | убирает пробелы по краям строки |
date | форматирует дату и время в нужный вид |
plus, minus, divided_by | прибавляет, вычитает и делит число |
Самый рабочий из них — default. Почта приходит из Usedesk и отсутствует в Telegram, и без запасного значения агент получит строку с пустотой на месте контакта. Полный перечень тегов и фильтров движка документация отдаёт ссылкой наружу, а список того, что доступно именно в вашем агенте, лежит в руководстве Савви.
Пересчитайте объём инструкции до того, как браться за условия. Документация называет прямую связь: стоимость работы агента зависит в том числе от объёма инструкции, а тысяча токенов стоит 1 ₽. Промпт, где рядом лежат блоки под три площадки, уезжает модели целиком в каждом ответе, включая два блока, которые сейчас не нужны. Шаблон отдаёт только сработавшую ветку.
Дальше порядок такой.
Остальное остаётся обычной гигиеной промпта: короткие формулировки и один смысл на абзац. За это отвечают семь правил инструкции, и шаблон их не отменяет. Если после сборки инструкция похудела заметно, счёт за месяц стоит пересмотреть вместе с остальными статьями расхода — их перечисляет разбор того, как снизить стоимость диалога.
Это инструкция с правилами сборки: часть текста подставляется значением из диалога, часть включается по условию. Перед каждым ответом платформа собирает из шаблона готовый промпт и отдаёт модели уже обычный текст. Сам агент про шаблон ничего не знает.
Да, для этого в документации описан пример с артикулами: код канала сравнивается со списком площадок, и в промпт попадают артикулы только нужной. Отдельный агент под каждую площадку для этого не заводится.
Условие if удобно, когда проверок немного или они про разные вещи, и допускает любое количество веток elsif. Блок case создан для случая, когда одна и та же переменная сравнивается со множеством вариантов: каналы, типы клиента, статусы сделки.
Если запасная ветка else не указана, в инструкцию не добавится ничего: агент получит промпт без этого куска. Поэтому в блоках, где кусок обязателен, запасная ветка прописывается всегда.
Подойдёт фильтр default: он подставит заданное слово, когда значения нет. Например, почта приходит из Usedesk и отсутствует в Telegram, и вместо пустоты в промпт попадёт запасная строка.
Функционал находится на стадии бета-тестирования, о найденных ошибках документация просит сообщать в поддержку. Перед боевым запуском шаблон стоит прогнать в тестовом диалоге по каждой ветке условий.