Ajey95 commited on
Commit
b8c4827
Β·
1 Parent(s): 8e2f4c8

Fix: chat_history addition

Browse files
agents/academic_agent.py CHANGED
@@ -290,13 +290,63 @@ class AcademicAgent:
290
  with open(knowledge_file, 'r') as f: return json.load(f)
291
  except: return {}
292
 
293
- def process_with_ai(self, query, file_context=""):
294
- """Use Gemini AI to provide comprehensive, context-aware answers."""
295
- if not self.model: return None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
296
  try:
297
- # (Content of this method is unchanged)
298
- context_section = f"UPLOADED FILE CONTEXT:\n{file_context}" if file_context else ""
299
- prompt = f"You are an expert pharmacy educator... STUDENT QUESTION: {query}\n{context_section} ..."
300
  response = self.model.generate_content(prompt)
301
  return response.text
302
  except Exception as e:
@@ -335,7 +385,7 @@ class AcademicAgent:
335
 
336
  # --- THIS IS THE ONLY METHOD THAT CHANGES ---
337
 
338
- def process_query(self, query: str, file_context: str = ""):
339
  """
340
  Main method to process academic queries.
341
  It now returns a standardized dictionary.
@@ -344,7 +394,7 @@ class AcademicAgent:
344
  try:
345
  # Priority 1: Use AI for a comprehensive response if available.
346
  if self.model:
347
- ai_response = self.process_with_ai(query, file_context)
348
  if ai_response:
349
  response_message = f"πŸ€– **AI-Powered Response**\n\n{ai_response}"
350
 
 
290
  with open(knowledge_file, 'r') as f: return json.load(f)
291
  except: return {}
292
 
293
+ # def process_with_ai(self, query, file_context=""):
294
+ # """Use Gemini AI to provide comprehensive, context-aware answers."""
295
+ # if not self.model: return None
296
+ # try:
297
+ # # (Content of this method is unchanged)
298
+ # context_section = f"UPLOADED FILE CONTEXT:\n{file_context}" if file_context else ""
299
+ # prompt = f"You are an expert pharmacy educator... STUDENT QUESTION: {query}\n{context_section} ..."
300
+ # response = self.model.generate_content(prompt)
301
+ # return response.text
302
+ # except Exception as e:
303
+ # print(f"Gemini API error in Academic Agent: {e}")
304
+ # return None
305
+ # In agents/academic_agent.py -> class AcademicAgent
306
+
307
+ def process_with_ai(self, query, file_context="", chat_history=None):
308
+ """Use Gemini AI with conversation history and file context."""
309
+ if not self.model:
310
+ return None
311
+
312
+ # --- NEW HISTORY AND PROMPT LOGIC ---
313
+
314
+ # Format the past conversation for the prompt
315
+ history_for_prompt = ""
316
+ if chat_history:
317
+ for turn in chat_history:
318
+ # Ensure 'parts' is a list and not empty before accessing
319
+ if turn.get('parts') and isinstance(turn.get('parts'), list):
320
+ role = "User" if turn['role'] == 'user' else "AI"
321
+ history_for_prompt += f"{role}: {turn['parts'][0]}\n"
322
+
323
+ # Format the file context
324
+ context_section = ""
325
+ if file_context:
326
+ context_section = f"""
327
+ ---
328
+ CONTEXT FROM UPLOADED FILE:
329
+ {file_context}
330
+ ---
331
+ Use the context from the uploaded file above to answer the user's current question if it is relevant.
332
+ """
333
+
334
+ # The new prompt structure
335
+ prompt = f"""You are a helpful and knowledgeable AI pharmacy tutor for a student in India.
336
+
337
+ CONVERSATION HISTORY:
338
+ {history_for_prompt}
339
+ {context_section}
340
+ CURRENT QUESTION:
341
+ User: {query}
342
+
343
+ Please provide a helpful and accurate answer to the user's CURRENT QUESTION.
344
+ - If the question is a follow-up, use the CONVERSATION HISTORY to understand the context.
345
+ - If the question relates to the UPLOADED FILE, prioritize information from that context.
346
+ - Keep the tone encouraging and professional.
347
+ """
348
  try:
349
+ # This is a more direct and robust way to send the complete context
 
 
350
  response = self.model.generate_content(prompt)
351
  return response.text
352
  except Exception as e:
 
385
 
386
  # --- THIS IS THE ONLY METHOD THAT CHANGES ---
387
 
388
+ def process_query(self, query: str, file_context: str = "",chat_history: list = None):
389
  """
