Krish30's picture
Update app.py
ebd8505 verified
raw
history blame
9.19 kB
import os
import json
from datetime import datetime
import streamlit as st
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from langchain_groq import ChatGroq
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationalRetrievalChain
from deep_translator import GoogleTranslator
# Directory paths and configurations
working_dir = os.path.dirname(os.path.abspath(__file__))
config_data = json.load(open(f"{working_dir}/config.json"))
GROQ_API_KEY = config_data["GROQ_API_KEY"]
os.environ["GROQ_API_KEY"] = GROQ_API_KEY
# Vectorstore setup
def setup_vectorstore():
embeddings = HuggingFaceEmbeddings()
vectorstore = Chroma(persist_directory="soil_vectordb", embedding_function=embeddings)
return vectorstore
# Chatbot chain setup
def chat_chain(vectorstore):
llm = ChatGroq(model="llama-3.1-70b-versatile", temperature=0)
retriever = vectorstore.as_retriever()
memory = ConversationBufferMemory(
llm=llm,
output_key="answer",
memory_key="chat_history",
return_messages=True
)
chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
chain_type="stuff",
memory=memory,
verbose=True,
return_source_documents=True
)
return chain
# Updated Streamlit setup with language selection dropdown
st.set_page_config(page_title="Soil.Ai", page_icon="🌱", layout="centered")
st.title("🌱 Soil.Ai - Smart Farming Recommendations")
st.subheader("AI-driven solutions for modern farming!")
# Initialize session state
if "username" not in st.session_state:
username = st.text_input("Enter your name to proceed:")
if username:
with st.spinner("Loading AI interface..."):
st.session_state.username = username
st.session_state.vectorstore = setup_vectorstore()
st.session_state.conversational_chain = chat_chain(st.session_state.vectorstore)
st.session_state.selected_language = "English" # Default language
st.success(f"Welcome, {username}! Start by choosing an option.")
else:
username = st.session_state.username
# Language options
languages = [
"English", "Marathi", "Hindi", "Bengali", "Gujarati", "Kannada", "Malayalam",
"Odia", "Punjabi", "Tamil", "Telugu", "Urdu", "Spanish", "French", "German"
]
# Main interface
if "conversational_chain" not in st.session_state:
st.session_state.vectorstore = setup_vectorstore()
st.session_state.conversational_chain = chat_chain(st.session_state.vectorstore)
if "username" in st.session_state:
st.subheader(f"Hello {username}, choose your option below:")
# Dropdown for selecting output language
st.session_state.selected_language = st.selectbox(
"Select output language:",
languages,
index=languages.index(st.session_state.get("selected_language", "English"))
)
# Option selection
option = st.radio(
"Choose an action:",
("Ask a general agriculture-related question", "Input sensor data for recommendations", "Satellite Data", "FAQ Section")
)
# Option 1: Ask AI any agriculture-related question
if option == "Ask a general agriculture-related question":
user_query = st.chat_input("Ask AI anything about agriculture...")
if user_query:
with st.spinner("Processing your query..."):
# Display user's query
with st.chat_message("user"):
st.markdown(user_query)
# Get assistant's response
with st.chat_message("assistant"):
response = st.session_state.conversational_chain({"question": user_query})
assistant_response = response["answer"]
# Translate response based on selected language
translator = GoogleTranslator(source="en", target=st.session_state.selected_language.lower())
translated_response = translator.translate(assistant_response)
# Display response in selected language
st.markdown(f"**{st.session_state.selected_language}:** {translated_response}")
# Option 2: Input sensor data for recommendations
elif option == "Input sensor data for recommendations":
st.markdown("### Enter soil and environmental parameters:")
ph = st.number_input("Enter Soil pH", min_value=0.0, max_value=14.0, step=0.1)
moisture = st.number_input("Enter Soil Moisture (%)", min_value=0.0, max_value=100.0, step=0.1)
temperature = st.number_input("Enter Temperature (°C)", min_value=-50.0, max_value=60.0, step=0.1)
air_quality = st.number_input("Enter Air Quality Index (AQI)", min_value=0, max_value=500, step=1)
if st.button("Get Recommendations"):
if ph and moisture and temperature and air_quality:
with st.spinner("Analyzing data..."):
# Prepare input query
user_input = f"Recommendations for:\n- pH: {ph}\n- Moisture: {moisture}%\n- Temperature: {temperature}°C\n- Air Quality: {air_quality}"
# Display user's input
with st.chat_message("user"):
st.markdown(user_input)
# Get assistant's response
with st.chat_message("assistant"):
response = st.session_state.conversational_chain({"question": user_input})
assistant_response = response["answer"]
# Translate response based on selected language
translator = GoogleTranslator(source="en", target=st.session_state.selected_language.lower())
translated_response = translator.translate(assistant_response)
# Display response in selected language
st.markdown(f"**{st.session_state.selected_language}:** {translated_response}")
else:
st.error("Please fill in all the fields!")
# Option 3: Satellite Data
elif option == "Satellite Data":
st.markdown("### Satellite Data Functionality Coming Soon!")
# Option 4: FAQ Section
elif option == "FAQ Section":
crop = st.radio("Select a crop for FAQs:", ("Cotton", "Tur"))
if crop == "Tur":
st.markdown("### *Q&A on Arhar Crop*")
tur_questions = [
"Q1: What are the suitable climate and soil requirements for Arhar cultivation?",
"Q2: What is the best time for sowing Arhar, and how much seed is needed per hectare?",
"Q3: What are the improved varieties of Arhar and their characteristics?",
"Q4: What fertilizers and irrigation are required for Arhar cultivation?",
"Q5: What are the main pests and diseases affecting Arhar, and how can they be managed?"
]
tur_answers = [
"A: Arhar requires a warm and dry climate with a temperature range of 25-30°C. It thrives in well-drained loamy soil with a pH value of 6.0 to 7.5.",
"A: The best time for sowing Arhar is from June to July (monsoon season). The seed requirement is 15-20 kg per hectare. The seeds should be treated with Trichoderma or Carbendazim before sowing.",
"A: Some improved varieties of Arhar include ICPL-87 (early maturing), Sharad (high-yielding), and Pant Arhar-3 (short-duration).",
"A: Fertilizers: Nitrogen: 20 kg/hectare, Phosphorus: 50 kg/hectare. Irrigation: Two to three irrigations during flowering and pod formation stages.",
"A: Pests like pod borers and diseases like wilt (root rot) affect Arhar. Control measures include spraying neem oil and using disease-resistant varieties."
]
elif crop == "Cotton":
st.markdown("### *Q&A on Cotton Crop*")
tur_questions = [
"Q1: What is the suitable climate for cotton cultivation?",
"Q2: How much water does cotton require during its growth?",
"Q3: What are the common pests and diseases in cotton?",
"Q4: Which fertilizers are best for cotton farming?",
"Q5: What is the average yield of cotton per hectare?"
]
tur_answers = [
"A: Cotton grows well in warm climates with temperatures between 21-30°C.",
"A: Cotton requires about 700-1300 mm of water depending on the variety and climate.",
"A: Common pests include bollworms; diseases include leaf curl virus.",
"A: Use nitrogen (60 kg/ha), phosphorus (30 kg/ha), and potassium (30 kg/ha).",
"A: Average yield ranges between 500-800 kg/ha depending on the variety and conditions."
]
for q, a in zip(tur_questions, tur_answers):
translator = GoogleTranslator(source="en", target=st.session_state.selected_language.lower())
st.markdown(f"**{translator.translate(q)}**\n\n{translator.translate(a)}")