123 lines
4.3 KiB
Python
123 lines
4.3 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
海报服务层
|
||
封装现有功能,提供API调用
|
||
"""
|
||
|
||
import logging
|
||
import uuid
|
||
from typing import List, Dict, Any, Optional, Tuple
|
||
from datetime import datetime
|
||
|
||
from core.config import ConfigManager, PosterConfig
|
||
from core.ai import AIAgent
|
||
from utils.file_io import OutputManager
|
||
from poster.poster_generator import PosterGenerator
|
||
from poster.text_generator import PosterContentGenerator
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class PosterService:
|
||
"""海报服务类"""
|
||
|
||
def __init__(self, ai_agent: AIAgent, config_manager: ConfigManager, output_manager: OutputManager):
|
||
"""
|
||
初始化海报服务
|
||
|
||
Args:
|
||
ai_agent: AI代理
|
||
config_manager: 配置管理器
|
||
output_manager: 输出管理器
|
||
"""
|
||
self.ai_agent = ai_agent
|
||
self.config_manager = config_manager
|
||
self.output_manager = output_manager
|
||
|
||
# 初始化各个组件
|
||
self.poster_generator = PosterGenerator(config_manager, output_manager)
|
||
self.text_generator = PosterContentGenerator(ai_agent)
|
||
|
||
def generate_poster(self, content: Dict[str, Any], topic_index: str,
|
||
template_name: Optional[str] = None) -> Tuple[str, str, str, str]:
|
||
"""
|
||
生成海报
|
||
|
||
Args:
|
||
content: 内容数据,包含标题、正文等
|
||
topic_index: 主题索引,用于文件命名
|
||
template_name: 模板名称,如果为None则根据配置选择
|
||
|
||
Returns:
|
||
请求ID、主题索引、生成的海报文件路径和使用的模板名称
|
||
"""
|
||
logger.info(f"开始为主题 {topic_index} 生成海报")
|
||
|
||
# 生成海报
|
||
poster_path = self.poster_generator.generate_poster(content, topic_index, template_name)
|
||
|
||
# 获取使用的模板名称
|
||
if template_name is None:
|
||
template_name = self.poster_generator._select_template()
|
||
|
||
# 生成请求ID
|
||
request_id = f"poster_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{str(uuid.uuid4())[:8]}"
|
||
|
||
logger.info(f"海报生成完成,请求ID: {request_id}, 主题索引: {topic_index}, 模板: {template_name}")
|
||
return request_id, topic_index, poster_path, template_name
|
||
|
||
def get_available_templates(self) -> Tuple[List[str], str]:
|
||
"""
|
||
获取可用的模板列表
|
||
|
||
Returns:
|
||
可用的模板列表和默认模板
|
||
"""
|
||
# 获取配置
|
||
poster_config = self.config_manager.get_config('poster', PosterConfig)
|
||
|
||
# 获取可用模板
|
||
available_templates = poster_config.available_templates
|
||
|
||
# 获取默认模板
|
||
default_template = poster_config.template_selection
|
||
if default_template == "random" and available_templates:
|
||
default_template = available_templates[0]
|
||
|
||
return available_templates, default_template
|
||
|
||
async def generate_poster_text(self, system_prompt: str, user_prompt: str,
|
||
context_data: Optional[Dict[str, Any]] = None,
|
||
temperature: Optional[float] = None,
|
||
top_p: Optional[float] = None) -> Tuple[str, Dict[str, Any]]:
|
||
"""
|
||
生成海报文案
|
||
|
||
Args:
|
||
system_prompt: 系统提示词
|
||
user_prompt: 用户提示词
|
||
context_data: 上下文数据,用于填充提示词中的占位符
|
||
temperature: 生成温度参数
|
||
top_p: top_p参数
|
||
|
||
Returns:
|
||
请求ID和生成的文案内容
|
||
"""
|
||
logger.info("开始生成海报文案")
|
||
|
||
# 生成文案
|
||
text_content = await self.text_generator.generate_text_for_poster(
|
||
system_prompt=system_prompt,
|
||
user_prompt=user_prompt,
|
||
context_data=context_data,
|
||
temperature=temperature,
|
||
top_p=top_p
|
||
)
|
||
|
||
# 生成请求ID
|
||
request_id = f"text_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{str(uuid.uuid4())[:8]}"
|
||
|
||
logger.info(f"海报文案生成完成,请求ID: {request_id}")
|
||
return request_id, text_content |