AgriChatbot / app.py
Neurolingua's picture
Update app.py
9bac017 verified
raw
history blame
4.62 kB
from flask import Flask, request
from twilio.twiml.messaging_response import MessagingResponse
from twilio.rest import Client
import os
import requests
from PIL import Image
import io
import threading
import uuid
import shutil
from other_function import predict_pest,predict_disease,convert_img,generate_response,ConversationBufferMemory,get_weather,get_rates
app = Flask(__name__)
UPLOAD_FOLDER = '/code/uploads'
if not os.path.exists(UPLOAD_FOLDER):
os.makedirs(UPLOAD_FOLDER)
conversation_memory = ConversationBufferMemory(max_size=6)
def handle_rates(sender, incoming_msg, chat_history):
def callback(result):
response_text = generate_response(incoming_msg + ' data ' + result, chat_history)
conversation_memory.add_to_memory({"user": incoming_msg, "assistant": response_text})
send_message(sender, response_text)
result = get_rates()
callback(result)
# Initialize the Flask app
account_sid = os.environ.get('TWILIO_ACCOUNT_SID')
auth_token = os.environ.get('TWILIO_AUTH_TOKEN')
client = Client(account_sid, auth_token)
# WhatsApp number to send messages from (your Twilio number)
from_whatsapp_number = 'whatsapp:+14155238886'
@app.route('/whatsapp', methods=['POST'])
@app.route('/whatsapp', methods=['POST'])
def whatsapp_webhook():
incoming_msg = request.values.get('Body', '').lower()
sender = request.values.get('From')
# Check if an image is attached
num_media = int(request.values.get('NumMedia', 0))
# Get the chat history
chat_history = conversation_memory.get_memory()
if num_media > 0:
media_url = request.values.get('MediaUrl0')
content_type = request.values.get('MediaContentType0')
if content_type.startswith('image/'):
filepath = convert_img(media_url, account_sid, auth_token)
try:
disease = predict_disease(filepath)
except:
disease = None
try:
pest = predict_pest(filepath)
except:
pest = None
if disease:
response_text = f"Detected disease: {disease}"
# Generate additional insights about the disease
disease_info = generate_response(f"Provide brief information about {disease} in plants", chat_history)
response_text += f"\n\nAdditional information: {disease_info}"
elif pest:
response_text = f"Detected pest: {pest}"
# Generate additional insights about the pest
pest_info = generate_response(f"Provide brief information about {pest} in agriculture", chat_history)
response_text += f"\n\nAdditional information: {pest_info}"
else:
response_text = "Please upload another image with good quality."
else:
response_text = "The attached file is not an image. Please send an image for classification."
elif ('weather' in incoming_msg.lower()) or ('climate' in incoming_msg.lower()) or ('temperature' in incoming_msg.lower()):
response_text=get_weather(incoming_msg.lower())
elif 'bookkeeping' in incoming_msg:
response_text = "Please provide the details you'd like to record."
elif ('rates' in incoming_msg.lower()) or ('price' in incoming_msg.lower()) or ('market' in incoming_msg.lower()) or ('rate' in incoming_msg.lower()) or ('prices' in incoming_msg.lower()):
handle_rates(sender, incoming_msg, chat_history)
return '', 204
else:
# Generate response considering the chat history
response_text = generate_response(incoming_msg, chat_history)
# Add the interaction to memory
conversation_memory.add_to_memory({"user": incoming_msg, "assistant": response_text})
send_message(sender, response_text)
return '', 204
def get_agricultural_insights(query):
return generate_response(query)
def send_message(to, body):
try:
message = client.messages.create(
from_=from_whatsapp_number,
body=body,
to=to
)
print(f"Message sent with SID: {message.sid}")
except Exception as e:
print(f"Error sending message: {e}")
# Function to send an initial message
def send_initial_message(to_number):
send_message(
f'whatsapp:{to_number}',
'Welcome to the Agri AI Chatbot! How can I assist you today?'
)
if __name__ == '__main__':
send_initial_message('916382792828')
send_initial_message('919080522395')
app.run(host='0.0.0.0', port=7860)