215 lines
6.6 KiB
Python
215 lines
6.6 KiB
Python
|
|
#!/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()
|
|||
|
|
)
|