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.
12 min de lecturaActualizado el 10 de octubre 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-<nombre-del-agente>.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, eliges los usuarios Odoo que verán el agente en el widget, revisas cada paso y Crear el agente lo crea y lo activa, igual que cualquier otro agente. Un archivo inválido se rechaza indicando el campo en cuestión.
Si el archivo no precisa permissions.learning (y el agente no está en modo workflowsOnly), empieza en modo aprendizaje y las reglas del archivo sirven de reglas de partida.
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, fuente de conocimiento ni archivo del Drive: pertenecen al espacio; vuelve a adjuntarlos tras la importación;
- ningún grupo de agentes: el grupo es propio del espacio; coloca el agente en un grupo tras la importación;
- ninguna conexión a las apps externas: el archivo conserva el nombre de cada app y las herramientas elegidas, no la cuenta conectada; conecta la app en Integraciones del espacio de destino;
- 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. Los allowedWorkflowIds también designan workflows del espacio de origen: vuelve a seleccionarlos en el paso Permisos. Las rutas de drive.folders se conservan tal cual: comprueba que esas carpetas existen en el Drive de destino.
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,
"askUser": 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" }]
}
],
"learning": { "active": true }
},
"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 },
"questions": { "widget": true, "email": 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. |
avatar.character | entero, de 1 a 20 | Personaje ilustrado del agente. Ausente: asignado automáticamente. |
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, que se validan antes del envío. 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. |
askUser | booleano | En ejecución autónoma, el agente puede hacer una pregunta a una persona y retomar con su respuesta. Por defecto: false. |
drive.enabled | booleano | Acceso al Drive Aidoo: su carpeta privada en escritura, la carpeta shared en lectura. Por defecto: false. |
drive.folders | lista, 10 como máximo | Carpetas autorizadas adicionales: { "path": "contabilidad/exportaciones", "access": "read" } (read o write). Rutas propias del espacio. |
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": [...] }. source vale composio (catálogo de apps, por defecto), custom (uno de tus servidores MCP) o native (conector proporcionado por Aidoo). enabledTools (100 como máximo) limita el agente a esas herramientas; ausente: todas las herramientas de la app. Ver Integraciones. |
Salvo en modo workflowsOnly, un agente necesita al menos una regla, una app externa, el acceso web, el acceso al Drive 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. Ausente: ilimitado (por defecto). |
limits.maxTokensPerRun | entero, de 1 000 a 4 000 000 | Presupuesto de tokens por ejecución. Ausente: el equivalente a 100 créditos para el modelo elegido, que es también el mínimo. |
limits.timeoutSecondsPerRun | entero, de 30 a 4 500 | Duración máxima de una ejecución, en segundos. 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. Ausente: ilimitado (por defecto). |
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. |
notifications.questions.widget | booleano | Las preguntas del agente se muestran en el widget Odoo de los usuarios asignados. Por defecto: true. |
notifications.questions.email | booleano | Las preguntas se envían por correo a los destinatarios, con un enlace de respuesta. Por defecto: false. El panel las muestra siempre. |
assignedOdooLogins | lista, 200 como máximo | Usuarios Odoo que ven el agente en el widget. Vacía: el agente no aparece en el widget de nadie. |
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