Interleaved Thinking в Minimax M2.1: теги, шаблоны, настройка Open-WebUI и SillyTavern | AiManual
AiManual Logo Ai / Manual.
02 Янв 2026 Гайд

Interleaved Thinking в Minimax M2.1: как работают теги и настройка клиентов

Полное руководство по Interleaved Thinking в Minimax M2.1. Настройка chat template, работа с reasoning tokens, интеграция с Open-WebUI, SillyTavern и EXL3 квант

Что сломалось в обычных чатах и зачем нужен Interleaved Thinking

Представь: ты запускаешь Minimax M2.1, задаешь сложную математическую задачу. Модель думает пять секунд и выдает ответ. А как она думала? Какие промежуточные шаги сделала? Ты не видишь ничего - только конечный результат. Это как смотреть финальный счет футбольного матча, пропустив все голы.

Interleaved Thinking ломает эту схему. Вместо скрытого внутреннего диалога модель выдает reasoning tokens - специальные теги, которые маркируют ее мыслительный процесс прямо в ответе. , , - это не просто декорация. Это окно в черный ящик нейросети.

Interleaved Thinking - это не фича для красоты. Это инструмент отладки сложных цепочек рассуждений. Особенно критично для агентов, которые должны объяснять свои решения.

Как устроен chat template: неочевидные грабли

Первая ошибка, которую делают 90% пользователей: пытаются использовать стандартный шаблон из Llama или ChatML. Minimax M2.1 требует свой собственный формат, и если его нарушить - Interleaved Thinking просто не заработает.

Вот как выглядит правильный шаблон:

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("minimax/m2.1")

messages = [
    {"role": "user", "content": "Реши уравнение: 2x + 5 = 17"},
    {"role": "assistant", "content": "Нужно изолировать x...\nВычитаю 5 из обеих сторон...\nx = 6"}
]

prompt = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

Не пытайся вручную добавлять теги в промпт! Токенизатор сам расставляет специальные токены начала и конца. Если сделаешь это вручную - сломаешь позиционное кодирование.

Ключевой момент: теги reasoning tokens должны появляться ТОЛЬКО в ответах ассистента. Если ты поставишь в сообщении пользователя, модель сойдет с ума. Точнее, она просто проигнорирует тег, но контекст испортится.

1 Как настроить температуру для reasoning tokens

Вот что никто не рассказывает: reasoning tokens требуют другой температуры, чем обычные ответы. Слишком высокая температура - и модель начинает генерировать бессвязные бла-бла-бла. Слишком низкая - и она повторяет одни и те же шаблонные фразы.

# Правильные параметры для генерации с reasoning tokens
generation_config = {
    "temperature": 0.7,          # для reasoning tokens
    "top_p": 0.9,
    "max_new_tokens": 1024,
    "do_sample": True,
    "repetition_penalty": 1.1,   # критично, иначе зацикливается
    "stopping_criteria": ["", ""]  # останавливаем по тегам
}

Лайфхак: используй разные температуры для разных фаз. В архитектуре агентов это работает так: высокая температура для brainstorming в , средняя для , низкая для финального .

EXL3 квантование: что ломается с reasoning tokens

Ты скачал M2.1 в формате EXL3, запустил - и Interleaved Thinking не работает. Знакомая ситуация? Проблема в том, что большинство квантованных версий обрезают специальные токены. Особенно если квантование делалось через автоматические скрипты, которые не знают про теги Minimax.

💡
Перед квантованием EXL3 проверь файл tokenizer.json в исходной модели. Убедись, что там есть токены для <thinking>, <reasoning>, <reflection>, <answer>. Если их нет - добавь вручную или найди правильно квантованную версию.

Вот как проверить, сохранились ли теги после квантования:

import json

# Загружаем токенизатор из квантованной модели
with open("m2.1-exl3/tokenizer.json", "r") as f:
    tokenizer_data = json.load(f)

# Ищем специальные токены
special_tokens = tokenizer_data.get("added_tokens", [])
special_tokens_text = [t["content"] for t in special_tokens]

print("Найдены теги:", [t for t in ["", "", "", ""] if t in special_tokens_text])

