Dona: un assistant personnel agentique, local d'abord
Résumé
Dona répond à partir de données personnelles: documents Google Drive, agendas, et compte bancaire professionnel. L'architecture est local-first: les documents, le retrieval, les embeddings et la vision restent sur la machine via Ollama; seules les demandes sensibles passent par une branche dédiée s'appuyant sur des modèles open-weights hébergés en Europe, où chaque écriture exige une confirmation humaine explicite. Les citations des réponses sont validées par le code, pas par le modèle.
01Le problème
Un assistant utile doit connaître vos documents, vos agendas, vos finances. Les assistants cloud imposent d'envoyer tout cela à un tiers. Dona explore une autre voie: garder le maximum sur la machine, et n'accorder à chaque demande que le niveau de capacité, et d'exposition, qu'elle exige réellement.
Le second problème est la fiabilité: un assistant qui invente n'est pas un assistant. Chaque affirmation de Dona doit pouvoir être tracée jusqu'à sa source, et chaque action sensible doit être approuvée avant d'être exécutée.
02L'architecture: un routeur, trois branches
Chaque question est d'abord routée par un petit modèle qui répond en un mot. Trois branches: la conversation légère (modèle local, sans outils), l'agent local (documents et agendas, via Ollama), et l'agent critique (bancaire, sur des modèles open-weights hébergés en Europe). En cas de doute, le routeur choisit la branche critique; en cas de panne du routeur, tout retombe sur la branche locale, le mode dégradé reste fonctionnel hors ligne.
03Ingestion et retrieval
Les documents Drive sont transcrits en Markdown, les PDF page par page par un modèle de vision local, puis découpés en suivant leurs titres et indexés dans Chroma. L'ingestion est incrémentale: seuls les fichiers modifiés sont retraités, et les anciens chunks ne sont supprimés qu'une fois les nouveaux construits.
Le retrieval combine recherche dense (embeddings locaux) et lexicale (BM25 avec tokenisation française: accents, stopwords, stemming), fusionnées par Reciprocal Rank Fusion. L'agent peut soumettre plusieurs reformulations d'une même question, chaque paire question-méthode produisant son propre classement avant fusion. Toute la couche est déterministe: aucun LLM dans le chemin de recherche.
04Les outils
- Documents: l'outil de recherche renvoie des extraits identifiés, et transporte les métadonnées de sources dans un canal séparé qui ne passe jamais par le LLM.
- Agendas Google (MCP): deux comptes, chacun épinglé par configuration pour que le modèle ne puisse pas interroger l'autre; la création d'événement exige une confirmation, la modification et la suppression sont hors liste blanche.
- Banque, via le MCP officiel Qonto (OAuth): 59 outils en liste blanche: 31 lectures libres, et 28 écritures qui exigent toutes une confirmation humaine affichant les arguments réels de l'appel. Les 3 outils de suppression sont exclus de la liste: l'irréversible est inatteignable, même avec confirmation.
05Les garde-fous, par le code
Le principe directeur: ne jamais demander au modèle ce que le code peut garantir. Les citations d'une réponse ne deviennent des sources que si leur marqueur correspond exactement à un extrait réellement remonté par le retrieval; les marqueurs inventés sont supprimés. Les échecs d'outils sont détectés par le code et signalés à l'utilisateur, le modèle ne raconte jamais ses propres échecs. Le texte remonté par les outils est traité comme des données: les instructions qui s'y trouveraient sont ignorées. Et le raisonnement interne des modèles n'est jamais transmis au navigateur.
06La stack
| Couche | Choix |
|---|---|
| Inférence locale | Ollama: agent local, embeddings, vision pour la transcription |
| Branche critique | modèles open-weights hébergés en Europe (RGPD) |
| Agent | LangChain / LangGraph: routeur, trois branches, middlewares |
| Index | Chroma + BM25 français, fusion RRF |
| Outils | MCP: Google Calendar (2 comptes), Qonto (OAuth) |
| Interface | Flask, streaming NDJSON |
| Qualité | 101 tests sur doublures, sans réseau ni LLM; documentation interactive |
07État
Dona est open source et activement développé. Le dépôt inclut une documentation interactive: carte du système avec drill-down jusqu'au fichier, et simulations pas à pas de l'ingestion, du retrieval et de la réponse.
@software{dona,
author = {Vinceslas, Medhy},
title = {Dona: local-first agentic personal assistant},
url = {https://github.com/Mdhvince/Dona},
note = {Open source, Myelink}
}