|
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[:, 'avg_hourly_soil_temperature_0cm_C'].mean() |
|
avg_humidity = df.loc[:, 'avg_hourly_relative_humidity_2m_%'].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) |
|
|
|
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 |
|
|