382 lines
24 KiB
Markdown
382 lines
24 KiB
Markdown
# Guide des agents autonomes (workflows) de MAIA
|
||
|
||
Un **workflow** fait travailler des agents **sans interface** : un **agent parent** (l'orchestrateur) reçoit une tâche, la découpe, confie des morceaux à des **sous-agents**, puis rend un résultat. On le lance en ligne de commande, à la main, depuis un script, une tâche planifiée ou un service, et on interroge MAIA pour savoir où il en est.
|
||
|
||
```
|
||
maia run …/Main/AGENT.md --task "…"
|
||
│
|
||
▼
|
||
┌───────────────┐ outil Agent ┌──────────────┐
|
||
│ agent parent │ ───────────────▶ │ sous-agent │ (un processus par lancement,
|
||
│ (Main) │ ◀─── résumé ──── │ (reviewer) │ en parallèle si besoin)
|
||
└───────────────┘ └──────────────┘
|
||
│ états, journal, demandes, résultat
|
||
▼
|
||
~/.maia/workflows/<id>/ ◀── maia workflows · workflow · logs · approve · reply · stop · result
|
||
```
|
||
|
||
Sommaire : [1. Préparer les agents](#1-préparer-les-agents) · [2. L'agent parent](#2-lagent-parent) · [3. Les sous-agents](#3-les-sous-agents) · [4. Lancer](#4-lancer-un-workflow) · [5. Autorisations](#5-autorisations-sans-interface) · [6. Superviser](#6-superviser) · [7. Intervenir](#7-intervenir-répondre-arrêter) · [8. Scripts et services](#8-scripts-tâches-planifiées-et-services) · [9. Registre](#9-le-registre) · [10. Limites](#10-limites) · [11. Dépannage](#11-dépannage) · [12. Aide-mémoire](#12-aide-mémoire)
|
||
|
||
---
|
||
|
||
## 1. Préparer les agents
|
||
|
||
Les agents sont des fichiers `AGENT.md`, un dossier par agent :
|
||
|
||
```
|
||
X:/projX/
|
||
├── MAIA.md ← contexte du projet (lu par les agents, sauf omitMd: true)
|
||
└── .maia/
|
||
├── settings.json ← permissions du projet (allow / ask / deny)
|
||
└── agents/
|
||
├── Main/AGENT.md ← agent PARENT (orchestrateur)
|
||
├── reviewer/AGENT.md ← sous-agent du projet
|
||
└── test_runner/AGENT.md ← sous-agent du projet
|
||
|
||
~/.maia/
|
||
├── settings.json ← LiteLLM, DefaultModel, permissions globales
|
||
└── agents/
|
||
└── doc_checker/AGENT.md ← sous-agent GLOBAL (disponible pour tous les projets)
|
||
```
|
||
|
||
- **Créer un agent** : dans MAIA interactif, `/createAgent` (niveau projet ou global) copie un modèle commenté ; il suffit de remplir la description et les sections. Exemples prêts à copier : `examples/agents/release_check` (parent) et `examples/agents/code_reviewer` (sous-agent).
|
||
- **Le nom de l'agent** (`name:`) doit être celui de son dossier.
|
||
- **Un agent parent est un agent comme les autres** : même format, mêmes champs. Ce qui en fait un parent, c'est qu'on le lance avec `maia run`. Le même fichier peut servir de sous-agent dans un autre workflow.
|
||
|
||
## 2. L'agent parent
|
||
|
||
```markdown
|
||
---
|
||
name: Main
|
||
description: Vérifie qu'une branche est prête à être livrée.
|
||
model: sonnet # facultatif (voir § 4, « Modèle »)
|
||
effort: high # étapes maximales : low 10 · medium 25 · high 50
|
||
timeout: 60m # facultatif : durée maximale du workflow (90s, 30m, 2h, 1d)
|
||
permissionMode: wait # facultatif : wait (défaut) | deny | allow (voir § 5)
|
||
permissions: # facultatif : règles ajoutées à celles des settings.json
|
||
allow: [Agent, Read, Grep, "Bash(git diff *)"]
|
||
---
|
||
# Instructions system
|
||
Tu es un orchestrateur de vérification avant livraison. Tu ne relis pas le code toi-même :
|
||
tu délègues à tes sous-agents et tu consolides leurs résultats.
|
||
|
||
# Missions
|
||
1. Lance reviewer et doc_checker en parallèle sur les fichiers modifiés (git diff --name-only main...HEAD).
|
||
2. Si reviewer ne signale aucun problème CRITICAL, lance test_runner.
|
||
3. Consolide les trois rapports.
|
||
|
||
# Constraints (optionnelle)
|
||
- ne modifie aucun fichier, ne fais ni commit ni push
|
||
- si un problème CRITICAL est trouvé : ne conclus pas seul, demande l'intervention de l'équipe sécurité
|
||
|
||
# Output
|
||
- Verdict : GO ou NO-GO
|
||
- Problèmes par gravité, avec fichier et ligne
|
||
- Décision de l'équipe sécurité, s'il y en a eu une
|
||
```
|
||
|
||
**Champs de l'en-tête**
|
||
|
||
| Champ | Rôle pour le parent |
|
||
| --- | --- |
|
||
| `name`, `description` | obligatoires (comme tout agent) |
|
||
| `model` | modèle du parent ; c'est aussi celui que **ses sous-agents héritent** |
|
||
| `effort` | nombre maximal d'étapes (un appel au modèle + ses outils) : 10 / 25 / 50. Au-delà, le parent rédige son résultat avec ce qu'il a. |
|
||
| `timeout` | durée maximale du workflow, sous-agents compris ; dépassée : arrêt, état « en erreur ». Sans ce champ : pas de limite. |
|
||
| `permissionMode` | traitement des demandes d'autorisation sans interface (§ 5) ; `--permission-mode` l'emporte |
|
||
| `permissions` | règles `allow` / `ask` / `deny` **ajoutées** à celles des `settings.json` (un `deny` ou `ask` des settings n'est jamais levé) |
|
||
| `tools` | restreint les outils du parent ; l'outil `Agent` et l'outil `RequestIntervention` restent toujours disponibles |
|
||
| `skills`, `omitMd` | comme pour un sous-agent (skills autorisés ; `omitMd: true` = sans MAIA.md / CLAUDE.md) |
|
||
|
||
**Sections** : `# Instructions system`, `# Missions`, `# Output` sont obligatoires ; `# Constraints` est facultative. Le résultat final du workflow est la dernière réponse du parent, au format de la section **Output**.
|
||
|
||
**Bien écrire un parent**
|
||
|
||
- **Nommez les sous-agents** dans les missions et les contraintes (« lance reviewer… ») : c'est ainsi que le parent sait qui appeler, et les agents cités apparaissent dès le départ en « non exécuté » dans le suivi.
|
||
- **Parallèle ou séquence** : écrivez-le. « Lance A et B en parallèle » → les deux sous-agents tournent en même temps ; « Si A …, lance C » → C attend le résultat de A.
|
||
- **Contraintes qui demandent un humain** : écrivez « demande l'intervention de … ». Le parent utilise alors l'outil `RequestIntervention` et le workflow passe en attente jusqu'à votre réponse (§ 7).
|
||
- **Un sous-agent ne voit rien** de la conversation du parent : le parent doit tout mettre dans la tâche qu'il confie (fichiers, objectif, contraintes). Rappelez-le dans les instructions si les sous-agents manquent de contexte.
|
||
|
||
## 3. Les sous-agents
|
||
|
||
**Quels sous-agents le parent peut lancer**
|
||
|
||
- tous ceux du dossier `.maia/agents` qui contient le parent (pour `X:/projX/.maia/agents/Main/AGENT.md` : tout `X:/projX/.maia/agents/`) ;
|
||
- tous les agents globaux (`~/.maia/agents/`) ;
|
||
- à nom égal, celui du dossier du parent l'emporte ; le parent ne se lance jamais lui-même ;
|
||
- les agents d'un autre projet ne sont **pas** visibles.
|
||
|
||
**Comment ils s'exécutent**
|
||
|
||
- chaque lancement = **un processus séparé**, avec une conversation **vide** : le sous-agent ne connaît que la tâche reçue et son propre `AGENT.md` (plus MAIA.md sauf `omitMd`) ;
|
||
- seul son **résumé final** (section Output) revient au parent ;
|
||
- **modèle** : celui du parent, sauf s'il a son propre champ `model` (nom exact ou morceau : `haiku` → premier modèle LiteLLM dont le nom contient « haiku ») ;
|
||
- **outils** : ceux de l'agent principal (intégrés, personnalisés de `./.maia/tools` et `~/.maia/tools`, `Skill`), limités par `tools:` ; jamais l'outil `Agent` ;
|
||
- **permissions** : celles des `settings.json` + celles de son en-tête (elles s'ajoutent, un `deny` hérité n'est jamais levé). Ses demandes d'autorisation remontent au workflow et sont traitées selon `permissionMode` (§ 5), attribuées au sous-agent dans le suivi ;
|
||
- **étapes** : selon son `effort` (10 / 25 / 50) ; s'il les épuise, on lui demande son résumé ;
|
||
- **durée** : pas de délai propre dans un workflow (c'est le `timeout` du workflow qui borne tout) ;
|
||
- **conversation** : toujours enregistrée dans le registre (`traces/<agent>.json`, `<agent>-2.json` au 2e lancement…), que `trace` soit à `true` ou non ;
|
||
- un sous-agent **ne peut pas poser de question** : devant un cas prévu par ses `Constraints`, il s'arrête sur ce point et le signale dans son résumé ; c'est au parent de demander l'intervention.
|
||
|
||
**Un bon sous-agent** a une `description` claire (le parent choisit d'après elle), une mission étroite, une section Output structurée que le parent pourra consolider, et des `tools` / `permissions` limités au nécessaire (ex. `tools: Read, Grep, Glob` pour un relecteur).
|
||
|
||
## 4. Lancer un workflow
|
||
|
||
```bash
|
||
maia run X:/projX/.maia/agents/Main/AGENT.md --task "Vérifie la branche feature/x"
|
||
maia run ./.maia/agents/Main/AGENT.md "Vérifie la branche feature/x" # la tâche peut suivre le fichier
|
||
maia run ./.maia/agents/Main/AGENT.md --detach --name livraison-nuit # en arrière-plan
|
||
```
|
||
|
||
| Option | Effet |
|
||
| --- | --- |
|
||
| `--task "…"` | la tâche du parent ; sans tâche : « exécute ta mission telle qu'elle est décrite » |
|
||
| `--model <spec>` | modèle du parent (et donc des sous-agents sans `model`) |
|
||
| `--name <nom>` | nom du workflow, utilisable à la place de l'identifiant |
|
||
| `--detach` / `-d` | lance en arrière-plan : affiche l'identifiant et rend la main tout de suite |
|
||
| `--json` | résultat en JSON sur la sortie standard |
|
||
| `--permission-mode wait\|deny\|allow` | remplace `permissionMode` de l'en-tête |
|
||
| `--timeout 30m` | remplace `timeout` de l'en-tête |
|
||
| `--quiet` / `-q` | sans la progression |
|
||
|
||
**Avec pnpm** (depuis le dépôt MAIA, sans rien installer ni compiler : le script `maia` exécute les sources avec tsx) :
|
||
|
||
```bash
|
||
cd /chemin/vers/maia
|
||
pnpm maia run X:/projX/.maia/agents/Main/AGENT.md --task "Vérifie la branche feature/x"
|
||
pnpm maia workflows
|
||
pnpm maia workflow last --watch
|
||
pnpm maia approve last r1
|
||
|
||
# depuis le dossier du projet, sans s'y déplacer dans le dépôt MAIA :
|
||
cd X:/projX
|
||
pnpm --dir /chemin/vers/maia maia run ./.maia/agents/Main/AGENT.md --detach
|
||
pnpm --dir /chemin/vers/maia maia logs last -f
|
||
```
|
||
|
||
- `pnpm dev run …` fonctionne aussi (même script) ; un `--` après le nom du script (`pnpm maia -- run …`) est accepté et ignoré.
|
||
- Les **chemins relatifs** (`./.maia/agents/Main/AGENT.md`) sont résolus depuis le dossier **où vous avez tapé la commande** (pnpm le transmet dans `INIT_CWD`), pas depuis le dépôt MAIA. `MAIA_CWD=/autre/dossier` force un autre dossier.
|
||
- Après `pnpm build`, la commande compilée est `node /chemin/vers/maia/packages/cli/dist/index.js run …`, ou `maia run …` si elle est installée dans le PATH (voir le README, « Lancer MAIA depuis un autre dossier »). Pour une tâche planifiée ou un service, préférez la version compilée : elle démarre plus vite et ne dépend pas de tsx.
|
||
- `--detach` fonctionne aussi avec pnpm : le processus détaché est relancé avec le même interpréteur (tsx compris).
|
||
|
||
- **Dossier de travail** : le projet qui contient `.maia/agents` (`X:/projX`), quel que soit le dossier d'où vous lancez. Si le `AGENT.md` n'est pas dans un dossier `.maia/agents`, c'est le dossier de lancement, et les sous-agents disponibles sont ceux du dossier qui contient le dossier de l'agent, plus les globaux.
|
||
- **Modèle** : `--model`, sinon `model` du parent, sinon `DefaultModel` de `~/.maia/settings.json`, sinon le premier modèle de LiteLLM (avec un avertissement). Conseil : fixez `DefaultModel` pour les workflows planifiés.
|
||
- **Au premier plan**, la progression s'affiche sur la sortie d'erreur et le résultat sur la sortie standard :
|
||
|
||
```
|
||
Workflow wf_20261027_000558_3f50 — suivi : maia workflow wf_20261027_000558_3f50
|
||
[00:05:58] workflow › Workflow wf_… démarré : agent Main, modèle litellm:sonnet, autorisations « wait », dossier X:/projX
|
||
[00:05:58] Main › Sous-agents disponibles : doc_checker, reviewer, test_runner
|
||
[00:05:59] reviewer › en exécution
|
||
[00:06:00] reviewer › terminé
|
||
…
|
||
VERDICT GO — …
|
||
```
|
||
|
||
- **Codes de sortie** : `0` terminé · `1` en erreur (dont délai dépassé) · `2` mauvaise utilisation · `130` arrêté par `maia stop`.
|
||
- **`--json`** : `{ "id", "state", "label", "exitCode", "result", "error" }`. Avec `--detach --json` : `{ "id", "pid" }`.
|
||
|
||
## 5. Autorisations sans interface
|
||
|
||
Les règles des `settings.json` (et de l'en-tête de l'agent) s'appliquent comme en mode interactif : `allow` passe sans demander, `deny` refuse. Ce qui change, c'est une demande **`ask`** (ou un outil sans règle, qui demande par défaut) : personne n'est là pour répondre « o/n ». `permissionMode` décide :
|
||
|
||
| Mode | Une demande `ask` est… |
|
||
| --- | --- |
|
||
| **`wait`** (défaut) | enregistrée ; l'agent passe **en attente** jusqu'à `maia approve <id> <demande>` (ou `--deny`). Le travail déjà fait est conservé. |
|
||
| `deny` | refusée aussitôt ; le modèle en est informé et continue autrement |
|
||
| `allow` | acceptée aussitôt — à réserver à un environnement isolé (conteneur, machine jetable) |
|
||
|
||
**Important : l'outil `Agent` demande une autorisation par défaut.** Sans règle, chaque lancement de sous-agent attend donc un `maia approve`. Pour un workflow qui doit tourner seul, autorisez au moins le lancement des sous-agents :
|
||
|
||
```yaml
|
||
# en-tête de l'agent parent
|
||
permissions:
|
||
allow: [Agent] # tous ses sous-agents
|
||
# ou, plus précis : allow: ["Agent(reviewer)", "Agent(doc_checker)"]
|
||
```
|
||
|
||
ou dans `X:/projX/.maia/settings.json` : `"permissions": { "allow": ["Agent", "Read", "Grep", "Glob"] }`.
|
||
|
||
Recette pour un workflow de nuit : des règles `allow` précises pour ce que le workflow doit faire (lecture, `Bash(git diff *)`, `Bash(npm test)`…), des `deny` pour ce qui ne doit jamais arriver (`Bash(git push *)`, `Bash(rm *)`), et `wait` pour le reste : seules les actions imprévues attendront une réponse. Syntaxe des règles : [`GUIDE_PERMISSIONS.md`](GUIDE_PERMISSIONS.md).
|
||
|
||
## 6. Superviser
|
||
|
||
```bash
|
||
maia workflows # workflows en cours
|
||
maia workflows --all # tous, y compris terminés et en erreur
|
||
maia workflow last # le plus récent
|
||
maia workflow livraison-nuit # par nom (--name)
|
||
maia workflow 3f50 --watch # par morceau d'identifiant, rafraîchi toutes les 2 s jusqu'à la fin
|
||
maia logs 3f50 -f # journal en continu
|
||
maia logs 3f50 reviewer # journal d'un seul agent
|
||
maia result 3f50 # résultat final
|
||
```
|
||
|
||
`<id>` accepte : l'identifiant complet, un morceau unique de celui-ci (`3f50`), le nom donné par `--name` (le plus récent s'il y en a plusieurs), ou `last`.
|
||
|
||
**États**
|
||
|
||
| État | Pour un agent | Pour le workflow |
|
||
| --- | --- | --- |
|
||
| `non exécuté` | cité par le parent mais pas encore lancé | créé, pas encore démarré |
|
||
| `en exécution` | il travaille | au moins un agent travaille |
|
||
| `en attente` | il attend une réponse (autorisation ou intervention) | au moins un agent attend |
|
||
| `terminé` | il a rendu son résultat | le parent a rendu le résultat |
|
||
| `en erreur` | échec, délai, arrêt, ou workflow interrompu pendant qu'il tournait | échec du parent, délai, `maia stop`, ou processus disparu |
|
||
|
||
Un sous-agent en erreur ne fait pas échouer le workflow : le parent en est informé et décide (le workflow peut être « terminé » avec un agent « en erreur »).
|
||
|
||
**Exemple de `maia workflow`**
|
||
|
||
```
|
||
Workflow wf_20261027_000558_3f50 : en attente
|
||
Agent parent : Main (X:/projX/.maia/agents/Main/AGENT.md)
|
||
Modèle : litellm:sonnet · autorisations : wait · durée : 2 min 10 s
|
||
Dossier : X:/projX
|
||
Tâche : Vérifie la branche feature/x
|
||
|
||
Agents :
|
||
Main en attente parent · 2 min 10 s · litellm:sonnet
|
||
doc_checker terminé 41 s · litellm:haiku
|
||
reviewer en exécution 1 min 02 s · litellm:sonnet
|
||
test_runner non exécuté
|
||
|
||
Demandes en attente :
|
||
r3 Main (intervention : équipe sécurité) : Faille CRITICAL dans auth.ts:42, livre-t-on quand même ?
|
||
→ maia reply wf_20261027_000558_3f50 r3 "réponse"
|
||
```
|
||
|
||
Dans MAIA interactif : `/workflows` (en cours), `/workflows all`, `/workflow <id>`.
|
||
|
||
## 7. Intervenir : répondre, arrêter
|
||
|
||
```bash
|
||
maia approve <id> r1 # autoriser une demande d'autorisation
|
||
maia approve <id> r1 --deny # la refuser
|
||
maia reply <id> r3 "Non, on bloque la livraison." # répondre à une demande d'intervention
|
||
maia stop <id> # arrêter le workflow et ses sous-agents
|
||
```
|
||
|
||
- `maia workflow <id>` affiche chaque demande en attente avec la commande exacte pour y répondre.
|
||
- Chaque demande reçoit **une seule** réponse ; une autorisation se règle avec `approve`, une intervention avec `reply`.
|
||
- Le workflow lit les réponses et les demandes d'arrêt toutes les secondes.
|
||
- **Stop** : le tour en cours s'interrompt, les sous-agents en cours reçoivent l'ordre de s'arrêter, le workflow passe « en erreur (arrêté) », code 130. Ce qui a déjà été fait (fichiers, journal, traces) est conservé, mais le workflow ne reprend pas : relancez-en un nouveau.
|
||
|
||
## 8. Scripts, tâches planifiées et services
|
||
|
||
**Script : lancer et attendre**
|
||
|
||
```bash
|
||
#!/usr/bin/env bash
|
||
cd /srv/projX
|
||
maia run .maia/agents/Main/AGENT.md --task "Vérifie la branche $BRANCH" --json --permission-mode deny > resultat.json
|
||
case $? in
|
||
0) echo "OK : $(jq -r .result resultat.json)" ;;
|
||
130) echo "Arrêté" ;;
|
||
*) echo "Échec : $(jq -r .error resultat.json)"; exit 1 ;;
|
||
esac
|
||
```
|
||
|
||
**Script : lancer en arrière-plan puis surveiller**
|
||
|
||
```bash
|
||
id=$(maia run .maia/agents/Main/AGENT.md --detach --json | jq -r .id)
|
||
while :; do
|
||
state=$(maia workflow "$id" --json | jq -r .state) # pending | running | waiting | done | error
|
||
[ "$state" = done ] || [ "$state" = error ] && break
|
||
[ "$state" = waiting ] && maia workflow "$id" | sed -n '/Demandes en attente/,$p' | mail -s "MAIA attend" moi@exemple.fr
|
||
sleep 60
|
||
done
|
||
maia result "$id"
|
||
```
|
||
|
||
Le JSON utilise des codes stables (`pending`, `running`, `waiting`, `done`, `error`) et le libellé français dans `label` : testez les codes, affichez les libellés.
|
||
|
||
**Tâche planifiée** (cron, chaque nuit à 2 h 13) :
|
||
|
||
```cron
|
||
13 2 * * * cd /srv/projX && /usr/local/bin/maia run .maia/agents/Main/AGENT.md --name nuit --quiet >> /var/log/maia-nuit.log 2>&1
|
||
```
|
||
|
||
Sous Windows, le Planificateur de tâches lance la même commande (`maia run X:\projX\.maia\agents\Main\AGENT.md --name nuit --quiet`).
|
||
|
||
**Service** (systemd, en tant qu'utilisateur `maia`) : le service lance `maia run …` au premier plan (pas `--detach` : systemd suit lui-même le processus) ; pensez à `WorkingDirectory=` et aux variables d'environnement utiles (`LITELLM_API_KEY`, variables `${…}` de `mcp.json`).
|
||
|
||
**À savoir pour l'automatisation**
|
||
|
||
- MAIA lit `~/.maia/settings.json`, `~/.maia/agents`, `~/.maia/mcp.json` **de l'utilisateur qui lance la commande** : un service lancé sous un autre compte a son propre `~/.maia`, et ses workflows n'apparaissent que dans **son** `maia workflows`.
|
||
- Aucun terminal n'est nécessaire : `maia run` et les commandes de supervision fonctionnent sans TTY.
|
||
- `NO_COLOR=1` supprime les couleurs de l'affichage texte (elles sont déjà absentes hors terminal).
|
||
|
||
## 9. Le registre
|
||
|
||
Chaque workflow a un dossier dans **`~/.maia/workflows/<id>/`** (registre global, pour tous les projets) :
|
||
|
||
| Fichier | Contenu |
|
||
| --- | --- |
|
||
| `workflow.json` | agent parent, tâche, modèle, dossier, mode d'autorisation, pid, dates, état, erreur |
|
||
| `agents.json` | état de chaque agent (modèle, nombre de lancements, durée, erreur) |
|
||
| `events.jsonl` | journal horodaté, une ligne JSON par évènement (ce qu'affiche `maia logs`) |
|
||
| `requests/` | `r1.json`… : demandes ; `r1.answer.json` : réponse déposée par `approve` / `reply` |
|
||
| `traces/` | conversation complète de chaque agent (`Main.json`, `reviewer.json`, `reviewer-2.json`…) |
|
||
| `result.md` | résultat final du parent |
|
||
| `run.log` | sortie du processus en mode `--detach` |
|
||
| `stop` | présent si `maia stop` a été demandé |
|
||
|
||
- Pas de serveur : les commandes lisent ces fichiers. Seul le processus du workflow écrit `workflow.json`, `agents.json` et `events.jsonl` (écritures atomiques) ; les réponses et l'arrêt sont déposés dans des fichiers à part.
|
||
- **Nettoyage** : rien n'est supprimé automatiquement. Supprimez les dossiers des anciens workflows à la main (ils sont nommés par date : `wf_AAAAMMJJ_HHMMSS_xxxx`).
|
||
- Les traces contiennent tout ce que les agents ont lu (code, sorties de commandes) : traitez ce dossier comme sensible.
|
||
|
||
## 10. Limites
|
||
|
||
- **Un seul niveau d'agents** : le parent lance des sous-agents, un sous-agent ne lance jamais d'agent (il n'a pas l'outil `Agent`). Pour une chaîne plus longue, c'est le parent qui enchaîne les étapes.
|
||
- **Le parent ne voit que les résumés** de ses sous-agents, pas leur conversation (elle est dans `traces/`).
|
||
- **Une demande d'autorisation à la fois** : même avec des sous-agents en parallèle, les demandes `ask` sont posées l'une après l'autre (la suivante apparaît quand la précédente a reçu sa réponse). D'où l'intérêt des règles `allow` (§ 5).
|
||
- **Seul le parent peut demander une intervention** (`RequestIntervention`) ; un sous-agent signale le besoin dans son résumé.
|
||
- **Pas de reprise** : un workflow arrêté, en erreur, ou dont le processus a disparu (redémarrage de la machine, fermeture de session) ne reprend pas ; il apparaît « en erreur » et il faut en relancer un.
|
||
- **Pas de compactage du contexte** pour le parent ni pour les sous-agents : une très longue conversation peut dépasser la fenêtre du modèle. Gardez des missions courtes et des sous-agents qui résument.
|
||
- **Les sous-agents n'ont pas les outils MCP** (le parent les a, si les serveurs sont activés pour le projet).
|
||
- **Pas d'API HTTP** : la supervision passe par la ligne de commande et les fichiers du registre, sur la même machine et pour le même utilisateur.
|
||
- **Pas de nettoyage automatique** du registre.
|
||
- **Le délai par sous-agent** n'existe pas dans un workflow : seul `timeout` (du workflow) borne la durée totale.
|
||
- Les sous-agents d'**autres projets** ne sont pas accessibles ; partagez un agent en le plaçant dans `~/.maia/agents`.
|
||
|
||
## 11. Dépannage
|
||
|
||
| Symptôme | Cause probable / solution |
|
||
| --- | --- |
|
||
| Le workflow reste « en attente » dès le début | le lancement d'un sous-agent demande une autorisation : `maia workflow <id>` puis `maia approve`, ou ajoutez `allow: [Agent]` (§ 5) |
|
||
| « Agent parent invalide » | section obligatoire manquante, `name` différent du dossier, `description` absente : le message dit laquelle |
|
||
| « Aucun sous-agent disponible » | le `AGENT.md` n'est pas dans un dossier `.maia/agents`, ou ce dossier ne contient que le parent ; vérifiez aussi `~/.maia/agents` |
|
||
| Le parent ne lance pas un sous-agent attendu | son nom n'apparaît pas dans les missions, ou sa `description` ne correspond pas à la tâche ; nommez-le explicitement |
|
||
| « en erreur — processus disparu » | le processus a été tué (machine éteinte, session fermée, `kill`) ; relancez. Pour un lancement durable, utilisez un service ou une tâche planifiée |
|
||
| « Aucun modèle indiqué… » | ni `--model`, ni `model`, ni `DefaultModel`, et LiteLLM injoignable : vérifiez `~/.maia/settings.json` |
|
||
| Rien ne s'affiche avec `--detach` | normal : la sortie va dans `~/.maia/workflows/<id>/run.log` ; suivez avec `maia logs <id> -f` |
|
||
| `workflow « x » introuvable` / « ambigu » | utilisez l'identifiant complet, `last`, ou un morceau plus long |
|
||
|
||
## 12. Aide-mémoire
|
||
|
||
```bash
|
||
# Lancer (ou : pnpm maia run … depuis le dépôt MAIA, pnpm --dir <maia> maia run … d'ailleurs)
|
||
maia run <AGENT.md> [--task "…"] [--model m] [--name n] [--detach] [--json]
|
||
[--permission-mode wait|deny|allow] [--timeout 30m] [--quiet]
|
||
# Superviser
|
||
maia workflows [--all] [--json]
|
||
maia workflow <id> [--json] [--watch]
|
||
maia logs <id> [agent] [-f]
|
||
maia result <id>
|
||
# Intervenir
|
||
maia approve <id> <rN> [--deny]
|
||
maia reply <id> <rN> "texte"
|
||
maia stop <id>
|
||
```
|
||
|
||
| | |
|
||
| --- | --- |
|
||
| Sous-agents disponibles | dossier `.maia/agents` du parent + `~/.maia/agents` |
|
||
| Modèle | `--model` > `model` du parent > `DefaultModel` > 1er modèle LiteLLM ; sous-agents : celui du parent sauf `model` |
|
||
| Autorisations | `wait` (défaut) · `deny` · `allow` ; pensez à `allow: [Agent]` |
|
||
| États | non exécuté · en exécution · en attente · terminé · en erreur |
|
||
| Codes de sortie | 0 terminé · 1 erreur · 2 utilisation · 130 arrêté |
|
||
| Registre | `~/.maia/workflows/<id>/` |
|
||
| Niveaux | 1 seul : parent → sous-agents |
|