relay_tool Ajouté en 0.9.4
Avec relay_, un agent travaille avec d’autres sessions : il les liste et
les lit, envoie un prompt à l’une d’elles, en démarre une nouvelle, attend la
réponse, répond à une question posée par l’autre agent, arrête ou archive une
session, et peut demander à être réveillé quand quelque chose se passe dans les
sessions qu’il surveille.
Il atteint deux sortes de relais :
- Ce relais, celui sur lequel l’agent lui-même tourne. Un agent peut confier des parties de sa tâche à d’autres sessions ici. Désactivé tant que vous ne l’activez pas. Ajouté en 0.9.7
- Les relais associés, d’autres relais OAR que vous avez associés à celui-ci, par exemple le relais de votre poste de travail et celui d’un serveur. Verrouillés dans chaque conversation tant que vous ne mentionnez pas le relais.
L’outil est le même pour tous les fournisseurs qui le proposent ; voir Par fournisseur pour savoir lesquels, et sous quel nom.
Le nom Ajouté en 0.9.18 #
Jusqu’à 0.9.17, l’outil s’appelait remote_. Il est désormais listé sous
relay_ chez tous les fournisseurs (l’agent de Claude voit mcp__),
avec les mêmes actions et les mêmes champs. Les lignes d’outil écrites sous
l’ancien nom s’affichent toujours comme cet outil.
- Les sessions qui tournaient pendant la mise à jour. L’agent d’une session
reçoit sa liste d’outils au démarrage de son worker, et les workers continuent
de tourner pendant le redémarrage du relais. L’agent d’une telle session a
toujours l’outil sous le nom
remote_jusqu’au prochain démarrage de son worker, par exemple après Kill session (Tuer la session). Ses appels continuent de fonctionner : ils atteignent le relais de la même façon sous l’un ou l’autre nom. Là où le relais tourne comme service Linux, les workers peuvent s’arrêter avec le relais, puis revenir avec le nouveau nom.relay - Le serveur MCP propre à OAR, qu’utilisent Grok et le moteur d’extension
de Copilot, exécute toujours un appel à
remote_, mais ne le liste plus.relay - Vos propres instructions. Si vos instructions, vos règles de permission
ou vos hooks nomment
remote_ourelay mcp__, remplacez-les parrelay__ remote_ relay relay_outool mcp__: en dehors du serveur MCP d’OAR, l’ancien nom est refusé.relay__ relay_ tool
Ce que vous voyez #
- Cartes d’approbation. Une carte de question demande avant la première session qu’un agent démarre dans une conversation, avant qu’il surveille des sessions pour la première fois, et avant chaque action d’écriture tant que la conversation est dans le mode du relais ask ou plan.
- L’appel d’outil dans la réponse. L’activité de l’agent affiche chaque appel avec un 🛰️, l’action, le relais et la session.
- "via agent" (via un agent). Une session qu’un agent a démarrée porte via agent · "title" dans la liste des conversations et sous son titre, qui nomme la conversation dans laquelle l’agent tourne. Ajouté en 0.9.11 Elle se trouve dans un groupe de sessions sous cette conversation, Ajouté en 0.9.16 ou dans un groupe existant que l’agent a nommé.
- "↗ from …" (de …). Un prompt envoyé par un agent porte, côté destinataire, un badge avec le relais, la session et le modèle qui l’ont envoyé.
- Surveillance. Une conversation qui en surveille d’autres affiche watching N sessions (surveille N sessions) dans son en-tête ; la puce liste ses abonnements, chacun avec un bouton Unsubscribe (Se désabonner). Une session surveillée affiche un badge watched (surveillé).
L’activer #
relay_ est proposé aux agents dès qu’au moins une de ces conditions est
remplie :
| Pour laisser les agents travailler sur | Faites ceci |
|---|---|
| ce relais | Activez Settings → Relays → Agent sessions → Agents may start and use sessions on this relay (Réglages → Relais → Sessions d’agents → Les agents peuvent démarrer et utiliser des sessions sur ce relais). Désactivé par défaut. |
| un autre relais | Associez-le sous Settings → Relays, puis mentionnez-le dans la conversation (@name). |
Une session apprend si elle reçoit l’outil au démarrage du processus de son agent ; une conversation qui tournait déjà peut donc ne pas l’avoir tant que son agent n’a pas redémarré.
Nommer un relais #
Toutes les actions sauf list_ travaillent sur un seul relais, nommé
dans relay :
"this", ou le nom propre de ce relais, désigne le relais sur lequel tourne l’agent. Il n’a pas besoin d’être mentionné.- Un relais associé est désigné par son nom de relais ou son hôte, tels que
list_les affiche.relays
Pour les quatre actions d’abonnement, Ajouté en 0.9.16 les trois actions de
planification et les trois actions de question, relay peut être omis et vaut
alors "this". Les planifications ne fonctionnent que sur ce relais.
Verrouillé et déverrouillé #
Un relais associé reste verrouillé dans une conversation jusqu’à ce que l’une de ces choses se produise :
- Vous le mentionnez dans l’un de vos messages : tapez
@et choisissez-le, ou écrivez son nom ou son nom d’hôte. Un relais dont le nom est une adresse IP oulocalhostne compte qu’avec un@devant. - Un agent de ce relais-là écrit dans la conversation. Le relais est alors ouvert pour que l’agent d’ici puisse répondre.
Une fois déverrouillé, il reste ouvert pour le reste de la conversation. Un
relais verrouillé refuse toute action sauf list_ ; l’agent reçoit la
consigne de vous demander de mentionner le relais.
Permissions et approbations #
Ce qu’autorise un relais associé #
Chaque relais associé a un niveau Agents may (Les agents peuvent) sous Settings → Relays. Les nouvelles associations commencent à Full (Accès complet).
| Niveau | Actions |
|---|---|
Read only (Lecture seule) (read) |
relay_, usage, list_, read_, read_, wait, subscribe, unsubscribe, list_, transfer_ |
Read and prompt (Lecture et prompts) (prompt) |
les précédentes, et send |
Full (full) |
les précédentes, et create_, Ajouté en 0.9.16 update_, answer_, stop, archive |
list_ ne demande aucun niveau. Ce relais lui-même compte toujours comme Full.
De l’autre côté, Accept prompts from other relays' agents (Accepter les prompts des agents d’autres relais) (Settings →
Relays sur le relais associé) désactive tout ce que les agents d’un autre
relais pourraient y modifier ou surveiller : envoyer des prompts, démarrer,
répondre, arrêter et archiver des sessions, et s’y abonner. Lister et lire les
sessions, lire la sortie des tâches, attendre, relay_ et usage
fonctionnent toujours.
Quand on vous demande #
| Situation | Ce qui se passe |
|---|---|
La conversation est dans le mode du relais ask ou plan et l’agent appelle une action d’écriture (send, create_, update_, answer_, stop, archive) |
Une carte de question vous demande à chaque fois. |
Ajouté en 0.9.16 Premier update_ d’une conversation sur une session d’un relais que cette conversation n’a pas démarrée (la vôtre, celle d’un autre agent, ou celle qui a démarré l’agent) |
Une carte nomme la session et ce qui changerait. Allow (Autoriser) couvre les modifications ultérieures de cette conversation sur de telles sessions de ce relais-là. Deny (Refuser) refuse l’appel. Voir update_. |
Premier create_ sur ce relais dans une conversation |
Une carte d’approbation affiche le fournisseur, le dossier ou le dépôt, Ajouté en 0.9.16 le groupe qu’il nomme, et le prompt. Allow couvre toutes les sessions que l’agent de cette conversation démarrera ensuite, y compris après un redémarrage du relais. Deny refuse ce seul appel. |
Premier subscribe d’une conversation sur un relais, et chaque subscribe à all |
Une carte d’approbation nomme les sessions et le relais. |
transfer_ |
Demande toujours. |
| L’agent a envoyé 30 prompts à d’autres agents sans message de votre part | Le suivant demande d’abord. Allow relance le décompte. Ajouté en 0.9.16 Seul un message que vous avez écrit remet le décompte à zéro ; les événements du relais, le message de reprise après une limite d’utilisation et la note après un redémarrage, non. Les planifications vers d’autres sessions comptent aussi (Planifications). |
Ajouté en 0.9.16 schedule pour une autre session dans le mode ask ou plan |
Une carte de question nomme l’heure et le prompt. Une planification pour la propre conversation de l’agent ne demande rien. |
Règles pour les sessions sur ce relais #
- Au plus 4 au travail. Parmi les sessions démarrées par l’agent d’une conversation, 4 peuvent avoir un turn en file ou en cours en même temps. Une cinquième est refusée jusqu’à ce que l’une d’elles ait terminé.
- Un seul niveau. Une session créée par un agent ne peut pas créer de
sessions elle-même, Ajouté en 0.9.16 sauf si vous avez activé Agents in this conversation
may start sessions (Les agents de cette conversation peuvent démarrer des sessions) pour elle.
list_etsessions read_affichent alorssession "may. Aucun agent ne peut régler cet interrupteur.Create Sessions": true - Pas sur elle-même. Un agent ne peut pas utiliser
send,wait,stopniarchivesur la conversation dans laquelle il tourne, ni répondre à sa propre question, Ajouté en 0.9.16 ni modifier ses réglages. - Vos comptes. Les sessions qu’un agent démarre utilisent les comptes fournisseur de ce relais et entrent dans leur consommation.
- Le relais n’archive jamais ces sessions de lui-même. Elles restent dans votre liste jusqu’à ce que vous les archiviez ou les supprimiez, ou que l’agent en archive une.
D’un relais à l’autre #
- Un prompt qui a déjà traversé deux relais n’est pas transmis à un troisième, sauf si vous avez déverrouillé ce relais-là vous-même. La lecture et l’attente ne sont jamais limitées par cette règle.
- Le prompt que reçoit l’autre agent commence par une ligne qui indique qu’un
autre agent lui parle :
[Remote prompt from an agent on relay "…" · session "…" · model · acting for the user]. - Les turns démarrés ainsi n’envoient aucune notification « reply ready » sur l’autre relais. Les cartes de question notifient toujours.
- Les adresses distantes doivent utiliser
https://. Le simplehttp://n’est accepté que pour l’adresse de bouclage et les plages de réseau privé.
Actions #
Chaque appel nomme une action. Le tableau montre ce dont chacune a besoin ;
le niveau est le réglage Agents may le plus bas qui l’autorise sur un
relais associé.
| Action | Ce qu’elle fait | Requiert | Niveau |
|---|---|---|---|
list_ |
les relais et si chacun est déverrouillé | aucun | |
relay_ |
fournisseurs, modèles et dossiers d’un relais | relay |
read |
usage |
ce qui reste au forfait de chaque fournisseur | relay |
read |
list_ |
trouver des sessions | relay |
read |
read_ |
lire les messages récents d’une session | relay, session |
read |
read_ |
lire la fin de la sortie d’une commande de fond | relay, session, task_ |
read |
send |
envoyer un prompt à une session existante | relay, session, text |
prompt |
create_ |
démarrer une session avec un premier prompt | relay, text |
full |
update_ |
Ajouté en 0.9.16 modifier les réglages d’une session pour ses prochains turns | relay, session, un réglage |
full |
wait |
continuer d’attendre une réponse | relay, session, message_ |
read |
answer_ |
répondre à une question posée par l’autre agent | relay, question_, answer ou choices |
full |
stop |
arrêter le turn en cours | relay, session |
full |
archive |
archiver une session | relay, session |
full |
subscribe |
être réveillé par les événements de sessions | sessions |
read |
unsubscribe |
mettre fin à un abonnement | subscription_ |
read |
list_ |
afficher les abonnements | read | |
transfer_ |
reprendre les abonnements d’une autre conversation | from |
read |
schedule |
Ajouté en 0.9.16 faire mettre en file un prompt plus tard par ce relais, une fois ou de façon répétée | text, at ou every_ |
ce relais uniquement |
list_ |
Ajouté en 0.9.16 afficher les planifications d’une conversation | ce relais uniquement | |
unschedule |
Ajouté en 0.9.16 mettre fin à une planification | schedule_ |
ce relais uniquement |
ask |
Ajouté en 0.9.16 vous poser une question sans attendre la réponse | question |
aucun pour sa propre session ; prompt pour une autre |
list_ |
Ajouté en 0.9.16 afficher les questions non bloquantes de la conversation | read | |
withdraw |
Ajouté en 0.9.16 retirer une question non bloquante | question_ |
read |
Un résultat est du JSON. Un appel réussi contient "ok": true, le relay sur
lequel il a travaillé et un summary d’une ligne ; un appel échoué contient
"ok": false, un code et un texte error (Erreurs). Les exemples
ci-dessous montrent les champs principaux, avec des noms et des ids inventés.
Ajouté en 0.9.16 Un argument qu’une action ne prend pas n’est jamais écarté en
silence. create_ et update_ refusent l’appel avec
REMOTE_, nomment leurs propres arguments et ne changent rien :
create_
Toutes les autres actions s’exécutent quand même et listent les arguments
qu’elles n’ont pas pris dans le champ ignored de leur résultat, jusqu’à 20.
Une valeur vide (null, "", false ou une liste vide) compte comme une
absence d’argument, car certains fournisseurs envoient tous les champs.
Trouver relais et sessions #
list_relays #
Liste les relais associés avec name, url, online, version, permission
et unlocked. Quand les sessions d’agent sont activées, ce relais vient en
premier, marqué "self": true. Renvoie aussi la limite d’attente de ce relais.
C’est la seule action qui fonctionne sans mention et sans relay.
{ "action": "list_relays" }
{
"ok": true,
"summary": "list_relays: 2 relays, 1 unlocked",
"self": { "name": "desk" },
"relays": [
{ "name": "desk", "self": true, "online": true, "version": "0.9.19", "permission": "full", "unlocked": true },
{ "name": "build-box", "url": "https://build-box.example.com", "online": true, "version": "0.9.19", "permission": "full", "unlocked": false }
],
"limits": { "maxWaitSeconds": 600, "maxActiveSessions": 4 }
}
relay_info #
Ce qu’offre un relais, pour que l’agent puisse choisir un fournisseur, un modèle et un dossier pour une nouvelle session : son nom, sa version et sa plateforme, s’il accepte les prompts d’agents, chaque fournisseur avec son modèle par défaut, ses modèles et ses efforts de raisonnement, les dossiers de travail par défaut et récents, et les modes du relais.
{ "action": "relay_info", "relay": "build-box" }
Ajouté en 0.9.16 Il liste aussi les groupes de sessions du relais dans groups, ceux
qu’un create_ sur ce relais peut nommer : chacun avec id, name (ce
qu’affiche la barre latérale ; le titre de la session de tête pour un groupe que
personne n’a nommé) et member, le groupe à l’activité la plus récente en
premier. Seuls les groupes ayant au moins une session non supprimée sont
listés, 50 au plus ; groups indique leur nombre quand il y en a
davantage. Les ids et les titres des membres n’y figurent pas. Quand les groupes
du relais ne peuvent pas être lus, par exemple parce qu’il fait tourner un OAR
plus ancien, groups vaut null et groups indique pourquoi, et que
create_ ne peut pas y prendre group.
"groups": [
{ "id": "grp_…", "name": "Release 2.4", "memberCount": 3 },
{ "id": "grp_…", "name": "Review: server/", "memberCount": 2 }
]
usage Ajouté en 0.9.10 #
Ce qui reste au forfait de chaque fournisseur sur un relais, comme dans Check Usage (Vérifier la consommation), pour qu’un agent puisse vérifier avant de lancer un travail qui coûte : par fournisseur, un statut et ses compteurs (consommé, allocation, restant, taux d’utilisation, heure de remise à zéro), et si une limite d’utilisation de Claude a mis les turns en pause sur ce relais. Les fournisseurs non configurés ou non suivis l’indiquent. Les noms de compte, les adresses et les tokens ne sont jamais inclus.
{ "action": "usage", "relay": "this" }
list_sessions #
Liste les sessions avec id, title, provider, model, state, cwd,
l’heure de la dernière activité et un nombre de messages. state vaut
running_, background_ (l’agent a répondu, un travail de fond tourne encore) ou
idle ; tasks liste les agents en arrière-plan et les tâches shell.
Ajouté en 0.9.11 Une session d’un groupe de sessions a aussi group : son id,
son name et le role de la session dans le groupe, head ou member.
Ajouté en 0.9.16 create_ peut placer la session qu’il crée dans un
groupe existant, et update_ peut déplacer une session dans un groupe,
y compris un nouveau, ou l’en sortir. Renommer, dissoudre et réorganiser les
groupes restent de votre ressort.
| Paramètre | Type | Défaut | |
|---|---|---|---|
scope |
active | recent | all |
recent |
active : en train de travailler. recent : les plus récentes d’abord. all : parcourir tout, page par page. |
query |
texte | seulement les sessions dont le titre contient ce texte | |
limit |
1–100 | 20 | taille de page |
cursor |
texte | le next de la page précédente |
{ "action": "list_sessions", "relay": "build-box", "scope": "active" }
read_session #
Lit les messages les plus récents d’une session, avec ce qui s’y passe : son
state, une réponse encore en cours d’écriture (in), et les
pending qui attendent une réponse (Ajouté en 0.9.16 chacune avec kind :
ask pour une question non bloquante, ask_ pour une carte sur laquelle la session attend). Ajouté en 0.9.11 Pour une session d’un groupe, group
ajoute les autres membres, jusqu’à 50, chacun avec id, title, role,
state et archived quand il est archivé.
| Paramètre | Type | Défaut | |
|---|---|---|---|
session |
id | requis | depuis list_ ou create_ |
last |
1–50 | 10 | combien de messages récents |
before |
texte | le older de la lecture précédente, pour remonter page par page |
|
include_ |
true | false | false | inclure les lignes d’activité des outils de chaque réponse |
max_ |
500–50000 | 12000 | budget de texte pour tout le résultat ; les longs messages sont coupés et marqués truncated |
{ "action": "read_session", "relay": "build-box", "session": "3f9c…", "last": 5 }
Ajouté en 0.9.12 Chacune des tasks de la session a aussi son task, output
(s’il y a une sortie à lire avec read_)
et, pour une commande dont la sortie est dans un fichier, health :
minutes, quiet et quiet (le réglage de
silence du relais) tant qu’elle
tourne, et les counts de l’exécution de tests quand il y en a.
read_task_output Ajouté en 0.9.12 #
Lit la fin de la sortie d’une commande shell de fond ou d’un moniteur, la même sortie que celle qu’affiche la console de tâche : pendant que la tâche tourne, et pendant une heure après sa fin. Un agent peut ainsi vérifier si une compilation sur un autre relais est encore occupée, est devenue silencieuse ou a des tests en échec, sans demander à l’agent qui l’a lancée.
| Paramètre | Type | Défaut | |
|---|---|---|---|
session |
id | requis | la session qui exécute la tâche |
task_ |
id | requis | le task des tasks de read_ |
lines |
1–500 | 200 | combien des dernières lignes |
Le résultat contient task (description, type, début, status et exit),
tail (les lignes, en texte brut sans couleurs, une ligne répétée étant marquée
[×N]), truncated quand il y a davantage avant elles, stall (les minutes
depuis la dernière sortie, et quiet par rapport au réglage du relais) tant que
la tâche tourne, et counts avec l’exécuteur de tests et ses tests réussis,
échoués et ignorés quand la sortie est une exécution de tests.
Les identifiants sont masqués comme dans la console. Une note indique quand
seule la fin de la sortie existe, quand la sortie n’est plus là, ou quand le
processus de l’agent a été sollicité et que l’appel doit être répété dans
quelques secondes.
{ "action": "read_task_output", "relay": "build-box", "session": "3f9c…", "task_id": "b7k2…", "lines": 50 }
{
"ok": true,
"summary": "read_task_output → build-box session 3f9c2a1e task b7k2m9q4: 50 lines, running, last output 14 min ago, 412 passed, 2 failed",
"task": { "id": "b7k2…", "description": "npm test", "type": "local_bash", "status": "running", "exitCode": null },
"stall": { "minutes": 14, "since": "2026-10-18T09:12:00.000Z", "quiet": true, "quietAfterMinutes": 10 },
"counts": { "runner": "vitest", "passed": 412, "failed": 2, "skipped": 0, "final": false },
"tail": ["…"],
"truncated": true
}
Une tâche qui ne tourne pas et ne s’est pas terminée dans la dernière heure
renvoie REMOTE_ ; un relais antérieur à 0.9.12 renvoie
REMOTE_.
Envoyer des prompts #
send #
Met un prompt en file dans une session existante et attend la réponse.
| Paramètre | Type | Défaut | |
|---|---|---|---|
session |
id | requis | |
text |
texte, jusqu’à 100 000 caractères | requis | le prompt |
wait_ |
0–3600 | 120 | combien de temps attendre la réponse ; 0 rend la main aussitôt. Voir L’attente. |
if_ |
queue | fail |
queue |
queue ajoute le prompt derrière le turn en cours, ou l’injecte dans ce turn pour le piloter là où le fournisseur le permet. fail refuse quand la session est occupée. |
mode |
plan | ask | agent | autopilot |
le mode de l’appelant | mode du relais pour ce turn |
model |
texte | la session garde le sien | fait passer la session sur ce modèle. Ajouté en 0.9.13 Vérifié d’abord : voir Quels modèles sont acceptés |
effort |
texte | la session garde le sien | effort de raisonnement, par exemple low, medium, high ; l’autre relais décide si son modèle le prend. Une session DeepSeek tourne en low, high ou max et ramène les autres noms sur ceux-ci, medium sur high par exemple (DeepSeek) |
provider |
claude | claude- |
la session garde sa facturation | Ajouté en 0.9.18 seulement pour une session Claude : claude (l’abonnement) ou claude- (la clé d’API). Nommer l’autre facturation fait basculer la session à partir de son prochain turn, en même temps que ce message. Voir Changer de facturation |
{ "action": "send", "relay": "build-box", "session": "3f9c…", "text": "Did last night's deploy go through? Answer in two lines." }
{
"ok": true,
"relay": "build-box",
"status": "done",
"session": "3f9c…",
"message_id": "b41e…",
"reply": { "text": "Yes. The deploy finished at 02:14 and the health check is green.", "model": "…" }
}
Changer la facturation d’une session Claude Ajouté en 0.9.18 #
send avec provider fait passer une session Claude de l’abonnement à la clé
Claude API, ou l’inverse, et envoie le message, en un seul appel : un
changement refusé n’envoie rien, et un message refusé ne change rien. L’autre
facturation doit être configurée sur le relais cible. La carte d’approbation,
quand il y en a une, indique Switches billing to API key ou
Switches billing to subscription.
- Un changement que le relais cible refuse revient avec
REMOTE_quand Claude API ou Claude n’y est pas configuré ou que le plafond mensuel est atteint, et avecRELAY_ PROVIDER_ UNAVAILABLE REMOTE_quand le modèle de la session ne figure pas dans la liste de l’autre côté.RELAY_ UNKNOWN_ MODEL remoteporte le code propre au relais, par exempleCode CLAUDE_.API_ CAP_ REACHED - Un relais antérieur à 0.9.18 ne peut pas changer de facturation : l’appel est
refusé avec
REMOTE_, et rien n’est envoyé.RELAY_ UNSUPPORTED - Sans
provider, la session garde sa facturation. Unsendà une session sur la clé alors que le plafond est atteint est refusé, et rien n’est mis en file : envoyez avecprovider: "claude"pour la faire passer sur l’abonnement, ou demandez à l’utilisateur de relever le plafond.
create_session #
Démarre une nouvelle session et lui donne son premier prompt. La nouvelle session ne sait rien de la conversation depuis laquelle elle a été démarrée : le prompt doit donc se suffire à lui-même.
Prend text, wait_, mode, model et effort comme send, et :
| Paramètre | Type | Défaut | |
|---|---|---|---|
provider |
github | openai | claude | cursor | grok | claude- | deepseek Ajouté en 0.9.17 | claude- Ajouté en 0.9.18 |
le fournisseur de l’appelant | doit être activé sur le relais cible. Ajouté en 0.9.19 L’outil accepte n’importe quel id de fournisseur ; le relais sur lequel tourne la session appelante le vérifie par rapport aux fournisseurs qu’il a maintenant, tels que relay_ les liste, et les nomme quand il en refuse un. Le fournisseur doit toujours être activé sur le relais cible. Une session démarrée avec 0.9.19 ou une version plus récente peut donc utiliser les fournisseurs qu’une mise à jour ultérieure ajoute, sans redémarrage |
model |
texte | le modèle de l’appelant quand la cible le propose, sinon le modèle par défaut de la cible | Ajouté en 0.9.13 vérifié d’abord : voir Quels modèles sont acceptés |
cwd |
chemin | le dossier par défaut de la cible | dossier de travail. Pas avec claude-. |
repo |
owner/ ou une URL GitHub |
seulement avec claude-, et obligatoire dans ce cas : le dépôt que la session cloud clone |
|
branch |
nom de branche | la branche par défaut du dépôt | seulement avec claude- |
title |
texte | la première ligne du prompt | titre de la session |
group |
un id de groupe (grp_) ou un nom, jusqu’à 200 caractères |
voir ci-dessous | Ajouté en 0.9.16 un groupe de sessions existant sur le relais cible, où placer la nouvelle session. Voir La placer dans un groupe |
Ce que l’agent omet suit la session dans laquelle il travaille, dans la mesure où le relais cible le propose. Un chat OpenAI Image ne peut pas être démarré de cette façon.
{
"action": "create_session",
"relay": "this",
"title": "Review: server/",
"cwd": "/home/dev/projects/shop",
"text": "Review the code under server/ for missing input checks. List findings with file and line. Change nothing."
}
Une session Claude Cloud prend un dépôt au lieu d’un dossier :
{
"action": "create_session",
"relay": "this",
"provider": "claude-cloud",
"repo": "example-org/sample-repo",
"branch": "feature/banner",
"text": "On branch feature/banner, change the sample banner text to \"Hello\" and push. Report what changed.",
"wait_seconds": 60
}
Le résultat est le même que pour send, plus ce avec quoi la session a été
démarrée : provider, model, mode, effort, title, et repo / branch
pour une session cloud. Ajouté en 0.9.16 Il contient aussi group, le groupe de
sessions dans lequel la nouvelle session est allée, tel que list_ l’affiche (id, name, role), ou null.
La placer dans un groupe Ajouté en 0.9.16 #
Sans group, une session démarrée sur ce relais rejoint le groupe de la
session qui l’a démarrée, ou crée un groupe dont cette session est la tête. Une
session démarrée sur un relais associé ne va dans aucun groupe.
Avec group, la nouvelle session va plutôt dans ce groupe existant, sur ce
relais ou sur un relais associé. L’agent désigne le groupe par son id, ou par
son nom tel que relay_ le liste, sans tenir compte de la casse. Un group vide compte comme aucun.
{
"action": "create_session",
"relay": "build-box",
"group": "Release 2.4",
"text": "Run the release checklist in docs/RELEASE.md up to the tag. Report each step."
}
Le relais recherche le groupe sur la cible avant d’afficher toute carte
d’approbation, comme il le fait pour le modèle, et la carte le nomme (Group: Release 2.).
Rien n’est créé quand :
- la cible n’a aucun groupe avec cet id ou ce nom. L’appel est refusé avec
REMOTE_, etRELAY_ UNKNOWN_ GROUP erroretgroupslistent les groupes qui s’y trouvent (jusqu’à 20,groupsquand il y en a davantage) :Total Relay "build-box" has no session group "Relase". Groups there: Release 2. 4 (grp_ …), … No session was created. - le nom correspond à plus d’un groupe. Même code, avec les groupes de ce
nom :
… Pass the id. - le groupe a été dissous entre la recherche et le démarrage. Même code.
- les groupes de la cible ne peuvent pas être lus. Un relais trop ancien pour
grouprenvoieREMOTE_(RELAY_ UNSUPPORTED The target relay doesn't support groups on create_) ; un relais qui ne répond pas ou refuse le token renvoie son code habituel.session yet: …
Quand la session a été créée mais n’a pas atterri dans le groupe demandé, le
résultat contient group, son summary se termine par (no group: …),
et la note demande à l’agent de vous le dire. Vous pouvez alors déplacer la
session à la main.
create_ ne prend qu’un groupe existant. Pour placer la session dans un
nouveau groupe, l’agent appelle ensuite update_ avec ce nom.
Renommer, dissoudre et réorganiser les groupes restent de votre ressort.
update_session Ajouté en 0.9.16 #
Modifie les réglages d’une autre session pour ses prochains turns, sans lui envoyer de prompt, et renvoie les réglages qu’elle a maintenant et ce qui a changé. Fonctionne sur ce relais et sur un relais associé.
| Paramètre | Type | |
|---|---|---|
session |
id, requis | la session à modifier |
model |
texte | le modèle de la session désormais. Vérifié comme pour send : voir Quels modèles sont acceptés. Une session Grok garde le modèle avec lequel elle a été démarrée |
effort |
texte | l’effort de raisonnement désormais ; un effort que son modèle accepte. Pas pour Claude Cloud |
mode |
plan | ask | agent | autopilot |
le mode du relais de la session |
auto_ |
tokens, ou 0 |
la fenêtre de compactage auto : 100 000, 150 000, 200 000, 300 000, 500 000 ou 1 000 000 ; un autre nombre va à la plus proche, et 0 est la valeur par défaut du modèle |
title |
texte | le nouveau titre |
group |
id ou nom de groupe, ou "none" |
déplace la session dans ce groupe ; un nom que le relais n’a pas crée un nouveau groupe ; "none" (ou null) sort la session de son groupe |
thinking_ |
true | false | si une session Claude utilise le thinking lors de ses prochains turns (thinking) |
thinking_ |
summarized | omitted |
si le texte du thinking d’une session Claude s’affiche dans le fil de la conversation |
cwd |
chemin | le dossier de travail de la session. Sa CLI y redémarre |
Il faut au moins un réglage. Tout autre argument est refusé et rien n’est
modifié. may ne fait pas partie des réglages : Whether a session may start sessions is the owner's setting alone.
{ "action": "update_session", "relay": "this", "session": "3f9c…", "model": "claude-sonnet-5-5", "effort": "low", "group": "Release 2.4" }
{
"ok": true,
"summary": "update_session → desk session 3f9c2a1e: model, effort, group",
"session": "3f9c…",
"settings": {
"model": "claude-sonnet-5-5", "effort": "low", "mode": "agent", "auto_compact_window": "auto",
"title": "Review: server/", "group": { "id": "grp_…", "name": "Release 2.4", "role": "member" },
"thinking_enabled": true, "thinking_display": "summarized", "cwd": "/home/dev/projects/shop"
},
"changed": ["model", "effort", "group"]
}
Un changement de dossier indique aussi si la CLI a été redémarrée
(relaunched), et un nouveau groupe revient sous la forme group. Un
appel qui ne changerait rien renvoie changed: [] et ne demande rien à
personne. note porte ce que l’agent doit savoir, par exemple une fenêtre
ramenée à la plus proche, ou que la fenêtre et le thinking ne s’appliquent
qu’aux sessions Claude (Ajouté en 0.9.18 sessions Claude API comprises) et ne
changent rien chez un autre fournisseur. Ajouté en 0.9.17 Une session DeepSeek reçoit aussi cette note, mais
la fenêtre y prend bien effet, et 0 y signifie 400 000 tokens ;
thinking_ non, car une session DeepSeek utilise toujours le thinking.
Qui peut modifier quoi. Un agent ne modifie librement qu’une session que sa
propre conversation a démarrée : sur ce relais, ou sur un relais associé quand
ce relais-là a enregistré cette conversation comme celle qui l’a démarrée. Toute
autre session, la vôtre, celle d’un autre agent ou celle qui a démarré l’agent,
demande d’abord votre Allow. Une carte de question demande une fois par
conversation et par relais, nomme la session et liste la modification
(Model: … · Effort: … · Group: …) ; Allow couvre les modifications
ultérieures de cette conversation sur de telles sessions de ce relais-là. Deny
refuse l’appel avec REMOTE_ ; une conversation sans turn en
cours dans lequel demander reçoit REMOTE_. L’autre relais
applique lui-même la même règle. Un agent ne modifie jamais la conversation dans
laquelle il tourne. Dans les modes ask et plan, la carte habituelle d’une
action d’écriture s’applique en plus.
Avant toute modification, le relais vérifie l’appel entier sur la cible : le modèle et l’effort, le groupe, le dossier, et s’il faut vous demander. Un modèle inconnu, un id de groupe inconnu, un nom de groupe qui correspond à deux groupes, un dossier que le relais n’a pas le droit d’utiliser, ou un nouveau dossier pour une session occupée font refuser l’appel avant toute carte, et rien n’est modifié.
Groupes.
- Un nom que le relais n’a pas crée un nouveau groupe portant ce nom. Un id de
groupe doit exister (
REMOTE_).RELAY_ UNKNOWN_ GROUP - Un groupe que vous avez créé n’est jamais supprimé de cette façon. Quand un agent en retire la dernière session, le groupe reste et s’affiche dans votre barre latérale comme group · empty (groupe · vide) : renommez-le ou dissolvez-le depuis son menu, ou laissez un agent le nommer à nouveau. Rien ne le supprime de lui-même.
- Un groupe créé par un agent, par son nom ou en démarrant des sessions, disparaît dès qu’il est vide.
Le dossier. Un nouveau cwd redémarre la CLI de la session dans ce
dossier. Il est refusé avec REMOTE_ tant qu’un turn y est en file ou
en cours, ou qu’une tâche de fond tourne : The session cannot move to another folder now: ….
Le dossier doit être un dossier que le relais a le droit d’utiliser. Une
session qui n’a pas encore démarré garde le dossier pour son premier démarrage.
Si la CLI ne redémarre pas, le dossier est quand même enregistré pour son
prochain démarrage, et la réponse le dit. Pas pour Claude Cloud, qui travaille
sur un clone de son dépôt.
Le mode réglé ainsi dure jusqu’au prochain send qui nomme un autre mode
ou qui vient d’un appelant dans un autre mode : un send sans mode transmet
le mode propre de l’appelant.
Si une étape échoue après que d’autres ont été écrites, la réponse liste quand
même dans changed ce qui a été écrit. Une page ouverte affiche toutes les
modifications d’un coup. Un relais qui fait tourner un OAR plus ancien renvoie
REMOTE_.
Quels modèles sont acceptés Ajouté en 0.9.13 #
Un model dans send ou create_ est vérifié par rapport à la liste
que New Chat (Nouveau chat) propose pour le fournisseur sur le relais cible, la même liste
que celle qu’affiche relay_, avant toute carte
d’approbation. Un modèle qui n’y figure pas est refusé avec
REMOTE_, et rien n’est créé ni envoyé :
Unknown model 'gpt-5-4' for Copilot on relay "build-box"; did you mean 'gpt-5.4'? Valid ids: … Nothing was sent.
Le résultat contient aussi suggestions, les correspondances proches, et
models, les ids valides. Avant 0.9.13, un tel id créait une session sur un
autre modèle, que les appels send suivants avec cet id ne pouvaient pas
atteindre.
Ajouté en 0.9.19 Les ids de modèle de Copilot utilisent des points : claude-, et non le claude- de Claude. Copilot refuse l’id d’un autre fournisseur avant de créer quoi que ce soit : avec COPILOT_ et la correspondance la plus proche ou, dans create_, avec le code du seul autre fournisseur qui liste cet id, comme CLAUDE_. Une session Copilot ne passe jamais à un autre fournisseur à cause du nom de son modèle.
| L’agent passe | Ce qui tourne |
|---|---|
| Un id de la liste, quelle que soit la casse | Ce modèle, avec la casse de la liste |
opus, sonnet ou haiku (Claude) |
Le modèle Claude listé le plus récent de ce nom. Avec [1m], sa variante à long contexte quand elle est listée |
Un id Copilot avec son effort, comme gpt- |
gpt- avec l’effort high, quand la liste propose cet effort pour le modèle. Un effort passé en plus l’emporte |
auto |
Transmis tel quel |
Quand le modèle qui tourne diffère de celui demandé, le model du résultat
le signale. Quand le relais cible n’a pas encore de liste pour le fournisseur
(sa découverte des modèles n’a pas tourné ou a échoué), le modèle passe sans
vérification et model le signale aussi. Un relais refuse aussi un modèle
Copilot inconnu quand l’agent d’un autre relais y démarre une session.
wait #
Continue d’attendre une réponse que send ou create_ n’a pas obtenue
à temps.
| Paramètre | Type | Défaut | |
|---|---|---|---|
session |
id | requis | |
message_ |
id | requis | le message_ renvoyé par send ou create_ |
wait_ |
0–3600 | 120 |
{ "action": "wait", "relay": "build-box", "session": "3f9c…", "message_id": "b41e…", "wait_seconds": 300 }
L’attente et ce qui revient #
send, create_ et wait attendent la réponse aussi longtemps que
l’agent le demande dans wait_, jusqu’à Longest wait per tool call (Attente maximale par appel d’outil) sur
le relais où tourne l’agent (Settings → Relays → Agent sessions) : 10 minutes par défaut, réglable de 2 à 60 minutes. Quand un appel a demandé plus
que ce que le relais permet, le résultat le dit dans une note. Quand le temps
est écoulé, l’agent reçoit ce qu’il y a jusque-là et peut rappeler wait.
Un turn qui attend compte quand même dans Max turn duration (Durée maximale d’un turn) sous Settings → General (Réglages → Général).
Le status du résultat indique où en est l’autre session :
status |
Signification |
|---|---|
queued |
Le prompt est accepté, rien ne tourne encore. C’est aussi ce que renvoie wait_. |
running |
Le temps était écoulé alors que le turn tournait encore (progress contient la réponse jusque-là et son activité), ou l’agent a répondu mais continue de travailler en arrière-plan (reply contient sa dernière réponse). |
waiting_ |
L’autre agent a posé une question. pending la liste avec son id, son texte et ses options. |
done |
Terminé. reply contient la réponse. |
failed |
Le turn a échoué ; la réponse est le texte d’échec du relais. |
stopped |
Le turn a été arrêté avant de répondre. |
cancelled |
Rien n’est en file ni en cours, et il n’y a pas de réponse. |
duplicate |
L’autre relais a pris le message pour la répétition d’un message qu’il a déjà. |
Chacun de ces résultats porte session et message_, ainsi que open, un
lien qui ouvre la session, quand le relais en a un.
Piloter une autre session #
answer_question #
Répond à une carte de question qui attend dans une autre session. Les agents ont pour consigne de vous demander d’abord, sauf si vous leur avez dit de décider eux-mêmes.
| Paramètre | Type | |
|---|---|---|
question_ |
id, requis | l’id tiré de pending |
choices |
liste de libellés d’options, jusqu’à 50 | pour une question à options |
answer |
texte | une réponse libre |
L’un de choices et answer est requis. Un agent ne peut pas répondre à sa
propre question, ni à la carte d’approbation d’un relais : celles-là vous
reviennent.
Ajouté en 0.9.16 Il ne peut pas non plus répondre à une question non bloquante : answer_ la refuse
avec REMOTE_ avant d’appeler qui que ce soit.
{ "action": "answer_question", "relay": "build-box", "question_id": "q_7d2…", "choices": ["Merge"] }
stop #
Arrête le turn qui tourne dans une session, comme le fait Stop (Arrêter) dans l’interface. Le résultat indique si un arrêt a été demandé ou si rien ne tournait.
{ "action": "stop", "relay": "this", "session": "3f9c…" }
archive #
Archive une session.
{ "action": "archive", "relay": "this", "session": "3f9c…" }
Surveiller des sessions #
Ajouté en 0.9.10 Au lieu de redemander encore et encore, un agent peut s’abonner à des sessions et être réveillé quand quelque chose s’y passe. Cela fonctionne sur ce relais (avec les sessions d’agent activées) et sur un relais associé.
Un abonnement ne fait que notifier. Il n’approuve rien et ne répond à rien ; ce que demande un événement est décidé comme avant, par vous ou par l’agent dans les limites de ce qu’il peut faire de toute façon.
subscribe #
| Paramètre | Type | Défaut | |
|---|---|---|---|
sessions |
jusqu’à 50 ids de session, ou ["all"] |
requis | all désigne toutes les sessions du relais, y compris celles créées plus tard |
events |
liste de noms d’événements | tous sauf task_ et task_, avec subagent_ |
Ajouté en 0.9.13 voir Les événements par défaut |
once |
true | false | false | mettre fin à l’abonnement après son déclenchement. Avec match : après la première correspondance. |
match |
expression régulière, jusqu’à 200 caractères, insensible à la casse | une réponse turn_, ou la description et le résumé d’une tâche, doivent correspondre ; les autres événements passent |
|
stalled_ |
1–1440 | 15 | minutes de silence, pendant que du travail tourne, avant stalled |
heartbeat_ |
1–1440 | aucun | ajoute un signal de vie à cette fréquence tant qu’un turn ou une tâche surveillés tournent, pour que l’agent qui surveille sache que sa surveillance fonctionne |
digest_ |
1–1440 | aucun | Ajouté en 0.9.16 rassemble les événements de l’abonnement en un message toutes les N minutes. Voir Moins de réveils |
quiet_ |
{"from":"HH: |
aucun | Ajouté en 0.9.16 retient les événements de l’abonnement dans cette plage quotidienne et les remet quand elle se termine |
exclude |
jusqu’à 50 ids de session | aucun | Ajouté en 0.9.16 seulement avec sessions: ["all"] : les sessions que l’abonnement laisse de côté. Un texte séparé par des virgules fonctionne aussi |
relay |
nom de relais | this |
Une conversation peut détenir 20 abonnements à la fois. La propre conversation de l’agent n’est jamais surveillée.
{ "action": "subscribe", "sessions": ["3f9c…", "a12b…"], "events": ["question_asked", "error", "all_idle"] }
{
"ok": true,
"summary": "subscribe → desk: 2 sessions (sub_ab12cd34ef)",
"subscription": {
"id": "sub_ab12cd34ef",
"sessions": [ { "id": "3f9c…", "title": "Review: server/" }, { "id": "a12b…", "title": "Review: web/" } ],
"events": ["question_asked", "error", "all_idle"],
"once": false,
"stalledMinutes": 15
}
}
Moins de réveils Ajouté en 0.9.16 #
Chaque réveil est un turn complet de l’agent qui surveille. Trois options de
subscribe permettent d’en demander moins. question_, question_
et error ne sont jamais retenus par aucune d’elles ; tous les autres
événements le sont, task_, stalled et all_ compris.
{
"action": "subscribe",
"sessions": ["all"],
"exclude": ["77aa…"],
"digest_minutes": 30,
"quiet_hours": { "from": "23:00", "to": "06:00", "tz": "Europe/Berlin" }
}
digest_. Les événements de l’abonnement sont rassemblés et arrivent en un seul message toutes les N minutes : le premier au plus tôt N minutes après la création de l’abonnement, chacun des suivants N minutes après le précédent. Le message ditminutes Digest of 4 events (subscription sub_. Un récapitulatif d’un seul événement se lit comme cet événement.… every 30 min; questions and errors come at once): quiet_. Une plage quotidienne en heure locale, dans un fuseau horaire IANA.hours fromettosont des heures de la journée (HH:, deMM 00:à00 23:) et doivent être différentes ; la plage peut passer minuit. Ce qui se passe dedans attend et arrive en un seul message à la fin de la plage, avec la ligne59 Held during quiet hours (23:Aucun signal de vie n’est produit dans la plage. Un événement qu’un récapitulatif remettrait dans la plage est reporté à sa fin.00–06: 00 Europe/ Berlin): 3 events, delivered now that the window has ended; questions and errors came at once. exclude. Un abonnement à toutes les sessions (all) ignore ces sessions, y compris pourall_,idle stalledet le signal de vie. Avec une liste de sessions, il est refusé :exclude goes with sessions ["all"] only; a list of sessions names what it watches.
Changements d’heure. La plage suit l’horloge du fuseau horaire. La nuit où
l’on recule les horloges et où to survient deux fois, la plage se termine la
première fois et n’est pas rouverte pendant l’heure répétée. La nuit où l’on
avance les horloges et où to est sauté, elle se termine au moment du saut.
Une limite connue : un from situé dans l’heure répétée ouvre la plage au
premier passage, et au second passage, les minutes avant from comptent comme
en dehors de la plage.
Une valeur erronée est refusée avec ce qui ne va pas, par exemple quiet_, quiet_, ou quiet_. Un quiet_ dont tous les
champs sont vides compte comme aucun.
- Avec
once. L’événement qui met fin à un abonnement à usage unique respecte quand même son récapitulatif et ses heures calmes : l’abonnement se termine aussitôt, l’événement arrive quand ils le permettent. - Plusieurs abonnements. Un événement pris par plusieurs abonnements de l’agent qui surveille part dès que le premier d’entre eux le laisse partir ; un abonnement sans options le laisse partir aussitôt.
- Le plafond horaire de 20 réveils s’applique en plus des options (Comment arrivent les événements).
- Les événements retenus, et leur échéance, survivent à un redémarrage du relais.
- La carte d’approbation nomme les options (
digest every 30 min,quiet 23:,00–06: 00 Europe/ Berlin except 1 it leaves out).
Pas d’écho des propres prompts de l’agent qui surveille. Quand l’agent qui
surveille envoie lui-même un prompt à une session avec send ou create_ et récupère la
réponse terminée par cet appel ou par un wait ultérieur, le turn_ de ce turn ne le réveille pas une seconde
fois ; tant qu’il attend encore, le turn_ est retenu. Les erreurs et les
questions de ce turn arrivent quand même. Un prompt qu’il n’a pas attendu
(wait_ et aucun wait) le réveille avec turn_ comme avant, de
même qu’un turn_ qui met fin à un abonnement once.
Événements #
| Événement | Se déclenche quand | Contient |
|---|---|---|
question_ |
une question ou une approbation attend une réponse ; Ajouté en 0.9.16 aussi une question non bloquante, marquée comme ne bloquant pas cette session | la question, ses options et son question_ |
question_ |
Ajouté en 0.9.16 vous avez répondu à une question non bloquante ou l’avez ignorée. Pas nommé dans events : un abonnement qui prend question_ le prend aussi, et la conversation qui a posé la question le reçoit toujours, sans abonnement |
question_, la question, votre réponse, l’option, ou le fait que vous l’avez ignorée, et le relais sur lequel vous avez répondu (via) |
error |
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 | le type et le message |
turn_ |
une session a répondu | le début de la réponse |
task_ |
un agent en arrière-plan ou une tâche shell a démarré. Seulement s’il est nommé dans events. |
la description de la tâche |
task_ |
un agent en arrière-plan ou une tâche shell s’est terminé. Seulement s’il est nommé dans events. |
description, résultat, résumé |
subagent_ |
Ajouté en 0.9.13 un subagent en arrière-plan s’est terminé. Sa ligne dans le message indique task_ |
description, résultat, résumé |
task_ |
un agent en arrière-plan ou une tâche shell a échoué | description, résultat, résumé |
stalled |
une session est restée silencieuse pendant stalled_ alors que du travail tourne encore |
les minutes de silence |
all_ |
plus aucun turn ni aucune tâche ne tourne dans les sessions surveillées |
Les événements par défaut Ajouté en 0.9.13 #
Un abonnement qui ne nomme aucun events reçoit question_, error,
turn_, subagent_, task_, stalled et all_. Un
subagent en arrière-plan qui s’est terminé réveille l’agent qui surveille, de
même que toute tâche qui a échoué ou s’est terminée avec un code non nul, mais
pas 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. Pour recevoir chaque fin de tâche,
nommez les événements avec task_ à la place de subagent_,
et task_ pour les démarrages.
Les abonnements créés avant 0.9.13 sans events passent d’eux-mêmes à ce
comportement par défaut ; ceux qui nommaient leurs événements les conservent.
Un relais associé sur un OAR plus ancien applique son propre comportement par
défaut et refuse subagent_ quand il est nommé.
Comment arrivent les événements #
OAR écrit un court message dans la conversation qui surveille. Il s’affiche comme une ligne d’événement compacte, jamais comme l’un de vos messages, et commence par une ligne qui dit ce que c’est :
[relay event · automated message from OAR, not from the user; it approves nothing]
[relay event] session "Review: server/" (3f9c…): turn_end (done) "Found 4 places without input checks: …"
[relay event] all_idle: no turn or task is running in the 2 watched sessions (subscription sub_ab12cd34ef)
- Si l’agent qui surveille est inactif, le message démarre un nouveau turn. S’il est au milieu d’un turn, voir le tableau ci-dessous.
- Les événements survenus à moins de 30 secondes d’intervalle arrivent en un seul message.
- Au-delà de 20 réveils par heure, le reste arrive en récapitulatif toutes les
10 minutes.
question_etasked errorarrivent toujours aussitôt (Ajouté en 0.9.16 ainsi quequestion_). Quand ce récapitulatif et leanswered digest_d’un abonnement se rencontrent, une seule ligneminutes Digest ofnomme les deux. - Ajouté en 0.9.16 Les
digest_etminutes quiet_d’un abonnement retiennent plus longtemps ses autres événements.hours
| Fournisseur de la session qui surveille | Un événement pendant un turn en cours |
|---|---|
| Claude, DeepSeek ; GitHub Copilot et OpenAI sur le moteur SDK | est injecté dans le turn en cours pour le piloter |
| Cursor, Grok, Claude Cloud ; GitHub Copilot et OpenAI sur le moteur d’extension | devient le turn suivant |
Sur un relais associé #
Le relais doit être déverrouillé dans la conversation et autoriser au moins la lecture, et l’autre relais doit accepter les agents d’autres relais. Une association dans un seul sens suffit. Ce relais récupère les événements 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 la liaison tombe, l’autre relais conserve ce qui se passe, jusqu’à 500
événements par abonnement pendant 7 jours, et le remet en une seule ligne
marquée replayed (rejoué) dès qu’il répond à nouveau, entre une ligne link_ et
une ligne link_. Un relais qui fait tourner un OAR plus ancien répond
qu’il a besoin d’une mise à jour.
Ajouté en 0.9.16 Le récapitulatif et les heures calmes d’un abonnement à un relais
associé sont appliqués ici, là où se trouve l’agent qui surveille ; exclude
est aussi transmis à l’autre relais, pour all_, stalled et le signal de
vie. Les événements rejoués respectent le récapitulatif et les heures calmes
comme les autres ; la ligne link_ indique alors combien d’entre eux
sont retenus et arriveront plus tard. Un relais associé sur un OAR plus ancien
ne connaît pas exclude : ce relais-ci écarte quand même les événements de ces
sessions, mais ce relais-là les compte pour all_, pour les blocages et
dans la liste du signal de vie.
unsubscribe #
Met fin à un abonnement, ou, avec "all", à tous les abonnements que la
conversation détient sur le relais nommé.
| Paramètre | Type | |
|---|---|---|
subscription_ |
id ou "all", requis |
l’id renvoyé par subscribe |
{ "action": "unsubscribe", "subscription_id": "sub_ab12cd34ef" }
list_subscriptions #
Affiche les abonnements de la conversation : les actifs et ceux qui ont pris
fin dans la dernière heure, avec la raison. Avec watcher, affiche les
abonnements d’une autre conversation ; c’est ainsi qu’un agent regarde avant de
les reprendre.
| Paramètre | Type | Défaut | |
|---|---|---|---|
watcher |
id de conversation | cette conversation |
{ "action": "list_subscriptions" }
Chaque abonnement affiche ses sessions, ses événements, once, match,
stalled et heartbeat, Ajouté en 0.9.16 ainsi que digest,
quiet et exclude quand il en a. Un abonnement actif indique aussi
combien de ses événements son récapitulatif ou ses heures calmes retiennent en
ce moment (held) et quand le premier d’entre eux est dû
(next, null quand aucun n’est retenu). Un abonnement terminé ne
l’indique que tant que son dernier événement est encore retenu, comme après un
once qui s’est déclenché pendant les heures calmes.
{
"id": "sub_ab12cd34ef",
"scope": "all",
"sessions": "all",
"digestMinutes": 30,
"quietHours": { "from": "23:00", "to": "06:00", "tz": "Europe/Berlin" },
"exclude": ["77aa…"],
"heldCount": 3,
"nextDeliveryAt": "2026-10-24T04:00:00.000Z"
}
transfer_subscriptions #
Déplace tous les abonnements d’une autre conversation vers celle-ci, par exemple quand une nouvelle session remplace un ancien agent qui surveille. Vous demande toujours votre accord sur une carte d’approbation.
| Paramètre | Type | |
|---|---|---|
from |
id de conversation, requis | la conversation dont les abonnements viennent ici |
{ "action": "transfer_subscriptions", "from": "c0de…" }
Durée de vie d’un abonnement #
Les abonnements survivent à un redémarrage du relais. Un abonnement prend fin quand :
- l’agent appelle
unsubscribe, ou vous appuyez sur Unsubscribe dans la liste de l’agent qui surveille ; - la conversation qui surveille ou la session surveillée est archivée ;
- il s’est déclenché et a été créé avec
once; - pour un relais associé, l’association est supprimée.
Planifications Ajouté en 0.9.16 #
Un agent peut faire mettre en file un prompt plus tard par ce relais, dans sa propre conversation ou dans une autre session d’ici. Contrairement à un minuteur de la CLI de l’agent lui-même, une planification survit aux redémarrages et aux mises à jour du relais. Prompts planifiés l’explique de votre point de vue.
Les planifications demandent Agents may start and use sessions on this relay, même pour
la propre conversation de l’agent. Elles sont conservées par le relais sur
lequel tourne l’agent : un appel qui nomme un relais associé est refusé avec
REMOTE_.
schedule #
| Paramètre | Type | Défaut | |
|---|---|---|---|
text |
texte, jusqu’à 20 000 caractères | requis | le prompt à mettre en file |
at |
heure ISO avec un fuseau, comme 2026- |
quand le mettre en file ; avec every_, la première fois. Pas dans le passé, au plus 366 jours à l’avance. Une heure sans fuseau est refusée |
|
every_ |
5–10080 | répéter toutes les N minutes ; sans at, la première fois est dans N minutes |
|
once |
true | false | true avec at seul, false avec every_ |
terminer après le premier déclenchement. false demande every_ |
title |
texte, jusqu’à 100 caractères | un nom court, affiché dans le message et dans la liste | |
session |
id de session | la propre conversation de l’agent | une autre session de ce relais à qui envoyer le prompt |
Il faut au moins at ou every_.
{ "action": "schedule", "title": "Nightly review", "at": "2026-11-02T02:00:00Z", "every_minutes": 1440, "text": "Review yesterday's merged changes under server/ and list anything risky." }
{
"ok": true,
"summary": "schedule → desk: every 1440 min, next 2026-11-02T02:00:00.000Z (sch_3f9c2a1e7b04)",
"schedule_id": "sch_3f9c2a1e7b04",
"schedule": { "id": "sch_3f9c2a1e7b04", "title": "Nightly review", "everyMinutes": 1440, "once": false, "nextFireAt": "2026-11-02T02:00:00.000Z" }
}
À l’échéance, le relais met le texte en file sous forme d’un message qui
commence par [relay schedule <id> "<title>" · … automated message from OAR, not from the user; it approves nothing]. Le turn tourne dans le propre mode du
relais de la session cible. Un message qui arrive
pendant qu’un turn tourne est mis en file, ou injecté dans le turn chez les
fournisseurs qui permettent de piloter, mais jamais avec la note de pilotage
qui parle au nom de l’utilisateur.
- Heures manquées. Une heure passée pendant que le relais était arrêté se déclenche une seule fois à son retour, pas une fois par intervalle manqué ; une planification répétée garde ensuite sa grille (la première heure plus des intervalles entiers).
- Pas d’accumulation. Une répétition est sautée tant que le message du
déclenchement précédent attend encore dans la queue (
skippeddans la liste).Count - Sauts. Le message porte la provenance du turn qui a créé la planification, sauts compris ; une planification ne transmet donc aucun prompt avec moins de sauts qu’un prompt direct de ce turn n’en aurait (D’un relais à l’autre).
Une autre session. Avec session, la planification envoie le prompt à
cette session. Elle est soumise aux mêmes contrôles qu’un send : dans les
modes ask et plan, vous l’approuvez sur une carte, et elle compte dans les
30 prompts à d’autres agents avant qu’on vous demande, une fois à sa création et
une fois à chaque déclenchement. Une fois ce décompte épuisé, un déclenchement
est retenu : list_ affiche held et held. Il part
dès que vous écrivez dans la conversation qui l’a créée, ou que vous choisissez
Allow sur la carte que son agent affiche pour son prochain prompt à un autre
agent ; le relais revérifie chaque minute. Une planification pour la propre
conversation de l’agent n’est ni comptée ni retenue.
list_schedules #
Liste les planifications qui se déclenchent dans la conversation ou qu’elle a
créées : les actives et celles qui ont pris fin dans la dernière heure, avec
end (unscheduled, fired, archived ou deleted).
| Paramètre | Type | Défaut | |
|---|---|---|---|
session |
id de session | cette conversation | une autre conversation dont lister les planifications |
Chaque planification a id, session (id et titre), set quand une autre
conversation l’a créée, title, le début de son text, at, every,
once, next, last, fired, skipped quand elle en
a sauté, et held avec held tant qu’elle est retenue.
unschedule #
Met fin à une planification de la conversation : une qui s’y déclenche ou qu’elle a créée.
| Paramètre | Type | |
|---|---|---|
schedule_ |
id, requis | l’id renvoyé par schedule ou list_ |
Quand une planification prend fin #
Une planification prend fin après son déclenchement si elle est once, sur
unschedule ou Cancel (Annuler) dans la liste ⏰ de l’en-tête, et quand la
session dans laquelle elle se déclenche ou la conversation qui l’a créée est
archivée ou supprimée. Un compactage déplace plutôt les deux sortes vers la
nouvelle conversation. Une conversation détient au plus 20 planifications
actives qui s’y déclenchent, et peut en créer au plus 20 pour d’autres
sessions ; au-delà, REMOTE_.
Les questions non bloquantes Ajouté en 0.9.16 #
Un agent peut vous poser une question et continuer à travailler : la question s’affiche comme une carte dans sa session et dans votre Inbox (Boîte de réception), et l’agent apprend la réponse plus tard. Questions et Inbox l’explique de votre point de vue.
ask #
| Paramètre | Type | Défaut | |
|---|---|---|---|
question |
texte, jusqu’à 500 caractères | requis | la question ; le contexte va dans detail |
options |
jusqu’à 8 libellés, de 120 caractères au plus chacun | réponses affichées comme boutons ; vous pouvez toujours saisir la vôtre | |
recommendation |
texte, jusqu’à 300 caractères | la réponse que l’agent recommande : l’une des options, ou du texte libre | |
detail |
texte, jusqu’à 2 000 caractères | le contexte, affiché replié, en texte brut | |
urgency |
normal | now |
normal |
now vous envoie aussi une notification push |
session |
id de session | la propre conversation de l’agent | une session au nom de laquelle demander, sur le relais nommé |
{ "action": "ask", "question": "Ship the migration tonight or wait for the review?", "options": ["Tonight", "Wait"], "recommendation": "Wait", "detail": "The review covers the index change; the rest is tested." }
{ "ok": true, "question_id": "ask_7d2…", "status": "pending", "summary": "ask → desk: question ask_7d2… pending" }
ask rend la main aussitôt avec question_ et status: "pending". L’agent
doit poursuivre ce qui ne dépend pas de la réponse et ne pas reposer la même
question tant qu’elle est en attente.
La réponse. Quand vous répondez à la question ou l’ignorez, l’agent reçoit
l’événement du relais question_, avec question_, votre answer,
le choice que vous avez choisi, dismissed quand vous l’avez ignorée, et
via, le relais sur lequel vous avez répondu : celui où la question est
conservée, ou un relais associé dont vous avez utilisé l’Inbox. Il n’a besoin
d’aucun abonnement. L’événement est urgent : aucun récapitulatif ni aucunes
heures calmes ne le retiennent. Il est automatique et n’approuve rien d’autre,
et il ne compte pas comme un message de votre part pour le garde-fou anti-boucle :
répondre à une question non bloquante ne remet pas à zéro le décompte des
prompts que les agents peuvent s’envoyer.
Qui répond. Vous seul, dans la session ou dans une Inbox (celle de ce
relais, ou celle d’un relais associé à celui-ci). answer_ refuse une
question non bloquante.
Contrôles.
- Une question sur la propre conversation de l’agent,
list_etquestions withdrawne demandent ni réglage ni mention. - Avec
session, l’agent demande au nom d’une autre session : sur ce relais avec Agents may start and use sessions on this relay, sur un relais associé avec Agents may au moins à Read and prompt et le relais déverrouillé. Une telle question est une écriture : dans les modes ask et plan, vous l’approuvez sur une carte, et elle respecte la limite de sauts (D’un relais à l’autre). Le garde-fou anti-boucle ne la compte pas. La carte s’affiche dans cette session, et celle-ci comme la conversation qui demande reçoivent la réponse. - Une question sur une session d’un relais associé est conservée sur ce relais-là ;
ce relais-ci vérifie toutes les 5 secondes si elle a une réponse tant qu’elle
est ouverte (toutes les 30 secondes tant que ce relais-là ne répond pas). Un
relais qui fait tourner un OAR plus ancien renvoie
REMOTE_.RELAY_ UNSUPPORTED
Au plus 20 questions non bloquantes peuvent être en attente par conversation
qui demande, et 20 par session concernée ; au-delà,
REMOTE_. Les questions non bloquantes n’expirent pas.
list_questions #
Liste les questions non bloquantes de la conversation : celles en attente, et
celles auxquelles vous avez répondu, que vous avez ignorées ou qui ont été retirées dans la dernière journée, avec leur statut et leur réponse. Avec
session, les questions sur une autre session. Sur un relais associé, liste les
questions que cette conversation y a posées ; read_ sur ce relais liste
toutes les questions en attente d’une session.
| Paramètre | Type | Défaut | |
|---|---|---|---|
session |
id de session | cette conversation | une autre session dont lister les questions |
withdraw #
Retire une question non bloquante encore en attente. Seule la conversation qui l’a posée peut la retirer.
| Paramètre | Type | |
|---|---|---|
question_ |
id, requis | l’id renvoyé par ask |
Une question non bloquante prend aussi fin quand sa session est archivée ou supprimée (personne n’est prévenu), et quand l’association avec le relais où elle est conservée est supprimée. Un compactage déplace ses questions vers la nouvelle conversation.
Limites #
| Limite | Valeur |
|---|---|
| Appels par conversation | 60 par minute |
| Actions d’écriture par conversation | 10 par minute |
| Sessions au travail démarrées sur ce relais par l’agent d’une conversation | 4 |
| Attente par appel | 120 s par défaut ; jusqu’à Longest wait per tool call du relais (10 min par défaut, 2–60 min) |
Longueur du prompt (text) |
100 000 caractères |
| Prompts d’agent à agent sans message de votre part | 30, puis on vous demande |
| Relais qu’un prompt peut traverser | 2, sauf si vous avez déverrouillé vous-même le relais suivant |
Page de list_ |
20 par défaut, 100 au plus |
Messages de read_ |
10 par défaut, 50 au plus |
Texte de read_ |
12 000 caractères par défaut, 50 000 au plus |
read_ |
200 lignes par défaut, 500 au plus, et 32 Ko de texte |
| Abonnements par conversation | 20 |
| Sessions par abonnement | 50, ou all |
| Événements conservés par un relais associé pendant que la liaison est coupée | 500 par abonnement, pendant 7 jours |
Erreurs #
Un appel refusé revient avec un code sur lequel l’agent peut agir.
| Code | Signification |
|---|---|
REMOTE_ |
un paramètre manque ou est erroné ; error dit lequel |
REMOTE_ |
aucun relais de ce nom, ou le nom correspond à plusieurs relais |
REMOTE_ |
le relais associé n’est pas déverrouillé dans cette conversation : mentionnez-le |
REMOTE_ |
les sessions d’agent sont désactivées sur ce relais |
REMOTE_ |
le niveau Agents may du relais n’autorise pas cette action |
REMOTE_ |
l’autre relais n’accepte pas les prompts des agents d’autres relais |
REMOTE_ |
vous avez choisi Deny sur la carte d’approbation |
REMOTE_ |
une approbation était nécessaire, mais la session appelante n’avait aucun turn en cours dans lequel la demander |
REMOTE_ |
une session créée par un agent a tenté de créer une session, Ajouté en 0.9.16 et vous ne l’avez pas autorisé pour cette session |
REMOTE_ |
Ajouté en 0.9.16 update_ sur une session que la conversation n’a pas démarrée, et vous avez choisi Deny (update_) |
REMOTE_ |
4 sessions démarrées par l’agent de cette conversation sont déjà au travail |
REMOTE_ |
l’agent a visé sa propre conversation |
REMOTE_ |
le prompt a traversé deux relais et le suivant n’a pas été déverrouillé par vous |
REMOTE_ |
trop d’appels ; le résultat indique quand réessayer |
REMOTE_ |
send avec if_ et la session est occupée |
REMOTE_ |
session, message ou question introuvable |
REMOTE_ |
le fournisseur n’est pas activé sur le relais cible ; Ajouté en 0.9.18 aussi un changement de facturation que la cible refuse parce que Claude API ou Claude n’y est pas configuré ou que le plafond mensuel est atteint, avec le code propre au relais dans remote |
REMOTE_ |
Ajouté en 0.9.16 create_ a nommé un groupe de sessions que le relais cible n’a pas, ou un nom qui correspond à plusieurs groupes ; groups liste les groupes qui s’y trouvent (La placer dans un groupe) |
REMOTE_ |
Ajouté en 0.9.13 le relais cible ne liste pas ce modèle pour le fournisseur ; suggestions et models indiquent ce qu’il propose (Quels modèles sont acceptés) |
REMOTE_ |
Ajouté en 0.9.16 20 questions non bloquantes sont déjà en attente pour cette conversation, ou pour cette session (Les questions non bloquantes) |
REMOTE_ |
Ajouté en 0.9.16 la session a déjà 20 planifications qui s’y déclenchent, ou la conversation en a créé 20 (Planifications) |
REMOTE_ |
la conversation détient déjà autant d’abonnements qu’elle le peut |
REMOTE_ |
l’autre relais ne répond pas |
REMOTE_ |
l’autre relais a refusé le token enregistré |
REMOTE_ |
l’autre relais fait tourner un OAR plus ancien auquel manque cette action |
REMOTE_ |
l’autre relais a répondu avec ce statut HTTP |
REMOTE_ |
quelque chose s’est mal passé dans le relais |