Premier agent IA - Python (implémentation complète)

Exemple d'agent runnable complet avec la boucle "Act -> Check -> Retry" et une limite d'étapes.
Sur cette page
  1. Ce que cet exemple démontre
  2. Structure du projet
  3. Comment lancer
  4. Code
  5. main.py - boucle d'agent
  6. llm.py - appel du modèle
  7. evaluator.py - vérification du résultat
  8. requirements.txt
  9. Exemple de sortie
  10. Pourquoi c'est un "agent" et pas juste une fonction
  11. Où creuser ensuite
  12. 💻 Code complet sur GitHub

C'est l'implémentation complète de l'exemple de l'article Construisons ton premier agent IA.

Si tu ne l'as pas encore lu, commence par là. Ici, on se concentre sur le code.


Ce que cet exemple démontre

  • Objectif de l'agent : obtenir du modèle un nombre supérieur à 10
  • Boucle : Act -> Check -> Retry (au maximum MAX_STEPS fois)
  • Validation : le modèle peut retourner du texte, une chaîne vide ou une valeur non numérique - l'agent gère ces cas
  • Stop condition : l'agent s'arrête soit en cas de succès, soit quand les étapes sont épuisées

Structure du projet

TEXT
examples/
└── start-here/
    └── write-your-first-agent/
        └── python/
            ├── main.py           # boucle d'agent
            ├── llm.py            # appel LLM (isolation de l'intégration)
            ├── evaluator.py      # vérification du résultat
            └── requirements.txt

Pourquoi trois fichiers et pas un seul ? Parce que dans un agent réel, génération et évaluation sont presque toujours séparées. Si tu veux changer le modèle ou la logique de vérification, tu changes un fichier sans toucher au reste.


Comment lancer

1. Clone le dépôt et va dans le dossier :

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

2. Installe les dépendances :

BASH
pip install -r requirements.txt

3. Définis la clé API :

BASH
export OPENAI_API_KEY="sk-..."

4. Lance :

BASH
python main.py

Code

main.py - boucle d'agent

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 ne sait rien d'OpenAI. Il ne sait pas parser des nombres. Il pilote uniquement la boucle - c'est le rôle de l'agent.


llm.py - appel du modèle

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()

Le modèle reçoit une tâche et renvoie du texte. Il ne sait pas qu'il existe un agent, un objectif ou une limite d'étapes. Il génère simplement.


evaluator.py - vérification du résultat

PYTHON
def parse_int(text: str) -> int | None:
    """Retourne int ou None si le texte n'est pas un entier."""
    try:
        return int(text.strip())
    except (ValueError, AttributeError):
        return None

def is_goal_reached(number: int, goal: int) -> bool:
    """Retourne True si le nombre satisfait la condition."""
    return number > goal

Deux petites questions avec des réponses claires : "est-ce un nombre ?" et "objectif atteint ?". C'est tout.


requirements.txt

TEXT
openai>=1.0.0

Exemple de sortie

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

Pourquoi c'est un "agent" et pas juste une fonction

FonctionAgent
Nombre de tentatives1jusqu'à MAX_STEPS
Vérifie le résultat
Décide de continuer ou de s'arrêter
Nécessite une intervention humaine entre les étapes

Un appel modèle n'est pas un agent.
Une boucle avec vérification et décision "réessayer ou s'arrêter" est un agent.


Où creuser ensuite

Essaie de modifier l'exemple toi-même :

  • Change GOAL = 10 en GOAL = 19 - à quelle fréquence l'agent atteindra-t-il l'objectif dans MAX_STEPS ?
  • Supprime MAX_STEPS et mets while True - que va-t-il se passer ?
  • Change le prompt pour que le modèle génère des nombres de 1 à 100 - quel impact sur le comportement de l'agent ?
  • Ajoute un compteur du nombre total d'appels API et affiche-le à la fin

💻 Code complet sur GitHub

-> Voir sur GitHub

⏱️ 4 min de lectureMis à jour Mars, 2026Difficulté: ★☆☆
Intégré : contrôle en productionOnceOnly
Ajoutez des garde-fous aux agents tool-calling
Livrez ce pattern avec de la gouvernance :
  • Budgets (steps / plafonds de coût)
  • Permissions outils (allowlist / blocklist)
  • Kill switch & arrêt incident
  • Idempotence & déduplication
  • Audit logs & traçabilité
Mention intégrée : OnceOnly est une couche de contrôle pour des systèmes d’agents en prod.
Auteur

Cette documentation est organisée et maintenue par des ingénieurs qui déploient des agents IA en production.

Le contenu est assisté par l’IA, avec une responsabilité éditoriale humaine quant à l’exactitude, la clarté et la pertinence en production.

Les patterns et recommandations s’appuient sur des post-mortems, des modes de défaillance et des incidents opérationnels dans des systèmes déployés, notamment lors du développement et de l’exploitation d’une infrastructure de gouvernance pour les agents chez OnceOnly.