history.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # Gérer le chargement et la sauvegarde de l'historique des conversations.
  2. import os
  3. import json
  4. from logger import logger
  5. from config import CONVERSATION_HISTORY_FILE, PERSONALITY_PROMPT
  6. # Variable globale pour l'historique des conversations
  7. conversation_history = []
  8. # Constantes pour les limites de l'historique
  9. STANDARD_HISTORY_LIMIT = 150
  10. IMAGE_ANALYSIS_HISTORY_LIMIT = 15
  11. IMAGE_ANALYSIS_MARKER = "__IMAGE_ANALYSIS__:"
  12. def load_conversation_history():
  13. global conversation_history
  14. if os.path.isfile(CONVERSATION_HISTORY_FILE):
  15. try:
  16. with open(CONVERSATION_HISTORY_FILE, 'r', encoding='utf-8') as f:
  17. loaded_history = json.load(f)
  18. # Exclure le PERSONALITY_PROMPT
  19. filtered_history = [
  20. msg for msg in loaded_history
  21. if not (msg.get("role") == "system" and msg.get("content") == PERSONALITY_PROMPT)
  22. ]
  23. # Modifier la liste en place
  24. conversation_history.clear()
  25. conversation_history.extend(filtered_history)
  26. logger.info(f"Historique chargé depuis {CONVERSATION_HISTORY_FILE} : {len(loaded_history)} messages, {len(conversation_history)} après filtrage.")
  27. except Exception as e:
  28. logger.error(f"Erreur lors du chargement de l'historique : {e}")
  29. conversation_history = []
  30. else:
  31. logger.info(f"Aucun fichier d'historique trouvé. Un nouveau fichier sera créé à {CONVERSATION_HISTORY_FILE}")
  32. def save_conversation_history():
  33. try:
  34. with open(CONVERSATION_HISTORY_FILE, 'w', encoding='utf-8') as f:
  35. json.dump(conversation_history, f, ensure_ascii=False, indent=4)
  36. except Exception as e:
  37. logger.error(f"Erreur lors de la sauvegarde de l'historique : {e}")
  38. async def add_to_conversation_history(new_message):
  39. global conversation_history
  40. # Ne pas ajouter le PERSONALITY_PROMPT à l'historique
  41. if new_message.get("role") == "system" and new_message.get("content") == PERSONALITY_PROMPT:
  42. logger.debug("PERSONALITY_PROMPT système non ajouté à l'historique.")
  43. return
  44. is_image_analysis = new_message.get("role") == "system" and new_message.get("content", "").startswith(IMAGE_ANALYSIS_MARKER)
  45. if is_image_analysis:
  46. # Supprimer toutes les analyses d'images précédentes
  47. before_count = len(conversation_history)
  48. conversation_history = [
  49. msg for msg in conversation_history
  50. if not (msg.get("role") == "system" and msg.get("content", "").startswith(IMAGE_ANALYSIS_MARKER))
  51. ]
  52. after_count = len(conversation_history)
  53. if before_count != after_count:
  54. logger.info("Les analyses d'images précédentes ont été supprimées avant d'ajouter la nouvelle analyse.")
  55. # Ajouter le nouveau message
  56. conversation_history.append(new_message)
  57. logger.debug(f"Message ajouté à l'historique. Taille actuelle : {len(conversation_history)}")
  58. # Si le message ajouté est une analyse d'image, rien de plus à faire
  59. if is_image_analysis:
  60. pass
  61. else:
  62. # Vérifier et supprimer les analyses d'images dépassées
  63. # Parcourir l'historique pour trouver les analyses d'images
  64. indices_to_remove = []
  65. for i, msg in enumerate(conversation_history):
  66. if msg.get("role") == "system" and msg.get("content", "").startswith(IMAGE_ANALYSIS_MARKER):
  67. # Calculer le nombre de messages après cette analyse
  68. messages_after = len(conversation_history) - i - 1
  69. if messages_after >= IMAGE_ANALYSIS_HISTORY_LIMIT:
  70. indices_to_remove.append(i)
  71. # Supprimer les analyses d'images identifiées
  72. for i in reversed(indices_to_remove):
  73. del conversation_history[i]
  74. logger.info(f"Analyse d'image à l'index {i} supprimée après {IMAGE_ANALYSIS_HISTORY_LIMIT} nouveaux messages.")
  75. # Limiter l'historique à STANDARD_HISTORY_LIMIT messages
  76. if len(conversation_history) > STANDARD_HISTORY_LIMIT:
  77. excess_messages = len(conversation_history) - STANDARD_HISTORY_LIMIT
  78. conversation_history = conversation_history[excess_messages:]
  79. logger.debug(f"{excess_messages} messages les plus anciens ont été supprimés pour maintenir l'historique à {STANDARD_HISTORY_LIMIT} messages.")
  80. save_conversation_history()