From 1303a1e32340b49b943e8cd994757590f05f49ff Mon Sep 17 00:00:00 2001 From: Rich Haines Date: Thu, 2 Apr 2026 14:07:08 +0300 Subject: [PATCH 1/2] Add @vercel/agent-readability dependency --- apps/website/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/website/package.json b/apps/website/package.json index 8a5a28a0..24d471f2 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -17,6 +17,7 @@ "@streamdown/code": "workspace:*", "@streamdown/math": "workspace:*", "@streamdown/mermaid": "workspace:*", + "@vercel/agent-readability": "^0.2.1", "@vercel/analytics": "^1.6.1", "@vercel/speed-insights": "^1.3.1", "ai": "^5.0.106", @@ -65,4 +66,4 @@ "tw-animate-css": "^1.4.0", "typescript": "^5.9.3" } -} +} \ No newline at end of file From c6902180466568b686ebb96e3f90279540ee2eeb Mon Sep 17 00:00:00 2001 From: Rich Haines Date: Thu, 2 Apr 2026 14:07:09 +0300 Subject: [PATCH 2/2] Add AI agent detection via @vercel/agent-readability --- apps/website/proxy.ts | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/apps/website/proxy.ts b/apps/website/proxy.ts index baafb833..b73293c1 100644 --- a/apps/website/proxy.ts +++ b/apps/website/proxy.ts @@ -7,6 +7,7 @@ import { } from "next/server"; import { i18n } from "@/lib/geistdocs/i18n"; import { trackMdRequest } from "@/lib/geistdocs/md-tracking"; +import { generateNotFoundMarkdown, isAIAgent } from "@vercel/agent-readability"; const { rewrite: rewriteLLM } = rewritePath( "/docs/*path", @@ -57,6 +58,39 @@ const proxy = (request: NextRequest, context: NextFetchEvent) => { } } + // AI agent detection — rewrite docs pages to markdown for agents + if ( + (pathname === "/docs" || pathname.startsWith("/docs/")) && + !pathname.includes("/llms.mdx/") + ) { + const agentResult = isAIAgent(request); + if (agentResult.detected && !isMarkdownPreferred(request)) { + const result = + pathname === "/docs" + ? `/${i18n.defaultLanguage}/llms.mdx` + : rewriteLLM(pathname); + + if (result) { + context.waitUntil( + trackMdRequest({ + path: pathname, + userAgent: request.headers.get("user-agent"), + referer: request.headers.get("referer"), + acceptHeader: request.headers.get("accept"), + requestType: "agent-rewrite", + detectionMethod: agentResult.method, + }) + ); + return NextResponse.rewrite(new URL(result, request.nextUrl)); + } + // Agent requested a non-existent docs URL + return new NextResponse(generateNotFoundMarkdown(pathname), { + headers: { "Content-Type": "text/markdown; charset=utf-8" }, + }); + } + } + + // Handle Accept header content negotiation and track the request if (isMarkdownPreferred(request)) { const result = rewriteLLM(pathname);