206 lines
6.9 KiB
Python
Raw Permalink 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 -*-
"""
提示词API路由
"""
import logging
from typing import Dict, Any, Optional
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel, Field
from api.services.prompt_service import PromptService
from api.services.prompt_builder import PromptBuilderService
from api.dependencies import get_config, get_tweet_service
logger = logging.getLogger(__name__)
# 创建路由
router = APIRouter(
tags=["prompt"],
responses={404: {"description": "Not found"}},
)
# 依赖注入函数
def get_prompt_service():
"""获取提示词服务"""
from core.config import get_config_manager
return PromptService(get_config_manager())
def get_prompt_builder():
"""获取提示词构建器服务"""
from core.config import get_config_manager
config_manager = get_config_manager()
prompt_service = PromptService(config_manager)
return PromptBuilderService(config_manager, prompt_service)
# 请求和响应模型
class PromptRequest(BaseModel):
"""提示词请求模型"""
style: str = Field(..., description="内容风格")
audience: str = Field(..., description="目标受众")
class Config:
schema_extra = {
"example": {
"style": "攻略风",
"audience": "亲子向"
}
}
class PromptResponse(BaseModel):
"""提示词响应模型"""
style_content: str = Field(..., description="风格提示词")
audience_content: str = Field(..., description="受众提示词")
class Config:
schema_extra = {
"example": {
"style_content": "以实用信息为主,包含详细的游玩路线...",
"audience_content": "家庭出游,有小孩同行,关注安全性..."
}
}
class PromptBuilderRequest(BaseModel):
"""提示词构建器请求模型"""
topic: Dict[str, Any] = Field(..., description="选题信息")
step: Optional[str] = Field(None, description="步骤如topic、content、judge等")
class Config:
schema_extra = {
"example": {
"topic": {
"index": "1",
"date": "2023-07-15",
"object": "北京故宫",
"product": "故宫门票",
"style": "攻略风",
"targetAudience": "亲子向",
"logic": "暑期旅游热门景点推荐"
},
"step": "content"
}
}
class PromptBuilderResponse(BaseModel):
"""提示词构建器响应模型"""
system_prompt: str = Field(..., description="系统提示词")
user_prompt: str = Field(..., description="用户提示词")
class Config:
schema_extra = {
"example": {
"system_prompt": "你是一位专业的旅游内容创作者...",
"user_prompt": "请为北京故宫创作一篇旅游攻略..."
}
}
class GenerateContentResponse(BaseModel):
"""生成内容响应模型"""
request_id: str = Field(..., description="请求ID")
topic_index: str = Field(..., description="选题索引")
content: Dict[str, Any] = Field(..., description="生成的内容")
class Config:
schema_extra = {
"example": {
"request_id": "content-20240715-123456-a1b2c3d4",
"topic_index": "1",
"content": {
"title": "【北京故宫】避开人潮的秘密路线90%的人都不知道!",
"content": "故宫,作为中国最著名的文化遗产之一...",
"tag": ["北京旅游", "故宫", "旅游攻略", "避暑胜地"]
}
}
}
@router.post("/get-style-audience", response_model=PromptResponse)
async def get_style_audience(
request: PromptRequest,
prompt_service: PromptService = Depends(get_prompt_service)
):
"""获取风格和受众提示词"""
try:
style_content = prompt_service.get_style_content(request.style)
audience_content = prompt_service.get_audience_content(request.audience)
return PromptResponse(
style_content=style_content,
audience_content=audience_content
)
except Exception as e:
logger.error(f"获取提示词失败: {e}")
raise HTTPException(status_code=500, detail=f"获取提示词失败: {str(e)}")
@router.post("/build-prompt", response_model=PromptBuilderResponse)
async def build_prompt(
request: PromptBuilderRequest,
prompt_builder: PromptBuilderService = Depends(get_prompt_builder)
):
"""构建完整提示词"""
try:
# 根据请求中的step确定构建哪种类型的提示词
step = request.step or "content"
if step == "topic":
# 构建选题提示词
# 从topic中提取必要的参数
numTopics = request.topic.get("numTopics", 5)
month = request.topic.get("month", "7")
system_prompt, user_prompt = prompt_builder.build_topic_prompt(
dates=month,
numTopics=numTopics
)
elif step == "judge":
# 构建审核提示词
# 需要提供生成的内容
content = request.topic.get("content", {})
system_prompt, user_prompt = prompt_builder.build_judge_prompt(request.topic, content)
else:
# 默认构建内容生成提示词
system_prompt, user_prompt = prompt_builder.build_content_prompt(request.topic, step)
return PromptBuilderResponse(
system_prompt=system_prompt,
user_prompt=user_prompt
)
except Exception as e:
logger.error(f"构建提示词失败: {e}")
raise HTTPException(status_code=500, detail=f"构建提示词失败: {str(e)}")
@router.post("/generate-content", response_model=GenerateContentResponse)
async def generate_content(
request: PromptBuilderRequest,
prompt_builder: PromptBuilderService = Depends(get_prompt_builder),
tweet_service = Depends(get_tweet_service)
):
"""使用构建的提示词生成内容"""
try:
# 构建提示词
step = request.step or "content"
system_prompt, user_prompt = prompt_builder.build_content_prompt(request.topic, step)
# 使用提示词生成内容
request_id, topic_index, content = await tweet_service.generate_content_with_prompt(
topic=request.topic,
system_prompt=system_prompt,
user_prompt=user_prompt
)
return GenerateContentResponse(
request_id=request_id,
topic_index=topic_index,
content=content
)
except Exception as e:
logger.error(f"生成内容失败: {e}")
raise HTTPException(status_code=500, detail=f"生成内容失败: {str(e)}")