2025-07-31 15:35:23 +08:00

215 lines
6.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()
)