Ein Agent, drei Vertrauensstufen
Ein Berechtigungsmodus entscheidet, was ein Agent ohne Nachfrage tun darf. Im Modus plan liest er nur. Im Modus fragen fragt er, bevor er etwas ändert. Im Modus auto arbeitet er allein innerhalb von Grenzen.
Derselbe Agent ist in einem Modus sicher unbeaufsichtigt und in einem anderen nicht. Den Modus wählt man deshalb für jeden Lauf.
Am Ende dieser Lektion
Notiz
Ich kann denselben Agenten in den Modi fragen, plan und auto laufen lassen und sagen, was jeder durchlässt und was immer nachfragt.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Modus | eine Einstellung, die entscheidet, was ohne Nachfrage läuft |
| Planmodus | ein Modus, der nur liest |
| Risiko | wie viel Schaden eine Aktion anrichten kann |
| Erlaubnisliste | vorab genehmigte Befehle |
| Geschützter Pfad | eine Datei, die immer eine Freigabe braucht |
| Freigabe | das Ja oder Nein der Person zu einer Aktion |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Modus ist eine Einstellung, kein Prompt
Sie könnten «ändere nie Dateien» in den Prompt schreiben. Ein Modell kann es trotzdem tun, denn ein Prompt ist eine Bitte.
Ein Modus ist Code im Harness. Jede Aktion läuft vor der Ausführung durch eine Funktion. Im Planmodus lehnt diese Funktion ein Schreiben ab, was das Modell auch sagt. Das Modell sieht keinen Weg daran vorbei.
Regeln werden der Reihe nach geprüft
Geben Sie jeder Aktion ein Risiko: lesen, schreiben, ausführen oder zerstörend. Entscheiden Sie dann nach Modus, mit Regeln in fester Reihenfolge. Der Planmodus kommt zuerst, weil er mehr ablehnt als jeder andere.
Danach fragt ein geschützter Pfad oder eine zerstörende Aktion immer nach. Erst dann lockert ein Modus etwas. Eine Erlaubnisliste lässt den Modus auto benannte Befehle ohne Nachfrage ausführen.
Was jeder Modus mit jedem Risiko tut
| Risiko | Plan | Fragen | Auto |
|---|---|---|---|
| Lesen | Erlauben | Erlauben | Erlauben |
| Schreiben | Verweigern | Nachfragen | Erlauben |
| Ausführen | Verweigern | Nachfragen | Erlauben, wenn gelistet |
| Zerstörend | Verweigern | Nachfragen | Nachfragen |
| Geschützter Pfad | Verweigern | Nachfragen | Nachfragen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele verlangen bei jeder Aktion eine Freigabe. Dann klicken Menschen ohne zu lesen auf Ja. Fragen Sie nur, wo es zählt: geschützte Pfade, zerstörende Aktionen und Befehle außerhalb der Liste.
Modell-Hilfe schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' '// Die Token einer Antwort oder null, wenn sie keine nennt.' 'function zaehlen(daten, name) {' ' return daten.usage && typeof daten.usage[name] === \"number\" ? daten.usage[name] : null;' '}' > model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Modell-Hilfe schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function fragen(nachrichten, probe, max) {' ' try {' ' const res = await fetch(basis + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: nachrichten, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, eingabe: zaehlen(d, \"prompt_tokens\"), ausgabe: zaehlen(d, \"completion_tokens\"), aufgezeichnet: false };' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' return { text: probe, eingabe: null, ausgabe: null, aufgezeichnet: true };' ' }' '}' 'module.exports = { fragen };' >> model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Modusprüfer schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const ERLAUBT = [\"pytest\"];' 'const aktionen = [' ' { werkzeug: \"datei_lesen\", risiko: \"lesen\", ziel: \"src/app.py\" },' ' { werkzeug: \"datei_schreiben\", risiko: \"schreiben\", ziel: \"src/app.py\" },' ' { werkzeug: \"ausfuehren\", risiko: \"ausfuehren\", ziel: \"pytest\" },' ' { werkzeug: \"ausfuehren\", risiko: \"ausfuehren\", ziel: \"curl seite\" },' ' { werkzeug: \"datei_loeschen\", risiko: \"zerstoerend\", ziel: \"src/alt.py\" },' ' { werkzeug: \"datei_lesen\", risiko: \"lesen\", ziel: \".env\" },' '];' > modi3.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Modusprüfer schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function geschuetzt(z) {' ' return z === \".env\" || z.startsWith(\".env.\") || z.startsWith(\".git/\") || z.toLowerCase().includes(\"geheim\");' '}' 'function entscheide(modus, a) {' ' if (modus === \"plan\") return a.risiko === \"lesen\" && geschuetzt(a.ziel) === false ? \"erlauben\" : \"verweigern\";' ' if (geschuetzt(a.ziel) || a.risiko === \"zerstoerend\") return \"nachfragen\";' ' if (modus === \"fragen\") return a.risiko === \"lesen\" ? \"erlauben\" : \"nachfragen\";' ' if (a.risiko === \"ausfuehren\") return ERLAUBT.includes(a.ziel) ? \"erlauben\" : \"nachfragen\";' ' return \"erlauben\";' '}' >> modi3.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Modusprüfer schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const a of aktionen) {' ' const zeile = [\"fragen\", \"plan\", \"auto\"].map(function (m) { return m + \":\" + entscheide(m, a); });' ' console.log(a.werkzeug + \" \" + a.ziel + \" -> \" + zeile.join(\" \"));' ' }' ' const f = \"Ein Agent will src/alt.py löschen. Schreiben Sie einen kurzen Satz, der die Person um Freigabe bittet.\";' ' const antwort = await fragen([{ role: \"user\", content: f }], \"Der Agent will src/alt.py löschen. Erlauben Sie das?\", 40);' ' console.log(\"angezeigte Frage: \" + antwort.text);' '}' 'main();' >> modi3.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Aktionen in drei Modi ausführen
docker exec -w /home/node/project agent node modi3.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Entscheidungen brauchen kein Modell
Die sechs Zeilen kommen allein aus der Entscheidungsfunktion, sind also für alle gleich. Danach macht der Run einen kurzen Aufruf, um die Frage zu formulieren, die eine Person vor einem Löschen sähe.
Ohne Modell gibt er für diese eine Zeile eine aufgezeichnete Probe aus.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| datei_lesen src/app.py -> fragen:erlauben plan:erlauben auto:erlauben | Ein einfaches Lesen geht überall durch |
| datei_schreiben src/app.py -> fragen:nachfragen plan:verweigern auto:erlauben | Nur auto lässt ein Schreiben durch |
| ausfuehren pytest -> fragen:nachfragen plan:verweigern auto:erlauben | Es steht auf der Erlaubnisliste |
| ausfuehren curl seite -> fragen:nachfragen plan:verweigern auto:nachfragen | Nicht gelistet, also fragt auto |
| datei_loeschen src/alt.py -> fragen:nachfragen plan:verweigern auto:nachfragen | Ein Löschen fragt immer |
| datei_lesen .env -> fragen:nachfragen plan:verweigern auto:nachfragen | Ein geschützter Pfad fragt immer |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.