Spaces:
Sleeping
Sleeping
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) |