2025-07-10 17:51:37 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
海报API路由
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
import logging
|
|
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
|
|
|
|
from typing import List, Dict, Any
|
|
|
|
|
|
|
|
|
|
|
|
from core.config import ConfigManager
|
|
|
|
|
|
from core.ai import AIAgent
|
|
|
|
|
|
from utils.file_io import OutputManager
|
|
|
|
|
|
from api.services.poster import PosterService
|
|
|
|
|
|
from api.models.poster import (
|
|
|
|
|
|
PosterRequest, PosterResponse,
|
|
|
|
|
|
TemplateListResponse,
|
|
|
|
|
|
PosterTextRequest, PosterTextResponse
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-07-11 13:50:08 +08:00
|
|
|
|
# 从依赖注入模块导入依赖
|
|
|
|
|
|
from api.dependencies import get_config, get_ai_agent, get_output_manager
|
2025-07-10 17:51:37 +08:00
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
# 创建路由
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
|
|
|
|
|
|
# 依赖注入函数
|
|
|
|
|
|
def get_poster_service(
|
|
|
|
|
|
config_manager: ConfigManager = Depends(get_config),
|
|
|
|
|
|
ai_agent: AIAgent = Depends(get_ai_agent),
|
|
|
|
|
|
output_manager: OutputManager = Depends(get_output_manager)
|
|
|
|
|
|
) -> PosterService:
|
|
|
|
|
|
"""获取海报服务"""
|
|
|
|
|
|
return PosterService(ai_agent, config_manager, output_manager)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/generate", response_model=PosterResponse, summary="生成海报")
|
|
|
|
|
|
async def generate_poster(
|
|
|
|
|
|
request: PosterRequest,
|
|
|
|
|
|
poster_service: PosterService = Depends(get_poster_service)
|
|
|
|
|
|
):
|
|
|
|
|
|
"""
|
|
|
|
|
|
生成海报
|
|
|
|
|
|
|
|
|
|
|
|
- **content**: 内容数据,包含标题、正文等
|
|
|
|
|
|
- **topic_index**: 主题索引,用于文件命名
|
|
|
|
|
|
- **template_name**: 模板名称,如果为None则根据配置选择
|
|
|
|
|
|
"""
|
|
|
|
|
|
try:
|
|
|
|
|
|
request_id, topic_index, poster_path, template_name = poster_service.generate_poster(
|
|
|
|
|
|
content=request.content,
|
|
|
|
|
|
topic_index=request.topic_index,
|
|
|
|
|
|
template_name=request.template_name
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
return PosterResponse(
|
|
|
|
|
|
request_id=request_id,
|
|
|
|
|
|
topic_index=topic_index,
|
|
|
|
|
|
poster_path=poster_path,
|
|
|
|
|
|
template_name=template_name
|
|
|
|
|
|
)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logger.error(f"生成海报失败: {e}", exc_info=True)
|
|
|
|
|
|
raise HTTPException(status_code=500, detail=f"生成海报失败: {str(e)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/templates", response_model=TemplateListResponse, summary="获取可用模板列表")
|
|
|
|
|
|
async def get_templates(
|
|
|
|
|
|
poster_service: PosterService = Depends(get_poster_service)
|
|
|
|
|
|
):
|
|
|
|
|
|
"""获取可用的海报模板列表"""
|
|
|
|
|
|
try:
|
|
|
|
|
|
templates, default_template = poster_service.get_available_templates()
|
|
|
|
|
|
|
|
|
|
|
|
return TemplateListResponse(
|
|
|
|
|
|
templates=templates,
|
|
|
|
|
|
default_template=default_template
|
|
|
|
|
|
)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logger.error(f"获取模板列表失败: {e}", exc_info=True)
|
|
|
|
|
|
raise HTTPException(status_code=500, detail=f"获取模板列表失败: {str(e)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/text", response_model=PosterTextResponse, summary="生成海报文案")
|
|
|
|
|
|
async def generate_poster_text(
|
|
|
|
|
|
request: PosterTextRequest,
|
|
|
|
|
|
poster_service: PosterService = Depends(get_poster_service)
|
|
|
|
|
|
):
|
|
|
|
|
|
"""
|
|
|
|
|
|
生成海报文案
|
|
|
|
|
|
|
|
|
|
|
|
- **system_prompt**: 系统提示词
|
|
|
|
|
|
- **user_prompt**: 用户提示词
|
|
|
|
|
|
- **context_data**: 上下文数据,用于填充提示词中的占位符
|
|
|
|
|
|
- **temperature**: 生成温度参数
|
|
|
|
|
|
- **top_p**: top_p参数
|
|
|
|
|
|
"""
|
|
|
|
|
|
try:
|
|
|
|
|
|
request_id, text_content = await poster_service.generate_poster_text(
|
|
|
|
|
|
system_prompt=request.system_prompt,
|
|
|
|
|
|
user_prompt=request.user_prompt,
|
|
|
|
|
|
context_data=request.context_data,
|
|
|
|
|
|
temperature=request.temperature,
|
|
|
|
|
|
top_p=request.top_p
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
return PosterTextResponse(
|
|
|
|
|
|
request_id=request_id,
|
|
|
|
|
|
text_content=text_content
|
|
|
|
|
|
)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
logger.error(f"生成海报文案失败: {e}", exc_info=True)
|
|
|
|
|
|
raise HTTPException(status_code=500, detail=f"生成海报文案失败: {str(e)}")
|