Channel inbound API
Channel plugins should model receive paths with inbound and message nouns:
platform event -> inbound facts/context -> agent reply -> message deliveryUse openclaw/plugin-sdk/channel-inbound for inbound event normalization,
formatting, roots, and orchestration. Use
openclaw/plugin-sdk/channel-outbound for native
send, receipt, durable delivery, and live preview behavior.
Core Helpers
Section titled “Core Helpers”import { buildChannelInboundEventContext, runChannelInboundEvent, dispatchChannelInboundReply,} from "openclaw/plugin-sdk/channel-inbound";buildChannelInboundEventContext(...): project normalized channel facts into the prompt/session context. UsechannelContextto pass channel-owned sender/chat metadata through to plugin hookctx.channelContext; augmentPluginHookChannelSenderContextorPluginHookChannelChatContextfrom this subpath for channel-specific fields.runChannelInboundEvent(...): run ingest, classify, preflight, resolve, record, dispatch, and finalize for one inbound platform event.dispatchChannelInboundReply(...): record and dispatch an already assembled inbound reply with a delivery adapter.
The injected plugin runtime exposes the same high-level helpers under
runtime.channel.inbound.* for bundled/native channels that already receive the
runtime object.
await runtime.channel.inbound.run({ channel: "demo", accountId, raw: platformEvent, adapter: { ingest: normalizePlatformEvent, resolveTurn: resolveInboundReply, },});Compatibility dispatchers should assemble dispatchChannelInboundReply(...)
inputs and keep platform delivery in the delivery adapter. New send paths should
prefer message adapters and durable message helpers.
Migration
Section titled “Migration”The old runtime.channel.turn.* runtime aliases were removed. Use:
runtime.channel.inbound.run(...)for raw inbound events.runtime.channel.inbound.dispatchReply(...)for assembled reply contexts.runtime.channel.inbound.buildContext(...)for inbound context payloads.runtime.channel.inbound.runPreparedReply(...)only for channel-owned prepared dispatch paths that already assemble their own dispatch closure.
New plugin code should not introduce turn-named channel APIs. Keep model or
agent turn vocabulary inside agent/provider code; channel plugins use inbound,
message, delivery, and reply terms.