390
  Main method to process academic queries.
391
  It now returns a standardized dictionary.
 
394
  try:
395
  # Priority 1: Use AI for a comprehensive response if available.
396
  if self.model:
397
+ ai_response = self.process_with_ai(query, file_context,chat_history)
398
  if ai_response:
399
  response_message = f"πŸ€– **AI-Powered Response**\n\n{ai_response}"
400
 
agents/drug_info_agent.py CHANGED
@@ -32,7 +32,7 @@ class DrugInfoAgent:
32
  # Clean up any extra whitespace
33
  return drug_name.strip().title() # Capitalize for better recognition
34
 
35
- def process_query(self, query: str, file_context: str = ""):
36
  """
37
  Processes a query to retrieve information about a specific drug.
38
 
@@ -84,7 +84,7 @@ Use clear headings (like "πŸ”¬ Mechanism of Action") and bullet points for reada
84
 
85
  try:
86
  # Generate content using the AI model
87
- ai_response = self.model.generate_content(prompt)
88
  return {
89
  'message': ai_response.text,
90
  'agent_used': 'drug_info',
 
32
  # Clean up any extra whitespace
33
  return drug_name.strip().title() # Capitalize for better recognition
34
 
35
+ def process_query(self, query: str, file_context: str = "", chat_history: list = None):
36
  """
37
  Processes a query to retrieve information about a specific drug.
38
 
 
84
 
85
  try:
86
  # Generate content using the AI model
