Aller au contenu

Telegram Orchestrator

Le Telegram Orchestrator est le workflow N8N qui sert de point d’entrée pour toutes les interactions humaines avec l’infrastructure VPS. Il reçoit chaque message et chaque callback Telegram, vérifie l’authentification, route vers le bon handler, et délègue les tâches longues à 13 sub-workflows callback + 4 service handlers extraits.

ComposantRôle
Telegram BotInterface utilisateur (messages, boutons inline, ForceReply)
IA RouterDétection d’intent via Claude (5 services : docker, n8n, odoo, content, general)
Command RouterParsing /menu, /docker, /n8n, /odoo, /help, /notif, /todo, /triage, /projet, /note, /blog, /research, /new, /conv, /endconv, /model, /plan, /templates, /mcp
13 sub-workflows callbackAuth, menus, n8n actions, photos, conversations, file provider, etc.
4 service handlersDocker, Odoo, N8N, General (chat Claude)
Binary Content HandlerPhotos (via Vision OCR), notes vocales, vCard, PDF, vidéos
Conversation Agent + Plan EngineConversations multi-tours et plans d’action

Conversation system

Service handlers · wait-for-result

Sub-workflows callback · fire-and-forget

Telegram Orchestrator · 124 nodes

Telegram · message ou callback

Extract User ID

Check User Banned?

Route by Update Type

Parse Callback / Message Type

Route by Service

SW-1 File Provider · 20n

SW-2 Docker Response Sender · 7n

SW-3 New User Notifier · 7n

SW-4 Auth Callback · 26n

SW-5 N8N Action Response · 21n

SW-7a Menu Renderer · 12n

SW-8 Free Text Handler · 10n

SW-9 Notif Mode Handler · 10n

SW-10 Content Action · 10n

SW-11 Conv Callback · 87n

SW-12 Odoo Project Picker · 10n

SW-13 Photo Action · 19n

Service Handler Docker

Service Handler Odoo · 33n

Service Handler N8N · 6n

SH-N8N Action Executor · 37n

Service Handler General · 10n

Conversation Manager

Conversation Agent

Plan Engine

Binary Content Handler · 21n

Vision OCR · 14n

CatégorieCommandes
Menu/menu, /start, /docker, /n8n, /odoo, /help, /notif, /todo, /triage
Contenu/note, /blog, /research
Conversation/new, /conv, /endconv, /model, /plan, /templates, /mcp
Projet/projet (sous-commandes list, create, status avec picker paginé)

ProblèmeSans orchestratorAvec orchestrator
Accès SSH distantConnexion SSH pour chaque actionMessage Telegram depuis le mobile
Commandes complexesMémoriser les commandes DockerLangage naturel + menus
SécuritéSSH exposéBot authentifié + whitelist
RéactivitéPas de notification des problèmesAlertes + actions immédiates

