feat: add plan_update chunk for chat streaming#1821
Merged
zimeg merged 15 commits intofeat-ai-apps-thinking-stepsfrom Jan 17, 2026
Merged
feat: add plan_update chunk for chat streaming#1821zimeg merged 15 commits intofeat-ai-apps-thinking-stepsfrom
zimeg merged 15 commits intofeat-ai-apps-thinking-stepsfrom
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## feat-ai-apps-thinking-steps #1821 +/- ##
==============================================================
Coverage ? 83.96%
==============================================================
Files ? 116
Lines ? 13223
Branches ? 0
==============================================================
Hits ? 11103
Misses ? 2120
Partials ? 0 ☔ View full report in Codecov by Sentry. |
srtaalej
approved these changes
Jan 14, 2026
srtaalej
reviewed
Jan 14, 2026
| super().__init__(type=self.type) | ||
| show_unknown_key_warning(self, others) | ||
|
|
||
| self.title = title |
Contributor
There was a problem hiding this comment.
thanks for getting clarification on what this chunk should look like 😸
mwbrooks
approved these changes
Jan 16, 2026
Member
There was a problem hiding this comment.
✅ Thanks for adding the plan_update chunk!
🧪 Local testing works well on my side. Thanks for the code sample. In case others want to check, I'll include my listeners/assistant/message.py from the sample app.
bolt-python-assistant-template/listeners/assistant/message.py:
from logging import Logger
from typing import Dict, List
from slack_bolt import BoltContext, Say, SetStatus
from slack_sdk import WebClient
from ai.llm_caller import call_llm
from ..views.feedback_block import create_feedback_block
import time
from slack_sdk.models.messages.chunk import MarkdownTextChunk, TaskUpdateChunk, URLSource, PlanUpdateChunk
def message(
client: WebClient,
context: BoltContext,
logger: Logger,
payload: dict,
say: Say,
set_status: SetStatus,
):
"""
Handles when users send messages or select a prompt in an assistant thread and generate AI responses:
Args:
client: Slack WebClient for making API calls
context: Bolt context containing channel and thread information
logger: Logger instance for error tracking
payload: Event payload with message details (channel, user, text, etc.)
say: Function to send messages to the thread
set_status: Function to update the assistant's status
"""
try:
channel_id = payload["channel"]
team_id = context.team_id
thread_ts = payload["thread_ts"]
user_id = context.user_id
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…",
],
)
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"]})
streamer = client.chat_stream(
channel=channel_id,
recipient_team_id=team_id,
recipient_user_id=user_id,
thread_ts=thread_ts,
task_display_mode="plan",
)
streamer.append(
chunks=[
MarkdownTextChunk(
text="Hello.\nI have received the task. ",
),
MarkdownTextChunk(
text="This task appears manageable.\nThat is good.",
),
TaskUpdateChunk(
id="001",
title="Understanding the task...",
status="in_progress",
details="- Identifying the goal\n- Identifying constraints",
),
TaskUpdateChunk(
id="002",
title="Performing acrobatics...",
status="pending",
),
],
)
time.sleep(4)
streamer.append(
chunks=[
PlanUpdateChunk(
title="Adding the final pieces...",
),
TaskUpdateChunk(
id="001",
title="Understanding the task...",
status="complete",
details="\n- Pretending this was obvious",
output="We'll continue to ramble now",
),
TaskUpdateChunk(
id="002",
title="Performing acrobatics...",
status="in_progress",
),
],
)
time.sleep(4)
streamer.stop(
chunks=[
TaskUpdateChunk(
id="002",
title="Performing acrobatics...",
status="complete",
details="- Jumped atop ropes\n- Juggled bowling pins\n- Rode a single wheel too",
),
MarkdownTextChunk(
text="The crowd appears to be astound and applauds :popcorn:"
),
PlanUpdateChunk(
title="Celebrating a job well done!",
),
],
)
except Exception as e:
logger.exception(f"Failed to handle a user message event: {e}")
say(f":warning: Something went wrong! ({e})")
Base automatically changed from
zimeg-feat-ai-apps-chunks-streamer
to
feat-ai-apps-thinking-steps
January 16, 2026 23:25
Co-authored-by: Michael Brooks <mbrooks@slack-corp.com>
Member
Author
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR adds the
plan_updatechunk for updating the plan block title in chat streams.Testing
The following shows the plan block title updating after each few seconds:
Category
/docs(Documents)tests/integration_tests(Automated tests for this library)Requirements
python3 -m venv .venv && source .venv/bin/activate && ./scripts/run_validation.shafter making the changes.