from __future__ import annotations from typing import Any, Dict, Literal, Optional from pydantic import BaseModel, ConfigDict, Field class BaseRequest(BaseModel): """所有请求模型基类:默认允许额外字段,避免破坏兼容性。""" model_config = ConfigDict(extra="allow") class RunTaskRequest(BaseRequest): task_name: str = Field(..., min_length=1) date_string: Optional[str] = None class TaskListRequest(BaseRequest): page: int = Field(default=1, ge=1) size: int = Field(default=50, ge=1, le=200) sort_by: str = Field(default="id", min_length=1) sort_dir: str = Field(default="desc", min_length=1) id: Optional[int] = None date_string: Optional[str] = None trace_id: Optional[str] = None task_status: Optional[int] = None class GetCoverRequest(BaseRequest): """GetCoverService 的请求体字段不固定,先保持兼容。""" # 用一个可选字段占位,避免空模型在某些场景不好读 payload: Optional[Dict[str, Any]] = None class SaveTokenRequest(BaseRequest): """GzhCookieManager 的请求体字段不固定,先保持兼容。""" token: Optional[str] = None class LongArticlesMcpRequest(BaseRequest): """MCP 交互接口的请求体,按 task_name 可传不同参数。""" page: int = Field(default=1, ge=1, description="页码,从 1 开始") page_size: int = Field(default=20, ge=1, le=100, description="每页条数") sort_by: Optional[str] = Field(default=None, description="排序字段") sort_order: Optional[Literal["asc", "desc"]] = Field(default=None, description="排序方向: asc / desc")