理解 MDAN
这页只讲 MDAN 最核心的工作方式,不讲具体接入细节。
关键点
1. 页面源
一个 MDAN 页面通常包含:
- frontmatter
- Markdown 正文
- 一个可执行的
mdan代码块
也就是说,一页内容和这页里的交互,放在同一个地方定义。
2. Block
BLOCK 是页面里可以单独更新的一块内容。
它通过 mdan:block <name> 这样的锚点插回正文。
运行时如果这块内容发生变化,系统只需要更新这一个 block,不需要把整页重新返回一遍。
3. 片段更新
一次成功的读取或写入,通常不会返回整页,而是返回当前 block 的 Markdown 片段。
这个片段里通常不只是刷新后的内容,也会继续带着下一步可执行的操作。
所以对 Agent 来说,返回值不是“只看一眼的结果”,而是下一步继续交互的工作面。
Agent 和浏览器分别怎么用
MDAN 同时支持 Agent 和浏览器,但它们使用的是同一个应用。
Agent
Agent 先读取完整页面 Markdown,理解当前内容和可执行的操作。
执行某个 target 之后,服务端返回的 Markdown 片段通常会同时提供两类信息:
- 当前这一步更新后的内容
- 下一步还能继续执行什么操作,或应该如何继续
也就是说,服务端不是只把“结果”返回给 Agent,而是在持续提供下一步可读、可执行的交互上下文。
浏览器
浏览器访问同一个应用时,请求的是 HTML。页面加载后,浏览器运行时再接管后续交互,并按需要更新 block 或页面状态。
为什么这套模型重要
- 内容和交互放在同一份页面源里
- Agent 不需要额外依赖一套单独的 JSON 接口
- 浏览器不需要为同一个应用再重建一套交互定义
- 服务端可以通过 Markdown 片段持续驱动 Agent 往下完成交互
- 大多数更新只需要返回局部片段,而不是整页