Channels
Select public ingress, delivery, attachments, and channel-owned audio.
Channels normalize provider events into turns and deliver replies. Omit
channels for no public ingress. Because the field is plural, select even one
complete channel plugin with a list:
channels: [photon]The Photon plugin owns its route, ingress verification, delivery, and
attachments. Its declared dependency installs and locks the audio provider
plugin, whose openrouter contribution supplies the default transcription.
Selecting a channel also activates tools contributed by that same plugin.
Optional connections and other capabilities remain explicit, so channel
selection does not expand unrelated network authority. Do not repeat Photon or
its audio dependency under capabilities:.
Multiple channels
Use a list when no channel needs an exception:
channels: [photon, slack]A sole channel becomes the default outbound channel. Multiple channels have no inferred outbound default. Use mapping form and mark at most one:
channels:
photon: {}
slack:
default: trueAudio
Photon, Slack, Teams, and Telegram transcribe inbound audio through OpenRouter by default. A2A and Discord do not. The channel package depends on the audio plugin, and the audio plugin owns provider kind, package, env contract, and option schema. Override or disable the default inside the channel:
channels:
photon:
audio: openai
slack:
audio: disabledConfigure a provider only when its defaults are insufficient:
channels:
telegram:
audio:
openrouter:
model: openai/whisper-large-v3
language: enThere is no top-level media or audio field. See
Declarative Reference: Audio options
for models, fallbacks, size limits, timeouts, endpoints, and credentials.
Typed exceptions
Every channel accepts default, audio, and hooks. Official channel plugins
add only these fields:
| Channel | Extra fields |
|---|---|
| Photon | None |
| Slack | None |
| Telegram | parseMode, disableWebPagePreview, replyToMessage, allowedUpdates |
| Teams | allowedTenants, allowedServiceUrls, stripMentions, typing |
| Discord | gateway, allowedGuilds, dmSupport, requireMention, allowedMentions |
| A2A | name, description, version, skills, provider, documentationUrl, iconUrl |
Routes, HTTP methods, transport, required environment, descriptions,
connection bindings, and metadata are channel-owned and rejected in
agent.md. The Declarative Reference: Channels
lists every type and default.
Custom channels
A local or published plugin may contribute a uniquely named channel. Select that contribution directly; there is no separate implementation override:
channels: [support]Attach plugin-owned lifecycle exports through the typed hook mapping:
channels:
photon:
hooks:
startTurn: company.photon-startProvider authors should use Authoring Plugins.