Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Schnappschuss und Zurücksetzen eines Ordners

Nach dieser Lektion: Ich kann einen Ordner so zurückstellen, wie er war, bevor ein Agent handelte.

Lektion, 65 Min.8 BefehleLab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

Einen Ordner zurückstellen, wie er war

Ein Schnappschuss ist eine Kopie jeder Datei in einem Ordner, gemacht, bevor ein Agent handelt. Ein Zurücksetzen stellt den Ordner auf diese Kopie zurück.

Das ist wichtig, weil selbst ein eingegrenzter Agent die Dateien ruinieren kann, die er anfassen darf. Mit einem Schnappschuss können Sie sagen: Alles zurück, genau so.

Am Ende dieser Lektion

Notiz

Ich kann einen Ordner so zurückstellen, wie er war, bevor ein Agent handelte.

Schlüsselwörter

BegriffWas er bedeutet
Schnappschusseine Kopie jeder Datei samt Text
Unterschieddie Liste dessen, was sich zwischen zwei Zuständen geändert hat
WiederherstellenDateien aus einem Schnappschuss zurückschreiben
Zurücksetzenein Wiederherstellen des ganzen Ordners
Neue Dateieine Datei, die nicht im Schnappschuss war

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Schnappschuss enthält jede Datei

Bevor der Agent beginnt, lesen Sie jede Datei im Ordner und merken sich Pfad und Text. Bewahren Sie das dort auf, wo der Agent nicht hinkommt.

Verglichen wird nach Pfad. Nachdem der Agent gehandelt hat, ist eine Datei neu, wenn sie dazugekommen ist, entfernt, wenn sie fehlt, und geändert, wenn ihr Text anders ist.

Durchgerechnetes Beispiel: drei Änderungen

Änderung des AgentenIm UnterschiedZum Zurückstellen
quellen/app.js mit neuem Text geschriebenGeändertDen alten Text schreiben
notizen.txt gelöschtEntferntDie Datei erneut schreiben
neu.txt angelegtNeuDie Datei löschen
Eine Datei auf ihren alten Text zurückgeschriebenNichtsNichts zu tun

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein häufiger Fehler

Warnung

Viele denken, ein Zurücksetzen müsse nur die geänderten Dateien neu schreiben. Es muss auch die Dateien löschen, die der Agent angelegt hat, sonst ist der Ordner nicht wie vorher. Prüfen Sie dann: Nach dem Zurücksetzen muss der Unterschied leer sein.

Beweisen, dass das Zurücksetzen klappte

Ein Zurücksetzen, das Sie nicht prüfen, ist eine Hoffnung. Machen Sie danach einen neuen Schnappschuss und vergleichen Sie ihn mit dem ersten. Ist der Unterschied leer, ist der Ordner genau wie vorher.

Das vergleicht nur Dateien. Ein leerer Ordner, den der Agent anlegte, steht in keiner Dateiliste. Sagen Sie also, was Ihr Schnappschuss nicht abdeckt.

Die Modellhilfe schreiben, Teil 1

Befehl
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.

Die Modellhilfe schreiben, Teil 2

Befehl
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.

Das Rücksetz-Skript schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const fs = require(\"fs\");' 'const path = require(\"path\");' 'const wurzel = path.join(process.cwd(), \"sicherung-lab\");' 'function ablegen(rel, text) {' '  const f = path.join(wurzel, rel);' '  fs.mkdirSync(path.dirname(f), { recursive: true });' '  fs.writeFileSync(f, text);' '}' 'function namen(ordner) {' '  let aus = [];' '  for (const n of fs.readdirSync(ordner).sort()) {' '    const f = path.join(ordner, n);' '    aus = fs.statSync(f).isDirectory() ? aus.concat(namen(f)) : aus.concat([f]);' '  }' '  return aus;' '}' > sicherung.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.

Das Rücksetz-Skript schreiben, Teil 2

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function aufnehmen() {' '  const s = {};' '  namen(wurzel).forEach(function (f) { s[path.relative(wurzel, f)] = fs.readFileSync(f, \"utf8\"); });' '  return s;' '}' 'function unterschied(a, b) {' '  const d = { neu: [], geaendert: [], entfernt: [] };' '  Object.keys(b).forEach(function (k) { if (a[k] === undefined) d.neu.push(k); else if (a[k] < b[k] || a[k] > b[k]) d.geaendert.push(k); });' '  Object.keys(a).forEach(function (k) { if (b[k] === undefined) d.entfernt.push(k); });' '  return d;' '}' >> sicherung.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.

Das Rücksetz-Skript schreiben, Teil 3

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function zuruecksetzen(abzug) {' '  const jetzt = aufnehmen();' '  Object.keys(jetzt).forEach(function (k) { if (abzug[k] === undefined) fs.rmSync(path.join(wurzel, k)); });' '  Object.keys(abzug).forEach(function (k) { ablegen(k, abzug[k]); });' '}' >> sicherung.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.

Das Rücksetz-Skript schreiben, Teil 4

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'fs.rmSync(wurzel, { recursive: true, force: true });' 'ablegen(\"quellen/app.js\", \"let x = 1;\");' 'ablegen(\"quellen/hilfen.js\", \"export {};\");' 'ablegen(\"notizen.txt\", \"offen\");' >> sicherung.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.

Das Rücksetz-Skript schreiben, Teil 5

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  const abzug = aufnehmen();' '  console.log(\"Schnappschuss: \" + Object.keys(abzug).join(\" \"));' '  ablegen(\"quellen/app.js\", \"let x = 2;\");' '  fs.rmSync(path.join(wurzel, \"notizen.txt\"));' '  ablegen(\"neu.txt\", \"hallo\");' '  console.log(\"Änderungen: \" + JSON.stringify(unterschied(abzug, aufnehmen())));' '  zuruecksetzen(abzug);' '  console.log(\"Nach dem Zurücksetzen gleich: \" + (JSON.stringify(aufnehmen()) === JSON.stringify(abzug)));' '  const q = \"Schreiben Sie in einem kurzen Satz, warum man einen Schnappschuss macht, bevor ein Agent Dateien ändert.\";' '  const probe = \"Gehen die Änderungen schief, kann man jede Datei genau so zurückstellen, wie sie war.\";' '  const antwort = await fragen([{ role: \"user\", content: q }], probe, 60);' '  console.log(\"Das Modell sagte: \" + antwort.text);' '}' 'main();' >> sicherung.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.

Das Zurücksetzen ausführen

Befehl
docker exec -w /home/node/project agent node sicherung.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.

Was der Run ausgibt

ZeileWas sie zeigt
Schnappschuss: notizen.txt quellen/app.js quellen/hilfen.jsDrei echte Dateien in sicherung-lab
Änderungen: {"neu":["neu.txt"],"geaendert":["quellen/app.js"],"entfernt":["notizen.txt"]}Was der Ersatz-Agent tat
Nach dem Zurücksetzen gleich: trueDer Ordner gleicht wieder dem Schnappschuss
Das Modell sagte: ...Ein Satz. Die Worte ändern sich bei jedem Lauf oder zeigen Aufgezeichnete Probe

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Über dieses Lab und seinen Quellcode: Lab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.