schemas.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. """Pydantic schemas returned by the formal workbench API."""
  2. from __future__ import annotations
  3. from datetime import datetime
  4. from typing import Any
  5. from uuid import UUID
  6. from pydantic import BaseModel, ConfigDict, Field
  7. class ApiSchema(BaseModel):
  8. model_config = ConfigDict(from_attributes=True)
  9. class Page(ApiSchema):
  10. total: int
  11. page: int = 1
  12. size: int = 50
  13. items: list[dict[str, Any]] = Field(default_factory=list)
  14. class ErrorResponse(ApiSchema):
  15. code: str
  16. message: str
  17. detail: dict[str, Any] = Field(default_factory=dict)
  18. class QueryBatchSchema(ApiSchema):
  19. id: UUID
  20. name: str
  21. source_type: str
  22. generation_method: str | None = None
  23. target_platforms: list[str] = Field(default_factory=list)
  24. status: str
  25. created_at: datetime | None = None
  26. updated_at: datetime | None = None
  27. class QuerySchema(ApiSchema):
  28. id: UUID
  29. batch_id: UUID | None = None
  30. query_text: str
  31. axes: dict[str, Any] = Field(default_factory=dict)
  32. keep: bool | None = None
  33. filter_reason: str | None = None
  34. status: str
  35. sort_order: int = 0
  36. class MediaAssetSchema(ApiSchema):
  37. id: UUID
  38. item_id: UUID
  39. media_type: str
  40. source_url: str | None = None
  41. oss_url: str | None = None
  42. cdn_url: str | None = None
  43. position: int = 0
  44. status: str
  45. class ItemClassificationSchema(ApiSchema):
  46. id: UUID
  47. item_id: UUID
  48. is_creation_knowledge: bool | None = None
  49. label: str | None = None
  50. confidence: float | None = None
  51. reason: str | None = None
  52. status: str
  53. error_message: str | None = None
  54. class CandidateItemSchema(ApiSchema):
  55. id: UUID
  56. platform: str
  57. platform_item_id: str | None = None
  58. unique_key: str | None = None
  59. canonical_url: str | None = None
  60. content_type: str | None = None
  61. content_mode: str | None = None
  62. title: str | None = None
  63. author_name: str | None = None
  64. body_text: str | None = None
  65. raw_summary: str | None = None
  66. status: str
  67. metadata: dict[str, Any] = Field(default_factory=dict)
  68. error_message: str | None = None
  69. decode_summary: dict[str, Any] | None = None
  70. media_assets: list[MediaAssetSchema] = Field(default_factory=list)
  71. classification: ItemClassificationSchema | None = None
  72. class AcquisitionRunSummarySchema(ApiSchema):
  73. id: UUID
  74. run_key: str | None = None
  75. batch_id: UUID | None = None
  76. status: str
  77. query_count: int = 0
  78. job_count: int = 0
  79. candidate_count: int = 0
  80. creation_hit_count: int = 0
  81. decoded_count: int = 0
  82. payload_count: int = 0
  83. queries: list[dict[str, Any]] = Field(default_factory=list)
  84. started_at: datetime | None = None
  85. finished_at: datetime | None = None
  86. class DecodeResultSchema(ApiSchema):
  87. id: UUID
  88. item_id: UUID
  89. status: str
  90. read_result: dict[str, Any] = Field(default_factory=dict)
  91. gate_result: dict[str, Any] = Field(default_factory=dict)
  92. framing_result: dict[str, Any] = Field(default_factory=dict)
  93. class KnowledgeParticleSchema(ApiSchema):
  94. id: UUID
  95. decode_result_id: UUID | None = None
  96. item_id: UUID | None = None
  97. parent_particle_id: UUID | None = None
  98. particle_type: str
  99. title: str
  100. business_stage: str | None = None
  101. creation_stage: str | None = None
  102. content: dict[str, Any] = Field(default_factory=dict)
  103. status: str
  104. class ScopeResultSchema(ApiSchema):
  105. id: UUID
  106. particle_id: UUID | None = None
  107. item_id: UUID | None = None
  108. scope_type: str
  109. scope_value: str
  110. is_reused: bool | None = None
  111. matched_scope_id: str | None = None
  112. confidence: float | None = None
  113. status: str
  114. class PayloadDraftSchema(ApiSchema):
  115. id: UUID
  116. particle_id: UUID | None = None
  117. item_id: UUID | None = None
  118. payload: dict[str, Any] = Field(default_factory=dict)
  119. review_status: str
  120. ingest_ready: bool
  121. status: str
  122. class IngestRecordSchema(ApiSchema):
  123. id: UUID
  124. payload_draft_id: UUID | None = None
  125. target_system: str
  126. target_id: str | None = None
  127. status: str
  128. attempt_count: int = 0
  129. error_message: str | None = None