from __future__ import annotations from datetime import datetime from sqlalchemy import ( Boolean, Column, DateTime, Float, ForeignKey, Index, Integer, String, Text, ) from src.personalization_module.preference_acquisition.preference_memory.db import Base class DecisionEvent(Base): __tablename__ = "decision_events" id = Column(Integer, primary_key=True) request_id = Column(String, unique=True, nullable=False) user_node_id = Column(Integer, ForeignKey("nodes.id"), nullable=False, index=True) task_id = Column(String, nullable=True) action_input_json = Column(Text, nullable=False, default="{}") context_input_json = Column(Text, nullable=False, default="{}") preference_snapshot_json = Column(Text, nullable=False, default="[]") predicted_decision = Column(String, nullable=False) class_scores_json = Column(Text, nullable=False, default="{}") confidence = Column(Float, nullable=True) runner_up_json = Column(Text, nullable=False, default="{}") model_name = Column(String, nullable=True) model_version = Column(String, nullable=True) feature_schema_version = Column(String, nullable=True) timestamp_utc = Column(DateTime, nullable=False, default=datetime.utcnow, index=True) created_at = Column(DateTime, nullable=False, default=datetime.utcnow) Index( "ix_decision_events_user_created_at", DecisionEvent.user_node_id, DecisionEvent.created_at, ) class FeedbackEvent(Base): __tablename__ = "feedback_events" id = Column(Integer, primary_key=True) request_id = Column(String, nullable=True, index=True) user_node_id = Column(Integer, ForeignKey("nodes.id"), nullable=False, index=True) feedback_id = Column(String, nullable=True, unique=True) predicted_decision = Column(String, nullable=True) feedback_type = Column(String, nullable=False) correct_decision = Column(String, nullable=True) free_text = Column(Text, nullable=True) preference_updates_json = Column(Text, nullable=False, default="[]") graph_update_summary_json = Column(Text, nullable=False, default="{}") timestamp_utc = Column(DateTime, nullable=False, default=datetime.utcnow, index=True) applied_to_graph = Column(Boolean, nullable=False, default=False) created_at = Column(DateTime, nullable=False, default=datetime.utcnow) Index( "ix_feedback_events_user_created_at", FeedbackEvent.user_node_id, FeedbackEvent.created_at, ) class TrainingSample(Base): __tablename__ = "training_samples" id = Column(Integer, primary_key=True) decision_event_id = Column( Integer, ForeignKey("decision_events.id"), nullable=False, index=True, ) feedback_event_id = Column( Integer, ForeignKey("feedback_events.id"), nullable=True, index=True, ) user_node_id = Column(Integer, ForeignKey("nodes.id"), nullable=False, index=True) label_action = Column(String, nullable=False) sample_payload_json = Column(Text, nullable=False, default="{}") feature_vector_json = Column(Text, nullable=False, default="{}") split = Column(String, nullable=True) sample_source = Column(String, nullable=False, default="feedback_builder_v1") created_at = Column(DateTime, nullable=False, default=datetime.utcnow) Index( "ix_training_samples_user_created_at", TrainingSample.user_node_id, TrainingSample.created_at, )