Documentation Meta-Agents

Retour à la config

Introduction

L'éditeur de Meta-Agents permet de créer des workflows visuels qui combinent appels LLM, requêtes HTTP, traitement de données et interactions humaines. Chaque workflow est composé de nœuds connectés par des fils (wires).

Conseil : Utilisez le bouton "IA Flow" dans l'éditeur pour générer automatiquement des workflows à partir d'instructions en langage naturel.

Format JSON des flows

Un flow est composé de deux parties :

Triggers (Déclencheurs)

Les triggers n'ont pas d'entrée et démarrent l'exécution du flow.

TRIGGER Inject

Injecte des données au démarrage du flow. C'est généralement le premier nœud.

PropriétéTypeDescription
datastring (JSON)Données à injecter, format: {"payload": "valeur"}
sortiestringNom de la variable de sortie (généralement "msg")

Exemple : Inject simple

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"Bonjour le monde!\"}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Message injecté", "x": 280, "y": 100}
  ],
  "wires": [["inject_1", "debug_1"]]
}

TRIGGER HTTP In (Webhook)

Déclenche le flow lors d'une requête HTTP externe. Permet de créer une API.

PropriétéTypeDescription
pathstringChemin du webhook (ex: "/webhook/mon-flux")
methodstring"GET", "POST", "PUT" ou "DELETE"
authstring"none" ou "token"
sortiestringVariable de sortie contenant la requête
L'URL du webhook sera : /api/meta-agents/webhook/:agentId

Exemple : Webhook POST

{
  "nodes": [
    {"id": "webhook_1", "type": "http-in", "path": "/webhook/traitement", "method": "POST", "auth": "token", "sortie": "req", "x": 100, "y": 100},
    {"id": "llm_1", "type": "llm", "prompt": "Traite cette requête: {{req.payload}}", "model": "google/gemini-2.0-flash-001", "sortie": "resultat", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Réponse", "x": 460, "y": 100}
  ],
  "wires": [["webhook_1", "llm_1"], ["llm_1", "debug_1"]]
}

Processing (Traitement)

Les nœuds de traitement transforment les données.

PROCESSING LLM

Appelle un modèle de langage (GPT, Gemini, Claude, etc.) pour générer du texte.

PropriétéTypeDescription
promptstringLe prompt avec interpolation {{variable}}
modelstringID du modèle (ex: "google/gemini-2.0-flash-001")
systemPromptstring(Optionnel) Instructions système
sortiestringVariable de sortie

Exemple : Résumé de texte

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"L'intelligence artificielle (IA) est un domaine de l'informatique qui vise à créer des systèmes capables de réaliser des tâches nécessitant normalement l'intelligence humaine. Cela inclut l'apprentissage, le raisonnement, la résolution de problèmes, la perception et la compréhension du langage.\"}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "llm_1", "type": "llm", "prompt": "Résume ce texte en une phrase: {{msg.payload}}", "model": "google/gemini-2.0-flash-001", "sortie": "resume", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Résumé", "x": 460, "y": 100}
  ],
  "wires": [["inject_1", "llm_1"], ["llm_1", "debug_1"]]
}

Exemple : LLM avec System Prompt

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"Hello, how are you?\"}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "llm_1", "type": "llm", "prompt": "{{msg.payload}}", "model": "google/gemini-2.0-flash-001", "systemPrompt": "Tu es un traducteur français. Traduis tout en français de manière naturelle.", "sortie": "traduction", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Traduction", "x": 460, "y": 100}
  ],
  "wires": [["inject_1", "llm_1"], ["llm_1", "debug_1"]]
}

PROCESSING HTTP

Effectue une requête HTTP vers une API externe.

PropriétéTypeDescription
urlstringURL avec interpolation possible
methodstring"GET", "POST", "PUT" ou "DELETE"
headersstring (JSON)Headers HTTP (ex: {"Authorization": "Bearer xxx"})
bodystring(Optionnel) Corps de la requête pour POST/PUT
sortiestringVariable de sortie

Exemple : Récupérer un utilisateur depuis une API

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"1\"}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "http_1", "type": "http", "url": "https://jsonplaceholder.typicode.com/users/{{msg.payload}}", "method": "GET", "headers": "{}", "sortie": "user", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Utilisateur", "x": 460, "y": 100}
  ],
  "wires": [["inject_1", "http_1"], ["http_1", "debug_1"]]
}

Exemple : POST avec body

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": {\"title\": \"Mon Post\", \"body\": \"Contenu du post\"}}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "http_1", "type": "http", "url": "https://jsonplaceholder.typicode.com/posts", "method": "POST", "headers": "{\"Content-Type\": \"application/json\"}", "body": "{{msg.payload}}", "sortie": "response", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Réponse API", "x": 460, "y": 100}
  ],
  "wires": [["inject_1", "http_1"], ["http_1", "debug_1"]]
}

PROCESSING Database

Exécute une requête SQL sur la base de données.

