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

Fehler einer Modell-API wiederholen

Nach dieser Lektion: Ich kann einen Fehler zum Wiederholen von einem Fehler zum Beheben unterscheiden.

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

Manche Fehler vergehen, wenn Sie warten

Ein API-Fehler ist eine Antwort, deren Statuscode sagt, dass der Aufruf nicht geklappt hat. Manche Fehler vergehen, wenn Sie einen Moment warten und es erneut versuchen. Andere vergehen nie, wie oft Sie es auch versuchen.

Ein gutes Programm unterscheidet die beiden. Die erste Art wiederholt es mit wachsenden Wartezeiten, bei der zweiten hält es an und meldet sie.

Am Ende dieser Lektion

Notiz

Ich kann einen Fehler zum Wiederholen von einem Fehler zum Beheben unterscheiden.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Statuscodeeine Zahl in einer Antwort, die sagt, wie der Aufruf verlief429
Ratenbegrenzungeine Obergrenze für die Aufrufe, die Sie pro Minute machen dürfen
Rückzugnach jedem gescheiterten Versuch länger warten
Zufall (Jitter)eine zufällige Änderung einer Wartezeit, damit Clients nicht gleichzeitig wiederholen
Zeitgrenzedie längste Zeit, die Sie auf eine Antwort warten

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

Der Statuscode sagt, was zu tun ist

Ein Status in den 200ern bedeutet, der Aufruf hat geklappt. Ein Status in den 400ern bedeutet meist, dass mit Ihrem Aufruf etwas nicht stimmt, derselbe Aufruf scheitert also wieder.

Andere Status zeigen ein kurzes, vorübergehendes Problem an: Zeitüberschreitung, einen ausgelasteten Server oder eine Ratenbegrenzung. Dann ist Warten und erneutes Versuchen die richtige Antwort.

Beispiel: wiederholen oder beheben

StatusWas er bedeutetWas zu tun ist
400Die Anfrage ist falschDie Anfrage beheben
401Kein gültiger SchlüsselDen Schlüssel beheben
403Nicht erlaubt oder kein GuthabenDie Ursache beheben
408, 504Eine ZeitüberschreitungWiederholen
429Zu viele AnfragenWarten, dann wiederholen
500, 502, 503Der Server hat ein ProblemEinige Male wiederholen

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

Statuscodes sortieren und eine aufgezeichnete 429 lesen

Befehl
docker exec -w /home/node/project agent node -e '/* Welche Fehler verdienen einen neuen Versuch? */ const art = (status) => { if (status >= 200 && status < 300) return "ok"; return [408, 429, 500, 502, 503, 504].includes(status) ? "wiederholen" : "beheben"; }; const notizen = { 200: "hat geklappt", 400: "die Anfrage ist falsch", 401: "kein gültiger Schlüssel", 403: "nicht erlaubt", 408: "Zeit überschritten", 429: "zu viele Anfragen", 500: "Serverfehler", 503: "Server nicht bereit" }; for (const status of Object.keys(notizen)) { console.log(status + " " + art(Number(status)).padEnd(11) + " " + notizen[status]); } /* Eine aufgezeichnete 429, als Daten notiert. Kein Aufruf. */ const aufgezeichnet = { status: 429, kopf: { "retry-after": "2" }, inhalt: { error: { message: "Zu viele Anfragen." } } }; console.log("Aufgezeichnete 429: " + aufgezeichnet.inhalt.error.message + " Der Server bittet um " + aufgezeichnet.kopf["retry-after"] + " Sekunden.");'

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Der Rückzug wartet jedes Mal länger

Wenn Sie sofort wiederholen, erhöhen Sie die Last, die den Fehler verursacht hat. Der Rückzug wartet kurz, dann doppelt so lange, dann noch einmal doppelt, bis zu einer Obergrenze.

Fügen Sie Zufall (Jitter) hinzu: Ändern Sie jede Wartezeit um einen zufälligen Betrag, zwischen der Hälfte und dem Ganzen. So wiederholen hundert Clients, die gemeinsam scheiterten, nicht im selben Augenblick. Trägt die Antwort einen Retry-After-Kopf, nutzen Sie ihn.

Einen Rückzugsplan ausgeben

