Skip to content

长文转图 ​

在配置里写 "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 公式 $…$(行内)与 $$…$$(独立成行);![说明](https://…) 公网图片(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。

BSD 2-Clause 许可