| import os | |
| import json | |
| from fastapi import HTTPException | |
| from openai import OpenAI | |
| from . import open_meteo | |
| async def predict_weather_alert(latitude: float, longitude: float, api_key: str): | |
| """ | |
| Predicts weather alerts for a given location and crops using an OpenAI LLM. | |
| Args: | |
| latitude: The latitude of the location. | |
| longitude: The longitude of the location. | |
| crops: A list of crops to consider for the prediction. | |
| Returns: | |
| A dictionary containing the predicted weather alert. | |
| """ | |
| try: | |
| weather_data = await open_meteo.get_weather_forecast(latitude, longitude) | |
| except HTTPException as e: | |
| raise HTTPException(status_code=e.status_code, detail=f"Error getting weather data: {e.detail}") | |
| try: | |
| client = OpenAI(api_key=api_key) | |
| prompt = f""" | |
| Given the following weather data for a location: | |
| {weather_data} | |
| Please predict any potential weather alerts for these crops in the next 7 days. | |
| For the given region, consider what crops are possible to grow and their sensitivity to weather conditions. | |
| Include the following details in your response: | |
| - Expected weather conditions (e.g., temperature, precipitation, wind speed) | |
| - Potential weather alerts (e.g., frost, drought, heavy rainfall) | |
| - Impact on crops (e.g., growth, yield, disease risk) | |
| - Recommended actions for farmers (e.g., irrigation, protection measures) | |
| - Any other relevant information that could help farmers prepare for the weather conditions. | |
| Provide a summary of the potential impact on the crops and any recommended actions. | |
| Format your response as a JSON object with the following structure: | |
| {{ | |
| "alert": "Description of the alert", | |
| "impact": "Description of the impact on crops", | |
| "recommendations": "Recommended actions for farmers" | |
| }} | |
| Do not include any additional text outside of the JSON object. no line changes or markdown formatting. | |
| """ | |
| response = client.chat.completions.create( | |
| model="gpt-4o-mini", | |
| messages=[ | |
| {"role": "system", "content": "You are a helpful assistant that predicts weather alerts for farmers."}, | |
| {"role": "user", "content": prompt} | |
| ], | |
| response_format= { "type": "json_object" } | |
| ) | |
| response = response.choices[0].message.content | |
| if response: | |
| return json.loads(response) | |
| except Exception as e: | |
| raise HTTPException(status_code=500, detail=f"Error getting prediction from OpenAI: {str(e)}") | |