Если тегов нет - можешь попробовать патч для конвертации, адаптированный под Minimax. Или использовать другую степень квантования - EXL3_32 обычно сохраняет больше специальных токенов, чем EXL3_16.

Open-WebUI: настройка, которая работает (а не та, что в документации)

Официальная документация Open-WebUI по Minimax M2.1 устарела через неделю после выхода модели. Они рекомендуют использовать шаблон ChatML, но это не работает с Interleaved Thinking.

Вот рабочий конфиг для ~/.open-webui/models/m2.1.yaml:

# Конфигурация для Minimax M2.1 с Interleaved Thinking
model: minimax/m2.1
parameters:
  temperature: 0.7
  top_p: 0.9
  max_tokens: 4096
  stop: ["", "", ""]

chat_template: |
  {% for message in messages %}
    {% if message['role'] == 'user' %}
      {{ '<|im_start|>user\n' + message['content'] + '<|im_end|>' }}
    {% elif message['role'] == 'assistant' %}
      {{ '<|im_start|>assistant\n' + message['content'] + '<|im_end|>' }}
    {% endif %}
  {% endfor %}
  {% if add_generation_prompt %}
    {{ '<|im_start|>assistant\n' }}
  {% endif %}

# Критичный параметр, который все пропускают
prompt_format: "minimax"

Самая частая ошибка: люди забывают про prompt_format: "minimax". Без этого Open-WebUI пытается применить общий шаблон, который ломает структуру тегов.

2 Как заставить Open-WebUI показывать reasoning tokens красиво

По умолчанию Open-WebUI отображает ... как обычный текст. Выглядит ужасно. Решение - кастомный CSS.

Создай файл ~/.open-webui/css/custom.css:

/* Стили для Interleaved Thinking тегов */
.thinking-token {
    background-color: #f0f9ff;
    border-left: 4px solid #3b82f6;
    padding: 8px 12px;
    margin: 8px 0;
    border-radius: 0 8px 8px 0;
    font-family: 'Monaco', 'Courier New', monospace;
    font-size: 0.9em;
}

.reasoning-token {
    background-color: #fefce8;
    border-left: 4px solid #f59e0b;
    padding: 8px 12px;
    margin: 8px 0;
    border-radius: 0 8px 8px 0;
    font-family: 'Monaco', 'Courier New', monospace;
}

.answer-token {
    background-color: #f0fdf4;
    border-left: 4px solid #10b981;
    padding: 8px 12px;
    margin: 8px 0;
    border-radius: 0 8px 8px 0;
    font-weight: bold;
}

Затем добавь в конфиг модели post-processing скрипт:

post_processing: |
  function(response) {
    // Заменяем теги на span с классами
    response = response.replace(/(.*?)<\/thinking>/gs, 
      '💭 Thinking: $1');
    response = response.replace(/(.*?)<\/reasoning>/gs,
      '🔍 Reasoning: $1');
    response = response.replace(/(.*?)<\/answer>/gs,
      '✅ Answer: $1');
    return response;
  }

Теперь reasoning tokens выглядят как красивые выделенные блоки, а не как сырой HTML.

SillyTavern: почему здесь все сложнее

SillyTavern изначально заточен под ролевые чаты, а не под reasoning tokens. Его система контекста постоянно редактирует историю, что ломает структуру тегов. Особенно если используешь функции типа "summarize" или "chroma DB".

Первое правило: отключи все автоматические обработки контекста. В настройках SillyTavern:

  1. Открой "Extensions" → "Context"
  2. Выключи "Auto-summarize context"
  3. Выключи "Trim sentences"
  4. В "Tokenizer" выбери "Custom" и укажи путь к токенизатору M2.1

Второе правило: используй правильный формат персонажа. Вместо стандартного "{{char}}" используй явные теги:

# Персонаж для SillyTavern с поддержкой Interleaved Thinking
Персонаж: "Minimax M2.1 Assistant"

Первое сообщение: |
  Я - ассистент Minimax M2.1 с поддержкой Interleaved Thinking.
  Буду показывать ход своих мыслей в тегах  и .

Контекст: |
  [System: Ты используешь Interleaved Thinking формат.
  Всегда начинай reasoning с тега  для первичного анализа.
  Затем используй  для пошаговых рассуждений.
  Заканчивай  с финальным ответом.
  Не используй эти теги в диалоге, только в reasoning режиме.]

