Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
7c2e23c
[Add] Implement Slack Socket Mode support
JCMarques15 Oct 15, 2024
c58c1eb
[Fix] Correct comment for Slack socket handler env variable
JCMarques15 Oct 15, 2024
f1aa978
[Fix] Correct Slack token reference in app.py docstring
JCMarques15 Oct 15, 2024
470d5ac
Merge remote-tracking branch 'upstream/main' into enable-slack-websocket
JCMarques15 Oct 17, 2024
ef30091
Merge branch 'main' into enable-slack-websocket
dokterbob Nov 6, 2024
affc956
[Add] Update gitignore with node dependencies
JCMarques15 Apr 30, 2025
5da9a80
[Cut] Move Slack websocket test to Cookbook repo
JCMarques15 Apr 30, 2025
9e6a9aa
[Add] Slack Socket Mode tests
JCMarques15 Apr 30, 2025
ec8298d
Merge branch 'main' into enable-slack-websocket
JCMarques15 Apr 30, 2025
3436dfd
Merge branch 'main' into enable-slack-websocket
asvishnyakov Jul 18, 2025
5c1b321
Clean up Slack socket mode tests: remove unused import and fix commen…
JCMarques15 Jul 21, 2025
e26d353
Merge remote-tracking branch 'origin/main' into pr/JCMarques15/1436
JCMarques15 Jul 21, 2025
6c14508
Fix CI/CD test failure in slack socket mode tests
JCMarques15 Jul 21, 2025
5c0f433
Improve code formatting in Slack handler sections
JCMarques15 Jul 22, 2025
8857a30
Merge branch 'main' into enable-slack-websocket
hayescode Jul 23, 2025
c30b121
Merge branch 'main' into enable-slack-websocket
asvishnyakov Aug 7, 2025
8d4bc9b
Merge branch 'main' into enable-slack-websocket
hayescode Aug 14, 2025
410a822
Merge branch 'main' into enable-slack-websocket
hayescode Aug 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions backend/chainlit/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,13 @@ async def watch_files_for_changes():

discord_task = asyncio.create_task(client.start(discord_bot_token))

slack_task = None

# Slack Socket Handler if env variable SLACK_WEBSOCKET_TOKEN is set
if os.environ.get("SLACK_BOT_TOKEN") and os.environ.get("SLACK_WEBSOCKET_TOKEN"):
from chainlit.slack.app import start_socket_mode
slack_task = asyncio.create_task(start_socket_mode())

try:
yield
finally:
Expand All @@ -144,6 +151,10 @@ async def watch_files_for_changes():
if discord_task:
discord_task.cancel()
await discord_task

if slack_task:
slack_task.cancel()
await slack_task
except asyncio.exceptions.CancelledError:
pass

Expand Down Expand Up @@ -231,10 +242,10 @@ def get_build_dir(local_target: str, packaged_target: str) -> str:


# -------------------------------------------------------------------------------
# SLACK HANDLER
# SLACK HTTP HANDLER
# -------------------------------------------------------------------------------

if os.environ.get("SLACK_BOT_TOKEN") and os.environ.get("SLACK_SIGNING_SECRET"):
if os.environ.get("SLACK_BOT_TOKEN") and os.environ.get("SLACK_SIGNING_SECRET") and not os.environ.get("SLACK_WEBSOCKET_TOKEN"):
from chainlit.slack.app import slack_app_handler

@router.post("/slack/events")
Expand Down
11 changes: 11 additions & 0 deletions backend/chainlit/slack/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from chainlit.user import PersistedUser, User
from chainlit.user_session import user_session
from slack_bolt.adapter.fastapi.async_handler import AsyncSlackRequestHandler
from slack_bolt.adapter.socket_mode.async_handler import AsyncSocketModeHandler
from slack_bolt.async_app import AsyncApp


Expand Down Expand Up @@ -126,6 +127,16 @@ async def update_step(self, step_dict: StepDict):
)


async def start_socket_mode():
"""
Initializes and starts the Slack app in Socket Mode asynchronously.

Uses the SLACK_WEBSOCKET_TOKEN from environment variables to authenticate.
"""
handler = AsyncSocketModeHandler(slack_app, os.environ.get("SLACK_WEBSOCKET_TOKEN"))
await handler.start_async()


@trace
def init_slack_context(
session: HTTPSession,
Expand Down
18 changes: 18 additions & 0 deletions backend/chainlit/slack_websocket_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# This is a simple example to test the slack websocket handler.
# To initiate the websocket dont forget to set the variables:
# - SLACK_BOT_TOKEN
# - SLACK_SIGNING_SECRET
# - SLACK_WEBSOCKET_TOKEN <- this one dictates if websocket or http handler

from chainlit import Message, on_message, user_session


@on_message
async def main(message: Message):
client_type = user_session.get("client_type")
if client_type == "slack":
user_email = user_session.get("user").metadata.get("email")
print(f"Received a message from: {user_email}")
await Message(
content=f"Hi {user_email}, I have received the following message:\n{message.content}",
).send()
Comment thread
JCMarques15 marked this conversation as resolved.
Outdated