Files
openclaw/docs/tools/plugin.md
pomelo dad68d319b Remove Qwen OAuth integration (qwen-portal-auth) (#52709)
* Remove Qwen OAuth integration (qwen-portal-auth)

Qwen OAuth via portal.qwen.ai is being deprecated by the Qwen team due
to traffic impact on their primary Qwen Code user base. Users should
migrate to the officially supported Model Studio (Alibaba Cloud Coding
Plan) provider instead.

Ref: https://github.com/openclaw/openclaw/issues/49557

- Delete extensions/qwen-portal-auth/ plugin entirely
- Remove qwen-portal from onboarding auth choices, provider aliases,
  auto-enable list, bundled plugin defaults, and pricing cache
- Remove Qwen CLI credential sync (external-cli-sync, cli-credentials)
- Remove QWEN_OAUTH_MARKER from model auth markers
- Update docs/providers/qwen.md to redirect to Model Studio
- Update model-providers docs (EN + zh-CN) to remove Qwen OAuth section
- Regenerate config and plugin-sdk baselines
- Update all affected tests

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* Clean up residual qwen-portal references after OAuth removal

* Add migration hint for deprecated qwen-portal OAuth provider

* fix: finish qwen oauth removal follow-up

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Frank Yang <frank.ekn@gmail.com>
2026-03-26 16:32:34 +08:00

10 KiB

summary, read_when, title, sidebarTitle
summary read_when title sidebarTitle
Install, configure, and manage OpenClaw plugins
Installing or configuring plugins
Understanding plugin discovery and load rules
Working with Codex/Claude-compatible plugin bundles
Plugins Install and Configure

Plugins

Plugins extend OpenClaw with new capabilities: channels, model providers, tools, skills, speech, image generation, and more. Some plugins are core (shipped with OpenClaw), others are external (published on npm by the community).

Quick start

```bash openclaw plugins list ``` ```bash # From npm openclaw plugins install @openclaw/voice-call
# From a local directory or archive
openclaw plugins install ./my-plugin
openclaw plugins install ./my-plugin.tgz
```
```bash openclaw gateway restart ```
Then configure under `plugins.entries.\<id\>.config` in your config file.

If you prefer chat-native control, enable commands.plugins: true and use:

/plugin install clawhub:@openclaw/voice-call
/plugin show voice-call
/plugin enable voice-call

The install path uses the same resolver as the CLI: local path/archive, explicit clawhub:<pkg>, or bare package spec (ClawHub first, then npm fallback).

Plugin types

OpenClaw recognizes two plugin formats:

Format How it works Examples
Native openclaw.plugin.json + runtime module; executes in-process Official plugins, community npm packages
Bundle Codex/Claude/Cursor-compatible layout; mapped to OpenClaw features .codex-plugin/, .claude-plugin/, .cursor-plugin/

Both show up under openclaw plugins list. See Plugin Bundles for bundle details.

If you are writing a native plugin, start with Building Plugins and the Plugin SDK Overview.

Official plugins

Installable (npm)

Plugin Package Docs
Matrix @openclaw/matrix Matrix
Microsoft Teams @openclaw/msteams Microsoft Teams
Nostr @openclaw/nostr Nostr
Voice Call @openclaw/voice-call Voice Call
Zalo @openclaw/zalo Zalo
Zalo Personal @openclaw/zalouser Zalo Personal

Core (shipped with OpenClaw)

`anthropic`, `byteplus`, `cloudflare-ai-gateway`, `github-copilot`, `google`, `huggingface`, `kilocode`, `kimi-coding`, `minimax`, `mistral`, `modelstudio`, `moonshot`, `nvidia`, `openai`, `opencode`, `opencode-go`, `openrouter`, `qianfan`, `synthetic`, `together`, `venice`, `vercel-ai-gateway`, `volcengine`, `xiaomi`, `zai` - `memory-core` — bundled memory search (default via `plugins.slots.memory`) - `memory-lancedb` — install-on-demand long-term memory with auto-recall/capture (set `plugins.slots.memory = "memory-lancedb"`) `elevenlabs`, `microsoft` - `copilot-proxy` — VS Code Copilot Proxy bridge (disabled by default)

Looking for third-party plugins? See Community Plugins.

Configuration

{
  plugins: {
    enabled: true,
    allow: ["voice-call"],
    deny: ["untrusted-plugin"],
    load: { paths: ["~/Projects/oss/voice-call-extension"] },
    entries: {
      "voice-call": { enabled: true, config: { provider: "twilio" } },
    },
  },
}
Field Description
enabled Master toggle (default: true)
allow Plugin allowlist (optional)
deny Plugin denylist (optional; deny wins)
load.paths Extra plugin files/directories
slots Exclusive slot selectors (e.g. memory, contextEngine)
entries.\<id\> Per-plugin toggles + config

Config changes require a gateway restart. If the Gateway is running with config watch + in-process restart enabled (the default openclaw gateway path), that restart is usually performed automatically a moment after the config write lands.

- **Disabled**: plugin exists but enablement rules turned it off. Config is preserved. - **Missing**: config references a plugin id that discovery did not find. - **Invalid**: plugin exists but its config does not match the declared schema.

Discovery and precedence

OpenClaw scans for plugins in this order (first match wins):

`plugins.load.paths` — explicit file or directory paths. `\/.openclaw/extensions/*.ts` and `\/.openclaw/extensions/*/index.ts`. `~/.openclaw/extensions/*.ts` and `~/.openclaw/extensions/*/index.ts`. Shipped with OpenClaw. Many are enabled by default (model providers, speech). Others require explicit enablement.

Enablement rules

  • plugins.enabled: false disables all plugins
  • plugins.deny always wins over allow
  • plugins.entries.\<id\>.enabled: false disables that plugin
  • Workspace-origin plugins are disabled by default (must be explicitly enabled)
  • Bundled plugins follow the built-in default-on set unless overridden
  • Exclusive slots can force-enable the selected plugin for that slot

Plugin slots (exclusive categories)

Some categories are exclusive (only one active at a time):

{
  plugins: {
    slots: {
      memory: "memory-core", // or "none" to disable
      contextEngine: "legacy", // or a plugin id
    },
  },
}
Slot What it controls Default
memory Active memory plugin memory-core
contextEngine Active context engine legacy (built-in)

CLI reference

openclaw plugins list                    # compact inventory
openclaw plugins inspect <id>            # deep detail
openclaw plugins inspect <id> --json     # machine-readable
openclaw plugins status                  # operational summary
openclaw plugins doctor                  # diagnostics

openclaw plugins install <package>        # install (ClawHub first, then npm)
openclaw plugins install clawhub:<pkg>   # install from ClawHub only
openclaw plugins install <path>          # install from local path
openclaw plugins install -l <path>       # link (no copy) for dev
openclaw plugins update <id>             # update one plugin
openclaw plugins update --all            # update all

openclaw plugins enable <id>
openclaw plugins disable <id>

See openclaw plugins CLI reference for full details.

Plugin API overview

Plugins export either a function or an object with register(api):

export default definePluginEntry({
  id: "my-plugin",
  name: "My Plugin",
  register(api) {
    api.registerProvider({
      /* ... */
    });
    api.registerTool({
      /* ... */
    });
    api.registerChannel({
      /* ... */
    });
  },
});

Common registration methods:

Method What it registers
registerProvider Model provider (LLM)
registerChannel Chat channel
registerTool Agent tool
registerHook / on(...) Lifecycle hooks
registerSpeechProvider Text-to-speech / STT
registerMediaUnderstandingProvider Image/audio analysis
registerImageGenerationProvider Image generation
registerWebSearchProvider Web search
registerHttpRoute HTTP endpoint
registerCommand / registerCli CLI commands
registerContextEngine Context engine
registerService Background service

Hook guard behavior for typed lifecycle hooks:

  • before_tool_call: { block: true } is terminal; lower-priority handlers are skipped.
  • before_tool_call: { block: false } is a no-op and does not clear an earlier block.
  • message_sending: { cancel: true } is terminal; lower-priority handlers are skipped.
  • message_sending: { cancel: false } is a no-op and does not clear an earlier cancel.

For full typed hook behavior, see SDK Overview.