Skip to content

Commit db246f7

Browse files
committed
feat: use chat_stream for agent responses
Replace chat_postMessage with chat_stream for streaming agent responses to Slack. Instant messages like errors and empty-mention replies still use say. Feedback blocks are attached via streamer.stop().
1 parent 63d3842 commit db246f7

9 files changed

Lines changed: 74 additions & 108 deletions

File tree

claude-agent-sdk/listeners/events/app_mentioned.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ async def handle_app_mentioned(
2727
"""Handle @Casey mentions in channels."""
2828
try:
2929
channel_id = event["channel"]
30+
team_id = event.get("team")
3031
text = event.get("text", "")
3132
thread_ts = event.get("thread_ts") or event["ts"]
33+
user_id = event.get("user")
3234

3335
# Strip the bot mention from the text
3436
cleaned_text = re.sub(r"<@[A-Z0-9]+>", "", text).strip()
@@ -70,21 +72,16 @@ async def handle_app_mentioned(
7072
cleaned_text, session_id=existing_session_id
7173
)
7274

73-
# Post response in thread with feedback buttons
74-
feedback_blocks = create_feedback_block()
75-
response_blocks = [
76-
{
77-
"type": "markdown",
78-
"text": response_text,
79-
},
80-
*feedback_blocks,
81-
]
82-
await client.chat_postMessage(
75+
# Stream response in thread with feedback buttons
76+
streamer = await client.chat_stream(
8377
channel=channel_id,
78+
recipient_team_id=team_id,
79+
recipient_user_id=user_id,
8480
thread_ts=thread_ts,
85-
text=response_text,
86-
blocks=response_blocks,
8781
)
82+
await streamer.append(markdown_text=response_text)
83+
feedback_blocks = create_feedback_block()
84+
await streamer.stop(blocks=feedback_blocks)
8885

8986
# Store session ID for future context
9087
if new_session_id:

claude-agent-sdk/listeners/events/message_im.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@ async def handle_message_im(
3434

3535
try:
3636
channel_id = event["channel"]
37+
team_id = event.get("team")
3738
text = event.get("text", "")
3839
thread_ts = event.get("thread_ts") or event["ts"]
40+
user_id = event.get("user")
3941

4042
# Set assistant thread status with loading messages
4143
await client.assistant_threads_setStatus(
@@ -67,21 +69,16 @@ async def handle_message_im(
6769
text, session_id=existing_session_id
6870
)
6971

70-
# Post response in thread with feedback buttons
71-
feedback_blocks = create_feedback_block()
72-
response_blocks = [
73-
{
74-
"type": "markdown",
75-
"text": response_text,
76-
},
77-
*feedback_blocks,
78-
]
79-
await client.chat_postMessage(
72+
# Stream response in thread with feedback buttons
73+
streamer = await client.chat_stream(
8074
channel=channel_id,
75+
recipient_team_id=team_id,
76+
recipient_user_id=user_id,
8177
thread_ts=thread_ts,
82-
text=response_text,
83-
blocks=response_blocks,
8478
)
79+
await streamer.append(markdown_text=response_text)
80+
feedback_blocks = create_feedback_block()
81+
await streamer.stop(blocks=feedback_blocks)
8582

8683
# Store session ID for future context
8784
if new_session_id:

claude-agent-sdk/listeners/views/issue_modal.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ async def handle_issue_submission(
1515
await ack()
1616

1717
try:
18+
team_id = body["user"]["team_id"]
1819
user_id = body["user"]["id"]
1920
values = body["view"]["state"]["values"]
2021
category = values["category_block"]["category_select"]["selected_option"][
@@ -58,21 +59,16 @@ async def handle_issue_submission(
5859
# Run the agent
5960
response_text, new_session_id = await run_casey_agent(user_message)
6061

61-
# Post the response in thread with feedback buttons
62-
feedback_blocks = create_feedback_block()
63-
response_blocks = [
64-
{
65-
"type": "markdown",
66-
"text": response_text,
67-
},
68-
*feedback_blocks,
69-
]
70-
await client.chat_postMessage(
62+
# Stream the response in thread with feedback buttons
63+
streamer = await client.chat_stream(
7164
channel=channel_id,
65+
recipient_team_id=team_id,
66+
recipient_user_id=user_id,
7267
thread_ts=thread_ts,
73-
text=response_text,
74-
blocks=response_blocks,
7568
)
69+
await streamer.append(markdown_text=response_text)
70+
feedback_blocks = create_feedback_block()
71+
await streamer.stop(blocks=feedback_blocks)
7672

7773
# Store session ID for future context
7874
if new_session_id:

openai-agents-sdk/listeners/events/app_mentioned.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def handle_app_mentioned(client: WebClient, event: dict, logger: Logger, say: Sa
2626
"""Handle @Casey mentions in channels."""
2727
try:
2828
channel_id = event["channel"]
29+
team_id = event.get("team")
2930
text = event.get("text", "")
3031
thread_ts = event.get("thread_ts") or event["ts"]
3132
user_id = event["user"]
@@ -79,21 +80,16 @@ def handle_app_mentioned(client: WebClient, event: dict, logger: Logger, say: Sa
7980
)
8081
result = Runner.run_sync(casey_agent, input=input_items, context=deps)
8182

82-
# Post response in thread with feedback buttons
83-
feedback_blocks = create_feedback_block()
84-
response_blocks = [
85-
{
86-
"type": "markdown",
87-
"text": result.final_output,
88-
},
89-
*feedback_blocks,
90-
]
91-
client.chat_postMessage(
83+
# Stream response in thread with feedback buttons
84+
streamer = client.chat_stream(
9285
channel=channel_id,
86+
recipient_team_id=team_id,
87+
recipient_user_id=user_id,
9388
thread_ts=thread_ts,
94-
text=result.final_output,
95-
blocks=response_blocks,
9689
)
90+
streamer.append(markdown_text=result.final_output)
91+
feedback_blocks = create_feedback_block()
92+
streamer.stop(blocks=feedback_blocks)
9793

9894
# Store conversation history
9995
conversation_store.set_history(channel_id, thread_ts, result.to_input_list())

openai-agents-sdk/listeners/events/message_im.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def handle_message_im(client: WebClient, event: dict, logger: Logger, say: Say):
3333

3434
try:
3535
channel_id = event["channel"]
36+
team_id = event.get("team")
3637
text = event.get("text", "")
3738
thread_ts = event.get("thread_ts") or event["ts"]
3839
user_id = event["user"]
@@ -77,21 +78,16 @@ def handle_message_im(client: WebClient, event: dict, logger: Logger, say: Say):
7778
)
7879
result = Runner.run_sync(casey_agent, input=input_items, context=deps)
7980

80-
# Post response in thread with feedback buttons
81-
feedback_blocks = create_feedback_block()
82-
response_blocks = [
83-
{
84-
"type": "markdown",
85-
"text": result.final_output,
86-
},
87-
*feedback_blocks,
88-
]
89-
client.chat_postMessage(
81+
# Stream response in thread with feedback buttons
82+
streamer = client.chat_stream(
9083
channel=channel_id,
84+
recipient_team_id=team_id,
85+
recipient_user_id=user_id,
9186
thread_ts=thread_ts,
92-
text=result.final_output,
93-
blocks=response_blocks,
9487
)
88+
streamer.append(markdown_text=result.final_output)
89+
feedback_blocks = create_feedback_block()
90+
streamer.stop(blocks=feedback_blocks)
9591

9692
# Store conversation history
9793
conversation_store.set_history(channel_id, thread_ts, result.to_input_list())

openai-agents-sdk/listeners/views/issue_modal.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ def handle_issue_submission(ack: Ack, body: dict, client: WebClient, logger: Log
1414
ack()
1515

1616
try:
17+
team_id = body["user"]["team_id"]
1718
user_id = body["user"]["id"]
1819
values = body["view"]["state"]["values"]
1920
category = values["category_block"]["category_select"]["selected_option"][
@@ -63,21 +64,16 @@ def handle_issue_submission(ack: Ack, body: dict, client: WebClient, logger: Log
6364
)
6465
result = Runner.run_sync(casey_agent, input=user_message, context=deps)
6566

66-
# Post the response in thread with feedback buttons
67-
feedback_blocks = create_feedback_block()
68-
response_blocks = [
69-
{
70-
"type": "markdown",
71-
"text": result.final_output,
72-
},
73-
*feedback_blocks,
74-
]
75-
client.chat_postMessage(
67+
# Stream the response in thread with feedback buttons
68+
streamer = client.chat_stream(
7669
channel=channel_id,
70+
recipient_team_id=team_id,
71+
recipient_user_id=user_id,
7772
thread_ts=thread_ts,
78-
text=result.final_output,
79-
blocks=response_blocks,
8073
)
74+
streamer.append(markdown_text=result.final_output)
75+
feedback_blocks = create_feedback_block()
76+
streamer.stop(blocks=feedback_blocks)
8177

8278
# Store conversation history
8379
conversation_store.set_history(channel_id, thread_ts, result.to_input_list())

pydantic-ai/listeners/events/app_mentioned.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def handle_app_mentioned(client: WebClient, event: dict, logger: Logger, say: Sa
2525
"""Handle @Casey mentions in channels."""
2626
try:
2727
channel_id = event["channel"]
28+
team_id = event.get("team")
2829
text = event.get("text", "")
2930
thread_ts = event.get("thread_ts") or event["ts"]
3031
user_id = event["user"]
@@ -78,21 +79,16 @@ def handle_app_mentioned(client: WebClient, event: dict, logger: Logger, say: Sa
7879
message_history=history,
7980
)
8081

81-
# Post response in thread with feedback buttons
82-
feedback_blocks = create_feedback_block()
83-
response_blocks = [
84-
{
85-
"type": "markdown",
86-
"text": result.output,
87-
},
88-
*feedback_blocks,
89-
]
90-
client.chat_postMessage(
82+
# Stream response in thread with feedback buttons
83+
streamer = client.chat_stream(
9184
channel=channel_id,
85+
recipient_team_id=team_id,
86+
recipient_user_id=user_id,
9287
thread_ts=thread_ts,
93-
text=result.output,
94-
blocks=response_blocks,
9588
)
89+
streamer.append(markdown_text=result.output)
90+
feedback_blocks = create_feedback_block()
91+
streamer.stop(blocks=feedback_blocks)
9692

9793
# Store conversation history
9894
conversation_store.set_history(channel_id, thread_ts, result.all_messages())

pydantic-ai/listeners/events/message_im.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def handle_message_im(client: WebClient, event: dict, logger: Logger, say: Say):
3232

3333
try:
3434
channel_id = event["channel"]
35+
team_id = event.get("team")
3536
text = event.get("text", "")
3637
thread_ts = event.get("thread_ts") or event["ts"]
3738
user_id = event["user"]
@@ -75,21 +76,16 @@ def handle_message_im(client: WebClient, event: dict, logger: Logger, say: Say):
7576
message_history=history,
7677
)
7778

78-
# Post response in thread with feedback buttons
79-
feedback_blocks = create_feedback_block()
80-
response_blocks = [
81-
{
82-
"type": "markdown",
83-
"text": result.output,
84-
},
85-
*feedback_blocks,
86-
]
87-
client.chat_postMessage(
79+
# Stream response in thread with feedback buttons
80+
streamer = client.chat_stream(
8881
channel=channel_id,
82+
recipient_team_id=team_id,
83+
recipient_user_id=user_id,
8984
thread_ts=thread_ts,
90-
text=result.output,
91-
blocks=response_blocks,
9285
)
86+
streamer.append(markdown_text=result.output)
87+
feedback_blocks = create_feedback_block()
88+
streamer.stop(blocks=feedback_blocks)
9389

9490
# Store conversation history
9591
conversation_store.set_history(channel_id, thread_ts, result.all_messages())

pydantic-ai/listeners/views/issue_modal.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def handle_issue_submission(ack: Ack, body: dict, client: WebClient, logger: Log
1313
ack()
1414

1515
try:
16+
team_id = body["user"]["team_id"]
1617
user_id = body["user"]["id"]
1718
values = body["view"]["state"]["values"]
1819
category = values["category_block"]["category_select"]["selected_option"][
@@ -62,21 +63,16 @@ def handle_issue_submission(ack: Ack, body: dict, client: WebClient, logger: Log
6263
)
6364
result = casey_agent.run_sync(user_message, model=DEFAULT_MODEL, deps=deps)
6465

65-
# Post the response in thread with feedback buttons
66-
feedback_blocks = create_feedback_block()
67-
response_blocks = [
68-
{
69-
"type": "markdown",
70-
"text": result.output,
71-
},
72-
*feedback_blocks,
73-
]
74-
client.chat_postMessage(
66+
# Stream the response in thread with feedback buttons
67+
streamer = client.chat_stream(
7568
channel=channel_id,
69+
recipient_team_id=team_id,
70+
recipient_user_id=user_id,
7671
thread_ts=thread_ts,
77-
text=result.output,
78-
blocks=response_blocks,
7972
)
73+
streamer.append(markdown_text=result.output)
74+
feedback_blocks = create_feedback_block()
75+
streamer.stop(blocks=feedback_blocks)
8076

8177
# Store conversation history
8278
conversation_store.set_history(channel_id, thread_ts, result.all_messages())

0 commit comments

Comments
 (0)