Channels
A channel is how the outside world reaches your agents. Channels are sibling deployables to agents — they own their own platform, runtime, and routing policy. Agents stay pure computational units; channels declare which agents they dispatch to.
Available channel types
| Type | Status | Use case |
|---|---|---|
slack | Stable | Slack Socket Mode bot with self-serve runtime routing |
api | Stable | OpenAI-compatible HTTP endpoint (/v1/chat/completions, /v1/responses) |
chat | Stable | Browser-friendly chat UI |
Common shape
Every channel block has the same skeleton:
channels:
- name: <unique-name>
type: slack | api | chat
platform: <platform-ref>
secrets:
- {name: <ENV_VAR_NAME>}
# type-specific fields below
name— unique identifier; appears invystak status,vystak destroy --name, container labels.type— picks the channel plugin. New types are pluggable viavystak.channels.register(...).platform— samePlatformobject used by agents; controls where the channel container runs (Docker, Azure Container Apps).secrets— environment variables the channel container needs (bot tokens, signing secrets). Resolved from.envor vault depending on the platform.
Type-specific fields are documented per channel:
How channels and agents connect
The channel container is a separate process from your agent containers. They talk over the A2A transport — HTTP by default, NATS optionally — using the canonical name on the agent side and an entry in the channel's runtime route table.
┌─────────────────┐ A2A (HTTP/NATS) ┌─────────────────┐
│ channel │ ─────────────────► │ agent │
│ (slack/api/…) │ │ (langchain + │
│ │ │ FastAPI) │
└─────────────────┘ └─────────────────┘
▲
│ events from Slack / HTTP / etc.
The channel's agents: field declares which agents it can dispatch to. The exact dispatch logic depends on the channel:
- Slack routes per (team, channel, user) using a runtime SQLite store, populated via slash commands and a bot-invite welcome flow.
- API dispatches to the agent named in the request body's
modelfield (vystak/<agent-name>). - Chat mirrors the API channel with a UI.
Lifecycle
vystak apply # build + run the channel container alongside agents
vystak status # health + binding info
vystak destroy # stop and remove the channel container
# state volumes (e.g. Slack /data) preserved by default
For Slack, vystak destroy --delete-channel-data also removes the runtime bindings/preferences SQLite volume.