aui-components
Components

MarkdownText

Markdown 渲染组件,支持 GFM、KaTeX 数学公式、代码高亮和复制

MarkdownText 基于 @assistant-ui/react-markdown 封装,为 AI 回复的 Markdown 内容提供丰富的渲染能力。

引入

import { MarkdownText } from "aui-components";

注意:MarkdownText 通常在 Thread 内部自动使用,你一般不需要手动引入它。只有在自定义消息渲染时才需要。

使用示例

import { MarkdownText } from "aui-components";

// 在自定义消息渲染中使用
<MessagePrimitive.Parts>
  {({ part }) => {
    if (part.type === "text") return <MarkdownText />;
    return null;
  }}
</MessagePrimitive.Parts>;

Props

该组件没有公开的 Props。

插件配置

MarkdownText 预配置了以下插件:

类型插件用途
remarkremark-gfmGitHub Flavored Markdown(表格、删除线、任务列表)
remarkremark-math数学公式语法支持
rehyperehype-katexKaTeX 数学公式渲染

预处理

preprocess={(text) =>
  escapeCurrencyDollars(normalizeMathDelimiters(text))
}
  • normalizeMathDelimiters — 将 \(...\) 和 \[...\] 转换为 $...$ 和 $$...$$
  • escapeCurrencyDollars — 转义文本中的美元符号,避免与数学公式分隔符冲突

自定义 Markdown 样式

MarkdownText 对 HTML 元素进行了完整的样式定制:

标题

// h1 — text-xl font-semibold
// h2 — text-lg font-semibold
// h3 — text-base font-semibold
// h4 — text-base font-medium
// h5 — text-sm font-semibold
// h6 — text-sm font-medium

代码

  • 行内代码:圆角背景、等宽字体、0.85em 字号
  • 代码块:带顶部标题栏的圆角容器

CodeHeader

每个代码块顶部都有一个标题栏,显示语言和复制按钮:

const CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {
  // language — 代码语言标签
  // code — 代码内容(用于复制)
  return (
    <div>
      <span>{language}</span>
      <TooltipIconButton tooltip="Copy" onClick={copy}>
        <CopyIcon /> {/* 或 <CheckIcon /> 复制成功后 */}
      </TooltipIconButton>
    </div>
  );
};

支持的 Markdown 元素

元素选择器样式说明
h1-h6aui-md-h[1-6]标题层级
paui-md-p段落,my-3 leading-relaxed
aaui-md-a链接,下划线和主题色
blockquoteaui-md-blockquote引用,左侧边框 + 灰色文字
ul/olaui-md-ul / aui-md-ol列表
table/tr/th/tdaui-md-table 等表格,border-separate
strongaui-md-strong加粗
codeaui-md-inline-code行内代码
preaui-md-pre代码块容器
hraui-md-hr分割线
supaui-md-sup上标

完整示例

// 自定义消息渲染,覆盖默认的 Markdown 插件
import { MarkdownTextPrimitive } from "@assistant-ui/react-markdown";

function CustomMarkdown() {
  return (
    <MarkdownTextPrimitive
      remarkPlugins={[remarkGfm]}
      // 不启用数学公式
      className="prose-sm"
      components={{
        h1: ({ children }) => (
          <h1 className="text-2xl font-bold text-blue-600">{children}</h1>
        ),
      }}
    />
  );
}

On this page