From 22d40023e12abc8644bd42494fce818974a00872 Mon Sep 17 00:00:00 2001 From: Alkatrazz Date: Tue, 16 Jun 2026 13:24:21 +0200 Subject: [PATCH] =?UTF-8?q?docs(n8n):=20rapports=20portefeuille=20?= =?UTF-8?q?=E2=80=94=20news=20en=20FR=20+=20pi=C3=A8ge=20apostrophe=20JS?= =?UTF-8?q?=20+=20=C3=A9dition=20via=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- admin/k8s/n8n.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/admin/k8s/n8n.md b/admin/k8s/n8n.md index 8b5958e..54704e0 100644 --- a/admin/k8s/n8n.md +++ b/admin/k8s/n8n.md @@ -300,7 +300,15 @@ Deux workflows (rapport commenté du portefeuille : données exactes via API, na - **Auth durable** : nœud `Auth Ghostfolio` = `POST /api/v1/auth/anonymous` avec le **jeton de sécurité** (compte anonyme) → renvoie un JWT frais à chaque run (les nœuds GET utilisent `=Bearer {{ $('Auth Ghostfolio').first().json.authToken }}`). **Plus d'expiration à gérer.** Le jeton de sécurité est stocké dans le body du nœud Auth (base n8n, non versionné). - **Préparer Données** (Code) : exclut `assetClass=LIQUIDITY` (cash/Livret A) ; calcule valeur, perf, top/flop, concentration (poids **relatifs au portefeuille actions**) ; **récupère les actus par action** (top 6 par poids) via Yahoo RSS `feeds.finance.yahoo.com/rss/2.0/headline?s=` avec `this.helpers.httpRequest` (wrap try/catch → si échec, le rapport part sans news). - **Analyse LLM** : LiteLLM `:4000`, modèle `hermes-default` (Qwen). Le prompt autorise des **recommandations/pistes** + signale bonne/mauvaise nouvelle par action, en s'appuyant UNIQUEMENT sur données + news fournies. +- **News en français** : les titres Yahoo RSS arrivent **en anglais**. Le prompt système force la traduction : *« Les titres d'actualité fournis sont en anglais : traduis ou résume chaque news en français (ne recopie aucun titre en anglais). »* (sans ça, Qwen recopie les titres en anglais). - ⚠️ **Caveat précision** : Qwen 8B **peut se tromper sur les chiffres** dans sa prose. L'email inclut donc TOUJOURS le **tableau de positions exact** (calculé par n8n) : se fier au tableau pour les nombres, à la prose pour le contexte. Le LLM ne navigue pas — c'est n8n qui apporte les news. +- ⚠️ **Caveat tokens** : Qwen3 « réfléchit » avant de répondre, et la réflexion consomme le budget `max_tokens`. Si un digest paraît tronqué (`finish_reason: length`, `content` vide), augmenter `max_tokens` du nœud `Analyse LLM`. + +> ⚠️ **Piège apostrophe JS — corrigé le 2026-06-16.** Dans le nœud `Préparer Données`, `aujourd'hui` était écrit dans une chaîne entre **apostrophes simples** (`'...aujourd'hui...'`) → l'apostrophe fermait la chaîne → `SyntaxError: Unexpected identifier 'hui'`. Règle : tout texte FR avec apostrophe (`l'`, `d'`, `aujourd'hui`) dans un Code node doit être **échappé** (`\'`) ou placé entre guillemets doubles `"..."` / backticks. À noter : `node --check` brut signale un faux positif `await is only valid in async functions` car n8n enveloppe le code d'un Code node dans une fonction async — vérifier en l'enveloppant soi-même. + +### Édition des workflows via l'API + +PUT `/api/v1/workflows/:id` n'accepte que `{name, nodes, connections, settings}`, et `settings` **rejette les clés non whitelistées** (`binaryMode` → HTTP 400 `must NOT have additional properties`). Filtrer `settings` sur : `saveExecutionProgress`, `saveManualExecutions`, `saveDataErrorExecution`, `saveDataSuccessExecution`, `executionTimeout`, `errorWorkflow`, `timezone`, `executionOrder`. Le PUT **désactive** le workflow → réactiver via `POST /api/v1/workflows/:id/activate` (avec `Content-Type: application/json`). ---