215 lines
6.6 KiB
Python
Raw Normal View History

2025-07-30 09:16:53 +08:00
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Content Generation Router
内容生成路由 - API v2
"""
import logging
from typing import Dict, Any
from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import JSONResponse
from ..models import (
TopicGenerationRequest,
ContentGenerationRequest,
ContentJudgingRequest,
TopicGenerationResponse,
ContentGenerationResponse,
ContentJudgingResponse,
ApiResponse
)
logger = logging.getLogger(__name__)
router = APIRouter()
@router.post("/topics", response_model=TopicGenerationResponse, summary="生成主题")
async def generate_topics(
request: TopicGenerationRequest,
pipeline: Dict[str, Any] = Depends(__import__('api_v2.main', fromlist=['get_content_pipeline']).get_content_pipeline)
):
"""
生成旅游内容主题
- **creative_materials**: 创意素材描述
- **num_topics**: 要生成的主题数量 (1-20)
- **month**: 可选的月份限制
- **style**: 内容风格
"""
try:
logger.info(f"开始生成主题,数量: {request.num_topics}")
# 获取主题生成器
topic_generator = pipeline["topic_generator"]
# 生成主题
request_id, topics_data = await topic_generator.generate_topics(
creative_materials=request.creative_materials,
num_topics=request.num_topics,
month=request.month,
style=request.style
)
logger.info(f"主题生成完成请求ID: {request_id}")
return TopicGenerationResponse(
success=True,
message=f"成功生成 {len(topics_data.get('topics', []))} 个主题",
data=topics_data,
request_id=request_id
)
except Exception as e:
error_msg = f"主题生成失败: {str(e)}"
logger.error(error_msg, exc_info=True)
return JSONResponse(
status_code=500,
content=TopicGenerationResponse(
success=False,
message="主题生成失败",
error=error_msg
).dict()
)
@router.post("/generate", response_model=ContentGenerationResponse, summary="生成内容")
async def generate_content(
request: ContentGenerationRequest,
pipeline: Dict[str, Any] = Depends(__import__('api_v2.main', fromlist=['get_content_pipeline']).get_content_pipeline)
):
"""
生成旅游内容文案
- **scenic_info**: 景区信息
- **product_info**: 产品信息
- **additional_requirements**: 额外要求
- **style**: 内容风格
- **target_audience**: 目标受众
"""
try:
logger.info("开始生成内容")
# 获取内容生成器
content_generator = pipeline["content_generator"]
# 构建主题信息
topic_info = {
"scenic_info": request.scenic_info,
"product_info": request.product_info,
"style": request.style,
"target_audience": request.target_audience
}
# 生成内容
request_id, content_data = await content_generator.generate_content(
topic=topic_info,
scenic_info=request.scenic_info,
product_info=request.product_info,
additional_requirements=request.additional_requirements
)
logger.info(f"内容生成完成请求ID: {request_id}")
return ContentGenerationResponse(
success=True,
message="内容生成成功",
data=content_data,
request_id=request_id
)
except Exception as e:
error_msg = f"内容生成失败: {str(e)}"
logger.error(error_msg, exc_info=True)
return JSONResponse(
status_code=500,
content=ContentGenerationResponse(
success=False,
message="内容生成失败",
error=error_msg
).dict()
)
@router.post("/judge", response_model=ContentJudgingResponse, summary="评判内容")
async def judge_content(
request: ContentJudgingRequest,
pipeline: Dict[str, Any] = Depends(__import__('api_v2.main', fromlist=['get_content_pipeline']).get_content_pipeline)
):
"""
评判内容质量和合规性
- **product_info**: 产品信息作为评判标准
- **content_to_judge**: 待评判的内容
"""
try:
logger.info("开始评判内容")
# 获取内容评判器
content_judger = pipeline["content_judger"]
# 评判内容
request_id, judge_data = await content_judger.judge_content(
product_info=request.product_info,
content_to_judge=request.content_to_judge
)
logger.info(f"内容评判完成请求ID: {request_id}")
return ContentJudgingResponse(
success=True,
message="内容评判完成",
data=judge_data,
request_id=request_id
)
except Exception as e:
error_msg = f"内容评判失败: {str(e)}"
logger.error(error_msg, exc_info=True)
return JSONResponse(
status_code=500,
content=ContentJudgingResponse(
success=False,
message="内容评判失败",
error=error_msg
).dict()
)
@router.get("/pipeline/stats", response_model=ApiResponse, summary="获取流水线统计")
async def get_pipeline_stats(
pipeline: Dict[str, Any] = Depends(__import__('api_v2.main', fromlist=['get_content_pipeline']).get_content_pipeline)
):
"""获取内容生成流水线的统计信息"""
try:
stats = {
"topic_generator": pipeline["topic_generator"].get_generation_stats(),
"content_generator": pipeline["content_generator"].get_generation_stats(),
"content_judger": pipeline["content_judger"].get_judging_stats(),
"ai_service": pipeline["ai_service"].get_model_info(),
"config": pipeline["config"].content_generation.dict()
}
return ApiResponse(
success=True,
message="统计信息获取成功",
data=stats
)
except Exception as e:
error_msg = f"获取统计信息失败: {str(e)}"
logger.error(error_msg, exc_info=True)
return JSONResponse(
status_code=500,
content=ApiResponse(
success=False,
message="获取统计信息失败",
error=error_msg
).dict()
)