mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-14 13:42:56 +08:00
Some checks failed
检查bot是否运行正常 / bot check (push) Has been cancelled
CodeQL Code Security Analysis / Analyze (${{ matrix.language }}) (none, python) (push) Has been cancelled
Sequential Lint and Type Check / ruff-call (push) Has been cancelled
Release Drafter / Update Release Draft (push) Has been cancelled
Force Sync to Aliyun / sync (push) Has been cancelled
Update Version / update-version (push) Has been cancelled
Sequential Lint and Type Check / pyright-call (push) Has been cancelled
* ⚡️ 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 的分析支持 * 🚨 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>
113 lines
3.6 KiB
Python
113 lines
3.6 KiB
Python
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"]:
|
||
"""
|
||
返回一个包含所有直接子组件的可迭代对象。
|
||
|
||
这使得渲染服务能够递归地遍历整个组件树,以执行依赖收集(CSS、JS)等任务。
|
||
非容器组件应返回一个空列表。
|
||
"""
|
||
...
|
||
|
||
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
|