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

Ein kleines Agenten-Harness bauen

Nach dieser Lektion: Ich kann Kontext, Werkzeuge, Modi, Isolation und Rückgängig in einem Harness vereinen, das ich ausführen und zurückspulen kann.

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

Die Teile in einer Schleife vereinen

Ein Agenten-Harness ist das Programm um das Modell: Es baut das Fenster, führt die Werkzeuge aus, wendet den Modus an und zeichnet die Änderungen auf. Das Modell schlägt nur einen Schritt vor. Das Harness entscheidet, was geschieht.

Diese Lektion vereint die fünf früheren in einer Schleife, die Sie ausführen und zurückspulen können.

Am Ende dieser Lektion

Notiz

Ich kann Kontext, Werkzeuge, Modi, Isolation und Rückgängig in einem Harness vereinen, das ich ausführen und zurückspulen kann.

Schlüsselwörter

BegriffWas er bedeutet
Harnessdas Programm, das einen Agenten um ein Modell herum betreibt
Schleifeeinen Schritt anfordern, entscheiden, handeln, aufzeichnen, wiederholen
Skriptmodelleine feste Liste von Schritten, die ein Modell ersetzt
Verlaufdie Aufzeichnung jedes Schritts und seines Ausgangs
Fensterdie letzten Ergebnisse, die als Nächstes an das Modell gehen
Zurückspulenalle Änderungen nach einem gewählten Schritt rückgängig machen

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

Die Schleife, Schritt für Schritt

In jeder Runde fordert das Harness einen Schritt vom Modell an. Es entscheidet nach Modus: erlauben, nachfragen oder verweigern. Muss es nachfragen, antwortet die Person. Ist der Schritt erlaubt, notiert das Harness, was er ersetzen wird, und führt ihn dann aus.

Das Ergebnis geht in ein Fenster, das nur die letzten behält. Dann wiederholt sich die Schleife, bis das Modell sagt, dass es fertig ist.

Was jede frühere Lektion beisteuert

LektionIhr Platz in der Schleife
KontextDas Fenster behält nur die letzten Ergebnisse
WerkzeugeJeder Schritt nennt ein schmales Werkzeug
ModiEine Funktion entscheidet erlauben, nachfragen oder verweigern
IsolationEine Nebenaufgabe gibt ein kurzes Ergebnis ins Fenster
RückgängigVor einer Änderung wird ein Protokolleintrag geschrieben

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

Ein häufiger Fehler

Warnung

Viele lassen einen abgelehnten Schritt verschwinden. Dann erfährt das Modell nie, dass er abgelehnt wurde, und fragt erneut. Halten Sie die Ablehnung als Ergebnis fest, damit das nächste Fenster sie zeigt.

Modell-Hilfe 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.

