Plugins CLI
List, enable, disable, reload, and diagnose agent plugins
Manage the plugins that extend your agents β list them, turn them on or off, reload them without restarting, and diagnose issues.
Quick Start
- See what plugins exist
bash praisonai plugins list - Turn one on
bash praisonai plugins enable pii_guardrail - Load it into the running process
bash praisonai plugins reload
Commands
praisonai plugins <command> [OPTIONS]| Command | Description |
|---|---|
list | List every discoverable plugin with its source |
create | Create a new single-file plugin scaffold in .praisonai/plugins/ |
add | Install a plugin package and verify it registered |
info | Show details for one plugin |
enable | Enable a plugin (writes to the config the runtime reads) |
disable | Disable a plugin and unload its tools |
reload | Rediscover and rewire plugins without restarting |
doctor | Diagnose plugin issues |
List Plugins
praisonai plugins list shows the real, unified registry β every plugin the runtime can load, with its source.
praisonai plugins listOutput:
Plugins (3 available)
ββββββββββββββββββ³ββββββββββββββββββββββββ³βββββββββββ³ββββββββββββββββββββββββ
β Name β Source β Status β Description β
β‘ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β cli_backendβ¦ β entry_point:praisoβ¦ β enabled β Traces CLI backendβ¦ β
β pii_guardrail β single_file β disabled β Redacts PII fields β
β logging β registered β enabled β Logs lifecycle events β
ββββββββββββββββββ΄ββββββββββββββββββββββββ΄βββββββββββ΄ββββββββββββββββββββββββEvery row’s Source is one of three real values:
| Source | Where it comes from |
|---|---|
entry_point:<dist> | A pip package registering in the praisonai.plugins group |
registered | A Plugin instance held by the PluginManager |
single_file | A .py file discovered on disk in .praisonai/plugins/ or ~/.praisonai/plugins/ |
Show only enabled plugins:
praisonai plugins list --enabledOutput as JSON (each entry has name, version, description, source, enabled, hooks, requests_conversation, conversation_granted):
praisonai plugins list --json| Field | Type | Meaning |
|---|---|---|
requests_conversation | bool or null | true if the plugin declares a conversation-content hook (before_llm, after_llm, before_agent, after_agent, message_*). null for an entry-point plugin not yet loaded β its hooks are unknown without executing it, which the runtime deliberately avoids. |
conversation_granted | bool | true if the plugin is first-party (bundled) or has allow_conversation: true in its config block. |
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:
praisonai plugins list --json | jq '.[] | select(.requests_conversation == true and .conversation_granted == false)'See Plugins β Conversation-Content Capability Gate for how to grant access.
Plugin Info
Show details for one plugin by name:
praisonai plugins info pii_guardrailOutput:
pii_guardrail
ID: pii_guardrail
Source: single_file
Status: disabled
Description: Redacts PII fieldsEnable Plugin
Enable one plugin. This writes to the config file the runtime actually reads β no separate JSON file.
praisonai plugins enable pii_guardrailOutput prints the file it wrote to:
Plugin enabled: pii_guardrail (.praisonai/config.yaml)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:
1. .praisonai/config.toml β .praisonai/config.yaml (project-local)
2. praisonai.toml β praisonai.yaml (project root)
3. ~/.praisonai/config.toml β ~/.praisonai/config.yaml (user global)
4. (none found) β .praisonai/config.yaml (default)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 aValueErrorwith the remediation: setplugins.enabledto an explicit list of plugin names first, then disable individual plugins.
Disable Plugin
Disable one plugin:
praisonai plugins disable pii_guardrailOutput:
Plugin disabled: pii_guardrail (.praisonai/config.yaml)Reload Plugins
Pick up a newly-added or edited plugin without restarting the process.
praisonai plugins reloadreload 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:
Reloaded plugins: 2 single-file, 1 entry-point, 3 hook(s) wiredIf no single-file plugins were loaded (0 single-file), it prints a hint:
No single-file plugins were loaded. Set PRAISONAI_ALLOW_PLUGIN_DISCOVERY=true
(and PRAISONAI_ALLOW_PROJECT_PLUGINS=true for project-local plugins) to load them.Add Plugin
Install a plugin package and verify it registered.
praisonai plugins add <pkg> [--dry-run] [--upgrade|-U] [--global]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/.
praisonai plugins create <name>Doctor
praisonai plugins doctor diagnoses enabled plugins and reports three issue types. It does not verify third-party packages your plugin needs, but PraisonAI enforces any praisonaiagents specifier in a plugin’s dependencies at load time β see Plugins β Core compatibility.
praisonai plugins doctor| Issue | Meaning |
|---|---|
blocked: set PRAISONAI_ALLOW_PROJECT_PLUGINS=true | A single_file plugin is enabled but the project-plugin trust gate is closed |
no hooks wired | A registered plugin exposes no hooks (it may still provide tools) |
not loaded (hooks import on enable) | An entry_point plugin is present but not yet loaded β its hooks import when enabled |
Output is a Rich table (Plugin / Status / Issues) with a summary:
Plugin Health Check
ββββββββββββββββββ³βββββββββββββ³ββββββββββββββββββββββββββββββββββββββββββββββββ
β Plugin β Status β Issues β
β‘ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ©
β pii_guardrail β β Issues β blocked: set PRAISONAI_ALLOW_PROJECT_PLUGINSβ¦ β
β logging β β OK β - β
ββββββββββββββββββ΄βββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββ
Found 1 issue(s)When everything is healthy it prints All N plugins healthy instead.
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:
–pure flag
praisonai run --pure "Summarise this file"
praisonai chat --no-pluginsPRAISONAI_NO_PLUGINS
export PRAISONAI_NO_PLUGINS=1
praisonai chatPrecedence: 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:
export PRAISONAI_ALLOW_PROJECT_PLUGINS=trueOr in .praisonai/config.yaml:
plugins:
allow_project_plugins: trueSee Plugins β Security: Project-Plugin Trust Gate for the full explanation and decision diagram.