Skip to main content
One command installs a plugin package and tells you exactly which plugins registered β€” or exits non-zero if nothing did. Previously a package could pip install cleanly yet register nothing β€” a silent failure. plugins add turns that into a surfaced non-zero exit.

Quick Start

1

Install a plugin

praisonai-my-plugin is a placeholder β€” replace it with a real pip requirement spec.
2

Upgrade an installed plugin

3

Verify without installing

--dry-run skips installation and reports whether anything new would register from what’s already installed.
After installing, run praisonai plugins reload to pick the plugin up in the current process without a restart β€” see Plugins CLI β†’ reload.

How It Works

The command snapshots registered plugins, installs, refreshes discovery, then reports the diff.
Built-in names can’t be taken over. PraisonAI’s registries subclass the base PluginRegistry, so since PR #4176 an entry point whose name (case-insensitive) matches a shipped built-in is skipped during discovery β€” it never appears in the β€œRegistered” diff, and a DEBUG line notes the collision. Ship your plugin under a distinct name, or override deliberately with a runtime register(...) call. See Plugin Precedence.

Options


How the Installer Is Chosen

The command pins installation to the interpreter running the CLI so the package lands where discovery will look β€” not in a nearby .venv that uv might auto-discover. --upgrade appends --upgrade to whichever command runs, then the package spec.

Exit Codes


Output Shape

A successful run prints a Rich table titled Registered N plugin(s) from <package>:
On --dry-run the title verb is Discovered instead of Registered.

Common Patterns

When uv is present, the package is pinned to the CLI interpreter so discovery finds it β€” not a nearby .venv.

Best Practices

A package can install cleanly yet register nothing. --dry-run exits non-zero when discovery finds nothing new, turning a silent failure into a failed check.
The default pins to the CLI interpreter so the plugin is discoverable by the same process. Reach for --global only when you deliberately want the system environment.
Pass a full spec like praisonai-my-plugin==1.2.3 so the installed version is deterministic across machines.
Run praisonai plugins list to see everything registered, not just what this command added.

Plugins

Write, load, and configure plugins

Message-Lifecycle Plugins

Override before_message, after_message, message_sent, and message_undelivered

Plugins CLI

List, enable, disable, reload, and diagnose plugins

tools add

Install a tool package and verify its tools

Tool Source Registry

Plug third-party tool sources via entry points

Tool Resolver

Single source of truth for loading tools