Spaces:
Running
Running
| from geopy.geocoders import Nominatim | |
| from geopy.exc import GeocoderTimedOut, GeocoderUnavailable | |
| from models.location_models import LocationData, Coordinates, ErrorResponse | |
| import google.generativeai as genai | |
| import requests | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| import json | |
| import os | |
| GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") | |
| genai.configure(api_key=GOOGLE_API_KEY) | |
| model = genai.GenerativeModel('gemini-1.5-flash') | |
| class LocationService: | |
| def extract_location_entities(ner_results): | |
| city, state, country = None, None, None | |
| for entity in ner_results: | |
| word = entity['word'].replace("##", "").strip() | |
| if entity['entity_group'] == 'CITY' and word.isalpha(): | |
| city = word | |
| elif entity['entity_group'] == 'STATE' and word.isalpha(): | |
| state = word | |
| elif entity['entity_group'] == 'COUNTRY' and word.isalpha(): | |
| country = word | |
| if city or state or country: | |
| return {k: v for k, v in {"city": city, "state": state, "country": country}.items() if v is not None} | |
| else: | |
| return None | |
| def get_llm_response(system_prompt) -> str: | |
| url = "https://api.openai.com/v1/chat/completions" | |
| headers = { | |
| "Content-Type": "application/json", | |
| "Authorization": f"Bearer {os.getenv('OPENAI_API_KEY')}", | |
| "OpenAI-Organization": os.getenv('ORG_ID') | |
| } | |
| data = { | |
| "model": "gpt-4o-mini", | |
| "max_tokens": 2000, | |
| "messages": [{"role": "user", "content": f"{system_prompt}"}], | |
| "temperature": 0.0 | |
| } | |
| try: | |
| response = requests.post(url, headers=headers, json=data) | |
| output = response.json() | |
| except Exception as e: | |
| print(f"Error Occurred {e}") | |
| return f"Error Occurred {e}" | |
| return output['choices'][0]['message']['content'] | |
| def system_prompt(location : str) -> str: | |
| return f"""You are a Text Analyser where you will extract city , state , country from given piece of text given below.You will strictly extract following keys from the text country , state , city. | |
| {location} \n | |
| Rules: | |
| 1. You will analyse the text and extract the country , city or state from the text , lets say if you have 'Udhampur, JK, India' , here JK means Jammu and Kashmir , so if you get any initials extract the exact name. | |
| 2. If any value is not found, return null. | |
| 3. If all values are null, return null. | |
| Ensure the strictly that output is a valid JSON object containing strictly the above keys, without any explanations. | |
| Generate a JSON response in the following format without using the ```json block. Ensure the output is properly formatted as plain text JSON. | |
| """ | |
| def get_lat_lng(data:dict): | |
| try: | |
| location = data.get('location') | |
| except: | |
| return Coordinates(latitude=None, longitude=None) | |
| url = f"https://maps.googleapis.com/maps/api/geocode/json?address={location}&key={os.getenv('GOOGLE_GEO_API_KEY')}" | |
| try: | |
| response = requests.get(url) | |
| json_data = response.json() | |
| lat = json_data.get('results',None)[0].get('geometry',None).get('location',None).get('lat') | |
| long = json_data.get('results',None)[0].get('geometry',None).get('location',None).get('lng') | |
| return Coordinates( | |
| latitude=lat, | |
| longitude=long | |
| ) | |
| except Exception as e: | |
| return Coordinates(latitude=None , longitude=None) | |
| def get_coordinates(data:dict) -> Coordinates | ErrorResponse: | |
| print("Inside get coordinates") | |
| print(data) | |
| try: | |
| location = data.get('location') | |
| except: | |
| return Coordinates(latitude=None, longitude=None) | |
| city = None | |
| state = None | |
| country = None | |
| if location: | |
| # Assuming `app.nlp` is already initialized elsewhere and accessible | |
| llm_prompt = LocationService.system_prompt(location) | |
| response = LocationService.get_llm_response(llm_prompt) | |
| # Extract city, state, and country using the logic from extract_location_entities | |
| location_entities = json.loads(response) | |
| if location_entities: | |
| city = location_entities.get('city') | |
| state = location_entities.get('state') | |
| country = location_entities.get('country') | |
| # Create the location string | |
| location_string = ' '.join(filter(None, [city, state, country])) | |
| if not location_string: | |
| location_string = location | |
| else: | |
| return ErrorResponse(error="No location information provided") | |
| geolocator = Nominatim(user_agent="Geolocation") | |
| print("Printing location string") | |
| print(location_string) | |
| if city or state or country : | |
| location_string = city | |
| elif country is None: | |
| location_string = city | |
| elif city is None: | |
| location_string = state | |
| elif state is None: | |
| location_string = city | |
| try: | |
| getLoc = geolocator.geocode(location_string) | |
| print(getLoc.latitude) | |
| print(getLoc.longitude) | |
| return Coordinates( | |
| latitude=getLoc.latitude, | |
| longitude=getLoc.longitude | |
| ) | |
| except Exception as e: | |
| print(f"Error {e}") | |
| return Coordinates(latitude=None , longitude=None) |