Spaces:
Sleeping
Sleeping
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) | |