Когда LLM вызывает инструмент, это не какой-то магический вызов функции напрямую. Сначала модель генерирует структуру в JSON, примерно такую:
{
"name": "search_cruises",
"args": {
"departure_cities": ["москва"],
"departure_date_from": "2026-08-10",
"arrival_date_to": "2026-08-30"
},
"type": "tool_call"
}А уже потом наш код берет
name, берет args и выполняет нужный инструментИ вот между этими двумя шагами можно вклиниться
У меня это всплыло на датах
Было два кейса:
1. Пользователь говорит: “хочу круиз в мае”
Если сейчас сентябрь, то логично искать май следующего года. Но LLM иногда ставила май текущего года - то есть прошедшую дату
2. У gpt-4.1-mini были проблемы с февралем 2026
Она периодически считала, что там 29 дней
В итоге я починил это не промптом, а исправлением аргументов функцией перед вызовом инструмента
1. LLM сгенерировала, что хочет tool call
2. Если это "search_cruises"
- Проверяем даты. Исправляем год, если месяц уже прошел
- Проверяем количество дней в месяце, исправляем
3. Возвращаем исправленный tool call обратно в пайплайн — как будто это и был ответ LLM
Для остального пайплайна это выглядит так, будто модель сама сразу вызвала инструмент с правильными аргументами
Работает безотказно