from flask import Flask, request, make_response import os import logging from dotenv import load_dotenv from heyoo import WhatsApp import assemblyai as aai import openai from utility import generateResponse, parse_multiple_transactions, create_inventory, create_sale, read_datalake from google.cloud import firestore import ast # load env data load_dotenv() # messenger object messenger = WhatsApp( os.environ["whatsapp_token"], phone_number_id=os.environ["phone_number_id"] ) aai.settings.api_key = os.environ["aai_key"] transcriber = aai.Transcriber() # Authenticate to Firestore with the JSON account key db = firestore.Client.from_service_account_json("firestore-key.json") app = Flask(__name__) VERIFY_TOKEN = "30cca545-3838-48b2-80a7-9e43b1ae8ce4" client = openai.OpenAI( api_key=os.environ.get("sambanova_api_key"), base_url="https://api.sambanova.ai/v1", ) # Interactive button def messenger_button(recipient_phone, message, header='Transaction Confirmation', footer='', btn_name='Confirm Details'): messenger.send_button( recipient_id=recipient_phone, button={ "header": f"{header}", "body": f"{message}", "footer": f"{footer}", "action": { "button": f"{btn_name}", "sections": [ { "title": "iBank", "rows": [ {"id": "confirm", "title": "Record Transaction", "description": ""}, {"id": "cancel", "title": "Cancel Transaction", "description": ""}, ], } ], }, }, ) def messenger_reply_button(recipient_phone, message): messenger.send_reply_button( recipient_id=f"{recipient_phone}", button={ "type": "button", "body": { "text": f"{message}" }, "action": { "buttons": [ { "type": "reply", "reply": { "id": "confirm", "title": "Record Transaction" } }, { "type": "reply", "reply": { "id": "cancel", "title": "Cancel" } } ] } }, ) def respond(query_str: str): response = "hello, I don't have a brain yet" return response def process_user_msg(message, mobile): response = str(generateResponse(message)) parsed_trans_data = parse_multiple_transactions(response) # return None, parsed_trans_data, response logging.info(f"\nAnswer: {response}\n") intent = parsed_trans_data[0]['intent'].lower() trans_type = parsed_trans_data[0]['transaction_type'].lower() if intent == 'create': if trans_type == 'purchase': if create_inventory(mobile, parsed_trans_data): firestore_msg = "Transaction recorded successfully!" else: firestore_msg = "Sorry, could not record transaction!" elif trans_type == 'sale': if create_sale(mobile, parsed_trans_data): firestore_msg = "Transaction recorded successfully!" else: firestore_msg = "Sorry, could not record transaction!" elif intent == 'update': pass elif intent == 'delete': pass elif intent == 'read': response = str(read_datalake(mobile, message)) parsed_trans_data = "" firestore_msg = response else: firestore_msg = f'The detected intent, {intent}, is not currently supported!' return firestore_msg, parsed_trans_data, response @app.route("/", methods=["GET", "POST"]) def hook(): if request.method == "GET": if request.args.get("hub.verify_token") == VERIFY_TOKEN: logging.info("Verified webhook") response = make_response(request.args.get("hub.challenge"), 200) response.mimetype = "text/plain" return response logging.error("Webhook Verification failed") return "Invalid verification token" # get message update.. data = request.get_json() changed_field = messenger.changed_field(data) if changed_field == "messages": new_message = messenger.get_mobile(data) if new_message: mobile = messenger.get_mobile(data) message_type = messenger.get_message_type(data) if message_type == "text": message = messenger.get_message(data) # Handle greetings if message.lower() in ("hi", "hello", "help", "how are you"): response = "Hi there! My name is SmartLedger. How can I help you today?" messenger.send_message(message=f"{response}", recipient_id=mobile) else: messenger_reply_button(mobile, message) firestore_msg1, parsed_trans_data1, response1 = process_user_msg(message, mobile) messenger.send_message(f"Raw Response: {response1}, \n \n Parsed Response: {parsed_trans_data1}, \n \n Final Response: {firestore_msg1}", recipient_id=mobile) elif message_type == "audio": audio = messenger.get_audio(data) audio_id, mime_type = audio["id"], audio["mime_type"] audio_url = messenger.query_media_url(audio_id) audio_filename = messenger.download_media(audio_url, mime_type) transcript = transcriber.transcribe(audio_filename) print(audio_filename) print(transcript.text) transcribed_message = transcript.text # Handle greetings if transcribed_message.lower() in ("hi", "hello", "help", "how are you"): response = "Hi there! My name is SmartLedger. How can I help you today?" messenger.send_message(message=f"{response}", recipient_id=mobile) elif: # logging.info(f"\nAudio: {audio}\n") messenger_reply_button(mobile, transcribed_message) firestore_msg1, parsed_trans_data1, response1 = process_user_msg(transcribed_message, mobile) messenger.send_message(message=f"Raw Response: {response1}, \n \n Parsed Response: {parsed_trans_data1}, \n \n Final Response: {firestore_msg1}", recipient_id=mobile) else: messenger.send_message(message="Please send me text or audio messages", recipient_id=mobile) return "ok" if __name__ == '__main__': app.run(debug=True, host="0.0.0.0", port=7860)