Spaces:
Sleeping
Sleeping
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 uuid | |
import shutil | |
app = Flask(__name__) | |
UPLOAD_FOLDER = 'uploads' | |
if not os.path.exists(UPLOAD_FOLDER): | |
os.makedirs(UPLOAD_FOLDER) | |
from inference_sdk import InferenceHTTPClient | |
def predict_disease(filepath): | |
CLIENT = InferenceHTTPClient( | |
api_url="https://classify.roboflow.com", | |
api_key="oF1aC4b1FBCDtK8CoKx7" | |
) | |
result = CLIENT.infer(filepath, model_id="plant-disease-detection-iefbi/1") | |
return result['predicted_classes'][0] | |
def predict_pest(filepath): | |
CLIENT = InferenceHTTPClient( | |
api_url="https://detect.roboflow.com", | |
api_key="oF1aC4b1FBCDtK8CoKx7") | |
result = CLIENT.infer(filepath, model_id="pest-detection-ueoco/1") | |
return result['predicted_classes'][0] | |
# 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' | |
# Placeholder functions for image classification | |
def classify_pest(image_path): | |
# Implement pest classification model here | |
return f"Detected Pest: [Pest Name] for image at {image_path}" | |
def classify_disease(image_path): | |
# Implement disease classification model here | |
return f"Detected Disease: [Disease Name] for image at {image_path}" | |
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)) | |
if num_media > 0: | |
media_url = request.values.get('MediaUrl0') | |
content_type = request.values.get('MediaContentType0') | |
if content_type.startswith('image/'): | |
r = requests.get(media_url) | |
# Generate a unique filename | |
filename = f"{uuid.uuid4()}.jpg" | |
filepath = os.path.join(UPLOAD_FOLDER, filename) | |
with open(filepath, 'wb') as out_file: | |
shutil.copyfileobj(r.raw, out_file) | |
try: | |
if ('pest' in incoming_msg) or ('Pest' in incoming_msg): | |
response_text = predict_pest(filepath) | |
elif ('disease' in incoming_msg) or ('Disease' in incoming_msg): | |
response_text = predict_disease(filepath) | |
else: | |
response_text = "Please specify if you want to detect a pest or a disease." | |
except Exception as e: | |
print(f"Error processing image: {e}") | |
response_text = 'Invalid image' | |
else: | |
response_text = "The attached file is not an image. Please send an image for classification." | |
elif 'bookkeeping' in incoming_msg: | |
response_text = "Please provide the details you'd like to record." | |
else: | |
response_text = get_agricultural_insights(incoming_msg) | |
send_message(sender, response_text) | |
return '', 204 # Return an empty response to Twilio | |
def get_agricultural_insights(query): | |
# Implement your agricultural insights logic here | |
return f"Insights related to: {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? You can send an image with "pest" or "disease" to classify it.' | |
) | |
if __name__ == '__main__': | |
send_initial_message('916382792828') | |
app.run(host='0.0.0.0', port=7860) |