---
question: Is a chat agent a class or a Settings record?
kind: overview
---

# Agents

An agent answers in a chat. It binds a chat model to a system prompt, to the tools it can call, and to the other agents it can hand the conversation to.

ABI has two kinds of agent. Both are listed in the workspace's Settings › Agents and in the chat's agent picker.

- **Engine agent.** A Python class in a module's `agents/` folder. The engine calls its `New()` class method at startup and exposes it at `POST /agents/{agent_name}/completion`. Only an engine agent has tools and sub-agents. Write one with [Create an agent](/user-guide/build/agents/creating-an-agent?via=python).
- **Workspace agent.** A record in one Nexus workspace: a name, a description, a system prompt and a model, behind `/api/agents`. It has no tools. Add one from Settings › Agents with [Create an agent](/user-guide/build/agents/creating-an-agent?via=web).

Agents published by a [remote module](/user-guide/build/sdk/build-a-remote-module) join the same list while their module is up. Settings › Agents belongs to the business workspace (members, chat), not to a code workspace.

<!-- matrix -->

## Key concepts

- **`New()`**: the class method the engine calls on each agent class directly under a module's `agents/` folder. It returns the agent with its model, tools and sub-agents.
- **`Agent` and `IntentAgent`**: the base classes, in `naas_abi_core.services.agent`. An `IntentAgent` also maps the user's message to a tool or a sub-agent with intents.
- **Model**: an engine agent asks the model registry for a chat model by canonical id, or takes the default one. See [Models](/user-guide/build/models/overview).
- **Tools**: the functions the model can call. See [Tools](/user-guide/build/tools/overview).
- **Sub-agents**: agents the parent can hand the conversation to, each through a `transfer_to_<name>` tool. See [Add sub-agents](/user-guide/build/agents/add-sub-agents).
- **Enabled**: the chat only offers a workspace's enabled agents. The workspace's `agents:` list in `config.yaml` decides which are on; a toggle in Settings › Agents wins over it.
- **Default agent**: `default_agent: "<module> <AgentClass>"` in `config.yaml`. `abi chat` opens it when given no arguments, and the Nexus chat uses it on Auto unless the workspace names its own.
- **Memory**: an agent built with `memory=None` keeps each conversation thread in the engine's agent memory. See [Persistent memory](/user-guide/build/agents/creating-an-agent#persistent-memory).
