from twilio.rest import Client import yaml import json import os import sys from pathlib import Path from flask import Flask, request, redirect from twilio.twiml.messaging_response import MessagingResponse from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma from helper import retrieve_relevant_context, generate_response_with_context from pyngrok import ngrok # Setting up paths file = Path(__file__).resolve() parent, root = file.parent, file.parents[1] sys.path.append(str(root)) print("str(root):", str(root)) print("parent:", parent) print("CWD:", os.getcwd()) # Load relevant API Keys file_path = parent / 'Config/API_KEYS.yml' persist_directory = str(parent / 'vector_db/chroma_v01/') print("file_path:", file_path) print("persist_directory:", str(persist_directory)) with open(file_path, 'r') as file: api_keys = yaml.safe_load(file) # Extract OpenAI key openai_key = api_keys['OPEN_AI']['Key'] os.environ["OPENAI_API_KEY"] = openai_key # Extract Twilio credentials account_sid = api_keys['TWILIO']['account_sid'] auth_token = api_keys['TWILIO']['auth_token'] twilio_whatsapp_number = api_keys['TWILIO']['whatsapp_number'] print("====account_sid:=====", account_sid) # Initialize the embeddings model embedding_model = OpenAIEmbeddings() # Load the Chroma vector store vectordb = Chroma(persist_directory=persist_directory, embedding_function=embedding_model) # Setup Twilio client client = Client(account_sid, auth_token) # Example to send a WhatsApp message def send_whatsapp_message(to_number, message): """ Send a WhatsApp message using Twilio. :param to_number: str, recipient's WhatsApp number in the format 'whatsapp:+1234567890' :param message: str, message text to send """ from_number = f'whatsapp:{twilio_whatsapp_number}' to_number = f'whatsapp:{to_number}' message = client.messages.create( body=message, from_=from_number, to=to_number ) print(f"Message sent with SID: {message.sid}") # Example usage if __name__ == "__main__": recipient_number = '+91-9108843322' # Replace with the recipient's WhatsApp number text_message = 'Hello from Twilio WhatsApp!' send_whatsapp_message(recipient_number, text_message) # Flask app setup print("Flask app is running") app = Flask(__name__) @app.route("/whatsapp", methods=['GET', 'POST']) def incoming_sms(): """Send a dynamic reply to an incoming text message""" # Get the message the user sent our Twilio number body = request.values.get('Body', None) print("body:", body) incoming_msg = body.strip() if not incoming_msg: return str(MessagingResponse()) # Generate response using the RAG-powered system retrieved_texts = retrieve_relevant_context(vectordb, incoming_msg) context = "\n".join(retrieved_texts) response = generate_response_with_context(incoming_msg, context) print("response:", response) # Start our TwiML response resp = MessagingResponse() print("TwiML resp:", resp) resp.message(response) return str(resp) if __name__ == "__main__": # Set NGROK_HOME to a writable directory os.environ["NGROK_HOME"] = str(parent / 'ngrok') # Start ngrok tunnel ngrok_tunnel = ngrok.connect(5000) print(f"ngrok tunnel 'http' URL: {ngrok_tunnel.public_url}") # Print the ngrok URL so you can set it in Twilio webhook print("ngrok URL:", ngrok_tunnel.public_url + "/whatsapp") app.run(host='0.0.0.0', port=5000, debug=True)