Tu as déjà utilisé ChatGPT pour répondre à une question. Maintenant imagine une équipe entière d'IA spécialisées — un chercheur, un rédacteur, un relecteur — qui bossent ensemble sur une tâche complexe, sans que tu aies à les micro-manager. C'est exactement ce que permet CrewAI, le framework multi-agents qui explose en 2026 (50 000+ étoiles GitHub). Dans ce tutoriel, tu vas construire ta première crew d'agents IA, compatible avec la version 1.15.9 (juillet 2026).
Le problème que CrewAI résout
Un LLM seul, c'est comme un employé ultra-polyvalent mais sans spécialité. Il fait tout, moyennement bien. Dès que ta tâche devient complexe — par exemple « fais une recherche sur les dernières avancées en IA, rédige un article de 1000 mots, puis relis-le pour corriger les fautes » — un seul appel à ChatGPT ne suffit pas.
Tu pourrais enchaîner plusieurs prompts à la main. Mais c'est fastidieux, et tu perds le contexte entre chaque étape.
CrewAI résout ça avec un concept simple : tu définis des agents spécialisés avec des rôles, des objectifs et des outils, puis tu les fais collaborer sur une tâche commune. Chaque agent a un backstory (son « CV »), des compétences, et peut utiliser des outils comme la recherche web ou l'exécution de code.
Comment fonctionne CrewAI (v1.15.9)
Le framework repose sur quatre briques principales :
- Agent — un « employé IA » avec un rôle, un objectif et une personnalité. Depuis la v1.x, il supporte le reasoning (
reasoning=True), les skills (instructions markdown injectées dans le prompt), et la knowledge (RAG sur documents). - Task — une mission confiée à un agent, avec un résultat attendu. Les tâches supportent le structured output (
output_pydantic,output_json,output_file), les callbacks, et lecontextpour chaîner les sorties. - Crew — l'orchestrateur qui lance les agents dans le bon ordre (
sequentialouhierarchical). Supporte le memory, le planning automatique, le streaming et les checkpoints. - Flow — (nouveau en v1.x) un pipeline événementiel avec décorateurs
@start()et@listen(), état typé via Pydantic, et persistance. Recommandé pour les apps de production.
Ce qui a changé depuis la v0.80
Si tu as un vieux projet CrewAI, voici les breaking changes majeurs :
- Installation : on utilise
uvau lieu depip+venv.uv tool install crewaipour le CLI,crewai create crewpour les projets. - Configuration LLM : format
"provider/model-id"(ex:"openai/gpt-4o","anthropic/claude-sonnet-4-6") via LiteLLM. La classeLLM()remplace les vieilles variables d'environnementOPENAI_API_BASE. - Projets JSON-first : les agents se définissent dans
agents/*.jsonc, les tâches danscrew.jsonc. L'ancien formatcrew.py+config/*.yamlest dispo avec--classic. - `CodeInterpreterTool` retiré :
allow_code_executionetcode_execution_modesont dépréciés. Utilise E2B ou Modal pour du sandbox. - `crewai-tools` n'est plus obligatoire : installe-le séparément avec
crewai[tools]si tu utilises SerperDevTool, FileReadTool, etc. - `allow_delegation` : toujours présent, mais
default=False(étaitTrueavant). - `memory` : désactivé par défaut (
False). À activer explicitement. - `max_iter` : défaut passé à 20 (était plus bas avant).
- Imports :
from crewai.tools import BaseTool, tool(plusfrom crewai_tools import BaseTool). - Flows : nouvelle API avec
@start(),@listen(), état Pydantic. Remplacer l'ancien chaînage manuel.
Installation : prépare ton environnement
CrewAI v1.15.9 utilise uv comme gestionnaire de dépendances. Python 3.10 à 3.13 requis.
# 1. Installer uv (si pas déjà fait)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. Installer le CLI CrewAI global
uv tool install crewai
# 3. Vérifier
crewai --version
# → crewai 1.15.9Pour créer un projet :
# Créer un nouveau projet (format JSON-first)
crewai create crew ma-crew-ia
cd ma-crew-ia
# Installer les dépendances
crewai installTon projet aura cette structure :
ma-crew-ia/
├── .env # API keys
├── agents/ # Un fichier .jsonc par agent
│ └── researcher.jsonc
├── crew.jsonc # Configuration de la crew + tâches
├── knowledge/ # Documents pour RAG
├── skills/ # Instructions markdown
├── tools/ # Outils custom (custom:<name>)
└── pyproject.tomlPour l'ancien format (crew.py + YAML), utilise crewai create crew ma-crew-ia --classic.
Ton premier agent (v1.15.9)
Avant d'orchestrer une équipe, crée un seul agent en Python pur :
# mon_premier_agent.py
from crewai import Agent, Task, Crew
# 1. Définir l'agent (API v1.x)
assistant = Agent(
role="Assistant Personnel",
goal="Aider l'utilisateur avec des réponses claires et utiles",
backstory=(
"Tu es un assistant IA bienveillant, formé à la vulgarisation scientifique. "
"Tu expliques les choses simplement, sans jargon inutile."
),
llm="openai/gpt-4o", # Format provider/model-id
verbose=True,
)
# 2. Définir la tâche
tache = Task(
description=(
"Explique en 3 phrases simples ce qu'est un agent IA "
"à quelqu'un qui n'y connaît rien en informatique."
),
expected_output="Une explication en 3 phrases simples, en français.",
agent=assistant
)
# 3. Créer la crew et lancer
crew = Crew(
agents=[assistant],
tasks=[tache],
verbose=True
)
resultat = crew.kickoff()
print("\n=== RÉSULTAT FINAL ===")
print(resultat.raw) # .raw pour le texte brutLance le script :
# Définir ta clé API OpenAI
export OPENAI_API_KEY="sk-..."
python3 mon_premier_agent.pyBrancher un LLM gratuit : Ollama en local
Avec CrewAI v1.x, tu peux utiliser Ollama via LiteLLM :
# Installer Ollama
curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.2:3bPuis dans ton .env ou ton code :
from crewai import Agent, LLM
# Option 1 : via variable d'environnement
# Dans .env : MODEL=ollama/llama3.2:3b
# Option 2 : via LLM explicite
llm = LLM(
model="ollama/llama3.2:3b",
base_url="http://localhost:11434",
)
agent = Agent(
role="Assistant Local",
goal="Répondre aux questions en français",
backstory="Assistant léger tournant en local via Ollama.",
llm=llm,
verbose=True,
)Pour utiliser Anthropic, Google, ou autre provider natif :
# Anthropic
uv add "crewai[anthropic]"
# Dans .env : ANTHROPIC_API_KEY=sk-ant-...
# Dans le code : llm="anthropic/claude-sonnet-4-6"
# Google Gemini
uv add "crewai[gemini]"
# llm="gemini/gemini-2.0-flash-001"Le vrai projet : une équipe de journalistes IA
Tu vas créer trois agents qui collaborent pour produire un article d'actualité :
Agent | Rôle | Outil |
Chercheur | Trouver les infos récentes | Recherche web (SerperDevTool) |
Rédacteur | Rédiger l'article | — |
Relecteur | Corriger et améliorer | — |
Étape 1 : installer les dépendances
# Dans ton projet CrewAI
uv add "crewai[tools]"Étape 2 : les outils
# equipe_journalistes.py
import os
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, ScrapeWebsiteTool
# Clé API Serper (gratuit, 2500 requêtes/mois sur serper.dev)
os.environ["SERPER_API_KEY"] = "ta-clé-serper-ici"
# Outils
outil_recherche = SerperDevTool()
outil_scraping = ScrapeWebsiteTool()Étape 3 : les agents
# Agent 1 : le Chercheur
chercheur = Agent(
role="Chercheur Web Senior",
goal=(
"Trouver les informations les plus récentes et pertinentes "
"sur le sujet demandé. Tu dois citer tes sources."
),
backstory=(
"Ancien journaliste d'investigation reconverti dans la veille tech. "
"Tu as un don pour dénicher l'info que personne d'autre ne trouve. "
"Tu ne te contentes jamais du premier résultat Google."
),
tools=[outil_recherche, outil_scraping],
llm="openai/gpt-4o",
verbose=True,
)
# Agent 2 : le Rédacteur
redacteur = Agent(
role="Rédacteur Tech",
goal=(
"Rédiger un article clair, engageant et bien structuré "
"à partir des recherches fournies par le Chercheur."
),
backstory=(
"Plume affûtée de la rédaction tech. Tu sais transformer "
"des notes de recherche brutes en contenu captivant. "
"Ton style est direct, sans langue de bois, avec une pointe d'humour. "
"Tu écris toujours en français."
),
llm="openai/gpt-4o",
verbose=True,
)
# Agent 3 : le Relecteur
relecteur = Agent(
role="Relecteur-Correcteur",
goal=(
"Relire l'article rédigé, corriger les fautes d'orthographe, "
"de grammaire et améliorer la fluidité. Vérifier la cohérence."
),
backstory=(
"Correcteur professionnel avec 20 ans d'expérience dans la presse. "
"Aucune coquille ne t'échappe. Tu es intraitable sur la grammaire "
"mais respectueux du style de l'auteur."
),
llm="openai/gpt-4o-mini", # Modèle moins cher pour la relecture
verbose=True,
)Étape 4 : les tâches (le séquencement)
# Tâche 1 : Recherche
tache_recherche = Task(
description=(
"Recherche les 3 actualités les plus importantes en intelligence "
"artificielle de cette semaine. Pour chaque actualité, "
"trouve une source fiable, résume le sujet en 2-3 phrases, et note l'URL."
),
expected_output=(
"Un rapport de recherche structuré avec 3 actualités. "
"Pour chacune : titre, résumé 2-3 phrases, source (URL). "
"Format : markdown."
),
agent=chercheur
)
# Tâche 2 : Rédaction (dépend de la recherche)
tache_redaction = Task(
description=(
"À partir du rapport de recherche fourni, rédige un article "
"de 400-500 mots en français. Structure :"
"\n1. Un titre accrocheur"
"\n2. Une introduction qui donne le contexte"
"\n3. Une section par actualité"
"\n4. Une conclusion qui fait le lien entre les 3 actus"
),
expected_output="Un article complet en markdown, 400-500 mots, en français.",
agent=redacteur,
context=[tache_recherche] # La sortie du chercheur devient l'entrée du rédacteur
)
# Tâche 3 : Relecture (dépend de la rédaction)
tache_relecture = Task(
description=(
"Relis l'article fourni. Corrige TOUTES les fautes d'orthographe "
"et de grammaire. Améliore les tournures maladroites. "
"Vérifie que tous les liens et URLs sont corrects. "
"Retourne l'article corrigé EN ENTIER."
),
expected_output="L'article intégralement relu et corrigé, en markdown.",
agent=relecteur,
context=[tache_redaction], # La sortie du rédacteur devient l'entrée du relecteur
output_file="output/article_final.md", # Sauvegarde automatique
)Étape 5 : le lancement
# Assemblage et décollage
equipe = Crew(
agents=[chercheur, redacteur, relecteur],
tasks=[tache_recherche, tache_redaction, tache_relecture],
process=Process.sequential, # Exécution en séquence
verbose=True
)
print("\n🚀 LANCEMENT DE LA CREW JOURNALISTE\n")
article_final = equipe.kickoff()
# Résultat
print("\n" + "="*60)
print(" ARTICLE FINAL (relu et corrigé)")
print("="*60)
print(article_final.raw)
# Métriques d'usage (tokens consommés)
if hasattr(article_final, 'usage_metrics'):
print(f"\n📊 Tokens utilisés : {article_final.usage_metrics}")Le script complet fait moins de 120 lignes. Lance-le :
python3 equipe_journalistes.pyTu vas voir CrewAI enchaîner les trois agents automatiquement. Le Relecteur ne démarre que quand le Rédacteur a fini, qui ne démarre que quand le Chercheur a fini. Zéro orchestration manuelle.
Ce que tu viens d'accomplir
En 30 minutes, tu as :
- Installé CrewAI v1.15.9 avec
uv - Créé ton premier agent avec l'API actuelle (
llm="openai/gpt-4o") - Branché Ollama pour du LLM local gratuit
- Construit une équipe multi-agents avec chaînage via
context=[tache_précédente] - Produit un article complet avec recherche web, rédaction et relecture
Aller plus loin avec les Flows
Depuis la v1.x, CrewAI recommande les Flows pour les applications de production. Un Flow te donne :
- Un état typé avec Pydantic
- Des étapes chaînées avec
@start()et@listen() - La persistance et la reprise sur erreur
Voici un Flow minimal qui lance ta crew de journalistes :
# flow_journalistes.py
from pydantic import BaseModel
from crewai.flow import Flow, listen, start
from equipe_journalistes import equipe # ta crew définie plus haut
class JournalisteState(BaseModel):
sujet: str = ""
article: str = ""
class FlowJournaliste(Flow[JournalisteState]):
@start()
def definir_sujet(self):
self.state.sujet = "Avancées en IA - Juillet 2026"
@listen(definir_sujet)
def lancer_crew(self):
resultat = equipe.kickoff()
self.state.article = resultat.raw
@listen(lancer_crew)
def resume(self):
print(f"Article généré : {len(self.state.article)} caractères")
print("Fichier sauvegardé : output/article_final.md")
if __name__ == "__main__":
FlowJournaliste().kickoff()python3 flow_journalistes.pyStructured Output : forcer le format de sortie
Pour obtenir un résultat structuré (JSON, Pydantic) plutôt que du texte libre :
from pydantic import BaseModel
from crewai import Task
class Article(BaseModel):
titre: str
chapeau: str
sections: list[str]
conclusion: str
tache_structuree = Task(
description="Écris un article sur l'IA générative",
expected_output="Un article structuré",
agent=redacteur,
output_pydantic=Article, # La classe, PAS une instance
output_file="output/article.json",
)Pièges classiques (v1.15.9)
- `Context length exceeded` : l'historique de conversation dépasse la fenêtre du modèle. Passe
respect_context_window=True(défaut) pour que CrewAI résume automatiquement, ou réduis la taille des descriptions. - API key manquante :
SERPER_API_KEYnon définie → la recherche web échoue silencieusement. Crée un compte gratuit sur serper.dev. - `max_iter` trop bas : si ton agent s'arrête après un seul appel d'outil, force
max_iter=15explicitement. - Ollama trop lent : passe à
llama3.2:1bpour tester, ougpt-4o-miniqui coûte 10x moins cher que GPT-4o. - Résultat en anglais : ajoute « en français » dans le
backstory, legoalET ladescriptionde la tâche. Utiliseoutput_pydanticpour forcer un format. - `allow_code_execution` ne fonctionne plus : cette fonctionnalité est dépréciée. Utilise E2B ou Modal pour du sandbox de code.
- Erreur `crewai_tools` introuvable : installe explicitement avec
uv add "crewai[tools]". Le package n'est plus inclus par défaut. - Process hierarchical sans `manager_llm` : si tu utilises
Process.hierarchical, tu DOIS fournirmanager_llm="openai/gpt-4o"dans le constructeur deCrew.
Résumé
CrewAI v1.15.9 est une refonte majeure par rapport à la v0.80. Les concepts fondamentaux (Agent, Task, Crew) restent, mais l'API a changé : configuration LLM unifiée, projets JSON-first, Flows pour la production, structured output natif. Le pip install crewai de 2024 ne fonctionne plus — utilise uv tool install crewai et crewai create crew.
Tu as maintenant une base solide pour construire tes propres équipes d'agents IA. Pour approfondir : la doc officielle, les cookbooks, et le forum communautaire.

