115 lines
7.3 KiB
Markdown
115 lines
7.3 KiB
Markdown
# MEMORY.md — Nox 🌑
|
|
|
|
## Christophe
|
|
- Habite Montlieu-La-Garde, Charente-Maritime (17), axe Bordeaux-Angoulême N10
|
|
- Fuseau horaire : Europe/Paris
|
|
- Langue : français
|
|
|
|
## Home Assistant
|
|
- URL : http://192.168.1.40:8123
|
|
- **Lumières** :
|
|
- `light.dimmer_2` → **Entrée**
|
|
- `light.bar` → **Bar**
|
|
- `light.bibliotheque` → **Bibliothèque**
|
|
- `light.dimmer_salon` → **Salon**
|
|
- `light.mezzanine` → **Mezzanine**
|
|
- **Caméras** :
|
|
- `camera.onvif_ptz` → **Caméra Extérieur** (double vue, couleur, parking/cour)
|
|
- `camera.fi9821ep` → **Caméra Salon** (Foscam, intérieur)
|
|
- `camera.camera_ndeg7` → **Caméra n°7** (intérieur, sous-sol/atelier)
|
|
- `camera.camera_jarnac_rdc_7` → **Caméra Jarnac RDC 7** (intérieur)
|
|
- `camera.foscam` → **Foscam** (intérieur, entrée/pièce de vie)
|
|
- `camera.klipper_webcam` → **Ender 3 Webcam** (imprimante 3D)
|
|
- `camera.predator_predator` → **Predator**
|
|
- `camera.nono_none` → **Nono**
|
|
- **Media Players** :
|
|
- `media_player.shield` → **SHIELD CUISINE**
|
|
- `media_player.android_tv_cuisine` → **Android TV Cuisine**
|
|
- `media_player.shield_salon` → **SHIELD SALON**
|
|
- `media_player.android_tv_salon` → **Android TV Salon**
|
|
- `media_player.denon_avr_x3400h` → **Denon AVR-X3400H**
|
|
|
|
|
|
## Proxmox
|
|
- URL : https://192.168.1.250:8006
|
|
- Token : variable d'env `PVE_TOKEN` (format `root@pam!openclaw=<uuid>`) — déjà dans .env + docker-compose override
|
|
- Accès API : `curl -sk -H "Authorization: PVEAPIToken=$PVE_TOKEN" "$PVE_URL/api2/json/nodes"`
|
|
- **Parser JSON avec Node.js** (pas jq — permission denied dans le conteneur)
|
|
- Nodes : mini-pc, ts-651, pve, z820
|
|
|
|
## Proxmox Backup Server (PBS)
|
|
- URL : https://192.168.1.91:8007
|
|
- Token : variables d'env `PBS_TOKEN_ID` + `PBS_TOKEN_SECRET` — déjà dans .env + docker-compose override
|
|
- Accès API : `curl -sk -H "Authorization: PBSAPIToken=$PBS_TOKEN_ID:$PBS_TOKEN_SECRET" "$PBS_URL/api2/json/status/datastore-usage"`
|
|
- Datastore : `backups_on_ts651` (1.26 TB total)
|
|
|
|
## Outils & Préférences
|
|
- **Génération d'images** : utiliser fal.ai (FAL_KEY), PAS OpenAI
|
|
- `fal-ai/flux/schnell` — génération rapide, bon pour photos/art
|
|
- `fal-ai/nano-banana-pro` — Gemini 3 Pro Image, bon pour affiches/texte/édition d'images
|
|
- **Captures d'écran** : utiliser Playwright Chrome CLI (`/home/node/.cache/ms-playwright/chromium-1208/chrome-linux64/chrome --headless --no-sandbox --disable-gpu --disable-dev-shm-usage --screenshot=...`) car l'outil browser fait des captures blanches (mode `attachOnly`)
|
|
- **Toujours sauvegarder dans le workspace** (`/home/node/.openclaw/workspace/`) — `/tmp` est bloqué par la sécurité OpenClaw pour l'envoi de fichiers via Telegram
|
|
- Les erreurs `dbus` en conteneur sont normales et sans impact
|
|
- Pour **interagir avec une page** (cliquer sur cookies, boutons...) : utiliser **Playwright Node.js** installé dans le workspace (`/home/node/.openclaw/workspace/node_modules/playwright`) avec `executablePath` pointant vers le chrome Playwright
|
|
- **TTS** : Edge, voix fr-FR-VivienneMultilingualNeural
|
|
- **Transcription audio** : Groq Whisper
|
|
|
|
## Anytype
|
|
- Instance self-hosted : http://192.168.1.150:31009
|
|
- Espace principal : **OpenClaw** (id: `bafyreigt3wmpnm2qduzijfubftw5ixrhqfrjrc2yi6hq2e4cpw6yer7hqq.25d1im923toai`)
|
|
- Skill custom dans `/home/node/.openclaw/workspace/skills/anytype/`
|
|
- Utiliser cet espace pour tout ce qui concerne Christophe et moi
|
|
- **Images** : ✅ ÇA MARCHE ! Anytype télécharge et internalise les images depuis une URL externe
|
|
- Méthode : inclure `` dans le `body` markdown lors d'un **POST** (création d'objet)
|
|
- Anytype récupère l'image, lui donne un ID interne (`bafyrei...`) et la sert via `http://127.0.0.1:47800/image/<id>`
|
|
- L'image doit être accessible depuis le serveur Anytype (même réseau local)
|
|
- **PATCH** : utiliser le champ `"markdown"` (PAS `"body"`) pour modifier le contenu existant !
|
|
- Le format icon doit être `{"format":"emoji","name":"🧪"}` et non une string simple
|
|
- **POST** (création) : utiliser `"body"` pour le contenu
|
|
- **PATCH** (modification) : utiliser `"markdown"` pour le contenu
|
|
|
|
## CopyParty (stockage fichiers)
|
|
- URL : http://192.168.1.150:3923
|
|
- Upload simple via `curl -X PUT "http://192.168.1.150:3923/<chemin>" --data-binary @fichier`
|
|
- Pas d'authentification requise
|
|
- Dossier `/anytype/` créé pour les fichiers liés à Anytype
|
|
- Utilisable pour héberger images, schémas, etc. avec lien direct
|
|
|
|
## Podcasts & Vidéos — Transcription
|
|
- Je peux **récupérer et transcrire** des podcasts/vidéos en ligne
|
|
- **Méthode :**
|
|
1. Utiliser **Playwright** pour intercepter les requêtes réseau et trouver l'URL du fichier audio (.mp3)
|
|
2. Télécharger le MP3 avec `curl -sL -A "Mozilla/5.0..." -H "Referer: <site>" <url> -o fichier.mp3`
|
|
3. Transcrire avec **Groq Whisper** : `curl -X POST https://api.groq.com/openai/v1/audio/transcriptions -H "Authorization: Bearer $GROQ_API_KEY" -F "file=@fichier.mp3" -F "model=whisper-large-v3-turbo" -F "language=fr" -F "response_format=text"`
|
|
- Testé avec succès sur BFM Business / Simplecast (podcasts hébergés sur simplecastaudio.com)
|
|
- Sauvegarder les fichiers dans le workspace, pas dans /tmp
|
|
- **YouTube** : utiliser **yt-dlp** (binaire dans `/home/node/.openclaw/workspace/yt-dlp`)
|
|
- Transcript via API YouTube (sous-titres auto) : `yt-dlp --write-auto-sub --skip-download --sub-lang fr -o workspace/transcript <url>`
|
|
- Audio pour Whisper : `yt-dlp -x --audio-format mp3 -o workspace/audio.mp3 <url>`
|
|
|
|
## Mémoire Vectorielle (Qdrant)
|
|
- **Collection** : `nox-memory` sur Qdrant (`http://192.168.1.150:6333`)
|
|
- **Stack Portainer** : `qdrant` (anciennement `kilocode-qdrant`, renommé 2026-02-22)
|
|
- **Script** : `/home/node/.openclaw/workspace/nox-memory.js`
|
|
- **Modèle** : `text-embedding-3-small` (OpenAI, 1536 dims, Cosine)
|
|
- **Accès** : `node fetch` natif (Node 22) — curl bloqué par sandbox OpenClaw, mais node fetch fonctionne ✅
|
|
- **Réseau Docker** : le stack doit avoir un réseau `bridge` en plus de `swag_lan` pour être accessible depuis le LXC
|
|
- **Usage** :
|
|
```bash
|
|
node nox-memory.js add "texte" --type fact|semantic|preference|episodic --tags "t1,t2" --importance 1-5
|
|
node nox-memory.js search "question naturelle" [--limit 5] [--type fact]
|
|
node nox-memory.js list [--type fact] [--limit 20]
|
|
node nox-memory.js stats
|
|
node nox-memory.js import-md MEMORY.md
|
|
```
|
|
- MEMORY.md importé (9 chunks, 2026-02-22)
|
|
- **Utiliser en priorité** pour les recherches contextuelles (memory_search reste utile pour le démarrage de session)
|
|
- ⚠️ Qdrant charge ~34 collections KiloCode au démarrage → ~30s avant d'être prêt
|
|
|
|
## Leçons apprises
|
|
- **Toujours prendre un snapshot du LXC 145** (`mini-pc`) avant toute modification de config ou installation qui pourrait casser OpenClaw
|
|
- Commande : `curl -sk -X POST -H "Authorization: PVEAPIToken=$PVE_TOKEN" -H "Content-Type: application/json" -d '{"snapname":"<nom>","description":"<desc>"}' "$PVE_URL/api2/json/nodes/mini-pc/lxc/145/snapshot"`
|
|
- Toujours vérifier les `friendly_name` dans HA pour trouver les entités
|
|
- Les skills custom sont dans `/home/node/.openclaw/workspace/skills/`
|
|
- **curl est bloqué** dans le sandbox OpenClaw pour certaines destinations réseau, mais **node fetch (Node 22)** fonctionne — utiliser node pour les requêtes HTTP internes quand curl échoue
|