Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import requests | |
| from transformers import pipeline | |
| # Cache the AI models to avoid reloading them on every interaction | |
| def load_qa_model(): | |
| try: | |
| return pipeline("question-answering", model="distilbert-base-cased-distilled-squad", framework="pt") | |
| except Exception as e: | |
| st.error(f"Error loading QA model: {e}") | |
| return None | |
| def load_text_generation_model(): | |
| try: | |
| return pipeline("text-generation", model="gpt2", framework="pt") | |
| except Exception as e: | |
| st.error(f"Error loading text generation model: {e}") | |
| return None | |
| # Initialize the AI models | |
| qa_pipeline = load_qa_model() | |
| text_generation_pipeline = load_text_generation_model() | |
| # Cache the plant data fetching function to avoid redundant API calls | |
| # Cache for 1 hour | |
| def fetch_plant_data(plant_name): | |
| url = f"https://openfarm.cc/api/v1/crops?filter={plant_name}" | |
| try: | |
| response = requests.get(url) | |
| response.raise_for_status() # Raise an error for bad status codes | |
| data = response.json() | |
| if data.get("data"): | |
| # Get the first result (most likely match) | |
| plant_info = data["data"][0]["attributes"] | |
| return { | |
| "name": plant_info.get("name", plant_name), | |
| "description": plant_info.get("description", "No description available."), | |
| "image_url": plant_info.get("main_image_path", None), | |
| "sun_requirements": plant_info.get("sun_requirements", "No information available."), | |
| "watering": plant_info.get("watering", "No specific instructions available."), | |
| "growth_rate": plant_info.get("growth_rate", "No information available."), | |
| "spacing": plant_info.get("spacing", "No information available."), | |
| "sowing_method": plant_info.get("sowing_method", "No information available."), | |
| } | |
| else: | |
| st.warning(f"No data found for the plant: {plant_name}") | |
| return None | |
| except requests.exceptions.RequestException as e: | |
| st.error(f"Error fetching plant data: {e}") | |
| return None | |
| # Function to generate watering instructions using AI | |
| def refine_watering_instructions(plant_name, basic_instructions=None): | |
| prompt = ( | |
| f"Provide detailed watering instructions for the plant '{plant_name}'. " | |
| f"Base your response on the following basic instructions: '{basic_instructions}'. " | |
| "Include information on how often to water, the amount of water needed, and any seasonal variations." | |
| ) | |
| try: | |
| result = text_generation_pipeline(prompt, max_length=200, num_return_sequences=1) | |
| return result[0]["generated_text"] | |
| except Exception as e: | |
| st.error(f"Error generating watering instructions: {e}") | |
| return "Unable to generate watering instructions at this time." | |
| # Function to check if the image URL is valid | |
| def is_valid_image_url(url): | |
| if url is None: | |
| return False | |
| try: | |
| response = requests.head(url) | |
| return response.status_code == 200 | |
| except requests.exceptions.RequestException: | |
| return False | |
| # Streamlit app | |
| def main(): | |
| st.title("π± AI-Powered Plant Care Guide") | |
| # Section 1: Search for plant care information | |
| st.header("Search for Plant Care Information") | |
| user_input = st.text_input("Enter the name of a plant", "") | |
| if st.button("Search"): | |
| if user_input.strip(): | |
| with st.spinner("Fetching plant data..."): | |
| plant_info = fetch_plant_data(user_input) | |
| if plant_info: | |
| st.success(f"Found information for {plant_info['name']}!") | |
| # Refine or generate AI-based watering instructions | |
| with st.spinner("Generating detailed watering instructions..."): | |
| plant_info["watering"] = refine_watering_instructions(user_input, basic_instructions=plant_info["watering"]) | |
| st.subheader(f"Care Instructions for {plant_info['name']}") | |
| st.write(f"**Description:** {plant_info['description']}") | |
| st.write(f"**Sun Requirements:** {plant_info['sun_requirements']}") | |
| st.write(f"**Growth Rate:** {plant_info['growth_rate']}") | |
| st.write(f"**Spacing:** {plant_info['spacing']}") | |
| st.write(f"**Sowing Method:** {plant_info['sowing_method']}") | |
| st.write(f"**Watering Instructions:** {plant_info['watering']}") | |
| # Display the image if the URL is valid | |
| if plant_info["image_url"] and is_valid_image_url(plant_info["image_url"]): | |
| st.image(plant_info["image_url"], caption=plant_info["name"], width=300) | |
| else: | |
| st.warning("No valid image available for this plant.") | |
| else: | |
| st.warning("No information found for the specified plant. Please try another name.") | |
| else: | |
| st.warning("Please enter a plant name to search.") | |
| if __name__ == "__main__": | |
| main() |