docs-mintlify/admin/ai/multi-agent.mdx
Every Cube deployment ships with a single agent by default — see the Overview for the standard configuration. For more advanced setups, you can configure multiple agents within the same deployment, each with its own model, accessible views, rules, and certified queries.
Multi-agent is useful when:
A multi-agent setup introduces one new concept on top of the single-agent model: spaces.
This means you choose a space's boundary based on what context should be shared. Two agents serving the same team usually live in one space; agents serving different domains (Sales vs. Marketing) live in different spaces so their context stays separate.
flowchart LR
classDef deployment fill:#4f46e5,stroke:#3730a3,color:#fff
classDef space fill:#e0e7ff,stroke:#6366f1,color:#1e1b4b
classDef agent fill:#10b981,stroke:#047857,color:#fff
classDef resource fill:#fef3c7,stroke:#d97706,color:#78350f
D[Deployment]:::deployment
SA[Space
sales-analytics]:::space
SM[Space
marketing-analytics]:::space
SAR[Rules]:::resource
SAC[Certified queries]:::resource
SAM[Memories]:::resource
A1[Agent
sales-assistant]:::agent
A2[Agent
sales-reporter]:::agent
SMR[Rules]:::resource
SMC[Certified queries]:::resource
SMM[Memories]:::resource
A3[Agent
marketing-analyst]:::agent
D -->|uses| SA
D -->|uses| SM
SA --- SAR
SA --- SAC
SA --- SAM
SA --> A1
SA --> A2
SM --- SMR
SM --- SMC
SM --- SMM
SM --> A3
In the single-agent setup, there is an implicit auto space that holds all rules, certified queries, and memories — you don't need to think about it. In a multi-agent setup, you define spaces explicitly and attach rules and certified queries to specific spaces.
The agents/ file structure is the same. What's different is how agents/config.yml is shaped:
name and an optional description, in addition to the standard agent properties (llm, runtime, accessible_views, memory_mode, etc.).spaces array defines the contexts agents operate in. Each space gets a unique name.space property in the frontmatter of each rule or certified query Markdown file to attach it to a specific space.Replace the flat root-level agent properties with an agents array:
# agents/config.yml
agents:
- name: sales-assistant # Required
description: "AI assistant for sales analytics"
space: sales-analytics # Required: reference to a space
llm: claude_4_6_sonnet
accessible_views:
- orders_view
- customers_view
memory_mode: user
- name: marketing-analyst # Required
description: "AI assistant for marketing analytics"
space: marketing-analytics # Required
llm: gpt_5
The properties available on each agent are the same as in the single-agent setup, plus:
| Property | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Unique identifier for the agent. |
description | string | No | Human-readable description. |
space | string | Yes | Name of the space this agent belongs to. |
A space is the context an agent operates in. Spaces own the rules, certified queries, and memories that the agents inside them share. Define spaces alongside agents:
# agents/config.yml
spaces:
- name: sales-analytics # Required
description: "Space for sales team analytics and reporting"
- name: marketing-analytics # Required
description: "Space for marketing team analytics"
| Property | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Unique identifier for the space. |
description | string | No | Human-readable description. |
Each agent must reference exactly one space via its space property. Multiple agents can share the same space and inherit its rules, certified queries, and memories.
A space or agent declared in agents/config.yml needs a matching record in Cube before users can chat with it. Cube creates those records from your config — that step is reconciliation:
Reconciliation only creates missing spaces and agents, so you need it only when an entry has no record available to the deployment yet: after adding a name to the config, and on each deployment you reconcile for the first time — an agent belongs to one deployment, as does a space created per deployment, while a global space counts as created everywhere. Agent behavior — llm, description, accessible_views, memory_mode, rules, certified queries — is read from the agents/ directory of the deployment's data model and takes effect without reconciling. The implicit auto space and agent of the single-agent setup are never listed as pending.
An agent's space is the exception: the link is made when the agent is created, so changing it in YAML doesn't move an existing agent. The agent's page flags the mismatch between the space its config names and the space it is linked to. If the newly named space has no record yet, it appears under Pending Configurations, and Create All creates it and moves the agent onto it in the same action. If that space is already available to the deployment, nothing about the agent is pending and Create All won't move it — delete the agent so its config reads as pending again, then Create All recreates it in the space the config names. The recreated agent is a new agent, so chats from before the delete don't carry over to it.
Spaces live at the account level, so one space can be used by agents in more than one deployment. When a space is created, you choose its scope:
You pick the scope when you reconcile: the Create All panel's Create Spaces control offers Global and Per deployment. You can change the scope of an existing space later on its page, under Agents → Spaces.
Spaces created per deployment are named after the deployment, for example Product (production) and Product (staging). Only the displayed name changes — the space stays linked to the spaces: entry it was created from, so the YAML entry keeps matching.
Choose per-deployment scope when the same spaces: entry is declared in several deployments — typically development, staging, and production fed from branches of one data model — and you don't want them sharing what the space stores.
Spaces created before this option existed have no scope stored. Cube infers the deployment they belong to from the agents linked to them, and the Spaces list shows them as Not scoped. Set the scope explicitly on the space page to make it definite.
Scope never changes where configuration comes from. Agents always belong to a single deployment, and the spaces: and agents: entries, rules, and certified queries that shape an agent are read from the agents/ directory of the data model of that deployment, on that deployment's branch. A global space does not merge the configuration of the deployments that use it.
What a global space shares is storage: the space itself and the data held against it — memories in particular. Two deployments using the same global space read and write the same memories, while each of them still applies its own agents/ configuration.
In the single-agent setup, rules and certified queries belong to the implicit auto space. In a multi-agent setup, you must attach each rule and certified query to a specific space using the space property in the Markdown frontmatter:
<!-- agents/rules/fiscal-year.md -->
---
space: sales-analytics
type: always
---
Always use fiscal year starting April 1st when analyzing dates.
<!-- agents/certified_queries/quarterly-revenue.md -->
---
space: sales-analytics
description: "Apply when the user asks about quarterly revenue"
user_request: "What is the revenue by quarter?"
---
SELECT
DATE_TRUNC('quarter', order_date) AS quarter,
SUM(amount) AS revenue
FROM orders
WHERE status != 'cancelled'
GROUP BY 1
ORDER BY 1
You can also organize rules and certified queries into space-named subdirectories. Files placed under agents/rules/<space-name>/ or agents/certified_queries/<space-name>/ are attached to that space automatically — no space frontmatter required.
# agents/config.yml
spaces:
- name: sales-analytics
description: "Space for sales team analytics and reporting"
- name: marketing-analytics
description: "Space for marketing team analytics"
agents:
- name: sales-assistant
description: "AI assistant for sales analytics and reporting"
space: sales-analytics
llm: claude_4_6_sonnet
accessible_views:
- orders_view
- customers_view
- products_view
memory_mode: user
- name: marketing-analyst
description: "AI assistant for marketing analytics"
space: marketing-analytics
llm: gpt_5
memory_mode: user