Skip to content

Releases: monster1389/astrbot_plugin_md_render

v1.7.1

Choose a tag to compare

@monster1389 monster1389 released this 24 Oct 17:31

[1.7.1] - 2026-10-25

变更

  • 去掉文泉驿兜底。不少镜像上 wqy-microhei.ttc 其实是 Noto 的副本,写死的 face 序号会指向日文/韩文比例体:中文变成日韩字形,不报错。现在字体只在「手动放置的 Sarasa → 系统 Noto → DejaVu」里选,Noto 缺失时直接退到 DejaVu(中文成方块),不再猜。

[1.7.0] - 2026-10-25

变更

  • 长代码行折行。代码块宽度上限 1080px,超宽行在 CSS 里折行,不再把图片横向拉长到看不清;字号 38px、行高 53px、内边距 27px 与上一版一致。
  • 表格超宽改为折行。列宽压缩 + flex 折行,不再把图片横向撑爆;表格正文改用比例中文字体(Noto Sans CJK SC / 文泉驿比例体),等宽体只留给代码块——窄屏下更像文档而不是终端截图。
  • 所有图片统一不透明深色底、128 色。渲染出口统一量化,透明底的公式图先合成主题底色(#1E1E1E)再发:QQ 对透明通道的处理不一致,插件出的图应当都是不透明底;体积回到 pillow 时代的水平。
  • 配置写错不再静默忽略。出现未知的「渲染」配置项、或某元素不支持的渲染模式时,插件启动直接报错并指出项名,不再猜一个值继续跑。现有配置项名未变,正常升级不受影响。

修复

  • 表格单元格里的公式不再割列。$|x|$、$|a-b|$ 这类含竖线的行内公式,竖线不再被当成表格列分隔符;解析前用单字符占位符遮住,公式外的 | 结构不变。

v1.6.2

Choose a tag to compare

@monster1389 monster1389 released this 18 Oct 15:09

[1.6.2] - 2026-10-18

修复

  • mermaid 并发渲染大面积 503。plan_chain 为每个块级元素起一个任务,一条回复里 17 张图会同时打向 mermaid.ink,实测 15 张收到 HTTP 503,重试又落在同一拥塞窗口里。改为进程内单通道串行:一次只发一个请求,跨会话共享;锁按事件循环惰性重建,插件重载或测试换 loop 不会绑死旧循环。
  • 单张超时 5s → 10s。实测轻图 p50 1.2s,60 节点流程图冷启 6.26s、40 节点 mindmap 稳定 3–4.2s(服务端无缓存),5s 会误杀重图。
  • 4xx 不再重试。语法错、源码 base64 超约 8KB(414)重试无意义;只有 5xx 重试一次(间隔 1s)——实测约 15% 的偶发 503 重发即 200。
  • 渲染失败不再把源码当文本刷屏。失败那张改发 .md 文件,交给客户端渲染;渲染且保留原文 模式仍回退原文,不夺走用户要看的文本。

变更

  • ElementSpec 增 self_budgeted:自带超时预算的渲染器(mermaid 走外部 HTTP)不再套 15s 通用保险丝,本机渲染器(pillow / typst)继续受它管。15s 原本就是按旧 mermaid 预算 5s×2+0.5s 倒推的余量,单张改 10s 后它会先砍断重试,变成含糊的「超时」。
  • 失败产物规则从「看当前模式是否含文件」改成「有没有原文可看」:渲染图像 模式下代码块、表格、mermaid 失败也出 .md;表达式不支持文件,仍回退原文。

v1.6.1

Choose a tag to compare

@monster1389 monster1389 released this 18 Oct 03:11

[1.6.1] - 2026-10-18

变更

  • 插件元数据声明支持 16 个平台适配器(metadata.yaml 的 support_platforms),不再只写 aiocqhttp。插件本身没有平台分支:拦截 OnDecoratingResultEvent,产出 Plain / Image / File 三类组件,能力边界由适配器的出口决定——图片类模式在全部内置适配器可用,故全部声明。
  • 未声明 wecom_ai_bot(企微智能机器人)和 weixin_official_account(公众号):这两个适配器只处理 At/Plain/Image/Record,丢弃 File 组件,.md 文件模式(渲染且md文件 / 仅md文件)会静默丢内容。
  • 未声明 vocechat / matrix:对应适配器是社区插件,出口能力未核对。
  • 删掉 main.py 的 @register(...) 装饰器(写的是 1.5.3)。Star.__init_subclass__ 在类定义时已经注册插件,装饰器只往那个条目里写 name/author/desc/version/repo,而加载时这几个字段全部被 metadata.yaml 覆盖(star_manager 注释:“yaml 文件的元数据优先”);它还额外抛一条 DeprecationWarning。删掉后元数据只有一处来源。

[1.6.0] - 2026-10-18

变更

  • 公式引擎由 pillowlatex 换成 Typst(typst + tylax)。aligned 的 & 对齐、矩阵、\text{中文}、\phantom 由排版引擎处理,不再用替换表把命令改成 Unicode 字符。
  • 转换层只补已知缺口:\hbar、\frac{1}{\rho}\oint 粘词、\&、\_、\nleq、\mathscr,以及表格里的 \wp/\Finv;其余转换或编译失败直接回退原文,不再静默剥命令。
  • 删除 normalize_latex 及其替换表;依赖体积增加约 79MB(typst wheel 35MB),公式字形改为 New Computer Modern。
  • render/font.py 新增 font_family / font_search_dir:系统字体交给 Typst,手动放置的 Sarasa 显式注册目录。

[1.5.4] - 2026-10-18

修复

  • 块级公式不再吞掉整段回复。此前 _pre_extract_block_math 用 $$(.+?)$$ 全局匹配:正文里只要出现一个被反引号包住的 $$,就会一路匹配到几段之后的 $$,把中间内容全塞进一张公式图,后面的公式块又因为分隔符被吃掉而降级成裸 LaTeX 文本。现在块级公式只认行首 $$(或同一行内成对),行内代码先遮蔽,找不到闭合就原样保留。
  • 行内代码里的 $...$ 不再被渲染。识别公式前先遮住反引号代码 span,代码内容原样交给清洗。
  • $\$9.99$ 这类带转义美元符的公式能识别了。闭合 $ 也要求前面不是反斜杠,内容允许 \$。
  • LaTeX 归一化:pillowlatex 只覆盖常用子集,\begin{aligned}、\dfrac、\mathcal、\bigoplus 这类没注册的写法会被逐字画成命令名。新增 normalize_latex:等价命令换写法、缺失符号换 Unicode 字符、\mathcal/\mathfrak/\mathbb/\mathscr 换 Unicode 数学字母;仍然不支持的命令记警告后剥掉,不把命令名画进图里。
  • 公式里的中文:给数学字体挂上中文回退 face,\text{中文} 不再显示为方块。
  • 表格格内公式:$...$ 现在渲染成小图嵌入单元格,不再把 $\alpha\ \beta$ 源码画进表格。表格与清洗的文本/文件产物不受影响。

[1.5.3] - 2026-10-18

变更

  • 日志统一改用 from astrbot.api import logger,不再用标准库 logging.getLogger(__name__)(插件市场审核要求)。table_render / html_render 原本没打过日志,未使用的 logger 直接删除。
  • render_mermaid 改为原生异步(httpx.AsyncClient + asyncio.sleep),不再占线程池线程;build_chain 识别协程渲染器直接 await,同步渲染器仍走 asyncio.to_thread。

v1.5.2

Choose a tag to compare

@monster1389 monster1389 released this 17 Oct 16:50

[1.5.2] - 2026-10-18

变更

  • skills/show-me 的 description 改为强制语气:删掉英文触发词清单,改成 You MUST use this skill whenever… 的类别式条件,覆盖面按 system / paper / protocol / algorithm / API / data model 列举。
  • 明确「用户用中文提问时,英文描述同样适用」,堵住「描述是英文所以中文请求不算匹配」这条推理;末句把只用散文回答定义为该 skill 的失败。
  • 只改系统提示里那一行路由文本,SKILL.md 正文未变。

注意

  • description 里出现 : 会被 YAML 当作映射键,_parse_frontmatter_description 静默返回空串,技能描述直接变成 No description。这行必须避开冒号,或整体加引号。

[1.5.1] - 2026-10-17

变更

  • 渲染与发送流水线化:process_chain 拆成 plan_chain(解析、分组、一次性提交全部渲染任务)+ Pipeline(按序逐条产出 Message),deliver 改为消费流水线、每条就绪即发。首条消息不再等最慢的元素渲染完成——实测一条多元素回复的首屏延迟从约 2.7 秒降到首条产出即发(该条本身为纯文本时约 0.1 秒)。
  • 流水线严格保序:慢的组挡住它后面的消息,绝不越过;末条由 Pipeline 的 is_tail 标记,交付语义不变(仍留作 result.chain)。
  • 防风控延时与渲染重叠:两条消息的间隔按上一条实际发出时刻起算,渲染耗时已消耗的部分不再叠加,不足下限才补。
  • 单个元素的渲染加 15 秒保险丝(_RENDER_TIMEOUT),超时走既有失败降级(该模式含 md 文件仍写文件,否则回退原文),最坏停顿有界。
  • 已渲染 N 项 汇总日志改为流水线跑完后输出;逐条发送日志不再带总条数(流式送出,条数在首条发出时未知)。

文档

  • README 按使用顺序重排:定位、效果图、启用、默认行为、配置、常见问题、字体、架构。补「启用」章节,把原先藏在提示块里的两个 AstrBot 开关并进安装步骤;字体教程移到 docs/fonts.md;渲染效果合成一张横排总览图 docs/demo/overview.png,聊天截图裁为纵条并配两栏版面,均由 docs/demo/make_overview.py 生成。
  • _conf_schema.json 的 hint 改为陈述句:去掉补充性括号与解释性从句,与 README 用同一套笔法。

[1.5.0] - 2026-10-17

新增

  • 根级配置「仅处理模型回复」(默认关):开启后只处理 LLM / Agent 回复(result.is_model_result()),其它插件与内置命令的普通消息原样放过。

变更

  • 字体不再依赖手动安装:render/font.py 的发现结果由路径升级为 FontSpec(path, index),按「data_dir/fonts/SarasaMonoSC-Regular.ttf → 系统 Noto Sans Mono CJK SC(NotoSansCJK-Regular.ttc 第 7 个 face,AstrBot 官方镜像自带)→ 文泉驿等宽(第 1 个 face)→ DejaVu Sans Mono」取第一个存在的。ttc 必须指定 face:第 0 个是比例字体,直接按路径取会让代码列对齐歪掉。
  • 代码块渲染改用 ImageFormatter 子类注入 face index(_FaceFormatter / _FaceFontManager),不新增依赖。
  • README:手动安装 Sarasa 由「必读」降为「可选、观感更佳」,补字体发现顺序表;配置章节补根级开关;补流式输出相关说明。
  • skills/show-me/SKILL.md 说明改为全英文,frontmatter 描述保留中文触发词。

修复

  • 流式输出开启且平台不支持流式(默认策略「实时分段回复」)时,跳过 STREAMING_FINISH 结果。此前该结果仍会触发渲染并经 deliver 把非末条消息再次发出,造成内容重复,而末条又被 RespondStage 丢弃。

[1.4.0] - 2026-10-17

新增

  • HTML 文档渲染:```html 围栏且含 <!DOCTYPE/<html> 时,用 pytakumi(Rust 布局引擎,无浏览器)渲染为 PNG;抽取 <style> 经 stylesheets 传入,注册 Noto Sans CJK / 文泉驿 / 插件字体。新增配置「HTML」与「HTML 宽度」(默认 1000)。
  • Mermaid 图表渲染:```mermaid 经 mermaid.ink 渲染为暗底 PNG(bgColor=1E1E1E),5 秒超时、5xx 重试一次,失败回退源码文本。配置对齐代码/表格的五种模式,仅md文件 交给 QQ 原生渲染。新增配置「Mermaid」,需联网(仅图片模式)。
  • 插件内置技能:skills/show-me/SKILL.md,改写为可被模型主动触发,第 7 种表达改为输出 ```html 文档而非写文件。

修复

  • 未知语言的代码块不再 guess_lexer(会把 mermaid 认成 ECLLexer、调用树认成 ScdocLexer),改为 TextLexer 纯文本渲染。
  • 渲染且md文件 模式下图渲染失败时,不再连 .md 一起丢掉:仍写文件,不回退原文。
  • 临时文件命名白名单补上 html/mermaid 前缀,否则新渲染器产出的文件不会被发送后删除,也不会被 TTL 清扫。

其他

  • 依赖新增 pytakumi>=0.1.5;README/CLAUDE/架构图同步。

v1.3.7

Choose a tag to compare

@monster1389 monster1389 released this 07 Sep 15:49

[1.3.7] - 2026-09-07

其他

  • README 效果展示改为四张小图一行表并前置;配置按渲染/分段/清洗三分块整理,说明集中末尾,修正分段默认值(默认切分);关闭官方分段回复提示移至字体安装节前;文末补架构 mermaid 图与聊天效果大图。
  • CLAUDE.md 同步三分块配置描述与模块结构图。

v1.3.6

Choose a tag to compare

@monster1389 monster1389 released this 07 Sep 15:26

[1.3.6] - 2026-09-07

其他

  • metadata 描述改为单行、分号分隔(商店只显示一行),并新增「安装字体看README.md」。
  • README 建议关闭 AstrBot 官方配置中的「分段发送」,避免对插件已切分的消息再次拆分。

1.3.5

Choose a tag to compare

@monster1389 monster1389 released this 07 Sep 15:13

[1.3.5] - 2026-09-07

移除

  • 移除启动时自动下载并解压「更纱等宽黑体」的逻辑及 py7zr 依赖(通过安全审查:不再于运行时下载外部 7z 压缩包并解包)。字体改为手动安装:下载 SarasaMonoSC-Regular.ttf 放入 <AstrBot 数据目录>/plugin_data/astrbot_plugin_md_render/fonts/,README 顶部附完整下载/解压/放置/重启命令,安装后重启 AstrBot 生效。

其他

  • typing.Callable 迁移到 collections.abc,全量清理 import 排序,容器内 ruff 0.15.22 零告警。
  • CLAUDE.md 开发环境由宿主机 .venv 改为容器内 docker exec 执行;README/metadata 改为手动安装字体指引。

1.3.4

Choose a tag to compare

@monster1389 monster1389 released this 21 Aug 01:21

Full Changelog: v1.2.2...v1.3.4

v1.2.2

Choose a tag to compare

@monster1389 monster1389 released this 16 Aug 07:19

重构

  • 抽取 process_chain 完整管线,main.py 瘦身为接线适配器;送达逻辑迁入独立 deliver seam。
  • 元素渲染/文本配方集中为 ElementSpec 单表,清洗改为结构直取,删除三处正则清洗函数。
  • 渲染器改为经 renderers 参数注入,测试从 @patch 全局魔法迁移为显式传 seam。
  • 清理迁移垫片与无人引用的重导出。

本版本为纯内部重构,用户可见行为与 1.2.1 一致。

v1.2.1

Choose a tag to compare

@monster1389 monster1389 released this 16 Aug 04:42

修复

  • 修复「渲染且保留原文」时消息拆分错乱。原先按类型粗暴切成「所有文本 / 所有媒体」,导致代码原文互相粘连、渲染图互相粘连,阅读顺序错乱。现在组内含媒体时逐组件独立成条,保持阅读顺序(正常文本 / 代码原文 / 渲染图 / 表格原文 / 表格图各自一条);纯文本组保持单条不拆;「渲染图像」的连续多图也不再合并。
  • 字体下载增加 gh-proxy 镜像前置兜底,GitHub 直连失败自动回退。

改进

  • 发送延时分级:图片/文件之间随机 13 秒,纯文本之间随机 0.31 秒,防风控的同时缩短整条回复的等待时间。