渲染 API

July 26, 2026 · View on GitHub

通用渲染函数

所有函数返回类型化产物,只接受跨 Provider 可移植的参数。

函数对应 request返回
render_htmlRenderHtmlRequestRenderedImage
render_textRenderTextRequestRenderedImage
render_markdownRenderMarkdownRequestRenderedImage
render_templateRenderTemplateRequestRenderedImage
render_template_htmlRenderTemplateHtmlRequestRenderedHtml
rasterize_htmlRasterizeHtmlRequestRenderedImage
from nonebot_plugin_htmlrender import ResourcePolicy, render_html

image = await render_html(
    "<main>Hello</main>",
    width=800,
    height=480,
    device_pixel_ratio=2,
    image_format="png",
    resource_policy=ResourcePolicy.STRICT,
    timeout_seconds=15,
)
payload = bytes(image)
content_type = image.media_type

RasterOptions.formatRenderedImage.format 使用公共 RasterImageFormat"png" | "jpeg")。quality 只能与 JPEG 一起使用。timeout_seconds 必须是有限正数,并覆盖完整操作。

Request 与 Renderer

from nonebot_plugin_htmlrender import (
    RasterOptions,
    RenderHtmlRequest,
    get_default_application,
)

request = RenderHtmlRequest(
    html="<h1>Hello</h1>",
    raster=RasterOptions(width=640, format="png"),
    timeout_seconds=10,
)
artifact = await get_default_application().renderer.render_html(request)

Renderer.supported_commands 是已绑定通用用例的名称集合;Renderer.supports("render_html") 可用于功能探测。只需要 facade 时可调用get_default_renderer(),它不会建立第二个 composition。

类型化产物

RenderedImage 提供 dataformatwidthheightmedia_typebytes(artifact)。格式与尺寸来自后端实际编码数据;尺寸是最终图片的物理像素,不是请求中的 CSS viewport。RenderedHtml 提供 contentstr(artifact)

稳定执行错误

错误含义
InvalidRenderRequestrequest 在执行前已确定无效
PreparationError模板编译或中立内容准备失败
CapabilityUnavailablecomposition 未绑定请求的通用或专属能力
UnsupportedRenderOptionProvider 无法准确表示通用 raster 选项
UnsupportedRequirement文档需求超出 Provider 能力
ResourceResolutionError资源读取、授权或物化失败
ProviderExecutionErrorProvider 执行失败
RasterBackendExecutionErrorGraphics backend draw 或 encode 失败

这些错误都继承 RenderingError。native 异常在通用 Renderer/Provider、资源、生命周期、受管理的 Takumi API 和 Graphics adapter 边界收束;raw Playwright Page/Browsertakumi.renderer() 内的调用仍保留对应引擎异常。

稳定错误不会把 native 异常对象或未经限制的 str(error) 保存为公共状态。每个RenderingError 提供以下可补全字段:

  • message: str:归一化并限制长度的稳定摘要;
  • message_truncated: bool:摘要是否发生裁剪;
  • causes: tuple[ErrorCause, ...]:底层异常链及 ExceptionGroup 摘要与叶子的有限快照,每项包含 exception_typemessagetruncated
  • causes_truncated: bool:是否还有未收入快照的底层异常。
from nonebot.log import logger

from nonebot_plugin_htmlrender import RenderingError, render_html

try:
    image = await render_html("<main>Hello</main>")
except RenderingError as error:
    logger.warning("{}: {}", type(error).__name__, error.message)
    for cause in error.causes:
        logger.debug("{}: {}", cause.exception_type, cause.message)

str(error) 适合面向人的日志,内容为稳定摘要及有限的 Caused by ... 信息;程序分支应读取上述字段,而不是解析该字符串。原始异常仍通过 Python 的 __cause__ 链交给日志和错误追踪系统。原因快照只做 ANSI/空白归一化与长度、数量限制,不负责业务数据脱敏;输出给用户或外部日志前仍应按应用策略过滤。