Pourquoi un refactoring en sub-workflows (#273-#294) ?

Section intitulée « Pourquoi un refactoring en sub-workflows (#273-#294) ? »

L’orchestrateur initial avait grossi à 224 nodes au point de rendre l’UI N8N lente et l’édition risquée (déplacer un node pouvait casser des connexions hors écran). Trois vagues de refactoring ont ramené le parent à 124 nodes en extrayant les chemins fire-and-forget :

VagueIssueEffet
Phase 1#273224 → 142 nodes (5 SWs)
Phase 2#273142 → 98 nodes (5 SWs supplémentaires)
Conv Mgr#27847→21 + 32 (Conversation Command Handlers)
SH-N8N#279Service Handler N8N 40→6 + SH-N8N Action Executor 37
Photo routing#176+9 nodes pour photo conv-routing + SW-13
MCP menu#294Conv Agent 16→21 + SW-11 72→87

Le contrat de chaque SW est strict : entrée passthrough ou typée, sortie ignorée par le parent (pour les fire-and-forget), pas d’effet de bord sur le runtime principal.

FonctionDescription
AuthentificationWhitelist d’utilisateurs, approbation admin, ban list
Intent detectionClaude analyse le langage naturel (5 services)
Menus interactifsBoutons inline pour actions fréquentes
Multi-serviceDocker, N8N, Odoo, Content depuis une interface unique
Voice + PhotoTranscription audio + extraction d’images
ConversationsMulti-tours avec mémoire Redis et tool calls
Plans d’actionMulti-étapes avec escalade hybride
MCPOutils n8n natifs activables par conversation

ÉtapeAction
1. Extract user IDRécupère userId, chatId, firstName du message ou callback
2. Check bannedLookup Data Table Telegram Banned Users
3. Check authorizedLookup Data Table Telegram Authorized users
4. Pending approvalSi non autorisé : Data Table Telegram Pending Approvals + alerte admin

Yes

No

Authorized

Unauthorized

Message reçu

Check Banned

Check Authorized

Process request

Insert Pending Approval

Alert Admin · SW-3

Callback approve / deny

SW-4 Auth Callback Handler · 26n

Ignore

Quand un message texte n’est pas une commande exacte et qu’aucune conversation n’est active, l’IA Router détecte l’intent via Claude (cli-ollama) :

const prompt = `Tu es un système de détection d'intent pour un assistant Telegram.
Retourne UNIQUEMENT un JSON valide (pas de markdown, pas de backticks).
Format: {
"intent": "<action>",
"service": "<odoo|n8n|docker|general>",
"action": "<specific>",
"params": {},
"confidence": <0.0-1.0>
}
Services:
- odoo: factures, devis, contacts, clients, projets, CRM
- n8n: workflows, automatisations, executions
- docker: containers (restart, status, logs)
- general: conversation, questions générales
Message utilisateur: ${text}`;
ConfidenceComportement
≥ 0.7Route directement vers le service
0.5 - 0.7Demande confirmation (boutons)
< 0.5Route vers general

Fallback chain : claude-sonnet-yolo (prioritaire) → claude-haiku-yolo (si quota) → keyword routing (si API down).

Quatre service handlers spécialisés, chacun avec une responsabilité étroite :

ActionCommandeProtection
statusdocker compose ps --format jsonTous
logsdocker compose logs --tail 100Tous
restartdocker compose restartSauf security-stack
updatedocker compose pull && up -dSauf security-stack

Le SH-N8N parent ne fait plus que la vérification admin + délégation. Toute la logique d’exécution N8N est dans SH-N8N Action Executor (37 nodes).

ActionDescription
list_workflowsListe workflows avec pagination
toggle_workflowActive / désactive un workflow
list_executionsDernières exécutions (filtres)
execute_triggerDéclencher un workflow whitelisté

Trigger whitelist : seuls les workflows présents dans n8n_trigger_whitelist peuvent être déclenchés manuellement (rate limit : 1/min/workflow).

33 nodes après extension /projet. Couvre contacts, factures, devis, CRM, projets. Le sub-workflow Odoo Project Picker (SW-12) gère la pagination des projets quand la liste dépasse l’inline keyboard.

10 nodes pour /help et le chat Claude générique (questions ouvertes hors service spécifique).

Le Binary Content Handler (21 nodes) traite les médias :

TypePipeline
PhotoVision OCR (sub-workflow 14n, classification + extraction structurée)
VoiceVoice Transcription (Groq ≤30s, ElevenLabs >30s)
vCardIngress Contacts → Odoo res.partner
PDF / vidéoExtraction métadonnées + résumé

Vision OCR retourne un contrat {status, docType, extracted, text}. Selon le docType :

docTypeRouting
business_cardCréation contact Odoo via Ingress Contacts (fire-and-forget)
invoice / screenshot / handwritten / general_documentAffichage + bouton [Discuter] qui lance une conversation
not_documentBascule vers IA Router pour traitement conversationnel
errorNotification d’erreur via Notification Hub
# Navigation
menu_<section> → Menu (main, docker, n8n, odoo, help, notif, todo)
# Docker
menu_docker_stacks_<action> → Liste stacks pour action
docker_<action>_<stack> → Exécute action sur stack
# N8N (admin)
menu_n8n_workflows → Liste workflows
n8n_wf_<id> → Toggle workflow
n8n_run_<id> → Exécuter workflow
# Conversations
conv_switch_<id> → Changer de conversation active
conv_delete_<id> → Archiver
plan_exec_<shortId> → Exécuter un plan
plan_modify_<shortId> → Modifier un plan
plan_cancel_<shortId> → Annuler un plan
# User management
approve_<userId> → Approuver utilisateur (admin)
deny_<userId> → Refuser utilisateur (admin)
# Photos (#176)
photo_discuss_<shortId> → Lance une conversation autour de la photo
photo_dismiss_<shortId> → Ignore la photo
# Notifications hub
notif_<action>_<id> → approve / retry / details / ignore

Les nodes Execute Workflow MUST utiliser le format __rl pour workflowId, sinon ils échouent silencieusement au runtime :

{
"workflowId": {
"__rl": true,
"value": "<workflow-id>",
"mode": "id"
},
"options": {}
}

Le format plat {"mode": "id", "workflowId": "<id>"} produit “No information about the workflow to execute found” sans surface l’erreur.


LimiteImpactMitigation
Latence Claude2-5s pour intent detectionCache des intents fréquents à concevoir
Pas de multi-languePrompts en français uniquementSuffisant pour usage personnel
Rate limiting Telegram30 messages/seconde maxNon atteint en usage normal
Photos non-document = 2 appels LLMDetection + analyse génériqueAcceptable pour le contexte conversation

Si l’équipe passe en multi-utilisateurs :

  • Permissions granulaires par handler (actuellement : admin / non-admin)
  • Logs d’audit des actions par utilisateur
  • Notifications de groupe pour les actions critiques

Si besoin d’extension fonctionnelle :

  • Ajouter un service au Switch du Service Router (nouveau case)
  • Ou activer un serveur MCP via la commande /mcp dans une conversation
  • Le système est extensible par design — chaque ajout est isolé dans son sub-workflow

Si la latence devient critique :

  • Pre-fetch des Data Tables fréquentes en cache N8N memory
  • Pipelining des appels Odoo (déjà partiellement fait)
  • Migration des fire-and-forget vers une queue Bull dédiée

  • Glossaire — Webhook, Callback, Intent, Sub-workflow