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-
211import os
222import json
233import boto3
244import logging
255from slack_bolt import App
266from slack_bolt .adapter .aws_lambda import SlackRequestHandler
7+ from slack_sdk import WebClient
8+ from slack_sdk .errors import SlackApiError
279
2810
2911# Get params from SSM
@@ -45,8 +27,8 @@ def get_parameter(parameter_name):
4527 return parameter_value
4628
4729 except Exception as e :
48- print (f"Error getting parameter { parameter_name } : { str (e )} " )
49- raise e
30+ logging . error (f"Error getting parameter { parameter_name } : { str (e )} " )
31+ raise
5032
5133
5234# Get parameter names from environment variables
@@ -98,15 +80,11 @@ def respond_to_slack_within_3_seconds(body, ack):
9880 try :
9981 user_query = body ["text" ]
10082 logging .info (
101- f"$ { SLACK_SLASH_COMMAND } - Acknowledging command: { SLACK_SLASH_COMMAND } - User Query: { user_query } \n "
83+ f"Acknowledging slash command { SLACK_SLASH_COMMAND } - User Query: { user_query } "
10284 )
103- ack (f"\n ${ SLACK_SLASH_COMMAND } - Processing Request: { user_query } " )
104-
85+ ack (f"\n Processing Request: { user_query } " )
10586 except Exception as 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- )
87+ logging .error (f"Ack handler error: { err } " )
11088
11189
11290def process_command_request (respond , body ):
@@ -117,19 +95,34 @@ def process_command_request(respond, body):
11795 try :
11896 # Get the user query
11997 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+
120103 logging .info (
121- f"$ { SLACK_SLASH_COMMAND } - Responding to command: { SLACK_SLASH_COMMAND } - User Query: { user_query } "
104+ f"Processing command: { SLACK_SLASH_COMMAND } - User Query: { user_query } "
122105 )
123106
124107 kb_response = get_bedrock_knowledgebase_response (user_query )
125108 response_text = kb_response ["output" ]["text" ]
126- respond (f"\n ${ SLACK_SLASH_COMMAND } - Response: { response_text } \n " )
127109
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' ]} " )
128124 except Exception as 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- )
125+ logging .error (f"Handler error: { err } " )
133126
134127
135128def get_bedrock_knowledgebase_response (user_query ):
@@ -184,6 +177,6 @@ def get_bedrock_knowledgebase_response(user_query):
184177
185178# Lambda handler method.
186179def handler (event , context ):
187- print (f"$ { SLACK_SLASH_COMMAND } - Event: { event } \n " )
180+ logging . info (f"{ SLACK_SLASH_COMMAND } - Event: { event } " )
188181 slack_handler = SlackRequestHandler (app = app )
189182 return slack_handler .handle (event , context )
0 commit comments