File size: 3,490 Bytes
b38f323
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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,
)