Importar y exportar un agente
El formato de archivo aidoo-agent/v1: qué contiene, qué deja fuera, un ejemplo completo y la referencia de cada campo para escribir o adaptar un agente a mano.
10 min de lecturaActualizado el 16 de septiembre de 2026
Un agente Aidoo se describe por completo en un archivo JSON. Puedes exportarlo desde su ficha, releerlo, modificarlo en un editor de texto, versionarlo con tu código o entregárselo a un compañero, y luego importarlo en otro espacio de trabajo. El archivo sigue el formato aidoo-agent/v1.
Tres usos habituales:
- Duplicar entre espacios: un agente ajustado en un primer Odoo se reinstala en un minuto para otro cliente u otra empresa.
- Conservar un historial: un archivo por agente en un repositorio Git, y cada cambio de misión o de regla se convierte en una revisión legible.
- Escribir un agente fuera de la interfaz: un integrador, un script o un asistente de IA puede producir el archivo; Aidoo lo valida al importar y lo muestra en el asistente de creación antes de guardar nada.
Exportar
Abre la ficha del agente y pulsa el botón JSON (icono de descarga) en la cabecera. El navegador descarga agent-<id>.json. La exportación está reservada a propietarios y administradores del espacio.
Importar
En Agentes > Nuevo agente, elige Importar un archivo JSON (aidoo-agent/v1). Aidoo comprueba el archivo y abre el asistente de creación ya rellenado. En ese momento no se guarda nada: designas la identidad Odoo, revisas cada paso, y el agente se crea como borrador igual que cualquier otro. Un archivo inválido se rechaza indicando el campo en cuestión.
El archivo
{
"schema": "aidoo-agent/v1",
"exportedAt": "2026-09-16T10:00:00.000Z",
"source": { "agentId": "64a1b2c3d4e5f6789012345a", "workspace": "ACME" },
"agent": { "...": "la configuración, detallada más abajo" }
}| Clave | Función |
|---|---|
schema | Obligatoria, siempre "aidoo-agent/v1". Es lo que identifica el formato. |
exportedAt | Fecha ISO 8601 de la exportación. Informativa, ignorada al importar. |
source | Agente y espacio de origen. Informativo, ignorado al importar. |
agent | La configuración completa, descrita en la referencia de más abajo. |
Un archivo escrito a mano solo necesita schema y agent.
Lo que la exportación nunca contiene
El archivo es una configuración portable, no una caja fuerte. No contiene:
- ninguna identidad Odoo: al importar, vuelves a elegir el miembro cuyos derechos usa el agente;
- ninguna clave API, token ni credencial de conexión;
- ninguna competencia ni fuente de conocimiento: pertenecen al espacio; vuelve a adjuntarlas tras la importación;
- ningún estado de ejecución: historial de misión, observaciones del modo aprendizaje, contadores de errores, cursores de eventos.
Dos campos merecen un vistazo antes de compartir un archivo: notifications.email.recipients (direcciones de correo) y assignedOdooLogins (identificadores Odoo de los usuarios que ven el agente en el widget). Vacíalos si el archivo cambia de empresa. Los collaborators son identificadores de agentes del espacio de origen: al importar en otro espacio, los que no existen se ignoran sin más.
Ejemplo completo
El agente «Seguimiento de facturas vencidas» de la galería, tal como se exporta:
{
"schema": "aidoo-agent/v1",
"agent": {
"name": "Seguimiento de facturas vencidas",
"avatar": { "seed": "finance-relance-impayes" },
"mode": "scheduled",
"instructions": "Cada mañana, lista las facturas de cliente (account.move, move_type='out_invoice') validadas, no pagadas y con fecha de vencimiento superada. Para cada una, añade una nota en el chatter resumiendo el retraso (días, importe) y planifica una actividad de seguimiento para el comercial responsable. Termina con un resumen: número de facturas vencidas, importe total, los 5 clientes más afectados.",
"style": { "preset": "descriptive" },
"model": { "provider": "auto", "modelId": "auto" },
"environment": "production",
"timezone": "Europe/Madrid",
"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": "seguimiento-cliente",
"label": "Reclamar a un cliente",
"prompt": "Reclama todas las facturas vencidas de este cliente y resume lo que has hecho.",
"variables": [{ "name": "Cliente", "required": true }]
}
]
}
}Referencia de campos
Los valores marcados «por defecto» pueden omitirse: Aidoo los completa al importar.
Identidad y misión
| Campo | Tipo | Descripción |
|---|---|---|
name | texto, de 1 a 80 caracteres | Nombre mostrado. |
avatar.seed | texto, de 1 a 64 caracteres | Semilla del avatar generado. Por defecto: aleatoria. |
mode | scheduled, event o conversational | Planificado, disparado por un evento Odoo, o solo bajo demanda en el chat. |
instructions | texto, de 1 a 20 000 caracteres | La misión. Ver Escribir una buena misión. |
style.preset | descriptive, concise, human, formal, technical | Estilo de los informes. Por defecto: descriptive. |
style.humanTone | warm, direct, enthusiastic, casual | Matiz del estilo human. |
style.language | fr, en, es, de, pt, ar, nl, fi | Idioma de los informes. Por defecto: idioma de la cuenta. |
Modelo y entorno
| Campo | Tipo | Descripción |
|---|---|---|
model.provider | auto, anthropic, openai, google, moonshot, deepseek, nvidia | Proveedor. auto deja que Aidoo elija un modelo eco actualizado; es la opción recomendada y la más portable. |
model.modelId | texto | Identificador del modelo en el proveedor; auto con el proveedor auto. Un modelo ausente del catálogo o no cubierto por el plan se señala en la activación. |
environment | production o staging | Conexión Odoo utilizada. Por defecto: production. |
timezone | zona horaria IANA | Zona de las planificaciones y franjas horarias. Por defecto: Europe/Paris. |
Disparador (trigger)
| Campo | Tipo | Descripción |
|---|---|---|
cron | expresión cron, 5 campos | Planificación principal (modo scheduled). Ejemplo: 0 8 * * 1-5, de lunes a viernes a las 8. |
extraCrons | lista, 4 como máximo | Franjas adicionales (5 franjas en total). |
event.model | modelo Odoo | Modelo vigilado (modo event), por ejemplo crm.lead. |
event.on | create, update o date | Reaccionar a la creación, a la modificación o a la proximidad de una fecha. |
event.conditions | lista de tripletas [campo, operador, valor] | Filtro en formato dominio Odoo, por ejemplo ["stage_id", "=", 3]. |
event.points | lista, de 1 a 3 entradas | Para on: "date": { "dateField": "date_deadline", "offsetMinutes": -1440, "label": "D-1" }. Desfase entre -10080 y 10080 minutos (una semana). |
Permisos (permissions)
| Campo | Tipo | Descripción |
|---|---|---|
workflowsOnly | booleano | El agente solo puede ejecutar los workflows listados. Por defecto: false. |
allowedWorkflowIds | lista | Workflows autorizados cuando workflowsOnly es verdadero. Identificadores propios del espacio. |
webAccess | booleano | Búsqueda y lectura de páginas web. Por defecto: false. |
requireApproval | booleano | Cada escritura espera tu validación. Por defecto: false. |
email | booleano | Puede proponer correos Odoo. Por defecto: false. |
emailMode | propose o auto | auto envía sin validación, dentro del límite limits.maxAutoEmailsPerRun. Por defecto: propose. |
document | booleano | Lectura de adjuntos (PDF, imágenes) con un modelo de visión. Por defecto: false. |
rules | lista | Reglas de acceso, ver más abajo. |
learning.active | booleano | Modo aprendizaje. true abre una ventana de 48 horas al crear. Ver Reglas y permisos. |
collaborators | lista, 5 como máximo | Identificadores de agentes a los que este puede preguntar o delegar. |
mcpApps | lista, 5 como máximo | Apps externas: { "appSlug": "slack", "source": "composio", "enabledTools": [...], "allowWrites": false }. Ver Integraciones. |
Salvo en modo workflowsOnly, un agente necesita al menos una regla, una app externa, el acceso web o el modo aprendizaje.
Cada regla:
| Campo | Tipo | Descripción |
|---|---|---|
scope.groupKey | clave de grupo | Un grupo funcional entero (facturation, ventes, crm, stock...). |
scope.models | lista de modelos Odoo | O una lista explícita. Uno de los dos es obligatorio. |
operations | query, read, create, write, workflow, execute, report, print | Operaciones permitidas. La eliminación no existe: un agente nunca borra. |
valueConditions | lista | Condiciones sobre los valores: { "field": "amount_total", "operator": "<", "value": 5000 }. Operadores: =, !=, >, >=, <, <=, in, not in, ilike. |
Límites y pausa automática
| Campo | Tipo | Descripción |
|---|---|---|
limits.maxToolCallsPerRun | entero, 1 como mínimo | Número máximo de acciones por ejecución. |
limits.maxTokensPerRun | entero, de 1 000 a 4 000 000 | Presupuesto de tokens por ejecución. |
limits.timeoutSecondsPerRun | entero, de 30 a 2 000 | Duración máxima de una ejecución. Por defecto: 300. |
limits.monthlyCreditBudget | entero positivo | Tope de créditos por mes natural. |
limits.maxAutoEmailsPerRun | entero, de 1 a 100 | Correos enviados automáticamente por ejecución. Por defecto: 10. |
autoPause.enabled | booleano | Pausa automática tras errores consecutivos. Por defecto: true. |
autoPause.maxConsecutiveErrors | entero, de 1 a 20 | Umbral de pausa. Por defecto: 3. |
autoPause.maxWritesPerRun | entero, 1 como mínimo | Superado, la ejecución se detiene y el agente se pausa. |
Franjas horarias, notificaciones, visibilidad, comandos
| Campo | Tipo | Descripción |
|---|---|---|
activeHours.enabled | booleano | Restringir las ejecuciones a una franja. Por defecto: false. |
activeHours.days | lista de 0 (domingo) a 6 | Por defecto: [1, 2, 3, 4, 5]. |
activeHours.start, activeHours.end | HH:MM | Por defecto: 08:00 y 18:00. |
notifications.email.enabled | booleano | Informe por correo. Por defecto: false. |
notifications.email.recipients | lista de direcciones | Destinatarios. |
notifications.email.frequency | everyRun, onlyOnError, dailyDigest | Por defecto: onlyOnError. |
notifications.odooChatter.enabled | booleano | Nota en el chatter de los registros tratados. |
notifications.odooDiscuss.enabled | booleano | Mensaje en Discuss. |
assignedOdooLogins | lista, 200 como máximo | Usuarios Odoo que ven el agente en el widget. Vacía: nadie en particular. |
commands | lista, 6 como máximo | Botones de comando rápido del chat: id, label (40 caracteres), prompt (2 000 caracteres), variables (3 como máximo, { "name", "required" }). |
Compatibilidad
- Los campos desconocidos se ignoran al importar: un archivo producido por una versión más reciente de Aidoo se importa, sin los ajustes que esa versión añadió.
- Los campos ausentes toman su valor por defecto.
- Un archivo cuyo
schemano seaaidoo-agent/v1se rechaza. Solo se introducirá un nuevo número de versión para un cambio incompatible, con una pasarela desde los archivosv1. - La exportación pasa por la misma validación que la importación: un archivo exportado siempre se vuelve a importar.
Siguiente paso
- Crear un agente: los otros caminos de creación
- Reglas y permisos: construir reglas seguras