Sessions surveillées Ajouté en 0.9.10
Un agent peut surveiller d’autres sessions au lieu d’aller voir où elles en sont encore et encore. Il s’abonne, poursuit son propre travail ou attend, et OAR le réveille quand quelque chose se passe dans les sessions surveillées : une question attend une réponse, un turn échoue, une session répond, une tâche de fond se termine. Le réveil est un court message qu’OAR écrit dans la conversation de l’agent qui surveille.
Demandes typiques :
- Garder un œil sur un lot. « Surveille les trois sessions de relecture. Réveille-moi quand l’une pose une question ou échoue, et résume les réponses quand elles ont toutes fini. »
- Attendre une longue tâche. « Lance la suite de tests complète dans une session et surveille-la. Dis-moi quand sa tâche de fond se termine, et préviens-moi si elle échoue. »
- Surveiller une autre machine. « Surveille la session de déploiement
nocturne sur
build-et signale-moi les erreurs. »box
Les sessions peuvent se trouver sur ce relais (avec les
sessions d’agent activées) ou sur un
relais associé. Tous les fournisseurs peuvent surveiller, sauf Claude Cloud et OpenAI Image, dont
les sessions ne peuvent pas s’abonner (voir Par fournisseur). L’outil lui-même,
subscribe de relay_, est décrit dans
Sessions surveillées dans
la référence ; cette page explique ce que vous voyez et ce que vous contrôlez.
Ce qui réveille un agent qui surveille #
Un abonnement nomme les sessions à surveiller, ou toutes les sessions d’un relais, y compris celles créées plus tard. Il peut demander à être prévenu de :
| Événement | En clair |
|---|---|
| Question | Une session surveillée attend une réponse ou une approbation. Le message contient la question et ses options. Ajouté en 0.9.16 Pour une question non bloquante, l’abonnement est aussi informé plus tard de votre réponse. |
| Error (Erreur) | Un turn a échoué, une limite d’utilisation a été atteinte, ou le processus de l’agent de la session s’est arrêté brutalement. |
| Reply (Réponse) | Une session a terminé un turn. Le message contient le début de la réponse. |
| Task started, finished, failed (Tâche démarrée, terminée, échouée) | Un agent en arrière-plan ou une tâche shell d’une session surveillée a démarré (seulement si l’abonnement le demande), s’est terminé ou a échoué. Une commande shell qui se termine avec un code non nul compte comme un échec. |
| Stalled (Bloquée) | Une session est silencieuse alors qu’elle travaille encore. |
| All idle (Toutes inactives) | Plus rien ne tourne dans les sessions surveillées. |
Ajouté en 0.9.13 Un abonnement qui ne nomme aucun événement n’est pas réveillé par une commande shell ou un moniteur qui s’est bien terminé : une session occupée en termine un à peu près chaque minute, et chacun coûterait à l’agent qui surveille un turn sur tout son contexte. Les subagents terminés et les tâches échouées le réveillent toujours. Un agent qui doit suivre chaque commande demande chaque fin de tâche. Les abonnements créés auparavant sans nommer d’événements passent d’eux-mêmes à ce comportement par défaut ; ceux qui nommaient leurs événements les conservent.
Les noms exacts des événements, et les options d’un abonnement (une expression régulière à laquelle les réponses et les résultats de tâche doivent correspondre, la fin après un premier déclenchement, le temps de silence avant stalled), se trouvent dans la référence.
La conversation de l’agent qui surveille n’est jamais surveillée, ses propres turns ne peuvent donc pas le réveiller.
Un abonnement ne fait que notifier
Il n’approuve rien et ne répond à rien. La question d’une session surveillée reste ouverte jusqu’à ce que vous, ou l’agent autorisé à y répondre, le fassiez, exactement comme avant. Une carte d’approbation dans une session surveillée ne peut recevoir de réponse que de vous ; l’événement le précise.
La carte d’approbation #
La première fois qu’un agent d’une conversation s’abonne à des sessions d’un relais, il doit vous le demander. Une carte d’approbation apparaît dans cette conversation :
This agent wants to watch “Review: server/” (3f9c…), “Review: web/” (a12b…) and be woken by their events.
Events: question_asked, error, turn_end, subagent_finished, task_failed, stalled, all_idle
| Votre choix | Ce qui se passe |
|---|---|
| Allow (Autoriser) | L’abonnement est créé. Les abonnements ultérieurs de la conversation à des sessions du même relais n’ont pas besoin d’une nouvelle carte. |
| Deny (Refuser) | L’abonnement est refusé. L’agent en est informé et continue sans lui. |
Cas particuliers :
- Toutes les sessions. Un abonnement à
allest toujours écrit en toutes lettres : « ALL sessions of this relay, including ones created later » (TOUTES les sessions de ce relais, y compris celles créées plus tard) ; Ajouté en 0.9.16 avec « except N it leaves out » (sauf N qu’il laisse de côté) quand il laisse des sessions de côté. Si la première carte ne portait pas surall, un abonnement ultérieur àallredemande. Si c’était le cas, Allow couvre tous les abonnements ultérieurs,allcompris. - Un relais associé. La carte nomme le relais. Chaque relais est demandé séparément, et rien n’est demandé sur l’autre relais.
- Reprise. Un agent qui remplace un autre agent qui surveille peut
reprendre tous les abonnements de l’ancien. Cela demande toujours, quel que
soit le nombre de cartes que vous avez autorisées auparavant. La carte
indique combien d’abonnements sont transférés et depuis quelle session ;
l’ancienne session cesse de recevoir leurs événements, et les abonnements
gardent leurs réglages. Votre Allow vaut aussi approbation pour les
abonnements sur les relais concernés,
allcompris si l’un d’eux surveillait toutes les sessions.
Ajouté en 0.9.16 La carte nomme aussi les options d’un abonnement : once (une fois), heartbeat every N min (battement toutes les N min), digest every N min (résumé toutes les N min) et quiet HH:MM–HH:MM (calme HH:MM–HH:MM) avec le fuseau horaire.
La carte s’affiche dans tous les modes du relais : elle ne dépend pas de ask, plan ou agent. L’approbation appartient à la conversation et est conservée après un redémarrage du relais.
Ce que vous voyez #
La puce et sa liste #
Tant qu’une conversation a des abonnements, son en-tête affiche watching N sessions (surveille N sessions), en comptant chaque session distincte qu’elle surveille. Avec un abonnement à toutes les sessions, il affiche watching all sessions (surveille toutes les sessions), suivi de (+N listed) (+N listées) quand la conversation nomme aussi des sessions. Ajouté en 0.9.16 Une petite indication à côté montre les options d’un abonnement, digest N min (récapitulatif N min) ou quiet HH:MM–HH:MM, deux au plus. Cliquez sur la puce pour ouvrir la liste : une ligne par abonnement, avec les sessions (ou le relais), les événements, et s’il est once ou a un signal de vie, Ajouté en 0.9.16 un récapitulatif, des heures calmes ou des sessions laissées de côté, N left out (N omises). Unsubscribe (Se désabonner) met fin à cet abonnement immédiatement, sans demander à l’agent.
Le badge watched #
Une session qu’une autre conversation surveille nommément porte un badge watched (surveillé) dans la liste des sessions et dans son en-tête. Survolez-le pour voir qui surveille ; un agent sur un relais associé apparaît sous la forme de sa session et de son relais. Un abonnement à toutes les sessions n’ajoute pas de badge dans la liste des sessions, seulement dans l’en-tête de chaque session. Un abonnement de votre part sur un relais associé n’ajoute pas de badge de votre côté. Ajouté en 0.9.16 Une session qu’un abonnement à toutes les sessions laisse de côté n’affiche pas de badge pour lui.
Lignes d’événement #
Dans le fil de la conversation de l’agent qui surveille, un événement est une ligne compacte marquée relay event (événement du relais), jamais l’un de vos messages. Elle est repliée sur une ligne comme :
relay event 3 events · question, reply
Ouvrez-la pour lire les lignes, par exemple :
[relay event] session "Review: server/" (3f9c…): turn_end (done) "Found 4 places without input checks: …"
Une ligne avec une question ou une erreur reste ouverte. Une ligne qui rassemble des événements retenus par la limite horaire commence par Digest (Récapitulatif) ; Ajouté en 0.9.16 c’est aussi le cas de celle qu’a rassemblée le récapitulatif d’un abonnement, et celle retenue pendant les heures calmes commence par After quiet hours (Après les heures calmes). Une ligne marquée replayed (rejoué) contient les événements qu’un relais associé a conservés pendant que la liaison était coupée.
Derrière la ligne se trouve un message qui commence par une ligne indiquant qu’il est automatique, qu’il ne vient pas de vous et qu’il n’approuve rien. L’agent lit aussi cette ligne.
Quand l’agent qui surveille est occupé #
- Inactif. Le message démarre un nouveau turn.
- Au milieu d’un turn. Sur Claude, sur DeepSeek et sur le moteur SDK de GitHub Copilot et d’OpenAI, le message est injecté dans le turn en cours pour le piloter. Sur les autres fournisseurs, il attend et devient le turn suivant. Les événements qui arrivent pendant qu’un message attend encore y sont ajoutés, si bien qu’un agent occupé reçoit une seule relance, et non une par événement.
Rythme #
Chaque réveil coûte un turn à l’agent qui surveille, c’est pourquoi OAR les limite.
- Regroupement. Les événements survenus en 30 secondes arrivent en un seul message.
- Plafond horaire. Après 20 réveils au cours de la dernière heure, le reste est retenu et envoyé sous forme de récapitulatif toutes les 10 minutes. Les réveils par lots de 30 secondes reprennent dès que moins de 20 réveils tombent dans la dernière heure.
- Jamais retenus. Une question, Ajouté en 0.9.16 votre réponse à une question posée, et une erreur arrivent toujours immédiatement, même au-delà du plafond. Elles comptent quand même dans celui-ci.
- Bloquée. Une session est considérée comme bloquée quand elle est silencieuse depuis 15 minutes (ou la durée choisie par l’abonnement) alors qu’un turn ou une tâche de fond tourne encore. C’est signalé une fois par période de silence. Une session qui attend une réponse n’est pas bloquée : sa question a déjà été signalée.
- Signal de vie. Si l’agent en a demandé un, il reçoit un message à cet intervalle tant qu’un turn ou une tâche surveillés tourne, et aucun tant que tout est inactif. Cela indique à l’agent que sa surveillance fonctionne. Un signal de vie n’est pas retenu pour le récapitulatif et ne compte pas dans le plafond.
Les mêmes valeurs figurent dans Comment arrivent les événements dans la référence.
Moins de réveils Ajouté en 0.9.16 #
Un agent peut demander moins de réveils par abonnement. Une question et une erreur arrivent toujours immédiatement ; tout le reste attend.
| Option | Ce qu’elle fait |
|---|---|
Récapitulatif (digest_, de 1 à 1440) |
Les événements de l’abonnement arrivent en un seul message toutes les N minutes, le suivant au plus tôt N minutes après le précédent. |
Heures calmes (quiet_, par exemple {"from":"23:) |
Une plage quotidienne dans un fuseau horaire, qui peut passer minuit et suit les changements d’heure. Ce qui se passe pendant cette plage arrive en un seul message à sa fin, marqué comme retenu pendant les heures calmes. Aucun signal de vie n’est envoyé pendant la plage. |
Sessions laissées de côté (exclude, jusqu’à 50 ids de session) |
Un abonnement à toutes les sessions les ignore, y compris pour « plus rien ne tourne » et pour le signal de vie. |
La nuit où l’on recule les horloges et où l’heure de fin revient deux fois, la plage se termine la première fois et n’est pas reprise pendant l’heure répétée ; la nuit où l’on avance les horloges et où l’heure de fin est sautée, elle se termine au moment du saut. Une limite : une heure de début située dans l’heure répétée démarre la plage au premier passage, et au second passage, les minutes avant l’heure de début comptent comme hors de la plage.
Pas d’écho. Quand l’agent qui surveille envoie lui-même un prompt à une
session et attend la réponse terminée (avec send, create_ ou un
wait ultérieur), la réponse de ce turn ne le réveille pas une seconde fois.
Ses erreurs et ses questions le réveillent toujours, et un prompt dont il n’a
pas attendu la réponse le réveille comme avant.
Les événements retenus survivent à un redémarrage du relais, et le plafond
horaire s’applique toujours en plus. Avec list_, l’agent voit combien d’événements chaque abonnement
retient et quand ils sont dus. Les détails se trouvent dans
Moins de réveils dans la référence.
Durée d’un abonnement #
Un abonnement prend fin quand :
- l’agent ou vous vous désabonnez ;
- la conversation de l’agent qui surveille est archivée ou supprimée ;
- une session surveillée est archivée ou supprimée. Un abonnement qui liste plusieurs sessions garde les autres, et prend fin avec la dernière ;
- c’était un abonnement once et il s’est déclenché (avec une expression régulière, à sa première correspondance) ;
- pour un relais associé, l’association est supprimée : les abonnements sur ce relais prennent fin immédiatement.
Les abonnements et les événements pas encore remis survivent à un redémarrage du relais.
Une conversation peut avoir 20 abonnements à la fois.
Sessions sur un relais associé #
Surveiller une session sur un relais associé demande la même chose que tout
appel relay_ vers ce relais :
- le relais est déverrouillé dans la conversation ;
- son niveau Agents may (Les agents peuvent) pour ce relais est au moins la lecture (ce qu’autorise un relais associé) ;
- l’autre relais accepte les agents d’autres relais, avec Accept prompts from other relays' agents (Accepter les prompts des agents d’autres relais).
La carte est demandée ici, comme décrit plus haut. L’association n’a besoin d’exister que dans un sens. Votre relais récupère les événements de l’autre toutes les quelques secondes, et leurs lignes commencent par le nom de l’autre relais :
[relay event] build-box · session "Nightly deploy" (77aa…): turn_end (done) "Deployed. The health check is green."
Si l’autre relais ne répond pas pendant une minute, la liaison est considérée
comme perdue. L’autre relais conserve ce qui se passe : jusqu’à 500 événements
par abonnement, pendant 7 jours au plus. Quand il répond de nouveau, une seule
ligne marquée replayed les apporte, questions et erreurs en premier, entre
une ligne link_ et une ligne link_. S’il s’est passé plus de
choses qu’il ne pouvait en garder, la dernière ligne indique combien ont été
perdues. Un abonnement que personne n’a récupéré pendant 7 jours prend fin
là-bas. Ajouté en 0.9.16 Les événements rejoués respectent le récapitulatif et
les heures calmes de l’abonnement comme les autres ; la dernière ligne indique
alors combien d’entre eux arriveront plus tard.
Ajouté en 0.9.16 Le récapitulatif et les heures calmes d’un abonnement à un
relais associé s’appliquent ici, là où se trouve l’agent qui surveille ;
l’autre relais est informé des sessions laissées de côté. Un relais associé
sous une ancienne version d’OAR ne connaît pas exclude : votre relais écarte
quand même les événements de ces sessions, mais ce relais les compte pour
« plus rien ne tourne », pour les blocages et dans la liste du signal de vie.
Un relais associé sous une ancienne version d’OAR répond qu’il a besoin d’une mise à jour.
Par fournisseur #
Les sessions qui peuvent être surveillées ne dépendent pas du fournisseur : toute session du relais peut l’être. Ce qui diffère, c’est la session qui surveille.
| Fournisseur de la session qui surveille | Peut s’abonner | Événement pendant un turn |
|---|---|---|
| Claude | oui | injecté dans le turn en cours pour le piloter |
| DeepSeek Ajouté en 0.9.17 | oui | injecté dans le turn en cours pour le piloter |
| GitHub Copilot, OpenAI, moteur SDK | oui | injecté dans le turn en cours pour le piloter |
| GitHub Copilot, OpenAI, moteur d’extension | oui | devient le turn suivant |
| Cursor | oui | devient le turn suivant |
| Grok | oui | devient le turn suivant |
| Claude Cloud | non : il n’a pas relay_ |
|
| OpenAI Image | non : il appelle l’API Images et ne fait tourner aucun agent |
Quels fournisseurs reçoivent relay_ est indiqué dans
Outils d’agent.
Sessions démarrées avant la mise à jour
Un worker de session construit ses outils au démarrage. Une conversation dont
l’agent tournait déjà quand vous êtes passé à 0.9.10 n’a pas subscribe
tant qu’elle n’a pas été redémarrée : Kill session (Tuer la session) sur une session inactive suffit.