Lektion 02 · Grundlagen

Die Schleife bleibt gleich — es kommen nur mehr Tools dazu

"Die Schleife ist unverändert, ich habe nur etwas zum TOOLS-Array hinzugefügt." — s02_tool_use.py

⏱ ~10 Min · 📝 3 interaktive Widgets · 🧑‍💻 Basiert auf shareAI-lab · s02_tool_use.py

Was muss man ändern, um ein neues Tool hinzuzufügen?

Der Agent aus S01 kann nur bash. Soll er auch read_file / write_file / edit_file unterstützen — was ändert man?

Viele denken zuerst: den Loop ändern. Falsch. Der Loop bleibt unangetastet. Drei Dinge sind nötig:

  1. Eine Python-Handler-Funktion schreiben (run_read(path, limit)).
  2. Sie in der TOOL_HANDLERS-Map registrieren ("read_file": lambda **kw: run_read(...)).
  3. Im TOOLS-Array eine JSON-Schema-Deklaration hinzufügen (Name, Parameter).

Sieht der Loop einen tool_use-Block, schlägt er per block.name in der Dispatch Map nach, führt aus und gibt das Ergebnis als tool_result zurück. Genau derselbe Weg wie bei bash.

# Dispatch map: name → handler lambda
TOOL_HANDLERS = {
    "bash":       lambda **kw: run_bash(kw["command"]),
    "read_file":  lambda **kw: run_read(kw["path"], kw.get("limit")),
    "write_file": lambda **kw: run_write(kw["path"], kw["content"]),
    "edit_file":  lambda **kw: run_edit(kw["path"], kw["old_text"], kw["new_text"]),
}

Wie Dispatch-Routing funktioniert

Das folgende Widget zeigt einen möglichen tool_use-Aufruf des Modells und wie er zur zugehörigen Python-Funktion geroutet wird. Entscheidend: block.name bestimmt den Weg.

safe_path: eine Sicherheitslinie, die nicht fehlen darf

Wenn der Agent Dateizugriff erhält, ist Pfad-Escape das häufigste Sicherheitsproblem: Das Modell soll in /home/user/project/ arbeiten, sendet aber read_file("../../etc/passwd").

s02 hat dafür eine kleine Schutzfunktion:

def safe_path(p: str) -> Path:
    path = (WORKDIR / p).resolve()  # normalisieren, .. und Symlinks auflösen
    if not path.is_relative_to(WORKDIR):
        raise ValueError(f"Path escapes workspace: {p}")
    return path

Entscheidend sind .resolve() + .is_relative_to(): zuerst auf absoluten Pfad normalisieren, dann prüfen ob er noch in der Sandbox liegt. Fehlt ersteres, kommt foo/../../etc durch; fehlt letzteres, gibt es gar keine Prüfung.

Pfadsicherheit einschätzen

Fünf Pfade, die das Modell als read_file-Parameter senden könnte. Welche lässt safe_path durch, welche blockt es? Annahme: WORKDIR = /home/user/project.

Keine gefährlichen Tools in den Agent packen

Tools hinzufügen ist einfach — aber jedes neue Tool erweitert die Handlungsmöglichkeiten des Modells. s02 hat für bash eine Blacklist (rm -rf /, sudo, shutdown) und für write_file die safe_path-Beschränkung. Vor dem Hinzufügen eines Tools in die Produktion drei Fragen stellen:

  • Kann dieses Tool irreversible Aktionen auslösen? (rm, E-Mail senden, git push)
  • Was könnte es leaken? (env vars, .ssh, Cookies)
  • Kann fehlerhafte Ausgabe als Befehl interpretiert werden? (prompt injection via tool output)

Lektion s07 fügt eine Berechtigungsschicht hinzu, die diese Entscheidungen deklarativ aus dem Code herauszieht.

Interaktiv

Widget 1 · Tool Dispatch · Wie tool_use zum Handler geroutet wird

Klicke auf einen tool_use-Aufruf und beobachte, wie der Loop per block.name die zugehörige Funktion findet, ausführt und das Ergebnis als tool_result zurückgibt.

Vom Modell gesendeter tool_use-Block
TOOL_HANDLERS Dispatch Map

        
Ergebnis · tool_result-Block
(Einen tool_use-Aufruf oben anklicken)
Interaktiv

Widget 2 · Safe Path · Escape-Erkennung bei 5 Pfaden

Jeder Pfad wird durch safe_path() verarbeitet. Annahme: WORKDIR = /home/user/project. Klicke Zulassen oder Ablehnen — teste deine Intuition.

0 / 5 richtig
Interaktiv

Widget 3 · Add a Tool · Was muss sich für ein glob-Tool ändern?

Ein neues Tool glob(pattern) soll dem Agent erlauben, Dateien zu finden. Vervollständige die Lücken — drei Stellen müssen geändert werden.

Stelle 1 · Handler-Funktion schreiben
def run_glob(pattern: str) -> str:
    import glob
    return "\n".join(glob.glob(pattern))
Stelle 2 · In der Dispatch Map registrieren (richtige Zeile wählen)
Stelle 3 · Schema im TOOLS-Array eintragen (richtige Gruppe wählen)