87
+ ai_response = self.model.generate_content(prompt, chat_history)
88
  return {
89
  'message': ai_response.text,
90
  'agent_used': 'drug_info',
agents/mnemonic_agent.py CHANGED
@@ -31,7 +31,7 @@ class MnemonicAgent:
31
  # Clean up any extra whitespace
32
  return topic.strip()
33
 
34
- def process_query(self, query: str, file_context: str = ""):
35
  """
36
  Processes a query to generate a mnemonic.
37
 
@@ -98,7 +98,7 @@ Keep up the great work! You've got this! πŸ’ͺ
98
 
99
  try:
100
  # Generate content using the AI model
101
- ai_response = self.model.generate_content(prompt)
102
  return {
103
  'message': ai_response.text,
104
  'agent_used': 'mnemonic_creation',
 
31
  # Clean up any extra whitespace
32
  return topic.strip()
33
 
34
+ def process_query(self, query: str, file_context: str = "",chat_history: list = None):
35
  """
36
  Processes a query to generate a mnemonic.
37
 
 
98
 
99
  try:
100
  # Generate content using the AI model
101
+ ai_response = self.model.generate_content(prompt,chat_history)
102
  return {
103
  'message': ai_response.text,
104
  'agent_used': 'mnemonic_creation',
agents/quiz_agent.py CHANGED
@@ -32,7 +32,7 @@ class QuizAgent:
32
  # Clean up any extra whitespace
33
  return topic.strip()
34
 
35
- def process_query(self, query: str, file_context: str = ""):
36
  """
37
  Processes a query to generate a quiz. The agent prioritizes file_context if provided.
38
 
@@ -103,7 +103,7 @@ Let's test your knowledge! Good luck! 🌟
103
 
104
  try:
105
  # Generate content using the AI model
106
- ai_response = self.model.generate_content(prompt)
107
  return {
108
  'message': ai_response.text,
109
  'agent_used': 'quiz_generation',
 
32
  # Clean up any extra whitespace
33
  return topic.strip()
34
 
35
+ def process_query(self, query: str, file_context: str = "",chat_history: list = None):
36
  """
37
  Processes a query to generate a quiz. The agent prioritizes file_context if provided.
38
 
 
103
 
104
  try:
105
  # Generate content using the AI model
106
+ ai_response = self.model.generate_content(prompt, chat_history)
107
  return {
108
  'message': ai_response.text,
109
  'agent_used': 'quiz_generation',
agents/router_agent.py CHANGED
@@ -295,7 +295,7 @@ class RouterAgent:
295
  self.viva_agent = VivaAgent(gemini_model)
296
  self.default_agent = self.academic_agent
297
 
298
- def route_query(self, query: str, file_context: str = "", viva_state: dict = None):
299
  """
300
  Determines the user's intent and routes the query to the correct agent.
301
 
@@ -336,4 +336,4 @@ class RouterAgent:
336
 
337
  # 5. Default to Academic Agent
338
  # If no other intent is detected, it's likely a general academic question.
339
- return self.academic_agent.process_query(query, file_context)
 
295
  self.viva_agent = VivaAgent(gemini_model)
296
  self.default_agent = self.academic_agent
297
 
298
+ def route_query(self, query: str, file_context: str = "", viva_state: dict = None, chat_history: list = None):
299
  """
300
  Determines the user's intent and routes the query to the correct agent.
301
 
 
336
 
337
  # 5. Default to Academic Agent
338
  # If no other intent is detected, it's likely a general academic question.
339
+ return self.academic_agent.process_query(query, file_context,chat_history)
app.py CHANGED
@@ -443,7 +443,7 @@ class MyPharmaAI:
443
  self.quotes = load_quotes()
444
  self.file_processor = FileProcessor()
445
 
446
- def process_query(self, query, user_name="Student", viva_state=None, uploaded_files=None):
447
  """Routes a user's query to the appropriate agent, handling context."""
448
  try:
449
  file_context = ""
@@ -454,7 +454,7 @@ class MyPharmaAI:
454
  print(f"--- DEBUG: Here is the text extracted from the file ---\n{file_context[:1000]}\n--- END DEBUG ---")
455
 
456
  # Pass all context to the router
457
- response_data = self.router.route_query(query, file_context, viva_state)
458
 
459
  return {
460
  'success': True,
@@ -512,13 +512,28 @@ def chat():
512
  query = data.get('query', '').strip()
513
  if not query:
514
  return jsonify({'success': False, 'error': 'Empty query'}), 400
 
 
 
 
 
515
 
516
  # Get current viva state from session for the Viva Agent
517
  viva_state = session.get('viva_state', None)
518
  uploaded_files = session.get('uploaded_files', None)
519
 
520
  # Process the query through the main orchestrator
521
- result = pharma_ai.process_query(query, viva_state=viva_state, uploaded_files=uploaded_files)
 
 
 
 
 
 
 
 
 
 
522
 
523
  # If the Viva agent returns an updated state, save it to the session
524
  if 'viva_state' in result:
 
443
  self.quotes = load_quotes()
444
  self.file_processor = FileProcessor()
445
 
446
+ def process_query(self, query, user_name="Student", viva_state=None, uploaded_files=None,chat_history=None):
447
  """Routes a user's query to the appropriate agent, handling context."""
448
  try:
449
  file_context = ""
 
454
  print(f"--- DEBUG: Here is the text extracted from the file ---\n{file_context[:1000]}\n--- END DEBUG ---")
455
 
456
  # Pass all context to the router
457
+ response_data = self.router.route_query(query, file_context, viva_state, chat_history)
458
 
459
  return {
460
  'success': True,
 
512
  query = data.get('query', '').strip()
513
  if not query:
514
  return jsonify({'success': False, 'error': 'Empty query'}), 400
515
+
516
+ # --- HISTORY MANAGEMENT START ---
517
+
518
+ # Get the conversation history from the session (or start a new one)
519
+ chat_history = session.get('chat_history', [])
520
 
521
  # Get current viva state from session for the Viva Agent
522
  viva_state = session.get('viva_state', None)
523
  uploaded_files = session.get('uploaded_files', None)
524
 
525
  # Process the query through the main orchestrator
526
+ result = pharma_ai.process_query(query, viva_state=viva_state, uploaded_files=uploaded_files,chathistory=chat_history)
527
+ # If the query was successful, update the history
528
+ if result.get('success'):
529
+ # Add the user's query and the AI's message to the history
530
+ chat_history.append({'role': 'user', 'parts': [query]})
531
+ chat_history.append({'role': 'model', 'parts': [result.get('message', '')]})
532
+
533
+ # Keep the history from getting too long (e.g., last 10 exchanges)
534
+ session['chat_history'] = chat_history[-20:]
535
+
536
+ # --- HISTORY MANAGEMENT END ---
537
 
538
  # If the Viva agent returns an updated state, save it to the session
539
  if 'viva_state' in result: