Как проверить, вызывал ли агент функцию на самом деле: продвинутый режим с аргументами вызовов и экспорт диалога в .html.
Продвинутый режим в разделе «Чаты» показывает, какие функции вызвал агент, с какими аргументами и с каким статусом выполнения — это единственный способ проверить, действительно ли агент что-то сделал или просто написал об этом клиенту. Экспорт диалога в .html добавляет к этой картине переменные канала, память диалога memory, часовой пояс и число потраченных токенов.
На планёрке заспорили из-за одной записи на маникюр. Администратор была уверена, что агент действительно поставил клиента в расписание. Менеджер настаивал, что бот просто написал «записала вас» и на этом успокоился, а слот в календаре так и остался пустым. Спор длился минут десять, аргументы кончились быстро, а оба смотрели на один и тот же текст переписки и видели в нём разное. Открыть сам диалог и включить один переключатель оказалось быстрее, чем спорить дальше.
Журнал диалогов лежит в разделе «Чаты» — это первое место, куда идут, когда ответ агента вызывает вопросы. Слева на панели находите нужный диалог из списка активных или завершённых и открываете его: там подряд идут сообщения клиента и ответы агента.
Обычного журнала хватает, если вопрос в тоне ответа или в том, правильно ли агент понял запрос. Он не показывает, что происходило между репликами, а спор про запись на маникюр как раз про это.
Проверьте на своих диалогах.Регистрация без карты, 500 ₽ на тест по промокоду BLOG500
Собрать агентаПродвинутый режим включается тумблером в верхней части раздела «Чаты» и добавляет в журнал диалогов ровно то, чего не хватало в обычном виде: между репликами появляются блоки с вызовами функций, их аргументами и статусом выполнения.
Разбор одного такого блока выглядит так: название функции показывает, какую задачу решал агент, аргументы — с какими значениями он к ней обратился, а статус говорит, прошёл вызов успешно или нет. Спор с планёрки закрывается за один взгляд: если между сообщением клиента и фразой «записала вас» в диалоге нет блока вызова вообще, агент составил ответ сам, без обращения к календарю. Если блок есть и статус говорит об ошибке, запись не прошла на стороне внешней системы, а не потому, что агент решил соврать.
В блоке вызова функции иногда обнаруживается параметр вроде staff_id=null вместо номера мастера. Функция при этом формально выполняется, но с пустым обязательным полем, и результат закономерно оказывается бессмысленным. Дело тут в том, что до вызова функции не дошли нужные данные, а не в том, что агент выдумал ответ: стоит проверить, откуда аргумент должен браться по инструкции.
Смысла держать продвинутый режим включённым постоянно нет — обычно к нему возвращаются в четырёх ситуациях: ответ агента кажется неверным, функция не вызывается там, где логично было бы её ждать, функция вызвана, но результат оказался неожиданным, или нужно понять, на чём агент тратит лишние токены, чтобы оптимизировать ответы.
Во всех четырёх случаях порядок действий одинаковый: открыть конкретный диалог, включить переключатель и найти реплику, где начались вопросы.
Кнопка экспорта в углу открытого диалога сохраняет всю историю в виде веб-страницы .html, и в неё попадает больше, чем видно на экране. Объект dialogue несёт channel_variables (данные о канале и собеседнике), memory — полную переписку клиента, агента и подключившегося сотрудника, включая присланные файлы, фото и аудио, и timezone агента. Рядом идут объект user с данными клиента и объект bot с моделью, которая вела диалог.
Внизу страницы экспорта указано общее число потраченных токенов за диалог — по нему, зная действующий курс в 1000 токенов за 1 ₽, можно прикинуть цену конкретной переписки, а не только среднюю по счёту в конце месяца. Полный перечень полей есть в руководстве по отладке инструкций.
Это ровно тот вопрос, из-за которого разгорелась планёрка, и продвинутый режим отвечает на него по одному признаку — есть блок вызова функции или нет.
Блока нет: агент придумал ответ сам, ни к какой системе не обращаясь. Обычно это значит, что в инструкции не описано условие, при котором нужно вызывать функцию, или формулировка настолько размыта, что модель посчитала обращение необязательным.
Блок есть, а результат внутри — пустой ответ, ошибка или отказ внешней системы. Тогда агент вызвал ровно то, что нужно, проблема лежит на стороне CRM, календаря, таблицы или интеграции, и разбираться нужно уже там, а не в тексте промпта.
Разница на первый взгляд кажется мелкой, а на деле определяет, что чинить: инструкцию агента в одном случае или интеграцию с внешней системой в другом. Когда причина в самом тексте промпта, а не в вызове функции, работает та же логика проверки, что и в аудите инструкции.
Выгрузите тот самый диалог из планёрки в .html и откройте два поля: memory — чтобы увидеть переписку целиком, включая моменты, потерянные в узком окне журнала, и статус ближайшего к спору вызова функции, если он вообще есть. Через пару таких проверок расхождение между «агент сказал» и «агент сделал» перестаёт быть предметом спора и превращается в обычный пункт списка того, что нужно поправить в промпте или проверить у интеграции.
Если в диалоге вообще не было ни одного блока вызова там, где он ожидался, следующий шаг — прогнать похожий сценарий в тестовом диалоге и посмотреть, повторяется ли пропуск на чистом прогоне без истории конкретного клиента.
Переключатель в верхней части журнала диалогов. Он добавляет между репликами клиента и агента блоки с вызовами функций: там видно название функции, переданные аргументы и статус выполнения. Без него журнал показывает только текст переписки.
Три объекта: `dialogue` с полями `channel_variables`, `memory` и `timezone`, `user` с данными клиента и `bot` с моделью агента. Внизу страницы указано общее число потраченных токенов за диалог.
Между репликой клиента и ответом агента в продвинутом режиме просто нет блока вызова. Раз блока нет, обращения к внешней системе не было, и весь ответ агент составил сам, без проверки.
В первом случае в продвинутом режиме нет блока вызова функции вовсе. Во втором блок есть, у него указан статус выполнения, и открыв его, вы увидите пустой или ошибочный ответ от внешней системы — CRM, таблицы, календаря.
Десять раз, общий лимит платформы, единый для любой функции. При превышении диалог останавливается с ошибкой «Достиг максимального количества вызовов функций на диалог», и это тоже видно в продвинутом режиме.
45 дней по умолчанию. Спорный диалог стоит выгрузить сразу после планёрки, а не откладывать до момента, когда он понадобится для разбора с клиентом или коллегой.