Erster KI-Agent - Python (vollständige Implementierung)

Vollständiges ausführbares Agent-Beispiel mit dem Loop "Act -> Check -> Retry" und Schrittlimit.
Auf dieser Seite
  1. Was dieses Beispiel zeigt
  2. Projektstruktur
  3. So startest du
  4. Code
  5. main.py - Agent-Loop
  6. llm.py - Modellaufruf
  7. evaluator.py - Ergebnisprüfung
  8. requirements.txt
  9. Beispielausgabe
  10. Warum das ein "Agent" ist und nicht nur eine Funktion
  11. Wo du als Nächstes tiefer gehen kannst
  12. 💻 Vollständiger Code auf GitHub

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_STEPS Mal)
  • 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

TEXT
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:

BASH
git clone https://github.com/AgentPatterns-tech/agentpatterns.git
cd examples/start-here/write-your-first-agent/python

2. Abhängigkeiten installieren:

BASH
pip install -r requirements.txt

3. API-Key setzen:

BASH
export OPENAI_API_KEY="sk-..."

4. Starten:

BASH
python main.py

Code

main.py - Agent-Loop

PYTHON
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

PYTHON
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

PYTHON
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

TEXT
openai>=1.0.0

Beispielausgabe

TEXT
🤖 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

FunktionAgent
Anzahl der Versuche1bis 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 = 10 auf GOAL = 19 - wie oft erreicht der Agent das Ziel innerhalb von MAX_STEPS?
  • Entferne MAX_STEPS und setze while 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

💻 Vollständiger Code auf GitHub

-> Auf GitHub ansehen

⏱️ 4 Min. LesezeitAktualisiert Mär, 2026Schwierigkeit: ★☆☆
Integriert: Production ControlOnceOnly
Guardrails für Tool-Calling-Agents
Shippe dieses Pattern mit Governance:
  • Budgets (Steps / Spend Caps)
  • Tool-Permissions (Allowlist / Blocklist)
  • Kill switch & Incident Stop
  • Idempotenz & Dedupe
  • Audit logs & Nachvollziehbarkeit
Integrierter Hinweis: OnceOnly ist eine Control-Layer für Production-Agent-Systeme.
Autor

Diese Dokumentation wird von Engineers kuratiert und gepflegt, die AI-Agenten in der Produktion betreiben.

Die Inhalte sind KI-gestützt, mit menschlicher redaktioneller Verantwortung für Genauigkeit, Klarheit und Produktionsrelevanz.

Patterns und Empfehlungen basieren auf Post-Mortems, Failure-Modes und operativen Incidents in produktiven Systemen, auch bei der Entwicklung und dem Betrieb von Governance-Infrastruktur für Agenten bei OnceOnly.