Spaces:
Sleeping
Sleeping
File size: 6,791 Bytes
4603e82 1a0d7ed 4603e82 82f5b03 0ceeca1 0106da9 82f5b03 f8ef4e3 4603e82 44041d6 988c7cc 4603e82 12ad28b ca3edd3 af9a9df e011e39 06154c7 7b0749d 0106da9 06154c7 4603e82 988c7cc 4603e82 e011e39 4603e82 d7ccc91 79a0805 132bff0 d7ccc91 132bff0 79a0805 132bff0 79a0805 132bff0 79a0805 132bff0 79a0805 e011e39 4603e82 d7ccc91 4603e82 af9a9df bd9f315 4603e82 da3b169 4603e82 d19574b da3b169 2844b15 c139b20 793f3f7 c139b20 79a0805 d7ccc91 79a0805 c139b20 48a2276 c139b20 ac314de c139b20 ac314de af9a9df 4603e82 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
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"] )
# Configure log level
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
aai.settings.api_key = os.environ["aai_key"]
transcriber = aai.Transcriber()
# Authenticate to Firesotre 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
# Returned message type: interactive
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
@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)
messenger.send_message(message_type, recipient_id=mobile)
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:
response = str(generateResponse(message))
# Parse AI generated response into a structured format
parsed_trans_data = parse_multiple_transactions(response)
# messenger.send_message(message=f"{response} \n\n {parsed_trans_data}", recipient_id=mobile)
print("Response:", response)
logging.info(f"\nAnswer: {response}\n")
# Send confirmation button
# messenger_button(mobile, response)
messenger_reply_button(mobile, response)
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': # handle update
pass
elif intent == 'delete': # handle 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)
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)
res = transcript.text
messenger.send_message(message=res,recipient_id=mobile)
logging.info(f"\nAudio: {audio}\n")
response = str(generateResponse(res))
if isinstance(response, str):
messenger.send_message(message=f"{response}", recipient_id=mobile)
# elif isinstance(response, str) and os.path.isfile(response):
# messenger.send_image(image_path=response, 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) |