How to Build an AI Agent
How to Build an AI Agent
s01

Die Agent-Schleife

Tools & Ausführung

Bash is All You Need

84 LOC1 ToolsSingle-tool agent loop
The minimal agent kernel is a while loop + one tool

[ s01 ] s02 > s03 > s04 > s05 > s06 | s07 > s08 > s09 > s10 > s11 > s12

"Eine Schleife und Bash ist alles, was Sie brauchen" -- ein Tool + eine Schleife = ein Agent.

Problem

Ein Sprachmodell kann über Code nachdenken, aber es kann die echte Welt nicht berühren -- es kann keine Dateien lesen, Tests ausführen oder Fehler überprüfen. Ohne eine Schleife erfordert jeder Tool-Aufruf, dass Sie Ergebnisse manuell kopieren und einfügen. Sie werden zur Schleife.

Lösung

+--------+      +-------+      +---------+
|  User  | ---> |  LLM  | ---> |  Tool   |
| prompt |      |       |      | execute |
+--------+      +---+---+      +----+----+
                    ^                |
                    |   tool_result  |
                    +----------------+
                    (loop until stop_reason != "tool_use")

Eine Exit-Bedingung kontrolliert den gesamten Fluss. Die Schleife läuft, bis das Modell aufhört, Tools aufzurufen.

Wie es funktioniert

  1. Der Benutzer-Prompt wird zur ersten Nachricht.
messages.append({"role": "user", "content": query})
  1. Senden Sie Nachrichten + Tool-Definitionen an das LLM.
response = client.messages.create(
    model=MODEL, system=SYSTEM, messages=messages,
    tools=TOOLS, max_tokens=8000,
)
  1. Fügen Sie die Assistant-Antwort hinzu. Überprüfen Sie stop_reason -- wenn das Modell kein Tool aufgerufen hat, sind wir fertig.
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
    return
  1. Führen Sie jeden Tool-Aufruf aus, sammeln Sie Ergebnisse, fügen Sie als Benutzer-Nachricht hinzu. Zurück zu Schritt 2.
results = []
for block in response.content:
    if block.type == "tool_use":
        output = run_bash(block.input["command"])
        results.append({
            "type": "tool_result",
            "tool_use_id": block.id,
            "content": output,
        })
messages.append({"role": "user", "content": results})

Zusammengefasst in einer Funktion:

def agent_loop(query):
    messages = [{"role": "user", "content": query}]
    while True:
        response = client.messages.create(
            model=MODEL, system=SYSTEM, messages=messages,
            tools=TOOLS, max_tokens=8000,
        )
        messages.append({"role": "assistant", "content": response.content})

        if response.stop_reason != "tool_use":
            return

        results = []
        for block in response.content:
            if block.type == "tool_use":
                output = run_bash(block.input["command"])
                results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": output,
                })
        messages.append({"role": "user", "content": results})

Das ist der gesamte Agent in weniger als 30 Zeilen. Alles andere in diesem Kurs baut darauf auf -- ohne die Schleife zu ändern.

Was sich geändert hat

KomponenteVorherNachher
Agent-Schleife(keine)while True + stop_reason
Tools(keine)bash (ein Tool)
Nachrichten(keine)Akkumulierende Liste
Kontrollfluss(keine)stop_reason != "tool_use"

Ausprobieren

python agents/s01_agent_loop.py
  1. Erstellen Sie eine Datei namens hello.py, die "Hello, World!" ausgibt
  2. Listen Sie alle Python-Dateien in diesem Verzeichnis auf
  3. Was ist der aktuelle Git-Zweig?
  4. Erstellen Sie ein Verzeichnis namens test_output und schreiben Sie 3 Dateien hinein