import os import pandas as pd from datetime import datetime from dotenv import load_dotenv from langchain_core.output_parsers import StrOutputParser from langchain.prompts import ChatPromptTemplate from langchain.chat_models import ChatOpenAI from prompts.summary_prompt import ( meterological_data_summary_prompt, agricultural_yield_comparison_prompt ) load_dotenv() def get_meterological_summary(scenario: str, temperature_df: pd.DataFrame, rain_df: pd.DataFrame, irradiance_df: pd.DataFrame) -> str: today = datetime.today().strftime("%Y/%m/%d") temp_data = temperature_df.head(len(temperature_df)).to_string(index=False) rain_data = rain_df.head(len(rain_df)).to_string(index=False) irradiance_data = irradiance_df.head(len(irradiance_df)).to_string(index=False) llm = ChatOpenAI( model="gpt-4o", temperature=0, max_tokens=None, timeout=None, max_retries=2, api_key=os.environ.get("OPENAI_API_KEY") ) output_parser = StrOutputParser() prompt = ChatPromptTemplate.from_messages( [ ("system", meterological_data_summary_prompt), ("human", "Je veux un résumé de ces prévisions métérologique: les données de temperature {temp_data}, les données de précipitation {rain_data}, les données de radiance solaire {irradiance_data}") ] ) chain = prompt | llm | output_parser response = chain.invoke({ "scenario": scenario, "today": today, "temp_data": temp_data, "rain_data": rain_data, "irradiance_data": irradiance_data }) return output_parser.parse(response) def get_agricultural_yield_comparison(culture: str, region:str, historical_yield_df: pd.DataFrame, forecast_yield_df: pd.DataFrame, soil_df: pd.DataFrame, climate_df: pd.DataFrame, water_df: pd.DataFrame, water_df_pv: pd.DataFrame): historical_yield = historical_yield_df.head(len(historical_yield_df)).to_string(index=False) agricultural_yield = forecast_yield_df.head(len(forecast_yield_df)).to_string(index=False) soil_data = soil_df.head(len(soil_df)).to_string(index=False) water_data = water_df.head(len(water_df)).to_string(index=False) water_data_pv = water_df_pv.head(len(water_df_pv)).to_string(index=False) climate_data = climate_df.head(len(climate_df)).to_string(index=False) llm = ChatOpenAI( model="gpt-4o", temperature=0, max_tokens=None, timeout=None, max_retries=2, api_key=os.environ.get("OPENAI_API_KEY") ) output_parser = StrOutputParser() prompt = ChatPromptTemplate.from_messages( [ ("system", agricultural_yield_comparison_prompt), ("human", "Je suis agriculteur et je cultive de la {culture} à {region}. Voilà les caractéristiques du sol dans ma région {soil_data} et voilà l'historique de mon rendement {historical_yield} et projections du rendement ma culture avec et sans ombrage {agricultural_yield}. J'ai aussi les prévisions du stress hydrique sans ombrage {water_data} et avec ombrage {water_data_pv} et des données climatiques {climate_data}. " ) ] ) chain = prompt | llm | output_parser response = chain.invoke({ "culture": culture, "region": region, "soil_data": soil_data, "water_data": water_data, "water_data_pv": water_data_pv, "climate_data": climate_data, "agricultural_yield": agricultural_yield, "historical_yield": historical_yield }) return output_parser.parse(response)