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).
Un flow est composé de deux parties :
Les triggers n'ont pas d'entrée et démarrent l'exécution du flow.
Injecte des données au démarrage du flow. C'est généralement le premier nœud.
| Propriété | Type | Description |
|---|---|---|
data | string (JSON) | Données à injecter, format: {"payload": "valeur"} |
sortie | string | Nom de la variable de sortie (généralement "msg") |
{
"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"]]
}
Déclenche le flow lors d'une requête HTTP externe. Permet de créer une API.
| Propriété | Type | Description |
|---|---|---|
path | string | Chemin du webhook (ex: "/webhook/mon-flux") |
method | string | "GET", "POST", "PUT" ou "DELETE" |
auth | string | "none" ou "token" |
sortie | string | Variable de sortie contenant la requête |
/api/meta-agents/webhook/:agentId
{
"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"]]
}
Les nœuds de traitement transforment les données.
Appelle un modèle de langage (GPT, Gemini, Claude, etc.) pour générer du texte.
| Propriété | Type | Description |
|---|---|---|
prompt | string | Le prompt avec interpolation {{variable}} |
model | string | ID du modèle (ex: "google/gemini-2.0-flash-001") |
systemPrompt | string | (Optionnel) Instructions système |
sortie | string | Variable de sortie |
{
"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"]]
}
{
"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"]]
}
Effectue une requête HTTP vers une API externe.
| Propriété | Type | Description |
|---|---|---|
url | string | URL avec interpolation possible |
method | string | "GET", "POST", "PUT" ou "DELETE" |
headers | string (JSON) | Headers HTTP (ex: {"Authorization": "Bearer xxx"}) |
body | string | (Optionnel) Corps de la requête pour POST/PUT |
sortie | string | Variable de sortie |
{
"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"]]
}
{
"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"]]
}
Exécute une requête SQL sur la base de données.
| Propriété | Type | Description |
|---|---|---|
query | string | Requête SQL avec paramètres $1, $2, etc. |
params | string (JSON) | Tableau des paramètres avec interpolation |
sortie | string | Variable de sortie |
{
"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"]]
}
Exécute du code JavaScript personnalisé.
| Propriété | Type | Description |
|---|---|---|
code | string | Code JS (accès à etat.msg, etat.variable) |
sortie | string | Variable de sortie |
return { ... }
{
"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"]]
}
Appelle un autre meta-agent ou un assistant/persona.
| Propriété | Type | Description |
|---|---|---|
agentType | string | "meta-agent" ou "assistant" |
agentId | string | ID de l'agent à appeler |
inputMapping | string | Variable d'entrée (ex: "msg.payload") |
maxDepth | number | (Optionnel) Profondeur max d'appels imbriqués |
sortie | string | Variable de sortie |
{
"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"]]
}
Les nœuds de contrôle dirigent le flux d'exécution.
Branchement conditionnel avec deux sorties (vrai/faux).
| Propriété | Type | Description |
|---|---|---|
si | string | Expression JavaScript qui retourne true/false |
labelTrue | string | Label de la branche "vrai" |
labelFalse | string | Label de la branche "faux" |
sortie | string | Variable de sortie |
{
"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"]]
}
Itère sur une collection et accumule les résultats.
| Propriété | Type | Description |
|---|---|---|
sur | string | Variable tableau sur laquelle itérer |
variable | string | Nom de la variable pour chaque élément |
maxIterations | number | (Optionnel) Nombre max d'itérations |
accumuler | string | Variable pour stocker les résultats |
sortie | string | Variable de sortie finale |
{
"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"]]
}
Les nœuds d'interaction permettent de demander une validation humaine.
Met le flow en pause et demande une validation humaine.
| Propriété | Type | Description |
|---|---|---|
message | string | Message à afficher à l'utilisateur |
options | string | Options séparées par \n (ex: "Approuver\nRejeter") |
timeout | number | (Optionnel) Timeout en ms (défaut: 24h) |
relance | number | (Optionnel) Intervalle de relance en ms |
sortie | string | Variable contenant le choix de l'utilisateur |
{
"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"]]
}
Les nœuds de sortie affichent ou envoient les résultats.
Affiche les données dans l'inspecteur pour le debug.
| Propriété | Type | Description |
|---|---|---|
label | string | Libellé affiché dans l'inspecteur |
{
"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"]]
}
Envoie un message à l'utilisateur via WebSocket ou email.
| Propriété | Type | Description |
|---|---|---|
recipientType | string | "current", "specific" ou "from-msg" |
recipientId | string | (Si "specific") ID du destinataire |
messageTemplate | string | Message avec interpolation {{variable}} |
channel | string | "websocket" ou "email" |
sortie | string | Variable de sortie (statut d'envoi) |
{
"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"]]
}
L'interpolation permet d'insérer des valeurs dynamiques dans les propriétés.
{{variable.path}}| Expression | Description |
|---|---|
{{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 |
.payload contenant le résultat.
{
"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"]]
}
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"]]
}
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"]]
}