支持html转图传入视口宽度并在总结模板中透传配置
This commit is contained in:
@@ -110,6 +110,13 @@ class MessageSummaryPlugin(MessagePluginInterface):
|
|||||||
self._summary_image_template_path = str(
|
self._summary_image_template_path = str(
|
||||||
output_config.get("summary_image_template_path", "plugins/message_summary/templates/summary_card.html")
|
output_config.get("summary_image_template_path", "plugins/message_summary/templates/summary_card.html")
|
||||||
).strip()
|
).strip()
|
||||||
|
# 模板截图视口参数:
|
||||||
|
# 1. 支持在插件配置中单独传入宽度/高度/缩放;
|
||||||
|
# 2. 默认保持历史值(780/960/1.2),避免影响未配置场景;
|
||||||
|
# 3. 仅在 template 模式生图时使用,markdown 模式不受影响。
|
||||||
|
self._template_viewport_width = int(output_config.get("template_viewport_width", 780))
|
||||||
|
self._template_viewport_height = int(output_config.get("template_viewport_height", 960))
|
||||||
|
self._template_device_scale_factor = float(output_config.get("template_device_scale_factor", 1.2))
|
||||||
self.llm_client = UnifiedLLMClient(api_config)
|
self.llm_client = UnifiedLLMClient(api_config)
|
||||||
self._api_mode = self.llm_client.mode or self._api_mode
|
self._api_mode = self.llm_client.mode or self._api_mode
|
||||||
self._response_mode = self.llm_client.response_mode or self._response_mode
|
self._response_mode = self.llm_client.response_mode or self._response_mode
|
||||||
@@ -1489,7 +1496,16 @@ class MessageSummaryPlugin(MessagePluginInterface):
|
|||||||
message_stats=message_stats,
|
message_stats=message_stats,
|
||||||
metadata=metadata,
|
metadata=metadata,
|
||||||
)
|
)
|
||||||
await asyncio.wait_for(html_to_image(html_content, str(output_path)), timeout=total_timeout)
|
await asyncio.wait_for(
|
||||||
|
html_to_image(
|
||||||
|
html_content,
|
||||||
|
str(output_path),
|
||||||
|
viewport_width=self._template_viewport_width,
|
||||||
|
viewport_height=self._template_viewport_height,
|
||||||
|
device_scale_factor=self._template_device_scale_factor,
|
||||||
|
),
|
||||||
|
timeout=total_timeout,
|
||||||
|
)
|
||||||
if not output_path.exists() or output_path.stat().st_size < 1024:
|
if not output_path.exists() or output_path.stat().st_size < 1024:
|
||||||
raise RuntimeError("模板截图输出文件异常")
|
raise RuntimeError("模板截图输出文件异常")
|
||||||
return str(output_path.resolve())
|
return str(output_path.resolve())
|
||||||
|
|||||||
@@ -633,14 +633,35 @@ class _PersistentBrowser:
|
|||||||
return
|
return
|
||||||
self._heartbeat_task = asyncio.create_task(self._heartbeat_loop(), name="md2img:heartbeat")
|
self._heartbeat_task = asyncio.create_task(self._heartbeat_loop(), name="md2img:heartbeat")
|
||||||
|
|
||||||
async def screenshot(self, html_content: str, output_image: str):
|
async def screenshot(
|
||||||
|
self,
|
||||||
|
html_content: str,
|
||||||
|
output_image: str,
|
||||||
|
viewport_width: int = 780,
|
||||||
|
viewport_height: int = 960,
|
||||||
|
device_scale_factor: float = 1.2,
|
||||||
|
):
|
||||||
browser = await self.ensure_browser()
|
browser = await self.ensure_browser()
|
||||||
|
|
||||||
async def _capture_with_browser(active_browser):
|
async def _capture_with_browser(active_browser):
|
||||||
self._capture_in_progress = True
|
self._capture_in_progress = True
|
||||||
context = None
|
context = None
|
||||||
try:
|
try:
|
||||||
context = await active_browser.new_context(viewport={"width": 780, "height": 960}, device_scale_factor=1.2)
|
# 说明:
|
||||||
|
# 1. 允许调用方按业务场景传入截图宽度(例如卡片模板可用更窄视口);
|
||||||
|
# 2. 默认值保持历史行为,确保未改造调用方不受影响;
|
||||||
|
# 3. 这里做最小边界保护,避免传入异常值导致 Playwright 抛错。
|
||||||
|
safe_width = max(320, int(viewport_width or 780))
|
||||||
|
safe_height = max(320, int(viewport_height or 960))
|
||||||
|
safe_scale = float(device_scale_factor or 1.2)
|
||||||
|
if safe_scale < 1.0:
|
||||||
|
safe_scale = 1.0
|
||||||
|
if safe_scale > 3.0:
|
||||||
|
safe_scale = 3.0
|
||||||
|
context = await active_browser.new_context(
|
||||||
|
viewport={"width": safe_width, "height": safe_height},
|
||||||
|
device_scale_factor=safe_scale,
|
||||||
|
)
|
||||||
page = await context.new_page()
|
page = await context.new_page()
|
||||||
logger.debug("Set page content")
|
logger.debug("Set page content")
|
||||||
await page.set_content(html_content, wait_until='domcontentloaded', timeout=15000)
|
await page.set_content(html_content, wait_until='domcontentloaded', timeout=15000)
|
||||||
@@ -893,7 +914,13 @@ def warmup_md2img_browser_sync(timeout_seconds: int = 45) -> bool:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
async def html_to_image(html_content, output_image):
|
async def html_to_image(
|
||||||
|
html_content,
|
||||||
|
output_image,
|
||||||
|
viewport_width: int = 780,
|
||||||
|
viewport_height: int = 960,
|
||||||
|
device_scale_factor: float = 1.2,
|
||||||
|
):
|
||||||
"""将 HTML 渲染为图片。
|
"""将 HTML 渲染为图片。
|
||||||
|
|
||||||
说明:
|
说明:
|
||||||
@@ -903,7 +930,13 @@ async def html_to_image(html_content, output_image):
|
|||||||
|
|
||||||
async def _html_to_image_impl():
|
async def _html_to_image_impl():
|
||||||
manager = _get_browser_manager()
|
manager = _get_browser_manager()
|
||||||
await manager.screenshot(html_content, output_image)
|
await manager.screenshot(
|
||||||
|
html_content,
|
||||||
|
output_image,
|
||||||
|
viewport_width=viewport_width,
|
||||||
|
viewport_height=viewport_height,
|
||||||
|
device_scale_factor=device_scale_factor,
|
||||||
|
)
|
||||||
|
|
||||||
await _run_in_md2img_runtime(_html_to_image_impl())
|
await _run_in_md2img_runtime(_html_to_image_impl())
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user