#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 海报API模型定义 - 使用 camelCase 命名约定 """ from re import T from typing import List, Dict, Any, Optional from datetime import datetime from pydantic import BaseModel, Field class PosterGenerateRequest(BaseModel): """海报生成请求模型""" templateId: str = Field("vibrant", description="模板ID") imagesBase64: Optional[List[str]] = Field(None, description="图像base64编码列表") posterContent: Optional[Dict[str, Any]] = Field(None, description="海报内容,如果提供则直接使用此内容") contentId: Optional[str] = Field(None, description="内容ID,用于AI生成内容") productId: Optional[str] = Field(None, description="产品ID,用于AI生成内容") scenicSpotId: Optional[str] = Field(None, description="景区ID,用于AI生成内容") numVariations: int = Field(3, description="要生成的海报变体数量, 默认为3", ge=1, le=5) forceLlmGeneration: bool = Field(False, description="是否强制使用LLM重新生成内容") generatePsd: bool = Field(False, description="是否生成PSD分层文件") psdOutputPath: Optional[str] = Field(None, description="PSD文件输出路径(可选,默认自动生成)") class Config: json_schema_extra = { "example": { "templateId": "vibrant", "imagesBase64": "", "numVariations": 1, "forceLlmGeneration":False, "generatePsd": True, "psdOutputPath": "custom_poster.psd", "contentId":"1", "productId":"1", "scenicSpotId":"1", "posterContent":{ "title":"天津冒险湾", "slogan":"天津冒险湾,让你体验不一样的冒险之旅" } } } class TemplateInfo(BaseModel): """模板信息模型""" id: str name: str description: str handler_path: str = Field(alias="handlerPath") class_name: str = Field(alias="className") system_prompt: Optional[str] = None user_prompt_template: Optional[str] = None required_fields: Optional[List[str]] = None optional_fields: Optional[List[str]] = None size: Optional[List[int]] = None is_active: bool = Field(alias="isActive") class Config: allow_population_by_field_name = True class TemplateListResponse(BaseModel): """模板列表响应模型""" templates: List[TemplateInfo] totalCount: int class ImageUsageInfo(BaseModel): """图像使用信息模型""" imageId: int usageCount: int firstUsedAt: str lastUsedAt: str usageContext: List[str] class PosterGenerateResponse(BaseModel): """海报生成响应模型""" requestId: str templateId: str resultImagesBase64: List[Dict[str, Any]] = Field(description="生成的海报图像(base64编码)列表") psdFiles: Optional[List[Dict[str, Any]]] = Field(None, description="生成的PSD文件信息列表") metadata: Dict[str, Any] = Field(default_factory=dict) class Config: json_encoders = { datetime: lambda v: v.isoformat() } class ImageUsageRequest(BaseModel): """图像使用查询请求模型""" imageIds: List[int] class ImageUsageResponse(BaseModel): """图像使用情况响应模型""" requestId: str imageUsageInfo: List[ImageUsageInfo] summary: Dict[str, Any]