Overview
GAIA’s agent registry lets you extend the Agent UI with your own custom agents. Each agent lives in its own directory under~/.gaia/agents/ as a Python module. Once placed there, the agent appears automatically in the agent selector dropdown of the Gaia Agent UI.
Custom agents can have their own:
- Personality and instructions (system prompt)
- Tools (RAG, file search, shell, image generation, vision, plus your own
@toolfunctions) - Preferred models (override the server default)
- Conversation starters (suggestion chips in the UI)
- MCP servers (any Model Context Protocol server)
- Connectors (Google, GitHub, and more) — give your agent permission to read your real email, calendar, repos, etc.
Quick Start: Gaia Builder Agent
The fastest way to create an agent is to use the built-in Gaia Builder Agent.Click the + button
In the chat input footer, click the + icon (to the left of the agent picker).
On the welcome screen, click Build a Custom Agent Template.
Follow the prompts
The Builder (an alpha feature) greets you, asks what to name the agent and what it should do, and asks whether you want MCP support — then scaffolds a starter agent with a personality and conversation starters tailored to your description.
~/.gaia/agents/<your-agent-name>/agent.py — a tailored persona and conversation starters (plus MCP wiring if you asked for it). It’s a starting point you extend, not a turnkey agent: it won’t fetch data or perform complex tasks on its own until you add tools. Open the file to refine the instructions and add capabilities (see Python Agent below).
Python Agent
For full control — custom tools, built-in tool mixins, MCP servers, or complex logic — write a Python module.Directory structure
Minimal Python agent
| Method | Purpose |
|---|---|
_get_system_prompt() | Returns the system prompt string |
_create_console() | Returns an AgentConsole instance |
_register_tools() | Registers tools into _TOOL_REGISTRY |
Adding built-in tools
GAIA ships with ready-to-use tool mixins. To enable them, inherit the mixin and call itsregister_*_tools() method from _register_tools():
| Tool | Mixin | Register call |
|---|---|---|
rag | gaia.agents.tools.rag_tools.RAGToolsMixin | self.register_rag_tools() |
file_search | gaia.agents.tools.file_tools.FileSearchToolsMixin | self.register_file_search_tools() |
file_io | gaia.agents.tools.file_io_tools.FileIOToolsMixin | self.register_file_io_tools() |
shell | gaia.agents.tools.shell_tools.ShellToolsMixin | self.register_shell_tools() |
screenshot | gaia.agents.tools.screenshot_tools.ScreenshotToolsMixin | self.register_screenshot_tools() |
sd | gaia.sd.mixin.SDToolsMixin | self.register_sd_tools() |
vlm | gaia.vlm.mixin.VLMToolsMixin | self.register_vlm_tools() |
Overriding the default model (optional)
If your agent needs a specific model, setmodel_id in __init__():
agent.yaml next to agent.py with a models: list — the registry reads that list as an ordered preference. The sidecar only honours the models: key; any other top-level key is ignored.
Using GAIA connectors
If your agent needs to act on your behalf — read your inbox, list your calendar events, query GitHub, post to Slack, etc. — wire it up to a GAIA connector rather than asking users to paste API tokens into your code. A connector lets users:- Authenticate once in Settings → Connections (OAuth flow for Google-style providers, paste-an-API-key for MCP servers).
- Grant scopes per agent so each agent only sees the data it actually needs. The Agent UI surfaces this when a user first picks your agent.
- Trust that secrets stay in the OS keyring, never in plaintext files or env vars baked into your code.
REQUIRED_CONNECTORS on the
class, and call get_credential_sync(connector_id, agent_id, required_scopes=[...])
from inside a tool to get a usable token. The
connectors-demo agent
is a working reference for both oauth_pkce (Google) and mcp_server
(GitHub) connectors.
Read the connectors guide
Walks through what connectors are, how the OAuth + MCP flows differ,
per-agent grants, and a step-by-step setup for Google and GitHub.
Export and import agents
Custom agents can be packaged into a single.zip bundle and shared between machines, teammates, or environments. GAIA supports export and import from both the Agent UI and the CLI.
From the Agent UI
Open Settings → Custom Agents.- Export All — packages every custom agent under
~/.gaia/agents/into a single.zipfile and downloads it. Disabled when you have no custom agents. - Import — opens a file picker for a
.zipbundle and shows a confirmation dialog listing the agent IDs that will be installed. Imported agents register into the live registry; in most cases no restart is required.
From the CLI
What’s in the bundle
Each.zip contains a bundle.json manifest at the root and one directory per agent:
Security
Importing runs third-party code. A bundle’s
agent.py files execute inside your GAIA process. Both the CLI (gaia agent import without --yes) and the UI surface the agent IDs and require explicit confirmation before installing. Only import bundles from sources you trust.POST /api/agents/export and POST /api/agents/import) are localhost-only, CSRF-guarded with the X-Gaia-UI header, and disabled while a tunnel is active.
Examples
Zoo Agent — simple personality
Zoo Agent — simple personality
Research Agent — RAG + file search
Research Agent — RAG + file search
Code Review Agent — shell + file I/O
Code Review Agent — shell + file I/O
Troubleshooting
My agent doesn't appear in the selector
My agent doesn't appear in the selector
- Ensure the directory is under
~/.gaia/agents/<id>/and containsagent.py. - The directory name does not need to match the
AGENT_IDclass attribute, but it helps. - Check the server logs for warnings like
Failed to load agent from .... - If you created the agent manually (not via the Builder), restart the GAIA server — discovery runs at boot. Agents created via the Builder Agent are loaded immediately without a restart.
Agent fails to load
Agent fails to load
Check the server logs for load errors. Ensure
AGENT_ID, AGENT_NAME, and AGENT_DESCRIPTION are set as class attributes, and that the three required methods (_get_system_prompt, _create_console, _register_tools) are implemented.Imported agent doesn't appear or shows errors
Imported agent doesn't appear or shows errors
- The import response (UI status banner or CLI output) lists per-agent errors under
errors[]— check those first. - Confirm each agent directory in the bundle contains an
agent.pyat its root. Bundles missingagent.pyare rejected. - If
requires_restart: trueis reported, restart the GAIA server to pick up the new agent. - Bundles produced on a different GAIA version may reference imports that don’t exist locally — check the server logs for
ImportError.
MCP server not connecting
MCP server not connecting
- Ensure
npxor the MCP server command is installed and accessible in$PATH. - Check the server logs for
MCPconnection errors. - Test the MCP server standalone before adding it to your agent.
Agent uses wrong model
Agent uses wrong model
If your preferred model isn’t loaded on the Lemonade server, GAIA falls back to the server default. Run
gaia init to download additional models.Next Steps
Agent System SDK
Deep dive into the base Agent class, tool registry, and state machine
MCP Integration
Connect any MCP server to extend your agent with external tools
GAIA Connectors
Give your agent permission to read Gmail, GitHub, Slack, and more — without baking API keys into code
RAG SDK
Add document Q&A to your agent with the RAG SDK
Agent UI Guide
Learn about the GAIA Agent UI and how agents are surfaced there
Custom Installer
Ship your agent pre-loaded in a branded, signed GAIA installer