Исправление ошибки Jinja в Devstral Small 2: шаблон для llama.cpp | AiManual
AiManual Logo Ai / Manual.
03 Фев 2026 Инструмент

Исправление ошибки Jinja в Devstral Small 2: кастомный шаблон для llama.cpp и агентов

Готовое решение для исправления runtime error в Devstral Small 2 при использовании с llama.cpp и агентскими инструментами. Кастомный chat template и примеры код

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.

Особенно часто это происходит, когда вы пытаетесь интегрировать модель в агентскую систему, где нужно чередовать сообщения пользователя, ассистента и вызовы инструментов. Стандартный шаблон не учитывает всех нюансов.

💡
Эта проблема не уникальна для Devstral Small 2. С похожими сложностями сталкиваются при использовании других моделей с кастомными форматами, но Small 2 особенно чувствительна из-за своей оптимизации под код.

Спасение - кастомный шаблон 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 будет работать как швейцарские часы. Ну, или хотя бы как трезвый стажер.