freshcrate
Skin:/
Home > Frameworks > slack-bolt

slack-bolt

The Bolt Framework for Python

Why this rank:Strong adoptionRelease freshnessHealthy release cadence

Description

<h1 align="center">Bolt <img src="https://docs.slack.dev/img/logos/bolt-py-logo.svg" alt="Bolt logo" width="32"/> for Python</h1> <p align="center"> <a href="https://pypi.org/project/slack-bolt/"> <img alt="PyPI - Version" src="https://img.shields.io/pypi/v/slack-bolt"></a> <a href="https://codecov.io/gh/slackapi/bolt-python"> <img alt="Codecov" src="https://img.shields.io/codecov/c/gh/slackapi/bolt-python"></a> <a href="https://pepy.tech/project/slack-bolt"> <img alt="Pepy Total Downloads" src="https://img.shields.io/pepy/dt/slack-bolt"></a> <br> <a href="https://pypi.org/project/slack-bolt/"> <img alt="Python Versions" src="https://img.shields.io/pypi/pyversions/slack-bolt.svg"></a> <a href="https://docs.slack.dev/tools/bolt-python/"> <img alt="Documentation" src="https://img.shields.io/badge/dev-docs-yellow"></a> </p> A Python framework to build Slack apps in a flash with the latest platform features. Read the [getting started guide](https://docs.slack.dev/tools/bolt-python/getting-started) and look at our [code examples](https://github.com/slackapi/bolt-python/tree/main/examples) to learn how to build apps using Bolt. The Python module documents are available [here](https://docs.slack.dev/tools/bolt-python/reference/). ## Setup ```bash # Python 3.7+ required python -m venv .venv source .venv/bin/activate pip install -U pip pip install slack_bolt ``` ## Creating an app Create a Bolt for Python app by calling a constructor, which is a top-level export. If you'd prefer, you can create an [async app](#creating-an-async-app). ```python import logging logging.basicConfig(level=logging.DEBUG) from slack_bolt import App # export SLACK_SIGNING_SECRET=*** # export SLACK_BOT_TOKEN=xoxb-*** app = App() # Add functionality here if __name__ == "__main__": app.start(3000) # POST http://localhost:3000/slack/events ``` ## Running an app ```bash export SLACK_SIGNING_SECRET=*** export SLACK_BOT_TOKEN=xoxb-*** python app.py # in another terminal ngrok http 3000 ``` ## Running a Socket Mode app If you use [Socket Mode](https://docs.slack.dev/apis/events-api/using-socket-mode/) for running your app, `SocketModeHandler` is available for it. ```python import os from slack_bolt import App from slack_bolt.adapter.socket_mode import SocketModeHandler # Install the Slack app and get xoxb- token in advance app = App(token=os.environ["SLACK_BOT_TOKEN"]) # Add functionality here if __name__ == "__main__": # Create an app-level token with connections:write scope handler = SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]) handler.start() ``` Run the app this way: ```bash export SLACK_APP_TOKEN=xapp-*** export SLACK_BOT_TOKEN=xoxb-*** python app.py # SLACK_SIGNING_SECRET is not required # Running ngrok is not required ``` ## Listening for events Apps typically react to a collection of incoming events, which can correspond to [Events API events](https://docs.slack.dev/apis/events-api/), [actions](https://docs.slack.dev/block-kit/#making-things-interactive), [shortcuts](https://docs.slack.dev/interactivity/implementing-shortcuts/), [slash commands](https://docs.slack.dev/interactivity/implementing-slash-commands/) or [options requests](https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select). For each type of request, there's a method to build a listener function. ```python # Listen for an action from a Block Kit element (buttons, select menus, date pickers, etc) app.action(action_id)(fn) # Listen for dialog submissions app.action({"callback_id": callbackId})(fn) # Listen for slash commands app.command(command_name)(fn) # Listen for an event from the Events API app.event(event_type)(fn) # Listen for a custom step execution from a workflow app.function(callback_id)(fn) # Convenience method to listen to only `message` events using a string or re.Pattern app.message([pattern ,])(fn) # Listen for options requests (from select menus with an external data source) app.options(action_id)(fn) # Listen for a global or message shortcuts app.shortcut(callback_id)(fn) # Listen for view_submission modal events app.view(callback_id)(fn) ``` The recommended way to use these methods are decorators: ```python @app.event(event_type) def handle_event(event): pass ``` ## Making things happen Most of the app's functionality will be inside listener functions (the `fn` parameters above). These functions are called with a set of arguments, each of which can be used in any order. If you'd like to access arguments off of a single object, you can use `args`, an [`slack_bolt.kwargs_injection.Args`](https://github.com/slackapi/bolt-python/blob/main/slack_bolt/kwargs_injection/args.py) instance that contains all available arguments for that event. | Argument | Description | | :---: | :--- | | `body` | Dictionary that contains the entire body of the request (superset of `payload`). Some accessory data is

Release History

VersionChangesUrgencyDate
1.28.0Imported from PyPI (1.28.0)Low4/21/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siMedium4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.28.0## What's Changed Bring magic to a conversation with `say_stream` for [streaming messages](https://docs.slack.dev/ai/developing-agents#streaming) and show loading status with `set_status`. Now available for `app.event` and `app.message` listeners: ```python @app.event("app_mention") def handle_mention(say_stream, set_status): set_status( status="Thinking...", loading_messages=["Waking up...", "Loading a witty response..."], ) stream = say_stream(buffer_siLow4/6/2026
v1.27.0<!-- Release notes generated using configuration in .github/release.yml at main --> ## What's Changed ### 🚀 Enhancements * feat: add has_been_called on `complete` & `fail` utility by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1390 * feat: add support for python 3.14 by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1397 ### 📚 Documentation * docs: add AI to quickstart by @haleychaas in https://github.com/slackapi/bolt-python/pull/1389 * docs: oLow11/13/2025
v1.26.0## AI-Enabled Features: Loading States, Text Streaming, and Feedback Buttons ### đŸŋ Preview https://github.com/user-attachments/assets/734dc6f9-a525-4535-aa89-66c607ab30f0 ### 📚 Changelog * https://docs.slack.dev/changelog/2025/10/7/chat-streaming ### ⚡ Getting Started Try the AI Agent Sample app to explore the AI-enabled features and existing Assistant helper: ```bash # Create a new AI Agent app $ slack create slack-ai-agent-app --template slack-samples/bolt-python-assisLow10/7/2025
v1.25.0## What's Changed ### Changes âš ī¸ * chore: remove 3.6 support by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1359 ### Docs 📖 * docs: updates gif and enterprise paths by @lukegalbraithrussell in https://github.com/slackapi/bolt-python/pull/1358 ### Maintenance đŸ—ī¸ * chore: move dependencies to pyproject.toml by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1360 * chore: version 1.25.0 by @WilliamBergamin in https://github.com/slackapi/bolt-pLow9/9/2025
v1.24.0## Changes ### Beta feature * feat: surface `ack_timeout` on the `function` handler by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1351 ### maintenance đŸ—ī¸ * health: increase CI coverage by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1276 * health: publish test results to code cov by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1282 * chore: remove 3.6 CI support by @WilliamBergamin in https://github.com/slackapi/bolt-pythoLow8/27/2025
v1.23.0## Changes ### fixes đŸ—ī¸ * fix: honor passing bolt logger in default web client installation by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1272 * test: fix broken tests due to wild card import by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1240 * fix: configure dependabot to group react deps by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1263 * test: add tests around the logger experience of bolt by @WilliamBergamin in httpsLow3/19/2025
v1.22.0## Changes * docs: Custom steps for JIRA tutorial. by @technically-tracy in https://github.com/slackapi/bolt-python/pull/1214 * feat: support python 3.13 by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1221 * docs(examples): update aws lambda tooling and iam role names by @zimeg in https://github.com/slackapi/bolt-python/pull/1224 * chore: improve maintainers docs by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1226 ### Dependabot * chore(deps): buLow12/18/2024
v1.21.3## Changes * #1187 Add title argument to SetSuggestedPrompts arguments - Thanks @seratch * #1216 Expose loop param on asyncio-based AsyncSocketModeHandler - Thanks @jantman * #1202 Socket Mode: Failed to connect (error: string argument without an encoding) w/ Azure App Service + aiohttp 3.11.2 - Thanks @seratch @jeremybeeman * #1199 Resolve Falcon 5.x type hint compatibility issue - Thanks @seratch ## References * Release Milestone: https://github.com/slackapi/bolt-python/milestoLow12/5/2024
v1.21.2## Changes * #1186 Improve metadata resolution timing in assistant app's say method - Thanks @seratch ## References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/88?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.21.1...v1.21.2Low10/25/2024
v1.21.1## Changes * #1184 Fix a bug where parsing assistant thread message event fails for beta feature enabled apps - Thanks @seratch ## References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/87?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.21.0...v1.21.1Low10/22/2024
v1.21.0## New Features ### Agents & Assistants A better [Agents & Assistants](https://api.slack.com/docs/apps/ai) support in Bolt is now available! While you already can implement your agents using `app.event(...)` listeners for `assistant_thread_started`, `assistant_thread_context_changed`, and `message` events, Bolt offers a simpler approach. You just need to create an `Assistant` instance, attach the needed event handlers to it, and then add the assistant to your `App` instance. ```pythLow10/17/2024
v1.20.1## Changes * bug: Fix #1131, async classes with "\_\_call\_\_" method are now accepted as middleware by @seratch in https://github.com/slackapi/bolt-python/pull/1132 * health: Use the mypy type analyzer by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1130 * feat: Add option for additional context to Sanic adapter handler by @RohanArepally in https://github.com/slackapi/bolt-python/pull/1135 * chore: naming of is_coroutine_function by @WilliamBergamin in https://github.comLow8/23/2024
v1.20.0## Changes ### Support for custom steps * feat: add custom step support by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1021 * docs: document custom step usage by @WilliamBergamin in https://github.com/slackapi/bolt-python/pull/1125 ### Documentation * docs: adds Docusaurus site by @lukegalbraithrussell in https://github.com/slackapi/bolt-python/pull/1113 * docs: sidebar reference link needs to be full URL by @lukegalbraithrussell in https://github.com/slackapi/boltLow8/14/2024
v1.19.1### Changes * #1104 Add bot|user_scopes to context.authorize_result set by SingleTeamAuthorization - Thanks @seratch ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/84?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.19.0...v1.19.1Low7/3/2024
v1.19.0## New Features ## WSGI Adapter https://github.com/slackapi/bolt-python/pull/1085 by @WilliamBergamin introduces an WSGI adapter, this allows bolt to be deployed in production without the need of a 3rd party WSGI compatible web framework. check out the examples in [examples/wsgi](https://github.com/slackapi/bolt-python/tree/main/examples/wsgi) ## Deprecate Steps From Apps https://github.com/slackapi/bolt-python/pull/1089 by @WilliamBergamin adds deprecation warnings to Steps from Apps Low6/10/2024
v1.19.0rc1Check https://github.com/slackapi/bolt-python/releases/tag/v1.19.0rc1 insteadLow1/25/2024
v1.18.1### Changes * #895 Add metadata to respond method - Thanks @seratch * #917 Add port parameter to web_app - Thanks @butsyk * #990 Fix #988 app.action listener should accept block_id-only constraints for bolt-js feature parity - Thanks @seratch @darkfoxprime Test code improvements: * #918 Fix #892 Codecov CI job for this project hangs - Thanks @vgnshiyer * #987 Fix SocketMode Test - Thanks @WilliamBergamin ### References * Release Milestone: https://github.com/slackapi/bolt-pytLow11/21/2023
v1.18.0### Changes * #891 Add url, team, user to AuthorizeResult properties (as optional ones) - Thanks @seratch ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/77?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.17.2...v1.18.0Low4/26/2023
v1.17.2### Changes * #885 Improve the default handler when raise_error_for_unhandled_request is true - Thanks @seratch ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/78?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.17.1...v1.17.2Low4/18/2023
v1.17.1### Changes * #882 Improve the default OAuth page renderers not to embed any params without escaping them - Thanks @seratch * Upgrade the slack-sdk package version to the latest - Thanks @seratch ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/76?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.17.0...v1.17.1Low4/13/2023
v1.17.0### New Features #### Updates on `AuthorizeResult` properties In v1.17, two new optional properties `bot_scopes` and `user_scopes` have been added to the `AuthorizeResult` / `AsyncAuthorizeResult` classes. These properties are used to associate specific scopes with `bot_token` and `user_token`, and the built-in InstallationStore automatically resolves them. * `bot_scopes`: the scopes associated with the `bot_token`; this can be absent when `bot_token` does not exist * `user_scopes`: thLow3/27/2023
v1.17.0rc4Check https://github.com/slackapi/bolt-python/releases/tag/v1.17.0 insteadLow3/21/2023
v1.17.0rc3Check https://github.com/slackapi/bolt-python/releases/tag/v1.17.0rc4 insteadLow3/15/2023
v1.17.0rc2Check https://github.com/slackapi/bolt-python/releases/tag/v1.17.0rc3 insteadLow3/13/2023
v1.17.0rc1Check https://github.com/slackapi/bolt-python/releases/tag/v1.17.0rc2 insteadLow3/13/2023
v1.16.4### Changes * #853 Add team param support to the /slack/install endpoint - Thanks @seratch * #851 Enable developers to pass fully implemented authorize along with installation_store - Thanks @seratch * #848 Enable developers to define app.message listener without args to capture all messages - Thanks @seratch * #852 Fix #850 by upgrading slack-sdk version to the latest - Thanks @seratch @garymalaysia ### References * Release Milestone: https://github.com/slackapi/bolt-python/milesLow3/10/2023
v1.16.3### Changes * #844 Fix #842 Cannot pass thread_ts to respond() utilit - Thanks @athlindemark @seratch #### Document Changes * #835 Add documention for injected 'args' param option - Thanks @YSaxon * #831 Added redirect url to readme - Thanks @Smyja ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/74?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.16.2...v1.16.3Low3/8/2023
v1.16.2### Changes * #825 Fix perform_bot_token_rotation call in AsyncInstallationStoreAuthorize - Thanks @ccaruceru ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/73?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.16.1...v1.16.2Low2/15/2023
v1.16.1### Changes * #794 Fix #793 by adding pyramid_request property to Bolt context - Thanks @dz0ny @seratch #### Document / Project Updates * #792 Adding Handling views on close documentation - Thanks @BrandonDalton * #762 Add documentation related to how to handle view_closed events - Thanks @filmaj ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/72?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.16.0...v1.16.1Low12/19/2022
v1.16.0### New Features #### ASGI Adapter Since this version, a new adapter that implements the [ASGI standard](https://asgi.readthedocs.io/en/latest/) is available. The novel adapter brings the following benefits to developers: * A builtin way to deploy HTTP apps to production using the ASGI standard * Allow bolt to be deployed on a web servers such as [daphne](https://github.com/django/daphne), [uvicorn](https://www.uvicorn.org/) and [hypercorn](https://pgjones.gitlab.io/hypercorn/index.htmLow12/8/2022
v1.15.5### Changes * #769 Fix #768 The client arg in a listener does not respect the singleton WebClient's retry_handlers - Thanks @seratch ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/70?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.15.4...v1.15.5Low11/17/2022
v1.15.4### Changes * #766 Fix #763 by improving the suggestion logging for view_closed patterns - Thanks @seratch @filmaj ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/69?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.15.3...v1.15.4Low11/17/2022
v1.15.3### Changes * #751 Add Python 3.11 to the supported language versions - Thanks @seratch * #758 Fix #754 by adding the async version of Tornado adapter - Thanks @seratch @castrapel * #748 Fix #747 by updating async SQLAlchemy OAuth example code - Thanks @ntarora * #752 Update code_cov upload method - Thanks @WilliamBergamin * #745 Remove 2020-resolver - Thanks @WilliamBergamin ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/68?closed=1 * All DifLow11/8/2022
v1.15.2### Changes * #741 Fix #738 Add more keyword args to say utility - Thanks @seratch @jacklowrie * #736 Add context 'user_id' extraction for 'message_changed' and 'message_deleted' events - Thanks @eddyg ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/67?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.15.1...v1.15.2Low10/18/2022
v1.15.1### Changes * #734 Fix context.team_id for view interactions in a Slack Connect channel - Thanks @seratch ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/64?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.15.0...v1.15.1Low10/6/2022
v1.15.0### Changes * #722 Fix #721 Passing a global dict object without channel prop can cause issues among requests - Thanks @seratch @gk-patel * #714 Change to create a WebClient per request for safety - Thanks @seratch * #726 #727 Bump Sanic, websockets packages to the latest major versions - Thanks @e-zim @JWZepf #### Document Changes * #725 Development release steps in guide - Thanks @WilliamBergamin * #690 Issue #660: Replace HTML entities before markdownify in docs - Thanks @acq688Low9/30/2022
v1.14.3### Changes * #689 Fix #688 kwarg injection does not work with decorated functions - Thanks @seratch @deppe #### Document Changes * #686 Add anchors and add contribute link to sidebar - Thanks @wongjas ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/63?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.14.2...v1.14.3Low7/26/2022
v1.14.2### Changes * #684 Fix #683 IgnoringSelfEvents middleware does not filter out Message sent via response_url - Thanks @seratch @deppe ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/62?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.14.1...v1.14.2Low7/21/2022
v1.14.1### Changes * #679 Allow lazy function invocation to target version/alias - Thanks @angrychimp * #662 Make the flake8 and black settings consistent - Thanks @seratch #### Document / Example Updates * #665 Fix #664 Django example installation store improvement - Thanks @seratch @DataGreed * #659 #661 Change AWS API Gateway to Lambda Function URL in documents - Thanks @Globart1337 ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/61?closed=1 Low7/12/2022
v1.14.0### Changes * #649 Add Google Cloud Functions adapter (ref #646) - Thanks @seratch * #647 Remove noqa comments and add `__all__` to `__init__.py` files - Thanks @seratch #### Document Updates * #648 Clarify "Setting up events" section - Thanks @hestonhoffman ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/56?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.13.2...v1.14.0Low5/18/2022
v1.13.2### Changes * #645 Fix #644 app.message listener does not handle events when a file is attached - Thanks @seratch ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/58?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.13.1...v1.13.2Low5/11/2022
v1.13.1### Changes * #640 Fix #639 is_enterprise_install does not exist in context object - Thanks @seratch @Sadisms * #636 Upgrade pytype version to the latest - Thanks @seratch * #638 Enable Flake8 in the CI builds - Thanks @seratch #### Document Updates * #621 Improve the OAuth Lambda deployment instructs - Thanks @srajiang * #623 Add Socket Mode healthcheck endpoint examples (#622) - Thanks @ImRohan01 @seratch * #633 Update AWS example documentation with correct AWS Lambda roles rLow4/29/2022
v1.13.0### Changes * #618 Fix #617 Respect the configuration of logger parameter across App/AsyncApp loggers - Thanks @seratch @brian-nguyen-bolt * #616 Fix type hint for event constraint to allow None subtypes - Thanks @alexrashed ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/55?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.12.0...v1.13.0Low3/18/2022
v1.12.0### Changes * #614 Add Falcon (ASGI) adapter - Thanks @sarayourfriend ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/51?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.11.6...v1.12.0Low3/17/2022
v1.11.6### Changes * #608 Fix #604 Respect the proxy_url in respond- Thanks @seratch @gpiks #### Document Updates * #609 Docs on handling options listeners with a filtering example - Thanks @filmaj ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/54?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.11.5...v1.11.6Low3/2/2022
v1.11.5### Changes * #602 Fix #601 Allow for host option for AsyncSlackAppServer start method - Thanks @seratch @ucgw * #588 Upgrade test dependencies & fix Falcon warning - Thanks @seratch #### Document Updates * #587 Update ngrok link to point to official guide - Thanks @misscoded ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/53?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.11.4...v1.11.5Low2/25/2022
v1.11.4### Changes * #586 Fix #584 Wrong user_token assigned to new user (affected versions: v1.11.2, v1.11.3) - Thanks @stantonius @seratch ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/52?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.11.3...v1.11.4Low2/1/2022
v1.11.3### Changes * #580 Fix #468 Replying with 0 results for a multi-select external option display previous successful results - Thanks @seratch @prziborowski * #581 Upgrade pytype version to the latest (2022.1.13) - Thanks @seratch * #578 Add more org-wide installation patterns to the SDK tests - Thanks @seratch ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/50?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.11.2...v1.11.3Low1/28/2022
v1.11.2### Changes * #576 Improve the built-in authorize for better support of user-scope only installations - Thanks @seratch * #577 Fix #561 matchers can be called even when app.message keyword does not match - Thanks @seratch @caddac ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/48?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.11.1...v1.11.2Low1/17/2022
v1.11.1### Changes * #555 Fix #552 Unable to use request body with lazy listener when socket mode is enabled - Thanks @seratch @JordanGibson ### References * Release Milestone: https://github.com/slackapi/bolt-python/milestone/49?closed=1 * All Diff: https://github.com/slackapi/bolt-python/compare/v1.11.0...v1.11.1Low12/24/2021

Dependencies & License Audit

Loading dependencies...

Similar Packages

schemathesisProperty-based testing framework for Open API and GraphQL based appsv4.21.1
ctranslate2Fast inference engine for Transformer modelsv4.8.0
cadwynProduction-ready community-driven modern Stripe-like API versioning in FastAPI7.0.0
tqdmFast, Extensible Progress Meterv4.68.1
inspect-aiFramework for large language model evaluationsmain@2026-06-05

More in Frameworks

spec_driven_developSpec-Driven Develop is a platform-agnostic AI agent skill that automates the pre-development workflow for large-scale complex tasks. It is not a framework, not a runtime, not a package manager — it is
deer-flowAn open-source long-horizon SuperAgent harness that researches, codes, and creates. With the help of sandboxes, memories, tools, skill, subagents and message gateway, it handles different levels of ta
simBuild, deploy, and orchestrate AI agents. Sim is the central intelligence layer for your AI workforce.
ctranslate2Fast inference engine for Transformer models