preview
Mit preview stellt ein Agent etwas mit einer Weboberfläche unter einen
öffentlichen Link, damit du es vom Handy aus öffnen oder an jemanden schicken
kannst: einen Dev-Server, der auf einem Port des Relay-Rechners lauscht, oder
einen Ordner mit einfachen Dateien. Es kann außerdem die Previews seiner eigenen
Konversation auflisten und schließen.
Frag in einfachen Worten: „Starte den Dev-Server und gib mir einen Link“, „Zeig
mir die gebaute Website“. Der Agent wird angewiesen, das Tool immer zu nutzen,
wenn du eine Weboberfläche sehen, ausprobieren oder teilen willst, und dich nie
auf localhost zu verweisen.
Ein Preview-Link ist öffentlich
Jeder, der den Link hat, kann die App ohne Anmeldung öffnen. Das Token des Links ist der einzige Schutz. Der Agent wird angewiesen, das zu sagen, wenn er dir einen Link gibt. Schließ eine Preview, wenn du fertig bist.
Was du siehst #
- Eine Karte für die Preview in der Task-Leiste der Konversation, mit Open (Öffnen), Copy link (Link kopieren) und Close (Schließen).
- Eine Link-Karte im Verlauf, an der Antwort, in der der Agent sie
veröffentlicht hat. Sie zeigt ein Badge
closed, sobald die Preview weg ist. Eine geteilte Ansicht der Konversation zeigt nur die Beschriftung der Karte, nie den Link. - Jede Preview des Relays, über alle Konversationen hinweg, unter Settings → Previews (Einstellungen → Previews), jede mit einem Button zum Schließen.
- Ein Badge
offlineauf der Karte, wenn der Dev-Server hinter einer Port-Preview nicht mehr antwortet. Der Link bleibt registriert: Starte den Server erneut auf demselben Port, und derselbe Link funktioniert wieder.
Dasselbe geht ohne Agent, indem du / in den Eingabebereich tippst:
/preview 5173 web app publish a port
/preview ./dist built site publish a folder
/preview list list the previews
/preview close close one
Einrichten #
Previews sind aus, bis der Betreiber des Relays sie einrichtet. Sie brauchen einen eigenen Hostnamen, getrennt von dem des Relays, damit eine App in der Preview das Relay selbst nie erreichen kann. Drei Dinge:
- Einen Hostnamen, den du kontrollierst und der sich vom Relay im Namen unterscheidet, nicht nur im Port.
- Einen vorgeschalteten Proxy (Caddy, ein Cloudflare Tunnel, …), der diesen Hostnamen auf den Preview-Port richtet.
- Einen Block
previewsin derconfig.des Relays:json
{
"publicHostnames": ["relay.example.com"],
"previews": {
"enabled": true,
"port": 3334,
"bindHost": "127.0.0.1",
"publicBaseUrl": "https://preview.example.com",
"allowedTargetHosts": [],
"maxLive": 8
}
}
Agents haben das Tool, ob das erledigt ist oder nicht. Ohne Einrichtung kommt
ein Aufruf von create mit dem Grund zurück, und der Agent wird angewiesen, ihn
an dich weiterzugeben: Die Lösung liegt beim Betreiber.
Nach Provider #
| Provider | |
|---|---|
| Claude, Claude API Neu in 0.9.18, DeepSeek Neu in 0.9.17, Cursor | hat das Tool preview |
| Grok; GitHub Copilot und OpenAI auf der Extension-Engine | hat das Tool preview, über den MCP-Server von OAR Neu in 0.9.4 |
| GitHub Copilot und OpenAI auf der SDK-Engine | kein Tool. Solange Previews eingerichtet sind, wird dem Agent erklärt, wie er die Preview-API des Relays aufruft, mit denselben Regeln und seiner Konversation schon in die Aufrufe eingetragen. Was du siehst, ist dasselbe. |
| Claude Cloud | keins: Eine Cloud-Session läuft in einer Sandbox bei Anthropic, und es gibt keinen Port und keinen Ordner auf deinem Rechner zu veröffentlichen |
Aktionen #
| Aktion | Was sie tut | Parameter |
|---|---|---|
create |
einen Port oder einen Ordner veröffentlichen | port oder dir, optional label |
list |
die Previews dieser Konversation auflisten | |
close |
eine der Previews dieser Konversation schließen | token, optional, wenn die Konversation genau eine hat |
Ein Ergebnis ist JSON mit "ok": true oder "ok": false und einem
error-Text. Das Tool schlägt nie auf andere Weise fehl; ein falscher Parameter
kommt als error zurück, den der Agent lesen kann.
create #
Veröffentlicht entweder einen Port oder einen Ordner, nie beides in einem
Aufruf. Neu in 0.9.11 Wird derselbe Port oder Ordner in derselben Konversation
erneut veröffentlicht, kommt die Preview zurück, die schon läuft, mit demselben
Link und unveränderter Beschriftung; das Ergebnis sagt dann "existing": true.
| Parameter | Typ | |
|---|---|---|
port |
1024–65535 | der lokale Port eines Dev-Servers |
dir |
Pfad | ein Ordner, der als einfache Dateien ausgeliefert wird: absolut oder relativ zum Arbeitsordner der Konversation |
label |
Text, bis zu 120 Zeichen | der Name auf der Preview-Karte |
Ein Dev-Server (port) #
Das Relay reicht Anfragen an einen Server durch, der auf diesem Port lauscht. Es startet diesen Server nicht, überwacht ihn nicht und startet ihn nicht neu; das bleibt ein gewöhnlicher Hintergrund-Task des Agents, mit eigenem Stopp-Button.
Jede Preview liegt unter einem eigenen Pfad auf dem Preview-Hostnamen. Der
Browser fragt nach /; das Relay entfernt dieses Präfix, bevor es
die Anfrage weiterreicht, und teilt der App das Präfix in X-
mit. Es schreibt keine Seiten um. Eine App funktioniert also, wenn die Links und
Asset-Adressen, die sie ausgibt, relativ sind oder das Präfix tragen, während
sie Anfragen ohne das Präfix beantwortet. Eine App, die / von der
Wurzel des Hosts anfragt, findet es nicht.
Deshalb wird der Agent angewiesen, create zuerst aufzurufen und den
base aus dem Ergebnis zu lesen, bevor er den Dev-Server startet.
Was Agents gesagt wird, passt nicht zu jedem Dev-Server
Die eigene Beschreibung des Tools schlägt vor, den Server mit gesetztem
Basispfad zu starten (Vite --base, Next.js base, ein
Express-Mount-Präfix). Ein Server, der dann das Präfix in den Anfragen
erwartet, die er bekommt, passt nicht zu dem, was das Relay weiterreicht: Der
Dev-Server von Vite und ein unter dem Präfix eingehängter Express-Router
funktionieren so nicht. Previews
erklärt, was funktioniert.
{ "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."
}
Neu in 0.9.17 Der hint sagt dem Agent außerdem, den Dev-Server an
127. zu binden, nicht an 0.: Der Proxy des Relays erreicht ihn
dort, und sonst soll ihn nichts erreichen. Nur Sessions mit dem Tool preview
bekommen diese Zeile (siehe Nach
Provider). Agents, denen statt des Tools die Preview-API
beigebracht wird, bekommen sie nicht: GitHub Copilot und OpenAI auf der
SDK-Engine sowie Grok und die Extension-Engine von Copilot, wenn das Relay mit
OAR_ läuft.
Ein Ordner (dir) #
Das Relay liefert die Dateien des Ordners selbst aus. Es muss nichts laufen: gut für eine Build-Ausgabe, ein Mockup, eine einzelne HTML-Datei oder einen Coverage-Bericht.
- Der Ordner muss innerhalb des Arbeitsordners der Konversation liegen. Das wird bei jeder Anfrage erneut geprüft, sodass ein Link später nicht nach außerhalb führen kann.
- Dateien und Ordner, deren Namen mit einem Punkt beginnen (
.,git .), werden nie ausgeliefert, ebenso wenig Key-Dateien (env *.,pem *.,key id_).rsa… - Für einen Ordnerpfad wird
index.ausgeliefert.html - Relative Asset-Pfade funktionieren, wie sie sind. Pfade ab der Wurzel des
Hosts (
/) nicht.assets/ app. js - Keine WebSocket-Verbindungen.
{ "action": "create", "dir": "./dist", "label": "built site" }
Das Ergebnis hat dieselben Felder, mit "mode": "static".
list #
Listet die Previews der eigenen Konversation des Agents auf, mit token,
label, url, target (der Ordner oder localhost:<port>), online und der
Konversation. Neu in 0.9.14 Vor 0.9.14 umfasste die Liste jede Preview des
Relays; das Token einer Preview ist ihr einziger Schutz, deshalb sieht ein Agent
jetzt nur seine eigenen. Die Liste für das ganze Relay gehört dir, unter
Settings → Previews und mit /. Eine Preview, die das Relay nach einem Neustart nicht prüfen konnte, trägt "unverified": true
und wird nicht ausgeliefert, bis die Prüfung antwortet (siehe
Nach einem Relay-Neustart).
{ "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 #
Schließt den Link. Ein Dev-Server dahinter läuft weiter.
| Parameter | Typ | |
|---|---|---|
token |
32 Hex-Zeichen | das token aus create oder list. Darf weggelassen werden, wenn die Konversation genau eine Preview hat. |
Ohne token und mit mehreren Previews in der Konversation kommt der Aufruf mit
einem error und der Liste zur Auswahl zurück.
Neu in 0.9.14 Ein Agent schließt nur die Previews seiner eigenen Konversation. Das Token der Preview einer anderen Konversation wird abgelehnt:
{ "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" } }
Grenzen #
| Grenze | Wert |
|---|---|
| Gleichzeitige Previews, ganzes Relay | 8 (previews.) |
| Welche Previews ein Agent auflisten und schließen kann | die seiner eigenen Konversation Neu in 0.9.14 |
| Port | 1024–65535, und nie einer der eigenen Ports des Relays |
| Wohin eine Port-Preview zeigen darf | auf den eigenen Rechner des Relays (Loopback), dazu auf Hosts, die der Betreiber in previews. einträgt |
| Wohin eine Ordner-Preview zeigen darf | in den Arbeitsordner der Konversation |
| Lebensdauer | bis sie geschlossen oder ihre Konversation gelöscht wird. Neu in 0.9.11 Sie übersteht einen Relay-Neustart; eine Port-Preview endet, wenn der Rechner neu startet, eine Ordner-Preview, wenn ihr Ordner den Arbeitsordner verlässt. Eine Preview läuft nicht von selbst ab. |
| Beschriftung | 120 Zeichen |
Previews sind vom Relay getrennt: Sie werden auf einem eigenen Port unter einem eigenen Hostnamen ausgeliefert, wo es keine der eigenen Seiten oder APIs des Relays gibt. Previews teilen sich diesen Hostnamen untereinander, jede unter ihrem eigenen Pfad.
Der Bezug auf die Konversation ist keine Mauer
Das Relay beschränkt eine Preview-Anfrage auf die Konversation, die sie nennt,
in der Query conversation oder im Konversations-Header, den jeder
Session-Worker und der MCP-Server von OAR senden. Agents nutzen dasselbe
Relay-Token wie du, die Beschränkung wird also von der Anfrage behauptet, nicht
bewiesen: Eine Anfrage, die keine Konversation nennt, bekommt weiterhin jede
Preview. Die Beschränkung hält das Tool und die Aufrufe, die Agents beigebracht
werden, bei ihrer eigenen Konversation; sie hält keinen Agent auf, der das
Relay-Token liest und die API von Hand aufruft. Siehe
Was OAR offenlegt.