Making agent-friendly pages with content negotiation

#content negotiation#markdown#HTTP headers#Next.js

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