Visitar URL original
Channel | Chat SDK

Channel

A Channel represents a channel or conversation container that holds threads. Thread and Channel both extend the Postable interface, so they share members such as post(), state, and messages.

Get a channel via thread.channel or chat.channel():

// Navigate from a thread
const channel = thread.channel;

// Get directly by ID
const channel = chat.channel("slack:C123ABC");

Properties

PropTypeDescription
id?string
Channel ID, such as "slack:C123ABC" or "gchat:spaces/ABC123".
name?string | null
Channel name, such as "#general". `null` until `fetchMetadata()` is called.
adapter?Adapter
The platform adapter this channel belongs to.
isDM?boolean
Whether this is a direct message conversation.

Channel ID format

Channel IDs are derived from thread IDs by dropping the thread-specific part. By default, the channel ID is the first two colon-separated segments. Adapters can override this, as the Teams and Discord rows show:

PlatformThread IDChannel ID
Slackslack:C123ABC:1234567890.123456slack:C123ABC
Teamsteams:{base64(conversationId)}:{base64(serviceUrl)}[:{conversationType}]teams:{base64(conversationId)}:{base64(serviceUrl)}[:{conversationType}]
Google Chatgchat:spaces/ABC123:{base64}gchat:spaces/ABC123
Discorddiscord:{guildId}:{channelId}[:{threadId}]discord:{guildId}:{channelId}

messages

Iterate top-level channel messages, newest first. Thread replies are not included. Pages are fetched lazily as you iterate.

for await (const msg of channel.messages) {
  console.log(msg.text);
}

threads

Iterate threads in the channel, most recently active first. Returns lightweight ThreadSummary objects.

for await (const thread of channel.threads()) {
  console.log(thread.rootMessage.text, thread.replyCount);
}

ThreadSummary

PropTypeDescription
id?string
Full thread ID.
rootMessage?Message
The first message of the thread.
replyCount?number | undefined
Number of replies, when available.
lastReplyAt?Date | undefined
Timestamp of most recent reply.

post

Post a top-level message to the channel, outside any thread.

await channel.post("Hello channel!");
await channel.post({ markdown: "**Announcement**: New release!" });

Accepts the same message formats as thread.post(). See PostableMessage.

schedule

Schedule a top-level message to the channel for future delivery. Only the Slack adapter supports this. Other adapters throw NotImplementedError.

const scheduled = await channel.schedule("Weekly reminder: update your status!", {
  postAt: new Date("2026-03-10T09:00:00Z"),
});

// Cancel before it's sent
await scheduled.cancel();

Accepts the same message formats as channel.post(), except streams. See ScheduledMessage for the return type.

fetchMetadata

Fetch channel metadata from the platform.

const info = await channel.fetchMetadata();
console.log(info.name, info.memberCount);

ChannelInfo

PropTypeDescription
id?string
Channel ID.
name?string | undefined
Channel name.
isDM?boolean | undefined
Whether this is a direct message.
memberCount?number | undefined
Number of members in the channel.
metadata?Record<string, unknown>
Platform-specific metadata.

state

Store typed, per-channel state. Works the same as thread state, with a 30-day TTL.

const state = await channel.state;
await channel.setState({ lastAnnouncement: new Date().toISOString() });

postEphemeral

Post a message visible only to a specific user.

await channel.postEphemeral(userId, "Only you can see this", {
  fallbackToDM: true,
});

startTyping

Show a typing indicator. No-op on platforms that don't support it. On Slack, you can pass an optional status string to show a custom loading message. This requires the assistant:write scope.

await channel.startTyping();

// With custom status (Slack only)
await channel.startTyping("Searching documents...");

mentionUser

Get a platform-specific @-mention string.

await channel.post(`Hey ${channel.mentionUser(userId)}, check this out!`);

Read more