From 420ec6bc4376890f892b2f51c6b92cac71d4978f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 9 Sep 2025 20:00:34 +0000
Subject: [PATCH 01/15] chore(deps): update pytest-cov requirement from <7,>=3
to >=3,<8 (#1365)
---
requirements/testing_without_asyncio.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements/testing_without_asyncio.txt b/requirements/testing_without_asyncio.txt
index d10c4345e..0e493f0e2 100644
--- a/requirements/testing_without_asyncio.txt
+++ b/requirements/testing_without_asyncio.txt
@@ -1,3 +1,3 @@
# pip install -r requirements/testing_without_asyncio.txt
pytest>=6.2.5,<8.5 # https://github.com/tornadoweb/tornado/issues/3375
-pytest-cov>=3,<7
+pytest-cov>=3,<8
From 6f4fbf013ac796421347b6dc354c48577d6d8b6e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 9 Sep 2025 20:55:11 +0000
Subject: [PATCH 02/15] chore(deps): bump actions/setup-python from 5.6.0 to
6.0.0 (#1363)
---
.github/workflows/codecov.yml | 2 +-
.github/workflows/flake8.yml | 2 +-
.github/workflows/mypy.yml | 2 +-
.github/workflows/tests.yml | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml
index 391c135c6..0eaf192ba 100644
--- a/.github/workflows/codecov.yml
+++ b/.github/workflows/codecov.yml
@@ -22,7 +22,7 @@ jobs:
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
+ uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
diff --git a/.github/workflows/flake8.yml b/.github/workflows/flake8.yml
index 87f3496e1..ce6271c46 100644
--- a/.github/workflows/flake8.yml
+++ b/.github/workflows/flake8.yml
@@ -20,7 +20,7 @@ jobs:
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
+ uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ matrix.python-version }}
- name: Run flake8 verification
diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml
index f333756b5..fd9ae0203 100644
--- a/.github/workflows/mypy.yml
+++ b/.github/workflows/mypy.yml
@@ -20,7 +20,7 @@ jobs:
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
+ uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ matrix.python-version }}
- name: Run mypy verification
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 8ee9be411..8501cae36 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -31,7 +31,7 @@ jobs:
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
+ uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
with:
python-version: ${{ matrix.python-version }}
- name: Install synchronous dependencies
From f7114844960d3e4949c0d263510467f6256341fb Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 9 Sep 2025 21:07:47 +0000
Subject: [PATCH 03/15] chore(deps): bump actions/checkout from 4.2.2 to 5.0.0
(#1362)
---
.github/workflows/codecov.yml | 2 +-
.github/workflows/flake8.yml | 2 +-
.github/workflows/mypy.yml | 2 +-
.github/workflows/tests.yml | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml
index 0eaf192ba..01e6e6a5d 100644
--- a/.github/workflows/codecov.yml
+++ b/.github/workflows/codecov.yml
@@ -18,7 +18,7 @@ jobs:
env:
BOLT_PYTHON_CODECOV_RUNNING: "1"
steps:
- - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+ - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
diff --git a/.github/workflows/flake8.yml b/.github/workflows/flake8.yml
index ce6271c46..bd4e3dfd8 100644
--- a/.github/workflows/flake8.yml
+++ b/.github/workflows/flake8.yml
@@ -16,7 +16,7 @@ jobs:
permissions:
contents: read
steps:
- - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+ - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml
index fd9ae0203..1bf4abf0d 100644
--- a/.github/workflows/mypy.yml
+++ b/.github/workflows/mypy.yml
@@ -16,7 +16,7 @@ jobs:
permissions:
contents: read
steps:
- - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+ - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 8501cae36..e68997aef 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -27,7 +27,7 @@ jobs:
permissions:
contents: read
steps:
- - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+ - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
persist-credentials: false
- name: Set up Python ${{ matrix.python-version }}
From 055b320de04b394264cfb7361837af22b96dea0e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 9 Sep 2025 21:11:57 +0000
Subject: [PATCH 04/15] chore(deps): bump actions/stale from 9.1.0 to 10.0.0
(#1361)
---
.github/workflows/triage-issues.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/triage-issues.yml b/.github/workflows/triage-issues.yml
index b37c13422..5cb75bf93 100644
--- a/.github/workflows/triage-issues.yml
+++ b/.github/workflows/triage-issues.yml
@@ -16,7 +16,7 @@ jobs:
issues: write
pull-requests: write
steps:
- - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
+ - uses: actions/stale@3a9db7e6a41a89f618792c92c0e97cc736e1b13f # v10.0.0
with:
days-before-issue-stale: 30
days-before-issue-close: 10
From c512c6b08d70f830932031b7d87485e23e9d9fc3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 9 Sep 2025 21:16:01 +0000
Subject: [PATCH 05/15] chore(deps): bump codecov/codecov-action from 5.4.3 to
5.5.1 (#1364)
---
.github/workflows/codecov.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml
index 01e6e6a5d..7381117bb 100644
--- a/.github/workflows/codecov.yml
+++ b/.github/workflows/codecov.yml
@@ -36,7 +36,7 @@ jobs:
run: |
pytest --cov=./slack_bolt/ --cov-report=xml
- name: Upload coverage to Codecov
- uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
+ uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
with:
fail_ci_if_error: true
verbose: true
From 7cedaac2853d55d2329422c59a1c0bcec3b6ded0 Mon Sep 17 00:00:00 2001
From: Eden Zimbelman Refer to https://slack.dev/bolt-python/tutorial/getting-started for details. Refer to https://docs.slack.dev/tools/bolt-python/building-an-app for details. If you would like to build an OAuth app for enabling the app to run with multiple workspaces,
-refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.Classes
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))
- Refer to https://slack.dev/bolt-python/tutorial/getting-started for details.
+ Refer to https://docs.slack.dev/tools/bolt-python/building-an-app for details.
If you would like to build an OAuth app for enabling the app to run with multiple workspaces,
- refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.
+ refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app.
Args:
logger: The custom logger that can be used in this app.
@@ -629,7 +629,7 @@ Classes
# Pass a function to this method
app.middleware(middleware_func)
- Refer to https://slack.dev/bolt-python/concepts#global-middleware for details.
+ Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -675,7 +675,7 @@ Classes
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new step from app listener.
@@ -693,7 +693,7 @@ Classes
# Pass Step to set up listeners
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -710,7 +710,7 @@ Classes
warnings.warn(
(
"Steps from apps for legacy workflows are now deprecated. "
- "Use new custom steps: https://api.slack.com/automation/functions/custom-bolt"
+ "Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/"
),
category=DeprecationWarning,
)
@@ -787,7 +787,7 @@ Classes
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -825,7 +825,7 @@ Classes
# Pass a function to this method
app.message(":wave:")(say_hello)
- Refer to https://api.slack.com/events/message for details of `message` events.
+ Refer to https://docs.slack.dev/reference/events/message/ for details of `message` events.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -936,7 +936,7 @@ Classes
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -983,7 +983,7 @@ Classes
# Pass a function to this method
app.shortcut("open_modal")(open_modal)
- Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+ Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1051,9 +1051,9 @@ Classes
# Pass a function to this method
app.action("approve_button")(update_message)
- * Refer to https://api.slack.com/reference/interaction-payloads/block-actions for actions in `blocks`.
- * Refer to https://api.slack.com/legacy/message-buttons for actions in `attachments`.
- * Refer to https://api.slack.com/dialogs for actions in dialogs.
+ * Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`.
+ * Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`.
+ * Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1079,7 +1079,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -1096,7 +1096,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `interactive_message` action listener.
- Refer to https://api.slack.com/legacy/message-buttons for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1112,7 +1112,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1128,7 +1128,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_cancellation` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1169,7 +1169,7 @@ Classes
# Pass a function to this method
app.view("view_1")(handle_submission)
- Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1195,7 +1195,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1211,7 +1211,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_closed` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1252,8 +1252,8 @@ Classes
Refer to the following documents for details:
- * https://api.slack.com/reference/block-kit/block-elements#external_select
- * https://api.slack.com/reference/block-kit/block-elements#external_multi_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1293,7 +1293,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1443,9 +1443,9 @@ Classes
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))
-
loggerblocks.attachments.blocks.attachments.To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Registers a new interactive_message action listener.
-Refer to https://api.slack.com/legacy/message-buttons for details.
def block_action(self,
constraints: str | Pattern | Dict[str, str | Pattern],
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1740,7 +1740,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -1751,7 +1751,7 @@ Args
return __call__
Registers a new block_actions action listener.
-Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
def block_suggestion(self,
action_id: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1805,7 +1805,7 @@ Args
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1836,7 +1836,7 @@ Args
# Pass a function to this method
app.command("/echo")(repeat_text)
-Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Registers a new dialog_cancellation listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_submission(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1926,7 +1926,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1936,7 +1936,7 @@ Args
return __call__
Registers a new dialog_submission listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_suggestion(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1953,7 +1953,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1963,7 +1963,7 @@ Args
return __call__
Registers a new dialog_suggestion listener.
-Refer to https://api.slack.com/dialogs for details.
def dispatch(self,
req: BoltRequest) ‑> BoltResponse
@@ -2189,7 +2189,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -2221,7 +2221,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
-Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to https://api.slack.com/events/message for details of message events.
Refer to https://docs.slack.dev/reference/events/message/ for details of message events.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to https://slack.dev/bolt-python/concepts#global-middleware for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to the following documents for details:
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/Registers a new step from app listener.
Unlike others, this method doesn't behave as a decorator.
If you want to register a step from app by a decorator, use WorkflowStepBuilder's methods.
Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
For further information about WorkflowStep specific function arguments
such as configure, update, complete, and fail,
@@ -2921,7 +2921,7 @@
Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Registers a new view_closed listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details.
def view_submission(self,
constraints: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -3018,7 +3018,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3028,7 +3028,7 @@ Args
return __call__
Registers a new view_submission listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details.
Refer to https://slack.dev/bolt-python/concepts#async for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/async for details.
If you would like to build an OAuth app for enabling the app to run with multiple workspaces, -refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.
+refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app.loggerblocks.attachments.blocks.attachments.To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Registers a new interactive_message action listener.
-Refer to https://api.slack.com/legacy/message-buttons for details.
def block_action(self,
constraints: str | Pattern | Dict[str, str | Pattern],
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -1900,7 +1900,7 @@ Returns
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -1911,7 +1911,7 @@ Returns
return __call__
Registers a new block_actions action listener.
-Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
def block_suggestion(self,
action_id: str | Pattern,
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -1965,7 +1965,7 @@ Returns
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -1996,7 +1996,7 @@ Returns
# Pass a function to this method
app.command("/echo")(repeat_text)
-Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Registers a new dialog_submission listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_submission(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -2086,7 +2086,7 @@ Args
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -2096,7 +2096,7 @@ Args
return __call__
Registers a new dialog_submission listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_suggestion(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -2113,7 +2113,7 @@ Args
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -2123,7 +2123,7 @@ Args
return __call__
Registers a new dialog_suggestion listener.
-Refer to https://api.slack.com/dialogs for details.
def enable_token_revocation_listeners(self) ‑> None
@@ -2229,7 +2229,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -2261,7 +2261,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
-Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Refer to https://api.slack.com/events/message for details of message events.
Refer to https://docs.slack.dev/reference/events/message/ for details of message events.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Refer to the following documents for details:
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/Registers a new step from app listener.
Unlike others, this method doesn't behave as a decorator.
If you want to register a step from app by a decorator, use AsyncWorkflowStepBuilder's methods.
Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
For further information about AsyncWorkflowStep specific function arguments
such as configure, update, complete, and fail,
@@ -2978,7 +2978,7 @@
Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Registers a new view_closed listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details.
def view_submission(self,
constraints: str | Pattern,
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -3075,7 +3075,7 @@ Args
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3085,7 +3085,7 @@ Args
return __call__
Registers a new view_submission listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details.
def web_app(self, path: str = '/slack/events', port: int = 3000) ‑> aiohttp.web_app.Application
diff --git a/docs/reference/app/index.html b/docs/reference/app/index.html
index 857fb22c8..a46bc2e71 100644
--- a/docs/reference/app/index.html
+++ b/docs/reference/app/index.html
@@ -136,10 +136,10 @@ Classes
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))
- Refer to https://slack.dev/bolt-python/tutorial/getting-started for details.
+ Refer to https://docs.slack.dev/tools/bolt-python/building-an-app for details.
If you would like to build an OAuth app for enabling the app to run with multiple workspaces,
- refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.
+ refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app.
Args:
logger: The custom logger that can be used in this app.
@@ -648,7 +648,7 @@ Classes
# Pass a function to this method
app.middleware(middleware_func)
- Refer to https://slack.dev/bolt-python/concepts#global-middleware for details.
+ Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -694,7 +694,7 @@ Classes
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new step from app listener.
@@ -712,7 +712,7 @@ Classes
# Pass Step to set up listeners
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -729,7 +729,7 @@ Classes
warnings.warn(
(
"Steps from apps for legacy workflows are now deprecated. "
- "Use new custom steps: https://api.slack.com/automation/functions/custom-bolt"
+ "Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/"
),
category=DeprecationWarning,
)
@@ -806,7 +806,7 @@ Classes
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -844,7 +844,7 @@ Classes
# Pass a function to this method
app.message(":wave:")(say_hello)
- Refer to https://api.slack.com/events/message for details of `message` events.
+ Refer to https://docs.slack.dev/reference/events/message/ for details of `message` events.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -955,7 +955,7 @@ Classes
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1002,7 +1002,7 @@ Classes
# Pass a function to this method
app.shortcut("open_modal")(open_modal)
- Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+ Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1070,9 +1070,9 @@ Classes
# Pass a function to this method
app.action("approve_button")(update_message)
- * Refer to https://api.slack.com/reference/interaction-payloads/block-actions for actions in `blocks`.
- * Refer to https://api.slack.com/legacy/message-buttons for actions in `attachments`.
- * Refer to https://api.slack.com/dialogs for actions in dialogs.
+ * Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`.
+ * Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`.
+ * Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1098,7 +1098,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -1115,7 +1115,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `interactive_message` action listener.
- Refer to https://api.slack.com/legacy/message-buttons for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1131,7 +1131,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1147,7 +1147,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_cancellation` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1188,7 +1188,7 @@ Classes
# Pass a function to this method
app.view("view_1")(handle_submission)
- Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1214,7 +1214,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1230,7 +1230,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_closed` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1271,8 +1271,8 @@ Classes
Refer to the following documents for details:
- * https://api.slack.com/reference/block-kit/block-elements#external_select
- * https://api.slack.com/reference/block-kit/block-elements#external_multi_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1312,7 +1312,7 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1462,9 +1462,9 @@ Classes
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))
-Refer to https://slack.dev/bolt-python/tutorial/getting-started for details.
+Refer to https://docs.slack.dev/tools/bolt-python/building-an-app for details.
If you would like to build an OAuth app for enabling the app to run with multiple workspaces, -refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.
+refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app.loggerblocks.attachments.blocks.attachments.To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Registers a new interactive_message action listener.
-Refer to https://api.slack.com/legacy/message-buttons for details.
def block_action(self,
constraints: str | Pattern | Dict[str, str | Pattern],
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1759,7 +1759,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -1770,7 +1770,7 @@ Args
return __call__
Registers a new block_actions action listener.
-Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
def block_suggestion(self,
action_id: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1824,7 +1824,7 @@ Args
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1855,7 +1855,7 @@ Args
# Pass a function to this method
app.command("/echo")(repeat_text)
-Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Registers a new dialog_cancellation listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_submission(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1945,7 +1945,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1955,7 +1955,7 @@ Args
return __call__
Registers a new dialog_submission listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_suggestion(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1972,7 +1972,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1982,7 +1982,7 @@ Args
return __call__
Registers a new dialog_suggestion listener.
-Refer to https://api.slack.com/dialogs for details.
def dispatch(self,
req: BoltRequest) ‑> BoltResponse
@@ -2208,7 +2208,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -2240,7 +2240,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
-Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to https://api.slack.com/events/message for details of message events.
Refer to https://docs.slack.dev/reference/events/message/ for details of message events.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to https://slack.dev/bolt-python/concepts#global-middleware for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to the following documents for details:
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/Registers a new step from app listener.
Unlike others, this method doesn't behave as a decorator.
If you want to register a step from app by a decorator, use WorkflowStepBuilder's methods.
Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
For further information about WorkflowStep specific function arguments
such as configure, update, complete, and fail,
@@ -2940,7 +2940,7 @@
Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Registers a new view_closed listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details.
def view_submission(self,
constraints: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -3037,7 +3037,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3047,7 +3047,7 @@ Args
return __call__
Registers a new view_submission listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details.
Refer to https://slack.dev/bolt-python/concepts#async for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/async for details.
If you would like to build an OAuth app for enabling the app to run with multiple workspaces, -refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.
+refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app.loggerblocks.attachments.blocks.attachments.To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Registers a new interactive_message action listener.
-Refer to https://api.slack.com/legacy/message-buttons for details.
def block_action(self,
constraints: str | Pattern | Dict[str, str | Pattern],
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -1991,7 +1991,7 @@ Returns
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -2002,7 +2002,7 @@ Returns
return __call__
Registers a new block_actions action listener.
-Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
def block_suggestion(self,
action_id: str | Pattern,
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -2056,7 +2056,7 @@ Returns
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -2087,7 +2087,7 @@ Returns
# Pass a function to this method
app.command("/echo")(repeat_text)
-Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Registers a new dialog_submission listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_submission(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -2177,7 +2177,7 @@ Args
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -2187,7 +2187,7 @@ Args
return __call__
Registers a new dialog_submission listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_suggestion(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -2204,7 +2204,7 @@ Args
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -2214,7 +2214,7 @@ Args
return __call__
Registers a new dialog_suggestion listener.
-Refer to https://api.slack.com/dialogs for details.
def enable_token_revocation_listeners(self) ‑> None
@@ -2320,7 +2320,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -2352,7 +2352,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
-Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Refer to https://api.slack.com/events/message for details of message events.
Refer to https://docs.slack.dev/reference/events/message/ for details of message events.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Refer to the following documents for details:
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/Registers a new step from app listener.
Unlike others, this method doesn't behave as a decorator.
If you want to register a step from app by a decorator, use AsyncWorkflowStepBuilder's methods.
Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
For further information about AsyncWorkflowStep specific function arguments
such as configure, update, complete, and fail,
@@ -3069,7 +3069,7 @@
Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.async_args's API document.
Registers a new view_closed listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details.
def view_submission(self,
constraints: str | Pattern,
matchers: Sequence[Callable[..., Awaitable[bool]]] | None = None,
middleware: Sequence[Callable | AsyncMiddleware] | None = None) ‑> Callable[..., Callable[..., Awaitable[BoltResponse | None]] | None]
@@ -3166,7 +3166,7 @@ Args
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3176,7 +3176,7 @@ Args
return __call__
Registers a new view_submission listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details.
def web_app(self, path: str = '/slack/events', port: int = 3000) ‑> aiohttp.web_app.Application
diff --git a/docs/reference/authorization/index.html b/docs/reference/authorization/index.html
index 64ca14f0e..19de311df 100644
--- a/docs/reference/authorization/index.html
+++ b/docs/reference/authorization/index.html
@@ -39,7 +39,7 @@ Module slack_bolt.authorization
Authorization is the process of determining which Slack credentials should be available
while processing an incoming Slack event.
-Refer to https://slack.dev/bolt-python/concepts#authorization for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/authorization for details.
Sub-modules
diff --git a/docs/reference/context/assistant/thread_context_store/file/index.html b/docs/reference/context/assistant/thread_context_store/file/index.html
index 4a5d944e1..cbb4e4db6 100644
--- a/docs/reference/context/assistant/thread_context_store/file/index.html
+++ b/docs/reference/context/assistant/thread_context_store/file/index.html
@@ -48,7 +48,7 @@ Classes
class FileAssistantThreadContextStore
-(base_dir: str = '/Users/wbergamin/.bolt-app-assistant-thread-contexts')
+(base_dir: str = '/Users/eden.zimbelman/.bolt-app-assistant-thread-contexts')
-
diff --git a/docs/reference/context/index.html b/docs/reference/context/index.html
index 65cb8054c..c761aa47e 100644
--- a/docs/reference/context/index.html
+++ b/docs/reference/context/index.html
@@ -40,7 +40,7 @@
Module slack_bolt.context
All listeners have access to a context dictionary, which can be used to enrich events with additional information.
Bolt automatically attaches information that is included in the incoming event,
like user_id, team_id, channel_id, and enterprise_id.
-Refer to https://slack.dev/bolt-python/concepts#context for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/context for details.
Sub-modules
diff --git a/docs/reference/index.html b/docs/reference/index.html
index 430e36813..1ce8cd134 100644
--- a/docs/reference/index.html
+++ b/docs/reference/index.html
@@ -36,9 +36,9 @@
Package slack_bolt
-A Python framework to build Slack apps in a flash with the latest platform features.Read the getting started guide and look at our code examples to learn how to build apps using Bolt.
+A Python framework to build Slack apps in a flash with the latest platform features.Read the getting started guide and look at our code examples to learn how to build apps using Bolt.
-- Website: https://slack.dev/bolt-python/
+- Website: https://docs.slack.dev/tools/bolt-python/
- GitHub repository: https://github.com/slackapi/bolt-python
- The class representing a Bolt app:
slack_bolt.app.app
@@ -257,10 +257,10 @@ Class variables
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))
- Refer to https://slack.dev/bolt-python/tutorial/getting-started for details.
+ Refer to https://docs.slack.dev/tools/bolt-python/building-an-app for details.
If you would like to build an OAuth app for enabling the app to run with multiple workspaces,
- refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.
+ refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app.
Args:
logger: The custom logger that can be used in this app.
@@ -769,7 +769,7 @@ Class variables
# Pass a function to this method
app.middleware(middleware_func)
- Refer to https://slack.dev/bolt-python/concepts#global-middleware for details.
+ Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -815,7 +815,7 @@ Class variables
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new step from app listener.
@@ -833,7 +833,7 @@ Class variables
# Pass Step to set up listeners
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -850,7 +850,7 @@ Class variables
warnings.warn(
(
"Steps from apps for legacy workflows are now deprecated. "
- "Use new custom steps: https://api.slack.com/automation/functions/custom-bolt"
+ "Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/"
),
category=DeprecationWarning,
)
@@ -927,7 +927,7 @@ Class variables
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -965,7 +965,7 @@ Class variables
# Pass a function to this method
app.message(":wave:")(say_hello)
- Refer to https://api.slack.com/events/message for details of `message` events.
+ Refer to https://docs.slack.dev/reference/events/message/ for details of `message` events.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1076,7 +1076,7 @@ Class variables
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1123,7 +1123,7 @@ Class variables
# Pass a function to this method
app.shortcut("open_modal")(open_modal)
- Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+ Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1191,9 +1191,9 @@ Class variables
# Pass a function to this method
app.action("approve_button")(update_message)
- * Refer to https://api.slack.com/reference/interaction-payloads/block-actions for actions in `blocks`.
- * Refer to https://api.slack.com/legacy/message-buttons for actions in `attachments`.
- * Refer to https://api.slack.com/dialogs for actions in dialogs.
+ * Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`.
+ * Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`.
+ * Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1219,7 +1219,7 @@ Class variables
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -1236,7 +1236,7 @@ Class variables
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `interactive_message` action listener.
- Refer to https://api.slack.com/legacy/message-buttons for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1252,7 +1252,7 @@ Class variables
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1268,7 +1268,7 @@ Class variables
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_cancellation` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1309,7 +1309,7 @@ Class variables
# Pass a function to this method
app.view("view_1")(handle_submission)
- Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1335,7 +1335,7 @@ Class variables
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1351,7 +1351,7 @@ Class variables
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_closed` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1392,8 +1392,8 @@ Class variables
Refer to the following documents for details:
- * https://api.slack.com/reference/block-kit/block-elements#external_select
- * https://api.slack.com/reference/block-kit/block-elements#external_multi_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1433,7 +1433,7 @@ Class variables
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1583,9 +1583,9 @@ Class variables
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))
-Refer to https://slack.dev/bolt-python/tutorial/getting-started for details.
+Refer to https://docs.slack.dev/tools/bolt-python/building-an-app for details.
If you would like to build an OAuth app for enabling the app to run with multiple workspaces, -refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.
+refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app.loggerblocks.attachments.blocks.attachments.To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Registers a new interactive_message action listener.
-Refer to https://api.slack.com/legacy/message-buttons for details.
def block_action(self,
constraints: str | Pattern | Dict[str, str | Pattern],
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1880,7 +1880,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -1891,7 +1891,7 @@ Args
return __call__
Registers a new block_actions action listener.
-Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
def block_suggestion(self,
action_id: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -1945,7 +1945,7 @@ Args
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1976,7 +1976,7 @@ Args
# Pass a function to this method
app.command("/echo")(repeat_text)
-Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Registers a new dialog_cancellation listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_submission(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -2066,7 +2066,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -2076,7 +2076,7 @@ Args
return __call__
Registers a new dialog_submission listener.
-Refer to https://api.slack.com/dialogs for details.
def dialog_suggestion(self,
callback_id: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -2093,7 +2093,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -2103,7 +2103,7 @@ Args
return __call__
Registers a new dialog_suggestion listener.
-Refer to https://api.slack.com/dialogs for details.
def dispatch(self,
req: BoltRequest) ‑> BoltResponse
@@ -2329,7 +2329,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -2361,7 +2361,7 @@ Args
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
-Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to https://api.slack.com/events/message for details of message events.
Refer to https://docs.slack.dev/reference/events/message/ for details of message events.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to https://slack.dev/bolt-python/concepts#global-middleware for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to the following documents for details:
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/Registers a new step from app listener.
Unlike others, this method doesn't behave as a decorator.
If you want to register a step from app by a decorator, use WorkflowStepBuilder's methods.
Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
For further information about WorkflowStep specific function arguments
such as configure, update, complete, and fail,
@@ -3061,7 +3061,7 @@
Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see slack_bolt.kwargs_injection.args's API document.
Registers a new view_closed listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details.
def view_submission(self,
constraints: str | Pattern,
matchers: Sequence[Callable[..., bool]] | None = None,
middleware: Sequence[Callable | Middleware] | None = None) ‑> Callable[..., Callable[..., BoltResponse | None] | None]
@@ -3158,7 +3158,7 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3168,7 +3168,7 @@ Args
return __call__
Registers a new view_submission listener.
-Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details.
class FileAssistantThreadContextStore
-(base_dir: str = '/Users/wbergamin/.bolt-app-assistant-thread-contexts')
+(base_dir: str = '/Users/eden.zimbelman/.bolt-app-assistant-thread-contexts')
slack_bolt.lazy_listenerRefer to https://slack.dev/bolt-python/concepts#lazy-listeners for more details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/lazy-listeners for more details.
Verifies an incoming request by checking the validity of
x-slack-signature, x-slack-request-timestamp, and its body data.
Refer to https://api.slack.com/authentication/verifying-requests-from-slack for details.
+Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details.
Verifies an incoming request by checking the validity of
x-slack-signature, x-slack-request-timestamp, and its body data.
Refer to https://api.slack.com/authentication/verifying-requests-from-slack for details.
+Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details.
signing_secretA middleware can process request data before other middleware and listener functions.
Handles ssl_check requests.
-Refer to https://api.slack.com/interactivity/slash-commands for details.
verification_tokenbase_loggerA middleware can process request data before other middleware and listener functions.
Handles url_verification requests.
-Refer to https://api.slack.com/events/url_verification for details.
+Refer to https://docs.slack.dev/reference/events/url_verification/ for details.
base_loggerA middleware can process request data before other middleware and listener functions.
Verifies an incoming request by checking the validity of
x-slack-signature, x-slack-request-timestamp, and its body data.
Refer to https://api.slack.com/authentication/verifying-requests-from-slack for details.
+Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details.
signing_secretA middleware can process request data before other middleware and listener functions.
Handles slack_bolt.middleware.ssl_check requests.
-Refer to https://api.slack.com/interactivity/slash-commands for details.
verification_tokenbase_loggerA middleware can process request data before other middleware and listener functions.
Handles url_verification requests.
-Refer to https://api.slack.com/events/url_verification for details.
+Refer to https://docs.slack.dev/reference/events/url_verification/ for details.
base_loggerVerifies an incoming request by checking the validity of
x-slack-signature, x-slack-request-timestamp, and its body data.
Refer to https://api.slack.com/authentication/verifying-requests-from-slack for details.
+Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details.
Verifies an incoming request by checking the validity of
x-slack-signature, x-slack-request-timestamp, and its body data.
Refer to https://api.slack.com/authentication/verifying-requests-from-slack for details.
+Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details.
signing_secretA middleware can process request data before other middleware and listener functions.
Verifies an incoming request by checking the validity of
x-slack-signature, x-slack-request-timestamp, and its body data.
Refer to https://api.slack.com/authentication/verifying-requests-from-slack for details.
+Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details.
signing_secretA middleware can process request data before other middleware and listener functions.
Verifies an incoming request by checking the validity of
x-slack-signature, x-slack-request-timestamp, and its body data.
Refer to https://api.slack.com/authentication/verifying-requests-from-slack for details.
+Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details.
signing_secretA middleware can process request data before other middleware and listener functions.
Handles ssl_check requests.
-Refer to https://api.slack.com/interactivity/slash-commands for details.
verification_tokenbase_loggerA middleware can process request data before other middleware and listener functions.
Handles slack_bolt.middleware.ssl_check.ssl_check requests.
-Refer to https://api.slack.com/interactivity/slash-commands for details.
verification_tokenbase_loggerA middleware can process request data before other middleware and listener functions.
Handles ssl_check requests.
-Refer to https://api.slack.com/interactivity/slash-commands for details.
verification_tokenbase_loggerA middleware can process request data before other middleware and listener functions.
Handles url_verification requests.
-Refer to https://api.slack.com/events/url_verification for details.
+Refer to https://docs.slack.dev/reference/events/url_verification/ for details.
base_loggerA middleware can process request data before other middleware and listener functions.
Handles url_verification requests.
-Refer to https://api.slack.com/events/url_verification for details.
+Refer to https://docs.slack.dev/reference/events/url_verification/ for details.
base_loggerA middleware can process request data before other middleware and listener functions.
Handles url_verification requests.
-Refer to https://api.slack.com/events/url_verification for details.
+Refer to https://docs.slack.dev/reference/events/url_verification/ for details.
base_loggerslack_bolt.oauthSlack OAuth flow support for building an app that is installable in any workspaces.
-Refer to https://slack.dev/bolt-python/concepts#authenticating-oauth for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth for details.
slack_bolt.requestIncoming request from Slack through either HTTP request or Socket Mode connection.
-Refer to https://api.slack.com/apis/connections for the two types of connections. +
Refer to https://docs.slack.dev/apis/events-api/ for the two types of connections. This interface encapsulates the difference between the two.
slack_bolt.responseThis interface represents Bolt's synchronous response to Slack.
In Socket Mode, the response data can be transformed to a WebSocket message. In the HTTP endpoint mode, the response data becomes an HTTP response data.
-Refer to https://api.slack.com/apis/connections for the two types of connections.
+Refer to https://docs.slack.dev/apis/events-api/ for the two types of connections.
slack_bolt.workflowsslack_bolt.workflows.step.utilitiesslack_bolt.workflows.step.async_step (if you use asyncio-based AsyncApp)Refer to https://api.slack.com/workflows/steps for details.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/callback_idSteps from apps for legacy workflows are now deprecated. -Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
class AsyncWorkflowStepBuilder:
"""Steps from apps
- Refer to https://api.slack.com/workflows/steps for details.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
callback_id: Union[str, Pattern]
@@ -285,7 +285,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
This builder is supposed to be used as decorator.
@@ -327,7 +327,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new edit listener with details.
@@ -380,7 +380,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new save listener with details.
@@ -433,7 +433,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new execute listener with details.
@@ -480,7 +480,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Constructs a WorkflowStep object. This method may raise an exception
if the builder doesn't have enough configurations to build the object.
@@ -555,10 +555,10 @@ Static methods
return _middleware
Steps from apps -Refer to https://api.slack.com/workflows/steps for details.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.Steps from apps for legacy workflows are now deprecated. -Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/This builder is supposed to be used as decorator.
my_step = AsyncWorkflowStep.builder("my_step")
@my_step.edit
@@ -659,7 +659,7 @@ Methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Constructs a WorkflowStep object. This method may raise an exception
if the builder doesn't have enough configurations to build the object.
@@ -685,7 +685,7 @@ Methods
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Constructs a WorkflowStep object. This method may raise an exception
if the builder doesn't have enough configurations to build the object.
Returns
@@ -709,7 +709,7 @@ Returns
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new edit listener with details.
@@ -754,7 +754,7 @@ Returns
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new edit listener with details.
You can use this method as decorator as well.
@my_step.edit
@@ -799,7 +799,7 @@ Args
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new execute listener with details.
@@ -844,7 +844,7 @@ Args
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new execute listener with details.
You can use this method as decorator as well.
@my_step.execute
@@ -889,7 +889,7 @@ Args
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new save listener with details.
@@ -934,7 +934,7 @@ Args
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new save listener with details.
You can use this method as decorator as well.
@my_step.save
diff --git a/docs/reference/workflows/step/index.html b/docs/reference/workflows/step/index.html
index 62d989976..50b52906b 100644
--- a/docs/reference/workflows/step/index.html
+++ b/docs/reference/workflows/step/index.html
@@ -174,7 +174,7 @@ Classes
)
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
def __init__(self, *, callback_id: str, client: WebClient, body: dict):
@@ -219,7 +219,7 @@ Classes
)
app.step(ws)
-Refer to https://api.slack.com/workflows/steps for details.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
class Fail
@@ -411,7 +411,7 @@ Classes
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Args:
callback_id: The callback_id for this step from app
@@ -453,7 +453,7 @@ Classes
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
"""
return WorkflowStepBuilder(
callback_id,
@@ -546,7 +546,7 @@ Classes
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Args
callback_id
@@ -598,7 +598,7 @@ Static methods
-
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
diff --git a/docs/reference/workflows/step/step.html b/docs/reference/workflows/step/step.html
index 6e1567bd6..0309acd88 100644
--- a/docs/reference/workflows/step/step.html
+++ b/docs/reference/workflows/step/step.html
@@ -78,7 +78,7 @@ Classes
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Args:
callback_id: The callback_id for this step from app
@@ -120,7 +120,7 @@ Classes
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
"""
return WorkflowStepBuilder(
callback_id,
@@ -213,7 +213,7 @@ Classes
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Args
callback_id
@@ -265,7 +265,7 @@ Static methods
-
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
@@ -280,7 +280,7 @@ Static methods
class WorkflowStepBuilder:
"""Steps from apps
- Refer to https://api.slack.com/workflows/steps for details.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
callback_id: Union[str, Pattern]
@@ -298,7 +298,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
This builder is supposed to be used as decorator.
@@ -340,7 +340,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new edit listener with details.
@@ -394,7 +394,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new save listener with details.
@@ -447,7 +447,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new execute listener with details.
@@ -494,7 +494,7 @@ Static methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Constructs a WorkflowStep object. This method may raise an exception
if the builder doesn't have enough configurations to build the object.
@@ -584,10 +584,10 @@ Static methods
return _middleware
Steps from apps
-Refer to https://api.slack.com/workflows/steps for details.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
This builder is supposed to be used as decorator.
my_step = WorkflowStep.builder("my_step")
@my_step.edit
@@ -703,7 +703,7 @@ Methods
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Constructs a WorkflowStep object. This method may raise an exception
if the builder doesn't have enough configurations to build the object.
@@ -729,7 +729,7 @@ Methods
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Constructs a WorkflowStep object. This method may raise an exception
if the builder doesn't have enough configurations to build the object.
Returns
@@ -753,7 +753,7 @@ Returns
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new edit listener with details.
@@ -799,7 +799,7 @@ Returns
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new edit listener with details.
You can use this method as decorator as well.
@my_step.edit
@@ -844,7 +844,7 @@ Args
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new execute listener with details.
@@ -889,7 +889,7 @@ Args
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new execute listener with details.
You can use this method as decorator as well.
@my_step.execute
@@ -934,7 +934,7 @@ Args
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new save listener with details.
@@ -979,7 +979,7 @@ Args
Deprecated
Steps from apps for legacy workflows are now deprecated.
-Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new save listener with details.
You can use this method as decorator as well.
@my_step.save
diff --git a/docs/reference/workflows/step/utilities/async_configure.html b/docs/reference/workflows/step/utilities/async_configure.html
index 008c35ab5..10f236c47 100644
--- a/docs/reference/workflows/step/utilities/async_configure.html
+++ b/docs/reference/workflows/step/utilities/async_configure.html
@@ -83,7 +83,7 @@ Classes
)
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
def __init__(self, *, callback_id: str, client: AsyncWebClient, body: dict):
@@ -131,7 +131,7 @@ Classes
)
app.step(ws)
-Refer to https://api.slack.com/workflows/steps for details.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
diff --git a/docs/reference/workflows/step/utilities/configure.html b/docs/reference/workflows/step/utilities/configure.html
index 26d646cf2..258bce312 100644
--- a/docs/reference/workflows/step/utilities/configure.html
+++ b/docs/reference/workflows/step/utilities/configure.html
@@ -83,7 +83,7 @@ Classes
)
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
def __init__(self, *, callback_id: str, client: WebClient, body: dict):
@@ -128,7 +128,7 @@ Classes
)
app.step(ws)
-Refer to https://api.slack.com/workflows/steps for details.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
diff --git a/examples/aws_lambda/README.md b/examples/aws_lambda/README.md
index 454f080a7..49a8f7da2 100644
--- a/examples/aws_lambda/README.md
+++ b/examples/aws_lambda/README.md
@@ -32,16 +32,16 @@ Instructions on how to set up and deploy each example are provided below.
`lazy_aws_lambda_config.yaml`
- Optionally enter a description for the role, such as "Bolt Python basic
role"
-3. Ensure you have created an app on api.slack.com/apps as per the [Getting
- Started Guide](https://slack.dev/bolt-python/tutorial/getting-started).
+3. Ensure you have created an app on api.slack.com/apps as per the
+ [Building an App](https://docs.slack.dev/tools/bolt-python/building-an-app) guide.
Ensure you have installed it to a workspace.
4. Ensure you have exported your Slack Bot Token and Slack Signing Secret for your
apps as the environment variables `SLACK_BOT_TOKEN` and
- `SLACK_SIGNING_SECRET`, respectively, as per the [Getting
- Started Guide](https://slack.dev/bolt-python/tutorial/getting-started).
+ `SLACK_SIGNING_SECRET`, respectively, as per the
+ [Building an App](https://docs.slack.dev/tools/bolt-python/building-an-app) guide.
5. You may want to create a dedicated virtual environment for this example app, as
- per the "Setting up your project" section of the [Getting
- Started Guide](https://slack.dev/bolt-python/tutorial/getting-started).
+ per the "Setting up your project" section of the
+ [Building an App](https://docs.slack.dev/tools/bolt-python/building-an-app) guide.
6. Let's deploy the Lambda! Run `./deploy_lazy.sh`. By default it deploys to the
us-east-1 region in AWS - you can change this at the top of `lazy_aws_lambda_config.yaml` if you wish.
7. Load up AWS Lambda inside the AWS Console - make sure you are in the correct
@@ -150,7 +150,7 @@ Let’s create a user role that will use the custom policy we created as well as
3. "Create Role"
### Create Slack App and Load your Lambda to AWS
-Ensure you have created an app on [api.slack.com/apps](https://api.slack.com/apps) as per the [Getting Started Guide](https://slack.dev/bolt-python/tutorial/getting-started). You do not need to ensure you have installed it to a workspace, as the OAuth flow will provide your app the ability to be installed by anyone.
+Ensure you have created an app on [api.slack.com/apps](https://api.slack.com/apps) as per the [Building an App](https://docs.slack.dev/tools/bolt-python/building-an-app) guide. You do not need to ensure you have installed it to a workspace, as the OAuth flow will provide your app the ability to be installed by anyone.
1. Remember those S3 buckets we made? You will need the names of these buckets again in the next step.
2. You need many environment variables exported! Specifically the following from api.slack.com/apps
diff --git a/examples/django/README.md b/examples/django/README.md
index c50681c5b..ca0460fd1 100644
--- a/examples/django/README.md
+++ b/examples/django/README.md
@@ -4,7 +4,7 @@ This example demonstrates how you can use Bolt for Python in your Django applica
### `simple_app` - Single-workspace App Example
-If you want to run a simple app like the one you've tried in the [Getting Started Guide](https://slack.dev/bolt-python/tutorial/getting-started), this is the right one for you. By default, this Django project runs this application. If you want to switch to OAuth flow supported one, modify `myslackapp/urls.py`.
+If you want to run a simple app like the one you've tried in the [Building an App](https://docs.slack.dev/tools/bolt-python/building-an-app) guide, this is the right one for you. By default, this Django project runs this application. If you want to switch to OAuth flow supported one, modify `myslackapp/urls.py`.
To run this app, all you need to do are:
@@ -31,7 +31,7 @@ python manage.py migrate
python manage.py runserver 0.0.0.0:3000
```
-As you did at [Getting Started Guide](https://slack.dev/bolt-python/tutorial/getting-started), configure ngrok or something similar to serve a public endpoint. Lastly,
+As you did at [Building an App](https://docs.slack.dev/tools/bolt-python/building-an-app) guide, configure ngrok or something similar to serve a public endpoint. Lastly,
* Go back to the Slack app configuration page
* Go to "Event Subscriptions"
@@ -54,7 +54,7 @@ To run this app, all you need to do are:
* Create a new Slack app configuration at https://api.slack.com/apps?new_app=1
* Go to "OAuth & Permissions"
* Add `app_mentions:read`, `chat:write` in Scopes > Bot Token Scopes
-* Follow the instructions [here](https://slack.dev/bolt-python/concepts#authenticating-oauth) for configuring OAuth flow supported Slack apps
+* Follow the instructions [here](https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth) for configuring OAuth flow supported Slack apps
You can start your Django application this way:
@@ -73,7 +73,7 @@ python manage.py migrate
python manage.py runserver 0.0.0.0:3000
```
-As you did at [Getting Started Guide](https://slack.dev/bolt-python/tutorial/getting-started), configure ngrok or something similar to serve a public endpoint. Lastly,
+As you did at [Building an App](https://docs.slack.dev/tools/bolt-python/building-an-app) guide, configure ngrok or something similar to serve a public endpoint. Lastly,
* Go back to the Slack app configuration page
* Go to "Event Subscriptions"
diff --git a/examples/getting_started/README.md b/examples/getting_started/README.md
index 63875a4dd..5d3c2f61d 100644
--- a/examples/getting_started/README.md
+++ b/examples/getting_started/README.md
@@ -1,5 +1,5 @@
# Getting Started with ⚡️ Bolt for Python
-> Slack app example from 📚 [Getting started with Bolt for Python][1]
+> Slack app example from 📚 [Building an App with Bolt for Python][1]
## Overview
@@ -42,6 +42,6 @@ ngrok http 3000
python3 app.py
```
-[1]: https://slack.dev/bolt-python/tutorial/getting-started
-[2]: https://slack.dev/bolt-python/
-[3]: https://slack.dev/bolt-python/tutorial/getting-started#setting-up-events
+[1]: https://docs.slack.dev/tools/bolt-python/building-an-app
+[2]: https://docs.slack.dev/tools/bolt-python/
+[3]: https://docs.slack.dev/tools/bolt-python/building-an-app#setting-up-events
diff --git a/examples/message_events.py b/examples/message_events.py
index 7658be276..3fd424060 100644
--- a/examples/message_events.py
+++ b/examples/message_events.py
@@ -32,7 +32,7 @@ def extract_subtype(body: dict, context: BoltContext, next: Callable):
next()
-# https://api.slack.com/events/message
+# https://docs.slack.dev/reference/events/message/
# Newly posted messages only
# or @app.event("message")
@app.event({"type": "message", "subtype": None})
@@ -55,8 +55,8 @@ def detect_deletion(say: Say, body: dict):
say(f"You've deleted a message: {text}")
-# https://api.slack.com/events/message/file_share
-# https://api.slack.com/events/message/bot_message
+# https://docs.slack.dev/reference/events/message/file_share
+# https://docs.slack.dev/reference/events/message/bot_message
@app.event(
event={"type": "message", "subtype": re.compile("(me_message)|(file_share)")},
middleware=[extract_subtype],
diff --git a/examples/readme_app.py b/examples/readme_app.py
index 963938658..fe81a0904 100644
--- a/examples/readme_app.py
+++ b/examples/readme_app.py
@@ -16,13 +16,13 @@ def log_request(logger, body, next):
return next()
-# Events API: https://api.slack.com/events-api
+# Events API: https://docs.slack.dev/apis/events-api/
@app.event("app_mention")
def event_test(say):
say("What's up?")
-# Interactivity: https://api.slack.com/interactivity
+# Interactivity: https://docs.slack.dev/interactivity/
@app.shortcut("callback-id-here")
# @app.command("/hello-bolt-python")
def open_modal(ack, client, logger, body):
diff --git a/examples/readme_async_app.py b/examples/readme_async_app.py
index c43d3af32..f11d308a0 100644
--- a/examples/readme_async_app.py
+++ b/examples/readme_async_app.py
@@ -28,13 +28,13 @@ async def log_request(logger, body, next):
return await next()
-# Events API: https://api.slack.com/events-api
+# Events API: https://docs.slack.dev/apis/events-api/
@app.event("app_mention")
async def event_test(say):
await say("What's up?")
-# Interactivity: https://api.slack.com/interactivity
+# Interactivity: https://docs.slack.dev/interactivity/
@app.shortcut("callback-id-here")
# @app.command("/hello-bolt-python")
async def open_modal(ack, client, logger, body):
diff --git a/examples/workflow_steps/async_steps_from_apps.py b/examples/workflow_steps/async_steps_from_apps.py
index 11566de6c..ed108cf5e 100644
--- a/examples/workflow_steps/async_steps_from_apps.py
+++ b/examples/workflow_steps/async_steps_from_apps.py
@@ -11,7 +11,7 @@
################################################################################
# Steps from apps for legacy workflows are now deprecated. #
-# Use new custom steps: https://api.slack.com/automation/functions/custom-bolt #
+# Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ #
################################################################################
logging.basicConfig(level=logging.DEBUG)
diff --git a/examples/workflow_steps/async_steps_from_apps_decorator.py b/examples/workflow_steps/async_steps_from_apps_decorator.py
index 423048a47..e04884723 100644
--- a/examples/workflow_steps/async_steps_from_apps_decorator.py
+++ b/examples/workflow_steps/async_steps_from_apps_decorator.py
@@ -13,7 +13,7 @@
################################################################################
# Steps from apps for legacy workflows are now deprecated. #
-# Use new custom steps: https://api.slack.com/automation/functions/custom-bolt #
+# Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ #
################################################################################
logging.basicConfig(level=logging.DEBUG)
diff --git a/examples/workflow_steps/async_steps_from_apps_primitive.py b/examples/workflow_steps/async_steps_from_apps_primitive.py
index 2e636e600..06a2956db 100644
--- a/examples/workflow_steps/async_steps_from_apps_primitive.py
+++ b/examples/workflow_steps/async_steps_from_apps_primitive.py
@@ -5,7 +5,7 @@
################################################################################
# Steps from apps for legacy workflows are now deprecated. #
-# Use new custom steps: https://api.slack.com/automation/functions/custom-bolt #
+# Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ #
################################################################################
logging.basicConfig(level=logging.DEBUG)
diff --git a/examples/workflow_steps/steps_from_apps.py b/examples/workflow_steps/steps_from_apps.py
index efbb2ce65..b5f591700 100644
--- a/examples/workflow_steps/steps_from_apps.py
+++ b/examples/workflow_steps/steps_from_apps.py
@@ -8,7 +8,7 @@
################################################################################
# Steps from apps for legacy workflows are now deprecated. #
-# Use new custom steps: https://api.slack.com/automation/functions/custom-bolt #
+# Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ #
################################################################################
logging.basicConfig(level=logging.DEBUG)
diff --git a/examples/workflow_steps/steps_from_apps_decorator.py b/examples/workflow_steps/steps_from_apps_decorator.py
index 64ddfcc20..1558e825a 100644
--- a/examples/workflow_steps/steps_from_apps_decorator.py
+++ b/examples/workflow_steps/steps_from_apps_decorator.py
@@ -9,7 +9,7 @@
################################################################################
# Steps from apps for legacy workflows are now deprecated. #
-# Use new custom steps: https://api.slack.com/automation/functions/custom-bolt #
+# Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ #
################################################################################
logging.basicConfig(level=logging.DEBUG)
diff --git a/examples/workflow_steps/steps_from_apps_primitive.py b/examples/workflow_steps/steps_from_apps_primitive.py
index 6aa5a98bb..dd4231ba6 100644
--- a/examples/workflow_steps/steps_from_apps_primitive.py
+++ b/examples/workflow_steps/steps_from_apps_primitive.py
@@ -7,7 +7,7 @@
################################################################################
# Steps from apps for legacy workflows are now deprecated. #
-# Use new custom steps: https://api.slack.com/automation/functions/custom-bolt #
+# Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/ #
################################################################################
logging.basicConfig(level=logging.DEBUG)
diff --git a/pyproject.toml b/pyproject.toml
index 024ee6654..5a6523f35 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -24,7 +24,7 @@ dependencies = ["slack_sdk>=3.35.0,<4"]
[project.urls]
-Documentation = "https://slack.dev/bolt-python"
+Documentation = "https://docs.slack.dev/tools/bolt-python/"
[tool.setuptools.packages.find]
include = ["slack_bolt*"]
diff --git a/slack_bolt/__init__.py b/slack_bolt/__init__.py
index 32ab76721..6331925f8 100644
--- a/slack_bolt/__init__.py
+++ b/slack_bolt/__init__.py
@@ -1,7 +1,7 @@
"""
-A Python framework to build Slack apps in a flash with the latest platform features.Read the [getting started guide](https://slack.dev/bolt-python/tutorial/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.
+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/building-an-app) and look at our [code examples](https://github.com/slackapi/bolt-python/tree/main/examples) to learn how to build apps using Bolt.
-* Website: https://slack.dev/bolt-python/
+* Website: https://docs.slack.dev/tools/bolt-python/
* GitHub repository: https://github.com/slackapi/bolt-python
* The class representing a Bolt app: `slack_bolt.app.app`
""" # noqa: E501
diff --git a/slack_bolt/app/app.py b/slack_bolt/app/app.py
index 60f20ea9e..5a7f32917 100644
--- a/slack_bolt/app/app.py
+++ b/slack_bolt/app/app.py
@@ -159,10 +159,10 @@ def message_hello(message, say):
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))
- Refer to https://slack.dev/bolt-python/tutorial/getting-started for details.
+ Refer to https://docs.slack.dev/tools/bolt-python/building-an-app for details.
If you would like to build an OAuth app for enabling the app to run with multiple workspaces,
- refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.
+ refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app.
Args:
logger: The custom logger that can be used in this app.
@@ -671,7 +671,7 @@ def middleware_func(logger, body, next):
# Pass a function to this method
app.middleware(middleware_func)
- Refer to https://slack.dev/bolt-python/concepts#global-middleware for details.
+ Refer to https://docs.slack.dev/tools/bolt-python/concepts/global-middleware for details.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -717,7 +717,7 @@ def step(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new step from app listener.
@@ -735,7 +735,7 @@ def step(
# Pass Step to set up listeners
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -752,7 +752,7 @@ def step(
warnings.warn(
(
"Steps from apps for legacy workflows are now deprecated. "
- "Use new custom steps: https://api.slack.com/automation/functions/custom-bolt"
+ "Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/"
),
category=DeprecationWarning,
)
@@ -829,7 +829,7 @@ def ask_for_introduction(event, say):
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -867,7 +867,7 @@ def say_hello(message, say):
# Pass a function to this method
app.message(":wave:")(say_hello)
- Refer to https://api.slack.com/events/message for details of `message` events.
+ Refer to https://docs.slack.dev/reference/events/message/ for details of `message` events.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -978,7 +978,7 @@ def repeat_text(ack, say, command):
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1025,7 +1025,7 @@ def open_modal(ack, body, client):
# Pass a function to this method
app.shortcut("open_modal")(open_modal)
- Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+ Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1093,9 +1093,9 @@ def update_message(ack):
# Pass a function to this method
app.action("approve_button")(update_message)
- * Refer to https://api.slack.com/reference/interaction-payloads/block-actions for actions in `blocks`.
- * Refer to https://api.slack.com/legacy/message-buttons for actions in `attachments`.
- * Refer to https://api.slack.com/dialogs for actions in dialogs.
+ * Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`.
+ * Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`.
+ * Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1121,7 +1121,7 @@ def block_action(
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -1138,7 +1138,7 @@ def attachment_action(
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `interactive_message` action listener.
- Refer to https://api.slack.com/legacy/message-buttons for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1154,7 +1154,7 @@ def dialog_submission(
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1170,7 +1170,7 @@ def dialog_cancellation(
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_cancellation` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1211,7 +1211,7 @@ def handle_submission(ack, body, client, view):
# Pass a function to this method
app.view("view_1")(handle_submission)
- Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1237,7 +1237,9 @@ def view_submission(
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1253,7 +1255,7 @@ def view_closed(
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_closed` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1294,8 +1296,8 @@ def show_menu_options(ack):
Refer to the following documents for details:
- * https://api.slack.com/reference/block-kit/block-elements#external_select
- * https://api.slack.com/reference/block-kit/block-elements#external_multi_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.args`'s API document.
@@ -1335,7 +1337,7 @@ def dialog_suggestion(
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
diff --git a/slack_bolt/app/async_app.py b/slack_bolt/app/async_app.py
index 906359fcc..39f3c3c0e 100644
--- a/slack_bolt/app/async_app.py
+++ b/slack_bolt/app/async_app.py
@@ -165,10 +165,10 @@ async def message_hello(message, say): # async function
if __name__ == "__main__":
app.start(port=int(os.environ.get("PORT", 3000)))
- Refer to https://slack.dev/bolt-python/concepts#async for details.
+ Refer to https://docs.slack.dev/tools/bolt-python/concepts/async for details.
If you would like to build an OAuth app for enabling the app to run with multiple workspaces,
- refer to https://slack.dev/bolt-python/concepts#authenticating-oauth to learn how to configure the app.
+ refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth to learn how to configure the app.
Args:
logger: The custom logger that can be used in this app.
@@ -738,7 +738,7 @@ def step(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new step from app listener.
@@ -756,7 +756,7 @@ def step(
# Pass Step to set up listeners
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details of steps from apps.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details of steps from apps.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
For further information about AsyncWorkflowStep specific function arguments
@@ -772,7 +772,7 @@ def step(
warnings.warn(
(
"Steps from apps for legacy workflows are now deprecated. "
- "Use new custom steps: https://api.slack.com/automation/functions/custom-bolt"
+ "Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/"
),
category=DeprecationWarning,
)
@@ -854,7 +854,7 @@ async def ask_for_introduction(event, say):
# Pass a function to this method
app.event("team_join")(ask_for_introduction)
- Refer to https://api.slack.com/apis/connections/events-api for details of Events API.
+ Refer to https://docs.slack.dev/apis/events-api/ for details of Events API.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -892,7 +892,7 @@ async def say_hello(message, say):
# Pass a function to this method
app.message(":wave:")(say_hello)
- Refer to https://api.slack.com/events/message for details of `message` events.
+ Refer to https://docs.slack.dev/reference/events/message/ for details of `message` events.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -1007,7 +1007,7 @@ async def repeat_text(ack, say, command):
# Pass a function to this method
app.command("/echo")(repeat_text)
- Refer to https://api.slack.com/interactivity/slash-commands for details of Slash Commands.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details of Slash Commands.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -1054,7 +1054,7 @@ async def open_modal(ack, body, client):
# Pass a function to this method
app.shortcut("open_modal")(open_modal)
- Refer to https://api.slack.com/interactivity/shortcuts for details about Shortcuts.
+ Refer to https://docs.slack.dev/interactivity/implementing-shortcuts/ for details about Shortcuts.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -1122,9 +1122,9 @@ async def update_message(ack):
# Pass a function to this method
app.action("approve_button")(update_message)
- * Refer to https://api.slack.com/reference/interaction-payloads/block-actions for actions in `blocks`.
- * Refer to https://api.slack.com/legacy/message-buttons for actions in `attachments`.
- * Refer to https://api.slack.com/dialogs for actions in dialogs.
+ * Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for actions in `blocks`.
+ * Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for actions in `attachments`.
+ * Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for actions in dialogs.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -1150,7 +1150,7 @@ def block_action(
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `block_actions` action listener.
- Refer to https://api.slack.com/reference/interaction-payloads/block-actions for details.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/block_actions-payload/ for details.
"""
def __call__(*args, **kwargs):
@@ -1167,7 +1167,7 @@ def attachment_action(
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `interactive_message` action listener.
- Refer to https://api.slack.com/legacy/message-buttons for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-messaging/legacy-message-buttons/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1183,7 +1183,7 @@ def dialog_submission(
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1199,7 +1199,7 @@ def dialog_cancellation(
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `dialog_submission` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1240,7 +1240,7 @@ async def handle_submission(ack, body, client, view):
# Pass a function to this method
app.view("view_1")(handle_submission)
- Refer to https://api.slack.com/reference/interaction-payloads/views for details of payloads.
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload for details of payloads.
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -1266,7 +1266,9 @@ def view_submission(
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1282,7 +1284,7 @@ def view_closed(
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `view_closed` listener.
- Refer to https://api.slack.com/reference/interaction-payloads/views#view_closed for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_closed for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -1323,8 +1325,8 @@ async def show_menu_options(ack):
Refer to the following documents for details:
- * https://api.slack.com/reference/block-kit/block-elements#external_select
- * https://api.slack.com/reference/block-kit/block-elements#external_multi_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/select-menu-element#external_select
+ * https://docs.slack.dev/reference/block-kit/block-elements/multi-select-menu-element#external_multi_select
To learn available arguments for middleware/listeners, see `slack_bolt.kwargs_injection.async_args`'s API document.
@@ -1364,7 +1366,7 @@ def dialog_suggestion(
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `dialog_suggestion` listener.
- Refer to https://api.slack.com/dialogs for details."""
+ Refer to https://docs.slack.dev/legacy/legacy-dialogs/ for details."""
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
diff --git a/slack_bolt/authorization/__init__.py b/slack_bolt/authorization/__init__.py
index a936a866b..4b80a93bb 100644
--- a/slack_bolt/authorization/__init__.py
+++ b/slack_bolt/authorization/__init__.py
@@ -1,7 +1,7 @@
"""Authorization is the process of determining which Slack credentials should be available
while processing an incoming Slack event.
-Refer to https://slack.dev/bolt-python/concepts#authorization for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/authorization for details.
"""
from .authorize_result import AuthorizeResult
diff --git a/slack_bolt/context/__init__.py b/slack_bolt/context/__init__.py
index fb3337c7a..865825601 100644
--- a/slack_bolt/context/__init__.py
+++ b/slack_bolt/context/__init__.py
@@ -2,7 +2,7 @@
Bolt automatically attaches information that is included in the incoming event,
like `user_id`, `team_id`, `channel_id`, and `enterprise_id`.
-Refer to https://slack.dev/bolt-python/concepts#context for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/context for details.
"""
# Don't add async module imports here
diff --git a/slack_bolt/lazy_listener/__init__.py b/slack_bolt/lazy_listener/__init__.py
index 4d9111cc3..a92c18483 100644
--- a/slack_bolt/lazy_listener/__init__.py
+++ b/slack_bolt/lazy_listener/__init__.py
@@ -19,7 +19,7 @@ def run_long_process(respond, body):
lazy=[run_long_process]
)
-Refer to https://slack.dev/bolt-python/concepts#lazy-listeners for more details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/lazy-listeners for more details.
"""
# Don't add async module imports here
diff --git a/slack_bolt/listener_matcher/builtins.py b/slack_bolt/listener_matcher/builtins.py
index 57dbdf4f1..76c12d452 100644
--- a/slack_bolt/listener_matcher/builtins.py
+++ b/slack_bolt/listener_matcher/builtins.py
@@ -294,7 +294,7 @@ def func(body: Dict[str, Any]) -> bool:
return dialog_submission(constraints["callback_id"], asyncio)
if action_type == "dialog_cancellation":
return dialog_cancellation(constraints["callback_id"], asyncio)
- # https://api.slack.com/workflows/steps
+ # https://docs.slack.dev/legacy/legacy-steps-from-apps/
if action_type == "workflow_step_edit":
return workflow_step_edit(constraints["callback_id"], asyncio)
diff --git a/slack_bolt/logger/messages.py b/slack_bolt/logger/messages.py
index d30f51acb..80e68d022 100644
--- a/slack_bolt/logger/messages.py
+++ b/slack_bolt/logger/messages.py
@@ -348,7 +348,7 @@ def info_default_oauth_settings_loaded() -> str:
"Bolt has enabled the file-based InstallationStore/OAuthStateStore for you. "
"Note that these file-based stores are for local development. "
"If you'd like to use a different data store, set the oauth_settings argument in the App constructor. "
- "Please refer to https://slack.dev/bolt-python/concepts#authenticating-oauth for more details."
+ "Please refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth for more details."
)
diff --git a/slack_bolt/middleware/request_verification/async_request_verification.py b/slack_bolt/middleware/request_verification/async_request_verification.py
index 68484bde0..3fb9e209b 100644
--- a/slack_bolt/middleware/request_verification/async_request_verification.py
+++ b/slack_bolt/middleware/request_verification/async_request_verification.py
@@ -10,7 +10,7 @@ class AsyncRequestVerification(RequestVerification, AsyncMiddleware):
"""Verifies an incoming request by checking the validity of
`x-slack-signature`, `x-slack-request-timestamp`, and its body data.
- Refer to https://api.slack.com/authentication/verifying-requests-from-slack for details.
+ Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details.
"""
async def async_process(
diff --git a/slack_bolt/middleware/request_verification/request_verification.py b/slack_bolt/middleware/request_verification/request_verification.py
index 5662dcf08..2cf7e361e 100644
--- a/slack_bolt/middleware/request_verification/request_verification.py
+++ b/slack_bolt/middleware/request_verification/request_verification.py
@@ -14,7 +14,7 @@ def __init__(self, signing_secret: str, base_logger: Optional[Logger] = None):
"""Verifies an incoming request by checking the validity of
`x-slack-signature`, `x-slack-request-timestamp`, and its body data.
- Refer to https://api.slack.com/authentication/verifying-requests-from-slack for details.
+ Refer to https://docs.slack.dev/authentication/verifying-requests-from-slack/ for details.
Args:
signing_secret: The signing secret
diff --git a/slack_bolt/middleware/ssl_check/ssl_check.py b/slack_bolt/middleware/ssl_check/ssl_check.py
index d608e5c3d..88c5105ef 100644
--- a/slack_bolt/middleware/ssl_check/ssl_check.py
+++ b/slack_bolt/middleware/ssl_check/ssl_check.py
@@ -17,11 +17,11 @@ def __init__(
base_logger: Optional[Logger] = None,
):
"""Handles `ssl_check` requests.
- Refer to https://api.slack.com/interactivity/slash-commands for details.
+ Refer to https://docs.slack.dev/interactivity/implementing-slash-commands/ for details.
Args:
verification_token: The verification token to check
- (optional as it's already deprecated - https://api.slack.com/authentication/verifying-requests-from-slack#verification_token_deprecation)
+ (optional as it's already deprecated - https://docs.slack.dev/authentication/verifying-requests-from-slack/#deprecation)
base_logger: The base logger
""" # noqa: E501
self.verification_token = verification_token
diff --git a/slack_bolt/middleware/url_verification/url_verification.py b/slack_bolt/middleware/url_verification/url_verification.py
index e59398fd7..7505c9c15 100644
--- a/slack_bolt/middleware/url_verification/url_verification.py
+++ b/slack_bolt/middleware/url_verification/url_verification.py
@@ -11,7 +11,7 @@ class UrlVerification(Middleware):
def __init__(self, base_logger: Optional[Logger] = None):
"""Handles url_verification requests.
- Refer to https://api.slack.com/events/url_verification for details.
+ Refer to https://docs.slack.dev/reference/events/url_verification/ for details.
Args:
base_logger: The base logger
diff --git a/slack_bolt/oauth/__init__.py b/slack_bolt/oauth/__init__.py
index c4f806698..0a5c3db07 100644
--- a/slack_bolt/oauth/__init__.py
+++ b/slack_bolt/oauth/__init__.py
@@ -1,6 +1,6 @@
"""Slack OAuth flow support for building an app that is installable in any workspaces.
-Refer to https://slack.dev/bolt-python/concepts#authenticating-oauth for details.
+Refer to https://docs.slack.dev/tools/bolt-python/concepts/authenticating-oauth for details.
"""
# Don't add async module imports here
diff --git a/slack_bolt/request/__init__.py b/slack_bolt/request/__init__.py
index ee8b435a7..8610b6019 100644
--- a/slack_bolt/request/__init__.py
+++ b/slack_bolt/request/__init__.py
@@ -1,6 +1,6 @@
"""Incoming request from Slack through either HTTP request or Socket Mode connection.
-Refer to https://api.slack.com/apis/connections for the two types of connections.
+Refer to https://docs.slack.dev/apis/events-api/ for the two types of connections.
This interface encapsulates the difference between the two.
"""
diff --git a/slack_bolt/response/__init__.py b/slack_bolt/response/__init__.py
index 373acccf2..c390b2d8e 100644
--- a/slack_bolt/response/__init__.py
+++ b/slack_bolt/response/__init__.py
@@ -3,7 +3,7 @@
In Socket Mode, the response data can be transformed to a WebSocket message. In the HTTP endpoint mode,
the response data becomes an HTTP response data.
-Refer to https://api.slack.com/apis/connections for the two types of connections.
+Refer to https://docs.slack.dev/apis/events-api/ for the two types of connections.
"""
from .response import BoltResponse
diff --git a/slack_bolt/workflows/__init__.py b/slack_bolt/workflows/__init__.py
index 97e6ec765..c0f6d96b7 100644
--- a/slack_bolt/workflows/__init__.py
+++ b/slack_bolt/workflows/__init__.py
@@ -6,5 +6,5 @@
* `slack_bolt.workflows.step.utilities`
* `slack_bolt.workflows.step.async_step` (if you use asyncio-based `AsyncApp`)
-Refer to https://api.slack.com/workflows/steps for details.
+Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
diff --git a/slack_bolt/workflows/step/async_step.py b/slack_bolt/workflows/step/async_step.py
index 250d2e900..7fa0ed858 100644
--- a/slack_bolt/workflows/step/async_step.py
+++ b/slack_bolt/workflows/step/async_step.py
@@ -29,7 +29,7 @@
class AsyncWorkflowStepBuilder:
"""Steps from apps
- Refer to https://api.slack.com/workflows/steps for details.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
callback_id: Union[str, Pattern]
@@ -47,7 +47,7 @@ def __init__(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
This builder is supposed to be used as decorator.
@@ -89,7 +89,7 @@ def edit(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new edit listener with details.
@@ -142,7 +142,7 @@ def save(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new save listener with details.
@@ -195,7 +195,7 @@ def execute(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new execute listener with details.
@@ -242,7 +242,7 @@ def build(self, base_logger: Optional[Logger] = None) -> "AsyncWorkflowStep":
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Constructs a WorkflowStep object. This method may raise an exception
if the builder doesn't have enough configurations to build the object.
@@ -340,7 +340,7 @@ def __init__(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Args:
callback_id: The callback_id for this step from app
@@ -386,7 +386,7 @@ def builder(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
"""
return AsyncWorkflowStepBuilder(callback_id, base_logger=base_logger)
diff --git a/slack_bolt/workflows/step/step.py b/slack_bolt/workflows/step/step.py
index 7cdbb913c..4fca25717 100644
--- a/slack_bolt/workflows/step/step.py
+++ b/slack_bolt/workflows/step/step.py
@@ -24,7 +24,7 @@
class WorkflowStepBuilder:
"""Steps from apps
- Refer to https://api.slack.com/workflows/steps for details.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
callback_id: Union[str, Pattern]
@@ -42,7 +42,7 @@ def __init__(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
This builder is supposed to be used as decorator.
@@ -84,7 +84,7 @@ def edit(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new edit listener with details.
@@ -138,7 +138,7 @@ def save(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new save listener with details.
@@ -191,7 +191,7 @@ def execute(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Registers a new execute listener with details.
@@ -238,7 +238,7 @@ def build(self, base_logger: Optional[Logger] = None) -> "WorkflowStep":
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Constructs a WorkflowStep object. This method may raise an exception
if the builder doesn't have enough configurations to build the object.
@@ -351,7 +351,7 @@ def __init__(
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
Args:
callback_id: The callback_id for this step from app
@@ -393,7 +393,7 @@ def builder(cls, callback_id: Union[str, Pattern], base_logger: Optional[Logger]
"""
Deprecated:
Steps from apps for legacy workflows are now deprecated.
- Use new custom steps: https://api.slack.com/automation/functions/custom-bolt
+ Use new custom steps: https://docs.slack.dev/workflows/workflow-steps/
"""
return WorkflowStepBuilder(
callback_id,
diff --git a/slack_bolt/workflows/step/utilities/async_configure.py b/slack_bolt/workflows/step/utilities/async_configure.py
index 721d5049c..5b9a7f9ae 100644
--- a/slack_bolt/workflows/step/utilities/async_configure.py
+++ b/slack_bolt/workflows/step/utilities/async_configure.py
@@ -32,7 +32,7 @@ async def edit(ack, step, configure):
)
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
def __init__(self, *, callback_id: str, client: AsyncWebClient, body: dict):
diff --git a/slack_bolt/workflows/step/utilities/configure.py b/slack_bolt/workflows/step/utilities/configure.py
index d44c8d0da..1280be8f7 100644
--- a/slack_bolt/workflows/step/utilities/configure.py
+++ b/slack_bolt/workflows/step/utilities/configure.py
@@ -32,7 +32,7 @@ def edit(ack, step, configure):
)
app.step(ws)
- Refer to https://api.slack.com/workflows/steps for details.
+ Refer to https://docs.slack.dev/legacy/legacy-steps-from-apps/ for details.
"""
def __init__(self, *, callback_id: str, client: WebClient, body: dict):
diff --git a/tests/scenario_tests/test_attachment_actions.py b/tests/scenario_tests/test_attachment_actions.py
index fa40187ee..f40deb22b 100644
--- a/tests/scenario_tests/test_attachment_actions.py
+++ b/tests/scenario_tests/test_attachment_actions.py
@@ -164,7 +164,7 @@ def test_failure_2(self):
assert_auth_test_count(self, 1)
-# https://api.slack.com/legacy/interactive-messages
+# https://docs.slack.dev/legacy/legacy-messaging/legacy-making-messages-interactive/
body = {
"type": "interactive_message",
"actions": [
diff --git a/tests/scenario_tests_async/test_attachment_actions.py b/tests/scenario_tests_async/test_attachment_actions.py
index f6613837b..c9817dcd7 100644
--- a/tests/scenario_tests_async/test_attachment_actions.py
+++ b/tests/scenario_tests_async/test_attachment_actions.py
@@ -191,7 +191,7 @@ async def test_failure_2(self):
await assert_auth_test_count_async(self, 1)
-# https://api.slack.com/legacy/interactive-messages
+# https://docs.slack.dev/legacy/legacy-messaging/legacy-making-messages-interactive/
body = {
"type": "interactive_message",
"actions": [
From fc5bbc109cad1dffa1496c92e6da4ed7c5aea5fd Mon Sep 17 00:00:00 2001
From: Eden Zimbelman
Date: Mon, 6 Oct 2025 16:32:48 -0700
Subject: [PATCH 14/15] feat: add ai-enabled features text streaming methods,
feedback blocks, and loading state (#1387)
Co-authored-by: Luke Russell <31357343+lukegalbraithrussell@users.noreply.github.com>
Co-authored-by: Maria Alejandra <104795114+srtaalej@users.noreply.github.com>
Co-authored-by: Michael Brooks
---
docs/english/concepts/ai-apps.md | 408 ++++++++++++++----
docs/english/concepts/message-sending.md | 61 ++-
docs/reference/app/app.html | 11 +-
docs/reference/app/async_app.html | 11 +-
docs/reference/app/index.html | 11 +-
docs/reference/async_app.html | 26 +-
docs/reference/context/say/async_say.html | 2 +
docs/reference/context/say/index.html | 2 +
docs/reference/context/say/say.html | 2 +
.../context/set_status/async_set_status.html | 11 +-
docs/reference/context/set_status/index.html | 11 +-
.../context/set_status/set_status.html | 11 +-
.../async_set_suggested_prompts.html | 2 +-
.../context/set_suggested_prompts/index.html | 2 +-
.../set_suggested_prompts.html | 2 +-
docs/reference/index.html | 26 +-
pyproject.toml | 2 +-
slack_bolt/context/say/async_say.py | 12 +-
slack_bolt/context/say/say.py | 4 +-
.../context/set_status/async_set_status.py | 13 +-
slack_bolt/context/set_status/set_status.py | 13 +-
.../async_set_suggested_prompts.py | 4 +-
.../set_suggested_prompts.py | 4 +-
tests/slack_bolt/context/test_say.py | 10 +-
tests/slack_bolt/context/test_set_status.py | 38 ++
.../context/test_set_suggested_prompts.py | 37 ++
.../context/test_async_say.py | 13 +-
.../context/test_async_set_status.py | 45 ++
.../test_async_set_suggested_prompts.py | 45 ++
29 files changed, 693 insertions(+), 146 deletions(-)
create mode 100644 tests/slack_bolt/context/test_set_status.py
create mode 100644 tests/slack_bolt/context/test_set_suggested_prompts.py
create mode 100644 tests/slack_bolt_async/context/test_async_set_status.py
create mode 100644 tests/slack_bolt_async/context/test_async_set_suggested_prompts.py
diff --git a/docs/english/concepts/ai-apps.md b/docs/english/concepts/ai-apps.md
index b294c6688..44bd08df1 100644
--- a/docs/english/concepts/ai-apps.md
+++ b/docs/english/concepts/ai-apps.md
@@ -1,83 +1,195 @@
-# Using AI in Apps
-:::info[This feature requires a paid plan]
+# Using AI in Apps {#using-ai-in-apps}
+
+The Slack platform offers features tailored for AI agents and assistants. Your apps can [utilize the `Assistant` class](#assistant) for a side-panel view designed with AI in mind, or they can utilize features applicable to messages throughout Slack, like [chat streaming](#text-streaming) and [feedback buttons](#adding-and-handling-feedback).
+
+If you're unfamiliar with using these feature within Slack, you may want to read the [API documentation on the subject](/ai/). Then come back here to implement them with Bolt!
+
+## The `Assistant` class instance {#assistant}
+
+:::info[Some features within this guide require a paid plan]
If you don't have a paid workspace for development, you can join the [Developer Program](https://api.slack.com/developer-program) and provision a sandbox with access to all Slack features for free.
:::
-The Agents & AI Apps feature comprises a unique messaging experience for Slack. If you're unfamiliar with using the Agents & AI Apps feature within Slack, you'll want to read the [API documentation on the subject](/ai/). Then come back here to implement them with Bolt!
+The [`Assistant`](/tools/bolt-js/reference#the-assistantconfig-configuration-object) class can be used to handle the incoming events expected from a user interacting with an app in Slack that has the Agents & AI Apps feature enabled.
-## Configuring your app to support AI features {#configuring-your-app}
+A typical flow would look like:
-1. Within [App Settings](https://api.slack.com/apps), enable the **Agents & AI Apps** feature.
+1. [The user starts a thread](#handling-new-thread). The `Assistant` class handles the incoming [`assistant_thread_started`](/reference/events/assistant_thread_started) event.
+2. [The thread context may change at any point](#handling-thread-context-changes). The `Assistant` class can handle any incoming [`assistant_thread_context_changed`](/reference/events/assistant_thread_context_changed) events. The class also provides a default `context` store to keep track of thread context changes as the user moves through Slack.
+3. [The user responds](#handling-user-response). The `Assistant` class handles the incoming [`message.im`](/reference/events/message.im) event.
-2. Within the App Settings **OAuth & Permissions** page, add the following scopes:
-* [`assistant:write`](/reference/scopes/assistant.write)
-* [`chat:write`](/reference/scopes/chat.write)
-* [`im:history`](/reference/scopes/im.history)
-3. Within the App Settings **Event Subscriptions** page, subscribe to the following events:
-* [`assistant_thread_started`](/reference/events/assistant_thread_started)
-* [`assistant_thread_context_changed`](/reference/events/assistant_thread_context_changed)
-* [`message.im`](/reference/events/message.im)
+```python
+assistant = Assistant()
-:::info[You _could_ implement your own AI app by [listening](event-listening) for the `assistant_thread_started`, `assistant_thread_context_changed`, and `message.im` events (see implementation details below).]
+# This listener is invoked when a human user opened an assistant thread
+@assistant.thread_started
+def start_assistant_thread(
+ say: Say,
+ get_thread_context: GetThreadContext,
+ set_suggested_prompts: SetSuggestedPrompts,
+ logger: logging.Logger,
+):
+ try:
+ ...
-That being said, using the `Assistant` class will streamline the process. And we already wrote this nice guide for you!
+# This listener is invoked when the human user sends a reply in the assistant thread
+@assistant.user_message
+def respond_in_assistant_thread(
+ client: WebClient,
+ context: BoltContext,
+ get_thread_context: GetThreadContext,
+ logger: logging.Logger,
+ payload: dict,
+ say: Say,
+ set_status: SetStatus,
+):
+ try:
+ ...
+
+# Enable this assistant middleware in your Bolt app
+app.use(assistant)
+```
+
+:::info[Consider the following]
+You _could_ go it alone and [listen](/tools/bolt-python/concepts/event-listening) for the `assistant_thread_started`, `assistant_thread_context_changed`, and `message.im` events in order to implement the AI features in your app. That being said, using the `Assistant` class will streamline the process. And we already wrote this nice guide for you!
+:::
+
+While the `assistant_thread_started` and `assistant_thread_context_changed` events do provide Slack-client thread context information, the `message.im` event does not. Any subsequent user message events won't contain thread context data. For that reason, Bolt not only provides a way to store thread context — the `threadContextStore` property — but it also provides a `DefaultThreadContextStore` instance that is utilized by default. This implementation relies on storing and retrieving [message metadata](/messaging/message-metadata/) as the user interacts with the app.
-## The `Assistant` class instance {#assistant-class}
+If you do provide your own `threadContextStore` property, it must feature `get` and `save` methods.
+
+:::tip[Refer to the [reference docs](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.]
+:::
+
+### Configuring your app to support the `Assistant` class {#configuring-assistant-class}
+
+1. Within [App Settings](https://api.slack.com/apps), enable the **Agents & AI Apps** feature.
+
+2. Within the App Settings **OAuth & Permissions** page, add the following scopes:
+ * [`assistant:write`](/reference/scopes/assistant.write)
+ * [`chat:write`](/reference/scopes/chat.write)
+ * [`im:history`](/reference/scopes/im.history)
-The `Assistant` class can be used to handle the incoming events expected from a user interacting with an app in Slack that has the Agents & AI Apps feature enabled. A typical flow would look like:
+3. Within the App Settings **Event Subscriptions** page, subscribe to the following events:
+ * [`assistant_thread_started`](/reference/events/assistant_thread_started)
+ * [`assistant_thread_context_changed`](/reference/events/assistant_thread_context_changed)
+ * [`message.im`](/reference/events/message.im)
-1. [The user starts a thread](#handling-a-new-thread). The `Assistant` class handles the incoming [`assistant_thread_started`](/reference/events/assistant_thread_started) event.
-2. [The thread context may change at any point](#handling-thread-context-changes). The `Assistant` class can handle any incoming [`assistant_thread_context_changed`](/reference/events/assistant_thread_context_changed) events. The class also provides a default context store to keep track of thread context changes as the user moves through Slack.
-3. [The user responds](#handling-the-user-response). The `Assistant` class handles the incoming [`message.im`](/reference/events/message.im) event.
+### Handling a new thread {#handling-new-thread}
+When the user opens a new thread with your AI-enabled app, the [`assistant_thread_started`](/reference/events/assistant_thread_started) event will be sent to your app.
+
+:::tip[When a user opens an app thread while in a channel, the channel info is stored as the thread's `AssistantThreadContext` data.]
+
+You can grab that info by using the `get_thread_context` utility, as subsequent user message event payloads won't include the channel info.
+:::
```python
assistant = Assistant()
-# This listener is invoked when a human user opened an assistant thread
@assistant.thread_started
-def start_assistant_thread(say: Say, set_suggested_prompts: SetSuggestedPrompts):
- # Send the first reply to the human who started chat with your app's assistant bot
- say(":wave: Hi, how can I help you today?")
-
- # Setting suggested prompts is optional
- set_suggested_prompts(
- prompts=[
- # If the suggested prompt is long, you can use {"title": "short one to display", "message": "full prompt"} instead
- "What does SLACK stand for?",
- "When Slack was released?",
- ],
- )
+def start_assistant_thread(
+ say: Say,
+ get_thread_context: GetThreadContext,
+ set_suggested_prompts: SetSuggestedPrompts,
+ logger: logging.Logger,
+):
+ try:
+ say("How can I help you?")
+
+ prompts: List[Dict[str, str]] = [
+ {
+ "title": "Suggest names for my Slack app",
+ "message": "Can you suggest a few names for my Slack app? The app helps my teammates better organize information and plan priorities and action items.",
+ },
+ ]
+
+ thread_context = get_thread_context()
+ if thread_context is not None and thread_context.channel_id is not None:
+ summarize_channel = {
+ "title": "Summarize the referred channel",
+ "message": "Can you generate a brief summary of the referred channel?",
+ }
+ prompts.append(summarize_channel)
+
+ set_suggested_prompts(prompts=prompts)
+ except Exception as e:
+ logger.exception(f"Failed to handle an assistant_thread_started event: {e}", e)
+ say(f":warning: Something went wrong! ({e})")
+```
+
+You can send more complex messages to the user — see [Sending Block Kit alongside messages](#block-kit-interactions) for more info.
+
+### Handling thread context changes {#handling-thread-context-changes}
+
+When the user switches channels, the [`assistant_thread_context_changed`](/reference/events/assistant_thread_context_changed) event will be sent to your app.
+
+If you use the built-in `Assistant` middleware without any custom configuration, the updated context data is automatically saved as [message metadata](/messaging/message-metadata/) of the first reply from the app.
+
+As long as you use the built-in approach, you don't need to store the context data within a datastore. The downside of this default behavior is the overhead of additional calls to the Slack API. These calls include those to `conversations.history`, which are used to look up the stored message metadata that contains the thread context (via `get_thread_context`).
+
+To store context elsewhere, pass a custom `AssistantThreadContextStore` implementation to the `Assistant` constructor. We provide `FileAssistantThreadContextStore`, which is a reference implementation that uses the local file system. Since this reference implementation relies on local files, it's not advised for use in production. For production apps, we recommend creating a class that inherits `AssistantThreadContextStore`.
+
+```python
+from slack_bolt import FileAssistantThreadContextStore
+assistant = Assistant(thread_context_store=FileAssistantThreadContextStore())
+```
+
+### Handling the user response {#handling-user-response}
+
+When the user messages your app, the [`message.im`](/reference/events/message.im) event will be sent to your app.
+Messages sent to the app do not contain a [subtype](/reference/events/message#subtypes) and must be deduced based on their shape and any provided [message metadata](/messaging/message-metadata/).
+
+There are three utilities that are particularly useful in curating the user experience:
+* [`say`](https://docs.slack.dev/tools/bolt-python/reference/#slack_bolt.Say)
+* [`setTitle`](https://docs.slack.dev/tools/bolt-python/reference/#slack_bolt.SetTitle)
+* [`setStatus`](https://docs.slack.dev/tools/bolt-python/reference/#slack_bolt.SetStatus)
+
+Within the `setStatus` utility, you can cycle through strings passed into a `loading_messages` array.
+
+```python
# This listener is invoked when the human user sends a reply in the assistant thread
@assistant.user_message
def respond_in_assistant_thread(
- payload: dict,
- logger: logging.Logger,
- context: BoltContext,
- set_status: SetStatus,
client: WebClient,
+ context: BoltContext,
+ get_thread_context: GetThreadContext,
+ logger: logging.Logger,
+ payload: dict,
say: Say,
+ set_status: SetStatus,
):
try:
- # Tell the human user the assistant bot acknowledges the request and is working on it
- set_status("is typing...")
+ channel_id = payload["channel"]
+ team_id = payload["team"]
+ thread_ts = payload["thread_ts"]
+ user_id = payload["user"]
+ user_message = payload["text"]
+
+ set_status(
+ status="thinking...",
+ loading_messages=[
+ "Untangling the internet cables…",
+ "Consulting the office goldfish…",
+ "Convincing the AI to stop overthinking…",
+ ],
+ )
# Collect the conversation history with this user
- replies_in_thread = client.conversations_replies(
+ replies = client.conversations_replies(
channel=context.channel_id,
ts=context.thread_ts,
oldest=context.thread_ts,
limit=10,
)
messages_in_thread: List[Dict[str, str]] = []
- for message in replies_in_thread["messages"]:
+ for message in replies["messages"]:
role = "user" if message.get("bot_id") is None else "assistant"
messages_in_thread.append({"role": role, "content": message["text"]})
- # Pass the latest prompt and chat history to the LLM (call_llm is your own code)
returned_message = call_llm(messages_in_thread)
# Post the result in the assistant thread
@@ -93,23 +205,7 @@ def respond_in_assistant_thread(
app.use(assistant)
```
-While the `assistant_thread_started` and `assistant_thread_context_changed` events do provide Slack-client thread context information, the `message.im` event does not. Any subsequent user message events won't contain thread context data. For that reason, Bolt not only provides a way to store thread context — the `threadContextStore` property — but it also provides an instance that is utilized by default. This implementation relies on storing and retrieving [message metadata](/messaging/message-metadata/) as the user interacts with the app.
-
-If you do provide your own `threadContextStore` property, it must feature `get` and `save` methods.
-
-:::tip[Refer to the [module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.]
-:::
-
-## Handling a new thread {#handling-a-new-thread}
-
-When the user opens a new thread with your AI-enabled app, the [`assistant_thread_started`](/reference/events/assistant_thread_started) event will be sent to your app.
-
-:::tip[When a user opens an app thread while in a channel, the channel info is stored as the thread's `AssistantThreadContext` data.]
-
-You can grab that info by using the `get_thread_context` utility, as subsequent user message event payloads won't include the channel info.
-:::
-
-### Block Kit interactions in the app thread {#block-kit-interactions}
+### Sending Block Kit alongside messages {#block-kit-interactions}
For advanced use cases, Block Kit buttons may be used instead of suggested prompts, as well as the sending of messages with structured [metadata](/messaging/message-metadata/) to trigger subsequent interactions with the user.
@@ -235,52 +331,182 @@ def respond_to_bot_messages(logger: logging.Logger, set_status: SetStatus, say:
...
```
-## Handling thread context changes {#handling-thread-context-changes}
+See the [_Adding and handling feedback_](#adding-and-handling-feedback) section for adding feedback buttons with Block Kit.
-When the user switches channels, the [`assistant_thread_context_changed`](/reference/events/assistant_thread_context_changed) event will be sent to your app.
+## Text streaming in messages {#text-streaming}
-If you use the built-in `Assistant` middleware without any custom configuration, the updated context data is automatically saved as [message metadata](/messaging/message-metadata/) of the first reply from the app.
+Three Web API methods work together to provide users a text streaming experience:
-As long as you use the built-in approach, you don't need to store the context data within a datastore. The downside of this default behavior is the overhead of additional calls to the Slack API. These calls include those to `conversations.history`, which are used to look up the stored message metadata that contains the thread context (via `get_thread_context`).
+* the [`chat.startStream`](/reference/methods/chat.startstream) method starts the text stream,
+* the [`chat.appendStream`](/reference/methods/chat.appendstream) method appends text to the stream, and
+* the [`chat.stopStream`](/reference/methods/chat.stopstream) method stops it.
+
+Since you're using Bolt for Python, built upon the Python Slack SDK, you can use the [`chat_stream()`](https://docs.slack.dev/tools/python-slack-sdk/reference/web/client.html#slack_sdk.web.client.WebClient.chat_stream) utility to streamline all three aspects of streaming in your app's messages.
+
+The following example uses OpenAI's streaming API with the new `chat_stream()` functionality, but you can substitute it with the AI client of your choice.
-To store context elsewhere, pass a custom `AssistantThreadContextStore` implementation to the `Assistant` constructor. We provide `FileAssistantThreadContextStore`, which is a reference implementation that uses the local file system. Since this reference implementation relies on local files, it's not advised for use in production. For production apps, we recommend creating a class that inherits `AssistantThreadContextStore`.
```python
-from slack_bolt import FileAssistantThreadContextStore
-assistant = Assistant(thread_context_store=FileAssistantThreadContextStore())
-```
+import os
+from typing import List, Dict
+
+import openai
+from openai import Stream
+from openai.types.responses import ResponseStreamEvent
+
+DEFAULT_SYSTEM_CONTENT = """
+You're an assistant in a Slack workspace.
+Users in the workspace will ask you to help them write something or to think better about a specific topic.
+You'll respond to those questions in a professional way.
+When you include markdown text, convert them to Slack compatible ones.
+When a prompt has Slack's special syntax like <@USER_ID> or <#CHANNEL_ID>, you must keep them as-is in your response.
+"""
+
+def call_llm(
+ messages_in_thread: List[Dict[str, str]],
+ system_content: str = DEFAULT_SYSTEM_CONTENT,
+) -> Stream[ResponseStreamEvent]:
+ openai_client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
+ messages = [{"role": "system", "content": system_content}]
+ messages.extend(messages_in_thread)
+ response = openai_client.responses.create(model="gpt-4o-mini", input=messages, stream=True)
+ return response
+
+@assistant.user_message
+def respond_in_assistant_thread(
+ ...
+):
+ try:
+ ...
+ replies = client.conversations_replies(
+ channel=context.channel_id,
+ ts=context.thread_ts,
+ oldest=context.thread_ts,
+ limit=10,
+ )
+ messages_in_thread: List[Dict[str, str]] = []
+ for message in replies["messages"]:
+ role = "user" if message.get("bot_id") is None else "assistant"
+ messages_in_thread.append({"role": role, "content": message["text"]})
-## Handling the user response {#handling-the-user-response}
+ returned_message = call_llm(messages_in_thread)
-When the user messages your app, the [`message.im`](/reference/events/message.im) event will be sent to your app.
+ streamer = client.chat_stream(
+ channel=channel_id,
+ recipient_team_id=team_id,
+ recipient_user_id=user_id,
+ thread_ts=thread_ts,
+ )
-Messages sent to the app do not contain a [subtype](/reference/events/message#subtypes) and must be deduced based on their shape and any provided [message metadata](/messaging/message-metadata/).
+ # Loop over OpenAI response stream
+ # https://platform.openai.com/docs/api-reference/responses/create
+ for event in returned_message:
+ if event.type == "response.output_text.delta":
+ streamer.append(markdown_text=f"{event.delta}")
+ else:
+ continue
-There are three utilities that are particularly useful in curating the user experience:
-* [`say`](https://docs.slack.dev/tools/bolt-python/reference/#slack_bolt.Say)
-* [`setTitle`](https://docs.slack.dev/tools/bolt-python/reference/#slack_bolt.SetTitle)
-* [`setStatus`](https://docs.slack.dev/tools/bolt-python/reference/#slack_bolt.SetStatus)
+ streamer.stop()
-```python
-...
-# This listener is invoked when the human user posts a reply
-@assistant.user_message
-def respond_to_user_messages(logger: logging.Logger, set_status: SetStatus, say: Say):
- try:
- set_status("is typing...")
- say("Please use the buttons in the first reply instead :bow:")
except Exception as e:
- logger.exception(f"Failed to respond to an inquiry: {e}")
- say(f":warning: Sorry, something went wrong during processing your request (error: {e})")
+ logger.exception(f"Failed to handle a user message event: {e}")
+ say(f":warning: Something went wrong! ({e})")
+```
-# Enable this assistant middleware in your Bolt app
-app.use(assistant)
+## Adding and handling feedback {#adding-and-handling-feedback}
+
+Use the [feedback buttons block element](/reference/block-kit/block-elements/feedback-buttons-element/) to allow users to immediately provide feedback regarding your app's responses. Here's a quick example:
+
+```py
+from typing import List
+from slack_sdk.models.blocks import Block, ContextActionsBlock, FeedbackButtonsElement, FeedbackButtonObject
+
+
+def create_feedback_block() -> List[Block]:
+ """
+ Create feedback block with thumbs up/down buttons
+
+ Returns:
+ Block Kit context_actions block
+ """
+ blocks: List[Block] = [
+ ContextActionsBlock(
+ elements=[
+ FeedbackButtonsElement(
+ action_id="feedback",
+ positive_button=FeedbackButtonObject(
+ text="Good Response",
+ accessibility_label="Submit positive feedback on this response",
+ value="good-feedback",
+ ),
+ negative_button=FeedbackButtonObject(
+ text="Bad Response",
+ accessibility_label="Submit negative feedback on this response",
+ value="bad-feedback",
+ ),
+ )
+ ]
+ )
+ ]
+ return blocks
+```
+
+Use the `chat_stream` utility to render the feedback block at the bottom of your app's message.
+
+```js
+...
+ streamer = client.chat_stream(
+ channel=channel_id,
+ recipient_team_id=team_id,
+ recipient_user_id=user_id,
+ thread_ts=thread_ts,
+ )
+
+ # Loop over OpenAI response stream
+ # https://platform.openai.com/docs/api-reference/responses/create
+ for event in returned_message:
+ if event.type == "response.output_text.delta":
+ streamer.append(markdown_text=f"{event.delta}")
+ else:
+ continue
+
+ feedback_block = create_feedback_block()
+ streamer.stop(blocks=feedback_block)
+...
```
-## Full example: Assistant Template {#full-example}
+Then add a response for when the user provides feedback.
+
+```python
+# Handle feedback buttons (thumbs up/down)
+def handle_feedback(ack, body, client, logger: logging.Logger):
+ try:
+ ack()
+ message_ts = body["message"]["ts"]
+ channel_id = body["channel"]["id"]
+ feedback_type = body["actions"][0]["value"]
+ is_positive = feedback_type == "good-feedback"
+
+ if is_positive:
+ client.chat_postEphemeral(
+ channel=channel_id,
+ user=body["user"]["id"],
+ thread_ts=message_ts,
+ text="We're glad you found this useful.",
+ )
+ else:
+ client.chat_postEphemeral(
+ channel=channel_id,
+ user=body["user"]["id"],
+ thread_ts=message_ts,
+ text="Sorry to hear that response wasn't up to par :slightly_frowning_face: Starting a new chat may help with AI mistakes and hallucinations.",
+ )
+
+ logger.debug(f"Handled feedback: type={feedback_type}, message_ts={message_ts}")
+ except Exception as error:
+ logger.error(f":warning: Something went wrong! {error}")
+```
-Below is the `assistant.py` listener file of the [Assistant Template repo](https://github.com/slack-samples/bolt-python-assistant-template) we've created for you to build off of.
+## Full example: App Agent Template {#app-agent-template}
-```py reference title="assistant.py"
-https://github.com/slack-samples/bolt-python-assistant-template/blob/main/listeners/assistant.py
-```
\ No newline at end of file
+Want to see the functionality described throughout this guide in action? We've created a [App Agent Template](https://github.com/slack-samples/bolt-python-assistant-template) repo for you to build off of.
diff --git a/docs/english/concepts/message-sending.md b/docs/english/concepts/message-sending.md
index 228a7b6b8..9741bb396 100644
--- a/docs/english/concepts/message-sending.md
+++ b/docs/english/concepts/message-sending.md
@@ -5,6 +5,7 @@ Within your listener function, `say()` is available whenever there is an associa
In the case that you'd like to send a message outside of a listener or you want to do something more advanced (like handle specific errors), you can call `client.chat_postMessage` [using the client attached to your Bolt instance](/tools/bolt-python/concepts/web-api).
Refer to [the module document](https://docs.slack.dev/tools/bolt-python/reference/kwargs_injection/args.html) to learn the available listener arguments.
+
```python
# Listens for messages containing "knock knock" and responds with an italicized "who's there?"
@app.message("knock knock")
@@ -38,4 +39,62 @@ def show_datepicker(event, say):
blocks=blocks,
text="Pick a date for me to remind you"
)
-```
\ No newline at end of file
+```
+
+## Streaming messages {#streaming-messages}
+
+You can have your app's messages stream in to replicate conventional AI chatbot behavior. This is done through three Web API methods:
+
+* [`chat_startStream`](/reference/methods/chat.startstream)
+* [`chat_appendStream`](/reference/methods/chat.appendstream)
+* [`chat_stopStream`](/reference/methods/chat.stopstream)
+
+The Python Slack SDK provides a [`chat_stream()`](https://docs.slack.dev/tools/python-slack-sdk/reference/web/client.html#slack_sdk.web.client.WebClient.chat_stream) helper utility to streamline calling these methods. Here's an excerpt from our [Assistant template app](https://github.com/slack-samples/bolt-python-assistant-template):
+
+```python
+streamer = client.chat_stream(
+ channel=channel_id,
+ recipient_team_id=team_id,
+ recipient_user_id=user_id,
+ thread_ts=thread_ts,
+)
+
+# Loop over OpenAI response stream
+# https://platform.openai.com/docs/api-reference/responses/create
+for event in returned_message:
+ if event.type == "response.output_text.delta":
+ streamer.append(markdown_text=f"{event.delta}")
+ else:
+ continue
+
+feedback_block = create_feedback_block()
+streamer.stop(blocks=feedback_block)
+```
+
+In that example, a [feedback buttons](/reference/block-kit/block-elements/feedback-buttons-element) block element is passed to `streamer.stop` to provide feedback buttons to the user at the bottom of the message. Interaction with these buttons will send a block action event to your app to receive the feedback.
+
+```python
+def create_feedback_block() -> List[Block]:
+ blocks: List[Block] = [
+ ContextActionsBlock(
+ elements=[
+ FeedbackButtonsElement(
+ action_id="feedback",
+ positive_button=FeedbackButtonObject(
+ text="Good Response",
+ accessibility_label="Submit positive feedback on this response",
+ value="good-feedback",
+ ),
+ negative_button=FeedbackButtonObject(
+ text="Bad Response",
+ accessibility_label="Submit negative feedback on this response",
+ value="bad-feedback",
+ ),
+ )
+ ]
+ )
+ ]
+ return blocks
+```
+
+For information on calling the `chat_*Stream` API methods without the helper utility, see the [_Sending streaming messages_](/tools/python-slack-sdk/web#sending-streaming-messages) section of the Python Slack SDK docs.
\ No newline at end of file
diff --git a/docs/reference/app/app.html b/docs/reference/app/app.html
index 3ee02b07c..c91d020ef 100644
--- a/docs/reference/app/app.html
+++ b/docs/reference/app/app.html
@@ -1195,7 +1195,9 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3018,7 +3020,9 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3028,7 +3032,8 @@ Args
return __call__
Registers a new view_submission listener.
-Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details.
+Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+details.
diff --git a/docs/reference/app/async_app.html b/docs/reference/app/async_app.html
index 78959986b..9cbc801d0 100644
--- a/docs/reference/app/async_app.html
+++ b/docs/reference/app/async_app.html
@@ -1215,7 +1215,9 @@ Classes
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3075,7 +3077,9 @@ Args
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3085,7 +3089,8 @@ Args
return __call__
Registers a new view_submission listener.
-Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details.
+Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+details.
def web_app(self, path: str = '/slack/events', port: int = 3000) ‑> aiohttp.web_app.Application
diff --git a/docs/reference/app/index.html b/docs/reference/app/index.html
index a46bc2e71..8821e5af9 100644
--- a/docs/reference/app/index.html
+++ b/docs/reference/app/index.html
@@ -1214,7 +1214,9 @@ Classes
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3037,7 +3039,9 @@ Args
middleware: Optional[Sequence[Union[Callable, Middleware]]] = None,
) -> Callable[..., Optional[Callable[..., Optional[BoltResponse]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3047,7 +3051,8 @@ Args
return __call__
Registers a new view_submission listener.
-Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details.
+Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+details.
diff --git a/docs/reference/async_app.html b/docs/reference/async_app.html
index 707bfc3dd..8fd975be9 100644
--- a/docs/reference/async_app.html
+++ b/docs/reference/async_app.html
@@ -1306,7 +1306,9 @@ Class variables
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3166,7 +3168,9 @@ Args
middleware: Optional[Sequence[Union[Callable, AsyncMiddleware]]] = None,
) -> Callable[..., Optional[Callable[..., Awaitable[Optional[BoltResponse]]]]]:
"""Registers a new `view_submission` listener.
- Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details."""
+ Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for
+ details.
+ """
def __call__(*args, **kwargs):
functions = self._to_listener_functions(kwargs) if kwargs else list(args)
@@ -3176,7 +3180,8 @@ Args
return __call__
Registers a new view_submission listener.
-Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details.
def web_app(self, path: str = '/slack/events', port: int = 3000) ‑> aiohttp.web_app.Application
@@ -5158,6 +5163,7 @@ Class variables
icon_emoji: Optional[str] = None,
icon_url: Optional[str] = None,
username: Optional[str] = None,
+ markdown_text: Optional[str] = None,
mrkdwn: Optional[bool] = None,
link_names: Optional[bool] = None,
parse: Optional[str] = None, # none, full
@@ -5183,6 +5189,7 @@ Class variables
icon_emoji=icon_emoji,
icon_url=icon_url,
username=username,
+ markdown_text=markdown_text,
mrkdwn=mrkdwn,
link_names=link_names,
parse=parse,
@@ -5248,11 +5255,18 @@ Class variables
self.channel_id = channel_id
self.thread_ts = thread_ts
- async def __call__(self, status: str) -> AsyncSlackResponse:
+ async def __call__(
+ self,
+ status: str,
+ loading_messages: Optional[List[str]] = None,
+ **kwargs,
+ ) -> AsyncSlackResponse:
return await self.client.assistant_threads_setStatus(
- status=status,
channel_id=self.channel_id,
thread_ts=self.thread_ts,
+ status=status,
+ loading_messages=loading_messages,
+ **kwargs,
)
@@ -5298,7 +5312,7 @@ Registers a new view_submission listener.
-Refer to https://docs.slack.dev/reference/interaction-payloads/view-interactions-payload/#view_submission for details.