"""
Outils memoire de l'agent.
Les docstrings des fonctions de Module restent au format Google, pas numpy :
smolagents n'analyse que Google pour construire le schema JSON de chaque outil
(_parse_google_format_docstring). Passer une seule d'entre elles en numpy fait
lever DocstringParsingException a l'import. Ne pas uniformiser.
"""
from __future__ import annotations
from datetime import UTC, datetime
from typing import Any
from smolagents import tool
[docs]
class MemoryToolContext:
"""
Conteneur de contexte pour acceder au magasin de memoire.
Evite une variable globale brute pour le magasin actif.
"""
activeStore: Any = None
[docs]
@classmethod
def setStore(cls, store: Any) -> None:
"""
Associe le magasin de memoire episodique actif.
Parameters
----------
store : Any
Instance d'EpisodicMemoryStore.
"""
cls.activeStore = store
[docs]
@classmethod
def getStore(cls) -> Any:
"""
Recupere le magasin de memoire actif ou en initialise un par defaut.
Returns
-------
Any
Instance du gestionnaire de memoire episodique.
"""
if cls.activeStore is None:
from ....core.episodicMemory import EpisodicMemoryStore
cls.activeStore = EpisodicMemoryStore()
return cls.activeStore
[docs]
def setActiveMemoryStore(store: Any) -> None:
"""
Enregistre le magasin de memoire episodique actif pour l'outil recall_memory.
Parameters
----------
store : Any
Instance de gestion de la memoire vectorielle episodique.
"""
MemoryToolContext.setStore(store)
@tool
def recall_memory(query: str) -> str:
"""
Recherche dans la memoire episodique et les conversations passees de Mirza.
Utilise cet outil lorsque l'utilisateur demande de se rappeler d'un fait passe, d'un rendez-vous, d'un projet, d'un choix ou d'une recherche anterieure.
Args:
query: Mots-cles ou question resumant ce qu'il faut retrouver dans l'historique (ex: 'rendez-vous dentiste', 'choix de framework', 'code python ecrit hier').
"""
try:
mem = MemoryToolContext.getStore()
res = mem.retrieveRelevantContext(query=query, topK=4)
if not res:
return "Aucun souvenir correspondant trouve dans la memoire episodique."
chunks = []
for i, item in enumerate(res, 1):
chunks.append(f"Souvenir {i} :\n- Utilisateur : {item['userInput']}\n- Mirza : {item['assistantResponse']}")
return "\n\n".join(chunks)
except Exception as e:
return f"Erreur lors de l'acces a la memoire episodique : {e}"
@tool
def save_memory(content: str, category: str = "recherche") -> str:
"""
Enregistre explicitement une information, un fait cle, une decouverte ou une note dans la memoire episodique / RAG de Mirza.
Utilise cet outil pour memoriser les resultats de recherche importants, des faits precis sur un sujet, ou une information que l'utilisateur souhaite retenir pour de futures conversations.
Args:
content: Le texte de l'information ou du fait a memoriser (doit etre clair, precis et factuel).
category: Theme ou categorie optionnelle (ex: 'recherche', 'preference', 'technique', 'projet').
"""
clean = content.strip()
if not clean:
return "Aucun contenu a enregistrer."
try:
mem = MemoryToolContext.getStore()
now_str = datetime.now(UTC).astimezone().strftime("%Y-%m-%d %H:%M")
u_label = f"Memorisation agent [{category}] ({now_str})"
mem_id = mem.storeTurn(userInput=u_label, assistantResponse=clean, summary=f"Categorie: {category}")
if mem_id is not None:
return f"Information memorisee avec succes dans la memoire episodique (ID: {mem_id})."
return "Echec de l'enregistrement en memoire."
except Exception as e:
return f"Erreur lors de l'enregistrement en memoire : {e}"