Aibo Platform docs

Concepts

The handful of rules that explain how Aibo behaves. Everything here is enforced by the API.

Tenancy

A tenant is your business. Every user, agent, chat and message belongs to exactly one tenant, and every request is filtered to the tenant of the authenticated principal — there is no way to read or address another tenant's data.

Agents

An agent has a name (≤ 24 chars), role (≤ 40), bio (≤ 240, what it helps with), a tone, an optional avatarSeed, and an optional systemPromptOverride. Its scope is decided by who creates it:

DELETE /v1/agents/{id} archives the agent: it stops replying and leaves its chats, but its past messages are kept. Pass includeArchived=true when listing to see archived agents.

Handles and namespaces

Every agent has a handle used for @mentions (^[a-z0-9]{1,32}$). You don't choose it — it is derived from the name when the agent is created:

  1. Slug: name.toLowerCase().replace(/[^a-z0-9]/g, ''), truncated to 32 characters. An empty slug falls back to aibo.
  2. If that handle is taken, append the smallest integer ≥ 2 that is free (money, money2, money3, …).
  3. Renaming an agent later does not change its handle.

Handles live in namespaces:

Namespace Holds
tenant All tenant agents, shared by the whole tenant
user:{userId} One user's personal agents

The uniqueness rules are:

Because every chat contains one human, and its agents are only that user's agents plus tenant agents, a handle is always unique inside a chat — @handle is never ambiguous.

Name given Already taken Resulting handle
Money — money
Money money money2
Dr. Who? — drwho
🙂 — aibo

Chats

A chat belongs to exactly one human (its owner). Its other members are agents: tenant agents and/or that user's own agents.

Reply routing

After a user message is stored, the platform decides which agents reply. Precedence:

  1. Explicit mentions. Agents in the chat that are @mentioned reply, in the order they were first mentioned. Mentions of handles that aren't members of the chat are ignored.
  2. DM. Otherwise, in a DM, the one agent replies.
  3. Orchestrator. Otherwise, in a group, the orchestrator picks one agent by topic. If it can't decide, a deterministic fallback picks the first agent.

Replies are serial: when several agents respond, each finishes before the next starts. Agents don't mention or trigger each other — only the human's message drives routing.

text
"@billing @money was that double charge in my budget?"  → billing, then money
"hey @MONEY"                                              → money (mentions are case-insensitive)
"email me at dana@acme.test"                              → not a mention (orchestrator decides)
"Can you explain this invoice?" (group)                   → one agent chosen by topic

The non-streaming response (202) includes responders: the agent ids that will reply, in order.

Messages, history and memory

Tone presets

tone is one of five presets that shape how the agent writes:

Tone Feels like
warm Friendly and encouraging
direct Brief, to the point, no filler
playful Light, witty, informal
gentle Calm, patient, reassuring
sharp Precise, critical, challenges assumptions

systemPromptOverride

By default the platform generates each agent's system prompt from its bio and tone (plus tenant context). Set systemPromptOverride (≤ 8000 chars) to replace that generated bio + tone prompt with your own. Send null in PATCH /v1/agents/{id} to go back to the generated prompt.

ts
await server.agents.update(billingId, {
  systemPromptOverride: 'You are Acme Billing. Only discuss invoices, refunds and payment methods. Never promise refunds; offer to open a ticket.',
});
bash
curl -sS -X PATCH "$AIBO_URL/v1/agents/agt_billing…" \
  -H "Authorization: Bearer $AIBO_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"systemPromptOverride":null}'