Files
OPENCLAW_ARCHIVE3_17/handoffs/HANDOFF-2026-06-24-BOURSE-N8N.md
Thierry ea5dd014b6 Refonte bourse via N8N + passage modele Thinking
- openclaw.json: qwen3-vl reasoning:true, maxTokens 16384, nettoyage entrees dupliquees
- handoffs: synthese HANDOFF-2026-06-24-BOURSE-N8N.md (archi webhook N8N, config, tests)
2026-06-25 01:56:29 +02:00

5.9 KiB
Raw Blame History

HANDOFF — Refonte Bourse via N8N + passage modèle Thinking

Date : 2026-06-24 / 2026-06-25 Auteur : session OpenCode (assistant) + Thierry Périmètre : suivi boursier (Orange, Total, etc.), workflow N8N, modèle vLLM


1. Contexte / problème initial

  • orange-bourse.md était corrompu chaque semaine : le LLM l'éditait à la main (cron orange-intraday 8×/jour) → doublons, sections vides, ordre cassé.
  • Jours de bourse fermée non gérés → cours inventés ou lignes incohérentes.
  • Tout en dur dans des scripts Python (get_quote.py, generate_chart.py) : ajouter une valeur = réécrire un script.
  • 2 workflows N8N "Bourse" préexistants cassés (IDs dupliqués, données en dur, faux endpoint WhatsApp).
  • Graphe avec axe Y non-zéro → "variations géantes pour 5 cts".
  • Modèle en variante Instruct (reasoning:false).

2. Nouvelle architecture

Toi (WhatsApp / GUI)
   │  langage naturel ("ajoute Nvidia", "zoom variations")
   ▼
Agent OpenClaw (Qwen3-VL Thinking)
   │  interprète → appelle le webhook (curl) ou édite bourse-config.json
   ▼
N8N workflow "Bourse — Graphe multi-tickers (v3)"  [id 4bluZIeN3TnbzIrv]
   │  fetch Yahoo (multi-tickers, range/interval), gère marché fermé
   ▼  renvoie un PNG (QuickChart, axe Y configurable)
Agent → affiche le PNG (WhatsApp / GUI)

Principe : l'agent = interlocuteur, N8N = exécutant. Plus AUCUNE donnée éditée à la main.

3. Le workflow N8N (source unique du graphe)

  • Nom : Bourse — Graphe multi-tickers (v3)
  • ID : 4bluZIeN3TnbzIrv (actif)
  • Webhook : POST https://n8n.airtria.pro/webhook/bourse-graphe
  • Nodes : Webhook → Code "Fetch + Build QuickChart" → HTTP QuickChart → Respond (binary PNG)
  • Body JSON (tout optionnel) :
    • tickers : ex ["ORA.PA","TTE.PA","NVDA"] (FR = suffixe .PA, US = sans suffixe)
    • range : 1d|5d|1mo|3mo|6mo|1y (def 5d)
    • interval : 15m|60m|1d (def 60m)
    • beginAtZero : true (axe Y depuis 0) | false (zoom serré sur les variations, grace:"5%")
    • title : titre optionnel
  • Marché fermé / ticker invalide : renvoie un PNG "Aucune donnée" (jamais de cours inventé).
  • Point technique clé : QuickChart nécessite version:"4" (Chart.js v4) dans le payload pour que scales.y.min:0 / beginAtZero soient respectés. Sans ça l'axe ne descend pas à 0.

Exemple :

curl -s -X POST "https://n8n.airtria.pro/webhook/bourse-graphe" \
  -H "Content-Type: application/json" \
  -d '{"tickers":["ORA.PA","TTE.PA"],"beginAtZero":true}' \
  -o /home/node/.openclaw/workspace/charts/bourse.png

4. Fichiers / config modifiés

Fichier Changement
workspace/bourse-config.json NOUVEAU : watchlist + défauts + aliases (source de vérité éditable par l'agent)
workspace/AGENTS.md Section BOURSE réécrite (pilotage N8N), anciennes hard-constraints supprimées
workspace/TOOLS.md Sections 3 et 6 réécrites (webhook N8N, scripts marqués obsolètes)
openclaw.json qwen3-vl → reasoning:true, maxTokens 8192→16384, suppression entrée doublon qwen3-vl-thinking et ref orpheline vllm/qwen3.6
Crons (SQLite) orange-cloture (40 17 * * 1-5) → appelle le webhook N8N + envoie PNG WhatsApp ; orange-intraday/orange-ouverture/orange-chart-update désactivés
N8N 2 workflows bourse cassés supprimés (rJswndMIRj7R7uQ6, w30bBJXQFgRV6RMB)
Cache modèle (SQLite) agent_model_catalogs + model_capability_cache purgés (entrées qwen3-vl périmées) → régénérés au restart

Archivé (récupérable) : workspace/_archive-bourse-20260624/ (get_quote.py, generate_chart.py, clean_bourse_md.py, orange-bourse.md + backups, SVG/PNG de test).

Backups DB : state/openclaw.sqlite.bak-pre-bourse-refonte-*, *-pre-catalog-purge-*.

5. Modèle vLLM (Thinking)

  • vLLM sert Qwen/Qwen3-VL-30B-A3B-Thinking-FP8 sous --served-model-name=qwen3-vl (nom inchangé → zéro reconfig réseau côté OpenClaw).
  • Flags clés : --reasoning-parser=qwen3, --enable-auto-tool-choice, --tool-call-parser=hermes, sampling temp=0.6 top_p=0.95 top_k=20.
  • Côté OpenClaw : entrée qwen3-vl = reasoning:true, maxTokens:16384, contextWindow:65536.
  • GUI expose un menu REASONING (Off/Minimal/Low/Medium/High). Défaut conseillé : Medium. High pour conception/debug de workflows ; Low/Medium pour les graphes courants.
  • Le mode Thinking est plus lent (~17-21 tok/s) mais plus juste sur le tool-calling.
  • Max tokens GUI : monter le défaut de session de 800 → ~8192 (réglage côté navigateur, pas de défaut serveur dans cette version).

6. Validations effectuées (tests réels)

  • ORA seul, ORA+TTE, ORA+TTE+NVDA (1 mois) → PNG corrects, axe à 0.
  • beginAtZero:false → zoom serré (ex ORA 16,65–17,10 €) : micro-variations visibles.
  • Ticker invalide → PNG "Aucune donnée".
  • Agent (Thinking) a appelé le webhook de façon autonome avec les bons tickers (ORA.PA,TTE.PA) → exécution N8N 671723 ✅, livré WhatsApp + GUI.
  • Après restart : sélecteur GUI propre (plus d'entrée fantôme), agent liste OK.

7. Reste à faire / vérifs

  • Régler le max tokens GUI à ~8192 (navigateur).
  • Tester "2 graphes séparés zoomés" (Orange / Total) → doit faire 2 appels beginAtZero:false.
  • Surveiller le 1er cron orange-cloture réel (lenteur Thinking vs timeouts).
  • Anthropic = non cotée en bourse (pas de ticker) — le dire si demandé.
  • Si besoin, monter OPENCLAW_CRON_JOB_TIMEOUT_MS si le Thinking déborde.

8. Notes opérationnelles

  • Modifier le comportement du graphe = éditer le node JS du workflow 4bluZIeN3TnbzIrv via MCP n8n-mcp ou l'API n8n (le tool MCP update_workflow/activate est buggé sur cette version → préférer l'API REST n8n directe : PUT /workflows/{id} puis POST /workflows/{id}/activate).
  • Ne JAMAIS rééditer orange-bourse.md (mort, archivé).