Как писать spintax-шаблоны с ИИ
Вы платите модели один раз — за шаблон. Дальше движок рендерит сколько угодно вариантов, локально и бесплатно. Эта страница про то, что между этими двумя фактами: что дать модели, о чём её попросить, как проверить результат и какие ошибки в spintax делает любая модель.
Коротко
Дайте модели документацию, дайте готовую статью, попросите один шаблон. Именно в таком порядке. Всё, что ниже, — подробности к этим трём шагам.
Обратите внимание, что именно делает модель: она не пишет, она размечает текст, который вы уже одобрили. Попросите то и другое сразу — получите шаблон, собранный из предложений, которые никто никогда не читал как предложения. Сначала напишите статью, в одной чистой версии, которую вы опубликовали бы как есть. Потом отдавайте.
Что дать модели
Сайт публикует свою документацию в машиночитаемом виде, так что объяснять spintax не нужно ничему. Выберите поверхность под свой инструмент.
| Поверхность | Что это | Когда брать |
|---|---|---|
/llms-full.txt |
Ядро документации одним файлом: справочник по синтаксису, гайд по вложенности и все семь гайдов по написанию. Чуть больше 100 КБ. | По умолчанию. Один запрос или одна вставка в чат. |
spintax-authoring |
Тот же метод, сжатый до двух страниц и написанный для модели, а не для читателя. | Агент умеет скиллы или контекст на вес золота. |
/docs/variables.md и ещё 19 |
Любая страница документации в чистом Markdown. Допишите .md к URL или отправьте Accept: text/markdown. |
Один узкий вопрос по ходу работы. |
https://spintax.net/mcp |
MCP-сервер: три инструмента, которые валидируют, рендерят и разбирают шаблон. | Хотите, чтобы модель проверила себя до того, как покажет результат. |
Рядом с authoring-скиллом лежат ещё два. spintax-syntax — про сами конструкции и ловушку в каждой. spintax-engines — про то, как поставить и вызвать движок из JavaScript, PHP или Python. Для написания шаблонов нужен первый.
Промпт
Вот промпт, которым пользуемся мы. Он предполагает, что модель умеет открывать ссылки; если ваша не умеет — вставьте llms-full.txt перед ним и удалите две строки про ссылку.
Ты превращаешь готовую статью в ОДИН spintax-шаблон.
Сначала прочитай синтаксис и правила написания:
https://spintax.net/llms-full.txt
Если не можешь открыть ссылку, скажи об этом, и я вставлю файл текстом.
Приоритеты, в этом порядке:
1. Каждый отрендеренный вариант грамматически правильный.
2. Каждый отрендеренный вариант читается как написанный человеком.
3. Разнообразие — в последнюю очередь. Различие, которого читатель
не заметит, не стоит ветвления.
Жёсткие правила:
- Никогда не ставь границу ветки внутри связанной грамматики:
подлежащее и сказуемое, предлог и его дополнение, существительное
и согласованное с ним прилагательное.
- Не повторяй фиксированный текст в обеих ветках. Ветви минимальный
кусок, который различается.
- Используй %VAR% для всего, что меняется от сайта к сайту
и от продукта к продукту.
- Используй #def, а не #set, когда две ссылки на одно значение
должны совпадать.
- Используй только тот синтаксис, что описан в правилах выше.
Не тащи конструкции из ICU, Handlebars или Jinja.
- Не выдумывай факты. Если в слот нужен факт, которого я тебе
не давал, сделай переменную.
Верни:
1. Шаблон одним блоком кода.
2. Переменные, которые ты завёл, с примером значения для каждой.
3. То, что не удалось выразить в spintax, и почему.
Вот статья:
[вставьте сюда свою статью]
Две вещи в нём сделаны намеренно.
Он ссылается на правила, а не пересказывает их. Синтаксиса в промпте нет, и быть не должно. Документация в одном запросе и всегда актуальна; копия, вставленная в промпт полгода назад, — нет.
Приоритеты идут раньше правил. Предоставленная сама себе, модель оптимизирует видимое разнообразие — потому что шаблон выглядит именно как инструмент для этого. Грамматику и читаемость нужно поставить выше явно, иначе получите по четыре варианта в каждом слоте и кашу на выходе.
Три способа это запустить
Окно чата
Работает с любой моделью с большим контекстом. Вставляете llms-full.txt, вставляете промпт, вставляете статью. Ядро документации — около 100 КБ: для нынешних моделей комфортно, но не бесплатно. Если сессия длинная, authoring-скилл стоит долю от этого объёма и покрывает тот же метод.
Валидации здесь не будет. Модели нечем запустить шаблон, поэтому относитесь к результату как к черновику и несите его в песочницу.
Агент, который умеет читать документацию
В Claude Code, Cursor или любом агенте с доступом в сеть покажите ему скилл и дайте подтягивать страницы по мере надобности:
Загрузи https://spintax.net/.well-known/agent-skills/spintax-authoring/SKILL.md
и следуй ему. Подтягивай гайды по ссылкам оттуда, когда нужны детали.
Все ссылки внутри скилла уже ведут на .md-зеркала, так что агенту не придётся парсить веб-страницу, чтобы прочитать нашу документацию.
MCP-сервер
Вот эта настройка стоит пяти лишних минут. https://spintax.net/mcp — живой MCP-сервер, без авторизации, три инструмента:
validate_spintax— диагностика с severity, стабильным кодом и строкой с колонкой (нумерация с 1). Нет ошибок — шаблон можно рендерить.render_spintax— до 20 вариантов, с seed для воспроизводимости и картой переменных для контекста.analyze_spintax— что шаблон требует и что содержит: используемые переменные, определения#setи#def, includes, счётчики конструкций.
В Claude Code — одна строка:
claude mcp add --transport http spintax https://spintax.net/mcp
В клиенте, который принимает конфиг-файл:
{
"mcpServers": {
"spintax": { "type": "http", "url": "https://spintax.net/mcp" }
}
}
После этого допишите в конец промпта:
У тебя подключён MCP-сервер spintax.net. Прежде чем что-то мне показать:
вызови validate_spintax и почини все диагностики с severity "error",
затем вызови render_spintax с count 5 и прочитай варианты сам.
Если вариант читается криво — правь шаблон и повтори.
Разница здесь не косметическая. Без инструментов первый шаблон, который вы видите, — это первая догадка модели, и ревью уходит на поиск незакрытых скобок. С инструментами незакрытые скобки модель уже нашла, а ревью уходит на то, хороший ли получился текст.
Ограничения, чтобы вы их закладывали заранее: 8 КБ шаблона на вызов, 20 вариантов на рендер, #include на сервере отключён. Большие документы собирайте из секций и валидируйте по частям. Полное описание сервера — в его server card.
Петля, которая ловит проблемы
Каким бы инструментом вы ни пользовались, проверка одна и та же — три шага, и пропускают обычно третий.
- Валидация. Структурные ошибки ищутся дёшево, и движок находит их за вас: песочница подчёркивает их прямо при вводе,
validate_spintaxвозвращает их данными. - Двадцать вариантов, а не один. У шаблона с шестью ветками сотни исходов. Один рендер не говорит почти ничего — и обычно это тот самый рендер, из-за которого вы одобрили сломанный шаблон.
- Прочитать их. Именно прочитать все двадцать. Проверьте каждое условие в обоих состояниях, каждую форму плюрала — включая числа, попадающие в редкую корзину (в русском: 1, 2, 5, 11, 21), и самый короткий с самым длинным исходом перестановки, где вылезают артефакты разделителей и пробелов.
Когда что-то читается криво, правьте шаблон, а не вариант, и рендерите двадцать заново. Модель может крутить эту петлю сама, если у неё есть MCP-инструменты — ради этого их и подключают.
Что модели делают не так
Это не случайные ошибки. Они повторяются от модели к модели, потому что растут из того, чему модель научилась в другом месте. Знание этого списка превращает расплывчатое «шаблон какой-то не такой» в двухминутную проверку.
Обратите внимание: почти ни одна из них не падает с ошибкой. Движок намеренно снисходителен — незнакомая конструкция теряет скобки и оседает в тексте обычной прозой. Шаблон проходит валидацию и рендерит криво. Ровно поэтому петля заканчивается чтением вариантов, а не зелёной галочкой.
1. Режет ветку по связанной грамматике
Самый частый сбой и единственный, который даёт текст не скучный, а неправильный. Подлежащее и сказуемое, предлог и его дополнение, существительное и согласованное прилагательное нельзя варьировать независимо.
{Наша платформа|Наши инструменты} {создана|созданы} для небольших команд.
→ четыре комбинации, две из них грамматически неверные
{Наша платформа создана|Наши инструменты созданы} для небольших команд.
→ две комбинации, обе правильные
Подробно: грамматически безопасная синонимизация.
2. Хватается за #set, когда ссылки должны совпадать
Значение #set — это макрос: оно перекатывается при каждой ссылке. Модели выбирают его по умолчанию, потому что он читается как присваивание в языке программирования.
#set %tool% = {Slack|Jira|Linear}
Подключите %tool% в один клик. %tool% синхронизируется в обе стороны.
→ «Подключите Slack в один клик. Linear синхронизируется в обе стороны.»
#def %tool% = {Slack|Jira|Linear}
Подключите %tool% в один клик. %tool% синхронизируется в обе стороны.
→ «Подключите Jira в один клик. Jira синхронизируется в обе стороны.»
Подробно: переменные и переиспользование между сайтами.
3. Пишет плюралы синтаксисом чужой библиотеки
Модели видели несравнимо больше ICU MessageFormat, чем spintax, и это заметно. Ещё они по умолчанию берут две формы, а это неверно для русского, украинского, белорусского и сербского.
Поддерживаем {count, plural, one {# язык} other {# языков}}.
→ «Поддерживаем count, plural, one # язык other # языков.»
Поддерживаем %n% {plural %n%: язык|языка|языков}.
→ «Поддерживаем 21 язык.» / «Поддерживаем 5 языков.»
Две половины этой ошибки ведут себя очень по-разному, и это стоит знать. Заимствованный ICU — тихий вариант: диагностики нет вообще, потому что группа в скобках без разделителя | легальна, движок снимает скобки и печатает то, что внутри. Неверное число форм — громкий вариант: русскому нужны три формы, и если модель дала две, validate_spintax вернёт ошибку plural.arity, а в выводе конструкция останется неразвёрнутой. Привычка одна, а ловится только половина.
Подробно: согласование с числом.
4. Выдумывает условие
Привычки Handlebars и Jinja дают блоки {if …}, которые движок печатает как обычный текст.
Доставляем по всему миру. {if %HasCrypto%}Принимаем и криптовалюту.{/if}
→ «Доставляем по всему миру. If 1Принимаем и криптовалюту. /if»
Доставляем по всему миру. {?HasCrypto?Принимаем и криптовалюту.}
→ «Доставляем по всему миру. Принимаем и криптовалюту.»
Первый рендер — это как выглядит утёкшая конструкция: скобки исчезли, переменная подставилась там, где её никто не ждал, а закрывающий тег стал словом.
Условие управляется значением. Когда выбор действительно произвольный, правильно {a|b}, а не условие.
Подробно: условный spintax.
5. Путает квадратные скобки с выбором
[a|b|c] перемешивает и склеивает все три элемента, разделяя их пробелом, если не настроено иначе. Он не выбирает один. Модель, которая имела в виду «выбери одно» и написала квадратные скобки, выдаёт предложение с тремя прилагательными там, где нужно было одно.
Попробуйте наш [быстрый|простой|доступный] инструмент.
→ «Попробуйте наш быстрый простой доступный инструмент.»
Попробуйте наш {быстрый|простой|доступный} инструмент.
→ «Попробуйте наш простой инструмент.»
Попробуйте наш [<minsize=2;maxsize=3;sep=", ";lastsep=" и ">быстрый|простой|доступный] инструмент.
→ «Попробуйте наш простой, доступный и быстрый инструмент.»
→ «Попробуйте наш простой и быстрый инструмент.»
Подробно: перестановки на практике.
6. Спинит каждое словосочетание
Без явных приоритетов модель считает целью плотность вариаций и ставит ветку в каждую фразу. Текст перестаёт звучать хоть как-нибудь.
{Наша|Эта} {платформа|система} {помогает|позволяет} {командам|группам}
выпускать {релизы|обновления} {быстрее|оперативнее|скорее}.
Значимые варианты — те, которые читатель заметит. Две ветки на своих местах в абзаце лучше двенадцати внутри одного предложения. Ради этого в промпте и стоит блок приоритетов.
7. Повторяет фиксированную часть в обеих ветках
Дублированный текст — приглашение к расхождению: следующая правка поменяет одну ветку и забудет вторую.
{Spintax (spin syntax) — это|Spintax, он же «spin syntax», — это} шаблонный язык.
→ «Spintax» и «это» продублированы в обеих ветках
Spintax {(spin syntax)|, он же «spin syntax»,} — это шаблонный язык.
→ фиксированные слова в одном экземпляре, ветвится только различие
Подробно: обратный порядок написания.
8. Кладёт внешние значения в контекст как есть
Значения переменных по умолчанию разметкоспособны: движок заново разбирает значение, в котором есть {, [ или %. Название товара из базы, строка от пользователя, заголовок со случайной скобкой — и шаблон отрендерит то, чего вы не писали. Недоверенные значения прогоняйте через neutralize() до того, как они попадут в контекст.
Подробно: переменные и переиспользование между сайтами.
9. Пишет один гигантский шаблон
Попросите целый лендинг — получите один неревьюабельный блок. Дальше экрана шаблон надо резать: item рендерит одну единицу, section собирает items, оркестратор собирает секции. Каждый кусок остаётся проверяемым отдельно, а лимит MCP-сервера в 8 КБ перестаёт быть лимитом.
Подробно: композиция шаблонов.
Перед тем как отгружать шаблон
- Двадцать вариантов отрендерены и правда прочитаны.
- Каждое условие увидено в обоих состояниях.
- Каждая форма плюрала увидена, включая редкую корзину.
- Нигде нет
#setтам, где две ссылки должны совпадать. - У каждой переменной из шаблона есть значение на момент рендера.
- Недоверенные значения нейтрализованы.
- Самый короткий и самый длинный исход перестановки одинаково корректны по пунктуации.
Сколько это стоит
Один шаблон — это один разговор с моделью, а весь последующий рендер бесплатный: движок работает локально, детерминированно, без API-вызова на каждый вариант. В этом весь экономический смысл такого процесса, и он разобран по моделям, с актуальными ценами, в статье сколько на самом деле стоит контент с ИИ.
Дальше — рендер
Полученный шаблон без изменений работает на любом движке семейства: @spintax/core в JavaScript, spintax/core в PHP, spintax-core в Python и WordPress-плагин. Один синтаксис, один результат, один общий корпус тестов. Выбрать движок — в обзоре четырёх движков.