Obsirag

Obsirag

Un cerveau qui apprend de tes notes Obsidian : RAG local, génération d'insights automatiques, enrichissement web sur sources fiables. Python · ChromaDB · Ollama.

ObsiRAG

Ollama LanceDB MCP

ObsiRAG logo

ObsiRAG transforme votre coffre Obsidian en une base de connaissances interrogeable par les agents IA — via un moteur RAG local et un serveur MCP natif.

Posez des questions en langage naturel sur l'intégralité de vos notes. Connectez Claude, Cursor ou tout agent compatible MCP à votre coffre en quelques lignes de configuration.


Deux usages, une seule installation

Recherche RAG — interroger votre coffre en langage naturel

Posez n'importe quelle question ; ObsiRAG retrouve les passages pertinents dans vos notes et génère une réponse ancrée dans votre propre savoir.

  • "Quelles sont mes dernières notes ? Fais une synthèse de cette semaine."
  • "Comment la lumière bleue affecte-t-elle mon repos ?" → retrouve la note sur les écrans et le sommeil, même si ces mots exacts n'y apparaissent pas
  • "Qu'est-ce que j'ai appris ce mois-ci sur l'IA ?"

Le coffre reste en lecture seule — ObsiRAG ne modifie jamais vos notes Obsidian existantes. Tout fonctionne 100% en local : vos données ne quittent jamais votre machine.

Intégration MCP — connecter vos agents IA à Obsidian

ObsiRAG expose un serveur MCP (Model Context Protocol) qui permet à Claude Desktop, Cursor, Copilot ou tout agent compatible d'interroger directement votre coffre Obsidian.

L'agent peut rechercher des notes, lire leur contenu, naviguer dans le graphe de connaissances, poser des questions RAG et parcourir vos notes par date — tout cela sans quitter sa fenêtre de travail. Obsidian devient un outil de mémoire longue terme pour vos workflows IA.


Serveur MCP — architecture HTTP (SSE)

NOUVEAU : ObsiRAG expose un serveur MCP natif via HTTP (SSE) directement depuis FastAPI, sans subprocess stdio. Cela signifie :

  • Pas de timeout initialize — réponse < 100ms
  • Process persistant — lancé une fois avec le backend
  • Logs propres — zéro pollution stdout
  • Auth Bearer token — sécurité intégrée
  • Scalable — support clients multiples concurrent

Quick-start

1. Configuration .env (optionnel — auth)

# Générer un token:
# openssl rand -hex 32 | sed 's/^/sk-obsirag-/'

MCP_AUTH_TOKEN=sk-obsirag-a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6

2. Démarrer

./start.sh
# MCP HTTP disponible sur: http://localhost:8081/mcp

2bis. Vérifier MCP rapidement

python scripts/mcp_smoke_test.py --base-url http://localhost:8081
# Avec auth:
python scripts/mcp_smoke_test.py \
  --base-url http://localhost:8081 \
  --auth-token "sk-obsirag-..."

3. Configurer Claude Desktop

Fichier: ~/Library/Application\ Support/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "obsirag": {
      "url": "http://localhost:8081/mcp",
      "auth": {
        "type": "bearer",
        "token": "sk-obsirag-a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
      }
    }
  }
}

Puis relancer Claude :

killall Claude
open -a Claude

Outils MCP exposés

OutilDescription
obsirag_ask_ragRecherche RAG principale. Pose une question sur le coffre via Ollama. Bascule automatiquement sur Euria + recherche web si le coffre ne suffit pas.
obsirag_search_notesRecherche des notes par titre ou chemin relatif dans le coffre indexé.
obsirag_search_notes_semanticRecherche vectorielle (embedding).
obsirag_get_noteRetourne le contenu Markdown complet et les métadonnées d'une note connue.
obsirag_browse_notes_by_dateListe les notes triées par date de modification décroissante.
obsirag_get_graph_subgraphExplore le graphe de connaissances autour d'une note.
obsirag_get_entity_statsStatistiques sur les entités NER détectées.
obsirag_get_graph_filtersOptions disponibles pour filtrer le graphe.
obsirag_get_system_statusÉtat du runtime, indexation, composants actifs.
obsirag_conversation_startDémarre une conversation d'investigation persistée.
obsirag_conversation_continueAjoute un tour à une investigation en cours.
obsirag_conversation_finalizeClôt une investigation et sauvegarde la synthèse.
obsirag_list_folderÉnumération des dossiers et fichiers dans le coffre.

