Zum Hauptinhalt springen
Wenn ein Agent einen Menschen, einen externen Job oder ein Tool braucht, das deine Anwendung ausführt, kehrt der Lauf normal zurück (nicht als Fehler), mit dem Status waiting_for_human und allem, was zum Fortsetzen nötig ist. Speichere das gesamte Ergebnis, hole die Entscheidung in deiner Anwendung ein und übergib dann das gespeicherte Ergebnis und die Entscheidung an die Fortsetzungsmethode des Agenten.
Phaseo speichert keine Läufe des Agent SDK. Speichere fortsetzbaren Status in deiner eigenen Anwendung, wenn er eine Anfrage oder einen Prozessneustart überdauern muss.

Tool-Aufrufe freigeben oder ablehnen

Freigabepflichtige, manuelle und Human-in-the-Loop-Tools pausieren den Lauf, bevor sie ausgeführt werden. Jeder ausstehende Aufruf hat den call des Modells (mit seiner id) und eine kind: approval, manual oder hitl. Beantworte jeden Aufruf über seine exakte Call-ID, nicht über den Tool-Namen, damit zwei Aufrufe desselben Tools getrennt bleiben. Ein freigegebener Aufruf führt sein Tool aus. Ein abgelehnter Aufruf sendet {"error": "<reason>"} als Tool-Ergebnis an das Modell, mit dem Standardgrund Tool call rejected.
Wo die ausstehenden Aufrufe liegen und was passiert, wenn eine Entscheidung fehlt: Auch die Pause selbst hat eine kind. Go und C# setzen sie bei jeder Tool-Pause auf tool_approval. PHP, Ruby und Java setzen tool_approval, wenn irgendein ausstehender Aufruf eine Freigabe braucht, andernfalls die kind des ersten Aufrufs. Rust verwendet tool_approval für Freigabeaufrufe, external_output, wenn jeder ausstehende Aufruf ein externes Ergebnis braucht, und tool_input für eine Mischung aus beidem.
Rust 0.2 hat keinen Ablehnungstyp und kein Feld rejections. Lass einen nicht freigegebenen Aufruf pausiert oder wende vor dem Fortsetzen die Ablehnungsrichtlinie deiner Anwendung an.
Um für jeden Tool-Aufruf statt pro Tool eine Freigabe zu verlangen, setze requireApproval in der Agentendefinition (require_approval in Python und Ruby, RequireApproval in Go und C#). In TypeScript ist es eine Funktion requireApproval(call, context). Rust unterstützt Freigaben nur pro Tool, mit Tool::require_approval(). Unter Tools siehst du, wie jede Art von Tool definiert wird.

Ergebnisse für manuelle und Human-in-the-Loop-Tools liefern

Für manual- und hitl-Aufrufe übergibst du das Ergebnis, das deine Anwendung erzeugt hat, mit der Call-ID als Schlüssel. In Rust sind das Tools, die mit Tool::external(...) gebaut wurden.
Eine fehlende Ausgabe lässt die Fortsetzung mit Missing output for tool call <id> fehlschlagen (kleingeschriebenes missing in Go, ein ValueError in Python, ein AgentError in Rust). Eine menschliche Eingabenachricht ersetzt keine Tool-Ausgabe.

Für eine menschliche Prüfung pausieren

Setze in der Agentendefinition einen Callback für die menschliche Prüfung, um jede Modellantwort zu prüfen, bevor der Lauf weitergeht. Gib eine Prüfanfrage mit einem reason (und optional einem payload) zurück, um zu pausieren, oder nichts, um fortzufahren. Die kind der Pause ist human_review. Der Callback erhält die Lauf-ID, den Schrittindex, die Nachrichten, die Modellantwort und die geparste Ausgabe (Rust: Lauf- und Agenten-ID, Schrittindex, Nachrichten, Antwort und Anwendungskontext).
Setze mit einer menschlichen Eingabe fort, die der Unterhaltung als Benutzernachricht hinzugefügt wird:
Das Fortsetzen einer Prüfpause ohne menschliche Eingabe schlägt mit Run <id> is waiting for human input fehl (Go: run <id> is waiting for human input; Java: Run is waiting for human input). Rust verlangt ein nicht leeres human_input. TypeScript akzeptiert außerdem strukturierte humanMessages.

Ausführungsstatus zwischen Anfragen speichern

Das Laufergebnis besteht aus einfachen Daten: Speichere es in deiner Datenbank, deinem Objektspeicher oder deinem Job-Eintrag und halte den Anwendungs-context serialisierbar. Ein Lauf kann nur von einem Agenten mit derselben ID fortgesetzt werden. Das Rezept für eine dauerhafte Agentenschleife zeigt einen vollständigen Ablauf zum Speichern und Fortsetzen. Wenn das SDK Läufe für dich speichern und laden soll, übergib einen Status-Accessor mit load(runId) und save(result). Das SDK speichert dann nach jedem Lauf und jeder Fortsetzung, und du kannst über die Lauf-ID fortsetzen, statt den Eintrag durch jede Schicht zu reichen.
Erstelle in Rust vor dem Fortsetzen dieselbe Agentendefinition und dieselben Tools neu: Closures und AgentDefinition sind nicht Teil des serialisierten Laufs. Das effektive Modell und das Schrittlimit werden in RunRecord gespeichert, sodass Überschreibungen pro Lauf nach dem Fortsetzen aktiv bleiben. Was auch immer du speicherst: Für Verschlüsselung und Aufbewahrung gespeicherter Läufe, die Autorisierung von Freigaben und menschlichen Eingaben sowie die Idempotenz von Nebeneffekten, die nach einem Fortsetzen erneut laufen, ist deine Anwendung zuständig.
Zuletzt geändert am 5. November 2026