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

> **You are reading the v2.x docs (engine modules). New projects use v3.** [Read this page in v3](/capabilities/build/modules/overview) · [Migrate from 2.x to 3.0](/capabilities/upgrade/migrate-to-3)

# Modules

A module is the package the engine loads: a Python package under `src/` that imports `naas_abi_core`, listed under `modules:` in `config.yaml`. It runs inside the engine's process, and the engine discovers what it holds. The sidebar components, in this order:

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

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

<!-- matrix -->

## Create a module

The command depends on the ABI line the project runs:

| ABI line | Command | Where it writes |
|---|---|---|
| 2.x | `abi new module <name>`, run from `src/` | `<name>/` in the current folder |
| 3.x | `abi new module <name> --in-engine`, run from the project root | `src/<name>/` |

Both print the `modules:` entry to add to `config.yaml`. The scaffold, the module class and discovery are in [Creating a Module](/v2/capabilities/build/modules/creating-a-module).

## Configure a module

Modules are the `modules:` list in `config.yaml`: `module`, `enabled`, and `config`. The engine loads them in dependency order. See [Modules](/user-guide/get-started/configuration#marketplace-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](/v2/capabilities/build/modules/add-dependencies).

## Test a module

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

## Schedule work

On ABI 3.x in a NATS project, a module declares jobs: `@job` with `Every` or `Cron`, run by JetStream. See [Module jobs](/v2/capabilities/build/modules/module-jobs). On ABI 2.x, and on 3.x without NATS, scheduled work is a [Dagster orchestration](/v2/capabilities/build/applications/dagster) (legacy).

## 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. See [Publishing to the Marketplace](/v2/capabilities/build/modules/marketplace/marketplace-publish).

## Marketplace

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