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, requests_conversation, conversation_granted):

Audit ungranted conversation plugins

Find third-party plugins that want conversation content but haven’t been granted it β€” their middleware silently no-ops until you add allow_conversation: true:
See Plugins β†’ Conversation-Content Capability Gate for how to grant access.

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.

Create Plugin

Scaffold a new single-file plugin in .praisonai/plugins/.
create is the command praisonai plugins discover’s empty-state hint prints β€” so the docs and the CLI now agree.

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.
doctor also reports Pure Mode. When PRAISONAI_NO_PLUGINS is truthy it prints a yellow banner: β€œExternal plugins are suppressed for this run (β€”pure / PRAISONAI_NO_PLUGINS).” Otherwise it prints a dim tip: β€œTip: run any command with β€”pure / β€”no-plugins (or PRAISONAI_NO_PLUGINS=1) for a clean, plugin-free baseline.”

Pure Mode / Suppress Plugins for One Run

Skip plugin discovery for a single invocation without touching persisted state. The --pure flag (long alias --no-plugins) is available on run, chat, and code:
Precedence: a PluginManager(disabled=True) constructor param wins over the env var. The flag is scoped by the @scopes_no_plugins decorator β€” PRAISONAI_NO_PLUGINS is set only for the run and restored on return, so it never leaks into a later in-process call and never mutates .praisonai/config.yaml. See Pure Mode for the full guide.

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.
A separate boundary controls whether a loaded plugin may read or rewrite prompts and responses β€” third-party plugins need allow_conversation: true. Audit ungranted plugins with the --json filter above, and see Plugins β†’ Conversation-Content Capability Gate.

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

Conversation-Content Gate

Grant third-party plugins access to prompts and responses