Documentation complète

Backward compatibility

Le transport stdio legacy est conservé pour usages pre-HTTP :

# Mode historique (déprécié)
python -m src.mcp.server

Mais la production utilise HTTP (./start.sh).


Comment fonctionne la recherche sémantique

1. Découpage en chunks

Chaque note est découpée en morceaux (chunks) d'environ 300 mots avec chevauchement, en respectant la structure (## Titre, paragraphes). Chaque chunk hérite des métadonnées de la note (titre, tags, dates, wikilinks, entités NER…).

2. Vectorisation (embedding)

Chaque chunk est transformé en vecteur numérique par le modèle paraphrase-multilingual-MiniLM-L12-v2 (sentence-transformers, calcul CPU local, multilingue natif). Deux passages sémantiquement proches produisent des vecteurs proches — même sans mot en commun.

3. Stockage dans LanceDB

Les vecteurs sont stockés dans LanceDB (base vectorielle locale, fichiers dans data/lance/). L'indexation est incrémentale : seules les notes nouvelles ou modifiées sont retraitées.

4. Recherche à la requête

  1. La question est vectorisée
  2. LanceDB identifie les chunks les plus proches par similarité cosinus
  3. Ces chunks sont injectés comme contexte dans le prompt envoyé à Ollama
  4. Le modèle génère une réponse ancrée dans votre coffre, pas dans ses seules connaissances pré-entraînées

C'est ce mécanisme qui permet de retrouver une note sur "les effets des écrans sur le sommeil" en posant la question "comment la lumière bleue affecte-t-elle le repos ?" — sans que ces mots exacts apparaissent dans la note.


Aperçu visuel

Dashboard système

Capture Expo - dashboard systeme

Chat RAG

Interface de conversation avec note principale, sources et provenance.

Capture ObsiRAG - chat RAG avec sources

Graphe du cerveau

Exploration du coffre par connexions, synapses et filtrage.

Capture ObsiRAG - graphe du cerveau

Insight détaillé

Capture ObsiRAG - detail d'un insight


Interface web

ObsiRAG expose une interface Expo React Native web sur le port 8080, avec :

  • Chat RAG : conversation enrichie avec note principale, sources et provenance
  • Graphe cerveau : visualisation interactive des connexions entre notes
  • Insights & Synapses : consultation des artefacts générés automatiquement
  • Conversations : historique des fils de discussion sauvegardés
  • Réglages : configuration Ollama, Euria, feature toggles

Chat — comportement conversationnel

  • Relances résolues dans le fil : "tu as plus de détail sur les objectifs" est rattaché automatiquement au sujet précédent
  • Note principale : la note la plus dominante remonte en priorité dans le contexte
  • Garde-fou anti hors-sujet : si aucun chunk fiable n'est trouvé, ObsiRAG répond "Cette information n'est pas dans ton coffre." plutôt que de laisser le modèle halluciner
  • Diagrammes Mermaid : les blocs Mermaid s'ouvrent dans un viewer intégré

Fallback Euria + recherche web

Quand le coffre ne suffit pas, le backend bascule automatiquement sur Euria (Infomaniak, google/gemma-4-31B-it) avec recherche web DuckDuckGo. Le champ provider dans la réponse indique quel LLM a répondu (ollama ou euria+web).


Génération automatique d'artefacts

Insights

Un auto-learner tourne en arrière-plan et génère pour chaque note des questions perspicaces avec réponses RAG + web. Les insights sont sauvegardés dans obsirag/insights/YYYY-MM/ avec provenance et références citées — et deviennent eux-mêmes interrogeables dans le chat.

Synapses

Des connexions implicites entre notes sémantiquement proches (sans wikilink existant) sont détectées et sauvegardées dans obsirag/synapses/. Ces fichiers contiennent des wikilinks vers les deux notes sources, les enrichissant dans le graphe de connaissances.

Conversations d'investigation

