Devstral Small 2 взрывается в llama.cpp? Виновник - Jinja
Вы запускаете Devstral Small 2 через llama.cpp, может быть, в рамках агентской системы, и получаете непонятную ошибку Jinja. Модель, которая вроде бы должна работать, внезапно вываливается с сообщением о проблеме с шаблоном. Знакомо? Это не вы сошли с ума - это известная проблема совместимости.
На 03.02.2026 Devstral Small 2 остается популярной моделью для локального запуска, особенно в связке с llama.cpp версии 2026.01 или новее. Но встроенный chat template иногда конфликтует с некоторыми конфигурациями, особенно когда вы используете агентские инструменты вроде Kilocode OpenClaw.
Что ломается и почему
Ошибка выглядит примерно так: RuntimeError: Failed to render Jinja template. Корень зла - в том, как llama.cpp обрабатывает системные промпты и сообщения от инструментов. Devstral Small 2 использует свой собственный формат chat template, который не всегда правильно интерпретируется стандартным обработчиком Jinja в llama.cpp.
Особенно часто это происходит, когда вы пытаетесь интегрировать модель в агентскую систему, где нужно чередовать сообщения пользователя, ассистента и вызовы инструментов. Стандартный шаблон не учитывает всех нюансов.
Спасение - кастомный шаблон Jinja
Решение - создать свой chat template, который явно определяет, как форматировать диалог. Вот готовый шаблон, который работает с Devstral Small 2 в llama.cpp и совместим с агентскими инструментами.
{{- if messages[0]['role'] == 'system' -}}
{{- messages[0]['content'] -}}
{{- set system_prompt = messages[0]['content'] -}}
{{- else -}}
{{- set system_prompt = '' -}}
{{- endif -}}
{{- for message in messages -}}
{{- if message['role'] == 'user' -}}
{{- '<|im_start|>user\n' + message['content'] + '<|im_end|>\n' -}}
{{- elif message['role'] == 'assistant' -}}
{{- '<|im_start|>assistant\n' + message['content'] + '<|im_end|>\n' -}}
{{- elif message['role'] == 'tool' -}}
{{- '<|im_start|>tool\n' + message['content'] + '<|im_end|>\n' -}}
{{- endif -}}
{{- endfor -}}
{{- if add_generation_prompt -}}
{{- '<|im_start|>assistant\n' -}}
{{- endif -}}
Этот шаблон явно обрабатывает роли user, assistant и tool, что критично для агентов. Он также корректно работает с системным промптом, если он есть.
1 Как применить шаблон в llama.cpp
Скопируйте шаблон выше в файл, например, devstral_small2.jinja. Затем, при запуске llama.cpp, укажите этот файл через параметр --chat-template.
./main -m ./models/devstral-small2.Q4_K_M.gguf --chat-template ./devstral_small2.jinja -p "Ваш промпт"
Если вы используете llama.cpp через API или как библиотеку, передайте содержимое шаблона в соответствующую функцию. Например, в Python-обертке:
from llama_cpp import Llama
llm = Llama(
model_path="./models/devstral-small2.Q4_K_M.gguf",
chat_template=open("./devstral_small2.jinja").read()
)
2 Интеграция с агентскими системами
Теперь, когда модель работает стабильно, можно использовать ее в агентах. Например, с Kilocode OpenClaw или другими фреймворками. Ключевое - убедиться, что вызовы инструментов правильно форматируются как сообщения с ролью tool.
Вот пример фрагмента кода для агента, который использует Devstral Small 2 с нашим шаблоном:
messages = [
{"role": "system", "content": "Ты - помощник для программирования."},
{"role": "user", "content": "Напиши функцию сложения на Python."},
{"role": "assistant", "content": "Вот функция: def add(a, b): return a + b"},
{"role": "tool", "content": "Инструмент выполнен успешно."}
]
# Передаем messages в llama.cpp с нашим шаблоном
response = llm.create_chat_completion(messages=messages)
print(response['choices'][0]['message']['content'])
Этот подход позволяет избежать ошибок Jinja, когда агент вызывает инструменты и получает ответы. Если вы строите сложные агентские системы, как в статье "Как правильно использовать суб-агентов в AI-разработке", стабильность chat template критична.
Альтернативы? Есть, но они не так хороши
Можно попытаться использовать другие модели, которые не имеют проблем с Jinja в llama.cpp. Например, последние версии Llama 4 или Mistral 2. Но Devstral Small 2 часто выбирают за ее эффективность в кодировании и малый размер.
Другой вариант - патчить llama.cpp, чтобы исправить встроенный обработчик Jinja. Но это требует компиляции и глубокого знания кода, и не гарантирует совместимости с будущими версиями.
Наш кастомный шаблон - самое простое и надежное решение. Он работает без модификации llama.cpp и совместим с последними версиями на 2026 год.
| Метод | Сложность | Надежность |
|---|---|---|
| Кастомный шаблон (наш) | Низкая | Высокая |
| Патч llama.cpp | Высокая | Средняя |
| Смена модели | Низкая | Зависит от задачи |
Кому это нужно? Всем, кто использует Devstral Small 2 с агентами
Это решение обязательно для:
- Разработчиков, которые строят агентские системы на llama.cpp с Devstral Small 2.
- Тех, кто использует Kilocode OpenClaw или подобные инструменты для вызова функций.
- Людей, которые столкнулись с ошибкой Jinja при запуске модели через llama.cpp.
- Энтузиастов, которые хотят использовать последние версии llama.cpp без сбоев.
Если вы работаете с распределенными вычислениями, как в llama.cpp RPC-server, стабильный chat template важен для корректной работы на нескольких узлах.
И помните: если ваша LLM для кодирования работает как пьяный стажер, возможно, дело не только в железе, как в статье "RTX 5090 в слезах", а в таких мелочах, как chat template.
Исправьте Jinja - и Devstral Small 2 будет работать как швейцарские часы. Ну, или хотя бы как трезвый стажер.