# app/recommend_tool.py import json from typing import Dict, Any from langchain.prompts import PromptTemplate from langchain.agents import Tool from app.llm_client import LLMClient class RecommendTool: """ Classe pour recommander les valeurs manquantes dans un schéma piscicole. Prend en compte toutes les clés potentiellement incomplètes et génère un JSON complet via un modèle LLM. """ def __init__(self, llm_client: LLMClient): # Template dynamique pour remplir tous les champs manquants template = ''' Vous êtes un expert en pisciculture. Voici les données actuelles (JSON) pour un élevage piscicole : {data_json} Complétez **tous** les champs manquants ou vides dans ce JSON en tenant compte des informations présentes. Les clés à vérifier et compléter sont : - "poisson" (espèce) - "type_elevage" (e.g. hors sol, avec sol, etc.) - "norme" (intensif, semi-intensif, extensif) - "aliment"( type de nourriture recommandé selon le poids du poisson le long de sa croissance) - "temperature" (idéal en °C) - "pH" (valeur optimale) - "durée_d_elevage" (durée en jours) - "poids" (poids moyen en grammes (g) à l'âge adulte ou à la récolte) Renvoyez **uniquement** un JSON valide, complet, sans explications textuelles. ''' self.prompt = PromptTemplate( input_variables=["data_json"], template=template ) self.llm = llm_client # Exposition de l'outil LangChain self.tool = Tool( name="recommend_missing", func=self._run, description=( "Remplit tous les champs manquants d'un schéma piscicole donné" "en JSON string." ) ) def _run(self, data_str: str) -> str: """ - Désérialise la chaîne JSON en dict - Génère un prompt complet pour le LLM - Renvoie la sortie brute du LLM (JSON string) """ try: data = json.loads(data_str) except json.JSONDecodeError: return json.dumps({"error": "Malformed JSON input."}) # Reconstruire le JSON d'entrée pour le prompt data_json = json.dumps(data, ensure_ascii=False) merged_prompt = self.prompt.format(data_json=data_json) # Appel au LLM pour obtenir le JSON complété completion = self.llm.invoke(merged_prompt) return completion