schemas.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. queries: list[dict[str, Any]] = Field(default_factory=list)
  82. started_at: datetime | None = None
  83. finished_at: datetime | None = None
  84. class DecodeResultSchema(ApiSchema):
  85. id: UUID
  86. item_id: UUID
  87. status: str
  88. read_result: dict[str, Any] = Field(default_factory=dict)
  89. gate_result: dict[str, Any] = Field(default_factory=dict)
  90. framing_result: dict[str, Any] = Field(default_factory=dict)
  91. class KnowledgeParticleSchema(ApiSchema):
  92. id: UUID
  93. decode_result_id: UUID | None = None
  94. item_id: UUID | None = None
  95. parent_particle_id: UUID | None = None
  96. particle_type: str
  97. title: str
  98. business_stage: str | None = None
  99. creation_stage: str | None = None
  100. content: dict[str, Any] = Field(default_factory=dict)
  101. status: str
  102. class ScopeResultSchema(ApiSchema):
  103. id: UUID
  104. particle_id: UUID | None = None
  105. item_id: UUID | None = None
  106. scope_type: str
  107. scope_value: str
  108. is_reused: bool | None = None
  109. matched_scope_id: str | None = None
  110. confidence: float | None = None
  111. status: str
  112. class PayloadDraftSchema(ApiSchema):
  113. id: UUID
  114. particle_id: UUID | None = None
  115. item_id: UUID | None = None
  116. payload: dict[str, Any] = Field(default_factory=dict)
  117. review_status: str
  118. ingest_ready: bool
  119. status: str
  120. class IngestRecordSchema(ApiSchema):
  121. id: UUID
  122. payload_draft_id: UUID | None = None
  123. target_system: str
  124. target_id: str | None = None
  125. status: str
  126. attempt_count: int = 0
  127. error_message: str | None = None