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:
@@ -0,0 +1,230 @@
|
||||
# 🎤 Configuration Audio (STT + TTS)
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Effi dispose d'un pipeline vocal complet fonctionnant sur **folzo-Corp** (PC Gaming avec RX 7800 XT) :
|
||||
|
||||
- **STT** (Speech-to-Text) : Whisper via speaches avec ROCm
|
||||
- **TTS** (Text-to-Speech) : Piper/XTTS via openedai-speech
|
||||
|
||||
---
|
||||
|
||||
## STT - Speaches (Whisper)
|
||||
|
||||
### Configuration Docker Compose
|
||||
|
||||
Fichier : `~/speaches/docker-compose.yml` (sur folzo-Corp)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
speaches:
|
||||
image: speaches:rocm-ct2
|
||||
container_name: speaches-stt
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8200:8000"
|
||||
devices:
|
||||
- /dev/kfd
|
||||
- /dev/dri
|
||||
group_add:
|
||||
- "44"
|
||||
- "991"
|
||||
security_opt:
|
||||
- seccomp=unconfined
|
||||
environment:
|
||||
- HSA_OVERRIDE_GFX_VERSION=11.0.0
|
||||
- WHISPER__MODEL=deepdml/faster-whisper-large-v3-turbo-ct2
|
||||
- WHISPER__LANGUAGE=fr
|
||||
- WHISPER__COMPUTE_TYPE=float32
|
||||
- WHISPER__DEVICE=auto
|
||||
volumes:
|
||||
- speaches-models:/root/.cache/huggingface
|
||||
|
||||
speaches-init:
|
||||
image: curlimages/curl:latest
|
||||
container_name: speaches-init
|
||||
restart: "no"
|
||||
depends_on:
|
||||
- speaches
|
||||
entrypoint: >
|
||||
sh -c "sleep 5 &&
|
||||
curl -sf -X POST http://speaches:8000/v1/models/deepdml%2Ffaster-whisper-large-v3-turbo-ct2 &&
|
||||
echo 'Modèle enregistré'"
|
||||
|
||||
volumes:
|
||||
speaches-models:
|
||||
```
|
||||
|
||||
### Modèle utilisé
|
||||
|
||||
**`deepdml/faster-whisper-large-v3-turbo-ct2`**
|
||||
|
||||
- Version optimisée CTranslate2
|
||||
- Support ROCm (GPU AMD)
|
||||
- Turbo = version rapide du large-v3
|
||||
- Langue : Français forcé (`fr`)
|
||||
|
||||
### Points importants
|
||||
|
||||
1. **Build personnalisé** : L'image `speaches:rocm-ct2` doit être construite localement
|
||||
2. **Architecture GPU** : gfx1100 (RX 7800 XT)
|
||||
3. **Compute type** : `float32` en CPU, `float16` en GPU
|
||||
4. **Initialisation** : Le service `speaches-init` enregistre le modèle au démarrage
|
||||
|
||||
---
|
||||
|
||||
## TTS - OpenedAI-Speech (Piper)
|
||||
|
||||
### Configuration Docker Compose
|
||||
|
||||
Fichier : `~/openedai-speech/docker-compose.yml` (sur folzo-Corp)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
openedai-speech:
|
||||
image: ghcr.io/matatonic/openedai-speech
|
||||
container_name: openedai-speech
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "8100:8000"
|
||||
volumes:
|
||||
- ./tts-voices:/app/voices
|
||||
- ./tts-config:/app/config
|
||||
devices:
|
||||
- /dev/kfd
|
||||
- /dev/dri
|
||||
group_add:
|
||||
- "44"
|
||||
- "991"
|
||||
environment:
|
||||
- HSA_OVERRIDE_GFX_VERSION=11.0.0
|
||||
- HIP_VISIBLE_DEVICES=0
|
||||
```
|
||||
|
||||
### Voix disponibles
|
||||
|
||||
#### Piper (CPU - Recommandé pour usage standard)
|
||||
|
||||
**Voix française** : `fr_FR-upmc-medium`
|
||||
|
||||
```bash
|
||||
# Téléchargement
|
||||
cd ~/openedai-speech/tts-voices
|
||||
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/upmc/medium/fr_FR-upmc-medium.onnx
|
||||
wget https://huggingface.co/rhasspy/piper-voices/resolve/main/fr/fr_FR/upmc/medium/fr_FR-upmc-medium.onnx.json
|
||||
```
|
||||
|
||||
Configuration (`tts-config/config.yaml`) :
|
||||
```yaml
|
||||
tts-1:
|
||||
alloy:
|
||||
model: voices/fr_FR-upmc-medium.onnx
|
||||
speaker: 0 # 0 = voix féminine
|
||||
```
|
||||
|
||||
### Points importants
|
||||
|
||||
1. **group_add numériques** : Utiliser `"44"` et `"991"` (pas les noms)
|
||||
2. **ROCm activé** : `HSA_OVERRIDE_GFX_VERSION=11.0.0`
|
||||
3. **Fallback CPU** : Piper fonctionne aussi en CPU si GPU indisponible
|
||||
|
||||
---
|
||||
|
||||
## Configuration Open WebUI
|
||||
|
||||
**Admin Panel → Settings → Audio**
|
||||
|
||||
### Paramètres STT
|
||||
|
||||
| Paramètre | Valeur |
|
||||
|-----------|--------|
|
||||
| Engine | `OpenAI` |
|
||||
| URL | `http://192.168.1.11:8200/v1` |
|
||||
| Model | `deepdml/faster-whisper-large-v3-turbo-ct2` |
|
||||
| API Key | `anything` (valeur quelconque) |
|
||||
|
||||
### Paramètres TTS
|
||||
|
||||
| Paramètre | Valeur |
|
||||
|-----------|--------|
|
||||
| Engine | `OpenAI` |
|
||||
| URL | `http://192.168.1.11:8100/v1` |
|
||||
| Model | `tts-1` (Piper) ou `tts-1-hd` (XTTS) |
|
||||
| Voice | `alloy` |
|
||||
|
||||
---
|
||||
|
||||
## Build CTranslate2 ROCm (speaches)
|
||||
|
||||
### Pourquoi un build personnalisé ?
|
||||
|
||||
L'image officielle speaches ne publie pas d'image ROCm. Il faut builder CTranslate2 depuis les sources avec :
|
||||
- Support MIOpen (équivalent ROCm de cuDNN)
|
||||
- Architecture gfx1100 (RX 7800 XT)
|
||||
|
||||
### Procédure de build
|
||||
|
||||
```bash
|
||||
# 1. Cloner le repo
|
||||
cd ~
|
||||
git clone https://github.com/speaches-ai/speaches.git
|
||||
cd speaches
|
||||
|
||||
# 2. Modifier le Dockerfile pour gfx1100
|
||||
cd src
|
||||
sed -i 's/gfx1101/gfx1100/g' Dockerfile.rocm-ct2
|
||||
|
||||
# 3. Build (~50 min la première fois)
|
||||
docker build -f Dockerfile.rocm-ct2 -t speaches:rocm-ct2 .
|
||||
```
|
||||
|
||||
### Architecture GPU
|
||||
|
||||
Vérifier votre architecture :
|
||||
```bash
|
||||
docker run --device /dev/kfd --device /dev/dri \
|
||||
-e HSA_OVERRIDE_GFX_VERSION=11.0.0 speaches:rocm-ct2 \
|
||||
/opt/rocm-6.3.4/bin/rocminfo | grep -E "gfx|Name"
|
||||
```
|
||||
|
||||
Cartes courantes :
|
||||
- RX 7800 XT : `gfx1100`
|
||||
- RX 7900 XTX : `gfx1100`
|
||||
- RX 7700 XT : `gfx1101`
|
||||
|
||||
---
|
||||
|
||||
## Dépannage audio
|
||||
|
||||
### Erreur : "float16 not supported on CPU backend"
|
||||
|
||||
**Solution** : Changer `WHISPER__COMPUTE_TYPE` :
|
||||
```yaml
|
||||
environment:
|
||||
- WHISPER__COMPUTE_TYPE=int8 # ou float32
|
||||
```
|
||||
|
||||
### Erreur : "Unable to find group render"
|
||||
|
||||
**Solution** : Utiliser les GID numériques :
|
||||
```yaml
|
||||
group_add:
|
||||
- "44" # video
|
||||
- "991" # render
|
||||
```
|
||||
|
||||
### Erreur : "hipErrorInvalidDeviceFunction"
|
||||
|
||||
**Cause** : Mauvaise architecture GPU dans le build
|
||||
**Solution** : Rebuilder avec la bonne valeur gfx (voir section Build)
|
||||
|
||||
---
|
||||
|
||||
## Performance attendue
|
||||
|
||||
| Composant | Mode | Latence | Notes |
|
||||
|-----------|------|---------|-------|
|
||||
| STT | CPU (int8) | ~10s pour 5s audio | Utilisation 100% CPU |
|
||||
| STT | GPU (ROCm) | ~1s pour 5s audio | Objectif après rebuild |
|
||||
| TTS Piper | CPU | ~300ms | Léger, utilisable |
|
||||
| TTS XTTS | GPU | ~500ms-2s | Qualité supérieure |
|
||||
@@ -0,0 +1,192 @@
|
||||
# ⚙️ Variables d'Environnement
|
||||
|
||||
## Fichier `.env`
|
||||
|
||||
Ce fichier contient toutes les variables sensibles et de configuration. **Ne jamais le commiter !**
|
||||
|
||||
### Template
|
||||
|
||||
```bash
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
# EFFI SERVER - Variables d'environnement
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
# 1. OPEN WEBUI
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
WEBUI_SECRET_KEY=votre_cle_secrete_longue_et_aleatoire
|
||||
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
# 2. OLLAMA / PC GAMING
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
OLLAMA_HOST=192.168.1.11
|
||||
PC_GAMING_MAC=XX:XX:XX:XX:XX:XX
|
||||
BROADCAST_IP=192.168.1.255
|
||||
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
# 3. COUCHDB (Obsidian LiveSync)
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
COUCHDB_USER=master
|
||||
COUCHDB_PASSWORD=votre_mot_de_passe_securise
|
||||
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
# 4. N8N (Automatisation)
|
||||
# ═══════════════════════════════════════════════════════════
|
||||
N8N_USER=master
|
||||
N8N_PASSWORD=votre_mot_de_passe_securise
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Description des variables
|
||||
|
||||
### WEBUI_SECRET_KEY
|
||||
|
||||
**Utilisé par** : Open WebUI
|
||||
|
||||
**Description** : Clé secrète pour la gestion des sessions et le chiffrement.
|
||||
|
||||
**Génération** :
|
||||
```bash
|
||||
# Linux
|
||||
openssl rand -hex 32
|
||||
|
||||
# ou
|
||||
python3 -c "import secrets; print(secrets.token_hex(32))"
|
||||
```
|
||||
|
||||
### OLLAMA_HOST
|
||||
|
||||
**Utilisé par** : wol-proxy
|
||||
|
||||
**Description** : IP du PC Gaming où tourne Ollama.
|
||||
|
||||
**Exemple** : `192.168.1.11`
|
||||
|
||||
### PC_GAMING_MAC
|
||||
|
||||
**Utilisé par** : wol-proxy
|
||||
|
||||
**Description** : Adresse MAC du PC Gaming pour le Wake-on-LAN.
|
||||
|
||||
**Format** : `XX:XX:XX:XX:XX:XX`
|
||||
|
||||
**Trouver l'adresse MAC** :
|
||||
```bash
|
||||
# Sur le PC Gaming
|
||||
ip link show
|
||||
# ou
|
||||
ifconfig | grep ether
|
||||
```
|
||||
|
||||
### BROADCAST_IP
|
||||
|
||||
**Utilisé par** : wol-proxy
|
||||
|
||||
**Description** : Adresse de broadcast du réseau local.
|
||||
|
||||
**Standard** : `192.168.1.255` (pour un réseau 192.168.1.0/24)
|
||||
|
||||
### COUCHDB_USER / COUCHDB_PASSWORD
|
||||
|
||||
**Utilisés par** : CouchDB
|
||||
|
||||
**Description** : Identifiants administrateur pour CouchDB.
|
||||
|
||||
**Note** : L'utilisateur par défaut dans les exemples est `master`.
|
||||
|
||||
### N8N_USER / N8N_PASSWORD
|
||||
|
||||
**Utilisés par** : n8n
|
||||
|
||||
**Description** : Identifiants pour l'accès à l'interface n8n (Basic Auth).
|
||||
|
||||
---
|
||||
|
||||
## Variables système
|
||||
|
||||
### TZ (TimeZone)
|
||||
|
||||
**Valeur par défaut** : `Europe/Paris`
|
||||
|
||||
**Utilisée par** : Tous les services
|
||||
|
||||
### HSA_OVERRIDE_GFX_VERSION
|
||||
|
||||
**Valeur** : `11.0.0`
|
||||
|
||||
**Utilisée par** : Services ROCm (speaches, openedai-speech)
|
||||
|
||||
**Description** : Force la version GFX pour la compatibilité ROCm.
|
||||
|
||||
---
|
||||
|
||||
## Configuration réseau
|
||||
|
||||
### Ports utilisés
|
||||
|
||||
| Service | Port | Protocole | Description |
|
||||
|---------|------|-----------|-------------|
|
||||
| Open WebUI | 3000 | TCP | Interface web |
|
||||
| wol-proxy | 3011 | TCP | Proxy Ollama |
|
||||
| Obsidian | 3100 | TCP | Interface Obsidian web |
|
||||
| Qdrant HTTP | 6333 | TCP | API REST |
|
||||
| Qdrant gRPC | 6334 | TCP | API gRPC |
|
||||
| n8n | 5678 | TCP | Interface workflow |
|
||||
| CouchDB | 5984 | TCP | Base de données |
|
||||
| mcpo | 8000 | TCP | Proxy MCP |
|
||||
| speaches | 8200 | TCP | STT API |
|
||||
| openedai-speech | 8100 | TCP | TTS API |
|
||||
| pipelines | 9099 | TCP | Middleware |
|
||||
|
||||
---
|
||||
|
||||
## Sécurité
|
||||
|
||||
### Bonnes pratiques
|
||||
|
||||
1. **Mots de passe** : Utiliser des mots de passe forts (>16 caractères, variété)
|
||||
2. **Réseau** : Ne jamais exposer les ports directement sur Internet
|
||||
3. **VPN** : Utiliser WireGuard ou Tailscale pour l'accès externe
|
||||
4. **Backup** : Sauvegarder régulièrement le fichier `.env`
|
||||
5. **Permissions** : Limiter l'accès au fichier `.env` (chmod 600)
|
||||
|
||||
### Commandes de sécurité
|
||||
|
||||
```bash
|
||||
# Permissions restrictives
|
||||
chmod 600 ~/effi/.env
|
||||
|
||||
# Vérifier les permissions
|
||||
ls -la ~/effi/.env
|
||||
|
||||
# Backup chiffré
|
||||
gpg -c ~/effi/.env
|
||||
cp ~/effi/.env.gpg ~/backups/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Dépannage environnement
|
||||
|
||||
### Variable non prise en compte
|
||||
|
||||
**Cause** : Le conteneur doit être recréé (pas juste redémarré)
|
||||
|
||||
**Solution** :
|
||||
```bash
|
||||
docker compose down
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### Erreur "variable is not set"
|
||||
|
||||
**Cause** : Variable manquante dans le `.env`
|
||||
|
||||
**Solution** : Vérifier que toutes les variables requises sont définies
|
||||
|
||||
### Caractères spéciaux dans les mots de passe
|
||||
|
||||
**Attention** : Certains caractères peuvent poser problème dans les URLs (%, @, #, etc.)
|
||||
|
||||
**Solution** : Utiliser des mots de passe avec caractères alphanumériques uniquement, ou encoder les caractères spéciaux.
|
||||
@@ -0,0 +1,169 @@
|
||||
# 🔗 Intégration MCP et n8n
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Effi s'intègre avec plusieurs outils externes via :
|
||||
- **MCP** (Model Context Protocol) : Protocole d'outils pour l'IA
|
||||
- **n8n** : Plateforme d'automatisation de workflows
|
||||
- **CouchDB** : Synchronisation Obsidian LiveSync
|
||||
|
||||
---
|
||||
|
||||
## MCPO - Proxy MCP
|
||||
|
||||
### Rôle
|
||||
|
||||
MCPO fait le pont entre OpenWebUI et les outils MCP (Obsidian, système de fichiers, etc.).
|
||||
|
||||
### Configuration
|
||||
|
||||
**Fichier : `~/effi/mcpo-config/config.json`**
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {}
|
||||
}
|
||||
```
|
||||
|
||||
Au démarrage, créer ce fichier s'il n'existe pas :
|
||||
|
||||
```bash
|
||||
cat > ~/effi/mcpo-config/config.json << 'EOF'
|
||||
{"mcpServers": {}}
|
||||
EOF
|
||||
```
|
||||
|
||||
### Accès
|
||||
|
||||
- URL : `http://192.168.1.27:8000`
|
||||
- Port : 8000
|
||||
|
||||
### Dépannage
|
||||
|
||||
**Problème : mcpo redémarre en boucle**
|
||||
|
||||
**Cause** : Config `mcpo-config/config.json` vide ou inexistant
|
||||
|
||||
**Solution** :
|
||||
```bash
|
||||
cat > ~/effi/mcpo-config/config.json << 'EOF'
|
||||
{"mcpServers": {}}
|
||||
EOF
|
||||
docker compose restart mcpo
|
||||
```
|
||||
|
||||
**Problème : Processus zombies**
|
||||
|
||||
**Symptômes** : `[mcpo] <defunct>` dans `ps aux`
|
||||
|
||||
**Solution** :
|
||||
```bash
|
||||
docker restart mcpo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## n8n - Automatisation
|
||||
|
||||
### Rôle
|
||||
|
||||
n8n permet de créer des workflows d'automatisation déclenchés par Effi ou des événements externes.
|
||||
|
||||
### Configuration
|
||||
|
||||
**Variables d'environnement (dans `.env`) :**
|
||||
|
||||
```bash
|
||||
N8N_USER=master
|
||||
N8N_PASSWORD=mot_de_passe_securise
|
||||
```
|
||||
|
||||
### Accès
|
||||
|
||||
- URL : `http://192.168.1.27:5678`
|
||||
- Authentification : Basic Auth
|
||||
|
||||
### Cas d'usage
|
||||
|
||||
#### Exemple 1 : Webhook depuis Effi
|
||||
|
||||
1. Créer un workflow dans n8n avec un nœud **Webhook**
|
||||
2. Configurer l'URL du webhook dans OpenWebUI
|
||||
3. Effi peut déclencher des actions via ce webhook
|
||||
|
||||
#### Exemple 2 : Intégration Home Assistant (futur)
|
||||
|
||||
```
|
||||
[Commande vocale Effi]
|
||||
→ OpenWebUI
|
||||
→ n8n (webhook)
|
||||
→ API Home Assistant
|
||||
→ Action domotique
|
||||
```
|
||||
|
||||
### Sauvegarde des workflows
|
||||
|
||||
Les workflows sont stockés dans `~/effi/n8n-data/`
|
||||
|
||||
---
|
||||
|
||||
## CouchDB - Obsidian LiveSync
|
||||
|
||||
### Rôle
|
||||
|
||||
CouchDB sert de backend de synchronisation pour Obsidian LiveSync, permettant d'accéder aux notes depuis plusieurs appareils.
|
||||
|
||||
### Initialisation (premier démarrage)
|
||||
|
||||
```bash
|
||||
# Créer les bases système
|
||||
curl -X PUT http://master:MOT_DE_PASSE@192.168.1.27:5984/_users
|
||||
curl -X PUT http://master:MOT_DE_PASSE@192.168.1.27:5984/_replicator
|
||||
|
||||
# Créer la base pour Obsidian
|
||||
curl -X PUT http://master:MOT_DE_PASSE@192.168.1.27:5984/obsidian-livesync
|
||||
```
|
||||
|
||||
### Configuration Obsidian
|
||||
|
||||
Dans Obsidian (desktop ou mobile) :
|
||||
|
||||
1. Installer le plugin **Self-hosted LiveSync**
|
||||
2. Configuration :
|
||||
- **URL** : `http://192.168.1.27:5984`
|
||||
- **Database** : `obsidian-livesync`
|
||||
- **Username** : `master`
|
||||
- **Password** : [mot de passe CouchDB]
|
||||
3. Activer la synchronisation
|
||||
|
||||
### Accès
|
||||
|
||||
- URL : `http://192.168.1.27:5984`
|
||||
- Interface Fauxton : `http://192.168.1.27:5984/_utils`
|
||||
|
||||
---
|
||||
|
||||
## Pipelines - Middleware mem0
|
||||
|
||||
### Rôle
|
||||
|
||||
Le service pipelines est un middleware pour OpenWebUI permettant d'utiliser des pipelines personnalisés, notamment mem0 pour la mémoire avancée.
|
||||
|
||||
### Accès
|
||||
|
||||
- URL : `http://192.168.1.27:9099`
|
||||
|
||||
---
|
||||
|
||||
## Intégrations futures
|
||||
|
||||
### Home Assistant
|
||||
|
||||
Voir le document dans les notes d'archive pour les idées d'intégration complète avec Home Assistant.
|
||||
|
||||
### Nextcloud
|
||||
|
||||
Intégration possible pour :
|
||||
- Sauvegarde automatique des conversations
|
||||
- Accès aux fichiers pour le RAG
|
||||
- Synchronisation des tâches
|
||||
@@ -0,0 +1,262 @@
|
||||
# 🧠 Configuration Mémoire Persistante
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Effi utilise deux mécanismes de mémoire complémentaires :
|
||||
|
||||
1. **Auto Memory** : Extraction automatique des faits importants des conversations
|
||||
2. **Memory Injection Filter** : Injection des souvenirs dans le contexte des conversations
|
||||
|
||||
---
|
||||
|
||||
## Architecture de la mémoire
|
||||
|
||||
```
|
||||
Conversation utilisateur
|
||||
↓
|
||||
[Auto Memory] → Analyse avec qwen2.5:3b → Extraction de faits
|
||||
↓
|
||||
Stockage SQLite (webui.db)
|
||||
↓
|
||||
[Memory Injection] ← Récupération des souvenirs pertinents
|
||||
↓
|
||||
Injection dans le contexte LLM
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 1. Auto Memory (Extraction)
|
||||
|
||||
### Installation
|
||||
|
||||
1. **Admin Panel → Functions → Discover**
|
||||
2. Rechercher **"Auto Memory"** par **nokodo**
|
||||
3. Cliquer sur **Install**
|
||||
|
||||
### Configuration des Valves
|
||||
|
||||
**Admin Panel → Functions → Auto Memory → ⚙️ (Settings)**
|
||||
|
||||
| Paramètre | Valeur | Description |
|
||||
|-----------|--------|-------------|
|
||||
| OpenAI API URL | `http://192.168.1.11:3011/v1` | URL Ollama via wol-proxy |
|
||||
| Model | `qwen2.5:3b` | LLM léger pour analyse |
|
||||
| API Key | `toto` | Valeur quelconque |
|
||||
| Messages To Consider | `10` | Nombre de messages analysés |
|
||||
| Related Memories N | `5` | Souvenirs liés à considérer |
|
||||
| Minimum Memory Similarity | `0.7` | Seuil de similarité |
|
||||
| Override Memory Context | `OFF` | Ne pas écraser le contexte |
|
||||
| Debug Mode | `OFF` | Mettre ON pour diagnostic |
|
||||
|
||||
### Activation globale
|
||||
|
||||
**Admin Panel → Functions → Auto Memory → ⋯ → Toggle Global** → **ON**
|
||||
|
||||
### Patch du code (JSON markdown)
|
||||
|
||||
Le filtre original a un problème avec les réponses JSON formatées en markdown. Appliquer ce patch :
|
||||
|
||||
**Admin Panel → Functions → Auto Memory → ⋯ → Edit**
|
||||
|
||||
Chercher : `text_response = response.choices[0].message.content`
|
||||
|
||||
Remplacer 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
|
||||
```
|
||||
|
||||
Chercher aussi `UNIFIED_SYSTEM_PROMPT` et ajouter au début :
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Memory Injection Filter (Restitution)
|
||||
|
||||
### Installation
|
||||
|
||||
1. **Admin Panel → Functions → Discover**
|
||||
2. Rechercher **"Memory Injection Filter"** par **Raphael**
|
||||
3. Cliquer sur **Install**
|
||||
|
||||
### Configuration
|
||||
|
||||
**Admin Panel → Functions → Memory Injection Filter → ⚙️**
|
||||
|
||||
| Paramètre | Valeur |
|
||||
|-----------|--------|
|
||||
| PREPENDING_TEXT | `Voici les souvenirs à long terme de l'utilisateur :` |
|
||||
| SHOW_MEMORY_COUNT_EMITTER | `ON` |
|
||||
|
||||
### Activation globale
|
||||
|
||||
**Admin Panel → Functions → Memory Injection Filter → ⋯ → Toggle Global** → **ON**
|
||||
|
||||
---
|
||||
|
||||
## 3. Vérification du fonctionnement
|
||||
|
||||
### Test d'enregistrement
|
||||
|
||||
Dans un chat avec Effi :
|
||||
```
|
||||
Je collectionne les vinyles des années 80
|
||||
```
|
||||
|
||||
Dans le terminal (vérification SQLite) :
|
||||
```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 dans la base.
|
||||
|
||||
### Test de restitution entre sessions
|
||||
|
||||
Ouvrir un **nouveau chat** :
|
||||
```
|
||||
Qu'est-ce que tu sais sur mes hobbies ?
|
||||
```
|
||||
|
||||
→ Effi doit mentionner les vinyles sans que tu l'aies redit.
|
||||
|
||||
### Vérification des logs
|
||||
|
||||
```bash
|
||||
docker logs open-webui --tail 50 | grep -iE "memory|saved|added"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Gestion des souvenirs
|
||||
|
||||
### Via l'interface
|
||||
|
||||
**Profil → Settings → Personalization → Memory**
|
||||
|
||||
- Voir tous les souvenirs
|
||||
- Supprimer individuellement (icône 🗑️)
|
||||
- Rechercher dans les souvenirs
|
||||
|
||||
### Via SQLite (avancé)
|
||||
|
||||
**Lister les souvenirs :**
|
||||
```bash
|
||||
sudo docker cp open-webui:/app/backend/data/webui.db /tmp/webui.db
|
||||
sqlite3 /tmp/webui.db "SELECT id, content, datetime(created_at, 'unixepoch') as date FROM memory ORDER BY created_at DESC;"
|
||||
```
|
||||
|
||||
**Supprimer un souvenir :**
|
||||
```bash
|
||||
sqlite3 /tmp/webui.db "DELETE FROM memory WHERE id = 123;"
|
||||
sudo docker cp /tmp/webui.db open-webui:/app/backend/data/webui.db
|
||||
```
|
||||
|
||||
**Rechercher par mot-clé :**
|
||||
```bash
|
||||
sqlite3 /tmp/webui.db "SELECT * FROM memory WHERE content LIKE '%vinyle%';"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Bonnes pratiques
|
||||
|
||||
### Qualité des souvenirs
|
||||
|
||||
- **Courts et factuels** : Moins de 15 mots par souvenir
|
||||
- **Spécifiques** : "Aime le rock" ❌ → "Collectionne vinyles années 80" ✅
|
||||
- **Quantité** : Viser 30-50 souvenirs max pour ne pas surcharger le contexte
|
||||
|
||||
### Maintenance
|
||||
|
||||
- **Nettoyage trimestriel** : Supprimer les souvenirs obsolètes
|
||||
- **Vérification** : Tester la restitution régulièrement
|
||||
- **Backup** : Sauvegarder `webui.db` avant toute modification manuelle
|
||||
|
||||
---
|
||||
|
||||
## 6. Dépannage
|
||||
|
||||
### Les souvenirs ne s'enregistrent pas
|
||||
|
||||
**Vérifications :**
|
||||
1. Auto Memory est-il activé globalement ?
|
||||
2. La valve Debug Mode est-elle ON ? (voir les logs)
|
||||
3. Le modèle qwen2.5:3b est-il bien téléchargé sur Ollama ?
|
||||
4. L'URL Ollama dans les valves est-elle correcte ?
|
||||
|
||||
**Commandes diagnostic :**
|
||||
```bash
|
||||
# Vérifier qu'Ollama répond
|
||||
curl http://192.168.1.11:3011/v1/models
|
||||
|
||||
# Voir les logs détaillés
|
||||
docker logs open-webui --tail 100 | grep -i auto.memory
|
||||
```
|
||||
|
||||
### Les souvenirs ne sont pas injectés
|
||||
|
||||
**Vérifications :**
|
||||
1. Memory Injection Filter est-il activé globalement ?
|
||||
2. La variable PREPENDING_TEXT est-elle configurée ?
|
||||
3. Y a-t-il des souvenirs dans la base ? (vérifier avec SQLite)
|
||||
|
||||
### Doublons de souvenirs
|
||||
|
||||
**Cause** : L'extraction n'est pas dédupliquée automatiquement.
|
||||
**Solution** : Nettoyage manuel périodique via l'interface.
|
||||
|
||||
### Performance lente
|
||||
|
||||
**Cause** : Trop de souvenirs (>100) ralentissent la recherche.
|
||||
**Solution** :
|
||||
- Augmenter `Minimum Memory Similarity` (ex: 0.8)
|
||||
- Réduire `Related Memories N` (ex: 3)
|
||||
- Nettoyer les souvenirs anciens
|
||||
|
||||
---
|
||||
|
||||
## 7. Stockage technique
|
||||
|
||||
### Emplacement
|
||||
|
||||
```
|
||||
Conteneur : open-webui
|
||||
Chemin : /app/backend/data/webui.db
|
||||
Host : volume Docker open-webui-data
|
||||
```
|
||||
|
||||
### Structure de la table `memory`
|
||||
|
||||
| Colonne | Type | Description |
|
||||
|---------|------|-------------|
|
||||
| id | INTEGER | ID auto-incrémenté |
|
||||
| content | TEXT | Texte du souvenir |
|
||||
| created_at | INTEGER | Timestamp Unix |
|
||||
| updated_at | INTEGER | Timestamp Unix |
|
||||
| user_id | TEXT | ID utilisateur |
|
||||
|
||||
### Backup de la mémoire
|
||||
|
||||
```bash
|
||||
# Sauvegarde
|
||||
docker cp open-webui:/app/backend/data/webui.db ~/backups/webui-$(date +%Y%m%d).db
|
||||
|
||||
# Restauration
|
||||
docker cp ~/backups/webui-20260101.db open-webui:/app/backend/data/webui.db
|
||||
docker restart open-webui
|
||||
```
|
||||
Reference in New Issue
Block a user