models.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. """Formal decode-content domain models."""
  2. from __future__ import annotations
  3. from datetime import datetime
  4. from typing import Any, Literal
  5. from uuid import UUID
  6. from pydantic import BaseModel, ConfigDict, Field
  7. JsonDict = dict[str, Any]
  8. ParticleType = Literal["what", "how", "why"]
  9. class DecodeModel(BaseModel):
  10. model_config = ConfigDict(extra="forbid")
  11. class ReadCard(DecodeModel):
  12. index: int
  13. kind: str = "image"
  14. url: str | None = None
  15. timestamp: float | None = None
  16. start: float | None = None
  17. end: float | None = None
  18. content: str = ""
  19. class ReadResult(DecodeModel):
  20. text: str = ""
  21. cards: list[ReadCard] = Field(default_factory=list)
  22. media: JsonDict = Field(default_factory=dict)
  23. is_empty: bool = False
  24. class GateResult(DecodeModel):
  25. passed: bool
  26. reason: str = ""
  27. details: JsonDict = Field(default_factory=dict)
  28. class HowStep(DecodeModel):
  29. input: str = ""
  30. directive: str = ""
  31. output: str = ""
  32. scopes: list[JsonDict] = Field(default_factory=list)
  33. class KnowledgeParticle(DecodeModel):
  34. id: UUID | None = None
  35. decode_result_id: UUID | None = None
  36. item_id: UUID | None = None
  37. parent_particle_id: UUID | None = None
  38. particle_type: ParticleType
  39. title: str
  40. business_stage: str | None = None
  41. creation_stage: str | None = None
  42. content: JsonDict = Field(default_factory=dict)
  43. sort_order: int = 0
  44. status: str = "draft"
  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 ScopeResult(DecodeModel):
  50. id: UUID | None = None
  51. particle_id: UUID | None = None
  52. item_id: UUID | None = None
  53. scope_type: str
  54. scope_value: str
  55. is_reused: bool | None = None
  56. matched_scope_id: str | None = None
  57. confidence: float | None = None
  58. evidence: JsonDict = Field(default_factory=dict)
  59. status: str = "draft"
  60. error_message: str | None = None
  61. created_at: datetime | None = None
  62. updated_at: datetime | None = None
  63. class PayloadDraft(DecodeModel):
  64. id: UUID | None = None
  65. particle_id: UUID | None = None
  66. item_id: UUID | None = None
  67. payload: JsonDict = Field(default_factory=dict)
  68. review_status: str = "pending"
  69. ingest_ready: bool = False
  70. status: str = "draft"
  71. error_message: str | None = None
  72. created_at: datetime | None = None
  73. updated_at: datetime | None = None
  74. class IngestRecord(DecodeModel):
  75. id: UUID | None = None
  76. payload_draft_id: UUID | None = None
  77. target_system: str
  78. target_id: str | None = None
  79. status: str = "pending"
  80. attempt_count: int = 0
  81. response_payload: JsonDict = Field(default_factory=dict)
  82. error_message: str | None = None
  83. created_at: datetime | None = None
  84. updated_at: datetime | None = None
  85. class DecodeJob(DecodeModel):
  86. id: UUID | None = None
  87. item_id: UUID
  88. status: str = "pending"
  89. attempt_count: int = 0
  90. metadata: JsonDict = Field(default_factory=dict)
  91. error_message: str | None = None
  92. started_at: datetime | None = None
  93. finished_at: datetime | None = None
  94. created_at: datetime | None = None
  95. updated_at: datetime | None = None
  96. class DecodeResult(DecodeModel):
  97. id: UUID | None = None
  98. decode_job_id: UUID | None = None
  99. item_id: UUID
  100. read_result: JsonDict = Field(default_factory=dict)
  101. gate_result: JsonDict = Field(default_factory=dict)
  102. framing_result: JsonDict = Field(default_factory=dict)
  103. status: str = "draft"
  104. error_message: str | None = None
  105. created_at: datetime | None = None
  106. updated_at: datetime | None = None
  107. class ContractSnapshot(DecodeModel):
  108. id: UUID | None = None
  109. contract_name: str
  110. contract_type: str
  111. version_label: str | None = None
  112. content_hash: str | None = None
  113. source_path: str | None = None
  114. snapshot: JsonDict = Field(default_factory=dict)
  115. created_at: datetime | None = None
  116. Knowledge = KnowledgeParticle