PropriétéTypeDescription
querystringRequête SQL avec paramètres $1, $2, etc.
paramsstring (JSON)Tableau des paramètres avec interpolation
sortiestringVariable de sortie

Exemple : Recherche utilisateur

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": {\"userId\": 42}}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "db_1", "type": "database", "query": "SELECT * FROM users WHERE id = $1", "params": "[\"{{msg.payload.userId}}\"]", "sortie": "user", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Résultat DB", "x": 460, "y": 100}
  ],
  "wires": [["inject_1", "db_1"], ["db_1", "debug_1"]]
}

PROCESSING Code

Exécute du code JavaScript personnalisé.

PropriétéTypeDescription
codestringCode JS (accès à etat.msg, etat.variable)
sortiestringVariable de sortie
Le code doit retourner un objet avec return { ... }

Exemple : Transformation de données

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": [1, 2, 3, 4, 5]}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "code_1", "type": "code", "code": "const arr = etat.msg.payload; return { sum: arr.reduce((a,b) => a+b, 0), count: arr.length, avg: arr.reduce((a,b) => a+b, 0) / arr.length };", "sortie": "stats", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Statistiques", "x": 460, "y": 100}
  ],
  "wires": [["inject_1", "code_1"], ["code_1", "debug_1"]]
}

PROCESSING Agent

Appelle un autre meta-agent ou un assistant/persona.

PropriétéTypeDescription
agentTypestring"meta-agent" ou "assistant"
agentIdstringID de l'agent à appeler
inputMappingstringVariable d'entrée (ex: "msg.payload")
maxDepthnumber(Optionnel) Profondeur max d'appels imbriqués
sortiestringVariable de sortie

Exemple : Appel d'un meta-agent

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"Données à traiter\"}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "agent_1", "type": "agent", "agentType": "meta-agent", "agentId": "ID_DE_VOTRE_AGENT", "inputMapping": "msg.payload", "maxDepth": 3, "sortie": "resultat", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Résultat agent", "x": 460, "y": 100}
  ],
  "wires": [["inject_1", "agent_1"], ["agent_1", "debug_1"]]
}

Control (Flux)

Les nœuds de contrôle dirigent le flux d'exécution.

CONTROL Condition

Branchement conditionnel avec deux sorties (vrai/faux).

PropriétéTypeDescription
sistringExpression JavaScript qui retourne true/false
labelTruestringLabel de la branche "vrai"
labelFalsestringLabel de la branche "faux"
sortiestringVariable de sortie
Le nœud condition a 2 sorties. Connectez la branche "vrai" en haut et "faux" en bas.

Exemple : Vérification de longueur

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"Ceci est un texte assez long pour le test\"}", "sortie": "msg", "x": 100, "y": 150},
    {"id": "cond_1", "type": "condition", "si": "msg.payload.length > 20", "labelTrue": "Long", "labelFalse": "Court", "sortie": "result", "x": 280, "y": 150},
    {"id": "debug_long", "type": "debug", "label": "Texte LONG", "x": 460, "y": 100},
    {"id": "debug_court", "type": "debug", "label": "Texte COURT", "x": 460, "y": 200}
  ],
  "wires": [["inject_1", "cond_1"], ["cond_1", "debug_long"], ["cond_1", "debug_court"]]
}

CONTROL Boucle

Itère sur une collection et accumule les résultats.

PropriétéTypeDescription
surstringVariable tableau sur laquelle itérer
variablestringNom de la variable pour chaque élément
maxIterationsnumber(Optionnel) Nombre max d'itérations
accumulerstringVariable pour stocker les résultats
sortiestringVariable de sortie finale

Exemple : Traitement de liste

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": [\"pomme\", \"banane\", \"orange\"]}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "boucle_1", "type": "boucle", "sur": "msg.payload", "variable": "fruit", "maxIterations": 10, "accumuler": "resultats", "sortie": "final", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Fruits traités", "x": 460, "y": 100}
  ],
  "wires": [["inject_1", "boucle_1"], ["boucle_1", "debug_1"]]
}

Human (Interaction)

Les nœuds d'interaction permettent de demander une validation humaine.

HUMAN Humain

Met le flow en pause et demande une validation humaine.

PropriétéTypeDescription
messagestringMessage à afficher à l'utilisateur
optionsstringOptions séparées par \n (ex: "Approuver\nRejeter")
timeoutnumber(Optionnel) Timeout en ms (défaut: 24h)
relancenumber(Optionnel) Intervalle de relance en ms
sortiestringVariable contenant le choix de l'utilisateur

Exemple : Validation avant envoi

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"Contenu important à valider\"}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "llm_1", "type": "llm", "prompt": "Reformule ceci de manière professionnelle: {{msg.payload}}", "model": "google/gemini-2.0-flash-001", "sortie": "draft", "x": 280, "y": 100},
    {"id": "humain_1", "type": "humain", "message": "Voulez-vous envoyer ce message?", "options": "Approuver\nModifier\nAnnuler", "timeout": 3600000, "sortie": "decision", "x": 460, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Décision", "x": 640, "y": 100}
  ],
  "wires": [["inject_1", "llm_1"], ["llm_1", "humain_1"], ["humain_1", "debug_1"]]
}

