Importer et exporter un agent
Le format de fichier aidoo-agent/v1 : ce qu'il contient, ce qu'il laisse de côté, un exemple complet et la référence de chaque champ pour écrire ou adapter un agent à la main.
10 min de lectureMis à jour le 16 septembre 2026
Un agent Aidoo se décrit entièrement dans un fichier JSON. Vous pouvez l'exporter depuis sa fiche, le relire, le modifier dans un éditeur de texte, le versionner avec votre code ou le confier à un collègue, puis l'importer dans un autre espace de travail. Le fichier suit le format aidoo-agent/v1.
Trois usages courants :
- Dupliquer entre espaces : un agent mis au point sur un premier Odoo se réinstalle en une minute chez un autre client ou sur une autre société.
- Garder un historique : un fichier par agent dans un dépôt Git, et chaque changement de mission ou de règle devient une révision lisible.
- Écrire un agent hors de l'interface : un intégrateur, un script ou un assistant d'IA peut produire le fichier ; Aidoo le valide à l'import et vous le montre dans l'assistant de création avant toute sauvegarde.
Exporter
Ouvrez la fiche de l'agent et cliquez sur le bouton JSON (icône de téléchargement) dans l'en-tête. Le navigateur télécharge agent-<identifiant>.json. L'export est réservé aux propriétaires et administrateurs de l'espace.
Importer
Dans Agents > Nouvel agent, choisissez Importer un fichier JSON (aidoo-agent/v1). Aidoo vérifie le fichier, puis ouvre l'assistant de création prérempli. Rien n'est enregistré à ce stade : vous désignez l'identité Odoo, relisez chaque étape, et l'agent est créé en brouillon comme n'importe quel autre. Un fichier invalide est refusé avec le champ en cause.
Le fichier
{
"schema": "aidoo-agent/v1",
"exportedAt": "2026-09-16T10:00:00.000Z",
"source": { "agentId": "64a1b2c3d4e5f6789012345a", "workspace": "ACME" },
"agent": { "...": "la configuration, détaillée ci-dessous" }
}| Clé | Rôle |
|---|---|
schema | Obligatoire, toujours "aidoo-agent/v1". C'est ce qui identifie le format. |
exportedAt | Date ISO 8601 de l'export. Informative, ignorée à l'import. |
source | Agent et espace d'origine. Informatif, ignoré à l'import. |
agent | La configuration complète, décrite dans la référence plus bas. |
Un fichier écrit à la main n'a besoin que de schema et agent.
Ce que l'export ne contient jamais
Le fichier est une configuration portable, pas un coffre. Il ne contient :
- ni identité Odoo : à l'import, vous choisissez à nouveau le membre dont l'agent utilise les droits ;
- ni clé API, ni jeton, ni identifiant de connexion ;
- ni compétences ni sources de connaissance : elles appartiennent à l'espace ; réattachez-les après l'import ;
- ni état d'exécution : historique de mission, observations du mode apprentissage, compteurs d'erreurs, curseurs d'événements.
Deux champs méritent un regard avant de partager un fichier : notifications.email.recipients (adresses e-mail) et assignedOdooLogins (identifiants Odoo des utilisateurs qui voient l'agent dans le widget). Videz-les si le fichier change de société. Les collaborators sont des identifiants d'agents de l'espace d'origine : à l'import dans un autre espace, ceux qui n'existent pas sont simplement ignorés.
Exemple complet
L'agent « Relance factures impayées » de la galerie, tel qu'il s'exporte :
{
"schema": "aidoo-agent/v1",
"agent": {
"name": "Relance factures impayées",
"avatar": { "seed": "finance-relance-impayes" },
"mode": "scheduled",
"instructions": "Chaque matin, liste les factures clients (account.move, move_type='out_invoice') validées, non payées et dont l'échéance est dépassée. Pour chacune, ajoute une note dans le chatter récapitulant le retard (jours, montant) et planifie une activité de relance pour le vendeur responsable. Termine par un résumé : nombre de factures en retard, montant total, top 5 des clients concernés.",
"style": { "preset": "descriptive" },
"model": { "provider": "auto", "modelId": "auto" },
"environment": "production",
"timezone": "Europe/Paris",
"trigger": { "cron": "0 8 * * 1-5" },
"permissions": {
"workflowsOnly": false,
"webAccess": false,
"requireApproval": false,
"email": false,
"emailMode": "propose",
"document": false,
"rules": [
{ "scope": { "groupKey": "facturation" }, "operations": ["query", "read"] },
{ "scope": { "models": ["mail.activity"] }, "operations": ["query", "read", "create"] },
{
"scope": { "models": ["account.move"] },
"operations": ["query", "read", "write"],
"valueConditions": [{ "field": "move_type", "operator": "=", "value": "out_invoice" }]
}
]
},
"limits": { "timeoutSecondsPerRun": 300, "maxAutoEmailsPerRun": 10 },
"autoPause": { "enabled": true, "maxConsecutiveErrors": 3 },
"activeHours": { "enabled": false, "days": [1, 2, 3, 4, 5], "start": "08:00", "end": "18:00" },
"notifications": {
"email": { "enabled": false, "recipients": [], "frequency": "onlyOnError" },
"odooChatter": { "enabled": false },
"odooDiscuss": { "enabled": false }
},
"assignedOdooLogins": [],
"commands": [
{
"id": "relance-client",
"label": "Relancer un client",
"prompt": "Relance toutes les factures en retard de ce client et résume ce que tu as fait.",
"variables": [{ "name": "Client", "required": true }]
}
]
}
}Référence des champs
Les valeurs marquées « défaut » peuvent être omises : Aidoo les complète à l'import.
Identité et mission
| Champ | Type | Description |
|---|---|---|
name | texte, 1 à 80 caractères | Nom affiché. |
avatar.seed | texte, 1 à 64 caractères | Graine de l'avatar généré. Défaut : aléatoire. |
mode | scheduled, event ou conversational | Planifié, déclenché par un événement Odoo, ou uniquement à la demande dans le chat. |
instructions | texte, 1 à 20 000 caractères | La mission. Voir Écrire une bonne mission. |
style.preset | descriptive, concise, human, formal, technical | Style des restitutions. Défaut : descriptive. |
style.humanTone | warm, direct, enthusiastic, casual | Nuance du style human. |
style.language | fr, en, es, de, pt, ar, nl, fi | Langue des restitutions. Défaut : langue du compte. |
Modèle et environnement
| Champ | Type | Description |
|---|---|---|
model.provider | auto, anthropic, openai, google, moonshot, deepseek, nvidia | Fournisseur. auto laisse Aidoo choisir un modèle éco à jour ; c'est le choix recommandé et le plus portable. |
model.modelId | texte | Identifiant du modèle chez le fournisseur ; auto avec le fournisseur auto. Un modèle absent du catalogue ou non couvert par le palier est signalé à l'activation. |
environment | production ou staging | Connexion Odoo utilisée. Défaut : production. |
timezone | fuseau IANA | Fuseau des plannings et des plages horaires. Défaut : Europe/Paris. |
Déclencheur (trigger)
| Champ | Type | Description |
|---|---|---|
cron | expression cron, 5 champs | Planning principal (mode scheduled). Exemple : 0 8 * * 1-5, du lundi au vendredi à 8 h. |
extraCrons | liste, 4 au plus | Créneaux supplémentaires (5 créneaux au total). |
event.model | modèle Odoo | Modèle surveillé (mode event), par exemple crm.lead. |
event.on | create, update ou date | Réagir à la création, à la modification, ou à l'approche d'une date. |
event.conditions | liste de triplets [champ, opérateur, valeur] | Filtre au format domaine Odoo, par exemple ["stage_id", "=", 3]. |
event.points | liste, 1 à 3 entrées | Pour on: "date" : { "dateField": "date_deadline", "offsetMinutes": -1440, "label": "J-1" }. Décalage entre -10080 et 10080 minutes (une semaine). |
Permissions (permissions)
| Champ | Type | Description |
|---|---|---|
workflowsOnly | booléen | L'agent ne peut qu'exécuter les workflows listés. Défaut : false. |
allowedWorkflowIds | liste | Workflows autorisés quand workflowsOnly est vrai. Identifiants propres à l'espace. |
webAccess | booléen | Recherche et lecture de pages web. Défaut : false. |
requireApproval | booléen | Chaque écriture attend votre validation. Défaut : false. |
email | booléen | Peut proposer des e-mails Odoo. Défaut : false. |
emailMode | propose ou auto | auto envoie sans validation, dans la limite de limits.maxAutoEmailsPerRun. Défaut : propose. |
document | booléen | Lecture des pièces jointes (PDF, images) par un modèle de vision. Défaut : false. |
rules | liste | Règles d'accès, voir ci-dessous. |
learning.active | booléen | Mode apprentissage. true ouvre une fenêtre de 48 heures à la création. Voir Règles et permissions. |
collaborators | liste, 5 au plus | Identifiants d'agents que celui-ci peut interroger ou solliciter. |
mcpApps | liste, 5 au plus | Apps externes : { "appSlug": "slack", "source": "composio", "enabledTools": [...], "allowWrites": false }. Voir Intégrations. |
Sauf en mode workflowsOnly, un agent doit avoir au moins une règle, une app externe, l'accès web ou le mode apprentissage.
Chaque règle :
| Champ | Type | Description |
|---|---|---|
scope.groupKey | clé de groupe | Un groupe fonctionnel entier (facturation, ventes, crm, stock...). |
scope.models | liste de modèles Odoo | Ou une liste explicite. L'un des deux est obligatoire. |
operations | query, read, create, write, workflow, execute, report, print | Opérations permises. La suppression n'existe pas : un agent ne supprime jamais. |
valueConditions | liste | Conditions sur les valeurs : { "field": "amount_total", "operator": "<", "value": 5000 }. Opérateurs : =, !=, >, >=, <, <=, in, not in, ilike. |
Limites et pause automatique
| Champ | Type | Description |
|---|---|---|
limits.maxToolCallsPerRun | entier, 1 au moins | Nombre maximal d'actions par exécution. |
limits.maxTokensPerRun | entier, 1 000 à 4 000 000 | Budget de tokens par exécution. |
limits.timeoutSecondsPerRun | entier, 30 à 2 000 | Durée maximale d'une exécution. Défaut : 300. |
limits.monthlyCreditBudget | entier positif | Plafond de crédits par mois calendaire. |
limits.maxAutoEmailsPerRun | entier, 1 à 100 | E-mails envoyés automatiquement par exécution. Défaut : 10. |
autoPause.enabled | booléen | Pause automatique après des erreurs consécutives. Défaut : true. |
autoPause.maxConsecutiveErrors | entier, 1 à 20 | Seuil de mise en pause. Défaut : 3. |
autoPause.maxWritesPerRun | entier, 1 au moins | Au-delà, l'exécution s'arrête et l'agent se met en pause. |
Plages horaires, notifications, visibilité, commandes
| Champ | Type | Description |
|---|---|---|
activeHours.enabled | booléen | Restreindre les exécutions à une plage. Défaut : false. |
activeHours.days | liste de 0 (dimanche) à 6 | Défaut : [1, 2, 3, 4, 5]. |
activeHours.start, activeHours.end | HH:MM | Défaut : 08:00 et 18:00. |
notifications.email.enabled | booléen | Rapport par e-mail. Défaut : false. |
notifications.email.recipients | liste d'adresses | Destinataires. |
notifications.email.frequency | everyRun, onlyOnError, dailyDigest | Défaut : onlyOnError. |
notifications.odooChatter.enabled | booléen | Note dans le chatter des enregistrements traités. |
notifications.odooDiscuss.enabled | booléen | Message dans Discuss. |
assignedOdooLogins | liste, 200 au plus | Utilisateurs Odoo qui voient l'agent dans le widget. Vide : personne en particulier. |
commands | liste, 6 au plus | Boutons de commande rapide du chat : id, label (40 caractères), prompt (2 000 caractères), variables (3 au plus, { "name", "required" }). |
Compatibilité
- Les champs inconnus sont ignorés à l'import : un fichier produit par une version plus récente d'Aidoo s'importe, au prix des réglages qu'elle a ajoutés.
- Les champs absents prennent leur valeur par défaut.
- Un fichier dont
scheman'est pasaidoo-agent/v1est refusé. Un nouveau numéro de version ne sera introduit que pour un changement incompatible, avec une passerelle depuis les fichiersv1. - L'export passe par la même validation que l'import : un fichier exporté se réimporte toujours.
Étape suivante
- Créer un agent : les autres chemins de création
- Règles et permissions : construire des règles sûres