test tse

# --- requirements_config table ---
# Supposons que tu as une table SQL ou un fichier YAML avec la structure suivante :
# Columns: tool_name | action_type | rag_index_name | rag_query_text | rag_subtool_key

# Exemple de contenu :
# compare_rgpd | rag_multi | rgpd_index | Quelle est la politique de conservation ? | conservation
# compare_rgpd | rag_multi | rgpd_index | Quelles données personnelles sont traitées ? | data_types

# --- get_subqueries (dans RequirementManager) ---
class RequirementManager:
   def __init__(self, db_connection):
       self.conn = db_connection

   def get_subqueries(self, tool_name: str):
       query = """
           SELECT rag_index_name, rag_query_text, rag_subtool_key
           FROM requirements_config
           WHERE tool_name = ? AND action_type = 'rag_multi'
       """
       df = pd.read_sql(query, self.conn, params=(tool_name,))
       return df.to_dict(orient="records")

# --- search_index (faiss par index_name) ---
def search_index(index_name: str, query: str) -> str:
   db = FAISS.load_local(index_name, HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2"))
   retriever = db.as_retriever(search_kwargs={"k": 3})
   docs = retriever.invoke(query)
   return "\n\n".join([doc.page_content for doc in docs])

# --- ToolExecutor updated ---
class ToolExecutor:
   def __init__(self, tools, requirement_manager):
       self.tool_map = {tool.name: tool for tool in tools}
       self.requirement_manager = requirement_manager

   def invoke(self, tool_call):
       tool_name = tool_call.get("name")
       arguments = tool_call.get("arguments", {})

       # Gestion dynamique rag_multi
       if self.requirement_manager:
           subqueries = self.requirement_manager.get_subqueries(tool_name)
           if subqueries:
               results = []
               for subtool in subqueries:
                   query = subtool["rag_query_text"]
                   index = subtool["rag_index_name"]
                   key = subtool["rag_subtool_key"]
                   output = search_index(index, query)
                   results.append(f"### {key}\n{output.strip()}")
               return "\n\n".join(results)

       # Fallback: normal tool call
       if tool_name not in self.tool_map:
           raise ValueError(f"Outil non trouvé : {tool_name}")

       tool = self.tool_map[tool_name]
       if isinstance(arguments, str):
           try:
               arguments = json.loads(arguments)
           except Exception as e:
               raise ValueError(f"Arguments JSON invalides : {e}")

       return tool.run(arguments)
 

_____

 

About Author

Directeur de Publication