261 lines
9.8 KiB
Python
Raw Permalink Normal View History

2025-07-31 15:35:23 +08:00
#!/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": "突出性价比"
}
}