v0.8 迁移指南¶
0.8 是破坏性版本:配置进入统一 render 命名空间,位图 API 返回 typed
artifacts,Provider/Capability 取代 0.7 的 Backend/Render 公共契约。插件在加载阶段拒绝旧配置键,不做歧义兼容。
文档路径¶
文档从按读者身份划分的 users/*、maintainers/* 重组为指南、参考、原理与扩展、项目四类章节。旧 URL 在整个 0.8 正式版本周期内保留相对重定向,0.9 起可以删除;新链接应直接指向 canonical 路径。
配置¶
render:
provider: playwright
startup: probe
provider_config:
engine: chromium
resources:
cache:
max_entries: 256
max_bytes: 67108864
max_resource_bytes: 67108864
revalidate_seconds: 1.0
templates:
environment_cache_max_entries: 64
environment_compiled_cache_size: 256
local_access:
allow_any_path: false
allowed_paths: []
filehost:
public_base_url: null # filehost transport 选中时必填
max_entries: 256
max_bytes: 268435456
cache_ttl_seconds: 300.0
prewarm_enabled: true
prewarm_max_files: 256
prewarm_paths: []
prewarm_extensions: []
request_header_name: X-HTMLRender-Filehost-Request
request_header_value: null
request_header_salt: nonebot-plugin-htmlrender:filehost:guard:v1
observability:
sentry: false
prometheus: false
| 0.7 | 0.8 |
|---|---|
render_backend |
render.provider |
render_startup_mode |
render.startup |
render_playwright.* |
render.provider_config.*(选择 Playwright) |
render_takumi.* |
render.provider_config.*(选择 Takumi) |
render_resource_cache_max_entries |
render.resources.cache.max_entries |
render_resource_cache_max_bytes |
render.resources.cache.max_bytes |
render_resource_cache_revalidate_seconds |
render.resources.cache.revalidate_seconds |
render_template_environment_cache_max_entries |
render.resources.templates.environment_cache_max_entries |
render_playwright.filehost_allow_any_path |
render.resources.local_access.allow_any_path |
render_playwright.filehost_allowed_paths |
render.resources.local_access.allowed_paths |
render_playwright.filehost_cache_ttl_seconds |
render.resources.filehost.cache_ttl_seconds |
render_playwright.filehost_prewarm_enabled |
render.resources.filehost.prewarm_enabled |
render_playwright.filehost_prewarm_max_files |
render.resources.filehost.prewarm_max_files |
render_playwright.filehost_prewarm_paths |
render.resources.filehost.prewarm_paths |
render_playwright.filehost_prewarm_extensions |
render.resources.filehost.prewarm_extensions |
render_playwright.filehost_request_header_name |
render.resources.filehost.request_header_name |
render_playwright.filehost_request_header_value |
render.resources.filehost.request_header_value |
render_playwright.filehost_request_header_salt |
render.resources.filehost.request_header_salt |
render_storage_path |
render.provider_config.storage_path(Playwright) |
filehost TTL/预热/请求头与本地路径授权都由核心 Resource Service 管理;Provider只选择 transport strategy。0.8 的 HTTP 路由和临时文件由 htmlrender 自有HostedAssetStore 管理,不再 require 0.7 使用的外部 filehost 插件;filehost
extra 仅保留为可选的 py-machineid 守卫标识来源。
extras¶
uv add "nonebot-plugin-htmlrender[playwright]>=0.8.0,<0.9"
# 或
uv add "nonebot-plugin-htmlrender[takumi]>=0.8.0,<0.9"
# 或(实验性、asyncio-only)
uv add "nonebot-plugin-htmlrender[htmlkit]>=0.8.0,<0.9"
core 安装默认不包含任何位图渲染后端。HTMLKit rc5 另有device_pixel_ratio=1.0、height=None 的显式限制,详见HTMLKit 配置。
未选择 Provider 时插件仍可执行 Preparation 与 render_template_html;由于位图操作未绑定,调用会抛出 CapabilityUnavailable。选择了 Provider 但缺少对应extra 时,位图执行或启动会报告 ProviderUnavailable。
typed artifacts 与参数¶
from nonebot_plugin_htmlrender import render_text
artifact = await render_text("hello", width=500)
image_bytes = bytes(artifact)
media_type = artifact.media_type
| 0.7 | 0.8 |
|---|---|
render_html(...) -> bytes |
render_html(...) -> RenderedImage |
render_template_html(...) -> str |
render_template_html(...) -> RenderedHtml |
image_type= |
image_format= |
device_scale_factor= |
device_pixel_ratio= |
md= / md_path= |
markdown= / markdown_path= |
templates= |
variables= |
pages= |
中立 width / height;浏览器参数移入 Capability |
resource_strict= / resolve_resources= |
resource_policy=ResourcePolicy.STRICT / AUTO / OFF |
wait= / screenshot_timeout= |
timeout_seconds= |
图片消费者改为 bytes(artifact);HTML 消费者改为 str(artifact)。
资源解析结果¶
resolve_template_vars() 与 to_resource_url() 不再直接返回 dict / str,而是返回 ResourceResolution[T]。解析值位于 .value;filehost 发布产生的请求头按最终 URL 保存在 .request_headers_by_url。这是能力边界的一部分,不能只保存 URL并丢弃对应 header。
from nonebot_plugin_htmlrender import resolve_template_vars, to_resource_url
variables_result = await resolve_template_vars({"logo": "./logo.svg"})
variables = variables_result.value
logo_result = await to_resource_url("./logo.svg")
logo_url = logo_result.value
logo_headers = logo_result.request_headers_by_url.get(logo_url, {})
使用 file、memory、passthrough 或自定义 resolver 且未发布 filehost URL 时,request_headers_by_url 为空映射。
lifecycle 与浏览器操作¶
| 已删除的 0.7 契约 | 0.8 |
|---|---|
startup_render() / shutdown_render() |
Application.startup() / Application.aclose() |
get_render_context() / get_new_page() |
app.extensions.playwright.page() |
capture_html_element(...) |
app.extensions.playwright.page() + Playwright 原生 Page / Locator API |
list_render_backend_statuses() 等状态 API |
Application.probe() 与 Capability 探测 |
require_render_extension(TAKUMI_EXTENSION) |
async with app.extensions.takumi.api() |
from nonebot_plugin_htmlrender import get_default_application
app = get_default_application()
playwright = app.extensions.playwright
async with playwright.page(viewport={"width": 800, "height": 600}) as page:
await page.goto("https://example.com")
第一方能力从 app.extensions 直接发现;第三方 key 与 Protocol 才通过公共模块导入。adapter 内部 capability 模块不是公共兼容路径。
删除符号¶
以下名字只用于迁移检索,不存在兼容 adapter:
Backend、BackendCapability、BackendExtensionRenderBackend、RenderRuntime、RenderSessionregister_backend、build_backendPreparationService、SingleflightResourceReader、ResourceValueResolver、clean_playwright_cachePageConfig.base_url;页面导航只使用document_url_compat中的text_to_pic、md_to_pic、html_to_pic、template_to_pic、template_to_html
项目内搜索这些名字与旧配置键,并逐一迁移后再升级。
第三方 Provider¶
实现 EngineProvider[SettingsT],通过 entry point group
nonebot_plugin_htmlrender.providers 注册。entry point 名必须等于provider.id;htmlkit、playwright 与 takumi 是保留 ID。
0.7 与 0.8 开发分支中曾存在的过渡 Provider 接口不构成兼容契约。第三方Provider 必须适配 0.8.0 正式公开的类型化 settings、ProviderDependencies、EngineBindings、ProviderResources、ResourceStrategy 与 provider-local
lease;不提供兼容 shim。当前 ProviderDependencies 只包含 operation/cache
observer、resources 与可选 asset_publisher,不再暴露 worker、raw reader、local
policy 或完整 ResourceService。EngineBindings 也不再包含 description 或observation_attributes;Provider ID 是引擎身份的唯一来源。以examples/echo-provider 和 Provider 开发指南为准。
检查表¶
- 全部配置移入
render,启动日志无旧键错误。 - 安装所选 Provider extra。
- 所有图片消费者使用
bytes(artifact)。 - 模板参数使用
variables,raster 参数不再嵌套。 - 页面/selector/native 专属操作改用 typed Capability。
- 只捕获稳定
RenderingError子类。 - examples、类型检查、strict docs build 与真实 Provider smoke 通过。