Spaces:
Runtime error
Runtime error
| 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 | |
| from google.cloud import firestore | |
| # 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 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) | |
| 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) | |
| message = transcript.text | |
| messenger.send_message(message=f"Transcribed message:\n {message}", recipient_id=mobile) | |
| logging.info(f"\nAudio: {audio}\n") | |
| else: | |
| messenger.send_message(message="Please send me text or audio messages", recipient_id=mobile) | |
| return None | |
| # 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: | |
| response = str(generateResponse(message)) | |
| parsed_trans_data = parse_multiple_transactions(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 | |
| else: | |
| firestore_msg = f'The detected intent, {intent}, is not currently supported!' | |
| messenger.send_message(message=f"{response},\n\n {firestore_msg}", recipient_id=mobile) | |
| return "ok" | |
| if __name__ == '__main__': | |
| app.run(debug=True, host="0.0.0.0", port=7860) | |