Modell-Hilfe 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 Harness schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const RISIKO = { datei_lesen: \"lesen\", datei_schreiben: \"schreiben\", datei_loeschen: \"zerstoerend\", ausfuehren: \"ausfuehren\" };' 'const skript = [' '  { werkzeug: \"datei_lesen\", pfad: \"app.py\" },' '  { werkzeug: \"datei_schreiben\", pfad: \"app.py\", text: \"x = 2\" },' '  { werkzeug: \"ausfuehren\", pfad: \"pytest\" },' '  { werkzeug: \"datei_loeschen\", pfad: \"notizen.txt\" },' '  { werkzeug: \"datei_schreiben\", pfad: \".env\", text: \"SCHLUESSEL=1\" },' '  { werkzeug: \"fertig\" },' '];' 'const dateien = { \"app.py\": \"x = 1\", \"notizen.txt\": \"offen\" };' 'const protokoll = [];' > harness6.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 Harness schreiben, Teil 2

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function entscheide(modus, risiko, pfad) {' '  if (modus === \"plan\") return risiko === \"lesen\" ? \"erlauben\" : \"verweigern\";' '  if (pfad.startsWith(\".env\") || risiko === \"zerstoerend\") return \"nachfragen\";' '  if (modus === \"auto\" && (risiko === \"lesen\" || risiko === \"schreiben\")) return \"erlauben\";' '  if (modus === \"fragen\" && risiko === \"lesen\") return \"erlauben\";' '  return \"nachfragen\";' '}' >> harness6.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 Harness schreiben, Teil 3

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function handeln(s, n) {' '  if (s.werkzeug === \"datei_lesen\") return s.pfad in dateien ? dateien[s.pfad] : \"fehlt\";' '  if (s.werkzeug === \"ausfuehren\") return \"ausgeführt \" + s.pfad;' '  protokoll.push({ schritt: n, pfad: s.pfad, vorher: s.pfad in dateien ? dateien[s.pfad] : null });' '  if (s.werkzeug === \"datei_schreiben\") { dateien[s.pfad] = s.text; return \"geschrieben \" + s.pfad; }' '  delete dateien[s.pfad];' '  return \"gelöscht \" + s.pfad;' '}' >> harness6.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 Harness schreiben, Teil 4

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function alleAusfuehren(modus, freigaben) {' '  const verlauf = [];' '  for (let i = 0; i < skript.length; i++) {' '    const s = skript[i];' '    if (s.werkzeug === \"fertig\") break;' '    const v = entscheide(modus, RISIKO[s.werkzeug], s.pfad);' '    let ausgang = v === \"erlauben\" ? \"ok\" : \"gesperrt\";' '    if (v === \"nachfragen\") ausgang = freigaben.shift() === true ? \"freigegeben\" : \"abgelehnt\";' '    const gut = ausgang === \"ok\" || ausgang === \"freigegeben\";' '    verlauf.push({ schritt: i + 1, werkzeug: s.werkzeug, pfad: s.pfad, ausgang: ausgang, ergebnis: gut ? handeln(s, i + 1) : ausgang });' '  }' '  return verlauf;' '}' >> harness6.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 Harness schreiben, Teil 5

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function bisSchritt(schritt) {' '  for (const e of protokoll.slice().reverse()) {' '    if (e.schritt <= schritt) continue;' '    if (e.vorher === null) delete dateien[e.pfad];' '    else dateien[e.pfad] = e.vorher;' '  }' '}' >> harness6.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 Harness schreiben, Teil 6

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  const verlauf = alleAusfuehren(\"auto\", [true, false]);' '  for (const o of verlauf) console.log(o.schritt + \" \" + o.werkzeug + \" \" + o.pfad + \" \" + o.ausgang + \" -> \" + o.ergebnis);' '  console.log(\"Fenster \" + JSON.stringify(verlauf.slice(-3).map(function (o) { return o.ergebnis; })));' '  console.log(\"Dateien \" + JSON.stringify(dateien));' '  bisSchritt(1);' '  console.log(\"nach Zurück bis 1 \" + JSON.stringify(dateien));' '  const text = verlauf.map(function (o) { return o.werkzeug + \" \" + o.ausgang; }).join(\", \");' '  const antwort = await fragen([{ role: \"user\", content: \"Schreiben Sie eine einzeilige Commit-Nachricht für einen Lauf, der Folgendes tat: \" + text }], \"Summe des Warenkorbs in app.py korrigieren\", 30);' '  console.log(\"Nachricht: \" + antwort.text);' '}' 'main();' >> harness6.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 Harness ausführen und zurückspulen

Befehl
docker exec -w /home/node/project agent node harness6.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 Modell ist ein Skript

Die Schritte stammen aus einer festen Liste, sodass alle denselben Lauf ausgeben. Ein echtes Harness würde jeden Schritt beim Modell anfordern. Der kurze Modellaufruf schreibt nur eine Commit-Nachricht aus dem, was der Lauf getan hat.

Ohne Modell gibt er für diese Zeile eine aufgezeichnete Probe aus.

Eine mögliche Ausgabe

ZeileWas sie zeigt
1 datei_lesen app.py ok -> x = 1Ein Lesen geht im Modus auto durch
3 ausfuehren pytest freigegeben -> ausgeführt pytestDie erste Freigabe war Ja
4 datei_loeschen notizen.txt abgelehnt -> abgelehntDie zweite Freigabe war Nein
5 datei_schreiben .env abgelehnt -> abgelehntKeine Freigabe übrig, also Nein
Dateien {"app.py":"x = 2","notizen.txt":"offen"}Nur das Schreiben hat etwas geändert
nach Zurück bis 1 {"app.py":"x = 1",...}Das Zurückspulen stellte das Schreiben zurück

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.