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)