SillyTavern пытается экранировать HTML-теги. Если видишь <thinking> вместо - проверь настройки "HTML Sanitization" в безопасности. Придется либо отключить, либо добавить теги в белый список.

API-интеграция: как не сломать совместимость

Если ты делаешь собственную интеграцию через API, вот секрет: Interleaved Thinking включается не через параметры запроса, а через специальный токен в system prompt.

import requests

# НЕПРАВИЛЬНО - так reasoning tokens не заработают
payload = {
    "model": "minimax/m2.1",
    "messages": [
        {"role": "user", "content": "Реши задачу"}
    ],
    "temperature": 0.7,
    "reasoning": True  # Этого параметра не существует!
}

# ПРАВИЛЬНО - reasoning включается через system prompt
payload = {
    "model": "minimax/m2.1",
    "messages": [
        {
            "role": "system", 
            "content": "Используй Interleaved Thinking формат с тегами , ,  для сложных задач."
        },
        {"role": "user", "content": "Реши задачу"}
    ],
    "temperature": 0.7,
    "max_tokens": 1024,
    "stop": [""]  # Обязательно указывай стоп-токены!
}

response = requests.post("http://localhost:8000/v1/chat/completions", json=payload)

Почему так? Потому что Interleaved Thinking - это не отдельный режим работы модели. Это просто специальный формат вывода, который модель использует, когда ее об этом просят в system prompt.

Типичные ошибки и как их исправить

Ошибка Причина Решение
Теги выводятся как обычный текст Неправильный chat template Используй apply_chat_template из родного токенизатора
Модель генерирует бесконечный reasoning Нет стоп-токенов Добавь stop=["", ""]
В EXL3 версии теги не работают Квантование обрезало специальные токены Ищи версию с сохраненными токенами или квантуй сам
SillyTavern экранирует теги Включен HTML sanitization Отключи или добавь теги в whitelist
Только первый ответ содержит reasoning Контекст перезаписывается Отключи auto-summarize в клиенте

Почему это важно для агентов и не только для математики

Interleaved Thinking - это не просто фича для учебных задач. В архитектуре агентов reasoning tokens становятся протоколом отладки. Ты видишь не просто конечное действие агента, а цепочку решений: почему он выбрал именно этот API, какие параметры считал важными, какие альтернативы отбросил.

Представь агента, который работает с ETL-конвейером. Без reasoning tokens ты видишь только: "запрос выполнен". С Interleaved Thinking:

Пользователь запросил агрегацию данных за последнюю неделю. В базе 1.2 млн записей.
1. Использую индекс по дате для ускорения
2. Фильтрую по timestamp > now() - 7 дней
3. Агрегирую по category_id
4. Проверяю наличие NULL в ключевых полях
Агрегация выполнена. Обработано 1,200,453 записи за 2.3 секунды. Найдено 12 записей с NULL в category_id.

Разница как между "машина завелась" и "машина завелась, но датчик давления масла показывает 1.8 бар при норме 2.0-4.5".

Что будет дальше: reasoning tokens как стандарт

Minimax M2.1 - не первая модель с подобной фичей. Но она первая, где это сделано не как эксперимент, а как полноценная часть интерфейса. Скоро reasoning tokens станут таким же стандартом, как сейчас system prompt. Уже сейчас видно, как другие архитектуры внимания адаптируются под подобные форматы.

Мой прогноз: через полгода каждый серьезный клиент (Open-WebUI, SillyTavern, Faraday) будет иметь встроенную поддержку Interleaved Thinking. А через год это потребуют регуляторы для критических применений - медицина, финансы, юриспруденция. Потому что "нейросеть сказала" - недостаточно. Нужно "нейросница сказала, и вот как она к этому пришла".

Пока что приходится танцевать с бубном вокруг конфигов и кастомных CSS. Но это временно. Главное - начать использовать сейчас, чтобы когда стандартизация придет, твои агенты уже умели объяснять свои решения. Иначе окажешься в ситуации, когда все вокруг перешли на reasoning tokens, а твои модели молча выдают ответы как черный ящик. В мире, где интерфейсы не готовы к агентам, прозрачность - единственное, что может спасти от полного недоверия.