Agent IA planificateur EVCS en MODE OMBRE (Advisor Shadow V1)
- Workflow n8n tdfInZns7cqo8fU2 actif (15 min): snapshot HA compact -> prompt FR -> LLM local Spark (modèle dynamique via /v1/models) avec fallback OpenRouter claude-haiku-4.5 (credential chiffré, clé hors git) -> validation stricte (enums, bornes, rejet total si invalide) -> helpers advisor_* + divergence + compteurs accord/divergence + logbook. - GARANTIE OMBRE structurelle: écritures limitées à advisor_*/logbook, vérifiée par tests/advisor/run.mjs (16 tests, bloquants au push). - Kill-switch input_boolean.evcs_advisor_enabled. - Extension R2 multi-workflows (lib-node-map WORKFLOWS[], build/extract/push par fichier, n8n-create.mjs, gen-advisor-workflow.mjs). - Helpers HA via package NFS + carte dashboard EVCS Master (backup fait). - 1re reco réelle: auto_solar_plus, cible 35%, accord avec le réel. - Fix sécurité n8n-push: plus de fallback d'id implicite vers le workflow EVCS.
This commit is contained in:
58
HANDOFF.md
58
HANDOFF.md
@@ -662,3 +662,61 @@ JAMAIS d'édition directe du JSON ou de l'UI n8n (écrasée au prochain push).
|
||||
- Suivant : agent IA planificateur en MODE OMBRE (jamais dans la boucle 30 s) —
|
||||
helpers advisor_*, validation bornée des sorties, kill-switch, cf. HANDOFF §13/§14.
|
||||
|
||||
## 16. Session du 07/08/2026 (nuit) — Agent IA planificateur en MODE OMBRE
|
||||
|
||||
### Ce qui tourne désormais
|
||||
Workflow n8n **"EVCS Advisor Shadow V1"** (id `tdfInZns7cqo8fU2`, actif, 15 min) :
|
||||
```
|
||||
Schedule 15min → HA Snapshot compact (template Jinja {{ {...} | tojson }})
|
||||
→ BUILD_PROMPT (kill-switch input_boolean.evcs_advisor_enabled, prompt FR ~4K chars)
|
||||
→ IF_ENABLED → LLM_LOCAL_MODELS (GET 10.10.10.8:8000/v1/models, 5s)
|
||||
→ LLM_LOCAL (modèle DYNAMIQUE = celui chargé sur la Spark, max_tokens 6000)
|
||||
→ IF_LOCAL_OK → sinon LLM_CLOUD (OpenRouter anthropic/claude-haiku-4.5,
|
||||
credential chiffré "OpenRouter Advisor" id eOM9xofDHT0KMoeY — clé JAMAIS dans git)
|
||||
→ VALIDATE_PARSE (strip <think>, JSON strict, enums+bornes, invalide = REJET)
|
||||
→ BUILD_HA_CALLS (helpers advisor_* + divergence + compteurs + logbook)
|
||||
→ Execute HA Service
|
||||
```
|
||||
|
||||
### GARANTIE MODE OMBRE (structurelle, testée)
|
||||
BUILD_HA_CALLS n'écrit QUE vers `input_text/input_number.evcs_advisor_*` et
|
||||
logbook. Le test `tests/advisor/run.mjs` ÉCHOUE si une écriture sort de ce
|
||||
périmètre (16 tests : kill-switch, réponses valides/hors-bornes/non-JSON/
|
||||
<think>/offline, périmètre ombre, compteurs accord/divergence).
|
||||
Suite intégrée au push : `n8n-push.mjs workflows/evcs-advisor-shadow-v1.json`.
|
||||
|
||||
### Helpers HA (package NFS /mnt/ARCH3/docker/HA/packages/evcs_advisor_shadow.yaml)
|
||||
`evcs_advisor_enabled` (kill-switch) · `advisor_strategy` · `advisor_night_target_soc`
|
||||
(22-90) · `advisor_current_max_a` (6-28) · `advisor_ev_charge_tonight` · `advisor_reason`
|
||||
· `advisor_status` (ok/invalid/llm_offline) · `advisor_divergence` · `advisor_last_run`
|
||||
· `advisor_model` · `advisor_agree_count` / `advisor_diverge_count`.
|
||||
Carte dashboard « 🤖 Conseiller IA (ombre) » ajoutée à evcs_master.yaml (backup dans SAVE/).
|
||||
|
||||
### Première recommandation réelle (07/08 22:40, via qwen3-vl local)
|
||||
`auto_solar_plus` | cible 35% | charge VE cette nuit: oui | confiance 90% |
|
||||
« Prévision solaire forte (40.7 kWh), cible SOC matin basse adaptée. Véhicule
|
||||
chargé en HC avec réseau EDF. » → **accord avec le réel** (et avec P7/P8 !).
|
||||
|
||||
### Pièges rencontrés (pour mémoire)
|
||||
1. Template /api/template DOIT être du Jinja : `{{ { ... } | tojson }}` —
|
||||
sans wrapper, HA renvoie le texte brut non rendu.
|
||||
2. Modèle local = qwen3-vl **Thinking** : max_tokens 2500 → JSON tronqué par le
|
||||
raisonnement → rejeté proprement (`invalid: JSON non terminé`). Fix : 6000.
|
||||
(La validation stricte a fait exactement son travail dès le 1er run réel.)
|
||||
3. MCP activate_workflow → erreur 415 : activer via REST POST .../activate body {}.
|
||||
4. n8n-push : le fallback d'id par défaut (EVCS) était DANGEREUX avec un 2e
|
||||
workflow → supprimé, l'id vient du champ `id` du JSON ou de l'argument.
|
||||
|
||||
### Outillage multi-workflows (extension R2)
|
||||
`lib-node-map.mjs` : WORKFLOWS[] (evcs + advisor) · build/extract/push acceptent
|
||||
un fichier cible · `n8n-create.mjs` (POST création) · `gen-advisor-workflow.mjs`
|
||||
(squelette advisor rejouable, credentials/ids inclus).
|
||||
|
||||
### Phase 3 — critères de bascule (dans 2-3 semaines d'observation)
|
||||
1. Taux d'accord stratégie ≥ 80% (compteurs agree/diverge sur la carte) ;
|
||||
2. Zéro sortie invalide NON rejetée (advisor_status) ;
|
||||
3. Divergences analysées = soit l'agent a raison (améliorer les règles),
|
||||
soit il a tort (améliorer le prompt) — les deux font progresser le système.
|
||||
→ Alors premier câblage réel LIMITÉ : night_target_soc uniquement, derrière un
|
||||
nouveau toggle `advisor_apply_night_target`, le reste inchangé.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user