Das ist die vollständige Implementierung des Beispiels aus Baue deinen ersten KI-Agenten.
Wenn du sie noch nicht gelesen hast, starte dort. Hier fokussieren wir uns auf den Code.
Was dieses Beispiel zeigt
- Agent-Ziel: vom Modell eine Zahl größer als 10 bekommen
- Loop: Act -> Check -> Retry (maximal
MAX_STEPSMal) - Validierung: das Modell kann Text, einen leeren String oder einen nicht-numerischen Wert zurückgeben - der Agent verarbeitet das
- Stop condition: der Agent stoppt entweder bei Erfolg oder wenn die Schritte aufgebraucht sind
Projektstruktur
examples/
└── start-here/
└── write-your-first-agent/
└── python/
├── main.py # Agent-Loop
├── llm.py # LLM-Aufruf (Integrations-Isolation)
├── evaluator.py # Ergebnisprüfung
└── requirements.txt
Warum drei Dateien statt einer? Weil in einem echten Agenten Generierung und Bewertung fast immer getrennt sind. Wenn du Modell oder Prüf-Logik ändern willst, änderst du eine Datei, ohne den Rest anzufassen.
So startest du
1. Repository klonen und in den Ordner wechseln:
git clone https://github.com/AgentPatterns-tech/agentpatterns.git
cd examples/start-here/write-your-first-agent/python
2. Abhängigkeiten installieren:
pip install -r requirements.txt
3. API-Key setzen:
export OPENAI_API_KEY="sk-..."
4. Starten:
python main.py
Code
main.py - Agent-Loop
from llm import generate_number
from evaluator import parse_int, is_goal_reached
GOAL = 10
MAX_STEPS = 5
def run():
for step in range(1, MAX_STEPS + 1):
print(f"\n🤖 Step {step}: Agent is trying...")
output = generate_number()
print(f"💬 Model generated: {output}")
number = parse_int(output)
if number is None:
print("❌ Not a number. Trying again...")
continue
if is_goal_reached(number, GOAL):
print(f"✅ Goal reached! {number} > {GOAL}")
return
print(f"❌ Not enough. {number} ≤ {GOAL}. Trying again...")
print("\n⚠️ Max steps reached without success")
if __name__ == "__main__":
run()
main.py weiß nichts über OpenAI. Es weiß nicht, wie Zahlen geparst werden. Es steuert nur den Loop - genau das ist die Rolle des Agenten.
llm.py - Modellaufruf
import os
from openai import OpenAI
api_key = os.environ.get("OPENAI_API_KEY")
client = OpenAI(api_key=api_key)
PROMPT = "Write ONLY a random number between 1 and 20. No text, no explanation."
def generate_number() -> str:
resp = client.responses.create(
model="gpt-4.1-mini",
input=PROMPT,
)
return resp.output_text.strip()
Das Modell bekommt eine Aufgabe und gibt Text zurück. Es weiß nicht, dass es einen Agenten, ein Ziel oder ein Schrittlimit gibt. Es generiert einfach.
evaluator.py - Ergebnisprüfung
def parse_int(text: str) -> int | None:
"""Gibt int oder None zurück, wenn Text keine ganze Zahl ist."""
try:
return int(text.strip())
except (ValueError, AttributeError):
return None
def is_goal_reached(number: int, goal: int) -> bool:
"""Gibt True zurück, wenn die Zahl die Bedingung erfüllt."""
return number > goal
Zwei kleine Fragen mit klaren Antworten: "ist es eine Zahl?" und "ist das Ziel erreicht?". Mehr ist es nicht.
requirements.txt
openai>=1.0.0
Beispielausgabe
🤖 Step 1: Agent is trying...
💬 Model generated: 7
❌ Not enough. 7 ≤ 10. Trying again...
🤖 Step 2: Agent is trying...
💬 Model generated: 3
❌ Not enough. 3 ≤ 10. Trying again...
🤖 Step 3: Agent is trying...
💬 Model generated: 14
✅ Goal reached! 14 > 10
Warum das ein "Agent" ist und nicht nur eine Funktion
| Funktion | Agent | |
|---|---|---|
| Anzahl der Versuche | 1 | bis zu MAX_STEPS |
| Prüft das Ergebnis | ❌ | ✅ |
| Entscheidet, ob weitergemacht oder gestoppt wird | ❌ | ✅ |
| Benötigt menschliche Beteiligung zwischen Schritten | — | ❌ |
Ein Modellaufruf ist kein Agent.
Ein Loop mit Prüfung und der Entscheidung "nochmal probieren oder stoppen" ist ein Agent.
Wo du als Nächstes tiefer gehen kannst
Versuche, das Beispiel selbst zu modifizieren:
- Ändere
GOAL = 10aufGOAL = 19- wie oft erreicht der Agent das Ziel innerhalb vonMAX_STEPS? - Entferne
MAX_STEPSund setzewhile True- was passiert? - Ändere den Prompt so, dass das Modell Zahlen von 1 bis 100 erzeugt - wie beeinflusst das das Agent-Verhalten?
- Füge einen Zähler für gesamte API-Aufrufe hinzu und gib ihn am Ende aus