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)}")