schemas.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from __future__ import annotations
  2. from typing import Any, Dict, Literal, Optional
  3. from pydantic import BaseModel, ConfigDict, Field
  4. class BaseRequest(BaseModel):
  5. """所有请求模型基类:默认允许额外字段,避免破坏兼容性。"""
  6. model_config = ConfigDict(extra="allow")
  7. class RunTaskRequest(BaseRequest):
  8. task_name: str = Field(..., min_length=1)
  9. date_string: Optional[str] = None
  10. class TaskListRequest(BaseRequest):
  11. page: int = Field(default=1, ge=1)
  12. size: int = Field(default=50, ge=1, le=200)
  13. sort_by: str = Field(default="id", min_length=1)
  14. sort_dir: str = Field(default="desc", min_length=1)
  15. id: Optional[int] = None
  16. date_string: Optional[str] = None
  17. trace_id: Optional[str] = None
  18. task_status: Optional[int] = None
  19. class GetCoverRequest(BaseRequest):
  20. """GetCoverService 的请求体字段不固定,先保持兼容。"""
  21. # 用一个可选字段占位,避免空模型在某些场景不好读
  22. payload: Optional[Dict[str, Any]] = None
  23. class SaveTokenRequest(BaseRequest):
  24. """GzhCookieManager 的请求体字段不固定,先保持兼容。"""
  25. token: Optional[str] = None
  26. class LongArticlesMcpRequest(BaseRequest):
  27. """MCP 交互接口的请求体,按 task_name 可传不同参数。"""
  28. page: int = Field(default=1, ge=1, description="页码,从 1 开始")
  29. page_size: int = Field(default=20, ge=1, le=100, description="每页条数")
  30. sort_by: Optional[str] = Field(default=None, description="排序字段")
  31. sort_order: Optional[Literal["asc", "desc"]] = Field(
  32. default=None, description="排序方向: asc / desc"
  33. )
  34. class DailyRankQueryRequest(BaseRequest):
  35. """日榜数据查询请求"""
  36. rank_date: Optional[str] = Field(default=None, description="榜单日期 YYYY-MM-DD")
  37. gh_id: Optional[str] = Field(default=None, description="公众号ID")
  38. account_name: Optional[str] = Field(default=None, description="账号名称")
  39. content_pool_type: Optional[str] = Field(default=None, description="内容池类型")
  40. strategy: Optional[str] = Field(default=None, description="排序策略")
  41. # 权重配置(前端可调整)
  42. weights: Optional[Dict[str, float]] = Field(
  43. default=None,
  44. description="分数权重配置,key为字段名,value为权重值",
  45. )
  46. sort_by: str = Field(default="new_score", description="排序字段")
  47. sort_dir: str = Field(default="desc", description="排序方向")
  48. class ElasticSearchRequest(BaseRequest):
  49. """ES 搜索请求"""
  50. keywords: str = Field(..., min_length=1, description="搜索关键词")
  51. size: int = Field(default=10, ge=1, le=100, description="返回结果数量")