TL;DR: Content negotiation позволяет серверу возвращать разные форматы контента в зависимости от предпочтений клиента. Это особенно полезно для агентов, которые предпочитают markdown вместо HTML, что значительно уменьшает размер данных и улучшает производительность.
Введение: контекст и актуальность
В эпоху, когда большую часть веб-трафика составляют не только люди, но и различные агенты (боты, скрипты, AI-ассистенты), важно адаптировать контент под их нужды. Агенты не нуждаются в CSS, клиентском JavaScript или изображениях — им важна чистая, структурированная информация.
Content negotiation — механизм HTTP, который позволяет серверу возвращать разные форматы одного и того же контента в зависимости от предпочтений клиента. Это решает проблему дублирования контента и упрощает поддержку нескольких форматов.
Основная часть: как это работает
HTTP заголовок Accept
Агенты используют HTTP заголовок Accept, чтобы указать, какие форматы они предпочитают. Например, Claude Code отправляет следующий заголовок:
Accept: text/markdown, text/html, */*
Здесь text/markdown указан первым, что сигнализирует о предпочтении markdown перед HTML.
Пример запроса с использованием curl
Проверить работу content negotiation можно с помощью команды curl:
curl https://vercel.com/blog/self-driving-infrastructure -H "accept: text/markdown"
Сервер вернет контент в формате markdown, если он доступен.
Middleware и Next.js
На стороне сервера middleware анализирует заголовок Accept и маршрутизирует запросы в зависимости от предпочтений клиента. В случае с Next.js, запросы, предпочитающие markdown, направляются в специальный route handler, который преобразует rich-text контент из Contentful в markdown.
Пример middleware на Next.js:
import { NextResponse } from 'next/server';
export function middleware(request) {
const acceptHeader = request.headers.get('accept');
if (acceptHeader.includes('text/markdown')) {
return NextResponse.rewrite(new URL('/api/markdown', request.url));
}
return NextResponse.next();
}
Преобразование контента
Преобразование в markdown сохраняет структуру контента:
- Код блоки сохраняют свои маркеры синтаксиса.
- Заголовки сохраняют свою иерархию.
- Ссылки остаются функциональными.
Практическое применение
Уменьшение размера данных
Типичная статья в HTML формате может весить около 500KB, включая HTML, CSS и JavaScript. В формате markdown тот же контент занимает всего 2KB — это уменьшение размера на 99.6%.
Для агентов, работающих с ограничениями по токенам, это означает возможность обрабатывать больше контента за один запрос и тратить ресурсы на полезную информацию вместо разметки.
Синхронизация контента
Синхронизация между HTML и markdown версиями осуществляется через Next.js 16 remote cache и общие slugs. Когда контент обновляется в Contentful, обе версии автоматически обновляются.
Sitemap для агентов
Для облегчения обнаружения контента реализован sitemap в формате markdown, который содержит метаданные о каждой статье, включая даты публикации, типы контента и ссылки на HTML и markdown версии.
Пример sitemap:
# Sitemap
## Blog Posts
- [Self-Driving Infrastructure](/blog/self-driving-infrastructure.md) - 2023-10-01
- [Content Negotiation](/blog/content-negotiation.md) - 2023-09-25
## Changelogs
- [Version 1.0](/changelog/1.0.md) - 2023-09-20
Заключение
Content negotiation — мощный инструмент для оптимизации веб-страниц для агентов. Использование markdown вместо HTML позволяет значительно уменьшить размер данных и улучшить производительность. Это особенно важно в условиях ограничений по токенам и для ускорения обработки запросов.
Реализация через Next.js и middleware делает процесс гибким и легко поддерживаемым, а синхронизация контента через remote cache обеспечивает актуальность данных.
Теперь вы можете адаптировать свои страницы для агентов, не жертвуя удобством для человеческих читателей.
Источник: https://vercel.com/blog/making-agent-friendly-pages-with-content-negotiation