Le chat expose un bouton 💾 Sauvegarder qui crée une note Markdown dans obsirag/conversations/YYYY-MM/ avec titre généré par le LLM. Ces notes sont indexées et interrogeables dans les cycles suivants.

Les artefacts générés sont exclus par défaut des résultats RAG et MCP (paramètre exclude_obsirag_generated), pour ne pas polluer les réponses avec du contenu généré.

Désactivés par défaut : la génération d'insights et de synapses est désactivée au premier démarrage. Activer depuis Réglages → Génération automatique.


Déploiement Docker

ObsiRAG tourne dans un container Docker unique géré par docker compose.

Démarrage rapide

# Configurer l'environnement
cp .env.example .env
# Éditer .env : VAULT_PATH, OLLAMA_BASE_URL, OLLAMA_CHAT_MODEL, API_KEY, etc.

# Créer le volume de données persistant
docker volume create obsirag-data

# Démarrer
docker compose up -d

L'interface web et l'API sont disponibles sur http://localhost:8080.

Commandes utiles

docker compose up -d          # démarrer
docker compose up -d --build  # rebuild + redémarrer (après un changement de code)
docker compose logs -f        # logs API
docker exec obsirag tail -f /app/logs/worker.log  # logs auto-learner
docker compose restart        # redémarrer sans rebuild
docker compose down           # arrêter

Architecture interne du container

  • PID 1 : uvicorn (API FastAPI, port 8080)
  • cron @reboot : démarre le worker auto-learner (src.learning.worker) 10 secondes après le démarrage
  • cron */5 : vérifie que le worker est vivant et le relance si nécessaire
  • Volume obsirag-data : LanceDB + stats + état autolearn (persistant entre les redémarrages)
  • Bind mount coffre : VAULT_PATH monté en lecture/écriture dans /vault

Variables d'environnement clés

VariableRôle
VAULT_PATHChemin absolu vers le coffre Obsidian sur l'hôte
OLLAMA_BASE_URLURL du serveur Ollama (ex. http://host.docker.internal:11434)
OLLAMA_CHAT_MODELModèle de chat (ex. qwen2.5:7b)
EURIA_API_KEYClé Euria/Infomaniak (optionnel — active le fallback cloud)
API_KEYClé d'authentification de l'API ObsiRAG (optionnel)
AUTOLEARN_ALLOW_BACKGROUND_LLMtrue pour activer l'auto-learner (géré par cron dans Docker)

Stack technique

ComposantTechnologie
LangagePython 3.12
DéploiementDocker (multi-stage : Node 22 Alpine + Python 3.12 slim)
IA localeOllama (API compatible OpenAI) — qwen2.5:7b par défaut
IA cloud optionnelEuria/Infomaniak — google/gemma-4-31B-it
Base vectorielleLanceDB (fichiers locaux dans data/lance/)
Embeddingssentence-transformers paraphrase-multilingual-MiniLM-L12-v2 (768 dim, CPU, multilingue)
InterfaceExpo React Native web + FastAPI
Protocole agentsMCP HTTP (SSE) + stdio legacy
GrapheNetworkX + Pyvis
Recherche webDuckDuckGo Search
NERspaCy xx_ent_wiki_sm + validation WUDD.ai
File watchingwatchdog (détection temps réel des modifications du coffre)

Modèle Ollama

ObsiRAG utilise un seul modèle pour toutes les opérations (chat, génération de questions, synapses) :

# Modèles recommandés
ollama pull qwen2.5:7b       # chat + génération
ollama pull nomic-embed-text  # embeddings (optionnel, sinon sentence-transformers en CPU)

Pour mesurer les performances sur votre machine :

python scripts/benchmark_ollama_chat20.py

Documentation technique


Statut

Projet actif — développé de façon créative et itérative avec Claude Code et GitHub Copilot.

Le dépôt est public. Contributions et idées bienvenues.

Related

How to Install

  1. Download the ZIP or clone the repository
  2. Open the folder as a vault in Obsidian (File → Open Vault)
  3. Obsidian will prompt you to install required plugins

Stats

Stars

1

Forks

0

Last updated 1mo ago

Categories

Tags

auto-learningchromadbduckduckgoknowledge-baseknowledge-graphllmlocal-aimlxmlx-lmnernlpobsidianpythonragretrieval-augmented-generationspacystreamlit