Aller au contenu

Telegram Orchestrator

Le Telegram Orchestrator est le workflow N8N qui sert de point d’entrée principal pour interagir avec l’infrastructure. Il reçoit les messages et callbacks Telegram et les route vers les handlers appropriés.

ComposantRôle
Telegram BotInterface utilisateur (messages, boutons)
IA RouterDétection d’intent via Claude
Command RouterGestion des commandes /xxx
Menu HandlerGestion des callbacks boutons
Service HandlersExécution des actions (Docker, N8N, etc.)
Message/Callback Telegram
┌─────────────────────────────────────────────────────────┐
│ Telegram Orchestrator │
│ ├─ Extract userId/chatId │
│ ├─ Check if user banned │
│ └─ Route by update type │
└───────────────────────┬─────────────────────────────────┘
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ IA Router │ │ Command │ │ Menu │
│ (Claude) │ │ Router │ │ Handler │
│ │ │ (/docker) │ │ (callbacks) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────┐
│ Service Handlers │
│ ├─ Docker Handler (status, restart, logs, update) │
│ ├─ N8N Handler (workflows, logs, data tables, triggers)│
│ ├─ General Handler (help, chat Claude) │
│ └─ Voice Handler (transcription Whisper) │
└─────────────────────────────────────────────────────────┘

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
FonctionDescription
AuthentificationWhitelist d’utilisateurs, approbation admin
Intent detectionClaude analyse le langage naturel
Menus interactifsBoutons inline pour actions fréquentes
Multi-serviceDocker, N8N, Odoo depuis une interface unique
TranscriptionMessages vocaux → texte → action

Flow d’authentification :

Message reçu
┌─────────────────────────┐
│ Check If User Banned │ ← Data Table "banned_users"
└───────────┬─────────────┘
┌────────┴────────┐
▼ ▼
Banned Not Banned
│ │
▼ ▼
Ignore Check authorized_users
┌──────┴──────┐
▼ ▼
Authorized Unauthorized
│ │
▼ ▼
Process Alert admin
request [Approve] [Deny]

Data Tables :

TableColonnesUsage
authorized_userstelegram_id, name, is_admin, permissionsUtilisateurs autorisés
banned_userstelegram_id, reason, dateUtilisateurs bloqués
pending_approvalstelegram_id, request_dateEn attente d’approbation

Prompt d’analyse :

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}`;

Exemples de routing :

MessageServiceActionParams
”redémarre n8n”dockerrestart{container: "n8n"}
”montre les workflows actifs”n8nlist_workflows{filter: "active"}
”c’est quoi ce truc?“generalchat-
”cherche le contact Jean”odoosearch_contact{name: "Jean"}

Scoring de confiance :

ConfidenceComportement
≥ 0.7Route directement vers le service
0.5 - 0.7Demande confirmation (boutons)
< 0.5Route vers general

Fallback Chain :

  1. Claude Sonnet (via claude-ollama) — Prioritaire
  2. Claude Haiku — Si quota Sonnet épuisé
  3. Keyword routing — Si API indisponible
const MENU_COMMANDS = {
'/menu': 'main',
'/start': 'main',
'/docker': 'docker',
'/help': 'help',
'/n8n': 'n8n'
};
CommandeMenu TypeDescription
/menumainMenu principal
/startmainMenu principal (Telegram standard)
/dockerdockerMenu actions Docker
/helphelpAide et commandes disponibles
/n8nn8nMenu gestion N8N (admin only)

Conventions de callback :

# Navigation
menu_main → Menu principal
menu_docker → Menu Docker
menu_n8n → Menu N8N (admin)
# Docker actions
menu_docker_stacks_<action> → Liste stacks pour action
docker_<action>_<stack> → Exécute action sur stack
# N8N actions
menu_n8n_workflows → Liste workflows
n8n_wf_<id> → Toggle workflow
n8n_run_<id> → Exécuter workflow
# User management
approve_<userId> → Approuver utilisateur
deny_<userId> → Refuser utilisateur

Exemple de menu :

┌──────────────────────────────┐
│ Menu Principal │
├──────────────────────────────┤
│ [🐳 Docker] [📊 Status] │
│ [⚙️ N8N] [❓ Aide] │
└──────────────────────────────┘
ActionCommandeProtection
statusdocker compose ps --format jsonTous
logsdocker compose logs --tail 100Tous
restartdocker compose restartSauf security-stack
stopdocker compose stopSauf security-stack
updatedocker compose pull && up -dSauf security-stack

Format de réponse :

🐳 Status: n8n-stack
✅ n8n (running) - Up 3 days
✅ n8n-worker-1 (running) - Up 3 days
✅ n8n-worker-2 (running) - Up 3 days
✅ n8n-postgres (running) - Up 3 days
✅ n8n-redis (running) - Up 3 days

Accès réservé aux admins.

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

Trigger Whitelist :

Seuls les workflows dans n8n_trigger_whitelist peuvent être déclenchés :

CatégorieExemples
backupBackup DB, Export workflows
syncSync GitHub, Sync Odoo
cleanupClean logs, Purge pending
DuréeService
≤ 30sGroq Whisper (gratuit, rapide)
> 30sElevenLabs Scribe (diarisation)

Voir Voice Transcription pour les détails.

Ordre des conditions dans Parse Callback :

// ✅ BON - Du plus spécifique au plus général
if (callbackData.startsWith('menu_n8n')) { ... }
else if (callbackData.startsWith('menu_docker_stacks_')) { ... }
else if (callbackData.startsWith('menu_')) { ... }
// ❌ MAUVAIS - menu_ attrape tout
if (callbackData.startsWith('menu_')) { ... }
else if (callbackData.startsWith('menu_n8n')) { ... } // Jamais atteint !

Échappement HTML :

const escapeHtml = (text) => {
return text
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
};

LimiteImpactMitigation
Latence Claude2-5s pour intent detectionCache des intents fréquents
Pas de multi-languePrompts en français uniquementSuffisant pour usage personnel
Rate limiting Telegram30 messages/seconde maxNon atteint en usage normal

Si besoin de commandes vocales avancées :

  • Intégrer un assistant vocal dédié
  • Permettre les conversations multi-tours
  • Ajouter la synthèse vocale pour les réponses

Si équipe multi-utilisateurs :

  • Permissions granulaires par handler
  • Logs d’audit des actions
  • Notifications de groupe pour les actions critiques

Si besoin d’autres services :

  • Ajouter un handler pour chaque nouveau service
  • Pattern existant facilement extensible
  • Claude s’adapte automatiquement aux nouveaux services