261 lines
9.8 KiB
Python
261 lines
9.8 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
|
|||
|
|
"""
|
|||
|
|
API Request Models
|
|||
|
|
API 请求数据模型
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from typing import List, Dict, Any, Optional, Union
|
|||
|
|
from pydantic import BaseModel, Field, validator
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
|
|||
|
|
class TopicGenerationRequest(BaseModel):
|
|||
|
|
"""主题生成请求"""
|
|||
|
|
creative_materials: str = Field(..., description="创意素材")
|
|||
|
|
num_topics: int = Field(default=5, ge=1, le=20, description="生成主题数量")
|
|||
|
|
month: Optional[str] = Field(default=None, description="月份限制")
|
|||
|
|
style: str = Field(default="活泼有趣", description="内容风格")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"creative_materials": "春节期间的三亚旅游,包含海滩、美食、住宿等内容",
|
|||
|
|
"num_topics": 5,
|
|||
|
|
"month": "2024年2月",
|
|||
|
|
"style": "活泼有趣"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ContentGenerationRequest(BaseModel):
|
|||
|
|
"""内容生成请求"""
|
|||
|
|
scenic_info: str = Field(..., description="景区信息")
|
|||
|
|
product_info: str = Field(..., description="产品信息")
|
|||
|
|
additional_requirements: Optional[str] = Field(default="", description="额外要求")
|
|||
|
|
style: str = Field(default="活泼有趣", description="内容风格")
|
|||
|
|
target_audience: str = Field(default="年轻旅行者", description="目标受众")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"scenic_info": "三亚亚龙湾,拥有7公里长的银白色海滩,被誉为天下第一湾",
|
|||
|
|
"product_info": "亚龙湾度假套餐,包含豪华酒店住宿、海滩活动、特色餐饮",
|
|||
|
|
"additional_requirements": "突出性价比和家庭友好性",
|
|||
|
|
"style": "活泼有趣",
|
|||
|
|
"target_audience": "年轻家庭"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ContentJudgingRequest(BaseModel):
|
|||
|
|
"""内容评判请求"""
|
|||
|
|
product_info: str = Field(..., description="产品信息")
|
|||
|
|
content_to_judge: str = Field(..., description="待评判内容")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"product_info": "三亚亚龙湾度假套餐,价格2999元,包含3天2晚住宿",
|
|||
|
|
"content_to_judge": "三亚超值游,只要1999元!包含所有费用,豪华体验等你来!"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class PosterGenerationRequest(BaseModel):
|
|||
|
|
"""海报生成请求"""
|
|||
|
|
template_name: str = Field(default="vibrant", description="模板名称")
|
|||
|
|
content: Optional[Dict[str, Any]] = Field(default=None, description="海报内容")
|
|||
|
|
images: Optional[List[str]] = Field(default=None, description="图片路径列表")
|
|||
|
|
style_options: Optional[Dict[str, Any]] = Field(default=None, description="样式选项")
|
|||
|
|
|
|||
|
|
# 生成内容的参数(当content为空时使用)
|
|||
|
|
scenic_info: Optional[str] = Field(default=None, description="景区信息")
|
|||
|
|
product_info: Optional[str] = Field(default=None, description="产品信息")
|
|||
|
|
tweet_info: Optional[str] = Field(default="", description="推文信息")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"template_name": "vibrant",
|
|||
|
|
"scenic_info": "正佳极地海洋世界",
|
|||
|
|
"product_info": "夜场票,价格199元",
|
|||
|
|
"tweet_info": "520特惠活动",
|
|||
|
|
"style_options": {
|
|||
|
|
"color_theme": "vibrant",
|
|||
|
|
"transparent_background": True
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class DocumentProcessingRequest(BaseModel):
|
|||
|
|
"""文档处理请求"""
|
|||
|
|
action: str = Field(..., description="处理动作", regex="^(extract|integrate|transform)$")
|
|||
|
|
document_paths: List[str] = Field(..., description="文档路径列表")
|
|||
|
|
format_type: Optional[str] = Field(default=None, description="转换格式类型")
|
|||
|
|
additional_requirements: Optional[str] = Field(default="", description="额外要求")
|
|||
|
|
|
|||
|
|
@validator('document_paths')
|
|||
|
|
def validate_document_paths(cls, v):
|
|||
|
|
for path in v:
|
|||
|
|
if not Path(path).exists():
|
|||
|
|
raise ValueError(f"文档路径不存在: {path}")
|
|||
|
|
return v
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"action": "transform",
|
|||
|
|
"document_paths": [
|
|||
|
|
"documents/travel_guide.pdf",
|
|||
|
|
"documents/hotel_info.docx"
|
|||
|
|
],
|
|||
|
|
"format_type": "travel_guide",
|
|||
|
|
"additional_requirements": "突出实用信息和联系方式"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class XHSSearchRequest(BaseModel):
|
|||
|
|
"""小红书搜索请求"""
|
|||
|
|
keyword: str = Field(..., description="搜索关键词")
|
|||
|
|
max_notes: int = Field(default=20, ge=1, le=100, description="最大笔记数量")
|
|||
|
|
sort_type: int = Field(default=0, ge=0, le=4, description="排序类型")
|
|||
|
|
note_type: int = Field(default=0, ge=0, le=2, description="笔记类型")
|
|||
|
|
cookies: Optional[str] = Field(default=None, description="Cookie字符串")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"keyword": "三亚旅游攻略",
|
|||
|
|
"max_notes": 20,
|
|||
|
|
"sort_type": 2,
|
|||
|
|
"note_type": 0,
|
|||
|
|
"cookies": "your_cookie_string_here"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class KeywordAnalysisRequest(BaseModel):
|
|||
|
|
"""关键词分析请求"""
|
|||
|
|
content: str = Field(..., description="待分析内容")
|
|||
|
|
source_type: str = Field(default="general", description="内容源类型")
|
|||
|
|
enable_ai_analysis: bool = Field(default=True, description="是否启用AI分析")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"content": "三亚亚龙湾海滩度假攻略,包含住宿、美食、交通指南",
|
|||
|
|
"source_type": "travel_guide",
|
|||
|
|
"enable_ai_analysis": True
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class ContentAnalysisRequest(BaseModel):
|
|||
|
|
"""内容分析请求"""
|
|||
|
|
search_result: Optional[Dict[str, Any]] = Field(default=None, description="搜索结果")
|
|||
|
|
notes: Optional[List[Dict[str, Any]]] = Field(default=None, description="笔记列表")
|
|||
|
|
|
|||
|
|
@validator('notes', 'search_result')
|
|||
|
|
def validate_input(cls, v, values):
|
|||
|
|
# 至少需要提供一个
|
|||
|
|
if not v and not values.get('search_result') and not values.get('notes'):
|
|||
|
|
raise ValueError("必须提供search_result或notes中的至少一个")
|
|||
|
|
return v
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"notes": [
|
|||
|
|
{
|
|||
|
|
"note_id": "123",
|
|||
|
|
"title": "三亚旅游攻略",
|
|||
|
|
"content": "详细的旅游内容...",
|
|||
|
|
"author": "旅游达人",
|
|||
|
|
"likes": 1000,
|
|||
|
|
"comments": 50
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class FileUploadRequest(BaseModel):
|
|||
|
|
"""文件上传请求"""
|
|||
|
|
description: Optional[str] = Field(default="", description="文件描述")
|
|||
|
|
process_immediately: bool = Field(default=True, description="是否立即处理")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"description": "旅游攻略文档",
|
|||
|
|
"process_immediately": True
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class PipelineRequest(BaseModel):
|
|||
|
|
"""完整流水线请求"""
|
|||
|
|
creative_materials: str = Field(..., description="创意素材")
|
|||
|
|
num_topics: int = Field(default=5, ge=1, le=20, description="生成主题数量")
|
|||
|
|
scenic_info: str = Field(..., description="景区信息")
|
|||
|
|
product_info: str = Field(..., description="产品信息")
|
|||
|
|
style: str = Field(default="活泼有趣", description="内容风格")
|
|||
|
|
target_audience: str = Field(default="年轻旅行者", description="目标受众")
|
|||
|
|
generate_poster: bool = Field(default=False, description="是否生成海报")
|
|||
|
|
poster_template: str = Field(default="vibrant", description="海报模板")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"creative_materials": "春节期间的三亚旅游",
|
|||
|
|
"num_topics": 3,
|
|||
|
|
"scenic_info": "三亚亚龙湾",
|
|||
|
|
"product_info": "度假套餐,价格2999元",
|
|||
|
|
"style": "活泼有趣",
|
|||
|
|
"target_audience": "年轻家庭",
|
|||
|
|
"generate_poster": True,
|
|||
|
|
"poster_template": "vibrant"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class CookieManagementRequest(BaseModel):
|
|||
|
|
"""Cookie管理请求"""
|
|||
|
|
name: str = Field(..., description="Cookie名称")
|
|||
|
|
cookie_string: str = Field(..., description="Cookie字符串")
|
|||
|
|
description: Optional[str] = Field(default="", description="Cookie描述")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"name": "xhs_main",
|
|||
|
|
"cookie_string": "a1=xxx; web_session=xxx;",
|
|||
|
|
"description": "主要的小红书Cookie"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
class PromptBuildRequest(BaseModel):
|
|||
|
|
"""提示词构建请求"""
|
|||
|
|
task_type: str = Field(..., description="任务类型")
|
|||
|
|
scenic_info: Optional[str] = Field(default="", description="景区信息")
|
|||
|
|
product_info: Optional[str] = Field(default="", description="产品信息")
|
|||
|
|
style: Optional[str] = Field(default="", description="风格要求")
|
|||
|
|
target_audience: Optional[str] = Field(default="", description="目标受众")
|
|||
|
|
custom_requirements: Optional[str] = Field(default="", description="自定义要求")
|
|||
|
|
|
|||
|
|
class Config:
|
|||
|
|
schema_extra = {
|
|||
|
|
"example": {
|
|||
|
|
"task_type": "content_generation",
|
|||
|
|
"scenic_info": "三亚亚龙湾",
|
|||
|
|
"product_info": "度假套餐",
|
|||
|
|
"style": "活泼有趣",
|
|||
|
|
"target_audience": "年轻家庭",
|
|||
|
|
"custom_requirements": "突出性价比"
|
|||
|
|
}
|
|||
|
|
}
|