1+ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+ # SPDX-License-Identifier: MIT-0.
3+
4+ """
5+ AWS Lambda hosted Slack ChatBot integration to Amazon Bedrock Knowledge Base.
6+ Expects Slack Bot Slash Command given by the SLACK_SLASH_COMMAND param and presents
7+ a user query to the Bedrock Knowledge Base described by the KNOWLEDGEBASE_ID parameter.
8+
9+ The user query is used in a Bedrock KB ReteriveandGenerate API call and the KB
10+ response is presented to the user in Slack.
11+
12+ Slack integration based on SlackBolt library and examples given at:
13+ https://github.com/slackapi/bolt-python/blob/main/examples/aws_lambda/lazy_aws_lambda.py
14+ """
15+
16+ __version__ = "0.0.1"
17+ __status__ = "Development"
18+ __copyright__ = "Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved."
19+ __author__ = "Dean Colcott <https://www.linkedin.com/in/deancolcott/>"
20+
121import os
222import json
323import boto3
424import logging
525from slack_bolt import App
626from slack_bolt .adapter .aws_lambda import SlackRequestHandler
7- from slack_sdk import WebClient
8- from slack_sdk .errors import SlackApiError
927
1028
1129# Get params from SSM
@@ -27,8 +45,8 @@ def get_parameter(parameter_name):
2745 return parameter_value
2846
2947 except Exception as e :
30- logging . error (f"Error getting parameter { parameter_name } : { str (e )} " )
31- raise
48+ print (f"Error getting parameter { parameter_name } : { str (e )} " )
49+ raise e
3250
3351
3452# Get parameter names from environment variables
@@ -80,11 +98,15 @@ def respond_to_slack_within_3_seconds(body, ack):
8098 try :
8199 user_query = body ["text" ]
82100 logging .info (
83- f"Acknowledging slash command { SLACK_SLASH_COMMAND } - User Query: { user_query } "
101+ f"$ { SLACK_SLASH_COMMAND } - Acknowledging command: { SLACK_SLASH_COMMAND } - User Query: { user_query } \n "
84102 )
85- ack (f"\n Processing Request: { user_query } " )
103+ ack (f"\n ${ SLACK_SLASH_COMMAND } - Processing Request: { user_query } " )
104+
86105 except Exception as err :
87- logging .error (f"Ack handler error: { err } " )
106+ print (f"${ SLACK_SLASH_COMMAND } - Error: { err } " )
107+ respond (
108+ f"${ SLACK_SLASH_COMMAND } - Sorry an error occurred. Please try again later. Error: { err } "
109+ )
88110
89111
90112def process_command_request (respond , body ):
@@ -95,34 +117,19 @@ def process_command_request(respond, body):
95117 try :
96118 # Get the user query
97119 user_query = body ["text" ]
98- channel_id = body ["channel_id" ]
99- user_id = body ["user_id" ]
100- # Use thread_ts for thread replies, or fallback to message_ts
101- thread_ts = body .get ("thread_ts" ) or body .get ("message_ts" )
102-
103120 logging .info (
104- f"Processing command: { SLACK_SLASH_COMMAND } - User Query: { user_query } "
121+ f"$ { SLACK_SLASH_COMMAND } - Responding to command: { SLACK_SLASH_COMMAND } - User Query: { user_query } "
105122 )
106123
107124 kb_response = get_bedrock_knowledgebase_response (user_query )
108125 response_text = kb_response ["output" ]["text" ]
126+ respond (f"\n ${ SLACK_SLASH_COMMAND } - Response: { response_text } \n " )
109127
110- client = WebClient (token = bot_token )
111-
112- # Prepare payload: reply in thread if thread_ts is provided.
113- message_payload = {
114- "channel" : channel_id ,
115- "text" : f"*Question from <@{ user_id } >:*\n { user_query } \n \n *Answer:*\n { response_text } "
116- }
117- if thread_ts :
118- message_payload ["thread_ts" ] = thread_ts
119-
120- client .chat_postMessage (** message_payload )
121-
122- except SlackApiError as e :
123- logging .error (f"Slack API error posting message: { e .response ['error' ]} " )
124128 except Exception as err :
125- logging .error (f"Handler error: { err } " )
129+ print (f"${ SLACK_SLASH_COMMAND } - Error: { err } " )
130+ respond (
131+ f"${ SLACK_SLASH_COMMAND } - Sorry an error occurred. Please try again later. Error: { err } "
132+ )
126133
127134
128135def get_bedrock_knowledgebase_response (user_query ):
@@ -177,6 +184,6 @@ def get_bedrock_knowledgebase_response(user_query):
177184
178185# Lambda handler method.
179186def handler (event , context ):
180- logging . info (f"{ SLACK_SLASH_COMMAND } - Event: { event } " )
187+ print (f"$ { SLACK_SLASH_COMMAND } - Event: { event } \n " )
181188 slack_handler = SlackRequestHandler (app = app )
182189 return slack_handler .handle (event , context )
0 commit comments