Overview
The elizaOS plugin system is a comprehensive extension mechanism that allows developers to add functionality to agents through a well-defined interface. Plugins are modular extensions that enhance AI agents with new capabilities, integrations, and behaviors.What Can Plugins Do?
- Platform Integrations: Connect to Discord, Telegram, Slack, Twitter, etc.
- LLM Providers: Integrate different AI models (OpenAI, Anthropic, Google, etc.)
- Blockchain/DeFi: Execute transactions, manage wallets, interact with smart contracts
- Data Sources: Connect to databases, APIs, or external services
- Custom Actions: Define new agent behaviors and capabilities
Guide: Create a Plugin
Plugin Interface
Every plugin must implement the corePlugin
interface, which defines the structure and capabilities of a plugin. The interface includes:
- Identity:
name
anddescription
to identify the plugin - Initialization: Optional
init
function for setup logic - Components: Arrays of
actions
,providers
,evaluators
, andservices
- Configuration: Settings and environment variables via
config
- Extensions: Optional database adapters, model handlers, routes, and event handlers
- Dependencies: Other plugins this plugin requires
- Priority: Loading order when multiple plugins are present
Plugin Initialization Lifecycle
Based on the runtime implementation, the initialization process follows a specific order:1. Plugin Registration (registerPlugin
method)
When a plugin is registered with the runtime:
- Validates plugin has a name
- Checks for duplicate plugins
- Adds to active plugins list
- Calls plugin’s
init()
method if present - Handles configuration errors gracefully
2. Component Registration Order
Components are registered in this specific sequence. For component details, see Plugin Components.Route Definitions for HTTP Endpoints
Plugins can expose HTTP endpoints through the route system:Event System Integration
Plugins can handle system events through the event system:Event Types
Standard events include:- World events: WORLD_JOINED, WORLD_CONNECTED, WORLD_LEFT
- Entity events: ENTITY_JOINED, ENTITY_LEFT, ENTITY_UPDATED
- Room events: ROOM_JOINED, ROOM_LEFT
- Message events: MESSAGE_RECEIVED, MESSAGE_SENT, MESSAGE_DELETED
- Voice events: VOICE_MESSAGE_RECEIVED, VOICE_MESSAGE_SENT
- Run events: RUN_STARTED, RUN_ENDED, RUN_TIMEOUT
- Action/Evaluator events: ACTION_STARTED/COMPLETED, EVALUATOR_STARTED/COMPLETED
- Model events: MODEL_USED
Plugin Event Handlers
Database Adapter Plugins
Plugins can provide database adapters for custom storage backends: The IDatabaseAdapter interface is extensive, including methods for:- Agents, Entities, Components
- Memories (with embeddings)
- Rooms, Participants
- Relationships
- Tasks
- Caching
- Logs
Plugin Priority System
Plugins can specify a priority to control loading order:- Higher priority plugins are loaded first
- Useful for plugins that provide fundamental services
- Model handlers use priority to determine which provider handles a model type
Plugin Dependencies
Plugins can declare dependencies on other plugins:Plugin Configuration
Plugins can accept configuration through multiple mechanisms:1. Environment Variables
2. Config Object
3. Runtime Settings
Settings can be accessed throughruntime.getSetting()
which provides a consistent interface to environment variables and character settings.
Conditional Plugin Loading
Plugins are often conditionally loaded based on environment variables:Core Plugins
elizaOS includes two essential core plugins that provide foundational functionality:Bootstrap Plugin
The core message handler and event system for elizaOS agents. Provides essential functionality for message processing, knowledge management, and basic agent operations. It includes:- 13 essential actions (REPLY, SEND_MESSAGE, etc.)
- Core providers (time, character, recent messages)
- Task service
- Event handlers
SQL Plugin
Database integration and management for elizaOS. Features:- Automatic schema migrations
- Multi-database support (PostgreSQL, PGLite)
- Sophisticated plugin architecture
Best Practices
- Plugin Dependencies: Use the
dependencies
array to specify required plugins - Conditional Loading: Check environment variables before loading platform-specific plugins
- Service Initialization: Handle missing API tokens gracefully in service constructors
- Event Handlers: Keep event handlers focused and delegate to specialized functions
- Error Handling: Use try-catch blocks and log errors appropriately
- Type Safety: Use TypeScript types from
@elizaos/core
for all plugin components - Priority Management: Set appropriate priorities for plugins that need to load early
- Configuration: Use
runtime.getSetting()
for consistent configuration access