""" Offline rule-based Tamil intent matcher — mirrors IntentParser.java from the Android app. Add more keyword variants as you test with real farmer speech. """ INTENT_KEYWORDS = { "SOIL_MOISTURE_QUERY": ["மண் ஈரப்பதம்", "மண்ணின் ஈரப்பதம்", "நிலத்தில் தண்ணீர்", "மண் எப்படி"], "TEMPERATURE_QUERY": ["வெப்பநிலை", "சூடு எவ்வளவு", "எவ்வளவு சூடு"], "HUMIDITY_QUERY": ["காற்றின் ஈரப்பதம்", "ஈரப்பதம் எவ்வளவு"], "PUMP_ON_COMMAND": ["பம்ப் ஆன்", "மோட்டார் ஆன்", "தண்ணீர் விடு", "பம்ப் இயக்கு"], "PUMP_OFF_COMMAND": ["பம்ப் ஆஃப்", "மோட்டார் ஆஃப்", "தண்ணீர் நிறுத்து", "பம்ப் நிறுத்து"], "PUMP_STATUS_QUERY": ["பம்ப் இயங்குகிறதா", "மோட்டார் நிலை", "பம்ப் நிலை"], "WEATHER_QUERY": ["வானிலை", "மழை பெய்யுமா", "இன்று வானிலை"], "MARKET_PRICE_QUERY": ["சந்தை விலை", "விலை என்ன", "இன்றைய விலை"], "DISEASE_DETECTION_REQUEST": ["நோய் பரிசோதனை", "தாவர நோய்", "இலை பார்"], "CROP_RECOMMENDATION_REQUEST": ["பயிர் பரிந்துரை", "என்ன பயிர் போடலாம்", "எந்த பயிர்"], "GREETING": ["வணக்கம்", "ஹலோ", "எப்படி இருக்க"], } def parse_intent(spoken_text: str) -> str: """Returns the matched intent name, or 'UNKNOWN' if nothing matches.""" if not spoken_text or not spoken_text.strip(): return "UNKNOWN" normalized = spoken_text.strip() for intent, keywords in INTENT_KEYWORDS.items(): for keyword in keywords: if keyword in normalized: return intent return "UNKNOWN" def generate_answer(intent: str, sensor_data: dict) -> str: """ Generates the Tamil spoken answer for a given intent. sensor_data is a dict like: {"soilMoisture": 45.0, "temperature": 29.5, "humidity": 60.0, "pumpStatus": False} """ if intent == "SOIL_MOISTURE_QUERY": val = sensor_data.get("soilMoisture") if val is None: return "மன்னிக்கவும், சென்சார் தகவல் இப்போது கிடைக்கவில்லை." return f"மண் ஈரப்பதம் தற்போது {round(val)} சதவீதம்." if intent == "TEMPERATURE_QUERY": val = sensor_data.get("temperature") if val is None: return "மன்னிக்கவும், சென்சார் தகவல் இப்போது கிடைக்கவில்லை." return f"வெப்பநிலை தற்போது {round(val)} டிகிரி செல்சியஸ்." if intent == "HUMIDITY_QUERY": val = sensor_data.get("humidity") if val is None: return "மன்னிக்கவும், சென்சார் தகவல் இப்போது கிடைக்கவில்லை." return f"காற்றின் ஈரப்பதம் தற்போது {round(val)} சதவீதம்." if intent == "PUMP_STATUS_QUERY": pump_on = sensor_data.get("pumpStatus", False) return "பம்ப் தற்போது இயங்குகிறது." if pump_on else "பம்ப் தற்போது நிறுத்தப்பட்டுள்ளது." if intent == "PUMP_ON_COMMAND": sensor_data["pumpStatus"] = True return "பம்ப் இயக்கப்படுகிறது." if intent == "PUMP_OFF_COMMAND": sensor_data["pumpStatus"] = False return "பம்ப் நிறுத்தப்படுகிறது." if intent == "WEATHER_QUERY": return "வானிலை தகவலை இப்போது பெறுகிறேன். (weather API integration pending)" if intent == "MARKET_PRICE_QUERY": return "சந்தை விலை தகவலை இப்போது பெறுகிறேன். (market API integration pending)" if intent == "DISEASE_DETECTION_REQUEST": return "தாவர நோய் கண்டறிதலுக்கு புகைப்படம் எடுக்கவும்." if intent == "CROP_RECOMMENDATION_REQUEST": return "பயிர் பரிந்துரைக்கு மண் தகவலை உள்ளிடவும்." if intent == "GREETING": return "வணக்கம்! நான் உங்கள் விவசாய உதவியாளர். எப்படி உதவ முடியும்?" return "மன்னிக்கவும், எனக்கு புரியவில்லை. மீண்டும் சொல்லுங்கள்."