长文转图
在配置里写 "textImage": { "enabled": true } 即可开启,不需要浏览器:渲染用 Typst 编译器(@myriaddreamin/typst-ts-node-compiler)排版成 SVG,再由 @resvg/resvg-js 转 PNG。服务器需要系统中文字体(Debian/Ubuntu:sudo apt install fonts-noto-cjk),首次渲染会从 Typst 官方仓库下载并缓存固定版本的包(cmarker、mitex;用到函数图时还有 cetz、cetz-plot、plotsy-3d)。启动时先试渲染一次,失败只记 text_image_unavailable 并关闭该功能。
- 长度闸门:角色的最终文字超过
thresholdChars(默认 300 字)时不发送。同一轮里系统会告诉它“回复超过上限,没有发出”,让它用send_reply的text_image部分重发;多花一次模型调用,只重试一次。重试后仍输出超长文字(或渲染失败),这段文字按原样分条发送,不会丢。 text_image部分:send_reply的一种部分,参数是 Markdown(≤ 8000 字)和可选的短配文,可以和文字、语音、图片一起按顺序发出。角色也可以不等闸门,在内容含公式、表格、插图时主动使用。send_reply的每个text部分同样不得超过thresholdChars,超过时整条回复被拒绝、一条不发,角色改放进text_image。system prompt 会写明字数上限,让模型尽量一次到位。- 支持:标题、加粗、列表、引用、表格、代码块;LaTeX 公式
$…$(行内)与$$…$$(独立成行);公网图片(PNG/JPEG/GIF/WebP,每张 ≤ 4 MiB,最多 4 张)。 - 函数图:Markdown 里写一个语言为
plot的代码块,内容是 JSON。2D 如{"x":[-3,3],"y":[-2,2],"plots":[{"y":"sin(x)","label":"sin x"},{"implicit":"x^2+y^2=1"},{"x":"cos(t)","y":"sin(2t)","t":[0,6.28]},{"points":[[1,2],[2,3]]}]}:每项是关于 x 的函数、x/y 的隐函数方程、关于 t 的参数方程或散点;范围可省略(自动选取,隐函数会自动找曲线位置,没有关于 x 的函数时两轴等比例),tan、1/x这类间断点自动断开。3D 曲面如{"z":"sin(x)*cos(y)","x":[-3,3],"y":[-3,3]},范围须为整数。表达式只认数字、x/y/t、+ - * / ^、2x式省略乘号、pi、e和常用函数(sin cos tan asin acos atan sinh cosh tanh exp ln log sqrt cbrt abs floor ceil)。取样在 JS 里完成,交给 Typst 的只有数字和转义后的图例文字,模型写的表达式从不作为代码执行。作图用 Typst 包 cetz-plot(2D)与 plotsy-3d(3D),首次用到时下载。每张最多 3 个图,写错的图在原位显示原因,不影响其余内容。 - AI 插图:角色开启了画图(见画图)时,语言为
image的代码块写英文画面描述,渲染时会调用同一个画图模型新画一张嵌进图里(每张最多 2 张,每张约十几秒);失败或未开启画图时原位显示“图片无法生成”。 - 限制:图片只下载公网 http(s) 地址,不跟随重定向,私网、本机地址和本地路径一律不显示(原位显示“图片无法显示”);Markdown 里的原始 Typst、
<svg>、<a>等不会被执行。图片宽度固定(720 px,过高时自动降为 360 px 的 1 倍清晰度),高度超过 8000 px 或文件超过 9 MB 时渲染失败,该轮回退为文字。 - 入库内容:Discord 与 Telegram 里这条消息存的是配文(没写配文时取 Markdown 的第一行标题),不是全文,避免长文占满之后每一轮的上下文;角色自己的会话里仍保留调用时的完整 Markdown。
