|
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_dotenv() |
|
|
|
|
|
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() |
|
|
|
|
|
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", |
|
) |
|
|
|
|
|
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) |
|
|
|
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" |
|
|
|
|
|
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) |
|
|
|
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 |
|
|
|
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: |
|
|
|
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) |
|
|