qwen-code/docs/users/features/channels/plugins.md
qqqys 8517fa9d47
feat(web-shell): redesign Channel policy and workspace management (#8848)
* feat(web-shell): expose channel access policies

* test(cli): cover shared Channel management fields

* feat(web-shell): clarify channel policy controls

* feat(web-shell): select channel workspace

* feat(web-shell): redesign channel management

* fix(web-shell): align channel manager with shell tabs

* fix(web-shell): prioritize conversation settings

* fix(web-shell): preserve legacy channel defaults

* fix(channels): address management review blockers

* fix(channels): address editor review blockers

* fix(channels): preserve workspace action and route state

* fix(web-shell): prevent stale channel editor state

* fix(channels): preserve stored group settings

* fix(channels): preserve group behavior settings

* fix(web-shell): reset channel workspace UI state

* test(web-shell): assert restored channel scope

* fix(web-shell): preserve legacy channel scope

* fix(web-shell): preserve inherited channel defaults

* fix(channels): preserve compatible legacy settings

* fix(web-shell): keep workspace navigation available

* fix(channels): default new channels to pairing

---------

Co-authored-by: qqqys <266654365+qqqys@users.noreply.github.com>
2026-08-14 07:41:44 +00:00

4.4 KiB

Custom Channel Plugins

You can extend the channel system with custom platform adapters packaged as extensions. This lets you connect Qwen Code to any messaging platform, webhook, or custom transport.

How It Works

Channel plugins are loaded at startup from active extensions. When qwen channel start runs, it:

  1. Scans all enabled extensions for channels entries in their qwen-extension.json
  2. Dynamically imports each channel's entry point
  3. Registers the channel type so it can be referenced in settings.json
  4. Creates channel instances using the plugin's factory function

Your custom channel gets the full shared pipeline for free: sender gating, group policies, session routing, slash commands, crash recovery, and an agent bridge. Standalone qwen channel start currently supplies AcpBridge; plugin adapter code should depend on the adapter-facing ChannelAgentBridge contract. Existing TypeScript plugins with an explicit AcpBridge bridge parameter should migrate that annotation to ChannelAgentBridge; JavaScript plugins are unaffected at runtime.

Installing a Custom Channel

Install an extension that provides a channel plugin:

# From a local path (for development or private plugins)
qwen extensions install /path/to/my-channel-extension

# Or link it for development (changes are reflected immediately)
qwen extensions link /path/to/my-channel-extension

Configuring a Custom Channel

Add a channel entry to ~/.qwen/settings.json using the custom type provided by the extension:

{
  "channels": {
    "my-bot": {
      "type": "my-platform",
      "apiKey": "$MY_PLATFORM_API_KEY",
      "senderPolicy": "open",
      "cwd": "/path/to/project"
    }
  }
}

The type must match a channel type registered by an installed extension. Check the extension's documentation for which plugin-specific fields are required (e.g., apiKey, webhookUrl).

All standard channel options work with custom channels:

Option Description
senderPolicy allowlist, pairing, or open
allowedUsers Static allowlist of sender IDs
sessionScope user, chat_thread, or single; legacy thread remains compatible for existing configurations
cwd Working directory for the agent
instructions Prepended to the first message of each session
model Model override for the channel
groupPolicy disabled, allowlist, pairing, or open
dmPolicy open or disabled
groups Per-group settings

See Overview for details on each option.

Starting the Channel

# Start all channels including custom ones
qwen channel start

# Start just your custom channel
qwen channel start my-bot

What You Get for Free

Custom channels automatically support everything built-in channels do:

  • Sender policiesallowlist, pairing, and open access control
  • Group policies — Per-group settings with optional @mention gating
  • Session routing — Per-user, per-thread, or single shared sessions
  • DM and group pairing — Full pairing code flow for unknown users and groups
  • Slash commands/help, /clear, /status work out of the box
  • Custom instructions — Prepended to the first message in each session
  • Crash recovery — Automatic restart with session preservation
  • Per-session serialization — Messages are queued to prevent race conditions

Building Your Own Channel Plugin

Want to build a channel plugin for a new platform? See the Channel Plugin Developer Guide for the ChannelPlugin interface, the Envelope format, and extension points.