Документация › Решение проблем › Функция не вызывается / падает
Функция не вызывается / падает
Две разные проблемы: бот не вызвал функцию (хотя должен был) — или вызвал, но она упала. Чинятся они по-разному. Эта статья — как отличить и где смотреть.
⏱ 10 мин · 👤 для владельца · 🟢 live
За 30 секунд:
- Не вызвал? Проверь: функция включена? описание понятное? не требует ли она от модели посчитать что-то (координаты/индексы — модель этого не умеет)?
- Упала? Бот видит ошибку и обычно переспрашивает или сообщает клиенту — не молчит. Смотри причину в Диалогах или тест-чате.
- Где смотреть: карточки вызовов функций видны в Диалогах и в тест-чате («Что понял бот») — там видно имя функции, аргументы, результат/ошибку.
- Частое: функция требует подключённой интеграции (Google Sheets/Calendar), а её нет.
Сначала пойми: не вызвал или упал?
| Симптом | Это | Куда смотреть |
|---|---|---|
| Бот «не сделал» действие, в логах вызова функции нет | не вызвал | раздел «Не вызывается» |
| В логах вызов есть, но с ошибкой; бот переспросил/извинился | упал | раздел «Падает» |
Открой тест-чат → блок «Что понял бот»: там видно, какие функции бот дёрнул, с какими параметрами и что вернулось. Если функции в списке нет — он её не вызвал.
Бот не вызывает функцию
1. Функция выключена
У каждой функции есть переключатель (is_active). Если она выключена, платформа не передаёт её модели — бот физически не может её вызвать. Проверь в разделе «Функции», что нужная функция включена.
2. Модель не поняла, когда её звать
Бот решает вызвать функцию по её описанию. Если описание размытое («работа с таблицей»), модель не сообразит, в какой момент её применить. Чините описанием, а не уговорами в промпте: опиши понятно, что функция делает и когда её звать. → Функции: как писать описание
3. Не хватает обязательного параметра
Если функция требует параметр, которого в разговоре ещё нет (например, телефон для заявки), модель либо переспросит клиента, либо не вызовет. Это нормально — добавь в промпт, что нужно сперва собрать.
4. Функция требует «посчитать» — а модель не умеет считать
🚫 Ключевое правило. Языковая модель плохо считает: координаты ячеек, индексы строк, «какая буква колонки», арифметику. Если функция ждёт от неё вычисленный адрес (G7, номер строки) — она будет ошибаться или не вызывать.✅ Решение архитектурное, не промптовое. Функция должна принимать человеческие метки («запиши к инструктору Вячеслав на 14:00»), а адрес/ячейку сервер вычисляет сам. У платформы для этого есть label-based функции (например, бронь поtarget_cellс описанием строки/колонки, а не по координате). Если своя функция упирается в «модель не туда пишет» — переведи её на метки. Никакие уточнения в промпте «считай внимательно» это не лечат.
→ Подробнее об этом классе проблем: Функции
Функция падает (возвращает ошибку)
Хорошая новость: ошибки не теряются. Когда функция падает, платформа возвращает модели структурированную ошибку ({ error, error_code }), и бот её видит — обычно переспрашивает клиента или вежливо сообщает, что не получилось. Молча проглотить ошибку он не должен.
Типичные причины
| Что | Поведение бота | Как чинить |
|---|---|---|
| Нет обязательного параметра | { error, missing_params } → бот переспрашивает | норма; убедись, что промпт собирает данные |
| Неверное значение (вне допустимого набора/диапазона) | { error, invalid_params } → бот пробует снова | проверь enum/границы в настройке функции |
| Интеграция не подключена (Google Sheets/Calendar) | бот говорит «владелец не подключил…» | подключи интеграцию и укажи ID таблицы/календаря |
| Внешний сервис не ответил (таймаут/5xx) | бот предлагает попробовать позже | временное; для своих вебхуков настрой retry |
Приём оплаты не настроен (sub_merchant_not_connected) | бот: «приём оплаты сейчас недоступен» | подключи приём оплат |
Таймауты и повторы
- У функции есть таймаут: по умолчанию 10 секунд, настраиваемый в пределах 1–60 сек.
- Для своих вебхук-функций (
http_get/http_post) можно настроить повторы: при кодах429/502/503/504платформа повторяет с нарастающей задержкой, уважаяRetry-After. - Внешние интеграции (Google/оплата) возвращают понятный клиенту русский текст ошибки, а не технический трейс.
Защита от зацикливания
Бот может вызвать несколько функций за один ход, но не бесконечно: лимит — 15 раундов вызовов на один ответ. Если упёрся в потолок — платформа аккуратно завершает ход осмысленной репликой, а не ошибкой (и пишет событие tool_rounds_exceeded). Если видишь такое часто — функция, вероятно, возвращает данные, которые провоцируют новый вызов по кругу; упрости сценарий.
Где увидеть вызовы функций
Все вызовы пишутся в журнал событий (events_log, тип function_call) и показываются:
- в Диалогах — карточками прямо в ленте переписки (имя функции, успех/ошибка);
- в тест-чате — в блоке «Что понял бот».
📌 Важно: вызовы функций живых диалогов лежат в журнале событий, а не среди сообщений. Поэтому в «сырой» переписке их не видно — смотри именно карточки функций в Диалогах. Секреты (токены/ключи в параметрах) в журнале маскируются.
🔧 Под капотом
- Загрузка функций:
loadProjectFunctions()фильтрует.eq("is_active", true)— выключенные не попадают в схему для модели (tool-executor.ts). - Валидация аргументов: перед выполнением аргументы приводятся к типам (
coerceArgs) и проверяются по ограничениям (validateArgConstraints: enum/min/max/pattern). Невалидные → ошибка модели на самокоррекцию. - Детект ошибки результата:
toolResultHasError()считает результат ошибкой, если естьerror,success:falseили непустойerrors. - Логирование:
logFunctionCall()пишетevent_type:"function_call"сfunction_name / duration_ms / success / error / request / response; чувствительные ключи редактируются (REDACT_KEYS), payload обрезается до 2000 символов. - Игнор устаревших полей: если модель вернёт
selected_service/services(удалённая фича «Услуги»), схема ответа их молча отбрасывает (ai-response-schema.ts) — это не ошибка.
💬 Простыми словами
С функциями бывает две разные беды, и их легко перепутать.
Первая — бот вообще не вызвал функцию. Чаще всего она просто выключена (проверь тумблер в «Функциях»), либо у неё непонятное описание, и бот не сообразил, когда её применять. И есть особый случай: если функция требует от бота что-то посчитать — номер ячейки, координату, индекс — он будет ошибаться, потому что языковая модель считать не умеет. Лечится это не уговорами в промпте, а тем, чтобы функция принимала понятные слова («запиши к Вячеславу на 14:00»), а все вычисления делал сервер.
Вторая беда — функция вызвалась, но упала. Тут хорошая новость: бот ошибку видит и обычно либо переспрашивает клиента, либо честно говорит «не получилось, попробуем позже» — он не зависает молча. Самая частая причина — функция лезет в Google-таблицу или календарь, которые не подключены. Подключи интеграцию — и заработает.
А чтобы понять, что вообще произошло, открой тест-чат или Диалоги: там каждый вызов функции показан карточкой — видно, что бот дёрнул, с какими данными и что вернулось. Это лучшее место для диагностики.
Дальше: → Канал отвалился / WhatsApp забанили
Связано: Функции (полный гайд) · Интеграции · Тест-чат · Бот не отвечает
Не получилось? → напиши в саппорт с ID проекта и именем функции