Все хотят запустить локальную нейронку, отдать ей доступ к консоли и уйти пить кофе. Желательно, чтобы она при этом не удалила продакшен и умела дергать внешние API. Ребята из ServerFlow прогнали через тесты пачку мелких моделей от 3 до 9 миллиардов параметров, чтобы понять, кто реально тянет tool calling, а кто уходит в бесконечный цикл. Спойлер: синтетическим бенчмаркам верить нельзя.
Тестовый стенд и базовые настройки
В тестах участвуют модели от 3B до 9B:
- Qwen 3.5
- Gemma 4 E4B
- Ministral 3
- Nemotron 3 Nano
- SERA
- OmniCoder
- Nanbeige.
Гоняли весь этот зоопарк через фреймворк opencode и движок llama.cpp. Окно контекста выкрутили на 64 000 токенов, чтобы моделям было где развернуться при чтении исходников. Смотрели не только на успешность выполнения, но и на время работы и жор VRAM.
Для повторения эксперимента базовый запуск модели через llama.cpp выглядит примерно так:
./main -m models/OmniCoder-9B.Q4_K_M.gguf \
-c 64000 \
--temp 0.1 \
-n -1 \
--grammar-file grammars/json_arr.gbnf \
-p "your_agent_prompt_here"
Интеграция фичи в готовый проект
Первый сценарий максимально жизненный: есть готовое веб-приложение FocusBoard. Модели нужно самостоятельно найти нужные файлы и прикрутить автозавершение сессии с работающим таймером обратного отсчета. Главное условие — не сломать то, что уже работает.
Алгоритм работы агента в этом кейсе выглядит так:
- Изучить структуру директорий через вызов инструмента
list_files. - Прочитать содержимое нужных компонентов с помощью
read_file. - Сгенерировать патч и применить его через
edit_file. - Запустить базовую проверку синтаксиса.
Мелкие модели вроде Nanbeige 3B и Sera 8B ожидаемо отлетели. Они уходили в бесконечные циклы, путались в собственных вызовах и не могли исправить ошибки синтаксиса. А вот Ministral-3-8B и OmniCoder-9B выдали отличный результат. Они с первой попытки распарсили проект, написали логику таймера и сами покрыли её тестами без дополнительных пинков со стороны пользователя.
Поиск в сети и сборка данных
Вторая задача — собрать актуальные новости про новые ИИ-модели для генерации изображений за 2026 год, отфильтровать мусор и сложить данные в валидный JSON.
Для подобных задач системный промпт обычно содержит жесткую инструкцию по формату ответа:
{
"name": "search_and_extract",
"description": "поиск новостей и формирование отчета",
"parameters": {
"type": "object",
"properties": {
"model_name": { "type": "string" },
"release_month": { "type": "string" },
"key_features": { "type": "array", "items": { "type": "string" } }
},
"required":["model_name", "key_features"]
}
}
Здесь снова начались проблемы с логикой. Одна из моделей начала жестко галлюцинировать при записи структуры файла, а другая просто сожгла 200 запросов к поисковику, зациклившись на одной и той же битой ссылке.
Точные результаты снова показали OmniCoder-9B и Ministral-3-8B, к которым присоединилась Qwen3.5-9B. Они грамотно подобрали поисковые запросы, нашли нужные источники и выплюнули правильно отформатированный файл.
Синтетические тесты против суровой реальности
На десерт оставили синтетический бенчмарк на tool calling ⚠️. Тут проверяют, как ИИ вызывает инструменты, справляется со сложными промптами и умеет ли ничего не делать, когда применение функции не требуется.
Здесь произошел разрыв шаблона: почти идеальный скор в 0.88 выбила крошечная Nemotron-3-Nano-4B, уступив только эталонному монстру на 31B параметров. Остальные модели на 8-9B показали весьма средние цифры.
Маленькие локальные модели уже готовы писать код и дергать ручки API, чтобы вы могли поменьше работать. Но опираться на синтетику при выборе весов не стоит: поведение в бенчмарках и в реальной кодовой базе отличается кардинально. Для практического применения и написания агентов сегодня лучше всего брать OmniCoder-9B или Ministral-3-8B. Грузите их в память, настраивайте системный промпт и идите проверять логи.