Output (Sorties)

Les nœuds de sortie affichent ou envoient les résultats.

OUTPUT Debug

Affiche les données dans l'inspecteur pour le debug.

PropriétéTypeDescription
labelstringLibellé affiché dans l'inspecteur

Exemple : Debug simple

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": {\"name\": \"Test\", \"value\": 42}}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Données de test", "x": 280, "y": 100}
  ],
  "wires": [["inject_1", "debug_1"]]
}

OUTPUT Message Utilisateur

Envoie un message à l'utilisateur via WebSocket ou email.

PropriétéTypeDescription
recipientTypestring"current", "specific" ou "from-msg"
recipientIdstring(Si "specific") ID du destinataire
messageTemplatestringMessage avec interpolation {{variable}}
channelstring"websocket" ou "email"
sortiestringVariable de sortie (statut d'envoi)

Exemple : Notification utilisateur

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"Votre analyse est terminée!\"}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "msg_1", "type": "message-utilisateur", "recipientType": "current", "messageTemplate": "{{msg.payload}}", "channel": "websocket", "sortie": "envoi", "x": 280, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Statut envoi", "x": 460, "y": 100}
  ],
  "wires": [["inject_1", "msg_1"], ["msg_1", "debug_1"]]
}

Interpolation

L'interpolation permet d'insérer des valeurs dynamiques dans les propriétés.

Syntaxe : {{variable.path}}

Exemples d'interpolation

ExpressionDescription
{{msg.payload}}Accède au payload du message
{{user.payload.name}}Accède à une propriété imbriquée
{{resultat.payload}}Résultat d'un nœud précédent
La variable de sortie d'un nœud crée un objet avec .payload contenant le résultat.

Exemple : Chaînage avec interpolation

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"Paris\"}", "sortie": "ville", "x": 100, "y": 100},
    {"id": "http_1", "type": "http", "url": "https://wttr.in/{{ville.payload}}?format=j1", "method": "GET", "headers": "{}", "sortie": "meteo", "x": 280, "y": 100},
    {"id": "llm_1", "type": "llm", "prompt": "Décris la météo actuelle pour {{ville.payload}} en une phrase: {{meteo.payload}}", "model": "google/gemini-2.0-flash-001", "sortie": "description", "x": 460, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Météo", "x": 640, "y": 100}
  ],
  "wires": [["inject_1", "http_1"], ["http_1", "llm_1"], ["llm_1", "debug_1"]]
}

Exemples Complets

Pipeline complet : API → LLM → Notification

Récupère des données d'une API, les analyse avec un LLM, et envoie une notification.

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"5\"}", "sortie": "msg", "x": 100, "y": 100},
    {"id": "http_1", "type": "http", "url": "https://jsonplaceholder.typicode.com/posts?userId={{msg.payload}}", "method": "GET", "headers": "{}", "sortie": "posts", "x": 280, "y": 100},
    {"id": "code_1", "type": "code", "code": "const p = etat.posts.payload; return { count: p.length, titles: p.slice(0,3).map(x => x.title) };", "sortie": "stats", "x": 460, "y": 100},
    {"id": "llm_1", "type": "llm", "prompt": "L'utilisateur a {{stats.payload.count}} posts. Voici les 3 premiers titres: {{stats.payload.titles}}. Fais un résumé.", "model": "google/gemini-2.0-flash-001", "sortie": "resume", "x": 640, "y": 100},
    {"id": "debug_1", "type": "debug", "label": "Résumé final", "x": 820, "y": 100}
  ],
  "wires": [["inject_1", "http_1"], ["http_1", "code_1"], ["code_1", "llm_1"], ["llm_1", "debug_1"]]
}

Workflow avec condition

Analyse un texte et applique un traitement différent selon sa longueur.

{
  "nodes": [
    {"id": "inject_1", "type": "inject", "data": "{\"payload\": \"Ceci est un texte de test pour vérifier le fonctionnement du workflow conditionnel.\"}", "sortie": "msg", "x": 100, "y": 150},
    {"id": "cond_1", "type": "condition", "si": "msg.payload.length > 50", "labelTrue": "Long", "labelFalse": "Court", "sortie": "check", "x": 280, "y": 150},
    {"id": "llm_long", "type": "llm", "prompt": "Résume ce texte long en 2 mots: {{msg.payload}}", "model": "google/gemini-2.0-flash-001", "sortie": "resume", "x": 460, "y": 80},
    {"id": "llm_court", "type": "llm", "prompt": "Développe ce texte court: {{msg.payload}}", "model": "google/gemini-2.0-flash-001", "sortie": "dev", "x": 460, "y": 220},
    {"id": "debug_1", "type": "debug", "label": "Résultat", "x": 640, "y": 150}
  ],
  "wires": [["inject_1", "cond_1"], ["cond_1", "llm_long"], ["cond_1", "llm_court"], ["llm_long", "debug_1"], ["llm_court", "debug_1"]]
}