feat(stage10): implement vision integration

This commit is contained in:
NSCT Agent
2026-08-25 14:42:29 +00:00
parent 14f016457a
commit 3ab875d2bc
9 changed files with 2751 additions and 4 deletions

View File

@@ -471,4 +471,134 @@ class EvidenceScoreRelationModel(Base):
__table_args__ = (
Index("ix_evidence_score_relations_score_id", "score_id"),
Index("ix_evidence_score_relations_related_claim_id", "related_claim_id"),
)
)
# ---------------------------------------------------------------------------
# Stage 10 — Vision Evidence Extraction
# ---------------------------------------------------------------------------
class VisionCaptureType(str, enum.Enum):
"""Klassifikation der visuellen Erfassung (Stage 10)."""
RAW_IMAGE = "raw_image"
DIAGRAM = "diagram"
CHART = "chart"
SCREENSHOT = "screenshot"
INFOGRAPHIC = "infographic"
PDF_LAYOUT = "pdf_layout"
class VisionEvidenceLevel(str, enum.Enum):
"""Evidenz-Level einer visuellen Evidenz (Stage 10)."""
HIGH = "high"
MEDIUM = "medium"
LOW = "low"
UNCERTAIN = "uncertain"
class VisionEntityType(str, enum.Enum):
"""Kategorie einer erkannten Entity aus einem Bild (Stage 10)."""
DATE = "date"
PERSON = "person"
ORGANIZATION = "organization"
LOCATION = "location"
NUMBER = "number"
STATISTIC = "statistic"
GRAPH_ELEMENT = "graph_element"
class VisionEvidenceModel(Base):
"""Einzelne visuell extrahierte Evidenz (Stage 10).
Felder:
uuid: Primärschlüssel (UUID)
research_run_id: Research-Run-Zuordnung
source_id: Quelle, von der das Bild stammt
capture_type: Art der visuellen Erfassung
extracted_text: Vom Vision-Modell extrahierter Text
image_data_url: Data-URL oder base64-codiertes Bild (optional)
entities: JSON mit erkannten Entities
confidence: Confidence 0.01.0
confidence_label: Confidence als Label (HIGH/MEDIUM/LOW/UNCERTAIN)
evidence_level: Evidenz-Level (HIGH/MEDIUM/LOW/UNCERTAIN)
created_at / updated_at: Zeitstempel
"""
__tablename__ = "vision_evidence"
id = Column(String(36), primary_key=True, default=lambda: str(uuid4()))
research_run_id = Column(String(36), nullable=False)
source_id = Column(String(36), ForeignKey("sources.id"), nullable=False)
capture_type = Column(Enum(VisionCaptureType), nullable=False)
extracted_text = Column(Text, nullable=False)
image_data_url = Column(Text, nullable=True)
entities = Column(JSON, nullable=False, default=dict)
confidence = Column(Float, nullable=False, default=0.5)
confidence_label = Column(String(16), nullable=False, default="medium")
evidence_level = Column(Enum(VisionEvidenceLevel), nullable=False, default=VisionEvidenceLevel.MEDIUM)
created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
updated_at = Column(DateTime, nullable=False, default=datetime.utcnow)
# Relationships
source = relationship("SourceModel")
__table_args__ = (
Index("ix_vision_evidence_research_run_id", "research_run_id"),
Index("ix_vision_evidence_capture_type", "capture_type"),
Index("ix_vision_evidence_source_id", "source_id"),
)
class VisionEntityModel(Base):
"""Erkannte Entity aus einem visuellen Bild (Stage 10).
Felder:
uuid: Primärschlüssel (UUID)
evidence_id: FK zur VisionEvidence
entity_type: Kategorie der Entity
entity_value: Der erkannte Wert
context: Kontextbeschreibung
confidence: Confidence 0.01.0
created_at: Zeitstempel
"""
__tablename__ = "vision_entities"
id = Column(String(36), primary_key=True, default=lambda: str(uuid4()))
evidence_id = Column(
String(36),
ForeignKey("vision_evidence.id"),
nullable=False,
)
entity_type = Column(Enum(VisionEntityType), nullable=False)
entity_value = Column(Text, nullable=False)
context = Column(Text, nullable=True)
confidence = Column(Float, nullable=False, default=0.5)
created_at = Column(DateTime, nullable=False, default=datetime.utcnow)
# Relationships
evidence = relationship("VisionEvidenceModel", back_populates="entities")
__table_args__ = (
Index("ix_vision_entities_evidence_id", "evidence_id"),
Index("ix_vision_entities_entity_type", "entity_type"),
)
# Back-populate the backref for VisionEntityModel
VisionEvidenceModel.entities = relationship(
"VisionEntityModel",
back_populates="evidence",
cascade="all, delete-orphan",
foreign_keys="VisionEntityModel.evidence_id",
)