File de commandes (2026-01-16)¶
Nous sĂ©rialisons les exĂ©cutions dâauto-rĂ©ponse entrantes (tous les canaux) via une minuscule file en mĂ©moire du processus afin dâĂ©viter les collisions entre plusieurs exĂ©cutions dâagents, tout en permettant un parallĂ©lisme sĂ»r entre les sessions.
Pourquoi¶
- Les exĂ©cutions dâauto-rĂ©ponse peuvent ĂȘtre coĂ»teuses (appels LLM) et entrer en collision lorsque plusieurs messages entrants arrivent Ă peu dâintervalle.
- La sérialisation évite la concurrence pour des ressources partagées (fichiers de session, journaux, stdin du CLI) et réduit le risque de limites de débit en amont.
Fonctionnement¶
- Une file FIFO consciente des lanes draine chaque lane avec un plafond de concurrence configurable (par défaut 1 pour les lanes non configurées ; la lane principale est à 4 par défaut, la lane subagent à 8).
runEmbeddedPiAgentmet en file par clé de session (lanesession:<key>) afin de garantir une seule exécution active par session.- Chaque exécution de session est ensuite mise en file dans une lane globale (
mainpar dĂ©faut) afin que le parallĂ©lisme global soit plafonnĂ© paragents.defaults.maxConcurrent. - Lorsque la journalisation verbeuse est activĂ©e, les exĂ©cutions en file Ă©mettent un bref avis si elles ont attendu plus dâenviron ~2 s avant de dĂ©marrer.
- Les indicateurs de saisie se dĂ©clenchent toujours immĂ©diatement lors de la mise en file (lorsque le canal le prend en charge), de sorte que lâexpĂ©rience utilisateur reste inchangĂ©e pendant lâattente.
Modes de file (par canal)¶
Les messages entrants peuvent orienter lâexĂ©cution en cours, attendre un tour de suivi, ou faire les deux :
steer: injecte immĂ©diatement dans lâexĂ©cution en cours (annule les appels dâoutil en attente aprĂšs la prochaine frontiĂšre dâoutil). En lâabsence de streaming, revient au suivi.followup: met en file pour le prochain tour de lâagent aprĂšs la fin de lâexĂ©cution en cours.collect: fusionne tous les messages en file en un seul tour de suivi (par dĂ©faut). Si les messages ciblent des canaux/fils diffĂ©rents, ils sont drainĂ©s individuellement pour prĂ©server le routage.steer-backlog(aliassteer+backlog) : oriente maintenant et conserve le message pour un tour de suivi.interrupt(hĂ©ritĂ©) : abandonne lâexĂ©cution active pour cette session, puis exĂ©cute le message le plus rĂ©cent.queue(alias hĂ©ritĂ©) : identique Ăsteer.
Steer-backlog signifie que vous pouvez obtenir une rĂ©ponse de suivi aprĂšs lâexĂ©cution orientĂ©e ; ainsi,
les surfaces en streaming peuvent sembler produire des doublons. Préférez collect/steer si vous souhaitez
une réponse par message entrant.
Envoyez /queue collect comme commande autonome (par session) ou définissez messages.queue.byChannel.discord: "collect".
Valeurs par dĂ©faut (lorsquâelles ne sont pas dĂ©finies dans la configuration) :
- Toutes les surfaces â
collect
Configurez globalement ou par canal via messages.queue :
{
messages: {
queue: {
mode: "collect",
debounceMs: 1000,
cap: 20,
drop: "summarize",
byChannel: { discord: "collect" },
},
},
}
Options de la file d'attente¶
Les options sâappliquent Ă followup, collect et steer-backlog (ainsi quâĂ steer lorsquâil revient au suivi) :
debounceMs: attendre une pĂ©riode de calme avant de dĂ©marrer un tour de suivi (empĂȘche « continuer, continuer »).cap: nombre maximal de messages en file par session.drop: politique de dĂ©passement (old,new,summarize).
Le mode « summarize » conserve une courte liste Ă puces des messages supprimĂ©s et lâinjecte comme une invite de suivi synthĂ©tique.
Valeurs par défaut : debounceMs: 1000, cap: 20, drop: summarize.
Remplacements par session¶
- Envoyez
/queue <mode>comme commande autonome pour enregistrer le mode pour la session en cours. - Les options peuvent ĂȘtre combinĂ©es :
/queue collect debounce:2s cap:25 drop:summarize /queue defaultou/queue resetefface le remplacement de session.
Portée et garanties¶
- Sâapplique aux exĂ©cutions dâagents en auto-rĂ©ponse sur tous les canaux entrants qui utilisent le pipeline de rĂ©ponse de la Gateway (passerelle) (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat, etc.).
- La lane par défaut (
main) est Ă lâĂ©chelle du processus pour les entrants + battements de cĆur principaux ; dĂ©finissezagents.defaults.maxConcurrentpour autoriser plusieurs sessions en parallĂšle. - Des lanes supplĂ©mentaires peuvent exister (par ex.
cron,subagent) afin que les tĂąches en arriĂšre-plan puissent sâexĂ©cuter en parallĂšle sans bloquer les rĂ©ponses entrantes. - Les lanes par session garantissent quâune seule exĂ©cution dâagent touche une session donnĂ©e Ă la fois.
- Aucune dépendance externe ni threads de workers en arriÚre-plan ; TypeScript pur + promesses.
Problemes courants¶
- Si des commandes semblent bloquĂ©es, activez les journaux verbeux et recherchez les lignes « queued for âŠms » pour confirmer que la file se vide.
- Si vous avez besoin de la profondeur de file, activez les journaux verbeux et surveillez les lignes de temporisation de la file.