New npm package for automatic recovery of broken streaming markdown
Remend 是一个新的独立包,它将智能的不完整 Markdown 处理能力带给了任何应用程序。
它最初是 Streamdown 的 Markdown 终止逻辑的一部分,现在 Remend 已作为一个独立的库 (npm i remend) 发布,您可以在任何应用程序中使用。
为什么它很重要
AI 模型以逐个令牌(token-by-token)的方式流式输出 Markdown,这常常会产生不完整的语法,从而导致渲染失败。例如:
- 未闭合的代码块(fences)
- 未完成的粗体/斜体标记
- 未终止的链接或列表
如果不进行纠正,这些模式会导致渲染失败、泄露原始 Markdown 或破坏布局:
1
2
3
|
1**This is bold text
2[Click here](https://exampl
3`const foo = "bar
|
Remend 能够自动检测并补全未终止的 Markdown 块,确保在流式传输过程中输出干净、稳定的内容。
1
2
3
4
5
6
|
1import remend from "remend";
2
3const partialMarkdown = "This is **bold text";
4const completed = remend(partialMarkdown);
5
6// 结果: "This is **bold text**"
|
随着流式传输的继续以及实际的结束标记到达,内容会无缝更新,即使用户正处于流式传输的中间阶段,也能获得流畅的体验。
它可以作为预处理步骤与任何 Markdown 渲染器配合使用。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
1import remend from "remend";
2import { unified } from "unified";
3import remarkParse from "remark-parse";
4import remarkRehype from "remark-rehype";
5import rehypeStringify from "rehype-stringify";
6
7const streamedMarkdown = "This is **incomplete bold";
8
9// 首先运行 Remend 以补全不完整的语法
10const completedMarkdown = remend(streamedMarkdown);
11
12// 然后使用 unified 进行处理
13const file = await unified()
14 .use(remarkParse)
15 .use(remarkRehype)
16 .use(rehypeStringify)
17 .process(completedMarkdown);
18
19console.log(String(file));
|
Remend 为 Streamdown 中的 Markdown 渲染提供支持,并已在生产环境的 AI 应用程序中经过实战测试。它包含智能规则以避免误判,并能处理复杂的边缘情况,例如:
- LaTeX 块中带有下划线的数学表达式
- 带有星号/下划线的产品代码和变量名
- 带有格式标记的列表项
- 链接中嵌套的括号
要开始使用,您可以通过 Streamdown 来使用它,或者使用以下命令单独安装: