Agents

Importing and exporting an agent

The aidoo-agent/v1 file format: what it contains, what it leaves out, a full example and the reference of every field, to write or adapt an agent by hand.

9 min readUpdated September 16, 2026

An Aidoo agent is fully described by a JSON file. You can export it from its page, read it, edit it in a text editor, version it with your code or hand it to a colleague, then import it into another workspace. The file follows the aidoo-agent/v1 format.

Three common uses:

  • Duplicating across workspaces: an agent tuned on a first Odoo is reinstalled in a minute for another customer or another company.
  • Keeping a history: one file per agent in a Git repository, and every change of mission or rule becomes a readable revision.
  • Writing an agent outside the interface: an integrator, a script or an AI assistant can produce the file; Aidoo validates it on import and shows it in the creation wizard before anything is saved.

Exporting

Open the agent's page and click the JSON button (download icon) in the header. The browser downloads agent-<id>.json. Export is reserved to workspace owners and administrators.

Importing

In Agents > New agent, choose Import a JSON file (aidoo-agent/v1). Aidoo checks the file, then opens the creation wizard prefilled. Nothing is saved at that point: you designate the Odoo identity, review every step, and the agent is created as a draft like any other. An invalid file is rejected with the offending field.

The file

{
  "schema": "aidoo-agent/v1",
  "exportedAt": "2026-09-16T10:00:00.000Z",
  "source": { "agentId": "64a1b2c3d4e5f6789012345a", "workspace": "ACME" },
  "agent": { "...": "the configuration, detailed below" }
}
KeyRole
schemaRequired, always "aidoo-agent/v1". This is what identifies the format.
exportedAtISO 8601 date of the export. Informative, ignored on import.
sourceAgent and workspace of origin. Informative, ignored on import.
agentThe full configuration, described in the reference below.

A hand-written file only needs schema and agent.

What the export never contains

The file is a portable configuration, not a vault. It contains:

  • no Odoo identity: on import, you choose again the member whose rights the agent uses;
  • no API key, token or connection credential;
  • no skills and no knowledge sources: they belong to the workspace; reattach them after import;
  • no execution state: mission history, learning-mode observations, error counters, event cursors.

Two fields deserve a look before sharing a file: notifications.email.recipients (e-mail addresses) and assignedOdooLogins (Odoo logins of the users who see the agent in the widget). Clear them if the file changes company. collaborators are agent ids from the original workspace: on import into another workspace, those that do not exist are simply ignored.

Full example

The "Overdue invoice follow-up" agent from the gallery, as it exports:

{
  "schema": "aidoo-agent/v1",
  "agent": {
    "name": "Overdue invoice follow-up",
    "avatar": { "seed": "finance-relance-impayes" },
    "mode": "scheduled",
    "instructions": "Every morning, list customer invoices (account.move, move_type='out_invoice') that are posted, unpaid and past their due date. For each one, add a chatter note summarising the delay (days, amount) and schedule a follow-up activity for the responsible salesperson. End with a summary: number of overdue invoices, total amount, top 5 customers concerned.",
    "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": "follow-up-customer",
        "label": "Follow up a customer",
        "prompt": "Follow up every overdue invoice of this customer and summarise what you did.",
        "variables": [{ "name": "Customer", "required": true }]
      }
    ]
  }
}

Field reference

Values marked "default" can be omitted: Aidoo fills them in on import.

Identity and mission

FieldTypeDescription
nametext, 1 to 80 charactersDisplayed name.
avatar.seedtext, 1 to 64 charactersSeed of the generated avatar. Default: random.
modescheduled, event or conversationalScheduled, triggered by an Odoo event, or only on demand in the chat.
instructionstext, 1 to 20,000 charactersThe mission. See Writing a good mission.
style.presetdescriptive, concise, human, formal, technicalStyle of the reports. Default: descriptive.
style.humanTonewarm, direct, enthusiastic, casualNuance of the human style.
style.languagefr, en, es, de, pt, ar, nl, fiLanguage of the reports. Default: account language.

Model and environment

FieldTypeDescription
model.providerauto, anthropic, openai, google, moonshot, deepseek, nvidiaProvider. auto lets Aidoo pick an up-to-date eco model; it is the recommended and most portable choice.
model.modelIdtextModel id at the provider; auto with the auto provider. A model missing from the catalogue or not covered by the plan is reported at activation.
environmentproduction or stagingOdoo connection used. Default: production.
timezoneIANA time zoneTime zone of schedules and active hours. Default: Europe/Paris.

Trigger (trigger)

FieldTypeDescription
croncron expression, 5 fieldsMain schedule (scheduled mode). Example: 0 8 * * 1-5, Monday to Friday at 8 am.
extraCronslist, at most 4Additional slots (5 slots in total).
event.modelOdoo modelWatched model (event mode), for example crm.lead.
event.oncreate, update or dateReact to creation, to modification, or to an approaching date.
event.conditionslist of [field, operator, value] triplesFilter in Odoo domain format, for example ["stage_id", "=", 3].
event.pointslist, 1 to 3 entriesFor on: "date": { "dateField": "date_deadline", "offsetMinutes": -1440, "label": "D-1" }. Offset between -10080 and 10080 minutes (one week).

Permissions (permissions)

FieldTypeDescription
workflowsOnlybooleanThe agent can only run the listed workflows. Default: false.
allowedWorkflowIdslistAllowed workflows when workflowsOnly is true. Workspace-specific ids.
webAccessbooleanWeb search and page reading. Default: false.
requireApprovalbooleanEvery write waits for your approval. Default: false.
emailbooleanMay propose Odoo e-mails. Default: false.
emailModepropose or autoauto sends without approval, within limits.maxAutoEmailsPerRun. Default: propose.
documentbooleanReading of attachments (PDF, images) with a vision model. Default: false.
ruleslistAccess rules, see below.
learning.activebooleanLearning mode. true opens a 48-hour window at creation. See Rules and permissions.
collaboratorslist, at most 5Ids of agents this one may ask or delegate to.
mcpAppslist, at most 5External apps: { "appSlug": "slack", "source": "composio", "enabledTools": [...], "allowWrites": false }. See Integrations.

Unless in workflowsOnly mode, an agent needs at least one rule, one external app, web access or learning mode.

Each rule:

FieldTypeDescription
scope.groupKeygroup keyA whole functional group (facturation, ventes, crm, stock...).
scope.modelslist of Odoo modelsOr an explicit list. One of the two is required.
operationsquery, read, create, write, workflow, execute, report, printAllowed operations. Deletion does not exist: an agent never deletes.
valueConditionslistConditions on values: { "field": "amount_total", "operator": "<", "value": 5000 }. Operators: =, !=, >, >=, <, <=, in, not in, ilike.

Limits and automatic pause

FieldTypeDescription
limits.maxToolCallsPerRuninteger, at least 1Maximum number of actions per run.
limits.maxTokensPerRuninteger, 1,000 to 4,000,000Token budget per run.
limits.timeoutSecondsPerRuninteger, 30 to 2,000Maximum duration of a run. Default: 300.
limits.monthlyCreditBudgetpositive integerCredit ceiling per calendar month.
limits.maxAutoEmailsPerRuninteger, 1 to 100E-mails sent automatically per run. Default: 10.
autoPause.enabledbooleanAutomatic pause after consecutive errors. Default: true.
autoPause.maxConsecutiveErrorsinteger, 1 to 20Pause threshold. Default: 3.
autoPause.maxWritesPerRuninteger, at least 1Beyond it, the run stops and the agent pauses.

Active hours, notifications, visibility, commands

FieldTypeDescription
activeHours.enabledbooleanRestrict runs to a time range. Default: false.
activeHours.dayslist of 0 (Sunday) to 6Default: [1, 2, 3, 4, 5].
activeHours.start, activeHours.endHH:MMDefault: 08:00 and 18:00.
notifications.email.enabledbooleanReport by e-mail. Default: false.
notifications.email.recipientslist of addressesRecipients.
notifications.email.frequencyeveryRun, onlyOnError, dailyDigestDefault: onlyOnError.
notifications.odooChatter.enabledbooleanNote in the chatter of processed records.
notifications.odooDiscuss.enabledbooleanMessage in Discuss.
assignedOdooLoginslist, at most 200Odoo users who see the agent in the widget. Empty: nobody in particular.
commandslist, at most 6Quick command buttons of the chat: id, label (40 characters), prompt (2,000 characters), variables (at most 3, { "name", "required" }).

Compatibility

  • Unknown fields are ignored on import: a file produced by a newer Aidoo version imports, minus the settings it added.
  • Missing fields take their default value.
  • A file whose schema is not aidoo-agent/v1 is rejected. A new version number will only be introduced for an incompatible change, with a bridge from v1 files.
  • Export goes through the same validation as import: an exported file always imports back.

Next step