GeezerVison is showing github.com — Releases · slackapi/bolt-python
Releases · slackapi/bolt-python
v1.30.0
c3eb4c2
This commit was created on GitHub.com and signed with GitHub’s verified signature.
What's Changed
🚀 Enhancements
📚 Documentation
📦 Other changes
- chore(deps-dev): update cherrypy requirement from <19,>=18 to >=18.10.0,<19 by @dependabot[bot] in #1536
- chore(deps-dev): update websockets requirement from <16 to <17 by @dependabot[bot] in #1537
- chore(deps): bump actions/setup-python from 6.2.0 to 6.3.0 by @dependabot[bot] in #1544
- test: characterization tests for payload_utils assistant predicates by @WilliamBergamin in #1548
- chore(deps): update pytest requirement from <8.5 to <9.2 by @dependabot[bot] in #1540
- chore(deps): bump actions/checkout from 6.0.3 to 7.0.0 by @dependabot[bot] in #1545
- chore(release): version 1.30.0 by @WilliamBergamin in #1550
Full Changelog: v1.29.0...v1.30.0
Contributors
WilliamBergamin, dependabot, and haleychaas
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
zimeg reacted with rocket emoji
1 person reacted
v1.29.0
zimeg
released this
30 Jun 20:23
8028f00
This commit was created on GitHub.com and signed with GitHub’s verified signature.
What's Changed
🚀 Enhancements
- feat: add authorship arguments to say_stream by @zimeg in #1502
🐛 Bug Fixes
- fix: handle malformed user/view payloads in extract_team_id by @saschabuehrle in #1481
- fix: propagate Socket Mode retry_attempt and retry_reason to BoltRequest headers by @SAY-5 in #1498
- fix(falcon/async_resource): replace the use of removed resp.body by @vytas7 in #1516
- fix: defer SignatureVerifier construction so Socket Mode apps init without a signing secret by @zimeg in #1541
📚 Documentation
🔒 Security
- fix: Require signatures for ssl_check request verification by @homanp in #1495
📦 Other changes
- chore(deps): bump dependabot/fetch-metadata from 3.0.0 to 3.1.0 by @dependabot[bot] in #1485
- chore(deps): bump pypa/gh-action-pypi-publish from 1.13.0 to 1.14.0 by @dependabot[bot] in #1489
- chore(deps): bump slackapi/slack-github-action from 3.0.1 to 3.0.3 by @dependabot[bot] in #1487
- chore(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 by @dependabot[bot] in #1486
- chore(deps): update boddle requirement from <0.3,>=0.2 to >=0.2.9,<0.3 by @dependabot[bot] in #1488
- chore(deps): update werkzeug requirement from <4,>=2 to >=3.1.8,<4 by @dependabot[bot] in #1490
- chore(deps): update falcon requirement from <5,>=2 to >=4.2.0,<5 by @dependabot[bot] in #1491
- chore(deps): update chalice requirement from <2,>=1.28 to >=1.32.0,<2 by @dependabot[bot] in #1492
- fix: mock module level time to improve stability by @WilliamBergamin in #1497
- chore: improve testing around socket-mode header synthesization by @WilliamBergamin in #1499
- chore(deps): update starlette requirement from <1,>=0.19.1 to >=0.49.3,<1 by @dependabot[bot] in #1493
- chore(deps): update gunicorn requirement from <24,>=20 to >=23.0.0,<24 by @dependabot[bot] in #1504
- chore(deps): update sanic requirement from <26,>=21 to >=25.3.0,<26 by @dependabot[bot] in #1506
- fix: broken python 3.10 unit test by @WilliamBergamin in #1509
- chore(deps): update django requirement from <6,>=3 to >=4.2.30,<6 by @dependabot[bot] in #1505
- chore(deps): update pytest-cov requirement from <8,>=3 to >=7.1.0,<8 by @dependabot[bot] in #1507
- chore: rename requirements files to improve Dependabot dependency scoping by @WilliamBergamin in #1510
- chore(deps-dev): update tornado requirement from <7,>=6 to >=6.5.6,<7 by @dependabot[bot] in #1508
- fix: align WSGI/ASGI test infrastructure and handler with spec by @WilliamBergamin in #1513
- chore(deps): bump codecov/codecov-action from 6.0.0 to 6.0.1 by @dependabot[bot] in #1521
- chore(deps): bump actions/checkout from 6.0.2 to 6.0.3 by @dependabot[bot] in #1523
- chore(deps): bump actions/stale from 10.2.0 to 10.3.0 by @dependabot[bot] in #1522
- chore(deps): update asgiref requirement from <4,>=3.8 to >=3.11.1,<4 by @dependabot[bot] in #1528
- chore(deps-dev): update aiohttp requirement from <4,>=3 to >=3.13.5,<4 by @dependabot[bot] in #1527
- chore(deps-dev): update websocket-client requirement from <2,>=1.2.3 to >=1.9.0,<2 by @dependabot[bot] in #1526
- chore(deps-dev): update flask requirement from <4,>=1 to >=3.1.3,<4 by @dependabot[bot] in #1525
- chore(deps-dev): update fastapi requirement from <1,>=0.70.0 to >=0.128.8,<1 by @dependabot[bot] in #1524
- chore(deps): bump codecov/codecov-action from 6.0.1 to 7.0.0 by @dependabot[bot] in #1530
- chore(release): version 1.29.0 by @zimeg in #1542
New Contributors
Full Changelog: v1.28.0...v1.29.0
Contributors
homanp, vytas7, and 7 other contributors
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
v1.28.0
zimeg
released this
06 Apr 23:23
c64d69d
This commit was created on GitHub.com and signed with GitHub’s verified signature.
What's Changed
Bring magic to a conversation with say_stream for streaming messages and show loading status with set_status. Now available for app.event and app.message listeners:
@app.event("app_mention")
def handle_mention(say_stream, set_status):
set_status(
status="Thinking...",
loading_messages=["Waking up...", "Loading a witty response..."],
)
stream = say_stream(buffer_size=100)
stream.append(markdown_text="Thinking... :thinking_face:\n\n")
stream.append(markdown_text="Here is my response!")
stream.stop()
🚀 Enhancements
- feat: add support for say_stream utility in #1462 - Thanks @WilliamBergamin!
- feat: surface the set_status argument to listeners if required event details are available in #1465 - Thanks @WilliamBergamin!
- feat: add agent set status to BoltAgent in #1441 - Thanks @srtaalej!
- feat(agent): add set_suggested_prompts helper in #1442 - Thanks @zimeg!
- feat(agent): default to message 'ts' when no 'thread_ts' is available for 'agent.chat_stream(...)' in #1444 - Thanks @zimeg!
- Add 'agent: BoltAgent' listener argument in #1437 - Thanks @mwbrooks!
🐛 Bug Fixes
- fix: pin setuptools to maintain support for pyramid adapter in #1436 - Thanks @WilliamBergamin!
- fix(agent): match channel_id api argument for set_status and set_suggested_prompts in #1446 - Thanks @zimeg!
- fix(assistant): get_thread_context calls store.find() for user_message events in #1453 - Thanks @srtaalej!
- fix(assistant): improve middleware dispatch and inject kwargs in middleware in #1456 - Thanks @WilliamBergamin!
- fix: improve the robustness of the payload extract logic in #1464 - Thanks @WilliamBergamin!
- fix: Remove 'agent: BoltAgent' listener argument in #1466 - Thanks @WilliamBergamin!
- refactor: rename AttachingAgentKwargs middleware to AttachingConversationKwargs in #1473 - Thanks @WilliamBergamin!
📚 Documentation
🧰 Maintenance
🎁 Dependencies
Dev
- chore(deps): update pytest-asyncio requirement from <1 to <2 in #1329 - Thanks @dependabot[bot]!
- chore(deps): update cheroot requirement from <11 to <12 in #1380 - Thanks @dependabot[bot]!
- chore(deps): bump mypy from 1.18.2 to 1.19.0 in #1403 - Thanks @dependabot[bot]!
- chore(deps): bump mypy from 1.19.0 to 1.19.1 in #1418 - Thanks @dependabot[bot]!
- chore(deps): bump black from 25.1.0 to 26.3.1 in /requirements in #1457 - Thanks @dependabot[bot]!
CI
- chore(deps): bump actions/checkout from 5.0.0 to 6.0.0 in #1404 - Thanks @dependabot[bot]!
- chore(deps): bump actions/setup-python from 6.0.0 to 6.1.0 in #1405 - Thanks @dependabot[bot]!
- chore(deps): bump actions/upload-artifact from 5.0.0 to 6.0.0 in #1415 - Thanks @dependabot[bot]!
- chore(deps): bump actions/download-artifact from 6.0.0 to 7.0.0 in #1416 - Thanks @dependabot[bot]!
- chore(deps): bump codecov/codecov-action from 5.5.1 to 5.5.2 in #1417 - Thanks @dependabot[bot]!
- chore(deps): bump actions/stale from 10.1.0 to 10.1.1 in #1419 - Thanks @dependabot[bot]!
- chore(deps): bump actions/checkout from 6.0.0 to 6.0.1 in #1420 - Thanks @dependabot[bot]!
- chore(deps): bump actions/checkout from 6.0.1 to 6.0.2 in #1424 - Thanks @dependabot[bot]!
- chore(deps): bump actions/setup-python from 6.1.0 to 6.2.0 in #1425 - Thanks @dependabot[bot]!
- chore(deps): bump actions/stale from 10.1.1 to 10.2.0 in #1448 - Thanks @dependabot[bot]!
- chore(deps): bump actions/upload-artifact from 6.0.0 to 7.0.0 in #1449 - Thanks @dependabot[bot]!
- chore(deps): bump actions/download-artifact from 7.0.0 to 8.0.0 in #1450 - Thanks @dependabot[bot]!
- chore(deps): bump actions/download-artifact from 8.0.0 to 8.0.1 in #1474 - Thanks @dependabot[bot]!
- chore(deps): bump codecov/codecov-action from 5.5.2 to 6.0.0 in #1475 - Thanks @dependabot[bot]!
- chore(deps): bump slackapi/slack-github-action from 2.1.1 to 3.0.1 in #1476 - Thanks @dependabot[bot]!
- chore(deps): bump dependabot/fetch-metadata from 2.5.0 to 3.0.0 in #1477 - Thanks @dependabot[bot]!
👋 New Contributors 🎉
Full Changelog: v1.27.0...v1.28.0
Milestone: https://github.com/slackapi/bolt-python/milestone/96
Package: https://pypi.org/project/slack-bolt/1.28.0/
Contributors
mwbrooks, zimeg, and 5 other contributors
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
v1.27.0
9cba291
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Contributors
mwbrooks, zimeg, and 3 other contributors
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
v1.26.0
zimeg
released this
07 Oct 02:17
5f6196f
This commit was created on GitHub.com and signed with GitHub’s verified signature.
AI-Enabled Features: Loading States, Text Streaming, and Feedback Buttons
🍿 Preview
2025-10-06-loading-state-text-streaming-feedback.mov
📚 Changelog
⚡ Getting Started
Try the AI Agent Sample app to explore the AI-enabled features and existing Assistant helper:
# Create a new AI Agent app
$ slack create slack-ai-agent-app --template slack-samples/bolt-python-assistant-template
$ cd slack-ai-agent-app/
# Initialize Python Virtual Environment
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install -r requirements.txt
# Add your OPENAI_API_KEY
$ export OPENAI_API_KEY=sk-proj-ahM...
# Run the local dev server
$ slack run
After the app starts, send a message to the "slack-ai-agent-app" bot for a unique response.
⌛ Loading States
Loading states allows you to not only set the status (e.g. "My app is typing...") but also sprinkle some personality by cycling through a collection of loading messages.
Bolt Assistant Class usage:
@assistant.user_message
def respond_in_assistant_thread(
client: WebClient,
context: BoltContext,
get_thread_context: GetThreadContext,
logger: Logger,
payload: dict,
say: Say,
set_status: SetStatus,
):
set_status(
status="thinking...",
loading_messages=[
"Teaching the hamsters to type faster…",
"Untangling the internet cables…",
"Consulting the office goldfish…",
"Polishing up the response just for you…",
"Convincing the AI to stop overthinking…",
],
)
Web Client SDK usage:
@app.message()
def handle_message(client, context, event, message):
client.assistant_threads_setStatus(
channel_id=channel_id,
thread_ts=thread_ts,
status="thinking...",
loading_messages=[
"Teaching the hamsters to type faster…",
"Untangling the internet cables…",
"Consulting the office goldfish…",
"Polishing up the response just for you…",
"Convincing the AI to stop overthinking…",
],
)
# Start a new message stream
🔮 Text Streaming Helper
The chat_stream() helper utility can be used to streamline calling the 3 text streaming methods:
# Start a new message stream
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)
🔠 Text Streaming Methods
Alternative to the Text Streaming Helper is to call the individual methods.
1) client.chat_startStream
First, start a chat text stream to stream a response to any message:
@app.message()
def handle_message(message, client, context, event, message):
# Start a new message stream
stream_response = client.chat_startStream(
channel=channel_id,
recipient_team_id=team_id,
recipient_user_id=user_id,
thread_ts=thread_ts,
)
stream_ts = stream_response["ts"]
2) client.chat_appendStream
After starting a chat text stream, you can then append text to it in chunks (often from your favourite LLM SDK) to convey a streaming effect:
for event in returned_message:
if event.type == "response.output_text.delta":
client.chat_appendStream(
channel=channel_id,
ts=stream_ts,
markdown_text=f"{event.delta}"
)
else:
continue
3) client.chat_stopStream
Lastly, you can stop the chat text stream to finalize your message:
client.chat_stopStream(
channel=channel_id,
ts=stream_ts,
blocks=feedback_block
)
👍🏻 Feedback Buttons
Add feedback buttons to the bottom of a message, after stopping a text stream, to gather user feedback:
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
@app.message()
def handle_message(message, client):
# ... previous streaming code ...
# Stop the stream and add feedback buttons
feedback_block = create_feedback_block()
client.chat_stopStream(
channel=channel_id,
ts=stream_ts,
blocks=feedback_block
)
Ⓜ️ Markdown Text Support
chat_postMessage supports markdown_text
response = client.chat_postMessage(
channel="C111",
markdown_text=markdown_content,
)
Learn more in slackapi/python-slack-sdk#1718
🧩 Markdown Block
📚 https://docs.slack.dev/reference/block-kit/blocks/markdown-block/
from slack_sdk.models.blocks import MarkdownBlock
...
@app.message("hello")
def message_hello(say):
say(
blocks=[
MarkdownBlock(text="**lets's go!**"),
],
text="let's go!",
)
Learn more in slackapi/python-slack-sdk#1748
🎞️ Workflows Featured Methods
Add support for the workflows.featured.{add|list|remove|set} methods:
app.client.workflows_featured_add(channel_id="C0123456789", trigger_ids=["Ft0123456789"])
app.client.workflows_featured_list(channel_ids="C0123456789")
app.client.workflows_featured_remove(channel_id="C0123456789", trigger_ids=["Ft0123456789"])
app.client.workflows_featured_set(channel_id="C0123456789", trigger_ids=["Ft0123456789"])
Learn more in slackapi/python-slack-sdk#1712
What's Changed
👾 Enhancements
- feat: add ai-enabled features text streaming methods, feedback blocks, and loading state in #1387 - Thanks @zimeg!
📚 Documentation
- docs: add ai provider token instructions in #1340 - Thanks @zimeg!
- docs: updates for combined quickstart in #1378 - Thanks @haleychaas!
- docs: replace links from api.slack.com to docs.slack.dev redirects in #1383 - Thanks @zimeg!
🤖 Dependencies
- chore(deps): update pytest-cov requirement from <7,>=3 to >=3,<8 in #1365 - Thanks @dependabot[bot]!
- chore(deps): bump actions/setup-python from 5.6.0 to 6.0.0 in #1363 - Thanks @dependabot[bot]!
- chore(deps): bump actions/checkout from 4.2.2 to 5.0.0 in #1362 - Thanks @dependabot[bot]!
- chore(deps): bump actions/stale from 9.1.0 to 10.0.0 in #1361 - Thanks @dependabot[bot]!
- chore(deps): bump codecov/codecov-action from 5.4.3 to 5.5.1 in #1364 - Thanks @dependabot[bot]!
- build: require cheroot<11 with adapter test dependencies in #1375 - Thanks @zimeg!
- build(deps): remove pytest lower bounds from testing requirements in #1333 - Thanks @zimeg!
- chore(deps): bump mypy from 1.17.1 to 1.18.2 in #1379 - Thanks @dependabot[bot]!
🧰 Maintenance
- ci: post regression notifications if scheduled tests do not succeed in #1376 - Thanks @zimeg!
- build: install dependencies needed to autogenerate reference docs in #1377 - Thanks @zimeg!
- version 1.26.0 in #1388 - Thanks @zimeg!
Milestone: https://github.com/slackapi/bolt-python/milestone/94?closed=1
Full Changelog: v1.25.0...v1.26.0
Package: https://pypi.org/project/slack-bo...
Read more
Contributors
zimeg, dependabot, and haleychaas
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
ravikiranvm reacted with thumbs up emoji
jyje and tianyid7 reacted with hooray emoji
All reactions
-
👍
1 reaction
-
🎉
2 reactions
3 people reacted
version 1.25.0
3274d7a
This commit was created on GitHub.com and signed with GitHub’s verified signature.
What's Changed
Changes ⚠️
Docs 📖
Maintenance 🏗️
References
Contributors
WilliamBergamin and lukegalbraithrussell
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
version 1.24.0
67b873d
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changes
Beta feature
maintenance 🏗️
docs 📚
dependabot 
- chore(deps): update sanic requirement from <25,>=21 to >=21,<26 by @dependabot[bot] in #1285
- chore(deps): update falcon requirement from <4,>=2 to >=2,<5 by @dependabot[bot] in #1286
- chore(deps): bump the react group in /docs with 2 updates by @dependabot[bot] in #1288
- chore(deps): bump flake8 from 7.1.2 to 7.2.0 by @dependabot[bot] in #1287
- chore(deps): bump image-size from 1.2.0 to 1.2.1 in /docs by @dependabot[bot] in #1291
- chore(deps): bump estree-util-value-to-estree from 3.3.2 to 3.3.3 in /docs by @dependabot[bot] in #1294
- chore(deps): bump http-proxy-middleware from 2.0.7 to 2.0.9 in /docs by @dependabot[bot] in #1299
- chore(deps): bump codecov/test-results-action from 1.1.0 to 1.1.1 by @dependabot[bot] in #1310
- chore(deps): bump the docusaurus group in /docs with 5 updates by @dependabot[bot] in #1311
- chore(deps): bump mypy from 1.15.0 to 1.16.0 by @dependabot[bot] in #1309
- chore(deps): bump brace-expansion from 1.1.11 to 1.1.12 in /docs by @dependabot[bot] in #1321
- chore(deps): bump the docusaurus group in /docs with 5 updates by @dependabot[bot] in #1325
- chore(deps): bump flake8 from 7.2.0 to 7.3.0 by @dependabot[bot] in #1326
- chore(deps): bump mypy from 1.16.0 to 1.16.1 by @dependabot[bot] in #1327
- chore(deps): bump on-headers and compression in /docs by @dependabot[bot] in #1336
- chore(deps): update pytest requirement from <8.4,>=6.2.5 to >=6.2.5,<8.5 by @dependabot[bot] in #1328
- chore(deps): bump mypy from 1.16.1 to 1.17.1 by @dependabot[bot] in #1343
- chore(deps): bump the react group in /docs with 2 updates by @dependabot[bot] in #1344
- chore(deps): bump slackapi/slack-github-action from 2.1.0 to 2.1.1 by @dependabot[bot] in #1345
References
Contributors
zimeg, WilliamBergamin, and 4 other contributors
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
zimeg reacted with rocket emoji
1 person reacted
version 1.23.0
5c7974a
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changes
fixes 🏗️
docs 📚
dependabot 
- chore(deps): bump mypy from 1.13.0 to 1.14.1 by @dependabot in #1234
- chore(deps): bump prism-react-renderer from 2.4.0 to 2.4.1 in /docs by @dependabot in #1232
- chore(deps): update sanic requirement from <24,>=22 to >=22,<25 by @dependabot in #1233
- chore(deps): bump actions/stale from 9.0.0 to 9.1.0 by @dependabot in #1244
- chore(deps): bump the docusaurus group in /docs with 5 updates by @dependabot in #1243
- chore(deps): bump mypy from 1.14.1 to 1.15.0 by @dependabot in #1258
- chore(deps): update websockets requirement from <15 to <16 by @dependabot in #1260
- chore(deps): bump flake8 from 6.0.0 to 7.1.2 by @dependabot in #1259
- chore(deps): bump the react group in /docs with 2 updates by @dependabot in #1265
- chore(deps): bump prismjs from 1.29.0 to 1.30.0 in /docs by @dependabot in #1269
- chore(deps): bump @babel/runtime from 7.26.0 to 7.26.10 in /docs by @dependabot in #1275
- chore(deps): bump @babel/helpers from 7.26.0 to 7.26.10 in /docs by @dependabot in #1273
- chore(deps): bump @babel/runtime-corejs3 from 7.26.9 to 7.26.10 in /docs by @dependabot in #1274
Relevant changes
We've fixed a regression around the logger, by default the logger used by the WebClient will be the same as the one used by the Bolt application. If the WebClient defines its own logger then it will be used:
my_logger = logging.getLogger("my_logger")
app = App(client=WebClient(token=os.environ.get("SLACK_BOT_TOKEN"), logger=my_logger))
@app.command("/sample-command")
def sample_command(ack: Ack, client: WebClient):
ack()
assert client.logger.name == my_logger.name
New Contributors
References
Contributors
slackapi, zimeg, and 5 other contributors
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
zimeg reacted with hooray emoji
1 person reacted
version 1.22.0
9390d0a
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changes
Dependabot
References
Contributors
zimeg, WilliamBergamin, and 2 other contributors
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
version 1.21.3
Changes
- #1187 Add title argument to SetSuggestedPrompts arguments - Thanks @seratch
- #1216 Expose loop param on asyncio-based AsyncSocketModeHandler - Thanks @jantman
- #1202 Socket Mode: Failed to connect (error: string argument without an encoding) w/ Azure App Service + aiohttp 3.11.2 - Thanks @seratch @jeremybeeman
- #1199 Resolve Falcon 5.x type hint compatibility issue - Thanks @seratch
References
Contributors
seratch, jantman, and jeremybeeman
Assets
2
Loading
Uh oh!
There was an error while loading. Please reload this page.
|