Кошмар разработчика: tool calling, который не работает
Вы скачали свежую Qwen 3.5 (да, ту самую, с обновлениями 2025-2026 годов). Настроили инструменты. Запустили агента. А он... или молчит, как партизан, или талдычит одно и то же, или выдает tool-calls в бездну. Знакомый сценарий?
Стандартный чат-шаблон для Qwen 3.5 сломан. Не местами, а капитально. Бесконечные циклы, сломанный стриминг, игнорирование системных промптов. Про эту проблему кричат на всех форумах. Но ждать фикса от разработчиков можно до Qwen 4.0.
Спасение пришло: исправленный чат-шаблон
Я собрал все известные баги (ровно 21 критический) в один чат-шаблон. Это не костыль, а полноценная замена. Он исправляет логику формирования промпта, парсинг tool-calls, управление контекстом и стриминг ответов.
1Что внутри? 21 исправление
- Фикс бесконечных циклов вызова инструментов (тот самый, когда модель "думает" вечно).
- Исправление парсинга JSON для tool-calls — теперь нет галлюцинаций вроде "{'name': 'tool', 'arguments': ...}".
- Правильная обработка системного промпта. Модель наконец-то его слушается.
- Исправление стриминга: токены приходят по мере генерации, а не одним куском в конце.
- Фикс для повторной обработки промптов в llama.cpp, который ломал агентские циклы.
- Поддержка параллельных вызовов инструментов (parallel tool calling).
- Корректное завершение генерации после tool-call.
- И еще 14 точечных исправлений для специфичных багов в разных бэкендах.
| Бэкенд | Версия (на 17.03.2026) | Статус совместимости |
|---|---|---|
| llama.cpp | 2026.03+ | ✅ Полная поддержка |
| Open WebUI | 0.7.x | ✅ Работает из коробки |
| vLLM | 0.5.x | ✅ Требуется конфиг |
| Ollama | 0.5.x | ⚠️ Частично (см. гайд по исправлению) |
2Установка за 5 минут
Шаблон — это один файл JSON. Качаете, кладете в нужную папку, прописываете путь в конфиге. Вот и вся магия.
# Клонируем репозиторий с исправленным шаблоном
git clone https://github.com/username/qwen-35-fixed-chat-template.git
cd qwen-35-fixed-chat-template
# Копируем шаблон для llama.cpp
cp qwen_fixed_chat_template.json ~/.cache/lm-studio/models/chat-templates/
Внимание! Если вы используете LM Studio или текстовики вроде text-generation-webui 4.1, убедитесь, что отключили встроенный шаблон Qwen. Иначе будет конфликт.
3Настройка для llama.cpp: от хаоса к порядку
В llama.cpp (актуальная версия 2026.03) укажите путь к шаблону через флаг --chat-template. Больше никаких хаков с пересборкой.
./main -m qwen3.5-14b-q4_k_m.gguf \
--chat-template ./qwen_fixed_chat_template.json \
--ctx-size 8192 \
-p "<|im_start|>system\nВы полезный AI ассистент.<|im_end|>\n<|im_start|>user\nНайди информацию о погоде.<|im_end|>"
Системный промпт теперь работает. Модель не будет его игнорировать или повторять бесконечно. Проверено на Qwen3.5-32B-2026-01.
4Open WebUI и vLLM: тонкая настройка
Для Open WebUI 0.7.x добавьте шаблон в настройки модели. В vLLM 0.5.x используйте параметр chat_template в классе ChatCompletionRequest. Подробности — в гайде по Open Terminal.
Живые примеры: от простого агента до сложного workflow
Теория — это хорошо. Но как это работает на практике? Вот пример агентского цикла с tool calling.
# Пример на Python с использованием исправленного шаблона
import requests
import json
# Конфигурация для локального сервера llama.cpp с исправленным шаблоном
API_URL = "http://localhost:8080/completion"
# Описание инструментов в формате JSON Schema
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Получить погоду в городе",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"}
}
}
}
}
]
# Запрос с tool calling
payload = {
"prompt": "<|im_start|>system\nТы ассистент с доступом к инструментам.<|im_end|>\n<|im_start|>user\nКакая погода в Москве?<|im_end|>",
"temperature": 0.7,
"n_predict": 512,
"stop": ["<|im_end|>", "<|im_start|>"]
}
response = requests.post(API_URL, json=payload)
result = response.json()
# Модель вернет корректный JSON для вызова инструмента
# Без багов с незакрытыми скобками или лишними символами
print(result['content'])
Раньше такой код мог сломаться из-за сломанного tool calling в Qwen Coder Next. Теперь — работает.
Альтернативы? Их нет, но есть костыли
Можно пытаться исправить баги вручную. Патчить llama.cpp. Писать свои парсеры. Как в text-generation-webui 4.1. Но зачем?
- Официальный шаблон от Alibaba: сломан. Ждать фикса — игра в рулетку.
- Самодельные шаблоны из форумов: исправляют один баг, ломают два.
- Исправленный шаблон: 21 багфикс, одна конфигурация, ноль головной боли.
Кому этот шаблон спасет жизнь?
Если вы:
- Разрабатываете агентов на Qwen 3.5 (особенно на слабом железе с Qwen3.5-9B).
- Используете tool calling в продакшене (или планируете).
- Столкнулись с бесконечным мышлением на Mac.
- Хотите стабильный стриминг ответов.
То этот шаблон — must-have. Он превращает Qwen 3.5 из капризной модели в надежный инструмент.
Будущее: что будет с Qwen 4.0?
Alibaba, вероятно, исправит эти баги в Qwen 4.0 (когда она выйдет, предположительно в 2026-2027). Но до тех пор миллионы разработчиков используют Qwen 3.5. И этот шаблон — их спасение.
Мой прогноз? Даже после выхода Qwen 4.0, этот исправленный шаблон останется популярным для legacy-проектов. Как старый, проверенный друг, который никогда не подводит.
P.S. Не ждите, пока модель "починят сверху". Берите готовое решение и работайте. Баги должны вас бояться, а не вы — багов.