domain.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. """Formal acquisition domain objects.
  2. These models describe the cloud pipeline state used by the formal PostgreSQL
  3. repository layer.
  4. """
  5. from __future__ import annotations
  6. from datetime import datetime
  7. from typing import Any, Literal
  8. from uuid import UUID
  9. from pydantic import BaseModel, ConfigDict, Field
  10. JsonDict = dict[str, Any]
  11. Platform = Literal["xiaohongshu", "weixin", "douyin"]
  12. ContentMode = Literal["image_post", "video_post", "article", "unsupported"]
  13. AcquisitionStatus = Literal[
  14. "draft",
  15. "pending",
  16. "running",
  17. "candidate",
  18. "classified",
  19. "done",
  20. "failed",
  21. "testing",
  22. ]
  23. class DomainModel(BaseModel):
  24. model_config = ConfigDict(extra="forbid")
  25. class QueryBatch(DomainModel):
  26. id: UUID | None = None
  27. name: str
  28. source_type: str = "manual"
  29. generation_method: str | None = None
  30. target_platforms: list[str] = Field(default_factory=list)
  31. status: str = "draft"
  32. metadata: JsonDict = Field(default_factory=dict)
  33. error_message: str | None = None
  34. created_at: datetime | None = None
  35. updated_at: datetime | None = None
  36. class Query(DomainModel):
  37. id: UUID | None = None
  38. batch_id: UUID | None = None
  39. query_text: str
  40. axes: JsonDict = Field(default_factory=dict)
  41. keep: bool | None = None
  42. filter_reason: str | None = None
  43. status: str = "draft"
  44. sort_order: int = 0
  45. metadata: JsonDict = Field(default_factory=dict)
  46. error_message: str | None = None
  47. created_at: datetime | None = None
  48. updated_at: datetime | None = None
  49. class AcquisitionRun(DomainModel):
  50. id: UUID | None = None
  51. batch_id: UUID | None = None
  52. run_key: str | None = None
  53. status: str = "pending"
  54. note: str | None = None
  55. metadata: JsonDict = Field(default_factory=dict)
  56. error_message: str | None = None
  57. started_at: datetime | None = None
  58. finished_at: datetime | None = None
  59. created_at: datetime | None = None
  60. updated_at: datetime | None = None
  61. class AcquisitionJob(DomainModel):
  62. id: UUID | None = None
  63. run_id: UUID
  64. query_id: UUID | None = None
  65. platform: str
  66. status: str = "pending"
  67. search_limit: int | None = None
  68. display_limit: int | None = None
  69. attempt_count: int = 0
  70. metadata: JsonDict = Field(default_factory=dict)
  71. error_message: str | None = None
  72. started_at: datetime | None = None
  73. finished_at: datetime | None = None
  74. created_at: datetime | None = None
  75. updated_at: datetime | None = None
  76. class CandidateItem(DomainModel):
  77. id: UUID | None = None
  78. job_id: UUID | None = None
  79. query_id: UUID | None = None
  80. platform: str
  81. platform_item_id: str | None = None
  82. unique_key: str | None = None
  83. canonical_url: str | None = None
  84. content_type: str | None = None
  85. content_mode: ContentMode | None = None
  86. title: str | None = None
  87. author_name: str | None = None
  88. published_at: datetime | None = None
  89. body_text: str | None = None
  90. raw_summary: str | None = None
  91. status: str = "candidate"
  92. source_payload: JsonDict = Field(default_factory=dict)
  93. metadata: JsonDict = Field(default_factory=dict)
  94. error_message: str | None = None
  95. created_at: datetime | None = None
  96. updated_at: datetime | None = None
  97. class MediaAsset(DomainModel):
  98. id: UUID | None = None
  99. item_id: UUID
  100. media_type: str
  101. source_url: str | None = None
  102. oss_url: str | None = None
  103. cdn_url: str | None = None
  104. position: int = 0
  105. status: str = "pending"
  106. source_payload: JsonDict = Field(default_factory=dict)
  107. metadata: JsonDict = Field(default_factory=dict)
  108. error_message: str | None = None
  109. created_at: datetime | None = None
  110. updated_at: datetime | None = None
  111. class ItemClassification(DomainModel):
  112. id: UUID | None = None
  113. item_id: UUID
  114. is_creation_knowledge: bool | None = None
  115. label: str | None = None
  116. confidence: float | None = None
  117. reason: str | None = None
  118. model_name: str | None = None
  119. prompt_version: str | None = None
  120. result_payload: JsonDict = Field(default_factory=dict)
  121. status: str = "pending"
  122. error_message: str | None = None
  123. created_at: datetime | None = None
  124. updated_at: datetime | None = None