Коротко. Content-negotiation — это механизм, при котором сервер отдаёт разный формат одной и той же страницы в зависимости от заголовка Accept. Для AI-агентов сайт может вернуть чистый markdown вместо тяжёлого HTML, когда запрос приходит с Accept: text/markdown или по URL вида /page.md. Это экономит токены модели и убирает «шум» из навигации, рекламы и скриптов.
Зачем AI-агентам markdown
Когда LLM или AI-краулер запрашивает обычную HTML-страницу, ему приходится продираться сквозь теги, инлайн-скрипты, стили и трекеры. Модель тратит токены и иногда путает структуру. Markdown — это семантически чистый текст: заголовки, списки, код и ссылки без визуального мусора.
- Меньше токенов — дешевле и быстрее обработка.
- Чище структура — модель точнее понимает иерархию контента.
- Лучше цитируемость — корректные пассажи проще извлечь и процитировать.
Content-negotiation не подменяет контент для людей и ботов по-разному ради манипуляции — это легитимная отдача одного и того же содержания в формате, удобном получателю. Текст идентичен, меняется только разметка.
Два способа отдачи markdown
На практике используют два совместимых подхода: заголовок Accept и явный URL с расширением .md.
Первый способ — через HTTP-заголовок. Агент сообщает, что предпочитает markdown:
curl -H "Accept: text/markdown" https://enterno.io/
Если сервер поддерживает negotiation, он вернёт markdown-представление главной страницы (например, содержимое llms.txt) вместо HTML.
Второй способ — суффикс .md на URL статьи:
curl https://enterno.io/articles/robots-txt-guide.md
Enterno.io отдаёт чистую markdown-версию каждой статьи по адресу /articles/<slug>.md, а на запрос GET / с Accept: text/markdown возвращает llms.txt. Оба механизма работают одновременно.
Как сервер выбирает формат
Логика проста: проверяем заголовок Accept или расширение URL, и если запрошен markdown — отдаём текстовое представление с правильным Content-Type.
# Псевдокод серверной логики
if request.path.endswith('.md'):
return serve_markdown(slug)
if 'text/markdown' in request.headers.get('Accept', ''):
return serve_markdown(current_page)
return serve_html(current_page)
Важно вернуть заголовок Content-Type: text/markdown; charset=utf-8, иначе клиент может интерпретировать ответ как plain text.
Таблица: форматы и их получатели
| Запрос | Ответ | Кому нужно |
|---|---|---|
| обычный браузер (Accept: text/html) | HTML | Люди |
| Accept: text/markdown | Markdown | AI-агенты |
| URL /page.md | Markdown | AI-агенты, разработчики |
| llms.txt | Карта контента | LLM |
Дополнительные сигналы для агентов
Markdown-отдачу хорошо дополняют другие AI-сигналы: .well-known/agent-card.json и MCP server card описывают возможности сайта, а Link:-заголовок на каждой странице может указывать на llms.txt и API документацию. Вместе это формирует полноценный «интерфейс для агентов».
Не отдавайте markdown только ботам, скрывая его от пользователей — это серая зона. Лучший вариант: один и тот же контент доступен и людям (HTML), и агентам (markdown) по предсказуемым правилам.
Как проверить
Отправьте curl с заголовком Accept: text/markdown и убедитесь, что вернулся markdown с верным Content-Type. Затем проверьте URL с суффиксом .md. Комплексно оценить поддержку content-negotiation, llms.txt и structured data поможет бесплатный инструмент AI-готовности.
Частые вопросы
Это не клоакинг?
Нет, пока контент идентичен. Клоакинг — это показ ботам контента, отличного от пользовательского, ради манипуляции выдачей. Content-negotiation отдаёт то же содержание в другом формате.
Нужен ли мне и .md, и заголовок Accept?
Достаточно одного, но оба вместе надёжнее: некоторые агенты предпочитают явный URL, другие — заголовок.
Влияет ли это на классический SEO?
Напрямую нет. Это про AI-поиск и цитируемость. Базовый технический SEO по-прежнему важен — см. чек-лист SEO-аудита.
Какой Content-Type использовать?
text/markdown; charset=utf-8. Это стандартный MIME-тип для markdown.
Связано ли это с llms.txt?
Да, это взаимодополняющие механизмы. llms.txt даёт карту контента, а content-negotiation — чистый формат конкретной страницы. См. гайд по llms.txt.