Channels¶
octomate.config.channels ¶
Channel tentacle configuration: one variant per platform, the streaming and chat-recap settings they share, and the OAuth clients a channel authorizes users with.
AgentModelConfig
pydantic-model
¶
Bases: BaseModel
An agent id paired with a model selection.
Fields:
-
agent(str) -
model(AgentRouteModelName | None)
Source code in octomate/config/channels.py
ChannelStreamConfig
pydantic-model
¶
Bases: BaseModel
How a channel paces streamed text: whether it streams, the flush cadence, the size bounds, and when a block folds.
Fields:
-
enabled(bool) -
flush_interval(float) -
min_chars(int) -
max_chars(int) -
fold_threshold(int)
Source code in octomate/config/channels.py
SlackStreamConfig
pydantic-model
¶
Bases: ChannelStreamConfig
Streaming defaults for Slack.
Fields:
-
max_chars(int) -
fold_threshold(int) -
enabled(bool) -
flush_interval(float) -
min_chars(int)
Source code in octomate/config/channels.py
LarkStreamConfig
pydantic-model
¶
Bases: ChannelStreamConfig
Streaming defaults for Lark.
Fields:
-
max_chars(int) -
fold_threshold(int) -
enabled(bool) -
flush_interval(float) -
min_chars(int)
Source code in octomate/config/channels.py
DiscordStreamConfig
pydantic-model
¶
Bases: ChannelStreamConfig
Streaming defaults for Discord.
Fields:
-
enabled(bool) -
min_chars(int) -
max_chars(int) -
fold_threshold(int) -
flush_interval(float)
Source code in octomate/config/channels.py
ChatRecapConfig
pydantic-model
¶
Bases: BaseModel
What a kick in a dm or a group chat is shown of the chat it woke in.
Those surfaces have no end, so a kick answers in a thread of its own and its model context starts empty every time. Without this the agent answers a chat it cannot see; with all of it, the context grows with the chat room's tenure, which is the thing the sub-thread exists to stop.
Fields:
-
messages(int) -
characters(int)
Source code in octomate/config/channels.py
messages
pydantic-field
¶
How many of the chat's recent messages go in front of the prompt. 0 shows none, which leaves a kick with only what woke it.
characters
pydantic-field
¶
Where each of those messages is cut. They are context, not the thing being answered, and one pasted log would otherwise be the whole slice. 0 leaves them whole.
ChannelConfig
pydantic-model
¶
Bases: BaseModel
What every channel tentacle's block declares: its type, the agents bound to it, and how it streams and recaps.
Fields:
-
type(str) -
mention_only(bool) -
enabled(bool) -
stream(ChannelStreamConfig) -
recap(ChatRecapConfig) -
agents(list[str]) -
mcp(bool)
Source code in octomate/config/channels.py
agents
pydantic-field
¶
Bound agent ids, in entry order. The first agent handles new conversations using its native default; every bound agent exposes its full model catalog.
mcp
pydantic-field
¶
Whether this channel offers its own MCP tools to the agents driven on it. The server is one per channel type, so the flag decides what a call may do here, never which tools an agent sees.
SlackOAuthClientConfig
pydantic-model
¶
Bases: BaseModel
The Slack app as the OAuth client its MCP server takes user tokens from.
Slack's MCP server acts as a person, never as the bot, so a channel that offers
it has each user authorize once; the app's client id and secret are what make
that authorization a confidential one. The app is the one app_id names, with
the "Slack Model Context Protocol (MCP) Server" feature switched on under
Agents in its settings.
Fields:
-
client_id(str) -
client_secret(SecretStr) -
callback_base_uri(AnyHttpUrl) -
scopes(list[SlackUserScope])
Source code in octomate/config/channels.py
client_id
pydantic-field
¶
The app's client id, from Basic Information → App Credentials.
client_secret
pydantic-field
¶
The app's client secret, from the same page. Prefer the environment over YAML.
callback_base_uri
pydantic-field
¶
Where the authorizing BROWSER reaches this deployment — not where the internet does, since Slack only redirects the user agent and never connects here. <this>/oauth/<channel key>/callback is the redirect URL the app must register under OAuth & Permissions, character for character.
scopes
pydantic-field
¶
The user-token scopes each person is asked for when they connect; the app lists the same under User Token Scopes. Fixed at authorization: widening this later means every connected user reconnects.
SlackChannelConfig
pydantic-model
¶
Bases: ChannelConfig
A Slack app, selected by type: slack.
Fields:
-
mention_only(bool) -
enabled(bool) -
recap(ChatRecapConfig) -
agents(list[str]) -
mcp(bool) -
type(Literal['slack']) -
app_id(str) -
bot_token(SecretStr) -
app_token(SecretStr) -
stream(SlackStreamConfig) -
oauth(SlackOAuthClientConfig | None)
Validators:
Source code in octomate/config/channels.py
oauth
pydantic-field
¶
The app as an OAuth client, which its own MCP tools need: they act as the person who authorized them, so every user connects once. Required when mcp is on.
validate_mcp_has_a_client
pydantic-validator
¶
Source code in octomate/config/channels.py
LarkOAuthClientConfig
pydantic-model
¶
Bases: BaseModel
User authorization through the channel's existing Feishu app credentials.
Fields:
-
callback_base_uri(AnyHttpUrl) -
scopes(list[str])
Source code in octomate/config/channels.py
callback_base_uri
pydantic-field
¶
Browser-reachable origin. Register
scopes
pydantic-field
¶
User permissions requested during authorization. Enable these in the app's User Identity Permissions; reconnect after widening them. The defaults allow get-user and token refresh.
LarkChannelConfig
pydantic-model
¶
Bases: ChannelConfig
A Lark app, selected by type: lark.
Fields:
-
mention_only(bool) -
enabled(bool) -
recap(ChatRecapConfig) -
agents(list[str]) -
mcp(bool) -
type(Literal['lark']) -
app_id(str) -
app_secret(SecretStr) -
stream(LarkStreamConfig) -
oauth(LarkOAuthClientConfig | None) -
mcp_tools(list[str])
Validators:
Source code in octomate/config/channels.py
oauth
pydantic-field
¶
User OAuth settings, using this channel's app_id and app_secret. Required when mcp is enabled; also allows profile linking from Trunkline.
mcp_tools
pydantic-field
¶
Feishu remote MCP tool names sent in X-Lark-MCP-Allowed-Tools. Their required user permissions must also be listed in oauth.scopes.
validate_mcp_has_a_client
pydantic-validator
¶
DiscordOAuthClientConfig
pydantic-model
¶
Bases: BaseModel
The Discord application's OAuth2 client, used to link profiles by identity.
Fields:
-
client_id(str) -
client_secret(SecretStr)
Source code in octomate/config/channels.py
DiscordChannelConfig
pydantic-model
¶
Bases: ChannelConfig
A Discord bot, selected by type: discord.
Fields:
-
mention_only(bool) -
enabled(bool) -
recap(ChatRecapConfig) -
agents(list[str]) -
mcp(bool) -
type(Literal['discord']) -
bot_token(SecretStr) -
stream(DiscordStreamConfig) -
oauth(DiscordOAuthClientConfig | None)
Source code in octomate/config/channels.py
oauth
pydantic-field
¶
Optional user authorization for profile linking; requests identify only.
TrunklineStreamConfig
pydantic-model
¶
Bases: ChannelStreamConfig
Streaming defaults for the console: every event straight through.
Fields:
-
min_chars(int) -
max_chars(int) -
fold_threshold(int) -
enabled(Literal[True]) -
flush_interval(float)
Source code in octomate/config/channels.py
TrunklineChannelConfig
pydantic-model
¶
Bases: ChannelConfig
The console has no group surface, so the base mention_only never
applies to it (there is nothing to be mentioned in). Configured agents set
entry order; every registered agent's models are available in the console.
Fields:
-
mention_only(bool) -
enabled(bool) -
recap(ChatRecapConfig) -
agents(list[str]) -
mcp(bool) -
type(Literal['trunkline']) -
static_dir(ConfigPath | None) -
stream(TrunklineStreamConfig)
Source code in octomate/config/channels.py
static_dir
pydantic-field
¶
Directory containing the compiled UI, served at /. Unset disables static serving without disabling the console API. Expands ~; relative paths use the server's working directory. The directory must exist.