## (还)没有官方约定

Next.js 为 `robots.txt` 和 `sitemap.xml` 提供了元数据文件约定 —— 从 `app/robots.ts` 导出一个函数,框架就会提供文件。**llms.txt 没有这样的约定**(有一个开放的功能请求: vercel/next.js 讨论 #80692),所以要自己接线。两种模式,都很简单:

## 模式 1: 静态文件

把 `llms.txt` 放进 `public/`。Next.js 会把那里的任何东西挂到根路径,所以 `public/llms.txt` → `yoursite.com/llms.txt`。完成。

关键页面很少变化时,这是正确选择。风险是漂移: 文件说的是你的网站*曾经*是什么。

## 模式 2: route handler

对于会变的内容 —— 文档、产品、文章 —— 从与页面相同的事实来源生成文件:

```
// app/llms.txt/route.ts
import { getDocs } from '@/lib/content';

export async function GET() {
  const docs = await getDocs();
  const body = [
    '# Acme',
    '',
    '> Acme 是面向开发者的 widget API。',
    '',
    '## 文档',
    ...docs.map(d => `- [${d.title}](/docs/${d.slug}): ${d.summary}`),
    '',
    '## 机器可读表面',
    '- [OpenAPI 规范](/openapi.json): 完整 API schema',
  ].join('\n');
  return new Response(body, {
    headers: { 'Content-Type': 'text/plain; charset=utf-8' },
  });
}
```

如果内容源开销大,加上 `export const revalidate = 3600`。想要全文伴生文件,同样的模式也能提供 [llms-full.txt](/kb/llms-full-txt)。

## 该包含什么

精选胜过完整: 网站是什么(一个 blockquote)、智能体该从哪十几个页面开始(带单行摘要),以及指向机器表面的交叉引用 —— [OpenAPI 规范](/kb/openapi)和任何 [MCP 端点](/kb/mcp)是文件中最有价值的行。完整格式指南: [llms.txt 指南](/kb/llms-txt)。

## 验证

对你的部署运行 [llms.txt 验证器](/tools/llms-txt-validator) —— 存在性、可解析性、可导航结构 —— 或者[扫描网站](/)获取完整的智能体就绪图景。

## 常见问题

### Next.js 有像 robots.ts 那样的 llms.ts 元数据约定吗？

没有。元数据文件约定覆盖 robots.txt、sitemap.xml、图标和 OG 图片 —— 不包括 llms.txt。功能请求仍开放;在那之前,用 public/llms.txt 或 route handler。

### route handler 需要设置特殊的 Content-Type 吗？

以 UTF-8 的 text/plain(或 text/markdown)提供。智能体从正文解析 markdown 结构;重要的是路由直接以 200 返回内容。

### 静态文件还是 route handler？

关键页面稳定就用静态。文件里列了任何会变的东西就用 route handler —— 这是文档与快照的区别。

## 相关

- [llms.txt —— 完整指南](/kb/llms-txt)
- [llms-full.txt](/kb/llms-full-txt)
- [Shopify 的 llms.txt](/kb/llms-txt-for-shopify) · [WordPress 的 llms.txt](/kb/llms-txt-for-wordpress)
