Initial commit: Documentation Effi v1.0

- Structure complète du projet
- Docker compose de production
- Documentation organisée par thèmes
- Guides d'installation et configuration
- Section dépannage détaillée
- Journal historique
This commit is contained in:
Folzo
2026-04-04 08:45:59 +02:00
commit d1e12cff60
35 changed files with 4656 additions and 0 deletions
@@ -0,0 +1,214 @@
## Vue d'ensemble
Effi est une assistante IA personnelle 100% locale, auto-hébergée, avec mémoire persistante entre les sessions. Elle tourne sur un serveur Ubuntu avec Docker, utilise Ollama sur un PC de jeu séparé comme moteur LLM, et stocke les souvenirs automatiquement.
## Architecture
text
`[PC Gamer - 192.168.1.X] [Serveur - 192.168.1.27] Ollama :3011 ←→ Docker Compose qwen2.5:14b ├── open-webui :3000 RX 7800 XT 16GB VRAM ├── qdrant :6333 ├── mcpo :8000 └── wol-proxy :9999`
---
## Prérequis
- **Serveur** : Ubuntu Server, Docker + Docker Compose installés
- **PC Gamer** : Ollama installé, accessible sur le réseau local via `:3011`
- **Modèles Ollama** : `qwen2.5:14b` (principal), `qwen2.5:3b` (mémoire)
---
## Structure des fichiers
bash
`~/effi/ ├── docker-compose.yml ├── .env └── mcpo-config/ └── config.json`
---
## Fichier `.env`
text
`WEBUI_SECRET_KEY=une_cle_secrete_longue_et_aleatoire`
---
## `docker-compose.yml` complet
text
`services: open-webui: image: ghcr.io/open-webui/open-webui:main container_name: open-webui restart: unless-stopped extra_hosts: - "host.docker.internal:host-gateway" ports: - "3000:8080" environment: - OLLAMA_BASE_URL=http://192.168.1.X:3011 - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY} - VECTOR_DB=qdrant - QDRANT_URI=http://qdrant:6333 - DEFAULT_LOCALE=fr-FR - ENABLE_MEMORIES=true volumes: - open-webui-data:/app/backend/data depends_on: - qdrant - wol-proxy networks: - effi-net qdrant: image: qdrant/qdrant:latest container_name: qdrant restart: unless-stopped ports: - "6333:6333" volumes: - qdrant-data:/qdrant/storage networks: - effi-net mcpo: image: ghcr.io/open-webui/mcpo:main container_name: mcpo restart: unless-stopped ports: - "8000:8000" volumes: - ./mcpo-config:/app/config command: ["--config", "/app/config/config.json"] networks: - effi-net wol-proxy: image: alpine:latest container_name: wol-proxy restart: unless-stopped networks: - effi-net volumes: open-webui-data: qdrant-data: networks: effi-net: driver: bridge`
---
## Démarrage
bash
`cd ~/effi docker compose up -d`
---
## Configuration Open WebUI
## 1. Créer le compte admin
Accède à `http://192.168.1.27:3000` → crée le compte **Folzo**.
## 2. Connecter Ollama
`Admin Panel → Settings → Connections → Ollama`
→ URL : `http://192.168.1.X:3011`
## 3. Créer le modèle Effi
`Admin Panel → Models → + New Model`
- **Nom** : `Effi`
- **Modèle de base** : `qwen2.5:14b`
- **System prompt** : voir section dédiée ci-dessous
## 4. Activer la mémoire
`Admin Panel → Settings → General → Memory` → toggle **ON**
---
## System prompt d'Effi
text
`Tu es Effi, l'assistante IA locale de Folzo (Open WebUI + Ollama). ## Langue Réponds UNIQUEMENT en français, quelle que soit la langue utilisée. ## Personnalité - Chaleureuse, efficace, orientée solutions — une amie geek de confiance. - Humour fin : 0 à 1 vanne max par réponse, jamais forcée. - Ton conversationnel IRL, phrases courtes, pas de pavés. ## Priorités 1. Répondre à la demande directement et clairement. 2. Ajouter un conseil ou alternative si pertinent. 3. Si ambigu → 1 à 3 questions courtes avant de proposer une solution. ## Règles strictes - Question simple → réponse courte (2–6 phrases) + 1 suggestion finale. - Action risquée (rm, format, firewall, suppression) → demande confirmation avant. - Ne sur-parle pas, pas de répétitions inutiles. ## Spécialités - Linux/Docker : commandes prêtes à copier + explication simple du "pourquoi". - Débogage : étape par étape, checks rapides d'abord. - Écriture : corrige en gardant le style de Folzo. ## Prise de notes Folzo utilise Obsidian. Si une note doit être créée, fournis le contenu formaté en Markdown prêt à copier. ## Mémoire N'invente pas de souvenirs. Les infos sur Folzo sont injectées automatiquement ci-dessous. <memory_user_context></memory_user_context>`
---
## Installation du filtre Auto Memory
## Installer le filtre
`Admin Panel → Functions → Discover` → cherche **"Auto Memory"** par **nokodo** → Installer
## Configurer les Valves
`Admin Panel → Functions → Auto Memory → ⚙️`
|Valve|Valeur|
|---|---|
|Openai Api Url|`http://192.168.1.X:3011/v1`|
|Model|`qwen2.5:3b`|
|Api Key|`toto` (valeur quelconque)|
|Messages To Consider|`10`|
|Related Memories N|`5`|
|Minimum Memory Similarity|`0.7`|
|Override Memory Context|`OFF`|
|Debug Mode|`OFF` (ON pour diagnostic)|
## Activer globalement
`Admin Panel → Functions → Auto Memory → ⋯ → Toggle Global` → **ON**
## Patch du code (correction JSON markdown)
`Admin Panel → Functions → Auto Memory → ⋯ → Edit`
Cherche avec Ctrl+F : `text_response = response.choices[0].message.content`
Remplace le bloc `if response_model:` par :
python
`if response_model: try: cleaned = re.sub(r'```(?:json)?\s*', '', text_response) cleaned = re.sub(r'```\s*', '', cleaned).strip() match = re.search(r'\{.*\}', cleaned, re.DOTALL) if match: cleaned = match.group(0) return response_model.model_validate_json(cleaned) except ValidationError as e: self.log(f"response model validation error: {e}", level="warning") raise return text_response`
Cherche aussi `UNIFIED_SYSTEM_PROMPT` et ajoute au tout début de la chaîne :
python
`UNIFIED_SYSTEM_PROMPT = """IMPORTANT: Respond with ONLY valid JSON. No markdown formatting, no code blocks, no explanation text. Start your response directly with { and end with }. """ + UNIFIED_SYSTEM_PROMPT`
---
## Installation du filtre Memory Injection
## Installer le filtre
`Admin Panel → Functions → Discover` → cherche **"Memory Injection Filter"** par **Raphael** → Installer
## Configurer les Valves
- **PREPENDING_TEXT** : `Voici les souvenirs à long terme de l'utilisateur :`
- **SHOW_MEMORY_COUNT_EMITTER** : `ON`
## Activer globalement
`Admin Panel → Functions → Memory Injection Filter → ⋯ → Toggle Global` → **ON**
---
## Vérification du bon fonctionnement
## 1. Test d'enregistrement mémoire
Dans un chat avec Effi :
text
`Je collectionne les vinyles des années 80`
Dans le terminal :
bash
`sudo docker cp open-webui:/app/backend/data/webui.db /tmp/webui.db sqlite3 /tmp/webui.db "SELECT content, datetime(created_at, 'unixepoch') FROM memory ORDER BY created_at DESC LIMIT 5;"`
→ Le souvenir doit apparaître.
## 2. Test de restitution entre sessions
Ouvre un **nouveau chat** :
text
`Qu'est-ce que tu sais sur mes hobbies ?`
→ Effi doit mentionner les vinyles sans que tu l'aies redit.
## 3. Vérification des logs
bash
`docker logs open-webui --tail 50 | grep -iE "memory|saved|added"`
---
## Gestion de la mémoire
## Voir tous les souvenirs
`Profil → Settings → Personalization → Memory`
## Supprimer un souvenir
Via l'UI : icône 🗑️ dans la liste des souvenirs.
Via SQLite :
bash
`sudo docker cp open-webui:/app/backend/data/webui.db /tmp/webui.db sqlite3 /tmp/webui.db "DELETE FROM memory WHERE content LIKE '%mot_clé%';" sudo docker cp /tmp/webui.db open-webui:/app/backend/data/webui.db`
## Bonnes pratiques
- Garder les souvenirs **courts et factuels** (< 15 mots)
- Viser 30-50 souvenirs max pour ne pas surcharger le contexte
- Nettoyage manuel trimestriel via l'UI