Spaces:
Runtime error
Runtime error
import pandas as pd | |
import folium | |
from folium import IFrame | |
import plotly.graph_objects as go | |
from APIs.geolocation import get_geolocation, get_risques | |
from APIs.meteo import get_info_meteo | |
import os | |
from dotenv import load_dotenv | |
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader | |
from llama_index.llms.mistralai import MistralAI | |
from llama_index.embeddings.mistralai import MistralAIEmbedding | |
from llama_index.core import Settings | |
from llama_index.core.query_engine import RetrieverQueryEngine | |
load_dotenv() | |
Settings.llm = MistralAI( | |
max_tokens=2048, | |
api_key=os.environ.get('MISTRAL_API_KEY') | |
) | |
Settings.embed_model = MistralAIEmbedding( | |
model_name="mistral-embed", | |
api_key=os.environ.get('MISTRAL_API_KEY') | |
) | |
documents = SimpleDirectoryReader("documents").load_data() | |
index = VectorStoreIndex.from_documents(documents) | |
query_engine = index.as_query_engine(similarity_top_k=15) | |
def on_init(lat, lon, address): | |
map_html, fig = show_map(lat, lon, address) | |
df = get_info_meteo(lat, lon) | |
avg_temp = df.loc[:, 'daily_temperature_2m_max_C'].mean() | |
avg_humidity = df.loc[:, 'avg_hourly_soil_moisture_0_to_1cm_m³'].mean() | |
# avg_snowfall = df.loc[:, 'daily_precipitation_sum_mm'].mean() | |
avg_cloud_cover = df.loc[:, 'med_cloud_cover_%'].mean() | |
avg_precipitations = df.loc[:, 'daily_rain_sum_mm'].mean() | |
return map_html, fig, avg_temp, avg_humidity, avg_cloud_cover, avg_precipitations | |
def print_conversation(chat_history): | |
for question, response in chat_history: | |
print('Question: ', end='\n') | |
print(question, end='\n') | |
print('Response: ', end='\n') | |
print(response, end='\n') | |
def respond(elevage, temperature, humidite, chutes_de_neige, couverture_nuageuse, precipitations, message, chat_history): | |
PROMPT = f""" | |
Tu es un chatbot qui répond en français, qui doit aider à déterminer les risques parasitaires d'élevage en fonction des conditions météorologiques. | |
Voici les conditions: | |
- élevage: {elevage} | |
- température moyenne : {temperature} °C | |
- humidité moyenne : {humidite} m^3 | |
Fais moi un tableau avec chaque parasite et/ou tiques susceptible de toucher mon élevage dans ces conditions météo, avec les conditions de prolifération, la vitesse de propagation, les troubles causés par ces parasites | |
Essaie d'écrire des données numériques précises dans le tableau | |
Si un parasite et/ou tique ne rentre pas dans les conditions, ne le met pas dans le tableau. | |
Donne-moi ensuite les solutions de prévention et de traitement pour chacun d'eux indépendamment du tableau. | |
Réponds également au message suivant: | |
{message} | |
Tu dois impérativement répondre en français | |
""" | |
reponse = query_engine.query(PROMPT) | |
chat_history.append((message, str(reponse))) | |
print_conversation(chat_history) | |
return '', chat_history | |
def get_and_plot_meteo(lat, lon): | |
df = get_info_meteo(lat, lon) | |
fig = go.Figure() | |
fig.add_trace(go.Scatter(x=df['date'], y=df['daily_temperature_2m_max_C'], | |
name="Température °C", mode="lines+markers")) | |
fig.add_trace(go.Scatter(x=df['date'], y=df['avg_hourly_relative_humidity_2m_%'], | |
name="Humidité moyenne en %", mode="lines+markers", yaxis="y2")) | |
fig.update_layout( | |
title="Température maximale et humidité moyenne journalière", | |
xaxis_title="Date", | |
yaxis_title="Température (°C)", | |
yaxis2=dict( | |
title="Humidity (%)", | |
overlaying="y", | |
side="right" | |
) | |
) | |
return fig | |
def show_map(lat, lon, address): | |
if address: | |
lat_tmp, lon_tmp, code_insee = get_geolocation(address, None, None) | |
risques = get_risques(code_insee=code_insee) | |
if lat_tmp or lon_tmp: | |
lat, lon = lat_tmp, lon_tmp | |
else: | |
return "Adress not found. Please enter a valid address", "" | |
if lat and lon: | |
lat_tmp, lon_tmp, code_insee = get_geolocation(None, lat, lon) | |
risques = get_risques(code_insee=code_insee) | |
# Create a map centered at the input coordinates | |
location_map = folium.Map(location=[lat, lon], zoom_start=14) | |
folium.Marker([lat, lon], popup=risques).add_to(location_map) | |
map_html = location_map._repr_html_() | |
fig = get_and_plot_meteo(lat, lon) | |
return map_html, fig | |