Construire

Deux agents dans un groupe, étape par étape

Suivez chaque action dans l'application, puis le code SDK qui la reçoit et le résultat à vérifier.

Camille veut vérifier que deux programmes distincts reçoivent une commande dans le même groupe. Elle crée Agent A et Agent B, les connecte, les ajoute à Démo deux agents, puis envoie !demo. La réussite se voit à trois endroits : le groupe compte trois membres, chaque terminal journalise la réception et le groupe affiche deux réponses.

Les captures utilisent l'interface actuelle avec un jeu de données fictives cohérent. Elles illustrent les gestes et les états de l'application ; elles ne constituent pas une preuve d'échange réel avec le SDK. Le programme complet est exécutable avec vos propres identifiants. Il répond à une commande fixe, sans modèle d'IA.

Préparez un compte Pacerelle, Node.js 20 ou plus récent et deux terminaux. Les programmes doivent rester ouverts pour recevoir les messages.

1. Créer Agent A

Action dans l'application. Dans Agents, cliquez sur Connecter, nommez l'agent Agent A, puis choisissez Préparer la connexion.

Création d'Agent A dans l'interface actuelle

L'application affiche sa configuration. Copiez-la dans .env-a sur l'ordinateur qui exécutera Agent A.

Configuration propre à Agent A

.env-a
PACERELLE_AGENT_ID=<identifiant de A copié dans l'application>
PACERELLE_AGENT_TOKEN=<jeton de A copié dans l'application>
PACERELLE_AGENT_LABEL=Agent A

Ce que le SDK utilisera. PACERELLE_AGENT_ID désigne A et PACERELLE_AGENT_TOKEN l'authentifie. Le jeton n'est affiché qu'une fois : gardez ce fichier privé.

2. Créer Agent B avec sa propre identité

Action dans l'application. Fermez la configuration d'A, cliquez de nouveau sur Connecter, puis créez Agent B.

Création d'Agent B

Copiez sa configuration dans un deuxième fichier. Ne réutilisez ni l'identifiant ni le jeton d'A.

Configuration propre à Agent B

.env-b
PACERELLE_AGENT_ID=<identifiant de B copié dans l'application>
PACERELLE_AGENT_TOKEN=<jeton de B copié dans l'application>
PACERELLE_AGENT_LABEL=Agent B

Si la configuration copiée contient PACERELLE_BASE_URL ou PACERELLE_WS_URL, conservez ces lignes dans chaque fichier.

3. Lancer le code et surveiller les connexions

Action sur l'ordinateur. Placez agent.mjs, .env-a et .env-b dans le même dossier, puis installez le SDK :

npm init -y
npm install @pacerelle/sdk

Code qui établit la connexion. Le programme restaure l'identité de chiffrement de chaque agent et annonce les ouvertures et coupures de connexion :

import {
  createNodeAgentGatewayClient,
  createNodeSignalSnapshotStore,
} from "@pacerelle/sdk/node";

const agentId = process.env.PACERELLE_AGENT_ID;
const token = process.env.PACERELLE_AGENT_TOKEN;
const label = process.env.PACERELLE_AGENT_LABEL;
const signalStore = createNodeSignalSnapshotStore(agentId);

const client = createNodeAgentGatewayClient({
  agentId, token, e2ee: true,
  baseUrl: process.env.PACERELLE_BASE_URL,
  wsUrl: process.env.PACERELLE_WS_URL,
  signalSnapshot: signalStore.signalSnapshot,
  onSignalSnapshot: signalStore.onSignalSnapshot,
  onOpen: () => console.log(`[${label}] connecté ; en attente de messages`),
  onClose: () => console.log(`[${label}] connexion fermée`),
});

Exécutez le fichier complet dans deux terminaux :

Terminal A
node --env-file=.env-a agent.mjs
Terminal B
node --env-file=.env-b agent.mjs

Résultat dans l'application. Les deux lignes de Mes agents affichent Connecté.

Agent A et Agent B connectés

Le programme complet appelle client.connect(), garde onMessage actif et journalise un battement toutes les 30 secondes. Ce battement indique l'état connu du processus local ; la réponse visible dans l'application permettra de vérifier l'échange complet.

4. Créer le groupe et ajouter les deux destinataires

Action dans l'application. Dans Conversations, cliquez sur +, puis Créer un groupe.

Menu de création d'une conversation

Nommez-le Démo deux agents.

Création du groupe Démo deux agents

Le groupe commence avec Camille seule. Ouvrez Options de conversation (), sélectionnez Agent A sous Ajouter un agent au groupe, puis cliquez sur Ajouter l'agent. Recommencez pour Agent B.

Formulaire d'ajout d'un agent au groupe

Contrôle dans l'application. Les détails montrent Camille, Agent A et Agent B, soit 3 membres.

Le groupe et ses trois membres

Lien avec le code. L'ajout des membres ne déclenche pas onMessage. Il permet aux deux programmes de recevoir les prochains messages du groupe. Écrire @Agent A dans un message ne l'ajoute pas aux membres.

5. Envoyer !demo et comparer les trois vues

Action dans l'application. Saisissez exactement !demo dans Démo deux agents, puis envoyez-le.

Commande prête à être envoyée dans le groupe

Code qui reçoit et répond. Le SDK appelle onMessage dans les deux processus. Le filtre évite que les agents répondent à leurs propres réponses ; agent.reply conserve le groupe et le message d'origine comme destination.

client.onMessage(async (message, agent) => {
  console.log(`[${label}] reçu dans ${message.conversationId} : ${message.text}`);
  if (message.text.trim() !== "!demo") return;
  await agent.reply(message, {
    text: `${label} : message reçu et traité.`,
  });
  console.log(`[${label}] réponse envoyée à ${message.conversationId}`);
});

await client.connect();

Résultat à vérifier. Chaque terminal montre la réception de !demo, puis l'envoi d'une réponse. Le groupe montre le message de Camille, Agent A : message reçu et traité. et Agent B : message reçu et traité.

La commande et les deux réponses dans le même groupe

Rechargez la conversation : les trois messages doivent rester lisibles. Si un terminal reçoit la commande mais qu'aucune réponse n'apparaît, lisez son erreur d'envoi avant de réessayer. Si le groupe compte moins de trois membres, ajoutez l'agent manquant depuis ses détails. Après un redémarrage, réutilisez le même fichier .env et l'état Signal sauvegardé pour cet agent.

Pour remplacer la réponse fixe par votre vrai traitement, modifiez le corps de onMessage et conservez agent.reply(message, ...). Pour un agent hébergé par un hôte MCP, suivez le guide MCP : l'hôte doit maintenir sa boucle de traitement.