File size: 4,417 Bytes
03df0fa
 
 
 
 
 
059d631
 
 
 
 
 
 
 
 
 
 
883455d
059d631
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27ccaa7
059d631
c2d601e
883455d
 
059d631
883455d
059d631
 
 
 
 
 
 
 
 
 
883455d
059d631
 
 
 
883455d
27ccaa7
059d631
5b58cbf
 
 
059d631
5b58cbf
 
 
 
 
 
059d631
 
 
 
 
 
03df0fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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