Agent 支持
HTML 页面里有侧栏、脚本与样式,模型读它要先剥掉这层外壳。OINK 让同一份内容再产出一份纯 Markdown:每页一个 .md,站点根目录一份 llms.txt 索引,页面上一个「复制 Markdown 文本」按钮。三者都是构建期产物,没有运行时服务,也不需要内容协商。
这三件事都要站点自己在 outputs 里声明,主题不替站点打开。
每页一份 .md
markdown 是 Hugo 的内置输出格式。把它加进需要的页面类型:
这是本站的配置。outputs 的每个键是 整体替换 而不是合并:加 markdown 时要把该类型原本有的格式(RSS、print)一起写全,漏一个就丢一种输出。
URL 规律是在页面 URL 后面接 index.md:
| 页面 | Markdown |
|---|---|
/zh/docs/customize/agents/ |
/zh/docs/customize/agents/index.md |
/zh/docs/customize/(栏目首页) |
/zh/docs/customize/index.md |
/zh/(站点首页) |
/zh/index.md |
每个 HTML 页的 <head> 里同时有一条发现用的链接,抓取工具不必推断 URL:
.md 的内容
不是把渲染好的 HTML 转回 Markdown,而是 你写的源码:front matter 换成一个 H1 标题加一段引用式摘要,其后是正文原文,shortcode 就地展开成各自的 Markdown 形态。
原生 Markdown 形态的组件(提示块、表格、参数表、图片属性行、代码围栏、数据围栏)在 .md 里原样保留源码,模型读到的与你写下的是同一份内容。栏目首页在正文之后还会附一份 Section pages: 子页链接清单。
shortcode 形态各有确定的降级:徽章变成强调文本或链接,按键变成 Ctrl + K,标签页变成一段段 **标签名** 小节,参数表变成条目列表。每个组件页的「输出形态」小节写了它自己那一行。
站点没有开 LLMS 输出时,上面那条 LLMS index: 不会出现:主题不指向未发布的文件。
llms.txt
llms.txt 是站点根目录的一份纯文本清单,告诉模型「这个站有什么、机器可读版本在哪」。给 首页 加上 LLMS 输出格式即可生成:
多语言站点每种语言各一份:/llms.txt 与 /zh/llms.txt。内容是自动生成的站点索引:
三段的来源:Site index 是本语言首页加站点主菜单(menus.main,条目有 Markdown 版就链 Markdown 版,带 description 的顺带写上);Documentation index 是 docs 栏目的子栏目及其下一层页面,缩进表示层级,每行附上该页的 description;Site locales 是站点配置里的全部语言。指向站外的菜单条目(GitHub、issue 跟踪器)会被剔除:它们属于导航外壳,不是本站内容。
改进 llms.txt 的入手处是主菜单与各栏目首页的 description,不是这个模板。
页面上的 Agent 动作
面包屑行右侧的操作菜单里,跟 Agent 有关的是四条:
| 条目 | 做什么 | 出现条件 |
|---|---|---|
| 复制 Markdown 文本 | 抓取本页 .md 写进剪贴板(悬停时预取,点击后无明显等待) |
本页有 markdown 输出 |
| 查阅 Markdown 源码 | 新标签页打开 .md |
本页有 markdown 输出 |
| 在 ChatGPT 中打开 | 带一句提示词跳转到 ChatGPT | assistant_links: true |
| 在 Claude 中打开 | 同上,跳转到 Claude | assistant_links: true |
前两条只要开了 markdown 输出就存在。「复制」是拆分按钮的左半边(剪贴板图标),复制成功后短暂显示一个对勾。
后两条默认关闭,要显式打开:
打开之后的边界:读者点击时,运行时用浏览器地址栏里的完整 URL(含真实域名、查询串与锚点)拼一句提示词,中文站是「请阅读
页面可以收紧站点策略,不能反向打开:front matter 里 page_context_menu: { assistant_links: false } 关掉本页的助手链接;站点没开时页面写 true 不会生效。整个菜单按页关闭用 page_context_menu: false,见页面参数。
命令面板里也能搜到这两条助手动作(用的是同一份动作清单),见命令面板。
按页面退出 .md 输出
在页面 front matter 里重写 outputs。它同样是整体替换,只写要保留的格式:
要保留 RSS、只去掉 Markdown,就把其它格式列全:
自定义输出
主题用 layouts/all.md 渲染 Markdown 输出,用 layouts/index.llms.txt 生成 llms.txt。站点在自己的 layouts/ 下放同名文件即可整体替换,但 先考虑更窄的做法:
- 按内容类型:
layouts/blog/single.md、layouts/docs/list.md这样带类型的路径只影响那一类内容,主题的打印模板即按此分化(layouts/blog/single.print.html)。查模板查找顺序确认你的组合。 - 按 shortcode:站点自己的 shortcode 可以加输出格式专属模板,让它在 Markdown 输出里给出更适合机器读的形式。
- 按页面:少数高价值页面手写内容,成本低于改模板。
llms.txt 的内容由站点结构决定,改模板之前先确认问题不在主菜单或 description。
验证
线上或本地预览用 curl:
再检查三处:
- 任一页 HTML 的
<head>里有rel="alternate" type="text/markdown"; - 面包屑行右侧的复制按钮点击后粘贴,得到的是 Markdown 而不是 HTML;
llms.txt里没有指向站外的链接。
限制
- 主题产出的机器可读表面只有两样:每页
.md与llms.txt。没有nav.json,也没有别的结构化目录接口;站点地图仍是 Hugo 自己的sitemap.xml。 LLMS输出格式声明为非替代格式,所以llms.txt不会出现在<head>的alternate链接里,也没有对应的页面操作;它靠约定俗成的根路径被发现。- 服务端内容协商(同一个 URL 按
Accept: text/markdown返回 Markdown)不属于主题范围,要做在托管层。 - Markdown 输出走 源码 路径:只在浏览器端由 JavaScript 生成的内容(运行时绘制的图表)在
.md里是围栏源码,不是图。
相关
- 打印支持 — 另一种非 HTML 输出
- 命令面板 — 助手动作的另一个入口
- 页面参数 —
outputs/assistant_links/page_context_menu - 导航与菜单 —
llms.txt的站点索引来自主菜单 - 配置总览 —
outputs与params.ui.page_context_menu.*的完整定义