|
@@ -8,6 +8,7 @@ from langchain_groq import ChatGroq
|
|
|
import pandas as pd
|
|
import pandas as pd
|
|
|
from langfuse import get_client
|
|
from langfuse import get_client
|
|
|
import json
|
|
import json
|
|
|
|
|
+from langchain_google_genai import ChatGoogleGenerativeAI
|
|
|
|
|
|
|
|
from tools import excel_code_interpreter
|
|
from tools import excel_code_interpreter
|
|
|
|
|
|
|
@@ -49,9 +50,11 @@ class AgentState(TypedDict) :
|
|
|
markdown : str
|
|
markdown : str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+model_gemini = ChatGoogleGenerativeAI(model="gemini-2.5-flash")
|
|
|
|
|
+
|
|
|
model_llama = ChatGroq(model="llama-3.3-70b-versatile")
|
|
model_llama = ChatGroq(model="llama-3.3-70b-versatile")
|
|
|
|
|
|
|
|
-model_openai = ChatOpenAI(model="gpt-4.1" , temperature=0.2)
|
|
|
|
|
|
|
+model_openai = ChatOpenAI(model="gpt-4o-mini" , temperature=0.2)
|
|
|
|
|
|
|
|
model_ai = model_llama.bind_tools(tools)
|
|
model_ai = model_llama.bind_tools(tools)
|
|
|
|
|
|
|
@@ -89,7 +92,7 @@ def agent_ocr(state: AgentState):
|
|
|
|
|
|
|
|
# Texte pour le LLM
|
|
# Texte pour le LLM
|
|
|
lignes_page = formater_donnees_section(data_propre, page_index)
|
|
lignes_page = formater_donnees_section(data_propre, page_index)
|
|
|
- texte_accumule.extend(lignes_page)
|
|
|
|
|
|
|
+ texte_accumule.extend(lignes_page)
|
|
|
|
|
|
|
|
print(f" Page {page_index + 1} traitée par l'OCR.")
|
|
print(f" Page {page_index + 1} traitée par l'OCR.")
|
|
|
|
|
|
|
@@ -106,6 +109,7 @@ def agent_ocr(state: AgentState):
|
|
|
contenu_final = "\n".join(texte_accumule)
|
|
contenu_final = "\n".join(texte_accumule)
|
|
|
|
|
|
|
|
return {
|
|
return {
|
|
|
|
|
+ "points" : points ,
|
|
|
"messages": [HumanMessage(content=f"Voici les données OCR brutes :\n{contenu_final}")],
|
|
"messages": [HumanMessage(content=f"Voici les données OCR brutes :\n{contenu_final}")],
|
|
|
"clusters" : clusters ,
|
|
"clusters" : clusters ,
|
|
|
"lignes" : lignes ,
|
|
"lignes" : lignes ,
|
|
@@ -118,23 +122,25 @@ def agent_ocr(state: AgentState):
|
|
|
def agent_extracteur(state: AgentState):
|
|
def agent_extracteur(state: AgentState):
|
|
|
prompt = """
|
|
prompt = """
|
|
|
Tu es un extracteur de tableaux QRT (Solvabilité II).
|
|
Tu es un extracteur de tableaux QRT (Solvabilité II).
|
|
|
- Objectif : convertir le tableau en JSON sans perte d’information.
|
|
|
|
|
|
|
+ Objectif : convertir le tableau markdown en JSON sans AUCUNE modification.
|
|
|
|
|
|
|
|
- Règles :
|
|
|
|
|
|
|
+ Règles STRICTES :
|
|
|
|
|
+ - La position de chaque valeur dans le tableau est ABSOLUE et NE DOIT PAS être modifiée.
|
|
|
|
|
+ - Si une colonne contient 0, garde 0. Ne déplace jamais une valeur vers une autre colonne.
|
|
|
- Utilise Rxxxx (lignes) et Cxxxx (colonnes) comme clés directement.
|
|
- Utilise Rxxxx (lignes) et Cxxxx (colonnes) comme clés directement.
|
|
|
- - Copie STRICTEMENT les valeurs, sans calcul.
|
|
|
|
|
|
|
+ - Copie STRICTEMENT les valeurs dans leur colonne exacte.
|
|
|
- Supprime uniquement les espaces dans les nombres : "3 297 388" → 3297388.
|
|
- Supprime uniquement les espaces dans les nombres : "3 297 388" → 3297388.
|
|
|
- - Garde toute la précision et les 0.
|
|
|
|
|
|
|
+ - Une colonne à 0 reste à 0, même si une valeur non-nulle existe dans une colonne adjacente.
|
|
|
- Structure attendue : {"Cxxxx": {"Rxxxx": valeur, ...}, ...}
|
|
- Structure attendue : {"Cxxxx": {"Rxxxx": valeur, ...}, ...}
|
|
|
|
|
|
|
|
⚠️ CONTRAINTE DE SORTIE :
|
|
⚠️ CONTRAINTE DE SORTIE :
|
|
|
- Réponds UNIQUEMENT avec l'objet JSON.
|
|
- Réponds UNIQUEMENT avec l'objet JSON.
|
|
|
- PAS de markdown (```json), PAS de texte, PAS d'explications.
|
|
- PAS de markdown (```json), PAS de texte, PAS d'explications.
|
|
|
|
|
+ - NE PAS réorganiser, NE PAS interpréter, NE PAS corriger les données.
|
|
|
|
|
+
|
|
|
|
|
+ Tableau à convertir :
|
|
|
|
|
+ {markdown}
|
|
|
|
|
|
|
|
- Sortie attendue :
|
|
|
|
|
- {
|
|
|
|
|
- "Cxxxx": { "Rxxxx": 123456, "Ryyyy": 789 }
|
|
|
|
|
- }
|
|
|
|
|
"""
|
|
"""
|
|
|
|
|
|
|
|
markdown_content = state.get("markdown", "")
|
|
markdown_content = state.get("markdown", "")
|
|
@@ -149,7 +155,7 @@ def agent_extracteur(state: AgentState):
|
|
|
HumanMessage(content=json.dumps(input_content))
|
|
HumanMessage(content=json.dumps(input_content))
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
- response = model_openai.invoke(msg)
|
|
|
|
|
|
|
+ response = model_llama.invoke(msg)
|
|
|
return {"messages": [response]}
|
|
return {"messages": [response]}
|
|
|
|
|
|
|
|
|
|
|