schemas.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 CancelTaskRequest(BaseRequest):
  20. trace_id: str = Field(..., min_length=1)
  21. class GetCoverRequest(BaseRequest):
  22. """GetCoverService 的请求体字段不固定,先保持兼容。"""
  23. # 用一个可选字段占位,避免空模型在某些场景不好读
  24. payload: Optional[Dict[str, Any]] = None
  25. class SaveTokenRequest(BaseRequest):
  26. """GzhCookieManager 的请求体字段不固定,先保持兼容。"""
  27. token: Optional[str] = None
  28. class LongArticlesMcpRequest(BaseRequest):
  29. """MCP 交互接口的请求体,按 task_name 可传不同参数。"""
  30. page: int = Field(default=1, ge=1, description="页码,从 1 开始")
  31. page_size: int = Field(default=20, ge=1, le=100, description="每页条数")
  32. sort_by: Optional[str] = Field(default=None, description="排序字段")
  33. sort_order: Optional[Literal["asc", "desc"]] = Field(
  34. default=None, description="排序方向: asc / desc"
  35. )
  36. class DailyRankQueryRequest(BaseRequest):
  37. """日榜数据查询请求"""
  38. rank_date: Optional[str] = Field(default=None, description="榜单日期 YYYY-MM-DD")
  39. gh_id: Optional[str] = Field(default=None, description="公众号ID")
  40. account_name: Optional[str] = Field(default=None, description="账号名称")
  41. content_pool_type: Optional[str] = Field(default=None, description="内容池类型")
  42. strategy: Optional[str] = Field(default=None, description="排序策略")
  43. # 权重配置(前端可调整)
  44. weights: Optional[Dict[str, float]] = Field(
  45. default=None,
  46. description="分数权重配置,key为字段名,value为权重值",
  47. )
  48. sort_by: str = Field(default="new_score", description="排序字段")
  49. sort_dir: str = Field(default="desc", description="排序方向")
  50. class ElasticSearchRequest(BaseRequest):
  51. """ES 搜索请求"""
  52. keywords: str = Field(..., min_length=1, description="搜索关键词")
  53. size: int = Field(default=10, ge=1, le=100, description="返回结果数量")