# 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 : ```bash 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é).