Repository navigation
Releases: monster1389/astrbot_plugin_md_render
Releases · monster1389/astrbot_plugin_md_render
Release list
v1.7.1
[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
[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
[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
[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
[1.3.7] - 2026-09-07
其他
- README 效果展示改为四张小图一行表并前置;配置按渲染/分段/清洗三分块整理,说明集中末尾,修正分段默认值(默认切分);关闭官方分段回复提示移至字体安装节前;文末补架构 mermaid 图与聊天效果大图。
- CLAUDE.md 同步三分块配置描述与模块结构图。
v1.3.6
[1.3.6] - 2026-09-07
其他
- metadata 描述改为单行、分号分隔(商店只显示一行),并新增「安装字体看README.md」。
- README 建议关闭 AstrBot 官方配置中的「分段发送」,避免对插件已切分的消息再次拆分。
1.3.5
[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
v1.2.2
重构
- 抽取
process_chain完整管线,main.py瘦身为接线适配器;送达逻辑迁入独立deliverseam。 - 元素渲染/文本配方集中为
ElementSpec单表,清洗改为结构直取,删除三处正则清洗函数。 - 渲染器改为经
renderers参数注入,测试从@patch全局魔法迁移为显式传 seam。 - 清理迁移垫片与无人引用的重导出。
本版本为纯内部重构,用户可见行为与 1.2.1 一致。
v1.2.1
修复
- 修复「渲染且保留原文」时消息拆分错乱。原先按类型粗暴切成「所有文本 / 所有媒体」,导致代码原文互相粘连、渲染图互相粘连,阅读顺序错乱。现在组内含媒体时逐组件独立成条,保持阅读顺序(正常文本 / 代码原文 / 渲染图 / 表格原文 / 表格图各自一条);纯文本组保持单条不拆;「渲染图像」的连续多图也不再合并。
- 字体下载增加 gh-proxy 镜像前置兜底,GitHub 直连失败自动回退。
改进
- 发送延时分级:图片/文件之间随机 1
3 秒,纯文本之间随机 0.31 秒,防风控的同时缩短整条回复的等待时间。