zhenxun_bot/zhenxun/services/renderer/protocols.py

113 lines
3.6 KiB
Python
Raw Normal View History

from abc import ABC, abstractmethod
from collections.abc import Awaitable, Iterable
from pathlib import Path
from typing import Any, Protocol
from pydantic import BaseModel
class Renderable(ABC):
"""
一个协议定义了任何可被渲染的UI组件必须具备的形态
该协议确保了所有UI组件都能被 `RendererService` 以统一的方式处理
任何想要被渲染服务处理的UI数据模型都应直接或间接实现此协议
"""
component_css: str | None
@property
@abstractmethod
def template_name(self) -> str:
"""
返回用于渲染此组件的Jinja2模板的路径
这是一个抽象属性所有子类都必须覆盖它
返回:
str: 指向模板文件的相对路径例如 'components/core/table'
"""
...
async def prepare(self) -> None:
"""
[可选] 一个生命周期钩子用于在渲染前执行异步数据获取和预处理
此方法会在组件的数据被传递给模板之前调用
适合用于执行数据库查询网络请求等耗时操作以准备最终的渲染数据
"""
pass
@abstractmethod
def get_children(self) -> Iterable["Renderable"]:
"""
✨ Feat: 增强 LLM、渲染与广播功能并优化性能 (#2071) * ⚡️ perf(image_utils): 优化图片哈希获取避免阻塞异步 * ✨ feat(llm): 增强 LLM 管理功能,支持纯文本列表输出,优化模型能力识别并新增提供商 - 【LLM 管理器】为 `llm list` 命令添加 `--text` 选项,支持以纯文本格式输出模型列表。 - 【LLM 配置】新增 `OpenRouter` LLM 提供商的默认配置。 - 【模型能力】增强 `get_model_capabilities` 函数的查找逻辑,支持模型名称分段匹配和更灵活的通配符匹配。 - 【模型能力】为 `Gemini` 模型能力注册表使用更通用的通配符模式。 - 【模型能力】新增 `GPT` 系列模型的详细能力定义,包括多模态输入输出和工具调用支持。 * ✨ feat(renderer): 添加 Jinja2 `inline_asset` 全局函数 - 新增 `RendererService._inline_asset_global` 方法,并注册为 Jinja2 全局函数 `inline_asset`。 - 允许模板通过 `{{ inline_asset('@namespace/path/to/asset.svg') }}` 直接内联已注册命名空间下的资源文件内容。 - 主要用于解决内联 SVG 时可能遇到的跨域安全问题。 - 【重构】优化 `ResourceResolver.resolve_asset_uri` 中对命名空间资源 (以 `@` 开头) 的解析逻辑,确保能够正确获取文件绝对路径并返回 URI。 - 改进 `RenderableComponent.get_extra_css`,使其在组件定义 `component_css` 时自动返回该 CSS 内容。 - 清理 `Renderable` 协议和 `RenderableComponent` 基类中已存在方法的 `[新增]` 标记。 * ✨ feat(tag): 添加标签克隆功能 - 新增 `tag clone <源标签名> <新标签名>` 命令,用于复制现有标签。 - 【优化】在 `tag create`, `tag edit --add`, `tag edit --set` 命令中,自动去重传入的群组ID,避免重复关联。 * ✨ feat(broadcast): 实现标签定向广播、强制发送及并发控制 - 【新功能】 - 新增标签定向广播功能,支持通过 `-t <标签名>` 或 `广播到 <标签名>` 命令向指定标签的群组发送消息 - 引入广播强制发送模式,允许绕过群组的任务阻断设置 - 实现广播并发控制,通过配置限制同时发送任务数量,避免API速率限制 - 优化视频消息处理,支持从URL下载视频内容并作为原始数据发送,提高跨平台兼容性 - 【配置】 - 添加 `DEFAULT_BROADCAST` 配置项,用于设置群组进群时广播功能的默认开关状态 - 添加 `BROADCAST_CONCURRENCY_LIMIT` 配置项,用于控制广播时的最大并发任务数 * ✨ feat(renderer): 支持组件变体样式收集 * ✨ feat(tag): 实现群组标签自动清理及手动清理功能 * 🐛 fix(gemini): 增加响应验证以处理内容过滤(promptFeedback) * 🐛 fix(codeql): 移除对 JavaScript 和 TypeScript 的分析支持 * :rotating_light: auto fix by pre-commit hooks --------- Co-authored-by: webjoin111 <455457521@qq.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-11-26 14:13:19 +08:00
返回一个包含所有直接子组件的可迭代对象
这使得渲染服务能够递归地遍历整个组件树以执行依赖收集CSSJS等任务
非容器组件应返回一个空列表
"""
...
def get_required_scripts(self) -> list[str]:
"""[可选] 返回此组件所需的JS脚本路径列表 (相对于主题的assets目录)。"""
return []
def get_required_styles(self) -> list[str]:
"""[可选] 返回此组件所需的CSS样式表路径列表 (相对于主题的assets目录)。"""
return []
@abstractmethod
def get_render_data(self) -> dict[str, Any | Awaitable[Any]]:
"""
返回一个将传递给模板的数据字典
重要字典的值可以是协程(Awaitable)渲染服务会自动解析它们
返回:
dict[str, Any | Awaitable[Any]]: 用于模板渲染的上下文数据
"""
...
def get_extra_css(self, context: Any) -> str | Awaitable[str]:
"""
[可选] 一个生命周期钩子让组件可以提供额外的CSS
可以返回 str awaitable[str]
参数:
context: 当前的渲染上下文对象可用于访问主题管理器等
返回:
str | Awaitable[str]: 注入到页面的额外CSS字符串
"""
return ""
class ScreenshotEngine(Protocol):
"""
一个协议定义了截图引擎的核心能力
这允许系统在不同的截图后端如Playwright, Pyppeteer之间切换
而无需修改上层渲染服务的代码
"""
async def render(self, html: str, base_url_path: Path, **render_options) -> bytes:
"""
将HTML字符串截图为图片
参数:
html: 要渲染的HTML内容
base_url_path: 用于解析相对路径如CSS, JS, 图片的基础URL路径
**render_options: 传递给底层截图库的额外选项 ( viewport)
返回:
bytes: 渲染后的图片字节数据
"""
...
class RenderResult(BaseModel):
"""
渲染服务的统一返回类型
封装了渲染过程可能产出的所有结果主要用于调试和内部传递
"""
image_bytes: bytes | None = None
html_content: str | None = None