File size: 5,138 Bytes
22c3c8b
0f3029a
22c3c8b
a4f8f3c
22c3c8b
14960e0
22c3c8b
 
0f3029a
14960e0
 
0f3029a
701cf99
0f3029a
 
 
 
 
 
 
 
14960e0
0f3029a
 
 
 
 
 
 
 
14960e0
0f3029a
 
 
 
 
 
 
 
4cd385a
 
0f3029a
d4a3aba
 
0f3029a
14960e0
4cd385a
 
0f3029a
add112f
4cd385a
0f3029a
1c67908
 
0f3029a
14960e0
4cd385a
0f3029a
4cd385a
0f3029a
4cd385a
 
0f3029a
4cd385a
0f3029a
4cd385a
0f3029a
 
 
 
 
 
4cd385a
 
 
 
 
 
 
927fdad
0f3029a
 
927fdad
0f3029a
 
927fdad
0f3029a
 
 
 
 
 
 
 
 
 
 
 
 
 
a4f8f3c
 
7b8e752
1c67908
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a4f8f3c
7b8e752
 
 
1c67908
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7b8e752
 
 
a4f8f3c
7b8e752
 
 
 
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import os
import uuid
import duckdb
import pandas as pd
from dotenv import load_dotenv
from datetime import datetime, timedelta, timezone

load_dotenv()

est_offset = timedelta(hours=-4)

# Connect to the DuckDB database
conn = duckdb.connect(f"md:?motherduck_token={os.getenv('MOTHERDUCK_TOKEN')}")

# Utility functions for interacting with the database
def create_session(user_id):
    session_id = str(uuid.uuid4())
    query = """
    INSERT INTO SESSIONS (session_id, user_id, session_start)
    VALUES (?, ?, ?)
    """
    conn.execute(query, (session_id, user_id, datetime.now(timezone(est_offset))))
    return session_id

def end_session(session_id):
    query = """
    UPDATE SESSIONS
    SET session_end = ?
    WHERE session_id = ?
    """
    conn.execute(query, (datetime.now(timezone(est_offset)), session_id))

def get_user_sessions(user_id):
    query = """
    SELECT * FROM SESSIONS
    WHERE user_id = ?
    """
    return conn.execute(query, (user_id,)).fetchdf()

def add_response(session_id, user_id, user_input_text, response_text):
    response_id = str(uuid.uuid4())
    query = """
    INSERT INTO RESPONSES (response_id, session_id, user_id, user_input_text, response_text, created_at)
    VALUES (?, ?, ?, ?, ?, ?)
    """
    conn.execute(query, (response_id, session_id, user_id, user_input_text, response_text, datetime.now(timezone(est_offset))))
    return response_id


def add_agent_response(response_id, agent_name, user_input, agent_response_text):
    agent_response_id = str(uuid.uuid4())
    query = """
    INSERT INTO AGENT_RESPONSES (agent_response_id, response_id, agent_name, user_input, agent_response_text, created_at)
    VALUES (?, ?, ?, ?, ?, ?)
    """
    conn.execute(query, (agent_response_id, response_id, agent_name, user_input, agent_response_text, datetime.now(timezone(est_offset))))
    return agent_response_id

def get_response(response_id):
    query = """
    SELECT * FROM RESPONSES
    WHERE response_id = ?
    """
    return conn.execute(query, (response_id,)).fetchone()

def get_responses_from_session(session_id):
    query = """
    SELECT * FROM RESPONSES
    WHERE session_id = ?
    """
    return conn.execute(query, (session_id,)).fetchdf()

def get_agent_responses(response_id):
    query = """
    SELECT * FROM AGENT_RESPONSES
    WHERE response_id = ?
    """
    return conn.execute(query, (response_id,)).fetchdf()

def add_feedback(response_id, user_id, feedback_score, feedback_text):
    feedback_id = str(uuid.uuid4())
    query = """
    INSERT INTO FEEDBACK (feedback_id, response_id, user_id, feedback_score, feedback_text)
    VALUES (?, ?, ?, ?, ?)
    """
    conn.execute(query, (feedback_id, response_id, user_id, feedback_score, feedback_text))
    return feedback_id

def get_feedback(response_id):
    query = """
    SELECT * FROM FEEDBACK
    WHERE response_id = ?
    """
    return conn.execute(query, (response_id,)).fetchdf()

def get_user_feedback(user_id):
    query = """
    SELECT * FROM FEEDBACK
    WHERE user_id = ?
    """
    return conn.execute(query, (user_id,)).fetchdf()

def get_session_data(session_id):
    # Query to get the combined data from responses, agent_responses, and feedback
    query = """
    SELECT 
        r.user_input_text AS query, 
        ar.agent_name AS agent, 
        ar.agent_response_text AS response, 
        f.feedback_score AS feedback_score, 
        f.feedback_text AS feedback_text,
        r.created_at AS response_time,
        s.session_start AS session_start,
        s.session_end AS session_end
    FROM 
        RESPONSES r
    JOIN 
        AGENT_RESPONSES ar ON r.response_id = ar.response_id
    LEFT JOIN 
        FEEDBACK f ON r.response_id = f.response_id
    JOIN 
        SESSIONS s ON r.session_id = s.session_id
    WHERE 
        r.session_id = ?
    ORDER BY 
        r.created_at, ar.agent_name;
    """
    
    # Execute the query and fetch results into a DataFrame
    session_df = conn.execute(query, (session_id,)).fetchdf()

    if session_df.empty:
        return pd.DataFrame()

    # Format timestamps
    session_df['response_time'] = session_df['response_time'].apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))
    session_df['session_start'] = session_df['session_start'].apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'))
    session_df['session_end'] = session_df['session_end'].apply(lambda x: x.strftime('%Y-%m-%d %H:%M:%S') if x else "Ongoing")

    # Combine feedback into a single column if available
    session_df['feedback'] = session_df.apply(
        lambda row: f"{row['feedback_score']} - {row['feedback_text']}" if row['feedback_score'] and row['feedback_text'] else None, 
        axis=1
    )
    
    # Drop the separate feedback columns
    session_df = session_df.drop(columns=['feedback_score', 'feedback_text'])

    # Reorder columns for clarity
    session_df = session_df[['query', 'agent', 'response', 'feedback', 'response_time', 'session_start']]

    return session_df


if __name__ == "__main__":
    id = "adec6d43-f4bb-46ab-887c-3a1d492f727f"
    df = get_session_data(id)
    df.to_csv('session_data.csv', index=False)