Befehl
docker exec -w /home/node/project agent node -e '/* Nach jedem Fehler länger warten, bis zu einer Obergrenze, und Zufall (Jitter) hinzufügen. */ const basis = 1; const obergrenze = 8; const wartezeiten = []; for (let versuch = 0; versuch < 6; versuch++) wartezeiten.push(Math.min(obergrenze, basis * 2 ** versuch)); console.log("Wartezeiten in Sekunden: " + wartezeiten.join(", ")); const mitZufall = wartezeiten.map((eine) => eine / 2 + Math.random() * eine / 2); console.log("Mit Zufall, ein möglicher Lauf: " + mitZufall.map((eine) => eine.toFixed(2)).join(", ")); console.log("Jede Wartezeit mit Zufall liegt zwischen der Hälfte und der ganzen Wartezeit.");'

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele glauben, jeder Fehler müsse wiederholt werden. Das stimmt nicht. Eine 400 oder 401 scheitert jedes Mal gleich. Eine Schleife, die sie wiederholt, verschwendet nur Zeit und Guthaben. Wiederholen Sie nur Fehler, die vergehen können, und nur einige Male.

Eine Zeitgrenze verhindert endloses Warten

Manche Aufrufe antworten nie. Setzen Sie eine Zeitgrenze, die längste Zeit, die Sie warten, und behandeln Sie das Überschreiten als Fehler, der eine Wiederholung verdient.

Die Hilfe unten fügt die Teile zusammen. Sie hat eine Zeitgrenze, einige Versuche und Rückzug mit Zufall. Bei einem Fehler zum Beheben hält sie sofort an, und sie gibt ein aufgezeichnetes Beispiel aus, wenn nichts klappt.

wiederholung.js schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent node -e 'require("fs").writeFileSync("wiederholung.js", ["// wiederholung.js, Teil 1: welche Statuscodes sich wiederholen lassen und wie lange man wartet.", "const labor = require(\"./labor.js\");", "const art = (status) => {", "  if (status >= 200 && status < 300) return \"ok\";", "  return [408, 429, 500, 502, 503, 504].includes(status) ? \"wiederholen\" : \"beheben\";", "};", "const pause = (ms) => new Promise((fertig) => setTimeout(fertig, ms));", "", "// Rückzug, der Retry-After-Kopf falls vorhanden, eine Obergrenze und Zufall.", "function wartezeitFuer(versuch, antwort) {", "  let zeit = 150 * 2 ** versuch;", "  if (antwort) zeit = Math.max(zeit, Number(antwort.headers.get(\"retry-after\")) * 1000 || 0);", "  zeit = Math.min(zeit, 3000);", "  return zeit / 2 + Math.random() * zeit / 2;", "}"].join("\n") + "\n")'

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 Wiederholungsschleife ergänzen

Befehl
docker exec -w /home/node/project agent node -e 'require("fs").appendFileSync("wiederholung.js", ["", "// Teil 2: wiederholen, außer bei einem Fehler, der behoben werden muss.", "async function mitWiederholung(anfrage, versuche) {", "  for (let nr = 1; nr <= versuche; nr++) {", "    let antwort = null;", "    try {", "      antwort = await labor.senden(anfrage, 15000);", "      if (antwort.ok) return { ok: true, daten: await antwort.json() };", "      console.log(\"Versuch \" + nr + \": HTTP \" + antwort.status);", "      if (art(antwort.status) === \"beheben\") return { ok: false, grund: \"beheben, nicht wiederholen\" };", "    } catch (fehler) {", "      console.log(\"Versuch \" + nr + \": keine Antwort (\" + fehler.name + \")\");", "    }", "    if (nr < versuche) await pause(wartezeitFuer(nr, antwort));", "  }", "  return { ok: false, grund: \"aufgegeben nach \" + versuche + \" Versuchen\" };", "}", "", "module.exports = { mitWiederholung };"].join("\n") + "\n")'

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 mit Wiederholungen aufrufen

Befehl
docker exec -w /home/node/project agent node -e 'const { mitWiederholung } = require("./wiederholung.js"); (async () => { const anfrage = { max_tokens: 20, messages: [{ role: "user", content: "Sagen Sie Hallo mit einem Wort." }] }; const ergebnis = await mitWiederholung(anfrage, 3); if (ergebnis.ok) console.log("Antwort des Modells: " + ergebnis.daten.choices[0].message.content); else console.log("Aufgezeichnetes Beispiel: Hallo. (" + ergebnis.grund + ")"); })();'

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Zum Weiterdenken: die Versuche ändern

Ändern Sie in wiederholung.js die erste Wartezeit von 150 auf 50. Ändern Sie im letzten Run die Zahl der Versuche von 3 auf 5. Führen Sie ihn aus und lesen Sie die Ausgabe.

Sagen Sie, was Sie für einen Knopf wählen würden, vor dem eine Person wartet, und was für eine Arbeit, die über Nacht läuft.

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