preview
Con preview un agente pone algo con interfaz web en un enlace público, para
que lo abras desde tu teléfono o se lo envíes a alguien: un servidor de
desarrollo que escucha en un puerto de la máquina del relay, o una carpeta de
archivos sin más. También puede listar y cerrar las vistas previas de su propia
conversación.
Pídelo con palabras normales: «arranca el servidor de desarrollo y dame un
enlace», «enséñame el sitio compilado». Al agente se le indica que use la
herramienta siempre que quieras ver, probar o compartir una interfaz web, y que
nunca te mande a localhost.
Un enlace de vista previa es público
Cualquiera que tenga el enlace puede abrir la app sin iniciar sesión. El token del enlace es la única protección. Al agente se le indica que lo diga cuando te dé un enlace. Cierra una vista previa cuando termines con ella.
Lo que ves #
- Una tarjeta de la vista previa en el panel de tareas en segundo plano de la conversación, con Open (Abrir), Copy link (Copiar enlace) y Close (Cerrar).
- Una tarjeta de enlace en la transcripción, en la respuesta en la que el agente
la publicó. Muestra una insignia
closeden cuanto la vista previa deja de existir. Una vista compartida de la conversación muestra solo la etiqueta de la tarjeta, nunca el enlace. - Todas las vistas previas del relay, de todas las conversaciones, en Settings → Previews (Ajustes → Vistas previas), cada una con un botón para cerrarla.
- Una insignia
offlineen la tarjeta cuando el servidor de desarrollo que hay detrás de una vista previa de puerto deja de responder. El enlace sigue registrado: arranca el servidor de nuevo en el mismo puerto y el mismo enlace vuelve a funcionar.
Puedes hacer lo mismo sin agente escribiendo / en el área de redacción:
/preview 5173 web app publish a port
/preview ./dist built site publish a folder
/preview list list the previews
/preview close close one
Configurarlo #
Las vistas previas están desactivadas hasta que el operador del relay las configura. Necesitan un nombre de host propio, distinto del del relay, para que una app en vista previa nunca pueda llegar al propio relay. Tres cosas:
- Un nombre de host que controles y que se distinga del del relay por el nombre, no solo por el puerto.
- Un proxy frontal (Caddy, un Cloudflare Tunnel, …) que dirija ese nombre de host al puerto de las vistas previas.
- Un bloque
previewsen elconfig.del relay:json
{
"publicHostnames": ["relay.example.com"],
"previews": {
"enabled": true,
"port": 3334,
"bindHost": "127.0.0.1",
"publicBaseUrl": "https://preview.example.com",
"allowedTargetHosts": [],
"maxLive": 8
}
}
Los agentes tienen la herramienta tanto si esto está hecho como si no. Sin ello,
una llamada create vuelve con el motivo, y al agente se le indica que te lo
transmita: el arreglo le corresponde al operador.
Por proveedor #
| Proveedor | |
|---|---|
| Claude, Claude API Nuevo en 0.9.18, DeepSeek Nuevo en 0.9.17, Cursor | tiene la herramienta preview |
| Grok; GitHub Copilot y OpenAI con el motor de extensión | tiene la herramienta preview, a través del servidor MCP de OAR Nuevo en 0.9.4 |
| GitHub Copilot y OpenAI con el motor SDK | sin herramienta. Mientras las vistas previas estén configuradas, al agente se le explica cómo llamar a la API de vistas previas del relay, con las mismas reglas y con su conversación ya escrita en las llamadas. Lo que ves es lo mismo. |
| Claude Cloud | ninguna: una sesión en la nube se ejecuta en un sandbox en Anthropic, y no hay ningún puerto ni carpeta de tu máquina que publicar |
Acciones #
| Acción | Qué hace | Parámetros |
|---|---|---|
create |
publica un puerto o una carpeta | port o dir, opcionalmente label |
list |
lista las vistas previas de esta conversación | |
close |
cierra una de las vistas previas de esta conversación | token, opcional cuando la conversación tiene exactamente una |
Un resultado es JSON con "ok": true, o con "ok": false y un texto en
error. La herramienta nunca falla de otra manera; un parámetro incorrecto
vuelve como un error que el agente puede leer.
create #
Publica o un puerto o una carpeta, nunca ambos en una misma llamada.
Nuevo en 0.9.11 Publicar de nuevo el mismo puerto o la misma carpeta en la misma
conversación devuelve la vista previa que ya está activa, con el mismo enlace y
la etiqueta sin cambios; el resultado dice entonces "existing": true.
| Parámetro | Tipo | |
|---|---|---|
port |
1024–65535 | el puerto local de un servidor de desarrollo |
dir |
ruta | una carpeta que se sirve como archivos sin más: absoluta, o relativa a la carpeta de trabajo de la conversación |
label |
texto, hasta 120 caracteres | el nombre en la tarjeta de la vista previa |
Un servidor de desarrollo (port) #
El relay reenvía las peticiones a un servidor que escucha en ese puerto. No arranca, vigila ni reinicia ese servidor; eso sigue siendo una tarea en segundo plano normal del agente, con su propio botón de detener.
Cada vista previa vive bajo su propia ruta en el nombre de host de las vistas
previas. El navegador pide /; el relay quita ese prefijo antes
de reenviar la petición y le comunica el prefijo a la app en
X-. No reescribe las páginas. Así que una app funciona cuando
los enlaces y las direcciones de recursos que envía son relativos o llevan el
prefijo, mientras responde a peticiones sin el prefijo. Una app que pide
/ desde la raíz del host no lo encontrará.
Por eso al agente se le indica que llame a create primero y lea el
base del resultado antes de arrancar el servidor de desarrollo.
Lo que se les indica a los agentes no encaja con todos los servidores de desarrollo
La propia descripción de la herramienta sugiere arrancar el servidor con la ruta
base configurada (Vite --base, Next.js base, un prefijo de montaje de
Express). Un servidor que luego espera el prefijo en las peticiones que recibe
no coincide con lo que el relay le reenvía: el servidor de desarrollo de Vite y
un router de Express montado en el prefijo no funcionan así. Vistas previas
explica lo que sí funciona.
{ "action": "create", "port": 5173, "label": "web app" }
{
"ok": true,
"existing": false,
"url": "https://preview.example.com/test_0123456789abcdef0123456789abcdef/",
"basePath": "/test_0123456789abcdef0123456789abcdef/",
"token": "0123456789abcdef0123456789abcdef",
"mode": "port",
"hint": "Serve the app under /test_0123456789abcdef0123456789abcdef/ (the proxy strips the prefix and sends X-Forwarded-Prefix). Bind the dev server to 127.0.0.1, not 0.0.0.0: the relay's proxy reaches it there and nothing else should. Tell the user the URL and that the link is public."
}
Nuevo en 0.9.17 El hint también le indica al agente que vincule el servidor de
desarrollo a 127., no a 0.: el proxy del relay llega a él ahí, y
nada más debería hacerlo. Solo las sesiones con la herramienta preview reciben
esta línea (consulta Por proveedor). Los agentes a los que se
les enseña la API de vistas previas en lugar de la herramienta no la reciben:
GitHub Copilot y OpenAI con el motor SDK, y Grok y el motor de extensión de
Copilot cuando el relay se ejecuta con OAR_.
Una carpeta (dir) #
El relay sirve él mismo los archivos de la carpeta. No tiene que ejecutarse nada: va bien para el resultado de una compilación, una maqueta, un único archivo HTML o un informe de cobertura.
- La carpeta tiene que estar dentro de la carpeta de trabajo de la conversación. Esto se vuelve a comprobar en cada petición, así que un enlace no puede hacerse apuntar fuera más tarde.
- Los archivos y carpetas cuyo nombre empieza por un punto (
.,git .) nunca se sirven, y tampoco los archivos de claves (env *.,pem *.,key id_).rsa… - Para la ruta de una carpeta se sirve
index..html - Las rutas relativas de recursos funcionan tal cual. Las rutas desde la raíz
del host (
/) no.assets/ app. js - No hay conexiones WebSocket.
{ "action": "create", "dir": "./dist", "label": "built site" }
El resultado tiene los mismos campos, con "mode": "static".
list #
Lista las vistas previas de la propia conversación del agente, con token,
label, url, target (la carpeta, o localhost:<port>), online y la
conversación. Nuevo en 0.9.14 Antes de 0.9.14 la lista abarcaba todas las vistas
previas del relay; el token de una vista previa es su única protección, así que
ahora un agente solo ve las suyas. La lista de todo el relay es tuya, en
Settings → Previews y con /. Una vista previa que el relay no
pudo comprobar tras un reinicio lleva "unverified": true
y no se sirve hasta que la comprobación responde (consulta
Después de un reinicio del relay).
{ "action": "list" }
{
"ok": true,
"enabled": true,
"previews": [
{ "token": "0123456789abcdef0123456789abcdef", "label": "web app", "url": "https://preview.example.com/test_0123456789abcdef0123456789abcdef/", "target": "localhost:5173", "online": true, "conversationId": "3f9c…" }
]
}
close #
Cierra el enlace. Un servidor de desarrollo que haya detrás sigue ejecutándose.
| Parámetro | Tipo | |
|---|---|---|
token |
32 caracteres hexadecimales | el token de create o list. Se puede omitir cuando la conversación tiene exactamente una vista previa. |
Sin token y con varias vistas previas en la conversación, la llamada vuelve
con un error y la lista entre la que elegir.
Nuevo en 0.9.14 Un agente solo cierra las vistas previas de su propia conversación. El token de la vista previa de otra conversación se rechaza:
{ "ok": false, "error": "This preview belongs to another conversation; a conversation can close only its own previews. The owner can close it in Settings → Previews." }
{ "action": "close", "token": "0123456789abcdef0123456789abcdef" }
{ "ok": true, "closed": { "token": "0123456789abcdef0123456789abcdef", "label": "web app" } }
Límites #
| Límite | Valor |
|---|---|
| Vistas previas a la vez, en todo el relay | 8 (previews.) |
| Qué vistas previas puede listar y cerrar un agente | las de su propia conversación Nuevo en 0.9.14 |
| Puerto | 1024–65535, y nunca uno de los puertos del propio relay |
| Adónde puede apuntar una vista previa de puerto | a la propia máquina del relay (loopback), más los hosts que el operador liste en previews. |
| Adónde puede apuntar una vista previa de carpeta | dentro de la carpeta de trabajo de la conversación |
| Duración | hasta que se cierra o se elimina su conversación. Nuevo en 0.9.11 Sobrevive a un reinicio del relay; una vista previa de puerto termina cuando la máquina se reinicia, una de carpeta cuando su carpeta sale de la carpeta de trabajo. Una vista previa no caduca por sí sola. |
| Etiqueta | 120 caracteres |
Las vistas previas se mantienen separadas del relay: se sirven en un puerto aparte, bajo un nombre de host aparte, donde no existe ninguna de las páginas ni la API del propio relay. Las vistas previas comparten ese nombre de host entre ellas, cada una bajo su propia ruta.
El alcance por conversación no es un muro
El relay limita una petición de vista previa a la conversación que nombra, en la
consulta conversation o en la cabecera de conversación que envían todos los
workers de sesión y el servidor MCP de OAR. Los agentes usan el mismo token del
relay que tú, así que el alcance lo declara la petición, no se demuestra: una
petición que no nombra ninguna conversación sigue recibiendo todas las vistas
previas. El alcance mantiene la herramienta y las llamadas que se enseñan a los
agentes dentro de su propia conversación; no detiene a un agente que lee el
token del relay y llama a la API a mano. Consulta
Qué expone OAR.