Module Cœur (mirza.core)¶
Le module mirza.core fournit les deux composants transversaux fondamentaux de la plateforme :
la gestion de la mémoire unifiée Apple Silicon et le filtrage de texte en streaming temps réel.
Gestionnaire de Mémoire Unifiée (MemoryManager)¶
Important
MemoryManager utilise l’API C++ Metal exposée par MLX pour interroger directement
la consommation en Unified Memory. Ces métriques sont propres à Apple Silicon et ne sont
pas disponibles sur d’autres architectures.
Méthode |
Description |
|---|---|
|
Configure les limites Metal et les préférences de cache MLX |
|
Retourne |
|
Libère les caches Metal et déclenche |
Module de supervision et d’optimisation de la memoire unifiee Apple Silicon (UMA). Permet de controler les allocations Metal MLX et de surveiller l’empreinte RAM/VRAM.
- mirza.core.memoryManager.PURGE_MIN_INTERVAL_SECONDS = 15.0¶
Intervalle minimal entre deux purges automatiques.
- class mirza.core.memoryManager.MemoryManager[source]¶
Bases :
objectGestionnaire centralise de la memoire unifiee (RAM CPU + VRAM Metal GPU) pour Apple Silicon.
Sur les SoC Apple (M1/M2/M3/M4), le CPU et le GPU partagent le meme espace physique de memoire vive unifiee. Module interroge les compteurs du framework MLX (Metal C++) et de psutil pour une telemetrie precise, et declenche la liberation proactive des allocations non utilisees.
- static initializeEnvironment(vramLimitBytes=17179869184, cacheLimit=0, mtplxPort=0, purgeThresholdGb=0.0)[source]¶
Configure les limites materielles Metal MLX pour empecher tout debordement de cache.
- Paramètres:
vramLimitBytes (
int, optional) – Limite maximale d’allocation Metal en octets. Defaut : 16 Go (16 * 1024**3).cacheLimit (
int, optional) – Limite de mise en cache Metal. Defaut : 0, ce qui evite la retention prolongee de tenseurs temporaires.mtplxPort (
int, optional) – Port du daemon MTPLX. 0 desactive l’appel de vidage de cache.purgeThresholdGb (
float, optional) – Seuil de RSS declenchant une purge automatique. Defaut : 80 % de la limite memoire unifiee.
- Type renvoyé:
None
- static getGpuUtilization()[source]¶
Interroge l’IOAccelerator via ioreg pour la charge GPU Metal.
- Renvoie:
Pourcentage d’utilisation, ou 0 si la lecture echoue.
- Type renvoyé:
- classmethod getMemorySnapshot()[source]¶
Capture un instantane exhaustif de l’etat memoire UMA sur Apple Silicon.
- Renvoie:
Dictionnaire contenant les metriques memoire cles.
- Type renvoyé:
dict[str,float]
- classmethod displayMemoryProfile(stepName='Actuelle')[source]¶
Affiche dans le logger l’empreinte memoire formatee et lisible.
- Paramètres:
stepName (
str, optional) – Nom de l’etape de cycle de vie. Defaut : « Actuelle ».- Type renvoyé:
None
- classmethod shouldPurge()[source]¶
Indique si la memoire est sous une pression qui justifie une purge.
La purge n’est gratuite ni en temps ni en cache :
mx.clear_cache()jette les tampons reutilises par Metal, ce qui oblige a les reconstruire au tour suivant. On ne purge donc que lorsqu’il y a vraiment lieu, et au plus une fois par intervalle.- Renvoie:
True s’il faut liberer maintenant.
- Type renvoyé:
- classmethod purgeMemory(force=False)[source]¶
Libere les caches Metal et execute le ramasse-miettes Python.
- Paramètres:
force (
bool, optional) – Si False (defaut), ne purge que sous pression memoire reelle. Si True, purge inconditionnellement, comme le demande un arret ou une action explicite de l’utilisateur.- Type renvoyé:
None
Filtre de Texte en Streaming (StreamingTextFilter)¶
Le StreamingTextFilter est le composant central de séparation des canaux.
Il analyse le flux de tokens LLM au fur et à mesure de leur génération
et dirige chaque fragment vers le bon canal de sortie.
Type de fragment |
Balises détectées |
Destination |
|---|---|---|
Pensée CoT |
|
|
Résultat agentique |
|
|
Voix épurée |
Tout le reste |
Retourné comme chaîne par |
Note
Le filtre est conçu pour être sans état inter-tours : il maintient un buffer interne minimaliste de 12 à 15 caractères pour gérer les balises coupées entre deux chunks consécutifs.
Module facade pour le nettoyage de texte, le filtrage de flux et les parseurs.
Re-exporte les composants scindes vers : - mirza.core.textNormalizer : normalisation phonetique et nettoyage TTS (TextCleaner) - mirza.core.streamParsers : parseurs de flux temps reel (StreamingTextFilter, FinalAnswerStreamParser)
- class mirza.core.textCleaner.FinalAnswerStreamParser(on_speech_chunk, on_thought_chunk=None)[source]¶
Bases :
objectParseur temps reel des tokens du LLM lors de l’etape de synthese agentique smolagents.
- __init__(on_speech_chunk, on_thought_chunk=None)[source]¶
Initialise le parseur de tokens agentiques.
- Paramètres:
on_speech_chunk (
Callable[[str],None]) – Fonction appelee avec les morceaux de texte oral detectes.on_thought_chunk (
Callable[[str],None] | None, optional) – Fonction appelee avec les morceaux de raisonnement ou appels d’outils.
- Type renvoyé:
None
- process_chunk(chunk)[source]¶
Analyse un jeton du flux agentique pour detecter la reponse finale.
- Paramètres:
chunk (
str) – Jeton ou bloc textuel emis par le LLM lors de l’appel de final_answer.- Type renvoyé:
None
- class mirza.core.textCleaner.StreamingTextFilter(onThought=None, onResultDoc=None, onDocActive=None, maxThoughtTokens=0, initialThinkingActive=False)[source]¶
Bases :
objectFiltre en flux continu les balises XML/Markdown et les blocs de pensee.
Isole en temps reel les flux CoT, les documents riches et le texte parlable.
- Paramètres:
- __init__(onThought=None, onResultDoc=None, onDocActive=None, maxThoughtTokens=0, initialThinkingActive=False)[source]¶
Initialise les tampons et callbacks du filtre de flux textuel.
- Paramètres:
onThought (
Callable[[str],None] | None, optional) – Fonction appelee a chaque token de pensee CoT detecte.onResultDoc (
Callable[[str],None] | None, optional) – Fonction appelee avec le contenu documentaire extrait des balises <result>, <code> ou <code_view>.onDocActive (
Callable[[bool],None] | None, optional) – Fonction appelee avec un booleen signalant le debut/fin de generation d’un bloc de resultat/code.maxThoughtTokens (
int, optional) – Nombre maximum de tokens de reflexion autorises. Defaut : 0.initialThinkingActive (
bool, optional) – True si le LLM demarre directement en mode pensee, sans balise ouvrante explicite. Defaut : False.
- Type renvoyé:
None
- class mirza.core.textCleaner.TextCleaner[source]¶
Bases :
objectUtilitaire de nettoyage et de normalisation textuelle pour STT, LLM et TTS.
- noisePhrases: ClassVar[set[str]] = {'.', '..', '...', 'D.D.', 'DD', 'Euh', 'Merci.', 'Sous-titrage', 'Sous-titres', 'Sous-titres réalisés par', 'Transcrit par', 'd.d.', 'dd', 'euh'}¶
- EMOJI_PATTERN = re.compile('[\\U00010000-\\U0010ffff\\u2600-\\u26ff\\u2700-\\u27bf\\ufe00-\\ufe0f\\u200d]+')¶
- classmethod stripEmojis(text)[source]¶
Supprime tous les emojis et pictogrammes d’une chaine de caracteres.
- classmethod cleanSttText(text)[source]¶
Nettoie et assainit le texte transcrit par le moteur STT.
Deduplonne les begaiements acoustiques de l’ASR (ex: “de de”, “propos propos”) sans toucher aux formes pronominales (“nous nous”, “vous vous”), puis normalise espaces et ponctuations multiples.
Mémoire Épisodique & RAG (EpisodicMemoryStore)¶
Le EpisodicMemoryStore gère l’archivage vectoriel local persistant avec SQLite-vec,
les embeddings locaux vectoriels et le reclassement par rang réciproque (RRF)
combiné avec la recherche lexicale SQLite FTS5.
Memoire episodique et semantique de Mirza : RAG local, hybride, reranked RRF.
Combine SQLite (relationnel + vectoriel sqlite-vec), FastEmbed et la fusion de rangs reciproques (Reciprocal Rank Fusion) pour un enrichissement contextuel de moins de 4 ms d’overhead par tour.
- class mirza.core.episodicMemory.EpisodicMemoryStore(dbPath='mirza/data/memory.db', embeddingModel='sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2', embeddingDim=384, similarityThreshold=0.1, maxContextTokens=600, topKRetrieval=8, topKRerank=2)[source]¶
Bases :
objectGestionnaire de base de donnees vectorielle et relationnelle locale pour Mirza.
Indexe des souvenirs episodiques (tours de conversation, faits cles, resumes) et recupere les contextes les plus pertinents par reranking hybride (dense + BM25, fusion RRF).
- Paramètres:
dbPath (
str, optional) – Chemin vers le fichier de base SQLite. Defaut : « mirza/data/memory.db ».embeddingModel (
str, optional) – Identifiant HuggingFace du modele d’embedding. Defaut : « sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 ».embeddingDim (
int, optional) – Dimension des vecteurs d’embedding dense. Defaut : 384.similarityThreshold (
float, optional) – Score cosinus minimum (1 - dist) pour juger un souvenir pertinent. Defaut : 0.35.maxContextTokens (
int, optional) – Nombre maximal approximatif de tokens injectes dans le prompt. Defaut : 600.topKRetrieval (
int, optional) – Nombre de candidats extraits par source (dense et sparse). Defaut : 8.topKRerank (
int, optional) – Nombre final de souvenirs retenus apres fusion RRF. Defaut : 2.
- __init__(dbPath='mirza/data/memory.db', embeddingModel='sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2', embeddingDim=384, similarityThreshold=0.1, maxContextTokens=600, topKRetrieval=8, topKRerank=2)[source]¶
- warmUp()[source]¶
Prechauffe le modele d’embedding ONNX pour eliminer tout surcout au premier tour.
- Type renvoyé:
None
- storeTurn(userInput, assistantResponse, summary=None, metadata=None)[source]¶
Archive un tour de conversation complet dans la memoire a long terme.
- Paramètres:
- Renvoie:
Identifiant entier de la ligne inseree ou None en cas d’echec.
- Type renvoyé:
int | None
- retrieveRelevantContext(query, topK=None)[source]¶
Recherche semantique hybride (Dense cosine distance sqlite-vec + Lexical BM25 FTS5).
- Paramètres:
query (
str) – Requete ou invite textuelle pour la recherche semantique.topK (
int | None, optional) – Nombre de candidats extraits par canal. Defaut : None, ce qui utilisetopKRetrieval.
- Renvoie:
Liste des souvenirs ordonnes par score RRF decroissant.
- Type renvoyé:
list[dict[str,Any]]
- reindexAll()[source]¶
Recalcule tous les vecteurs pour realigner la memoire sur le modele d’embedding courant.
- Renvoie:
Nombre de souvenirs reindexes.
- Type renvoyé:
- formatMemoryContext(query)[source]¶
Recupere les contextes pertinents et les formate pour injection dans le prompt.
- count()[source]¶
Retourne le nombre total de souvenirs archives.
- Renvoie:
Nombre d’enregistrements en base.
- Type renvoyé:
- mirza.core.episodicMemory.EpisodicMemory¶
alias de
EpisodicMemoryStore