schemas.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. class CandidateItemSchema(ApiSchema):
  54. id: UUID
  55. platform: str
  56. platform_item_id: str | None = None
  57. canonical_url: str | None = None
  58. content_type: str | None = None
  59. title: str | None = None
  60. author_name: str | None = None
  61. raw_summary: str | None = None
  62. status: str
  63. media_assets: list[MediaAssetSchema] = Field(default_factory=list)
  64. classification: ItemClassificationSchema | None = None
  65. class AcquisitionRunSummarySchema(ApiSchema):
  66. id: UUID
  67. run_key: str | None = None
  68. batch_id: UUID | None = None
  69. status: str
  70. query_count: int = 0
  71. job_count: int = 0
  72. candidate_count: int = 0
  73. creation_hit_count: int = 0
  74. queries: list[dict[str, Any]] = Field(default_factory=list)
  75. started_at: datetime | None = None
  76. finished_at: datetime | None = None
  77. class DecodeResultSchema(ApiSchema):
  78. id: UUID
  79. item_id: UUID
  80. status: str
  81. read_result: dict[str, Any] = Field(default_factory=dict)
  82. gate_result: dict[str, Any] = Field(default_factory=dict)
  83. framing_result: dict[str, Any] = Field(default_factory=dict)
  84. class KnowledgeParticleSchema(ApiSchema):
  85. id: UUID
  86. decode_result_id: UUID | None = None
  87. item_id: UUID | None = None
  88. parent_particle_id: UUID | None = None
  89. particle_type: str
  90. title: str
  91. business_stage: str | None = None
  92. creation_stage: str | None = None
  93. content: dict[str, Any] = Field(default_factory=dict)
  94. status: str
  95. class ScopeResultSchema(ApiSchema):
  96. id: UUID
  97. particle_id: UUID | None = None
  98. item_id: UUID | None = None
  99. scope_type: str
  100. scope_value: str
  101. is_reused: bool | None = None
  102. matched_scope_id: str | None = None
  103. confidence: float | None = None
  104. status: str
  105. class PayloadDraftSchema(ApiSchema):
  106. id: UUID
  107. particle_id: UUID | None = None
  108. item_id: UUID | None = None
  109. payload: dict[str, Any] = Field(default_factory=dict)
  110. review_status: str
  111. ingest_ready: bool
  112. status: str
  113. class IngestRecordSchema(ApiSchema):
  114. id: UUID
  115. payload_draft_id: UUID | None = None
  116. target_system: str
  117. target_id: str | None = None
  118. status: str
  119. attempt_count: int = 0
  120. error_message: str | None = None