Skip to main content
Manage the plugins that extend your agents — list them, turn them on or off, reload them without restarting, and diagnose issues.

Quick Start

1

See what plugins exist

2

Turn one on

3

Load it into the running process


Commands


List Plugins

praisonai plugins list shows the real, unified registry — every plugin the runtime can load, with its source.
Output:
Every row’s Source is one of three real values: Show only enabled plugins:
Output as JSON (each entry has name, version, description, source, enabled, hooks):

Plugin Info

Show details for one plugin by name:
Output:
Use a real plugin name from praisonai plugins list — the argument is a single plugin name, not a category.

Enable Plugin

Enable one plugin. This writes to the config file the runtime actually reads — no separate JSON file.
Output prints the file it wrote to:
enable takes exactly one plugin name. To enable several, run the command once per plugin.

Where enable/disable write

Both enable and disable persist to the same file the runtime reads — the existing config, or .praisonai/config.yaml if none exists yet. Search order for the write target:
Writing a .toml config requires tomli_w. Without it the CLI fails fast with a remediation hint (Install tomli-w (pip install tomli-w), or convert the config to .praisonai/config.yaml.) rather than silently writing a .yaml sidecar the runtime would ignore.

The enabled: true edge case

If plugins.enabled is set to a bare true (all plugins enabled):
  • enable <name> is a no-op — it leaves “all enabled” intact.
  • disable <name> raises a ValueError with the remediation: set plugins.enabled to an explicit list of plugin names first, then disable individual plugins.

Disable Plugin

Disable one plugin:
Output:
disable also unloads a single-file plugin’s tools via unload_plugin(module_name) — not just its hooks. After disable, the plugin’s functions are gone from the registry for the rest of the run. Unload tracks only the tools that module contributed (via a pre-exec registry snapshot), so it never removes tools owned by another plugin or the core.

Reload Plugins

Pick up a newly-added or edited plugin without restarting the process.
reload unloads previously-loaded single-file plugins first (so an edited file is re-executed cleanly), then rediscovers everything and rewires enabled plugins into the runtime hook registry. Output:
If no single-file plugins were loaded (0 single-file), it prints a hint:
After praisonai plugins add <pkg> installs a plugin, run praisonai plugins reload to pick it up in the current process without a restart.

Add Plugin

Install a plugin package and verify it registered.
Full behaviour — installer selection, exit codes, and output shape — is documented on the plugins add page.

Doctor

praisonai plugins doctor diagnoses enabled plugins and reports three issue types — it does not verify third-party dependencies.
Output is a Rich table (Plugin / Status / Issues) with a summary:
When everything is healthy it prints All N plugins healthy instead.

Security: Project-Plugin Trust Gate

A single-file plugin in ./.praisonai/plugins/*.py can hook every lifecycle event and intercept every tool call, so running one from a cloned repo is gated by default.
  • Default: closed. A cloned repo cannot run arbitrary project plugin code.
  • User-global plugins in ~/.praisonai/plugins/ remain trusted.
  • pip / entry-point plugins remain trusted.
Open the gate with an environment variable:
Or in .praisonai/config.yaml:
The gate judges a plugin by where the file is located, not where a symlink points. A repository-controlled symlink at .praisonai/plugins/evil.py -> /tmp/evil.py still counts as project-local and stays gated.
See Plugins → Security: Project-Plugin Trust Gate for the full explanation and decision diagram.

Plugins

Write, load, and configure plugins

plugins add

Install a plugin package and verify it registered

Skills CLI

Manage agent skills

Config File

Turn plugins on from [plugins] in config