MedQuery-Assist / chat_handler.py
twissamodi's picture
retrieve and store using user id
9409f90
import json
import uuid
from langgraph.errors import GraphRecursionError
from prompts import REACT_SYSTEM_PROMPT
class ChatHandler:
def __init__(self, graph, rag_setup):
self.graph = graph
self.rag = rag_setup
def chat(self, user_message, uploaded_file, message_history, user_state, session_state):
if not user_state or not session_state:
warning = {
"role": "assistant",
"content": "Please log in and start a session before chatting."
}
return message_history + [warning], user_message, uploaded_file
user_query_parts = []
try:
if user_message and user_message.strip():
user_query_parts.append(user_message)
if uploaded_file is not None:
result = self.rag.store_data(uploaded_file, user_state["user_id"])
result_str = json.dumps(result, indent=2)
user_query_parts.append(f"""A medical document was uploaded. Here are the upload details: {result_str} Please inform the user about the upload status in a friendly, professional way.""")
if not user_query_parts:
return message_history, "", None, None
user_query = (' ').join(user_query_parts)
# Use session_id from session_state instead of self.session_id
thread_id = session_state["session_id"]
config = {"configurable": {"thread_id": thread_id}, "recursion_limit" : 25}
current_state = self.graph.get_state(config)
if not current_state.values.get("messages"):
messages = {
"messages": [
{"role": "system", "content": REACT_SYSTEM_PROMPT},
{"role": "user", "content": user_query}
],
"user_id": user_state["user_id"]
}
else:
messages = {"messages": [{"role": "user", "content": user_query}], "user_id": user_state["user_id"]}
result = self.graph.invoke(
messages,
config=config
)
last_message = result["messages"][-1].content
updated_history = message_history + [
{"role": "user", "content": user_message},
{"role": "assistant", "content": last_message}
]
return updated_history, "", None
except GraphRecursionError:
error_message = "This query is too complex and exceeded the reasoning limit. Please simplify or break it into smaller questions."
return message_history + [
{"role": "assistant", "content": error_message}
], "", None
except Exception as e:
error_message = f"Error: {str(e)}"
return message_history + [
{"role": "assistant", "content": error_message}
], "", None