diff --git a/backend/danswer/connectors/slack/utils.py b/backend/danswer/connectors/slack/utils.py index dbbdac5090b..9a0ebb67a9d 100644 --- a/backend/danswer/connectors/slack/utils.py +++ b/backend/danswer/connectors/slack/utils.py @@ -143,7 +143,39 @@ def replace_user_ids_with_names(self, message: str) -> str: message = message.replace(f"<@{user_id}>", f"@{user_name}") except Exception: logger.exception( - f"Unable to replace user ID with username for user_id '{user_id}" + f"Unable to replace user ID with username for user_id '{user_id}'" ) return message + + @staticmethod + def replace_tags_basic(message: str) -> str: + """Simply replaces all tags with `@` in order to prevent us from + tagging users in Slack when we don't want to""" + # Find user IDs in the message + user_ids = re.findall("<@(.*?)>", message) + for user_id in user_ids: + message = message.replace(f"<@{user_id}>", f"@{user_id}") + return message + + @staticmethod + def replace_channels_basic(message: str) -> str: + """Simply replaces all channel mentions with `#` in order + to make a message work as part of a link""" + # Find user IDs in the message + channel_matches = re.findall("<#(.*?)\|(.*?)>", message) + for channel_id, channel_name in channel_matches: + message = message.replace( + f"<#{channel_id}|{channel_name}>", f"#{channel_name}" + ) + return message + + @staticmethod + def replace_special_mentions(message: str) -> str: + """Simply replaces @channel, @here, and @everyone so we don't tag + a bunch of people in Slack when we don't want to""" + # Find user IDs in the message + message = message.replace("", "@channel") + message = message.replace("", "@here") + message = message.replace("", "@everyone") + return message diff --git a/backend/danswer/listeners/slack_listener.py b/backend/danswer/listeners/slack_listener.py index 1470ca0a60a..e96a6457561 100644 --- a/backend/danswer/listeners/slack_listener.py +++ b/backend/danswer/listeners/slack_listener.py @@ -15,6 +15,7 @@ from danswer.configs.app_configs import QDRANT_DEFAULT_COLLECTION from danswer.configs.constants import DocumentSource from danswer.connectors.slack.utils import make_slack_api_rate_limited +from danswer.connectors.slack.utils import UserIdReplacer from danswer.direct_qa.answer_question import answer_question from danswer.direct_qa.interfaces import DanswerQuote from danswer.server.models import QAResponse @@ -65,6 +66,11 @@ def _build_custom_semantic_identifier( truncated_blurb = ( f"{blurb[:_MAX_BLURB_LEN]}..." if len(blurb) > _MAX_BLURB_LEN else blurb ) + # NOTE: removing tags so that we don't accidentally tag users in Slack + + # so that it can be used as part of a link + truncated_blurb = UserIdReplacer.replace_tags_basic(truncated_blurb) + truncated_blurb = UserIdReplacer.replace_channels_basic(truncated_blurb) + truncated_blurb = UserIdReplacer.replace_special_mentions(truncated_blurb) if truncated_blurb: return f"#{semantic_identifier}: {truncated_blurb}" else: @@ -118,6 +124,7 @@ def _process_documents( blurb=d.blurb, source=d.source_type, ) + top_document_lines.append(f"- <{d.link}|{custom_semantic_identifier}>") if len(top_document_lines) >= num_docs_to_display: break @@ -226,6 +233,7 @@ def _respond_in_thread( text: str, thread_ts: str, ) -> None: + logger.info(f"Trying to send message: {text}") slack_call = make_slack_api_rate_limited(client.web_client.chat_postMessage) response = slack_call( channel=channel,