Du LlmAgent au workflow
Deux façons de confier une tâche à l'IA
Un LlmAgent (alias Agent) est un agent piloté par un modèle de langage : il reçoit une instruction, des outils, et décide lui-même quoi faire à chaque tour. Parfait pour une conversation ouverte. Mais une due diligence fournisseur suit toujours les mêmes étapes : collecter, scorer, analyser, rédiger, relire. Laisser le modèle choisir l'ordre, c'est accepter qu'il en saute une.
Un agent de workflow n'appelle aucun modèle : c'est du code d'orchestration qui exécute des sous-agents selon un schéma fixe.
| Brique | Rôle | Appelle un LLM ? |
|---|---|---|
LlmAgent | raisonne, appelle des outils, écrit | oui |
SequentialAgent | exécute ses sous-agents l'un après l'autre | non |
ParallelAgent | exécute ses sous-agents en même temps | non |
LoopAgent | répète ses sous-agents jusqu'à un signal d'arrêt ou max_iterations | non |
BaseAgent (sous-classe) | votre propre logique en Python | seulement si vous le décidez |
flowchart TB
subgraph A["Agent autonome"]
M["LLM"] -->|"choisit"| T1["outil 1"]
M -->|"choisit"| T2["outil 2"]
M -->|"choisit"| T3["outil 3"]
end
subgraph W["Workflow"]
E1["étape 1"] --> E2["étape 2"] --> E3["étape 3"]
end
Combien d'appels au modèle fait un SequentialAgent pour décider de l'ordre de ses sous-agents ?
Les agents de workflow sont déterministes : SequentialAgent parcourt sub_agents dans l'ordre. Seuls les LlmAgent qu'il contient appellent un modèle.
Le pipeline du lab en une vue
return SequentialAgent(
name="due_diligence",
description="Due diligence fournisseur : recherche, score, analyse, rapport relu.",
sub_agents=[recherche, ScoreurRisque(name="scoreur"), analyste, boucle],
)recherche est un ParallelAgent de trois LlmAgent, ScoreurRisque un BaseAgent sans IA, analyste un LlmAgent, boucle un LoopAgent (rédacteur + relecteur). Le code complet : agent.py.
Structure d'un projet ADK
ADK attend un dossier par application contenant __init__.py (qui fait from . import agent) et agent.py qui définit root_agent :
mon_projet/
└── due_diligence/ ← nom de l'application
├── __init__.py
├── agent.py ← root_agent = construire_pipeline()
├── fournisseurs.json
└── .env ← copié depuis .env.examplecd mon_projet
pip install -r due_diligence/requirements.txt
cp due_diligence/.env.example due_diligence/.env # puis renseignez la clé
adk run due_diligence "Due diligence du fournisseur : Composants Arvenne"
adk web --port 8000 # interface de développement sur http://127.0.0.1:8000adk run <dossier> [requête] exécute une requête unique (ou ouvre un mode interactif sans requête). adk web [dossier_des_agents] lance une interface web qui liste les applications, montre chaque événement, l'état de session et les traces.
Exercice : dessiner avant de coder
Un service RH veut automatiser la présélection de candidatures : extraire les informations du CV, vérifier en parallèle diplômes et expériences, calculer un score selon une grille fixe, puis rédiger un avis relu par un second agent. Indiquez la brique ADK pour chaque étape.
Voir la solution
SequentialAgenten racine.- Extraction du CV :
LlmAgent(langage non structuré → champs). - Vérifications diplômes / expériences :
ParallelAgentde deuxLlmAgent(indépendantes l'une de l'autre). - Score selon une grille fixe :
BaseAgentpersonnalisé, sans LLM (règles auditables). - Avis + relecture :
LoopAgentavecmax_iterations, le relecteur arrêtant la boucle par un outil.
Point de vigilance : une grille RH doit être auditable et non discriminante ; c'est une raison de plus pour la coder en Python plutôt que de la confier au modèle.
Quel fichier ADK cherche-t-il dans le dossier passé à adk run ?
Le dossier est un paquet Python : __init__.py importe agent, et agent.py expose root_agent. Le nom du dossier devient le nom de l'application.
Résultat obtenu
Serveur adk web --port 8791 lancé le 2026-10-15 sur le dossier du lab, interrogé avec curl :
$ curl -s localhost:8791/list-apps
["due_diligence"]
$ curl -s -o /dev/null -w "dev-ui %{http_code}\n" -L localhost:8791/dev-ui/
dev-ui 200
$ curl -s -X POST localhost:8791/apps/due_diligence/users/u/sessions -d '{}' -H 'content-type: application/json'
{"id":"b528905d-…","appName":"due_diligence","userId":"u","state":{},"events":[],…}Je sais faire
- Expliquer quand préférer un workflow à un agent autonome
- Citer les quatre briques d'ADK et dire lesquelles appellent un LLM
- Organiser un dossier d'application ADK avec
root_agent - Lancer un agent avec
adk runet l'inspecter avecadk web