Цель
Дать модели две строго ограниченные функции и реализовать цикл «модель → инструмент → результат → модель».
Инструменты
lookup_orderчитает только два фиктивных заказа из встроенного словаря.calculate_order_totalпринимает ID заказа и количество от 1 до 100, а цену берёт из доверенного справочника.
Агент не получает shell, сеть, произвольное чтение файлов или изменение данных.
Запуск
Запустите приложение Ollama и из корня проекта выполните:
uv run python -m agent_lab.tool_agent \
"Узнай статус заказа DEMO-1001 и посчитай стоимость трёх таких заказов."Программа выводит журнал вызванных инструментов, итоговый ответ и число шагов.
Как работает цикл
- Python отправляет модели задачу и JSON-описания разрешённых инструментов.
- Модель отвечает обычным текстом либо массивом
tool_calls. - Python проверяет имя функции по allowlist.
- Pydantic проверяет аргументы и запрещает лишние поля.
- Python выполняет функцию и возвращает результат модели с ролью
tool. - Цикл повторяется, но не более четырёх шагов.
Критерии PASS/FAIL
PASS:
- известный заказ найден без выдуманных данных;
- неизвестный заказ возвращает
found: false; - итоговая стоимость считается по доверенной цене без
eval; - неизвестный инструмент и лишние аргументы отклоняются;
- цикл завершается текстовым ответом в пределах лимита.
Тесты
uv run pytestТест run_shell специально имитирует опасный вызов модели. Диспетчер обязан отклонить его, поскольку такой функции нет в allowlist.
Ограничения
- модель может выбрать ненужный инструмент или не вызвать нужный;
- схема проверяет аргументы, но бизнес-правила всё равно реализуются в Python;
- демонстрационная база заказов хранится в памяти и не содержит реальных данных;
- для внешних и изменяющих действий в реальном проекте потребуется подтверждение человека.
Универсальный калькулятор намеренно не используется: на первом сквозном тесте модель перепутала цену 2490 с числом 1001 из ID заказа. Узкий бизнес-инструмент не позволяет модели самостоятельно подставлять цену и устраняет этот класс ошибки.