Токены горят, нервы тоже: зачем вам этот агент
Каждый раз, когда вы просите Claude или GPT-4.5 "найти все вызовы функции X", ваш кошелек тихо плачет. Контекст в 200К токенов – это не мощь, это финансовое самоубийство. Особенно если нужно просто пробежаться по кодовой базе.
Локальные модели? Да, но та же Qwen 3 Coder Next сломала tool-calling, а 40B-монстры вроде IQuestCoder требуют видеокарту стоимостью с ипотеку.
Что внутри: Qwen, GGUF и магия 100% валидности
Это не очередная квантованная модель с Hugging Face. Авторы взяли Qwen 2.5 Coder 4B – последнюю доступную на февраль 2026 года 4B-версию кодера от Alibaba – и дообучили ее на специфическом датасете вызовов инструментов.
Что получилось:
- GGUF формат: запускается в llama.cpp, LM Studio, Ollama – где угодно.
- Только два инструмента:
grep_searchиfind_files. Ничего лишнего. - 100% валидный JSON: модель всегда возвращает корректный вызов, без забытых скобок или кавычек.
- Понимание контекста: если вы в диалоге упомянули "ищи в папке src", следующий вызов
find_filesбудет с параметромdirectory="src".
Важно: 100% валидность – только для этих двух инструментов. Модель не умеет в API-вызовы или сложные цепочки. Ее задача – заменить ваш первый запрос к GPT "найди все файлы, где...".
1 Качаем и устанавливаем
Модель выложена на Hugging Face в трех квантованиях: Q4_K_M (2.5GB), Q5_K_M (3GB), Q6_K (3.5GB). Для точности берите Q6_K, для скорости – Q4_K_M.
# Скачиваем через huggingface-cli (установите, если нет)
huggingface-cli download author/qwen-2.5-coder-4b-toolcall-GGUF qwen-2.5-coder-4b-toolcall-q6_k.gguf --local-dir ./models
# Или качаем вручную с страницы модели
# Запускаем через llama.cpp с указанием семплара\./main -m ./models/qwen-2.5-coder-4b-toolcall-q6_k.gguf \
-c 4096 \
--temp 0.1 \
--top-k 40 \
--top-p 0.9 \
-n -1 \
-p "Пользователь: найди все .py файлы в текущей директории\nАссистент:"
2 Пишем простой враппер для инструментов
Модель возвращает JSON вида {"tool": "find_files", "params": {"pattern": "*.py", "directory": "."}}. Ваша задача – исполнить это и вернуть результат в диалог.
import subprocess
import json
import re
def execute_tool_call(tool_call_json: str):
"""Парсим JSON и выполняем grep или find"""
try:
data = json.loads(tool_call_json)
tool = data.get("tool")
params = data.get("params", {})
if tool == "find_files":
pattern = params.get("pattern", "*")
directory = params.get("directory", ".")
cmd = f"find {directory} -name '{pattern}' -type f 2>/dev/null | head -20"
elif tool == "grep_search":
pattern = params.get("pattern", "")
directory = params.get("directory", ".")
case_sensitive = params.get("case_sensitive", False)
flag = "-i" if not case_sensitive else ""
cmd = f"grep -r {flag} '{pattern}' {directory} 2>/dev/null | head -30"
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
return result.stdout if result.stdout else "Ничего не найдено."
except json.JSONDecodeError:
return "Ошибка: невалидный JSON от модели"
Это базовая реализация. В реальном агенте добавьте ограничения на директории (чтобы модель не полезла в /sys) и кэширование.
3 Настраиваем контекст и промпт
Самый важный этап. Модель должна понимать, что она – sub-agent для поиска, а не полноценный помощник. Используйте системный промпт:
Ты – агент для навигации по кодовой базе. Твоя задача – отвечать на запросы разработчика, используя инструменты find_files и grep_search.
Инструменты:
1. find_files - поиск файлов по маске. Параметры: pattern (маска, например *.py), directory (директория для поиска).
2. grep_search - поиск текста в файлах. Параметры: pattern (regex или текст), directory, case_sensitive (true/false).
Всегда возвращай вызов инструмента в формате JSON. Не объясняй, не комментируй. Только JSON.
Этот промпт – причина 100% валидности. Модель не отвлекается на болтовню, как многие агенты из CAR-bench.
Claude vs. Локальная крошка: кто кого?
| Критерий | Qwen 4B Toolcall | Claude 3.7 Sonnet | GPT-4.5 Turbo |
|---|---|---|---|
| Стоимость запроса (поиск по 100 файлам) | 0 ₽ (локально) | ~15 ₽ | ~12 ₽ |
| Валидность tool-calling | 100% (для двух инструментов) | ~95% (иногда теряет параметры) | ~98% |
| Контекстное окно | 4K (но достаточно) | 200K (избыточно) | 128K |
| Понимание сложных запросов | Среднее (только файлы/текст) | Отличное | Отличное |
Вывод: для рутинного "найди-покажи" 4B-агент выигрывает по стоимости и надежности. Для сложного анализа кода с рассуждениями – все еще нужен Claude или GPT. Но зачем платить 15 рублей за то, что делает бесплатная модель?
Как заставить агента искать код: реальные сценарии
Диалог выглядит так:
Пользователь: Ищи все вызовы функции send_email в папке app/services
Ассистент: {"tool": "grep_search", "params": {"pattern": "send_email", "directory": "app/services", "case_sensitive": false}}
(Система выполняет grep, возвращает результат)
Пользователь: А теперь найди все тестовые файлы для этих сервисов
Ассистент: {"tool": "find_files", "params": {"pattern": "*test*.py", "directory": "app/services"}}
Никаких лишних слов. Только инструменты и результаты. Экономия токенов – в 5-7 раз по сравнению с тем, если бы вы впихнули весь этот диалог в промпт GPT с просьбой "сначала найди, потом проанализируй".
Кому стоит попробовать, а кому лучше не надо
Берите этого агента, если:
- Устали платить за каждый запрос "найди файл" к облачным API.
- Работаете с крупными кодобазами (50к+ файлов), где ручной поиск – ад.
- Хотите построить кастомного агента для GitHub Copilot с локальными компонентами.
- Имеете RTX 3060/4060 или любую карту с 8GB VRAM – этого хватит.
Не тратьте время, если:
- Нужен анализ кода с пониманием семантики ("почему эта функция падает?").
- Ждете агента с длинной памятью и сложными навыками.
- Ищете замену CodeQL или статическому анализу.
- У вас нет доступа к Linux/macOS (Windows с WSL работает, но нативно – только grep/find).
Что дальше? Подключаем супервизора
Один 4B-агент – это только начало. Настройте двух агентов: один ищет файлы (наш Qwen), второй – анализирует найденное (например, IQuestCoder-40B или даже GPT-4.5, но с урезанным контекстом).
Первый агент становится фильтром: он отсекает 95% мусора, оставляя для дорогой модели только релевантные файлы. Так вы сокращаете токены в 10-20 раз для сложных задач.
Предупреждение: даже с 100% валидностью tool-calling, модель может ошибаться в параметрах. Например, искать в / вместо ./. Добавьте в ваш враппер проверку директорий и лимит на количество возвращаемых строк.
На февраль 2026 года этот подход – самый дешевый способ автоматизировать рутинную навигацию по коду. Пока крупные вендоры увеличивают контекст до 1M токенов, вы можете делать то же самое за 0 рублей. Просто надо правильно поделить задачу между маленькой и большой моделью.
И да, если боитесь галлюцинаций – проведите форенсик-аудит на своем коде. Но для поиска файлов по маске галлюцинировать сложно: либо файл есть, либо нет.