3333from app .services .query_reformulator import reformulate_query
3434
3535
36+ def cleanup_previous_unfeedback_qa (conversation_key , current_message_ts , session_data ):
37+ """Delete previous Q&A pair if no feedback received"""
38+ try :
39+ previous_message_ts = session_data .get ("latest_message_ts" )
40+ if not previous_message_ts or previous_message_ts == current_message_ts :
41+ return
42+
43+ # Check if previous Q&A has any feedback
44+ feedback_exists = check_feedback_exists (conversation_key , previous_message_ts )
45+
46+ if not feedback_exists :
47+ # Delete unfeedback Q&A pair for privacy
48+ previous_qa_key = f"qa#{ conversation_key } #{ previous_message_ts } "
49+ table .delete_item (Key = {"pk" : previous_qa_key , "sk" : "turn" })
50+ logger .info ("Deleted unfeedback Q&A for privacy" , extra = {"message_ts" : previous_message_ts })
51+
52+ except Exception as e :
53+ logger .error ("Error cleaning up unfeedback Q&A" , extra = {"error" : str (e )})
54+
55+
56+ def check_feedback_exists (conversation_key , message_ts ):
57+ """Check if any feedback exists for this Q&A pair"""
58+ try :
59+ response = table .query (
60+ KeyConditionExpression = "pk = :pk" ,
61+ ExpressionAttributeValues = {":pk" : f"feedback#{ conversation_key } #{ message_ts } " },
62+ Limit = 1 ,
63+ )
64+ return len (response .get ("Items" , [])) > 0
65+ except Exception :
66+ return False
67+
68+
3669def store_qa_pair (conversation_key , user_query , bot_response , message_ts , session_id , user_id ):
3770 """
3871 Store Q&A pair for feedback correlation
@@ -105,7 +138,8 @@ def process_async_slack_event(slack_event_data):
105138 reformulated_query = reformulate_query (logger , user_query )
106139
107140 # check if we have an existing conversation
108- session_id = get_conversation_session (conversation_key )
141+ session_data = get_conversation_session_data (conversation_key )
142+ session_id = session_data .get ("session_id" ) if session_data else None
109143
110144 # Query the knowledge base with reformulated query
111145 kb_response = query_bedrock (reformulated_query , session_id )
@@ -131,6 +165,8 @@ def process_async_slack_event(slack_event_data):
131165 message_ts ,
132166 )
133167 elif session_id :
168+ # Clean up previous unfeedback Q&A before storing new one
169+ cleanup_previous_unfeedback_qa (conversation_key , message_ts , session_data )
134170 # Update existing session with latest message timestamp
135171 update_session_latest_message (conversation_key , message_ts )
136172
@@ -364,11 +400,19 @@ def get_conversation_session(conversation_key):
364400 """
365401 Get existing Bedrock session for this conversation
366402 """
403+ session_data = get_conversation_session_data (conversation_key )
404+ return session_data .get ("session_id" ) if session_data else None
405+
406+
407+ def get_conversation_session_data (conversation_key ):
408+ """
409+ Get full session data for this conversation
410+ """
367411 try :
368412 response = table .get_item (Key = {"pk" : conversation_key , "sk" : SESSION_SK })
369413 if "Item" in response :
370414 logger .info ("Found existing session" , extra = {"conversation_key" : conversation_key })
371- return response ["Item" ][ "session_id" ]
415+ return response ["Item" ]
372416 return None
373417 except Exception as e :
374418 logger .error ("Error getting session" , extra = {"error" : str (e )})
0 commit comments