---
question: What can an ABI module hold?
kind: overview
---

# Modules

A module is the package the engine loads. The sidebar components, in this order:

- [Agents](/user-guide/build/agents/overview)
- [Apps](/user-guide/build/apps/overview)
- [Artifacts](/user-guide/build/artifacts/overview) (coming soon)
- [Assets](/architecture/overview#what-a-module-contains)
- [Integrations](/user-guide/build/integrations/overview)
- [Models](/user-guide/build/models/overview)
- [Ontologies](/user-guide/build/knowledge-graph/ontologies-overview)
- [Pipelines](/user-guide/build/pipelines/overview)
- [Skills](/architecture/overview#what-a-module-contains)
- [Tools](/architecture/overview#what-a-module-contains)
- [Workflows](/user-guide/build/workflows/overview)

Assets, skills, and tools are defined on Overview. They have no separate how-to yet.

`config.yaml` turns an in-engine module on. A remote module registers itself when its process starts.

<!-- matrix -->

| Kind | Command | Holds |
|---|---|---|
| Remote (default) | `abi new module <name>` | Agents, apps, jobs, in its own process |
| In-engine | `abi new module <name> --in-engine` | Those, plus workflows, pipelines, integrations, and ontologies |

## Create a module

`abi new module <name>` creates a remote module. Add `--in-engine` when the engine should load it. The long procedure, including the scaffold, is [Creating a Module](/user-guide/build/modules/creating-a-module).

## Configure a module

In-engine modules are the `modules:` list in `config.yaml`: `module`, `enabled`, and `config`. The engine loads them in dependency order. Remote modules are not in that list. See [Modules](/user-guide/get-started/configuration#modules) in the Configuration Reference.

## Add dependencies

`ModuleDependencies` names the other modules and the engine services this module uses. A Python package is `uv add` from the project root, not that list. Suffix a module name with `#soft` when it may be absent. See [Add dependencies](/user-guide/build/modules/add-dependencies).

## Test a module

`Engine().load(module_names=["my_module"])` checks that the module loads. A NATS project needs a broker, or an overlay that sets `nats: null`. See [Test a module](/user-guide/build/modules/test-a-module).

## Publish to the marketplace

Publishing is a pull request to `jupyter-naas/abi`. There is no separate publish command. Build the module in your project first (`abi new module <name> --in-engine`). See [Publishing to the Marketplace](/user-guide/build/modules/marketplace/marketplace-publish).

## Module jobs

A job runs on a schedule, an event, or a trigger. Declare it with `@job` and `Every` or `Cron`. Jobs need NATS. See [Module jobs](/user-guide/build/modules/module-jobs).

## Marketplace

The marketplace is the `naas-abi-marketplace` package: AI providers, application integrations, domain modules, and demos. See [Marketplace](/user-guide/build/modules/marketplace/marketplace-overview) and [Installing from the Marketplace](/user-guide/build/modules/marketplace/marketplace-install).

## Remote module

A remote module runs in its own process, imports `naas-abi-sdk` only, and offers agents, apps, and jobs. `abi new module <name>` creates one. Pipelines, workflows, integrations, and ontologies belong in an in-engine module. See [Build a Remote Module](/user-guide/build/sdk/build-a-remote-module).
