Orchestration : skill DELEGATE + registre agents + system prompt chef d'orchestre

This commit is contained in:
2026-03-07 12:32:16 +00:00
parent 3ab9ecc155
commit 3dfd621582
3 changed files with 100 additions and 18 deletions
+8
View File
@@ -0,0 +1,8 @@
{
"agent2_debian13": {
"jid" : "agent2_debian13@xmpp.ovh",
"mqtt_inbox" : "agents/agent2_debian13/inbox",
"mqtt_outbox" : "agents/agent1/inbox",
"speciality" : "Administration Debian : apt, dpkg, systemd, conteneurs LXC/Docker, KVM, réseau, sécurité système"
}
}
+16 -18
View File
@@ -1,9 +1,16 @@
Tu es un agent autonome de recherche web. Tu es agent1, chef d'orchestre d'un réseau d'agents autonomes spécialisés.
Tu peux chercher des informations sur internet et lire des pages web. Tu reçois les instructions de sylvain et tu décides de les traiter toi-même ou de les déléguer au bon agent spécialisé.
Tu mémorises les informations importantes pour les réutiliser.
Agents disponibles sous tes ordres :
- agent2_debian13 : Administration Debian (apt, systemd, conteneurs LXC/Docker, KVM, réseau, sécurité système)
Formats de commandes disponibles : Formats de commandes disponibles :
DELEGATE: <agent> | <tâche>
→ Déléguer une tâche à un agent spécialisé et attendre sa réponse
→ Exemple : DELEGATE: agent2_debian13 | Comment mettre à jour les paquets Debian ?
SEARCH: <requête web> SEARCH: <requête web>
→ Recherche web DuckDuckGo (max 5 résultats) → Recherche web DuckDuckGo (max 5 résultats)
@@ -16,19 +23,10 @@ REMEMBER: <clé> | <valeur>
RECALL: <clé> RECALL: <clé>
→ Récupérer une information mémorisée → Récupérer une information mémorisée
⚠ RÈGLES ABSOLUES : ⚠ RÈGLES :
- Pour toute question sur l'actualité, les événements récents, les prix, - Si la demande concerne Debian, Linux, des conteneurs, des VMs ou l'administration système : utilise DELEGATE: agent2_debian13
les versions de logiciels, les personnes en poste, la météo, ou tout - Si la demande concerne l'actualité, des événements récents ou des faits changeants : utilise SEARCH:
fait pouvant avoir changé : utilise TOUJOURS SEARCH:
- Ne JAMAIS répondre de mémoire à une question d'actualité - Ne JAMAIS répondre de mémoire à une question d'actualité
- Commence TOUJOURS par SEARCH: si la question concerne une information - Les agents ne peuvent pas travailler en parallèle : délègue une tâche à la fois
datée ou changeante - Synthétise et transmets la réponse de l'agent spécialisé à sylvain
- Ta date de coupure est ancienne : toute info récente DOIT être vérifiée - Réponds toujours en français. Sois concis mais précis.
via SEARCH:
- Si les résultats de recherche ne sont pas suffisants, utilise READ: sur
les URLs prometteuses pour approfondir
- Mémorise les informations importantes avec REMEMBER:
- Synthétise toujours les informations trouvées de façon claire et concise
Réponds toujours en français. Sois concis mais précis.
Explique ce que tu vas faire avant de le faire.
+76
View File
@@ -0,0 +1,76 @@
"""
Skill : DELEGATE
Délègue une tâche à un agent spécialisé via MQTT et attend sa réponse.
Commande :
DELEGATE: <agent_name> | <tâche>
Exemple :
DELEGATE: agent2_debian13 | Comment installer Docker sur Debian 13 ?
"""
import json
import time
import threading
from pathlib import Path
import paho.mqtt.client as mqtt
SKILL_NAME = "delegate"
TRIGGER = "DELEGATE:"
CONFIG_FILE = Path("/opt/agent/config/config.json")
REGISTRY_FILE = Path("/opt/agent/config/agents_registry.json")
TIMEOUT = 120 # secondes max d'attente
def _load():
cfg = json.loads(CONFIG_FILE.read_text())
registry = json.loads(REGISTRY_FILE.read_text())
return cfg, registry
def execute(args: str) -> str:
if "|" not in args:
return "Erreur : format attendu → DELEGATE: <agent> | <tâche>"
agent_name, _, task = args.partition("|")
agent_name, task = agent_name.strip(), task.strip()
cfg, registry = _load()
if agent_name not in registry:
available = ", ".join(registry.keys())
return "Agent inconnu : «{}». Agents disponibles : {}".format(agent_name, available)
agent = registry[agent_name]
inbox = agent["mqtt_inbox"]
outbox = agent["mqtt_outbox"]
host = cfg.get("mqtt_host", "localhost")
port = int(cfg.get("mqtt_port", 1883))
response_received = threading.Event()
response_container = []
def on_message(client, userdata, msg):
response_container.append(msg.payload.decode(errors="replace"))
response_received.set()
# Souscription à la réponse
sub = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="agent1_delegate_sub")
sub.on_message = on_message
sub.connect(host, port)
sub.subscribe(outbox)
sub.loop_start()
# Envoi de la tâche
pub = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="agent1_delegate_pub")
pub.connect(host, port)
pub.publish(inbox, task)
pub.disconnect()
print("[DELEGATE] Tâche envoyée à {} : {}".format(agent_name, task[:80]))
# Attente de la réponse
received = response_received.wait(timeout=TIMEOUT)
sub.loop_stop()
sub.disconnect()
if received and response_container:
return "[{}] {}".format(agent_name, response_container[0])
return "Timeout : {} n'a pas répondu dans les {}s.".format(agent_name, TIMEOUT)