> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ag2.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# SlackAgent

If you need an agent to send messages to your Slack channel and/or retrieve Slack messages to action, [`SlackAgent`](/docs/api-reference/autogen/agents/experimental/SlackAgent) can help you.

<Tip>
  If you haven't had a chance to read about how AG2's Communication Platform agents and tools work, read the [overview](../overview) first.
</Tip>

## Installation

Install AG2 with the LLM model provider and Slack platform extra.

```bash theme={null}
pip install ag2[openai,commsagent-slack]
```

### Capabilities

[`SlackAgent`](/docs/api-reference/autogen/agents/experimental/SlackAgent) can:

* Construct and send a message to the configured channel. If a message is longer than the platforms permitted message length, they will split the message into multiple messages.
* Retrieve the latest X messages from a channel.
* Retrieve messages since a given date.
* Retrieve messages since a given message ID.
* Retrieve a message given its ID.

It will also automatically append Slack's messaging requirements to the system message:

* 40,000 character limit
* Markdown
* bold/italic/code
* emojis
* notification formats

This is on by default, but you can turn these off by setting `has_writing_instructions` to `False` when creating the agent.

### In-built Tools

The [`SlackAgent`](/docs/api-reference/autogen/agents/experimental/SlackAgent) has two in-built tools that it will call upon as it needs:

* [`SlackSendTool`](/docs/api-reference/autogen/tools/experimental/SlackSendTool)
* [`SlackRetrieveTool`](/docs/api-reference/autogen/tools/experimental/SlackRetrieveTool)

Find out more about these tools and how you can add them to your own AG2 agents in the [Slack Tools](/docs/user-guide/reference-tools/communication-platforms/slack) documentation.

### Platform configuration

Each agent is configured for a specific channel. This configuration is applied when you create the agent.

The [`SlackAgent`](/docs/api-reference/autogen/agents/experimental/SlackAgent) require authentication (OAuth token) and channel details in order to send/retrieve messages.

Here are the steps to get a token:

* Create an app, from scratch, at [https://api.slack.com/apps](https://api.slack.com/apps)
* In your app settings, go to Features > OAuth & Permissions:
  * Under “Bot Token Scopes”, add these permissions:
    * chat:write (to send messages)
    * channels:history
    * channels:read (to access channel info)
    * groups:read (for private channels)
    * im:read (for direct messages)
    * users:read (to get user info)
    * files:read (to access file attachments)
    * groups:history
    * im:history
    * mpim:history
* With your app setup, now install it in your workspace, using the “Install App” menu, to create an OAuth Token.

To get the ID for your channel:

* Open Slack in a browser
* Navigate to your channel
* Get the channel ID from the URL (e.g., …/C12345678)

Finally you need to add the bot to your channel:

* In Slack, go to your channel
* Type `/invite @YourBotName`, e.g. `/invite @ag2commsagent`

Now you should be good to go with your OAuth token, channel ID, and a bot on your channel ready to send and retrieve messages!

### Code example

Here's a simple example using the [`SlackAgent`](/docs/api-reference/autogen/agents/experimental/SlackAgent) that gets the current weather and sends a message to a Slack channel to give them a weather forecast.

```python theme={null}
# Agents are available in the autogen.agents namespace
from autogen import ConversableAgent, register_function, LLMConfig
from autogen.agents.experimental import SlackAgent

# For running the code in Jupyter, use nest_asyncio to allow nested event loops
#import nest_asyncio
#nest_asyncio.apply()

llm_config = LLMConfig(model="gpt-4o-mini", api_type="openai")

# Our Slack credentials
_bot_token = "xoxo..."  # OAuth token
_channel_id = "C1234567"  # ID of the Slack channel

# Our tool executor agent, which will run the tools once recommended by the slack_agent, no LLM required
executor_agent = ConversableAgent(
    name="executor_agent",
    human_input_mode="NEVER",
)

with llm_config:
    slack_agent = SlackAgent(
        name="slack_agent",
        bot_token=_bot_token,
        channel_id=_channel_id,
    )

# We get the registered tools and register them for execution with the tool executor
for tool in slack_agent.tools:
    tool.register_for_execution(executor_agent)

# Weather function
def get_weather():
    return "The weather today is 25 degrees Celsius and sunny, with a late storm."

# Register for LLM recommendation with our slack_agent and for execution with our executor_agent
register_function(
    get_weather,
    caller=slack_agent,
    executor=executor_agent,
    description="Get the current weather forecast",
)

# Ask the SlackAgent to get the weather (using the get_weather tool) and then send a message out (using its SlackSendTool tool)
executor_agent.initiate_chat(
    recipient=slack_agent,
    message="Get the latest weather forecast and send it to our Slack channel. Use some emojis to make it fun!",
    max_turns=3,
)

```

Here's the message it sent:

<img src="https://mintcdn.com/ag2ai/7LaI9NAtGf3xaVPO/docs/user-guide/reference-agents/assets/commsplatforms_slack_sentmsg.png?fit=max&auto=format&n=7LaI9NAtGf3xaVPO&q=85&s=11639ba6c2bd5670f580e0ca68b9689c" alt="Slack output" width="819" height="615" data-path="docs/user-guide/reference-agents/assets/commsplatforms_slack_sentmsg.png" />

<div className="edit-url-container">
  <a className="edit-url" href="https://github.com/ag2ai/ag2/edit/main/website/docs/user-guide/reference-agents/communication-platforms/slackagent.mdx" target="_blank"><Icon icon="pen" iconType="solid" size="13px" /> Edit this page</a>
</div>
