relay_tool Nuevo en 0.9.4
Con relay_ un agente trabaja con otras sesiones: las lista y las lee,
le envía un prompt a una, inicia una nueva, espera la respuesta, responde a una
pregunta que hizo el otro agente, detiene o archiva una sesión, y puede pedir
que lo despierten cuando ocurre algo en las sesiones que vigila.
Llega a dos tipos de relay:
- Este relay, aquel en el que se ejecuta el propio agente. Un agente puede pasar partes de su tarea a otras sesiones de aquí. Desactivado hasta que lo activas. Nuevo en 0.9.7
- Relays emparejados, otros relays de OAR que has emparejado con este, por ejemplo el relay de tu estación de trabajo y el de un servidor. Bloqueados en cada conversación hasta que mencionas el relay.
La herramienta es la misma para todos los proveedores que la tienen; consulta Por proveedor para saber cuáles la tienen y con qué nombre.
El nombre Nuevo en 0.9.18 #
Hasta 0.9.17 la herramienta se llamaba remote_. Ahora aparece como
relay_ en todos los proveedores (el agente de Claude ve
mcp__), con las mismas acciones y campos. Las líneas de
herramienta escritas con el nombre antiguo se siguen mostrando como esta
herramienta.
- Sesiones que estaban en marcha cuando actualizaste. El agente de una
sesión recibe su lista de herramientas cuando arranca su worker, y los workers
siguen ejecutándose durante el reinicio del relay. El agente de una sesión así
sigue teniendo la herramienta como
remote_hasta que su worker vuelve a arrancar, por ejemplo tras Kill session (Matar la sesión). Sus llamadas siguen funcionando: llegan al relay de la misma forma con cualquiera de los dos nombres. Donde el relay se ejecuta como servicio de Linux, los workers pueden detenerse con el relay y volver luego con el nombre nuevo.relay - El propio servidor MCP de OAR, que usan Grok y el motor de extensión de
Copilot, sigue ejecutando una llamada a
remote_, pero ya no la lista.relay - Tus propias instrucciones. Si tus instrucciones, reglas de permisos o
hooks nombran
remote_orelay mcp__, cámbialos arelay__ remote_ relay relay_otool mcp__: fuera del servidor MCP de OAR el nombre antiguo se rechaza.relay__ relay_ tool
Lo que ves #
- Tarjetas de aprobación. Una tarjeta de pregunta te consulta antes de la primera sesión que un agente inicia en una conversación, antes de que vigile sesiones por primera vez, y antes de cada acción de escritura mientras la conversación está en el modo del relay ask o plan.
- La llamada a herramienta en la respuesta. La actividad del agente muestra cada llamada con un 🛰️, la acción, el relay y la sesión.
- «via agent» (vía agente). Una sesión que inició un agente lleva via agent · "title" en la lista de conversaciones y bajo su título, con el nombre de la conversación en la que se ejecuta el agente. Nuevo en 0.9.11 Queda en un grupo de sesiones bajo esa conversación, Nuevo en 0.9.16 o en un grupo existente que el agente nombró.
- «↗ from …» (de …). Un prompt que envió un agente lleva, en el lado que lo recibe, una insignia con el relay, la sesión y el modelo que lo enviaron.
- Vigilancia. Una conversación que vigila a otras muestra watching N sessions (vigila N sesiones) en su cabecera; el chip lista sus suscripciones, cada una con un botón Unsubscribe (Cancelar la suscripción). Una sesión vigilada muestra una insignia watched (vigilado).
Activarlo #
relay_ se ofrece a los agentes cuando se cumple al menos una de estas
condiciones:
| Para que los agentes trabajen en | Haz esto |
|---|---|
| este relay | Activa Settings → Relays → Agent sessions → Agents may start and use sessions on this relay (Ajustes → Relays → Sesiones de agentes → Los agentes pueden iniciar y usar sesiones en este relay). Desactivado de forma predeterminada. |
| otro relay | Empareja el relay en Settings → Relays y luego menciónalo en la conversación (@name). |
Una sesión sabe si recibe la herramienta cuando arranca el proceso de su agente, así que una conversación que ya estaba en marcha puede no tenerla hasta que su agente haya vuelto a arrancar.
Nombrar un relay #
Todas las acciones salvo list_ trabajan sobre un relay, nombrado en
relay:
"this", o el nombre propio de este relay, es el relay en el que se ejecuta el agente. No necesita mención.- Un relay emparejado se nombra por su nombre de relay o por su host, tal como
lo muestra
list_.relays
En las cuatro acciones de suscripción, Nuevo en 0.9.16 las tres acciones de
programación y las tres acciones de preguntas, relay se puede omitir y
significa "this". Las programaciones solo funcionan en este relay.
Bloqueado y desbloqueado #
Un relay emparejado queda bloqueado en una conversación hasta que ocurre una de estas cosas:
- Lo mencionas en uno de tus mensajes: escribe
@y elígelo, o escribe su nombre o su nombre de host. Un relay cuyo nombre es una dirección IP olocalhostsolo cuenta con una@delante. - Un agente de ese relay escribe en la conversación. El relay queda entonces abierto para que el agente de aquí pueda responder.
Una vez desbloqueado, queda abierto durante el resto de la conversación. Un relay
bloqueado rechaza todas las acciones salvo list_; al agente se le indica
que te pida que menciones el relay.
Permisos y aprobaciones #
Lo que permite un relay emparejado #
Cada relay emparejado tiene un nivel Agents may (Los agentes pueden) en Settings → Relays. Los emparejamientos nuevos empiezan en Full (Acceso total).
| Nivel | Acciones |
|---|---|
Read only (Solo lectura, read) |
relay_, usage, list_, read_, read_, wait, subscribe, unsubscribe, list_, transfer_ |
Read and prompt (Leer y enviar prompts, prompt) |
lo anterior, y send |
Full (full) |
lo anterior, y create_, Nuevo en 0.9.16 update_, answer_, stop, archive |
list_ no necesita nivel. Este propio relay cuenta siempre como Full.
Al otro lado, Accept prompts from other relays' agents (Aceptar prompts de agentes de otros relays; Settings →
Relays en el relay emparejado) desactiva todo lo que los agentes de otro relay
podrían cambiar o vigilar allí: enviar prompts, iniciar, responder, detener y
archivar sesiones, y suscribirse a ellas. Listar y leer sesiones, leer la salida
de tareas, esperar, relay_ y usage siguen funcionando.
Cuándo se te pregunta #
| Situación | Qué ocurre |
|---|---|
La conversación está en el modo del relay ask o plan y el agente llama a una acción de escritura (send, create_, update_, answer_, stop, archive) |
Una tarjeta de pregunta te pregunta cada vez. |
Nuevo en 0.9.16 Primer update_ de una conversación sobre una sesión de un relay que esta conversación no inició (tuya, de otro agente o la que inició al agente) |
Una tarjeta nombra la sesión y lo que cambiaría. Allow (Permitir) cubre los cambios posteriores de esa conversación en sesiones así de ese relay. Deny (Denegar) rechaza la llamada. Consulta update_. |
Primer create_ en este relay dentro de una conversación |
Una tarjeta de aprobación muestra el proveedor, la carpeta o el repositorio, Nuevo en 0.9.16 el grupo que nombra y el prompt. Allow cubre todas las sesiones que el agente de esa conversación inicie después, también tras un reinicio del relay. Deny rechaza esa única llamada. |
Primer subscribe de una conversación en un relay, y cada subscribe a all |
Una tarjeta de aprobación nombra las sesiones y el relay. |
transfer_ |
Pregunta siempre. |
| El agente ha enviado 30 prompts a otros agentes sin un mensaje tuyo | El siguiente pregunta antes. Allow reinicia la cuenta. Nuevo en 0.9.16 Solo un mensaje que escribiste tú reinicia la cuenta; los eventos del relay, el seguimiento del límite de uso y la nota tras un reinicio no. Las programaciones en otras sesiones también cuentan (Programaciones). |
Nuevo en 0.9.16 schedule para otra sesión en el modo ask o plan |
Una tarjeta de pregunta nombra la hora y el prompt. Una programación para la propia conversación del agente no pregunta nada. |
Reglas para las sesiones de este relay #
- Como mucho 4 trabajando. De las sesiones que inició el agente de una conversación, 4 pueden tener un turn en cola o en curso a la vez. Una quinta se rechaza hasta que una haya terminado.
- Un solo nivel. Una sesión que creó un agente no puede crear sesiones ella
misma, Nuevo en 0.9.16 salvo que hayas activado para ella Agents in this conversation
may start sessions (Los agentes de esta conversación pueden iniciar sesiones).
list_ysessions read_muestran entoncessession "may. Ningún agente puede cambiar ese interruptor.Create Sessions": true - No sobre sí mismo. Un agente no puede hacer
send,wait,stopniarchivesobre la conversación en la que se ejecuta, ni responder a su propia pregunta, Nuevo en 0.9.16 ni cambiar sus ajustes. - Tus cuentas. Las sesiones que inicia un agente usan las cuentas de proveedor de este relay y cuentan para su consumo.
- El relay nunca archiva estas sesiones por sí solo. Se quedan en tu lista hasta que las archivas o eliminas, o el agente archiva una.
Entre relays #
- Un prompt que ya ha cruzado dos relays no se pasa a un tercero salvo que hayas desbloqueado ese relay tú mismo. Leer y esperar nunca están limitados por esto.
- El prompt que recibe el otro agente empieza con una línea que dice que otro
agente le está hablando:
[Remote prompt from an agent on relay "…" · session "…" · model · acting for the user]. - Los turns iniciados así no envían ninguna notificación «reply ready» en el otro relay. Las tarjetas de pregunta siguen notificando.
- Las direcciones remotas tienen que usar
https://.http://sin cifrar solo se acepta para loopback y rangos de red privada.
Acciones #
Cada llamada nombra una action. La tabla muestra lo que necesita cada una; el
nivel es el ajuste Agents may más bajo que la permite en un relay emparejado.
| Acción | Qué hace | Necesita | Nivel |
|---|---|---|---|
list_ |
los relays y si cada uno está desbloqueado | ninguno | |
relay_ |
proveedores, modelos y carpetas de un relay | relay |
read |
usage |
lo que le queda al plan de cada proveedor | relay |
read |
list_ |
encontrar sesiones | relay |
read |
read_ |
leer los mensajes recientes de una sesión | relay, session |
read |
read_ |
leer el final de la salida de un comando en segundo plano | relay, session, task_ |
read |
send |
enviar un prompt a una sesión existente | relay, session, text |
prompt |
create_ |
iniciar una sesión con un primer prompt | relay, text |
full |
update_ |
Nuevo en 0.9.16 cambiar los ajustes de una sesión para sus próximos turns | relay, session, un ajuste |
full |
wait |
seguir esperando una respuesta | relay, session, message_ |
read |
answer_ |
responder a una pregunta que hizo el otro agente | relay, question_, answer o choices |
full |
stop |
detener el turn en curso | relay, session |
full |
archive |
archivar una sesión | relay, session |
full |
subscribe |
que te despierten los eventos de unas sesiones | sessions |
read |
unsubscribe |
terminar una suscripción | subscription_ |
read |
list_ |
mostrar las suscripciones | read | |
transfer_ |
asumir las suscripciones de otra conversación | from |
read |
schedule |
Nuevo en 0.9.16 hacer que este relay ponga en cola un prompt más tarde, una vez o de forma repetida | text, at o every_ |
solo este relay |
list_ |
Nuevo en 0.9.16 mostrar las programaciones de una conversación | solo este relay | |
unschedule |
Nuevo en 0.9.16 terminar una programación | schedule_ |
solo este relay |
ask |
Nuevo en 0.9.16 hacerte una pregunta sin esperar la respuesta | question |
ninguno para su propia sesión; prompt para otra |
list_ |
Nuevo en 0.9.16 mostrar las preguntas de la conversación | read | |
withdraw |
Nuevo en 0.9.16 retirar una pregunta | question_ |
read |
Un resultado es JSON. Una llamada que funcionó tiene "ok": true, el relay
sobre el que trabajó y un summary de una línea; una llamada que falló tiene
"ok": false, un code y un texto en error (Errores). Los
ejemplos de abajo muestran los campos principales, con nombres e ids
inventados.
Nuevo en 0.9.16 Un argumento que una acción no admite nunca se descarta sin
avisar. create_ y update_ rechazan la llamada con
REMOTE_, nombran sus propios argumentos y no cambian nada:
create_
Todas las demás acciones se ejecutan igualmente y listan en ignored, en su
resultado, los argumentos que no admitieron, hasta 20. Un valor vacío (null,
"", false o una lista vacía) cuenta como ningún argumento, porque algunos
proveedores envían todos los campos.
Encontrar relays y sesiones #
list_relays #
Lista los relays emparejados con name, url, online, version,
permission y unlocked. Cuando las sesiones de agentes están activadas, este
relay va primero, marcado con "self": true. También devuelve el límite de
espera de este relay. Es la única acción que funciona sin mención y sin 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 #
Lo que ofrece un relay, para que el agente pueda elegir proveedor, modelo y carpeta para una sesión nueva: su nombre, versión y plataforma, si acepta prompts de agentes, cada proveedor con su modelo predeterminado, sus modelos y sus valores de reasoning effort, las carpetas de trabajo predeterminada y recientes, y los modos del relay.
{ "action": "relay_info", "relay": "build-box" }
Nuevo en 0.9.16 También lista en groups los grupos de sesiones del relay, los que puede nombrar un
create_ allí: cada uno con id, name (lo que muestra la barra lateral; el
título de la sesión de cabecera en un grupo sin nombre) y member, primero
el grupo con la actividad más reciente. Solo se listan los grupos con al menos
una sesión no eliminada, como mucho 50; groups dice cuántos hay cuando
hay más. No incluye los ids ni los títulos de los miembros. Cuando no se pueden
leer los grupos del relay, por ejemplo porque ejecuta un OAR más antiguo,
groups es null y groups dice por qué y que create_ no puede
admitir group allí.
"groups": [
{ "id": "grp_…", "name": "Release 2.4", "memberCount": 3 },
{ "id": "grp_…", "name": "Review: server/", "memberCount": 2 }
]
usage Nuevo en 0.9.10 #
Lo que le queda al plan de cada proveedor en un relay, como en Check Usage (Ver consumo), para que un agente pueda comprobarlo antes de empezar un trabajo que cuesta: por proveedor, un estado y sus medidores (usado, asignación, restante, utilización, hora de reinicio), y si un límite de uso de Claude ha pausado los turns allí. Los proveedores que no están configurados o no se siguen lo indican. Nunca se incluyen nombres de cuenta, direcciones ni tokens.
{ "action": "usage", "relay": "this" }
list_sessions #
Lista sesiones con id, title, provider, model, state, cwd, la hora
de la última actividad y un recuento de mensajes. state es running_,
background_ (el agente ha respondido y sigue en marcha trabajo en segundo plano) o
idle; tasks lista los agentes en segundo plano y las tareas de shell.
Nuevo en 0.9.11 Una sesión de un grupo de sesiones también tiene group: su id, su name
y el role de la sesión en él, head o member. Nuevo en 0.9.16
create_ puede poner la sesión que crea en un grupo existente, y
update_ puede mover una sesión a un grupo, también a uno nuevo, o sacarla
de él. Renombrar, disolver y reorganizar grupos sigue siendo cosa tuya.
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
scope |
active | recent | all |
recent |
active: trabajando ahora. recent: las más recientes primero. all: recorrer todo por páginas. |
query |
texto | solo las sesiones cuyo título contiene esto | |
limit |
1–100 | 20 | tamaño de página |
cursor |
texto | el next de la página anterior |
{ "action": "list_sessions", "relay": "build-box", "scope": "active" }
read_session #
Lee los mensajes más recientes de una sesión, junto con lo que está pasando
allí: su state, una respuesta que aún se está escribiendo (in), y
cualquier pending que espere respuesta (Nuevo en 0.9.16 cada una con
kind: ask para una pregunta que no bloquea, ask_ para una tarjeta en la que espera la sesión). Nuevo en 0.9.11 Para una sesión de un grupo, group
añade los demás miembros, hasta 50, cada uno con id, title, role, state y
archived cuando está archivado.
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
session |
id | obligatorio | de list_ o create_ |
last |
1–50 | 10 | cuántos mensajes recientes |
before |
texto | el older de la lectura anterior, para retroceder por páginas |
|
include_ |
true | false | false | incluir las líneas de actividad de herramientas de cada respuesta |
max_ |
500–50000 | 12000 | presupuesto de texto para todo el resultado; los mensajes largos se recortan y se marcan con truncated |
{ "action": "read_session", "relay": "build-box", "session": "3f9c…", "last": 5 }
Nuevo en 0.9.12 Cada una de las tasks de la sesión tiene también su task,
output (si hay salida que leer con read_)
y, para un comando cuya salida está en un archivo, health:
minutes, quiet y quiet (el ajuste de tarea
silenciosa del relay) mientras se
ejecuta, y los counts de la ejecución de tests cuando los hay.
read_task_output Nuevo en 0.9.12 #
Lee el final de la salida de un comando de shell o de un monitor en segundo plano, la misma salida que muestra la consola de tareas: mientras la tarea se ejecuta y durante una hora después de que termine. Un agente puede comprobar si una compilación en otro relay sigue ocupada, se ha quedado en silencio o tiene tests fallidos, sin preguntar al agente que la inició.
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
session |
id | obligatorio | la sesión que ejecuta la tarea |
task_ |
id | obligatorio | el task de las tasks de read_ |
lines |
1–500 | 200 | cuántas de las últimas líneas |
El resultado tiene task (descripción, tipo, inicio, status y exit),
tail (las líneas, como texto sin formato y sin colores, con una línea repetida
marcada como [×N]), truncated cuando hay más antes de ellas, stall
(minutos desde la última salida, y quiet según el ajuste del relay) mientras
la tarea se ejecuta, y counts con el runner y sus tests superados, fallidos y
omitidos cuando la salida es una ejecución de tests.
Las credenciales se ocultan como en la consola. Una note indica cuándo solo
existe el final de la salida, cuándo la salida ya no está, o cuándo se le ha
pedido al proceso del agente y hay que repetir la llamada en unos segundos.
{ "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
}
Una tarea que no se está ejecutando y no terminó en la última hora responde
REMOTE_; un relay anterior a 0.9.12 responde
REMOTE_.
Enviar prompts #
send #
Pone un prompt en la queue de una sesión existente y espera la respuesta.
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
session |
id | obligatorio | |
text |
texto, hasta 100.000 caracteres | obligatorio | el prompt |
wait_ |
0–3600 | 120 | cuánto esperar la respuesta; 0 vuelve enseguida. Consulta Esperar. |
if_ |
queue | fail |
queue |
queue añade el prompt detrás del turn en curso, o corrige el rumbo de ese turn donde el proveedor lo admite. fail lo rechaza cuando la sesión está ocupada. |
mode |
plan | ask | agent | autopilot |
el modo de quien llama | modo del relay para ese turn |
model |
texto | la sesión conserva el suyo | cambia la sesión a este modelo. Nuevo en 0.9.13 Se comprueba primero: consulta Qué modelos se aceptan |
effort |
texto | la sesión conserva el suyo | reasoning effort, por ejemplo low, medium, high; el otro relay decide si su modelo lo admite. Una sesión de DeepSeek usa low, high o max y asigna los demás nombres a esos, por ejemplo medium a high (DeepSeek) |
provider |
claude | claude- |
la sesión conserva su facturación | Nuevo en 0.9.18 solo para una sesión de Claude: claude (la suscripción) o claude- (la clave de API). Nombrar la otra facturación cambia la sesión a partir de su próximo turn, junto con este mensaje. Consulta Cambiar la facturación |
{ "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": "…" }
}
Cambiar la facturación de una sesión de Claude Nuevo en 0.9.18 #
send con provider pasa una sesión de Claude entre la suscripción y la clave
de Claude API y envía el mensaje, en una sola llamada: un cambio rechazado no
envía nada, y un mensaje rechazado no cambia nada. La otra facturación tiene que
estar configurada en el relay de destino. La tarjeta de aprobación, cuando se
pide una, dice Switches billing to API key o Switches billing to subscription.
- Un cambio que el relay de destino rechaza vuelve con
REMOTE_cuando Claude API o Claude no están configurados allí o se ha alcanzado el límite mensual, y conRELAY_ PROVIDER_ UNAVAILABLE REMOTE_cuando el modelo de la sesión no está en la lista del otro lado.RELAY_ UNKNOWN_ MODEL remotelleva el código propio del relay, por ejemploCode CLAUDE_.API_ CAP_ REACHED - Un relay anterior a 0.9.18 no puede cambiar: la llamada se rechaza con
REMOTE_y no se envía nada.RELAY_ UNSUPPORTED - Sin
provider, la sesión conserva su facturación. Unsenda una sesión que usa la clave mientras se ha alcanzado el límite se rechaza y no se pone nada en cola: envía conprovider: "claude"para pasarla a la suscripción, o pide al usuario que suba el límite.
create_session #
Inicia una sesión nueva y le da su primer prompt. La sesión nueva no sabe nada de la conversación desde la que se inició, así que el prompt tiene que entenderse por sí solo.
Admite text, wait_, mode, model y effort como send, y además:
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
provider |
github | openai | claude | cursor | grok | claude- | deepseek Nuevo en 0.9.17 | claude- Nuevo en 0.9.18 |
el proveedor de quien llama | tiene que estar activado en el relay de destino. Nuevo en 0.9.19 La herramienta acepta cualquier id de proveedor; el relay en el que se ejecuta la sesión que llama lo comprueba con los proveedores que tiene ahora, tal como los lista relay_, y los nombra cuando rechaza uno. El proveedor tiene que seguir activado en el relay de destino. Por eso, una sesión iniciada con 0.9.19 o posterior puede usar los proveedores que añada una actualización posterior, sin reiniciarse |
model |
texto | el modelo de quien llama si el destino lo ofrece, si no el predeterminado del destino | Nuevo en 0.9.13 se comprueba primero: consulta Qué modelos se aceptan |
cwd |
ruta | la carpeta predeterminada del destino | carpeta de trabajo. No con claude-. |
repo |
owner/ o una URL de GitHub |
solo con claude-, y obligatorio allí: el repositorio que clona la sesión en la nube |
|
branch |
nombre de rama | la rama predeterminada del repositorio | solo con claude- |
title |
texto | la primera línea del prompt | título de la sesión |
group |
un id de grupo (grp_) o un nombre, hasta 200 caracteres |
ver abajo | Nuevo en 0.9.16 un grupo de sesiones existente en el relay de destino en el que poner la sesión nueva. Consulta Ponerla en un grupo |
Lo que el agente omite sigue a la sesión en la que trabaja, en la medida en que el relay de destino lo ofrezca. Un chat de OpenAI Image no se puede iniciar así.
{
"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."
}
Una sesión de Claude Cloud admite un repositorio en lugar de una carpeta:
{
"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
}
El resultado es el mismo que en send, más aquello con lo que se inició la
sesión: provider, model, mode, effort, title, y repo / branch en
una sesión en la nube. Nuevo en 0.9.16 También tiene group, el grupo de
sesiones en el que entró la sesión nueva, tal como lo muestra list_ (id, name, role), o null.
Ponerla en un grupo Nuevo en 0.9.16 #
Sin group, una sesión iniciada en este relay se une al grupo de la sesión que
la inició, o abre un grupo con esa sesión como cabecera. Una sesión iniciada en
un relay emparejado no entra en ningún grupo.
Con group, la sesión nueva entra en ese grupo existente, en este relay o en
uno emparejado. El agente nombra el grupo por su id, o por su nombre tal como
lo lista relay_, sin distinguir mayúsculas. Un group vacío cuenta como ninguno.
{
"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."
}
El relay busca el grupo en el destino antes de mostrar cualquier tarjeta de
aprobación, igual que hace con el modelo, y la tarjeta lo nombra
(Group: Release 2.). No se crea nada cuando:
- el destino no tiene ningún grupo con ese id o nombre. La llamada se rechaza
con
REMOTE_, yRELAY_ UNKNOWN_ GROUP errorygroupslistan los grupos de allí (hasta 20, congroupscuando hay más):Total Relay "build-box" has no session group "Relase". Groups there: Release 2. 4 (grp_ …), … No session was created. - el nombre encaja con más de un grupo. El mismo código, con los grupos de ese
nombre:
… Pass the id. - el grupo se disolvió entre la búsqueda y el inicio. El mismo código.
- no se pueden leer los grupos del destino. Un relay demasiado antiguo para
grouprespondeREMOTE_(RELAY_ UNSUPPORTED The target relay doesn't support groups on create_); uno que no responde o rechaza el token responde con su código habitual.session yet: …
Cuando la sesión se creó pero no acabó en el grupo pedido, el resultado tiene
group, su summary termina en (no group: …), y la note le pide al
agente que te lo diga. Entonces puedes mover la sesión a mano.
create_ solo admite un grupo existente. Para poner la sesión en un
grupo nuevo, el agente llama después a update_ con ese nombre. Renombrar,
disolver y reorganizar grupos sigue siendo cosa tuya.
update_session Nuevo en 0.9.16 #
Cambia los ajustes de otra sesión para sus próximos turns, sin enviarle un prompt, y responde con los ajustes que tiene ahora y lo que cambió. Funciona en este relay y en uno emparejado.
| Parámetro | Tipo | |
|---|---|---|
session |
id, obligatorio | la sesión que se cambia |
model |
texto | el modelo de la sesión a partir de ahora. Se comprueba como en send: consulta Qué modelos se aceptan. Una sesión de Grok conserva el modelo con el que se inició |
effort |
texto | el reasoning effort a partir de ahora; uno que su modelo admita. No para Claude Cloud |
mode |
plan | ask | agent | autopilot |
el modo del relay de la sesión |
auto_ |
tokens, o 0 |
la ventana de compactación automática: 100.000, 150.000, 200.000, 300.000, 500.000 o 1.000.000; otro número va al más cercano, y 0 es el predeterminado del modelo |
title |
texto | el título nuevo |
group |
id o nombre de grupo, o "none" |
mueve la sesión a ese grupo; un nombre que el relay no tiene crea un grupo nuevo; "none" (o null) saca la sesión de su grupo |
thinking_ |
true | false | si una sesión de Claude razona en sus próximos turns (thinking) |
thinking_ |
summarized | omitted |
si el texto de razonamiento de una sesión de Claude se muestra en su transcripción |
cwd |
ruta | la carpeta de trabajo de la sesión. Su CLI se reinicia allí |
Se necesita al menos un ajuste. Cualquier otro argumento se rechaza y no se
cambia nada. may no está entre los ajustes: 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 cambio a una carpeta nueva indica además si se reinició la CLI
(relaunched), y un grupo nuevo vuelve como group. Una llamada que no
cambiaría nada responde changed: [] y no pregunta a nadie. note lleva lo que
el agente debe saber, por ejemplo una ventana tomada como la más cercana, o que
la ventana y el razonamiento solo se aplican a sesiones de Claude (Nuevo en 0.9.18
incluidas las sesiones de Claude API) y no cambian nada en otro proveedor. Nuevo en 0.9.17 Una sesión de DeepSeek también recibe esa nota, pero
allí la ventana sí tiene efecto, y 0 significa 400.000 tokens;
thinking_ no, porque una sesión de DeepSeek siempre razona.
Quién puede cambiar qué. Un agente solo cambia libremente una sesión que
inició su propia conversación: en este relay, o en un relay emparejado cuando
ese relay registró esta conversación como la que la inició. Cualquier otra
sesión, tuya, de otro agente o la que inició al agente, necesita antes tu
Allow. Una tarjeta de pregunta te consulta una vez por conversación y relay,
nombra la sesión y lista el cambio (Model: … · Effort: … · Group: …);
Allow cubre los cambios posteriores de esa conversación en sesiones así de
allí. Deny rechaza la llamada con REMOTE_; una
conversación sin un turn en curso en el que preguntar recibe
REMOTE_. El otro relay aplica él mismo la misma regla. Un
agente nunca cambia la conversación en la que se ejecuta. En los modos ask y
plan se aplica además la tarjeta habitual de una acción de escritura.
Antes de que cambie nada, el relay comprueba toda la llamada en el destino: el modelo y el reasoning effort, el grupo, la carpeta y si hay que preguntarte. Un modelo desconocido, un id de grupo desconocido, un nombre de grupo que encaja con dos grupos, una carpeta que el relay no puede usar o una carpeta nueva para una sesión ocupada rechazan la llamada antes de cualquier tarjeta, y no se cambia nada.
Grupos.
- Un nombre que el relay no tiene crea un grupo nuevo con ese nombre. Un id de
grupo tiene que existir (
REMOTE_).RELAY_ UNKNOWN_ GROUP - Un grupo que creaste tú nunca se elimina así. Cuando un agente saca su última sesión, el grupo se queda y aparece en tu barra lateral como group · empty (grupo · vacío): renómbralo o disuélvelo desde su menú, o deja que un agente vuelva a nombrarlo. Nada lo elimina por sí solo.
- Un grupo que creó un agente, por nombre o al iniciar sesiones, desaparece en cuanto queda vacío.
La carpeta. Un cwd nuevo reinicia la CLI de la sesión en esa carpeta. Se
rechaza con REMOTE_ mientras haya un turn en cola o en curso allí, o
se ejecute una tarea en segundo plano: The session cannot move to another folder now: ….
La carpeta tiene que ser una que el relay pueda usar. Una sesión que aún no ha
arrancado conserva la carpeta para su primer arranque. Si la CLI no se reinicia,
la carpeta se guarda igualmente para su próximo arranque, y la respuesta lo
dice. No para Claude Cloud, que trabaja sobre un clon de su repositorio.
El modo fijado así dura hasta el siguiente send que nombre otro modo o
venga de alguien que llama en otro modo: un send sin mode transmite el modo
propio de quien llama.
Si un paso falla después de que otros se hayan escrito, la respuesta sigue
listando en changed lo que se escribió. Una página abierta muestra cada cambio
al instante. Un relay que ejecuta un OAR más antiguo responde
REMOTE_.
Qué modelos se aceptan Nuevo en 0.9.13 #
Un model en send o create_ se comprueba contra la lista que ofrece
New Chat (Nuevo chat) para el proveedor en el relay de destino, la misma lista
que muestra relay_, antes de cualquier tarjeta de
aprobación. Un modelo que no está en ella se rechaza con
REMOTE_, y no se crea ni se envía nada:
Unknown model 'gpt-5-4' for Copilot on relay "build-box"; did you mean 'gpt-5.4'? Valid ids: … Nothing was sent.
El resultado lleva también suggestions, las coincidencias cercanas, y
models, los ids válidos. Antes de 0.9.13 un id así creaba una sesión con otro
modelo, a la que las llamadas send posteriores con ese id no podían llegar.
Nuevo en 0.9.19 Los ids de modelo de Copilot llevan puntos: claude-, no el claude- de Claude. Copilot rechaza el id de otro proveedor antes de crear nada: con COPILOT_ y la coincidencia más cercana o, en create_, con el código del único otro proveedor que lista ese id, como CLAUDE_. Una sesión de Copilot nunca pasa a otro proveedor por el nombre de su modelo.
| El agente pasa | Lo que se ejecuta |
|---|---|
| Un id de la lista, con cualquier combinación de mayúsculas y minúsculas | Ese modelo, con las mayúsculas de la lista |
opus, sonnet o haiku (Claude) |
El modelo de Claude más reciente de la lista con ese nombre. Con [1m], su variante de contexto largo cuando está en la lista |
Un id de Copilot con su reasoning effort, como gpt- |
gpt- con reasoning effort high, cuando la lista ofrece ese valor para el modelo. Un effort pasado además tiene prioridad |
auto |
Se transmite tal cual |
Cuando el modelo que se ejecuta difiere del que se pidió, el model del
resultado lo dice. Cuando el relay de destino aún no tiene lista para el
proveedor (su detección de modelos no se ha ejecutado o ha fallado), el modelo
sigue adelante sin comprobar y model también lo dice. Un relay también
rechaza un modelo de Copilot desconocido cuando el agente de otro relay inicia
una sesión en él.
wait #
Sigue esperando una respuesta que send o create_ no recibieron a
tiempo.
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
session |
id | obligatorio | |
message_ |
id | obligatorio | el message_ que devolvió send o create_ |
wait_ |
0–3600 | 120 |
{ "action": "wait", "relay": "build-box", "session": "3f9c…", "message_id": "b41e…", "wait_seconds": 300 }
Esperar y lo que vuelve #
send, create_ y wait esperan la respuesta todo el tiempo que el
agente pida en wait_, hasta Longest wait per tool call (Espera
máxima por llamada a herramienta) en el relay en el que se ejecuta el agente
(Settings → Relays → Agent sessions): 10 minutos de forma predeterminada,
ajustable de 2 a 60 minutos. Cuando una llamada pidió más de lo que permite el
relay, el resultado lo dice en una note. Cuando se acaba el tiempo, el agente
recibe lo que haya hasta entonces y puede volver a llamar a wait.
Un turn que espera sigue contando para Max turn duration (Duración máxima del turn) en Settings → General (Ajustes → General).
El status del resultado dice en qué punto está la otra sesión:
status |
Significado |
|---|---|
queued |
El prompt se ha aceptado, aún no se ejecuta nada. También es lo que devuelve wait_. |
running |
Se acabó el tiempo mientras el turn seguía en curso (progress contiene la respuesta hasta ese momento y su actividad), o el agente ha respondido pero sigue trabajando en segundo plano (reply contiene su última respuesta). |
waiting_ |
El otro agente hizo una pregunta. pending la lista con su id, su texto y sus opciones. |
done |
Terminado. reply contiene la respuesta. |
failed |
El turn falló; la respuesta es el texto de error del relay. |
stopped |
El turn se detuvo antes de responder. |
cancelled |
No hay nada en cola ni en curso y no hay respuesta. |
duplicate |
El otro relay tomó el mensaje como repetición de uno que ya tiene. |
Cada uno de estos resultados lleva session y message_, y open, un
enlace que abre la sesión, cuando el relay tiene uno.
Dirigir otra sesión #
answer_question #
Responde a una tarjeta de pregunta que espera en otra sesión. A los agentes se les indica que te pregunten primero, salvo que les hayas dicho que decidan ellos.
| Parámetro | Tipo | |
|---|---|---|
question_ |
id, obligatorio | el id de pending |
choices |
lista de etiquetas de opción, hasta 50 | para una pregunta con opciones |
answer |
texto | una respuesta de texto libre |
Se necesita choices o answer. Un agente no puede responder a su propia
pregunta, ni a una tarjeta de aprobación de un relay: esas son tuyas.
Nuevo en 0.9.16 Tampoco puede responder a una pregunta que no bloquea: answer_ la
rechaza con REMOTE_ antes de llamar a nadie.
{ "action": "answer_question", "relay": "build-box", "question_id": "q_7d2…", "choices": ["Merge"] }
stop #
Detiene el turn que está en curso en una sesión, como hace Stop (Detener) en la interfaz. El resultado dice si se pidió una detención o si no había nada en curso.
{ "action": "stop", "relay": "this", "session": "3f9c…" }
archive #
Archiva una sesión.
{ "action": "archive", "relay": "this", "session": "3f9c…" }
Vigilar sesiones #
Nuevo en 0.9.10 En lugar de preguntar una y otra vez, un agente puede suscribirse a sesiones y que lo despierten cuando ocurre algo en ellas. Funciona en este relay (con las sesiones de agentes activadas) y en un relay emparejado.
Una suscripción solo notifica. No aprueba nada ni responde nada; lo que pide un evento se decide como antes, por ti o por el agente dentro de lo que puede hacer de todos modos.
subscribe #
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
sessions |
hasta 50 ids de sesión, o ["all"] |
obligatorio | all son todas las sesiones del relay, incluidas las posteriores |
events |
lista de nombres de evento | todos salvo task_ y task_, con subagent_ |
Nuevo en 0.9.13 consulta Los eventos predeterminados |
once |
true | false | false | terminar la suscripción después de que se dispare. Con match: tras la primera coincidencia. |
match |
expresión regular, hasta 200 caracteres, sin distinguir mayúsculas | una respuesta de turn_ o la descripción y el resumen de una tarea tienen que coincidir; los demás eventos pasan |
|
stalled_ |
1–1440 | 15 | minutos de silencio mientras hay trabajo en marcha antes de stalled |
heartbeat_ |
1–1440 | ninguno | añade un latido con esta frecuencia mientras se ejecuta un turn o una tarea vigilados, para que el agente que vigila sepa que su vigilancia funciona |
digest_ |
1–1440 | ninguno | Nuevo en 0.9.16 reúne los eventos de la suscripción en un mensaje cada N minutos. Consulta Menos despertares |
quiet_ |
{"from":"HH: |
ninguno | Nuevo en 0.9.16 retiene los eventos de la suscripción dentro de esta ventana diaria y los entrega cuando termina |
exclude |
hasta 50 ids de sesión | ninguno | Nuevo en 0.9.16 solo con sessions: ["all"]: sesiones que la suscripción deja fuera. También vale un texto separado por comas |
relay |
nombre de relay | this |
Una conversación puede tener 20 suscripciones a la vez. La propia conversación del agente nunca se vigila.
{ "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
}
}
Menos despertares Nuevo en 0.9.16 #
Cada despertar es un turn completo del agente que vigila. Tres opciones de
subscribe piden menos. question_, question_ y error nunca
quedan retenidos por ninguna de ellas; todos los demás eventos, incluidos
task_, stalled y all_, sí.
{
"action": "subscribe",
"sessions": ["all"],
"exclude": ["77aa…"],
"digest_minutes": 30,
"quiet_hours": { "from": "23:00", "to": "06:00", "tz": "Europe/Berlin" }
}
digest_. Los eventos de la suscripción se reúnen y llegan como un mensaje cada N minutos: como pronto N minutos después de crear la suscripción, y cada uno de los siguientes N minutos después del anterior. El mensaje diceminutes Digest of 4 events (subscription sub_. Un resumen de un único evento se lee como ese evento.… every 30 min; questions and errors come at once): quiet_. Una ventana diaria de hora local en una zona horaria IANA.hours fromytoson horas del día (HH:, deMM 00:a00 23:) y tienen que ser distintas; la ventana puede pasar de la medianoche. Lo que ocurre dentro espera y llega como un mensaje cuando termina la ventana, con la línea59 Held during quiet hours (23:Dentro no se genera ningún latido. Un evento que un resumen entregaría dentro de la ventana se mueve a su final.00–06: 00 Europe/ Berlin): 3 events, delivered now that the window has ended; questions and errors came at once. exclude. Una suscripción a todas las sesiones (all) ignora estas, también paraall_,idle stalledy el latido. Con una lista de sesiones se rechaza:exclude goes with sessions ["all"] only; a list of sessions names what it watches.
Cambios de hora. La ventana sigue el reloj de la zona horaria. La noche en
que se atrasan los relojes y to llega dos veces, la ventana termina la primera
vez y no se vuelve a entrar en ella en la hora repetida. La noche en que se
adelantan y se saltan to, termina en el momento del salto. Un límite conocido:
un from dentro de la hora repetida abre la ventana en la primera pasada, y en
la segunda pasada los minutos anteriores a from cuentan como fuera de ella.
Un valor incorrecto se rechaza diciendo qué está mal, por ejemplo quiet_, quiet_, o quiet_. Un quiet_ con todos los
campos vacíos cuenta como ninguno.
- Con
once. El evento que termina una suscripción de un solo disparo sigue respetando su resumen y sus horas de silencio: la suscripción termina al momento, y el evento llega cuando estos lo permiten. - Varias suscripciones. Un evento que recogieron varias suscripciones del agente que vigila sale cuando la primera de ellas lo deja salir; una suscripción sin opciones lo deja salir al momento.
- El límite por hora de 20 despertares se mantiene por encima de las opciones (Cómo llegan los eventos).
- Los eventos retenidos, y cuándo tocan, sobreviven a un reinicio del relay.
- La tarjeta de aprobación nombra las opciones (
digest every 30 min,quiet 23:,00–06: 00 Europe/ Berlin except 1 it leaves out).
Sin eco de los propios prompts del agente que vigila. Cuando el agente que
vigila envía él mismo un prompt a una sesión con send o create_ y recibe la respuesta terminada de esa
llamada o de un wait posterior, el turn_ de ese turn no lo despierta una segunda vez;
mientras sigue esperando, el turn_ queda retenido. Los errores y las
preguntas del turn siguen llegando. Un prompt que no esperó (wait_ y
ningún wait) lo despierta con turn_ como antes, igual que un turn_
que termina una suscripción once.
Eventos #
| Evento | Se dispara cuando | Lleva |
|---|---|---|
question_ |
una pregunta o una aprobación espera respuesta; Nuevo en 0.9.16 también una pregunta de un agente, marcada como una que no bloquea esa sesión | la pregunta, sus opciones y su question_ |
question_ |
Nuevo en 0.9.16 respondiste o descartaste una pregunta que no bloquea. No se nombra en events: una suscripción que recoge question_ también lo recoge, y la conversación que preguntó lo recibe siempre, sin suscripción |
question_, la pregunta, tu respuesta, la opción, o que la descartaste, y el relay en el que respondiste (via) |
error |
un turn falló, se alcanzó un límite de uso o murió el proceso del agente de la sesión | el tipo y el mensaje |
turn_ |
una sesión respondió | el principio de la respuesta |
task_ |
se inició un agente en segundo plano o una tarea de shell. Solo cuando se nombra en events. |
la descripción de la tarea |
task_ |
terminó un agente en segundo plano o una tarea de shell. Solo cuando se nombra en events. |
descripción, resultado, resumen |
subagent_ |
Nuevo en 0.9.13 terminó un subagent en segundo plano. Su línea en el mensaje dice task_ |
descripción, resultado, resumen |
task_ |
falló un agente en segundo plano o una tarea de shell | descripción, resultado, resumen |
stalled |
una sesión estuvo en silencio durante stalled_ mientras sigue habiendo trabajo en marcha |
los minutos de silencio |
all_ |
ya no se ejecuta ningún turn ni ninguna tarea en las sesiones vigiladas |
Los eventos predeterminados Nuevo en 0.9.13 #
Una suscripción que no nombra events recibe question_, error,
turn_, subagent_, task_, stalled y all_. Un
subagent en segundo plano que terminó despierta al agente que vigila, igual que
cualquier tarea que falló o salió con un código distinto de cero, pero un
comando de shell o un monitor que terminó bien no. Una sesión ocupada termina
uno cada minuto más o menos, y cada uno le costaría al agente que vigila un turn
sobre todo su contexto. Para recibir cada fin de tarea, nombra los eventos con
task_ en lugar de subagent_, y task_ para los
inicios.
Las suscripciones creadas antes de 0.9.13 sin events pasan solas a este valor
predeterminado; las que nombraron sus eventos los conservan. Un relay emparejado
con un OAR más antiguo aplica su propio valor predeterminado y rechaza
subagent_ por nombre.
Cómo llegan los eventos #
OAR escribe un mensaje corto en la conversación que vigila. Se muestra como una fila de evento compacta, nunca como uno de tus mensajes, y empieza con una línea que dice qué es:
[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 el agente que vigila está inactivo, el mensaje inicia un turn nuevo. Si está en mitad de un turn, consulta la tabla de abajo.
- Los eventos que caen dentro de 30 segundos llegan como un solo mensaje.
- Pasados 20 despertares en una hora, el resto llega como un resumen cada 10
minutos.
question_yasked errorsiguen llegando al momento (Nuevo en 0.9.16 yquestion_). Cuando este resumen y elanswered digest_de una suscripción coinciden, una sola líneaminutes Digest ofnombra ambos. - Nuevo en 0.9.16 El
digest_y lasminutes quiet_de una suscripción retienen más tiempo sus demás eventos.hours
| Proveedor de la sesión que vigila | Un evento durante un turn en curso |
|---|---|
| Claude, DeepSeek; GitHub Copilot y OpenAI con el motor SDK | corrige el rumbo del turn en curso |
| Cursor, Grok, Claude Cloud; GitHub Copilot y OpenAI con el motor de extensión | se convierte en el siguiente turn |
En un relay emparejado #
El relay tiene que estar desbloqueado en la conversación y permitir al menos la lectura, y el otro relay tiene que aceptar agentes de otros relays. Basta con un emparejamiento en un sentido. Este relay recoge los eventos cada pocos segundos, y sus líneas empiezan con el nombre del otro relay:
[relay event] build-box · session "Nightly deploy" (77aa…): turn_end (done) "Deployed. The health check is green."
Si se cae el enlace, el otro relay guarda lo que ocurre, hasta 500 eventos por
suscripción durante 7 días, y lo entrega como una fila marcada como replayed
(reproducido) en cuanto vuelve a responder, entre una línea link_ y una
link_. Un relay que ejecuta un OAR más antiguo responde que necesita
una actualización.
Nuevo en 0.9.16 El resumen y las horas de silencio de una suscripción a un relay
emparejado se aplican aquí, donde está el agente que vigila; exclude también
se pasa al otro relay, para all_, stalled y el latido. Los eventos
reproducidos respetan el resumen y las horas de silencio como cualquier otro; la
línea link_ dice entonces cuántos de ellos están retenidos y llegarán
más tarde. Un relay emparejado con un OAR más antiguo no conoce exclude: este
relay sigue descartando los eventos de esas sesiones, pero aquel relay los
cuenta para all_, para las detenciones por silencio y en la lista del
latido.
unsubscribe #
Termina una suscripción, o con "all" todas las suscripciones que la
conversación tiene en el relay nombrado.
| Parámetro | Tipo | |
|---|---|---|
subscription_ |
id o "all", obligatorio |
el id que devolvió subscribe |
{ "action": "unsubscribe", "subscription_id": "sub_ab12cd34ef" }
list_subscriptions #
Muestra las suscripciones de la conversación: las activas y las que terminaron
en la última hora, con el motivo. Con watcher, muestra las suscripciones de
otra conversación, que es como un agente las consulta antes de asumirlas.
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
watcher |
id de conversación | esta conversación |
{ "action": "list_subscriptions" }
Cada suscripción muestra sus sesiones, eventos, once, match,
stalled y heartbeat, Nuevo en 0.9.16 y digest,
quiet y exclude cuando los tiene. Una suscripción activa indica además
cuántos de sus eventos retienen ahora mismo su resumen o sus horas de silencio
(held) y cuándo toca el primero de ellos (next, null cuando
no hay ninguno retenido). Una que ha terminado solo lo indica mientras su último
evento sigue retenido, como tras un once que se disparó dentro de las horas de
silencio.
{
"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 #
Mueve todas las suscripciones de otra conversación a esta, por ejemplo cuando una sesión nueva sustituye a un agente que vigilaba. Siempre te pregunta en una tarjeta de aprobación.
| Parámetro | Tipo | |
|---|---|---|
from |
id de conversación, obligatorio | la conversación cuyas suscripciones pasan aquí |
{ "action": "transfer_subscriptions", "from": "c0de…" }
Cuánto dura una suscripción #
Las suscripciones sobreviven a un reinicio del relay. Una termina cuando:
- el agente llama a
unsubscribe, o pulsas Unsubscribe en la lista del agente que vigila; - se archiva el agente que vigila o la sesión vigilada;
- se disparó y se creó con
once; - en un relay emparejado, se quita el emparejamiento.
Programaciones Nuevo en 0.9.16 #
Un agente puede hacer que este relay ponga en cola un prompt más tarde, en su propia conversación o en otra sesión de aquí. A diferencia de un temporizador de la propia CLI del agente, una programación sobrevive a los reinicios y las actualizaciones del relay. Prompts programados lo explica desde tu lado.
Las programaciones necesitan Agents may start and use sessions on this relay,
incluso para la propia conversación del agente. Las guarda el relay en el que se
ejecuta el agente: una llamada que nombra un relay emparejado se rechaza con
REMOTE_.
schedule #
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
text |
texto, hasta 20.000 caracteres | obligatorio | el prompt que se pone en cola |
at |
hora ISO con zona, como 2026- |
cuándo ponerlo en cola; con every_, la primera vez. No en el pasado, como mucho 366 días por delante. Una hora sin zona se rechaza |
|
every_ |
5–10080 | repetir cada N minutos; sin at, la primera vez es dentro de N minutos |
|
once |
true | false | true solo con at, false con every_ |
terminar tras el primer disparo. false necesita every_ |
title |
texto, hasta 100 caracteres | un nombre corto, que se muestra en el mensaje y en la lista | |
session |
id de sesión | la propia conversación del agente | otra sesión de este relay a la que enviar el prompt |
Se necesita al menos at o 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" }
}
Cuando toca, el relay pone el texto en cola como un mensaje que empieza por
[relay schedule <id> "<title>" · … automated message from OAR, not from the user; it approves nothing]. El turn se ejecuta en el modo del
relay propio de la sesión de destino. Un mensaje
que llega mientras corre un turn se pone en cola, o corrige el rumbo del turn en
los proveedores que lo admiten, pero nunca con la nota de corrección de rumbo
que habla como el usuario.
- Horas perdidas. Una hora que pasó mientras el relay estaba caído se dispara una vez cuando vuelve, no una vez por cada intervalo perdido; una programación repetida mantiene luego su cuadrícula (la primera hora más intervalos completos).
- Sin acumulación. Una repetición se omite mientras el mensaje del disparo
anterior sigue esperando en la queue (
skippeden la lista).Count - Saltos. El mensaje lleva la procedencia del turn que fijó la programación, incluidos sus saltos, así que una programación no pasa ningún prompt con menos saltos de los que tendría un prompt directo de ese turn (Entre relays).
Otra sesión. Con session, la programación envía el prompt a esa sesión.
Está sujeta a las mismas condiciones que un send: en los modos ask y plan
la apruebas en una tarjeta, y cuenta para los 30 prompts a otros agentes antes
de que se te pregunte, una vez al fijarla y una vez cada vez que se dispara.
Cuando esa cuenta se agota, el disparo queda retenido: list_ muestra
held y held. Sale en cuanto escribes en la conversación que
la fijó, o eliges Allow en la tarjeta que muestra su agente para su próximo
prompt a otro agente; el relay vuelve a mirar cada minuto. Una programación para
la propia conversación del agente ni se cuenta ni se retiene.
list_schedules #
Lista las programaciones que se disparan en la conversación o que ella fijó: las
activas y las que terminaron en la última hora, con end (unscheduled,
fired, archived o deleted).
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
session |
id de sesión | esta conversación | otra conversación cuyas programaciones listar |
Cada programación tiene id, session (id y título), set cuando la fijó
otra conversación, title, el principio de su text, at, every,
once, next, last, fired, skipped cuando omitió
alguna, y held con held mientras está retenida.
unschedule #
Termina una programación de la conversación: una que se dispara en ella o que ella fijó.
| Parámetro | Tipo | |
|---|---|---|
schedule_ |
id, obligatorio | el id que devolvió schedule o list_ |
Cuándo termina una programación #
Una programación termina tras dispararse cuando tiene once, con unschedule o
con Cancel (Cancelar) en la lista ⏰ de la cabecera, y cuando se archiva o
se elimina la sesión en la que se dispara o la conversación que la fijó. Una
compactación mueve en cambio ambos tipos a la conversación
nueva. Una conversación tiene como mucho 20 programaciones activas que se
disparan en ella, y puede fijar como mucho 20 para otras sesiones; por encima,
REMOTE_.
Preguntas que no bloquean Nuevo en 0.9.16 #
Un agente puede hacerte una pregunta y seguir trabajando: la pregunta aparece como una tarjeta en su sesión y en tu Inbox, y el agente conoce la respuesta más tarde. Preguntas y la Inbox lo explica desde tu lado.
ask #
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
question |
texto, hasta 500 caracteres | obligatorio | la pregunta; el contexto va en detail |
options |
hasta 8 etiquetas, cada una de hasta 120 caracteres | respuestas que se muestran como botones; siempre puedes escribir una propia | |
recommendation |
texto, hasta 300 caracteres | la respuesta que recomienda el agente: una de las opciones, o texto libre | |
detail |
texto, hasta 2000 caracteres | contexto, que se muestra plegado, como texto sin formato | |
urgency |
normal | now |
normal |
now además te envía una notificación push |
session |
id de sesión | la propia conversación del agente | una sesión en cuyo nombre preguntar, en el relay nombrado |
{ "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 vuelve enseguida con question_ y status: "pending". El agente debe
seguir con lo que no depende de la respuesta y no volver a preguntar lo mismo
mientras esté pendiente.
La respuesta. Cuando respondes o descartas la pregunta, el agente recibe el
evento del relay question_, con question_, tu answer, la
choice que elegiste, dismissed cuando la descartaste, y via, el relay en
el que respondiste: aquel en el que se guarda la pregunta, o un relay emparejado
cuya Inbox usaste. No necesita suscripción. El evento es urgente: ningún resumen
ni horas de silencio lo retienen. Es automático y no aprueba nada más, y no
cuenta como un mensaje tuyo para la protección contra bucles:
responder a una pregunta no reinicia la cuenta de prompts que los agentes pueden
enviarse entre sí.
Quién responde. Solo tú, en la sesión o en una Inbox (la de este relay, o la
de un relay emparejado con él). answer_ rechaza estas preguntas.
Condiciones.
- Una pregunta sobre la propia conversación del agente,
list_yquestions withdrawno necesitan ningún ajuste ni mención. - Con
session, el agente pregunta en nombre de otra sesión: en este relay con Agents may start and use sessions on this relay, en un relay emparejado con Agents may al menos en Read and prompt y el relay desbloqueado. Una pregunta así es una escritura: en los modos ask y plan la apruebas en una tarjeta, y respeta el límite de saltos (Entre relays). La protección contra bucles no la cuenta. La tarjeta aparece en esa sesión, y tanto ella como la conversación que pregunta reciben la respuesta. - Una pregunta sobre una sesión de un relay emparejado se guarda en ese relay;
este relay comprueba cada 5 segundos si tiene respuesta mientras está abierta
(cada 30 segundos mientras aquel relay no responde). Un relay que ejecuta un
OAR más antiguo responde
REMOTE_.RELAY_ UNSUPPORTED
Puede haber como mucho 20 preguntas pendientes por conversación que pregunta, y
20 por sesión sobre la que tratan; por encima, REMOTE_.
Las preguntas no caducan.
list_questions #
Lista las preguntas de la conversación: las pendientes, y las respondidas,
descartadas o retiradas en el último día, con su estado y su respuesta. Con session, las
preguntas sobre otra sesión. En un relay emparejado lista las preguntas que esta
conversación hizo allí; read_ allí lista todas las preguntas
pendientes de una sesión.
| Parámetro | Tipo | Predeterminado | |
|---|---|---|---|
session |
id de sesión | esta conversación | otra sesión cuyas preguntas listar |
withdraw #
Retira una pregunta que sigue pendiente. Solo la conversación que preguntó puede retirarla.
| Parámetro | Tipo | |
|---|---|---|
question_ |
id, obligatorio | el id que devolvió ask |
Una pregunta también termina cuando se archiva o se elimina su sesión (no se avisa a nadie), y cuando se quita el emparejamiento con el relay en el que se guarda. Una compactación mueve sus preguntas a la conversación nueva.
Límites #
| Límite | Valor |
|---|---|
| Llamadas por conversación | 60 por minuto |
| Acciones de escritura por conversación | 10 por minuto |
| Sesiones trabajando que inició en este relay el agente de una conversación | 4 |
| Espera por llamada | 120 s de forma predeterminada; hasta el Longest wait per tool call del relay (10 min de forma predeterminada, 2–60 min) |
Longitud del prompt (text) |
100.000 caracteres |
| Prompts de agente a agente sin un mensaje tuyo | 30, luego se te pregunta |
| Relays que puede cruzar un prompt | 2, salvo que hayas desbloqueado tú mismo el siguiente relay |
Página de list_ |
20 de forma predeterminada, 100 como mucho |
Mensajes de read_ |
10 de forma predeterminada, 50 como mucho |
Texto de read_ |
12.000 caracteres de forma predeterminada, 50.000 como mucho |
read_ |
200 líneas de forma predeterminada, 500 como mucho, y 32 KB de texto |
| Suscripciones por conversación | 20 |
| Sesiones por suscripción | 50, o all |
| Eventos que guarda un relay emparejado mientras el enlace está caído | 500 por suscripción, durante 7 días |
Errores #
Una llamada rechazada vuelve con un code con el que el agente puede actuar.
| Código | Significado |
|---|---|
REMOTE_ |
falta un parámetro o es incorrecto; error dice cuál |
REMOTE_ |
no hay ningún relay con ese nombre, o el nombre encaja con más de uno |
REMOTE_ |
el relay emparejado no está desbloqueado en esta conversación: menciónalo |
REMOTE_ |
las sesiones de agentes están desactivadas en este relay |
REMOTE_ |
el nivel Agents may del relay no permite esta acción |
REMOTE_ |
el otro relay no acepta prompts de agentes de otros relays |
REMOTE_ |
elegiste Deny en la tarjeta de aprobación |
REMOTE_ |
hacía falta una aprobación, pero la sesión que llamaba no tenía ningún turn en curso en el que pedirla |
REMOTE_ |
una sesión que creó un agente intentó crear una sesión, Nuevo en 0.9.16 y no lo has permitido para esa sesión |
REMOTE_ |
Nuevo en 0.9.16 update_ sobre una sesión que la conversación no inició, y elegiste Deny (update_) |
REMOTE_ |
ya hay 4 sesiones iniciadas por el agente de esta conversación trabajando |
REMOTE_ |
el agente dirigió la acción a su propia conversación |
REMOTE_ |
el prompt ha cruzado dos relays y el siguiente no lo has desbloqueado tú |
REMOTE_ |
demasiadas llamadas; el resultado dice cuándo volver a intentarlo |
REMOTE_ |
send con if_ y la sesión está ocupada |
REMOTE_ |
no existe esa sesión, ese mensaje o esa pregunta |
REMOTE_ |
el proveedor no está activado en el relay de destino; Nuevo en 0.9.18 también un cambio de facturación que el destino rechaza porque Claude API o Claude no están configurados allí o se ha alcanzado el límite mensual, con el código propio del relay en remote |
REMOTE_ |
Nuevo en 0.9.16 create_ nombró un grupo de sesiones que el relay de destino no tiene, o un nombre que encaja con más de uno; groups lista los grupos de allí (Ponerla en un grupo) |
REMOTE_ |
Nuevo en 0.9.13 el relay de destino no lista ese modelo para el proveedor; suggestions y models dicen lo que ofrece (Qué modelos se aceptan) |
REMOTE_ |
Nuevo en 0.9.16 ya hay 20 preguntas pendientes para esta conversación, o para esa sesión (Preguntas que no bloquean) |
REMOTE_ |
Nuevo en 0.9.16 la sesión ya tiene 20 programaciones que se disparan en ella, o la conversación ha fijado 20 (Programaciones) |
REMOTE_ |
la conversación ya tiene todas las suscripciones que puede tener |
REMOTE_ |
el otro relay no responde |
REMOTE_ |
el otro relay rechazó el token guardado |
REMOTE_ |
el otro relay ejecuta un OAR más antiguo que no tiene esta acción |
REMOTE_ |
el otro relay respondió con este estado HTTP |
REMOTE_ |
algo falló dentro del relay |