Extensions — Modular Plugin Ecosystem
91 extensions · 8 categories · One unified Plugin SDK
The Extensions directory is OpenClaw’s entire integration surface — every AI provider, messaging channel, search engine, voice service, and utility tool lives here as a self-contained plugin package discovered through definePluginEntry() and registered via OpenClawPluginApi.
Plugin SDK Hot Reload Manifest-Driven Sandboxed Imports
📚 What is the Extensions ecosystem?
Extensions are self-contained plugin packages that add capabilities to OpenClaw without modifying its core. Each extension declares its capabilities in a package.json manifest with an openclaw.extensions field and exports a single entry point that receives the OpenClawPluginApi registration object. The core never deep-imports extension internals — all communication flows through the Plugin SDK contract.
💡 Real-world analogy
Think of extensions like USB peripherals. Each device (extension) conforms to the USB spec (Plugin SDK), declares its device class (provider, channel, tool), and plugs into any compatible port. The OS (OpenClaw core) discovers capabilities through a standard descriptor (manifest) and routes traffic without knowing the device’s internal wiring. You can hot-plug new devices or remove them — the system keeps running.
Architecture
Extensions sit between external services and OpenClaw’s core gateway. The Plugin SDK provides the contract boundary — extensions import only from openclaw/plugin-sdk/* subpaths, never from src/** internals.
flowchart LR
subgraph External["External Services"]
LLM["LLM APIs"]
Chat["Chat Platforms"]
Search["Search Engines"]
Voice["Voice Services"]
end
subgraph Extensions["extensions/"]
Providers["Provider Extensions"]
Channels["Channel Extensions"]
SearchExt["Search Extensions"]
MediaExt["Media Extensions"]
Utils["Utility Extensions"]
end
subgraph Core["OpenClaw Core"]
SDK["Plugin SDK"]
Gateway["Gateway"]
Agent["Agent Engine"]
end
LLM --> Providers
Chat --> Channels
Search --> SearchExt
Voice --> MediaExt
Providers --> SDK
Channels --> SDK
SearchExt --> SDK
MediaExt --> SDK
Utils --> SDK
SDK --> Gateway
Gateway --> Agent
Extension Registration Flow
When OpenClaw boots, the plugin loader scans package.json manifests, resolves entry points, and calls each extension’s register(api) function. The registration API accumulates providers, channels, hooks, tools, and HTTP routes into the core registry.
sequenceDiagram
participant Loader as Plugin Loader
participant Manifest as package.json
participant Entry as Extension Entry
participant API as OpenClawPluginApi
participant Registry as Core Registry
Loader->>Manifest: Read openclaw.extensions[]
Loader->>Entry: import default export
Entry->>API: definePluginEntry({ id, register })
API->>Entry: register(api) callback
Entry->>API: api.registerProvider(...)
Entry->>API: api.registerChannel(...)
Entry->>API: api.registerHook(...)
API->>Registry: Accumulate registrations
Registry-->>Loader: Extension ready
🚶 Step-by-Step: Loading the OpenAI Extension
Follow a single extension from discovery to active registration:
- Discovery — Plugin loader reads
extensions/openai/package.jsonand finds"openclaw": {"extensions": ["./index.ts"]}. - Import — The loader dynamically imports the default export from
extensions/openai/index.ts. - Entry Definition —
definePluginEntry()wraps the metadata (id, name, description) and theregistercallback into aDefinedPluginEntryobject. - API Injection — Core creates an
OpenClawPluginApiinstance scoped to this extension, with config, logger, and runtime context. - Registration — The
register(api)callback fires. OpenAI registers a provider viaapi.registerProvider(), a speech provider viaapi.registerSpeechProvider(), and image generation viaapi.registerImageGenerationProvider(). - Auth Setup — Each provider declares auth methods (API key, OAuth) with env vars, flag names, and setup wizards.
- Model Catalog — The provider contributes models to the global catalog via
augmentModelCatalogandresolveDynamicModel. - Stream Wiring —
wrapStreamFnadds OpenAI-specific attribution headers to streaming requests. - Ready — The gateway can now route LLM requests to OpenAI through the registered provider interface.
Extension Categories
AI Providers
Provider extensions implement the ProviderPlugin interface, supplying model catalogs, auth methods, transport normalization, and streaming logic.
| Extension | Description | Key Features |
|---|---|---|
openai | OpenAI GPT, DALL-E, Whisper, TTS | Multi-capability (chat, image, speech, media) |
anthropic | Anthropic Claude models | Extended thinking, tool use |
google | Google Gemini family | Multimodal, long context |
ollama | Local Ollama server | Self-hosted, any GGUF model |
mistral | Mistral AI models | Function calling, code generation |
deepseek | DeepSeek reasoning models | Code & math specialization |
groq | Groq ultra-fast inference | Low-latency streaming |
xai | xAI Grok models | Real-time knowledge |
together | Together AI platform | Open-source model hosting |
nvidia | NVIDIA NIM endpoints | Enterprise GPU inference |
amazon-bedrock | AWS Bedrock multi-provider | Cross-provider routing |
cloudflare-ai-gateway | Cloudflare AI Gateway proxy | Edge caching, rate limiting |
copilot-proxy | GitHub Copilot proxy | Copilot API integration |
vllm | vLLM serving engine | Self-hosted, PagedAttention |
sglang | SGLang structured generation | Constrained decoding |
litellm | LiteLLM universal proxy | 100+ model providers |
Messaging Channels
Channel extensions implement the ChannelPlugin interface with adapters for messaging, outbound delivery, threading, security, and gateway HTTP methods.
| Extension | Platform | Capabilities |
|---|---|---|
telegram | Telegram Bot API | Groups, threads, reactions, inline buttons, stickers |
discord | Discord Bot | Threads, reactions, slash commands, embeds |
slack | Slack App | Threads, reactions, blocks, App Home |
whatsapp | WhatsApp Business API | Media, templates, read receipts |
signal | Signal Messenger | E2E encryption, groups, reactions |
imessage | iMessage (macOS) | Native macOS integration |
matrix | Matrix protocol | Federated, E2E encryption, rooms |
msteams | Microsoft Teams | Adaptive cards, channels, meetings |
irc | IRC protocol | Channels, DMs, multi-server |
line | LINE Messaging | Flex messages, rich menus |
feishu | Feishu / Lark | Interactive cards, groups |
nostr | Nostr protocol | Decentralized, relay-based |
twitch | Twitch Chat | IRC-based, emotes, commands |
googlechat | Google Chat | Spaces, threads, cards |
Search & Web
| Extension | Description |
|---|---|
brave | Brave Search API integration |
duckduckgo | DuckDuckGo instant answers and web search |
exa | Exa neural search with semantic retrieval |
tavily | Tavily AI-optimized search API |
searxng | SearXNG self-hosted meta-search |
perplexity | Perplexity search-augmented answers |
firecrawl | Firecrawl web scraping and crawling |
Media & Voice
| Extension | Description |
|---|---|
elevenlabs | ElevenLabs text-to-speech synthesis |
deepgram | Deepgram speech-to-text transcription |
fal | FAL.ai image and video generation |
voice-call | Real-time voice call handling |
speech-core | Core speech provider abstraction |
image-generation-core | Core image generation abstraction |
media-understanding-core | Core media analysis abstraction |
Utilities
| Extension | Description |
|---|---|
browser | Headless browser for web interaction |
diagnostics-otel | OpenTelemetry tracing and metrics |
diffs | Diff computation and display |
device-pair | Device pairing for mobile apps |
memory-core | Persistent memory abstraction layer |
memory-lancedb | LanceDB vector memory backend |
open-prose | Long-form writing assistant |
llm-task | LLM-powered task orchestration |
Shared Extension Contract
Every extension follows the same discovery and registration contract. The entry point exports a DefinedPluginEntry created by one of two helper functions depending on the extension type:
General Plugins — definePluginEntry()
// extensions/openai/index.ts
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { buildOpenAIProvider } from "./openai-provider.js";
import { buildOpenAISpeechProvider } from "./speech-provider.js";
import { buildOpenAIImageGenerationProvider } from "./image-generation-provider.js";
export default definePluginEntry({
id: "openai",
name: "OpenAI Provider",
description: "Bundled OpenAI provider plugins",
register(api) {
api.registerProvider(buildOpenAIProvider());
api.registerSpeechProvider(buildOpenAISpeechProvider());
api.registerImageGenerationProvider(buildOpenAIImageGenerationProvider());
api.registerCliBackend(buildOpenAICodexCliBackend());
},
});
Channel Plugins — defineChannelPluginEntry()
// extensions/telegram/index.ts
import type { ChannelPlugin } from "openclaw/plugin-sdk/core";
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/core";
import { telegramPlugin } from "./src/channel.js";
import { setTelegramRuntime } from "./src/runtime.js";
export default defineChannelPluginEntry({
id: "telegram",
name: "Telegram",
description: "Telegram channel plugin",
plugin: telegramPlugin as ChannelPlugin,
setRuntime: setTelegramRuntime,
});
Package Manifest
// extensions/openai/package.json (relevant fields)
{
"name": "@openclaw/openai-provider",
"version": "2026.4.1-beta.1",
"private": true,
"type": "module",
"openclaw": {
"extensions": ["./index.ts"]
}
}
Registration API
The OpenClawPluginApi object passed to register(api) exposes 20+ registration methods. Each method adds a capability to the core registry:
| Method | Purpose |
|---|---|
registerProvider | Register an LLM provider with auth, models, and streaming |
registerChannel | Register a messaging channel with adapters |
registerTool | Add an agent tool (function calling) |
registerHook | Listen to lifecycle events (30+ hook points) |
registerHttpRoute | Add custom HTTP endpoints to the gateway |
registerCliBackend | Add CLI interactive backend |
registerSpeechProvider | Add TTS/STT capabilities |
registerImageGenerationProvider | Add image generation |
registerMediaUnderstandingProvider | Add image/video/audio analysis |
registerWebSearchProvider | Add web search integration |
registerMemoryRuntime | Add persistent memory backend |
registerService | Add background services |
Configuration Reference
| Config Key | Type | Description |
|---|---|---|
openclaw.extensions | string[] | Entry point paths in package.json manifest |
envVars | string[] | Environment variables the extension reads (e.g., OPENAI_API_KEY) |
configSchema | PluginConfigSchema | JSON schema for extension-specific configuration |
reload.configPrefixes | string[] | Config key prefixes that trigger hot reload |
capabilities | ChannelCapabilities | Feature flags for channel extensions (polls, reactions, media, etc.) |
Deep-Dive Focus Pages
Extension Contract
The shared interface that all extensions implement — definePluginEntry(), manifest discovery, registration lifecycle, and SDK boundary rules.
- Plugin SDK imports
- Manifest schema
- Registration lifecycle
Provider Adapters
How AI provider extensions work — the ProviderPlugin interface, auth methods, model catalogs, transport normalization, and stream wrapping.
- ProviderPlugin interface
- Auth & model resolution
- Stream processing
Channel Extensions
How messaging channel extensions work — the ChannelPlugin interface, adapter pattern, capabilities, gateway integration, and security model.
- ChannelPlugin interface
- 10+ adapter types
- Gateway HTTP methods
Directory Map
Source tree for extensions/
extensions/
├── shared/ ← Common utilities (runtime, deferred, config helpers)
├── openai/ ← OpenAI provider (chat, image, speech, media)
├── anthropic/ ← Anthropic Claude provider
├── google/ ← Google Gemini provider
├── ollama/ ← Local Ollama server provider
├── mistral/ ← Mistral AI provider
├── deepseek/ ← DeepSeek reasoning provider
├── groq/ ← Groq fast inference provider
├── xai/ ← xAI Grok provider
├── together/ ← Together AI provider
├── nvidia/ ← NVIDIA NIM provider
├── amazon-bedrock/ ← AWS Bedrock multi-provider
├── telegram/ ← Telegram channel plugin
├── discord/ ← Discord channel plugin
├── slack/ ← Slack channel plugin
├── whatsapp/ ← WhatsApp channel plugin
├── signal/ ← Signal channel plugin
├── matrix/ ← Matrix channel plugin
├── brave/ ← Brave Search integration
├── duckduckgo/ ← DuckDuckGo search
├── elevenlabs/ ← ElevenLabs TTS
├── deepgram/ ← Deepgram STT
├── browser/ ← Headless browser tool
├── memory-core/ ← Memory abstraction layer
├── memory-lancedb/ ← LanceDB vector memory
├── diagnostics-otel/ ← OpenTelemetry instrumentation
├── speech-core/ ← Speech provider abstraction
├── image-generation-core/ ← Image generation abstraction
├── media-understanding-core/ ← Media analysis abstraction
└── AGENTS.md ← Extension boundary rules & contracts