domain.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. AcquisitionStatus = Literal[
  13. "draft",
  14. "pending",
  15. "running",
  16. "candidate",
  17. "classified",
  18. "done",
  19. "failed",
  20. "testing",
  21. ]
  22. class DomainModel(BaseModel):
  23. model_config = ConfigDict(extra="forbid")
  24. class QueryBatch(DomainModel):
  25. id: UUID | None = None
  26. name: str
  27. source_type: str = "manual"
  28. generation_method: str | None = None
  29. target_platforms: list[str] = Field(default_factory=list)
  30. status: str = "draft"
  31. metadata: JsonDict = Field(default_factory=dict)
  32. error_message: str | None = None
  33. created_at: datetime | None = None
  34. updated_at: datetime | None = None
  35. class Query(DomainModel):
  36. id: UUID | None = None
  37. batch_id: UUID | None = None
  38. query_text: str
  39. axes: JsonDict = Field(default_factory=dict)
  40. keep: bool | None = None
  41. filter_reason: str | None = None
  42. status: str = "draft"
  43. sort_order: int = 0
  44. metadata: JsonDict = Field(default_factory=dict)
  45. error_message: str | None = None
  46. created_at: datetime | None = None
  47. updated_at: datetime | None = None
  48. class AcquisitionRun(DomainModel):
  49. id: UUID | None = None
  50. batch_id: UUID | None = None
  51. run_key: str | None = None
  52. status: str = "pending"
  53. note: str | None = None
  54. metadata: JsonDict = Field(default_factory=dict)
  55. error_message: str | None = None
  56. started_at: datetime | None = None
  57. finished_at: datetime | None = None
  58. created_at: datetime | None = None
  59. updated_at: datetime | None = None
  60. class AcquisitionJob(DomainModel):
  61. id: UUID | None = None
  62. run_id: UUID
  63. query_id: UUID | None = None
  64. platform: str
  65. status: str = "pending"
  66. search_limit: int | None = None
  67. display_limit: int | None = None
  68. attempt_count: int = 0
  69. metadata: JsonDict = Field(default_factory=dict)
  70. error_message: str | None = None
  71. started_at: datetime | None = None
  72. finished_at: datetime | None = None
  73. created_at: datetime | None = None
  74. updated_at: datetime | None = None
  75. class CandidateItem(DomainModel):
  76. id: UUID | None = None
  77. job_id: UUID | None = None
  78. query_id: UUID | None = None
  79. platform: str
  80. platform_item_id: str | None = None
  81. canonical_url: str | None = None
  82. content_type: str | None = None
  83. title: str | None = None
  84. author_name: str | None = None
  85. published_at: datetime | None = None
  86. raw_summary: str | None = None
  87. status: str = "candidate"
  88. source_payload: JsonDict = Field(default_factory=dict)
  89. metadata: JsonDict = Field(default_factory=dict)
  90. error_message: str | None = None
  91. created_at: datetime | None = None
  92. updated_at: datetime | None = None
  93. class MediaAsset(DomainModel):
  94. id: UUID | None = None
  95. item_id: UUID
  96. media_type: str
  97. source_url: str | None = None
  98. oss_url: str | None = None
  99. cdn_url: str | None = None
  100. position: int = 0
  101. status: str = "pending"
  102. source_payload: JsonDict = Field(default_factory=dict)
  103. metadata: JsonDict = Field(default_factory=dict)
  104. error_message: str | None = None
  105. created_at: datetime | None = None
  106. updated_at: datetime | None = None
  107. class ItemClassification(DomainModel):
  108. id: UUID | None = None
  109. item_id: UUID
  110. is_creation_knowledge: bool | None = None
  111. label: str | None = None
  112. confidence: float | None = None
  113. reason: str | None = None
  114. model_name: str | None = None
  115. prompt_version: str | None = None
  116. result_payload: JsonDict = Field(default_factory=dict)
  117. status: str = "pending"
  118. error_message: str | None = None
  119. created_at: datetime | None = None
  120. updated_at: datetime | None = None