From d8479894f18f5f17aa914142de0cdbaa42237939 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 6 Jul 2026 08:20:05 +0000 Subject: [PATCH 01/18] docs: add July scoping document and framework documentation skeleton Adds a cadrage document (project reminder, stakes, positioning, current state, weekly roadmap through end of July) and a first pass at detailed framework documentation, per this week's objective of laying the groundwork for docs that can later be shared as a DMCSI working paper. --- docs/cadrage_2026-07.md | 120 ++++++++++++++++++++++++++++++++++ docs/framework.md | 141 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 261 insertions(+) create mode 100644 docs/cadrage_2026-07.md create mode 100644 docs/framework.md diff --git a/docs/cadrage_2026-07.md b/docs/cadrage_2026-07.md new file mode 100644 index 0000000..456a3a5 --- /dev/null +++ b/docs/cadrage_2026-07.md @@ -0,0 +1,120 @@ +# Document de cadrage — Projet GRAAL + +**Destinataires :** hiérarchie SSP Lab / DMCSI +**Auteurs :** Théo Ferry, Meilame Tayebjee — Insee, SSP Lab +**Date :** 6 juillet 2026 +**Portée du document :** rappel du projet, état d'avancement au 6 juillet, et roadmap détaillée jusqu'à fin juillet 2026. + +> Note de calage : ce document couvre le mois de **juillet** 2026 (livraison hebdomadaire chaque lundi). La roadmap détaillée ci-dessous porte donc sur les quatre semaines du **6 au 31 juillet**. + +--- + +## 1. Rappel du projet + +**GRAAL** (*Graph-based Reasoning Agents for Automatic Labelling*) est un framework de recherche appliquée qui combine : + +- une **base de données graphe** (Neo4j) représentant une nomenclature statistique hiérarchique (codes, libellés, notices explicatives, relations parent/enfant) ; +- des **agents LLM à outils** (*tool-calling*), qui interrogent et parcourent ce graphe pour raisonner sur la classification d'un texte libre vers un code de nomenclature. + +Le projet est actuellement instancié sur la **NAF** (Nomenclature d'Activités Française, ~700 codes terminaux, 5 niveaux hiérarchiques) et le pipeline de construction du graphe est déjà paramétré pour d'autres nomenclatures (NACE en anglais, COICOP FR/EN), ce qui matérialise l'objectif de généricité du framework. + +### 1.1 Objectifs + +1. **S'affranchir de la dépendance aux données labellisées.** Le modèle de production actuel (classification supervisée par *deep learning*, package `torchTextClassifiers`) est frugal et performant, mais nécessite 100k à 1M d'observations labellisées pour être entraîné — un pré-requis qui n'est pas toujours disponible (nouvelle nomenclature, nouveau domaine, etc.). +2. **Introduire du raisonnement et de la traçabilité.** Contrairement à une approche par similarité d'embeddings (RAG « plat »), un agent doit pouvoir justifier chaque étape de sa décision (*chain-of-thought*) et exploiter explicitement la structure hiérarchique de la nomenclature plutôt que de comparer des vecteurs. +3. **Généricité.** Le framework ne doit rien connaître de la nomenclature métier : il suffit de peupler une base Neo4j (codes, libellés, notices, hiérarchie) pour que les agents fonctionnent. GRAAL se positionne comme un « distributeur » d'outils, de prompts et de contrats d'appel LLM (validation stricte des entrées/sorties via Pydantic). + +### 1.2 Enjeux + +- **Enjeu métier** : disposer d'une solution de codification qui fonctionne (a) quand on n'a pas ou peu de données labellisées, (b) quand une nomenclature est révisée par le métier et qu'il faut recoder l'historique, (c) quand les données labellisées existantes sont de qualité incertaine et doivent être fiabilisées/corrigées. +- **Enjeu MLOps** : la chaîne de production actuelle (stockage S3/Datalab, entraînement distribué Argo Workflows, *serving* FastAPI conteneurisé) est mature sur les volets Data, Modèle et Déploiement, mais **le monitoring en production reste le point faible** : sans annotation humaine continue, il n'existe pas aujourd'hui de moyen de contrôler la dérive du modèle déployé. GRAAL est une piste concrète pour combler ce manque. +- **Enjeu méthodologique** : un premier prototype zero-shot par RAG a été testé et a révélé plusieurs limites structurelles (dépendance au découpage des notices, dépendance au modèle d'embedding, saturation du contexte, hétérogénéité de la comparaison notice/libellé, absence de traçabilité, non prise en compte de la hiérarchie). Ces limites motivent directement le choix de l'approche agentique. + +### 1.3 Positionnement par rapport aux besoins de codification automatique + +GRAAL **ne vise pas à remplacer** le modèle supervisé en production : une architecture agentique multi-appels LLM est aujourd'hui trop coûteuse en latence et en ressources de calcul (pas de GPU dédié, temps d'inférence incompatible avec un usage de masse en production). GRAAL se positionne comme une **brique complémentaire**, mobilisable sur trois cas d'usage bien délimités : + +| Cas d'usage | Description | Composant GRAAL mobilisé | +|---|---|---| +| **Monitoring du modèle en production** | Analyser en continu (ou en échantillonnage) les prédictions du modèle supervisé et détecter les codifications douteuses, sans annotation humaine | *MatchVerifier* (vérifie une correspondance libellé ↔ code), avec appel au *Navigator* pour proposer un recodage si besoin | +| **Recodage d'une base existante** | Recoder un stock de données suite à une révision de nomenclature, ou fiabiliser un historique de labels incertains | *Navigator* (classification hiérarchique agentique) | +| **Génération de données d'entraînement synthétiques** | Produire des libellés synthétiques par code, pour densifier les classes rares et ré-entraîner/améliorer le modèle supervisé | *Code2Text* / *NaiveCode2Text* | + +Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre » le modèle supervisé en production, mais de **livrer une évaluation chiffrée et honnête** de ce que chacun de ces trois cas d'usage peut apporter concrètement. + +--- + +## 2. État d'avancement au 6 juillet 2026 + +### 2.1 Ce qui fonctionne + +- **Le graphe Neo4j de la nomenclature** est opérationnel de bout en bout : construction depuis un fichier de notices (parquet), calcul et stockage des embeddings, relations hiérarchiques `HAS_PARENT`. Le pipeline de construction (`src/neo4j_graph/graph_builder`) est déjà paramétré pour plusieurs nomenclatures (NAF, NACE EN, COICOP FR/EN), preuve concrète de la généricité recherchée. +- **L'agent *Navigator*** (classification hiérarchique agentique) fonctionne en usage individuel et en usage batch (fichier de requêtes), avec traçage complet des appels via Langfuse (observabilité, sessions, coûts). Il expose un ensemble d'outils Neo4j génériques et réutilisables (`get_current_children`, `get_current_siblings`, `go_to_parent`, `go_to_child`, `navigate_to`, etc.), communs à tous les agents du framework. +- **Les agents « closers »** (*CodeChooser* : choix argumenté parmi K codes candidats ; *MatchVerifier* : validation d'une correspondance libellé/code) sont implémentés et fonctionnels **isolément**, avec des contrats de sortie stricts (schémas Pydantic, score de confiance, explication). +- **Une première chaîne de génération de données synthétiques** (*NaiveCode2Text*) produit des libellés synthétiques exploitables à partir des notices officielles (plusieurs itérations de prompt testées : zero-shot 1-par-1, puis génération par lots de 10, orientation « métier »), avec des exemples de résultats déjà générés et sauvegardés. +- **Une CLI** (`src/main.py`) permet de lancer une classification unitaire ou en lot avec le *Navigator*. + +### 2.2 Ce qui ne fonctionne pas encore + +- **Deux modules du dépôt sont actuellement cassés** (erreurs de syntaxe empêchant leur simple import) : + - `src/agents/Text2Code/classifiers/agentic_rag.py` — parenthèse fermée avant l'affectation de `proposed_confidence`, code non exécutable en l'état ; + - `src/agents/NaiveCode2Text/prompts/prompt_builder.py` — f-string malformée. + + Ce sont les tout premiers correctifs à apporter (cf. roadmap semaine 1) avant toute campagne d'évaluation. +- **Le classifieur « Agentic RAG »** (approche alternative combinant recherche par embeddings + *CodeChooser*) n'est pas branché dans le pipeline principal : `main.py` appelle aujourd'hui une fonction *stub* (`classify_agentic_rag`) qui renvoie une valeur codée en dur. +- **Le chaînage *Navigator* → *MatchVerifier*** n'est pas encore implémenté : le *Navigator* s'arrête aujourd'hui dès qu'il atteint un code terminal, sans double vérification automatique par un second agent. C'est pourtant l'articulation nécessaire au cas d'usage « monitoring en production ». +- **Aucune méthodologie d'évaluation n'est encore formalisée** : ni jeu de données de référence versionné, ni métriques automatisées, ni tableau de bord de suivi. À ce stade, l'évaluation n'existe qu'à l'état de script exploratoire ponctuel (projection UMAP/PaCMAP/t-SNE/PCA des embeddings, calcul de k-plus-proches-voisins). C'est le chantier prioritaire du mois (cf. §3). +- **La génération synthétique agentique** (*Code2Text*, par opposition à l'approche *Naive*) est au stade de squelette de code, non encore évaluée ni comparée à l'approche naïve. +- **Aucune intégration continue (CI) ne teste le code applicatif** : les deux workflows GitHub existants ne font que déployer les slides de présentation et les embeddings, sans exécuter de tests. +- **Pas encore de documentation technique détaillée du framework**, au-delà du README et de la présentation de démonstration — c'est l'objet du chantier lancé cette semaine (cf. §4). + +### 2.3 Synthèse + +L'architecture cible (graphe + agents génériques + closers de validation) est posée et sa faisabilité technique est démontrée sur le cas *Navigator*. Le mois de juillet doit servir à **consolider la base de code** (corriger les deux bugs bloquants, brancher les composants manquants), puis, surtout, à **construire une évaluation chiffrée et reproductible**, condition nécessaire pour statuer sur la valeur ajoutée réelle de chacun des trois cas d'usage identifiés. + +--- + +## 3. Roadmap détaillée — juillet 2026 + +### 3.1 Méthode d'évaluation envisagée + +Deux volets à évaluer séparément, comme identifié dès la présentation initiale du projet : + +1. **Évaluation du classifieur (*Navigator*, et *Agentic RAG* une fois réparé)** + - **Si le jeu de test est jugé fiable** : évaluation automatique classique — exactitude (*accuracy*) au code terminal, et par niveau de hiérarchie (section, division, groupe, classe) pour distinguer une erreur « proche » (bon niveau supérieur, mauvaise feuille) d'une erreur « lointaine ». + - **Si le jeu de test n'est pas jugé fiable** (label bruité, notices ambiguës) : évaluation manuelle sur échantillon, en mettant bout à bout la prédiction *ground truth*, la prédiction du classifieur, et les jugements du *CodeChooser* et du *MatchVerifier* — évaluation conjointe de toute la chaîne plutôt que du seul classifieur. + - Métriques complémentaires : taux de requêtes n'atteignant **pas** un code terminal (`is_final = 0`), nombre moyen d'étapes de navigation, taux d'accord entre *Navigator* et *MatchVerifier*, comparaison au modèle supervisé de référence sur le même échantillon. +2. **Évaluation de la génération de données synthétiques (*Code2Text* / *NaiveCode2Text*)** + - Moins directe : approche retenue = ré-entraîner le modèle supervisé de production en enrichissant le jeu d'entraînement avec les libellés synthétiques (notamment sur les classes sous-représentées), et comparer les performances obtenues à une performance de référence sur un même jeu de test. + +### 3.2 Jeu d'évaluation + +- **Source de référence** : réutiliser le jeu de test déjà utilisé pour le modèle supervisé de production (split `df_train`/test du projet APE, colonnes `libelle` / `nace2025`), déjà mobilisé de façon exploratoire dans `explorations.py`. Cela permet une comparaison directe et un jeu de labels dont la qualité est déjà connue. +- **Construction d'un échantillon d'évaluation stratifié** : tirage représentatif par section/niveau de la NAF (pas uniquement aléatoire), pour garantir une couverture des cas rares et des sections à fort volume. +- **Isolation d'un sous-échantillon à ré-annoter manuellement** : pour les cas où le label historique est jugé incertain, base du protocole d'évaluation manuelle décrit en §3.1. +- Le jeu d'évaluation et son protocole de constitution seront versionnés dans le dépôt (et documentés dans `docs/framework.md`, cf. §4) pour être réutilisables et auditable. + +### 3.3 Pistes à explorer + +- Réparation et **branchement effectif du chaînage *Navigator* → *MatchVerifier*** (nécessaire au cas d'usage monitoring). +- Comparaison **plusieurs modèles LLM** sous-jacents (le framework est agnostique au modèle via une API compatible OpenAI — variable d'environnement `GENERATION_MODEL`), pour arbitrer coût/latence/qualité. +- Étude du **nombre d'étapes de navigation et du taux d'échec** (requêtes n'atteignant pas de code terminal) en fonction de la formulation du prompt et des instructions du *Navigator*. +- Premiers tests du cas d'usage **monitoring** : simulation d'un flux de prédictions du modèle de production, détection par *MatchVerifier* des cas à recoder. +- Premiers tests du cas d'usage **génération synthétique pour ré-entraînement**, avec une métrique proxy (gain de performance du modèle supervisé sur les classes enrichies). + +### 3.4 Objectifs hebdomadaires — juillet 2026 + +| Semaine | Dates | Objectifs | +|---|---|---| +| **S1** | 6 → 11 juillet | Corriger les deux bugs bloquants (`agentic_rag.py`, `prompt_builder.py`) pour fiabiliser la base de code. Poser les bases de la **documentation détaillée du framework** (architecture, modèle de données, contrats des agents — voir §4), première brique valorisable en document de travail DMCSI. | +| **S2** | 14 → 18 juillet | Formaliser la méthode d'évaluation (§3.1) et constituer le **jeu d'évaluation stratifié** (§3.2), versionné dans le dépôt. Brancher le classifieur *Agentic RAG* dans le pipeline principal (retirer le stub). | +| **S3** | 21 → 25 juillet | Implémenter le chaînage *Navigator* → *MatchVerifier*. Lancer les **premières campagnes d'évaluation chiffrées** du *Navigator* (et de l'*Agentic RAG*) sur le jeu d'évaluation, avec comparaison au modèle supervisé de référence. | +| **S4** | 28 → 31 juillet | Évaluer la génération synthétique (*Code2Text* / *NaiveCode2Text*) via la métrique proxy de ré-entraînement. Synthèse des résultats du mois et note de recommandation sur les cas d'usage à prioriser pour la suite (monitoring, recodage, génération de données). | + +--- + +## 4. Focus semaine du 6 juillet — documentation du framework + +En parallèle des correctifs de la semaine 1, le chantier **« documentation détaillée du framework »** est initié cette semaine. Un premier document technique a été créé : [`docs/framework.md`](./framework.md). + +Objectif : poser une base structurée (architecture, modèle de données Neo4j, contrats des agents, configuration) qui pourra être enrichie au fil des semaines de juillet et **valorisée in fine comme document de travail DMCSI** décrivant un framework générique de codification automatique par agents sur graphe de connaissance. diff --git a/docs/framework.md b/docs/framework.md new file mode 100644 index 0000000..4c209d3 --- /dev/null +++ b/docs/framework.md @@ -0,0 +1,141 @@ +# Documentation technique du framework GRAAL + +> **Statut : document en cours de construction.** Cette première version pose les bases d'une documentation détaillée du framework (semaine du 6 juillet 2026, cf. [`docs/cadrage_2026-07.md`](./cadrage_2026-07.md)). Elle sera enrichie au fil des semaines de juillet — les sections marquées **[à compléter]** seront traitées lors des prochaines itérations — avant d'être valorisée sous la forme d'un document de travail DMCSI. + +## 1. Vue d'ensemble + +GRAAL combine trois briques : + +1. **Un graphe de connaissance** (Neo4j) représentant une nomenclature hiérarchique : codes, libellés, notices explicatives, relations parent/enfant. +2. **Des agents LLM à outils** (*tool-calling*, librairie [`openai-agents`](https://github.com/openai/openai-agents-python)) qui interrogent ce graphe pour raisonner sur une tâche de classification ou de génération. +3. **Des contrats d'entrée/sortie stricts** (schémas Pydantic) qui structurent les échanges entre agents et garantissent la composabilité du pipeline. + +Principe de conception central : **le framework ne connaît rien de la nomenclature métier**. Toute la connaissance (codes, hiérarchie, notices) vit dans la base Neo4j ; le code Python ne fait que peupler cette base et fournir des outils génériques de navigation/interrogation. Changer de nomenclature (NAF → COICOP, par exemple) ne nécessite donc pas de modifier le code des agents, seulement de reconstruire le graphe avec un nouveau jeu de notices. + +## 2. Modèle de données Neo4j + +Le graphe est construit par `src/neo4j_graph/graph_builder/build_graph_db.py` à partir d'un fichier de notices au format parquet (une ligne par code de nomenclature). + +### 2.1 Colonnes sources (`COLUMNS_TO_KEEP`, `graph_builder/config/config.py`) + +| Colonne | Rôle | +|---|---| +| `ID` | Identifiant unique du nœud | +| `CODE` | Code de nomenclature (ex. `62.01`, `J`) | +| `NAME` | Libellé du code | +| `PARENT_ID` / `PARENT_CODE` | Référence au nœud parent dans la hiérarchie | +| `LEVEL` | Niveau hiérarchique (0 = racine) | +| `FINAL` | Indique si le code est un code terminal (feuille) | +| `Implementation_rule` | Règle d'affectation officielle du code | +| `Includes` / `IncludesAlso` | Contenu inclus dans le code (notice officielle) | +| `Excludes` | Contenu explicitement exclu du code | +| `text_content` | Texte brut de la notice | + +Le texte utilisé pour le calcul des embeddings (`text_to_embed`) est la concaténation de `NAME`, `Implementation_rule`, `Includes` et `IncludesAlso`. + +### 2.2 Nomenclatures déjà paramétrées + +Le pipeline de construction a déjà été testé/configuré pour plusieurs jeux de notices (`graph_builder/config/config.py`) : + +- NAF 2025 (français) — nomenclature de référence actuelle du projet ; +- NACE Rev2.1 (anglais) ; +- COICOP 2018 (français et anglais). + +**[à compléter]** : schéma exact des relations Neo4j (type `HAS_PARENT`, propriétés indexées), procédure de reconstruction complète du graphe pas à pas, gestion des mises à jour de nomenclature (recodage d'un graphe existant vers une nouvelle version). + +## 3. Architecture des agents + +### 3.1 `BaseAgent` (`src/agents/base_agent.py`) + +Classe abstraite dont héritent tous les agents. Elle encapsule : + +- la connexion à un client LLM compatible OpenAI (`OPENAI_BASE_URL` / `OPENAI_API_KEY`), avec tracing désactivé au niveau du SDK `agents` (le traçage applicatif passe par Langfuse, voir §5) ; +- le modèle utilisé pour la génération (`GENERATION_MODEL`), avec une température fixée à 0 par défaut (`get_model_settings`) ; +- un contrat commun : chaque sous-classe doit définir un nom d'agent (`get_agent_name`), des instructions système (`get_instructions`), un type de sortie structuré (`get_output_type`, un modèle Pydantic) et une méthode de construction du prompt (`build_prompt`) ; +- l'exécution (`__call__`) via `Runner.run` du SDK `agents`, avec un nombre maximal de tours (`MAX_TURNS`). + +Chaque agent = **un prompt + un jeu d'outils + un contrat de sortie typé**. C'est cette homogénéité qui permet de composer des agents entre eux sans coder de logique de parsing ad hoc. + +### 3.2 Outils partagés (`Graph.get_tools`, `src/neo4j_graph/graph.py`) + +Un socle d'outils Neo4j est exposé à tous les agents via `@function_tool` (SDK `agents`) : + +- `get_code_information(code)` — fiche complète d'un code (nom, niveau, description, inclusions/exclusions, parent, enfants) ; +- `get_children(code)` / `get_siblings(code)` / `get_descendants(code, levels)` — navigation locale dans la hiérarchie ; +- mise en cache (`functools.lru_cache`) des requêtes Neo4j les plus fréquentes, avec (dé)sérialisation dict ↔ tuple pour rendre les résultats hashables (`_freeze_dict` / `_unfreeze_dict`). + +### 3.3 Le *Navigator* (`src/navigator/navigator.py`) + +Le *Navigator* hérite de `Graph` et ajoute un **état de position courante** dans la hiérarchie (`current_code`) ainsi qu'un historique de navigation (`history`). Il expose un jeu d'outils dédié, avec état : + +- `get_current_information` / `get_code_information(code)` — information sur la position courante ou sur un code arbitraire (sans déplacement) ; +- `get_current_children` / `get_current_siblings` / `get_current_parent` — exploration locale relative à la position courante ; +- `navigate_to(code)` / `go_to_child(child_code)` / `go_to_parent()` — déplacement dans la hiérarchie, avec validation (un `go_to_child` vers un code qui n'est pas un enfant direct échoue explicitement) ; +- `reset_to_root()` — réinitialisation avant une nouvelle requête. + +Chaque appel d'outil est journalisé (position avant/après, données renvoyées au LLM), ce qui fournit une trace complète et rejouable du raisonnement de l'agent. + +### 3.4 Classifieurs (`src/agents/Text2Code/`) + +- `BaseClassifier` — spécialise `BaseAgent` en fixant le type de sortie à `MatchVerificationInput` (activité, code proposé, explication, confiance), le format commun attendu par les agents « closers ». +- `NavigatorAgenticClassifier` — classifieur concret : instructions demandant au *Navigator* de descendre jusqu'à un code terminal (`is_final = 1`) en justifiant chaque choix, en démarrant systématiquement par `get_current_children()`. +- `AgenticRAGClassifier` (`agentic_rag.py`) — approche alternative : récupération des *top-k* codes les plus proches par similarité d'embedding (`Graph.get_closest_codes`), puis arbitrage par l'agent `CodeChooser`. **Ce module contient actuellement une erreur de syntaxe et n'est pas exécutable** (correctif prévu semaine 1, cf. cadrage §2.2) ; il n'est pas non plus branché dans `src/main.py` (fonction *stub*). + +### 3.5 Agents « closers » (`src/agents/closers/`) + +Agents de validation, appelés en fin de chaîne : + +- **`CodeChooser`** — arbitre entre plusieurs codes candidats pour une activité donnée ; sortie : code choisi, niveau de confiance, explication. +- **`MatchVerifier`** — vérifie qu'une correspondance libellé ↔ code proposée est valide ; sortie : booléen de validité, confiance, explication. C'est cet agent qui porte le cas d'usage « monitoring du modèle en production » (cf. cadrage §1.3). + +**[à compléter]** : le chaînage effectif `Navigator` → `MatchVerifier` n'existe pas encore dans le code (prévu semaine 3 de la roadmap) ; cette section sera mise à jour une fois l'intégration réalisée. + +### 3.6 Génération de données synthétiques (`src/agents/Code2Text/`, `src/agents/NaiveCode2Text/`) + +Deux approches, à des stades de maturité différents : + +- **`NaiveCode2Text`** — approche « classique » (non agentique) : échantillonnage aléatoire d'éléments de notice (loi géométrique, `code_retrieval/code_sampler.py`) pour construire des prompts de générations variées, plusieurs itérations testées (génération unitaire puis par lots de 10, orientation « métier » vs. « notice détaillée »). Des exemples de résultats sont disponibles dans `sample_results/`. +- **`Code2Text`** (`agent/code2text_agent.py`) — version agentique, au stade de squelette de code, non encore évaluée. **[à compléter]** une fois les premiers tests réalisés (semaine 4 de la roadmap). + +## 4. Point d'entrée et CLI (`src/main.py`) + +La CLI (`src/utils/parser.py`) expose deux méthodes de classification : + +```bash +uv run -m src.main --navigator "Boulangerie artisanale avec vente directe" +uv run -m src.main --navigator --batch-file requetes.txt --experiment-name mon-experience +``` + +- `--navigator QUERY` — classification agentique via le *Navigator* ; +- `--agentic-rag QUERY` — **actuellement un stub** renvoyant une valeur codée en dur, en attendant le branchement du classifieur `AgenticRAGClassifier` (cf. §3.4) ; +- `--batch-file FILE` — traite un fichier de requêtes (une par ligne) avec la méthode choisie ; +- `--experiment-name` — nom d'expérience propagé au traçage Langfuse. + +## 5. Configuration (variables d'environnement) + +| Variable | Usage | +|---|---| +| `NEO4J_URL`, `NEO4J_USERNAME`, `NEO4J_PWD` | Connexion à la base de graphe | +| `OPENAI_BASE_URL`, `OPENAI_API_KEY` | Client LLM compatible OpenAI (génération) | +| `GENERATION_MODEL` | Modèle utilisé par les agents (`BaseAgent`) | +| `MAX_TURNS` | Nombre maximal de tours d'agent (boucle outil → réponse) | +| `EMBEDDING_MODEL`, `URL_EMBEDDING_API`, `MAX_TOKENS` | Modèle et service d'embedding utilisés lors de la construction du graphe | +| `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_ENDPOINT_URL` | Accès S3 (Datalab/Onyxia) pour les données sources et notices | + +Le traçage applicatif (sessions, coûts, latence, arbre d'appels des agents) est assuré par **Langfuse** (`get_client`, `propagate_attributes`, `@observe` dans `src/main.py`). + +## 6. Comment étendre GRAAL à une nouvelle nomenclature **[à compléter]** + +Cette section documentera, une fois formalisée, le mode opératoire complet pour instancier GRAAL sur une nouvelle nomenclature : format attendu du fichier de notices, exécution du pipeline de construction du graphe, adaptation minimale des prompts si nécessaire. + +## 7. Limites connues et dette technique + +Recensées ici pour mémoire (suivi détaillé dans le document de cadrage) : + +- `src/agents/Text2Code/classifiers/agentic_rag.py` et `src/agents/NaiveCode2Text/prompts/prompt_builder.py` contiennent des erreurs de syntaxe empêchant leur import. +- Pas de suite de tests automatisés ni de CI sur le code applicatif (seuls le déploiement des slides et des embeddings sont automatisés). +- Pas encore de jeu d'évaluation versionné ni de métriques automatisées (chantier semaine 2 de la roadmap de juillet). + +--- + +*Prochaine mise à jour prévue : semaine du 14 juillet 2026, à l'issue de la formalisation de la méthode et du jeu d'évaluation.* From a478cc737f533e84974c579c4a5c387ae42df65c Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 6 Jul 2026 08:30:35 +0000 Subject: [PATCH 02/18] docs: enrich cadrage roadmap with repo cleanup, embedding analysis, drift and LoRA leads Folds in additional workstreams flagged by the team: repo cleanup, embedding-space diagnostics, Wasserstein drift detection for monitoring, an Argo Workflows evaluation pipeline prototype, and LoRA/QLoRA as a longer-horizon lead for lighter-weight agentic inference. --- docs/cadrage_2026-07.md | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/docs/cadrage_2026-07.md b/docs/cadrage_2026-07.md index 456a3a5..734b078 100644 --- a/docs/cadrage_2026-07.md +++ b/docs/cadrage_2026-07.md @@ -96,20 +96,34 @@ Deux volets à évaluer séparément, comme identifié dès la présentation ini ### 3.3 Pistes à explorer +**A. Fiabilisation et industrialisation du framework** +- **Nettoyage du dépôt** : suppression du code mort, structuration des scripts exploratoires (`explorations.py`), mise en cohérence des modules d'agents, mise en place d'une CI minimale (lint, vérification d'import) pour éviter que des fichiers cassés comme ceux identifiés en §2.2 ne passent inaperçus. - Réparation et **branchement effectif du chaînage *Navigator* → *MatchVerifier*** (nécessaire au cas d'usage monitoring). +- **Automatisation de la pipeline d'évaluation via Argo Workflows** (déjà utilisé pour l'entraînement du modèle supervisé de production) : exécuter le jeu d'évaluation de façon reproductible et programmée, avec des métriques versionnées à chaque évolution du framework, plutôt que des lancements manuels ponctuels. + +**B. Diagnostic et évaluation** +- **Analyse des embeddings** : formaliser les explorations déjà amorcées (projections UMAP/PaCMAP/t-SNE/PCA, k-plus-proches-voisins dans `explorations.py`) en un diagnostic reproductible de la qualité de l'espace d'embedding utilisé par l'*Agentic RAG* — séparabilité des codes, zones de confusion, sensibilité au modèle d'embedding choisi. - Comparaison **plusieurs modèles LLM** sous-jacents (le framework est agnostique au modèle via une API compatible OpenAI — variable d'environnement `GENERATION_MODEL`), pour arbitrer coût/latence/qualité. - Étude du **nombre d'étapes de navigation et du taux d'échec** (requêtes n'atteignant pas de code terminal) en fonction de la formulation du prompt et des instructions du *Navigator*. + +**C. Monitoring en production** - Premiers tests du cas d'usage **monitoring** : simulation d'un flux de prédictions du modèle de production, détection par *MatchVerifier* des cas à recoder. +- **Détection de dérive par distance de Wasserstein** entre distributions de prédictions/embeddings du modèle en production dans le temps, comme méthode de détection non supervisée en amont ou en complément de *MatchVerifier* — répond directement à l'enjeu « comment contrôler le modèle en production sans annotation humaine continue ? » (§1.2). + +**D. Génération de données et industrialisation du modèle agentique** - Premiers tests du cas d'usage **génération synthétique pour ré-entraînement**, avec une métrique proxy (gain de performance du modèle supervisé sur les classes enrichies). +- **LoRA / QLoRA** : explorer le fine-tuning léger d'un modèle plus petit sur les trajectoires de raisonnement du *Navigator* (ou sur les données synthétiques de *Code2Text*), pour réduire le coût et la latence d'inférence — piste qui répondrait directement à la limite actuelle « un modèle agentique est trop lourd pour la production » (§1.3). Piste plus exploratoire, à horizon au-delà de juillet mais à garder en ligne de mire. ### 3.4 Objectifs hebdomadaires — juillet 2026 | Semaine | Dates | Objectifs | |---|---|---| -| **S1** | 6 → 11 juillet | Corriger les deux bugs bloquants (`agentic_rag.py`, `prompt_builder.py`) pour fiabiliser la base de code. Poser les bases de la **documentation détaillée du framework** (architecture, modèle de données, contrats des agents — voir §4), première brique valorisable en document de travail DMCSI. | -| **S2** | 14 → 18 juillet | Formaliser la méthode d'évaluation (§3.1) et constituer le **jeu d'évaluation stratifié** (§3.2), versionné dans le dépôt. Brancher le classifieur *Agentic RAG* dans le pipeline principal (retirer le stub). | -| **S3** | 21 → 25 juillet | Implémenter le chaînage *Navigator* → *MatchVerifier*. Lancer les **premières campagnes d'évaluation chiffrées** du *Navigator* (et de l'*Agentic RAG*) sur le jeu d'évaluation, avec comparaison au modèle supervisé de référence. | -| **S4** | 28 → 31 juillet | Évaluer la génération synthétique (*Code2Text* / *NaiveCode2Text*) via la métrique proxy de ré-entraînement. Synthèse des résultats du mois et note de recommandation sur les cas d'usage à prioriser pour la suite (monitoring, recodage, génération de données). | +| **S1** | 6 → 11 juillet | Corriger les deux bugs bloquants (`agentic_rag.py`, `prompt_builder.py`) et **nettoyer le dépôt** (code mort, structuration des scripts exploratoires, CI minimale de lint/import) pour fiabiliser la base de code. Poser les bases de la **documentation détaillée du framework** (architecture, modèle de données, contrats des agents — voir §4), première brique valorisable en document de travail DMCSI. | +| **S2** | 14 → 18 juillet | Formaliser la méthode d'évaluation (§3.1) et constituer le **jeu d'évaluation stratifié** (§3.2), versionné dans le dépôt, en s'appuyant sur un premier **diagnostic de l'espace d'embedding** (formalisation des analyses UMAP/kNN déjà amorcées). Brancher le classifieur *Agentic RAG* dans le pipeline principal (retirer le stub). | +| **S3** | 21 → 25 juillet | Implémenter le chaînage *Navigator* → *MatchVerifier*. Lancer les **premières campagnes d'évaluation chiffrées** du *Navigator* (et de l'*Agentic RAG*) sur le jeu d'évaluation, avec comparaison au modèle supervisé de référence. Amorcer un **prototype d'automatisation de la pipeline d'évaluation via Argo Workflows**. | +| **S4** | 28 → 31 juillet | Évaluer la génération synthétique (*Code2Text* / *NaiveCode2Text*) via la métrique proxy de ré-entraînement. Test exploratoire de **détection de dérive par distance de Wasserstein** sur le cas d'usage monitoring. Synthèse des résultats du mois et note de recommandation sur les cas d'usage à prioriser pour la suite (monitoring, recodage, génération de données). | + +> Pistes identifiées mais volontairement hors périmètre resserré de juillet, à ré-examiner ensuite : industrialisation complète (au-delà du prototype) de la pipeline Argo Workflows ; exploration **LoRA/QLoRA** pour un modèle agentique plus léger (cf. §3.3-D). --- From bd0c76181c6479394e30beb465102ea5e87dfc45 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 6 Jul 2026 09:29:36 +0000 Subject: [PATCH 03/18] docs: correct false positive on prompt_builder.py, log repo cleanup progress prompt_builder.py's nested-quote f-strings are valid PEP 701 syntax (Python >=3.12); the earlier "broken" claim came from testing against Python 3.11 instead of the project's pinned 3.13. Only agentic_rag.py is actually broken. Also records the cleanup already carried out this week (chore/clean-main branch, stale branches flagged for deletion). --- docs/cadrage_2026-07.md | 23 +++++++++++++++-------- docs/framework.md | 3 ++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/docs/cadrage_2026-07.md b/docs/cadrage_2026-07.md index 734b078..e8b57f5 100644 --- a/docs/cadrage_2026-07.md +++ b/docs/cadrage_2026-07.md @@ -56,11 +56,8 @@ Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre ### 2.2 Ce qui ne fonctionne pas encore -- **Deux modules du dépôt sont actuellement cassés** (erreurs de syntaxe empêchant leur simple import) : - - `src/agents/Text2Code/classifiers/agentic_rag.py` — parenthèse fermée avant l'affectation de `proposed_confidence`, code non exécutable en l'état ; - - `src/agents/NaiveCode2Text/prompts/prompt_builder.py` — f-string malformée. - - Ce sont les tout premiers correctifs à apporter (cf. roadmap semaine 1) avant toute campagne d'évaluation. +- **Un module du dépôt est actuellement cassé** : `src/agents/Text2Code/classifiers/agentic_rag.py` — la parenthèse de l'appel à `MatchVerificationInput(...)` se ferme avant l'affectation de `proposed_confidence`, ce qui rend le fichier non exécutable en l'état. C'est le tout premier correctif à apporter (cf. roadmap semaine 1) avant toute campagne d'évaluation. + *(Rectificatif : une première lecture avait aussi signalé `src/agents/NaiveCode2Text/prompts/prompt_builder.py` comme cassé — vérification faite avec l'interpréteur cible du projet, ce fichier est en réalité valide. Il utilise des f-strings à guillemets imbriqués, syntaxe introduite par la PEP 701 et disponible à partir de Python 3.12 ; le projet cible Python 3.13 (`pyproject.toml`), donc pas de problème réel, à condition d'exécuter le projet avec l'interpréteur attendu.)* - **Le classifieur « Agentic RAG »** (approche alternative combinant recherche par embeddings + *CodeChooser*) n'est pas branché dans le pipeline principal : `main.py` appelle aujourd'hui une fonction *stub* (`classify_agentic_rag`) qui renvoie une valeur codée en dur. - **Le chaînage *Navigator* → *MatchVerifier*** n'est pas encore implémenté : le *Navigator* s'arrête aujourd'hui dès qu'il atteint un code terminal, sans double vérification automatique par un second agent. C'est pourtant l'articulation nécessaire au cas d'usage « monitoring en production ». - **Aucune méthodologie d'évaluation n'est encore formalisée** : ni jeu de données de référence versionné, ni métriques automatisées, ni tableau de bord de suivi. À ce stade, l'évaluation n'existe qu'à l'état de script exploratoire ponctuel (projection UMAP/PaCMAP/t-SNE/PCA des embeddings, calcul de k-plus-proches-voisins). C'est le chantier prioritaire du mois (cf. §3). @@ -68,9 +65,19 @@ Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre - **Aucune intégration continue (CI) ne teste le code applicatif** : les deux workflows GitHub existants ne font que déployer les slides de présentation et les embeddings, sans exécuter de tests. - **Pas encore de documentation technique détaillée du framework**, au-delà du README et de la présentation de démonstration — c'est l'objet du chantier lancé cette semaine (cf. §4). -### 2.3 Synthèse +### 2.3 Nettoyage engagé cette semaine + +Premières actions de nettoyage du dépôt réalisées (branche `chore/clean-main`, à merger) : +- suppression de `newplot.png` (export Plotly oublié à la racine, 251 Ko) ; +- suppression de `presentation/_preview/` (7,7 Mo, ~90 fichiers) : un dossier de build Quarto committé par erreur, qui faisait doublon avec la branche `gh-pages` déjà utilisée pour publier le site ; +- correction des imports et variable morts détectés par `ruff` dans `src/navigator/navigator.py` ; +- exclusion d'`explorations.py` du lint `ruff` (script à cellules `# %%` pensé pour un usage interactif, pas comme script autonome). + +Côté branches Git : 7 branches `renovate/*` obsolètes (bot de dépendances, non maintenu depuis longtemps) et une branche `explorations` personnelle périmée ont été identifiées et validées pour suppression ; leur suppression effective reste à faire manuellement (limitation de droits d'accès sur l'environnement d'exécution utilisé pour cette revue). + +### 2.4 Synthèse -L'architecture cible (graphe + agents génériques + closers de validation) est posée et sa faisabilité technique est démontrée sur le cas *Navigator*. Le mois de juillet doit servir à **consolider la base de code** (corriger les deux bugs bloquants, brancher les composants manquants), puis, surtout, à **construire une évaluation chiffrée et reproductible**, condition nécessaire pour statuer sur la valeur ajoutée réelle de chacun des trois cas d'usage identifiés. +L'architecture cible (graphe + agents génériques + closers de validation) est posée et sa faisabilité technique est démontrée sur le cas *Navigator*. Le mois de juillet doit servir à **consolider la base de code** (corriger le bug bloquant, brancher les composants manquants), puis, surtout, à **construire une évaluation chiffrée et reproductible**, condition nécessaire pour statuer sur la valeur ajoutée réelle de chacun des trois cas d'usage identifiés. --- @@ -118,7 +125,7 @@ Deux volets à évaluer séparément, comme identifié dès la présentation ini | Semaine | Dates | Objectifs | |---|---|---| -| **S1** | 6 → 11 juillet | Corriger les deux bugs bloquants (`agentic_rag.py`, `prompt_builder.py`) et **nettoyer le dépôt** (code mort, structuration des scripts exploratoires, CI minimale de lint/import) pour fiabiliser la base de code. Poser les bases de la **documentation détaillée du framework** (architecture, modèle de données, contrats des agents — voir §4), première brique valorisable en document de travail DMCSI. | +| **S1** | 6 → 11 juillet | Corriger le bug bloquant (`agentic_rag.py`) et **nettoyer le dépôt** (code mort, artefacts de build committés par erreur, structuration des scripts exploratoires, CI minimale de lint/import) pour fiabiliser la base de code. Poser les bases de la **documentation détaillée du framework** (architecture, modèle de données, contrats des agents — voir §4), première brique valorisable en document de travail DMCSI. | | **S2** | 14 → 18 juillet | Formaliser la méthode d'évaluation (§3.1) et constituer le **jeu d'évaluation stratifié** (§3.2), versionné dans le dépôt, en s'appuyant sur un premier **diagnostic de l'espace d'embedding** (formalisation des analyses UMAP/kNN déjà amorcées). Brancher le classifieur *Agentic RAG* dans le pipeline principal (retirer le stub). | | **S3** | 21 → 25 juillet | Implémenter le chaînage *Navigator* → *MatchVerifier*. Lancer les **premières campagnes d'évaluation chiffrées** du *Navigator* (et de l'*Agentic RAG*) sur le jeu d'évaluation, avec comparaison au modèle supervisé de référence. Amorcer un **prototype d'automatisation de la pipeline d'évaluation via Argo Workflows**. | | **S4** | 28 → 31 juillet | Évaluer la génération synthétique (*Code2Text* / *NaiveCode2Text*) via la métrique proxy de ré-entraînement. Test exploratoire de **détection de dérive par distance de Wasserstein** sur le cas d'usage monitoring. Synthèse des résultats du mois et note de recommandation sur les cas d'usage à prioriser pour la suite (monitoring, recodage, génération de données). | diff --git a/docs/framework.md b/docs/framework.md index 4c209d3..851e283 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -132,9 +132,10 @@ Cette section documentera, une fois formalisée, le mode opératoire complet pou Recensées ici pour mémoire (suivi détaillé dans le document de cadrage) : -- `src/agents/Text2Code/classifiers/agentic_rag.py` et `src/agents/NaiveCode2Text/prompts/prompt_builder.py` contiennent des erreurs de syntaxe empêchant leur import. +- `src/agents/Text2Code/classifiers/agentic_rag.py` contient une erreur de syntaxe empêchant son import (parenthèse fermée trop tôt dans la construction de `MatchVerificationInput`). - Pas de suite de tests automatisés ni de CI sur le code applicatif (seuls le déploiement des slides et des embeddings sont automatisés). - Pas encore de jeu d'évaluation versionné ni de métriques automatisées (chantier semaine 2 de la roadmap de juillet). +- **Le projet requiert Python ≥ 3.12** (idéalement 3.13, cf. `pyproject.toml` et `.python-version`) : certains modules (ex. `prompt_builder.py`) utilisent des f-strings à guillemets imbriqués, syntaxe introduite par la PEP 701 et invalide sur des versions antérieures. Exécuter le projet avec un interpréteur plus ancien (3.11 par exemple) produit de fausses erreurs de syntaxe sur ces fichiers. --- From ecfd1a5c84e2d246ac4be7823c1a6cc957d9dfa7 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 6 Jul 2026 09:57:54 +0000 Subject: [PATCH 04/18] feat: execute week-1/2 roadmap items from the cadrage document - Fix the syntax error in AgenticRAGClassifier (misplaced closing paren in the MatchVerificationInput construction). - Wire AgenticRAGClassifier into the CLI: --agentic-rag now runs the real top-k retrieval + CodeChooser pipeline instead of a stub; candidate count configurable via AGENTIC_RAG_TOP_K. - Add --verify: chain any classifier prediction into the MatchVerifier for an independent verdict, in single and batch modes (groundwork for the production-monitoring use case). - Add src/evaluation/: dependency-free hierarchical metrics (leaf and per-level accuracy, failure rate), reproducible stratified eval-set builder, and an evaluation campaign harness. - Add a minimal CI workflow (ruff, compileall, pytest) plus unit tests for the metrics; drop unused imports flagged by ruff in navigator.py. Integration against Neo4j/LLM still needs to be validated on Datalab; docs updated accordingly. --- .github/workflows/ci.yml | 30 +++++ docs/cadrage_2026-07.md | 10 +- docs/framework.md | 37 ++++-- pyproject.toml | 7 + .../Text2Code/classifiers/agentic_rag.py | 2 +- src/evaluation/__init__.py | 0 src/evaluation/build_eval_set.py | 123 ++++++++++++++++++ src/evaluation/metrics.py | 86 ++++++++++++ src/evaluation/run_eval.py | 87 +++++++++++++ src/main.py | 81 ++++++++++-- src/navigator/navigator.py | 3 - src/utils/parser.py | 8 +- tests/test_metrics.py | 66 ++++++++++ 13 files changed, 510 insertions(+), 30 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 src/evaluation/__init__.py create mode 100644 src/evaluation/build_eval_set.py create mode 100644 src/evaluation/metrics.py create mode 100644 src/evaluation/run_eval.py create mode 100644 tests/test_metrics.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..cecb671 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + lint-and-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Install tooling + run: pip install ruff pytest + + - name: Lint + run: ruff check . + + - name: Syntax check + run: python -m compileall -q src tests + + # Unit tests are dependency-free (pure-Python metrics), so no `uv sync` + # is needed; keep the CI fast until integration tests exist. + - name: Unit tests + run: pytest -q diff --git a/docs/cadrage_2026-07.md b/docs/cadrage_2026-07.md index e8b57f5..f00a6b4 100644 --- a/docs/cadrage_2026-07.md +++ b/docs/cadrage_2026-07.md @@ -56,13 +56,13 @@ Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre ### 2.2 Ce qui ne fonctionne pas encore -- **Un module du dépôt est actuellement cassé** : `src/agents/Text2Code/classifiers/agentic_rag.py` — la parenthèse de l'appel à `MatchVerificationInput(...)` se ferme avant l'affectation de `proposed_confidence`, ce qui rend le fichier non exécutable en l'état. C'est le tout premier correctif à apporter (cf. roadmap semaine 1) avant toute campagne d'évaluation. +- **Un module du dépôt est actuellement cassé** : `src/agents/Text2Code/classifiers/agentic_rag.py` — la parenthèse de l'appel à `MatchVerificationInput(...)` se ferme avant l'affectation de `proposed_confidence`, ce qui rend le fichier non exécutable en l'état. C'est le tout premier correctif à apporter (cf. roadmap semaine 1) avant toute campagne d'évaluation. → **Corrigé le 6/07.** *(Rectificatif : une première lecture avait aussi signalé `src/agents/NaiveCode2Text/prompts/prompt_builder.py` comme cassé — vérification faite avec l'interpréteur cible du projet, ce fichier est en réalité valide. Il utilise des f-strings à guillemets imbriqués, syntaxe introduite par la PEP 701 et disponible à partir de Python 3.12 ; le projet cible Python 3.13 (`pyproject.toml`), donc pas de problème réel, à condition d'exécuter le projet avec l'interpréteur attendu.)* -- **Le classifieur « Agentic RAG »** (approche alternative combinant recherche par embeddings + *CodeChooser*) n'est pas branché dans le pipeline principal : `main.py` appelle aujourd'hui une fonction *stub* (`classify_agentic_rag`) qui renvoie une valeur codée en dur. -- **Le chaînage *Navigator* → *MatchVerifier*** n'est pas encore implémenté : le *Navigator* s'arrête aujourd'hui dès qu'il atteint un code terminal, sans double vérification automatique par un second agent. C'est pourtant l'articulation nécessaire au cas d'usage « monitoring en production ». -- **Aucune méthodologie d'évaluation n'est encore formalisée** : ni jeu de données de référence versionné, ni métriques automatisées, ni tableau de bord de suivi. À ce stade, l'évaluation n'existe qu'à l'état de script exploratoire ponctuel (projection UMAP/PaCMAP/t-SNE/PCA des embeddings, calcul de k-plus-proches-voisins). C'est le chantier prioritaire du mois (cf. §3). +- **Le classifieur « Agentic RAG »** (approche alternative combinant recherche par embeddings + *CodeChooser*) n'est pas branché dans le pipeline principal : `main.py` appelle aujourd'hui une fonction *stub* (`classify_agentic_rag`) qui renvoie une valeur codée en dur. → **Corrigé le 6/07** : le classifieur est branché dans la CLI (`--agentic-rag`) ; validation fonctionnelle sur la base Neo4j à faire. +- **Le chaînage *Navigator* → *MatchVerifier*** n'est pas encore implémenté : le *Navigator* s'arrête aujourd'hui dès qu'il atteint un code terminal, sans double vérification automatique par un second agent. C'est pourtant l'articulation nécessaire au cas d'usage « monitoring en production ». → **Implémenté le 6/07** via l'option `--verify` de la CLI (en mode unitaire comme en batch) ; validation fonctionnelle sur données réelles à faire. +- **Aucune méthodologie d'évaluation n'est encore formalisée** : ni jeu de données de référence versionné, ni métriques automatisées, ni tableau de bord de suivi. À ce stade, l'évaluation n'existe qu'à l'état de script exploratoire ponctuel (projection UMAP/PaCMAP/t-SNE/PCA des embeddings, calcul de k-plus-proches-voisins). C'est le chantier prioritaire du mois (cf. §3). → **Premier socle posé le 6/07** : module `src/evaluation/` (métriques d'exactitude à la feuille et par niveau hiérarchique testées unitairement, échantillonnage stratifié reproductible, harnais de campagne) ; la constitution effective du jeu d'évaluation et les campagnes chiffrées restent à mener (S2–S3). - **La génération synthétique agentique** (*Code2Text*, par opposition à l'approche *Naive*) est au stade de squelette de code, non encore évaluée ni comparée à l'approche naïve. -- **Aucune intégration continue (CI) ne teste le code applicatif** : les deux workflows GitHub existants ne font que déployer les slides de présentation et les embeddings, sans exécuter de tests. +- **Aucune intégration continue (CI) ne teste le code applicatif** : les deux workflows GitHub existants ne font que déployer les slides de présentation et les embeddings, sans exécuter de tests. → **Corrigé le 6/07** : workflow CI ajouté (lint `ruff`, vérification de syntaxe, tests unitaires). - **Pas encore de documentation technique détaillée du framework**, au-delà du README et de la présentation de démonstration — c'est l'objet du chantier lancé cette semaine (cf. §4). ### 2.3 Nettoyage engagé cette semaine diff --git a/docs/framework.md b/docs/framework.md index 851e283..d4ba7db 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -79,7 +79,7 @@ Chaque appel d'outil est journalisé (position avant/après, données renvoyées - `BaseClassifier` — spécialise `BaseAgent` en fixant le type de sortie à `MatchVerificationInput` (activité, code proposé, explication, confiance), le format commun attendu par les agents « closers ». - `NavigatorAgenticClassifier` — classifieur concret : instructions demandant au *Navigator* de descendre jusqu'à un code terminal (`is_final = 1`) en justifiant chaque choix, en démarrant systématiquement par `get_current_children()`. -- `AgenticRAGClassifier` (`agentic_rag.py`) — approche alternative : récupération des *top-k* codes les plus proches par similarité d'embedding (`Graph.get_closest_codes`), puis arbitrage par l'agent `CodeChooser`. **Ce module contient actuellement une erreur de syntaxe et n'est pas exécutable** (correctif prévu semaine 1, cf. cadrage §2.2) ; il n'est pas non plus branché dans `src/main.py` (fonction *stub*). +- `AgenticRAGClassifier` (`agentic_rag.py`) — approche alternative : récupération des *top-k* codes les plus proches par similarité d'embedding (`Graph.get_closest_codes`, recherche vectorielle Neo4j filtrée sur les codes finaux), puis arbitrage par l'agent `CodeChooser`. Branché dans la CLI via `--agentic-rag` ; le nombre de candidats est réglable par la variable d'environnement `AGENTIC_RAG_TOP_K` (défaut : 5). ### 3.5 Agents « closers » (`src/agents/closers/`) @@ -88,7 +88,7 @@ Agents de validation, appelés en fin de chaîne : - **`CodeChooser`** — arbitre entre plusieurs codes candidats pour une activité donnée ; sortie : code choisi, niveau de confiance, explication. - **`MatchVerifier`** — vérifie qu'une correspondance libellé ↔ code proposée est valide ; sortie : booléen de validité, confiance, explication. C'est cet agent qui porte le cas d'usage « monitoring du modèle en production » (cf. cadrage §1.3). -**[à compléter]** : le chaînage effectif `Navigator` → `MatchVerifier` n'existe pas encore dans le code (prévu semaine 3 de la roadmap) ; cette section sera mise à jour une fois l'intégration réalisée. +Le chaînage classifieur → *MatchVerifier* est disponible via l'option `--verify` de la CLI : la sortie du classifieur (un `MatchVerificationInput` : activité, code proposé, explication, confiance) est passée telle quelle au *MatchVerifier*, qui rend un verdict indépendant (`is_match`, confiance, explication). Ce chaînage fonctionne en mode unitaire comme en mode batch et constitue la brique de base du cas d'usage « monitoring » (cf. cadrage §1.3). **[à compléter]** : retour d'expérience et calibrage des seuils de confiance après les premières campagnes d'évaluation. ### 3.6 Génération de données synthétiques (`src/agents/Code2Text/`, `src/agents/NaiveCode2Text/`) @@ -99,19 +99,34 @@ Deux approches, à des stades de maturité différents : ## 4. Point d'entrée et CLI (`src/main.py`) -La CLI (`src/utils/parser.py`) expose deux méthodes de classification : +La CLI (`src/utils/parser.py`) expose deux méthodes de classification, avec vérification optionnelle : ```bash uv run -m src.main --navigator "Boulangerie artisanale avec vente directe" +uv run -m src.main --agentic-rag "Boulangerie" --verify uv run -m src.main --navigator --batch-file requetes.txt --experiment-name mon-experience ``` -- `--navigator QUERY` — classification agentique via le *Navigator* ; -- `--agentic-rag QUERY` — **actuellement un stub** renvoyant une valeur codée en dur, en attendant le branchement du classifieur `AgenticRAGClassifier` (cf. §3.4) ; +- `--navigator QUERY` — classification agentique par navigation hiérarchique (*Navigator*) ; +- `--agentic-rag QUERY` — classification par recherche vectorielle *top-k* + arbitrage `CodeChooser` (cf. §3.4) ; +- `--verify` — chaîne la prédiction dans le *MatchVerifier* pour double vérification (cf. §3.5) ; - `--batch-file FILE` — traite un fichier de requêtes (une par ligne) avec la méthode choisie ; - `--experiment-name` — nom d'expérience propagé au traçage Langfuse. -## 5. Configuration (variables d'environnement) +## 5. Module d'évaluation (`src/evaluation/`) + +Socle du chantier prioritaire du mois (cf. cadrage §3.1–3.2), en trois briques : + +- **`metrics.py`** — métriques pures Python (sans dépendance, testées unitairement dans `tests/`) : normalisation des codes (`"10.71C"` ≡ `"1071C"`), exactitude à la feuille, exactitude par niveau hiérarchique (préfixes : 2 = division, 3 = groupe, 4 = classe pour la NAF), taux d'échec (prédictions n'ayant pas atteint de code final, comptées comme erreurs). +- **`build_eval_set.py`** — construction du jeu d'évaluation stratifié : lecture du parquet labellisé (local ou S3/Datalab), stratification par préfixe de code (division par défaut), tirage plafonné par strate et reproductible (seed) — les strates plus petites que le plafond sont conservées en entier. +- **`run_eval.py`** — harnais de campagne : exécute une méthode (`navigator` ou `agentic-rag`) sur le jeu d'évaluation, écrit les prédictions détaillées (parquet) et le rapport de métriques (JSON). Nécessite Neo4j et l'API LLM à l'exécution. + +```bash +uv run -m src.evaluation.build_eval_set --input --output data/eval/eval_set.parquet +uv run -m src.evaluation.run_eval --eval-set data/eval/eval_set.parquet --method navigator +``` + +## 6. Configuration (variables d'environnement) | Variable | Usage | |---|---| @@ -124,17 +139,17 @@ uv run -m src.main --navigator --batch-file requetes.txt --experiment-name mon-e Le traçage applicatif (sessions, coûts, latence, arbre d'appels des agents) est assuré par **Langfuse** (`get_client`, `propagate_attributes`, `@observe` dans `src/main.py`). -## 6. Comment étendre GRAAL à une nouvelle nomenclature **[à compléter]** +## 7. Comment étendre GRAAL à une nouvelle nomenclature **[à compléter]** Cette section documentera, une fois formalisée, le mode opératoire complet pour instancier GRAAL sur une nouvelle nomenclature : format attendu du fichier de notices, exécution du pipeline de construction du graphe, adaptation minimale des prompts si nécessaire. -## 7. Limites connues et dette technique +## 8. Limites connues et dette technique Recensées ici pour mémoire (suivi détaillé dans le document de cadrage) : -- `src/agents/Text2Code/classifiers/agentic_rag.py` contient une erreur de syntaxe empêchant son import (parenthèse fermée trop tôt dans la construction de `MatchVerificationInput`). -- Pas de suite de tests automatisés ni de CI sur le code applicatif (seuls le déploiement des slides et des embeddings sont automatisés). -- Pas encore de jeu d'évaluation versionné ni de métriques automatisées (chantier semaine 2 de la roadmap de juillet). +- Les composants branchés le 6/07 (classifieur *Agentic RAG* dans la CLI, chaînage `--verify`, harnais `run_eval`) sont vérifiés statiquement (lint, syntaxe, tests unitaires des métriques) mais **pas encore validés fonctionnellement** contre la base Neo4j et l'API LLM — à faire dès le retour sur l'environnement Datalab. +- La CI couvre lint, syntaxe et tests unitaires purs, mais **pas de tests d'intégration** (agents + graphe) : ils nécessiteraient un service Neo4j et un LLM de test dans le workflow. +- Le jeu d'évaluation lui-même n'est pas encore constitué ni versionné (l'outillage est prêt, il manque l'accès aux données — chantier semaine 2 de la roadmap de juillet). - **Le projet requiert Python ≥ 3.12** (idéalement 3.13, cf. `pyproject.toml` et `.python-version`) : certains modules (ex. `prompt_builder.py`) utilisent des f-strings à guillemets imbriqués, syntaxe introduite par la PEP 701 et invalide sur des versions antérieures. Exécuter le projet avec un interpréteur plus ancien (3.11 par exemple) produit de fausses erreurs de syntaxe sur ces fichiers. --- diff --git a/pyproject.toml b/pyproject.toml index b1bd031..bcce665 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,3 +41,10 @@ dev = [ [tool.ruff] line-length = 100 extend-include = ["*.ipynb"] +# Cell-based script meant to be run interactively (VS Code / Jupytext), relies +# on IPython magics that are not valid standalone Python syntax. +extend-exclude = ["explorations.py"] + +[tool.pytest.ini_options] +pythonpath = ["."] +testpaths = ["tests"] diff --git a/src/agents/Text2Code/classifiers/agentic_rag.py b/src/agents/Text2Code/classifiers/agentic_rag.py index a833364..6bfaa32 100644 --- a/src/agents/Text2Code/classifiers/agentic_rag.py +++ b/src/agents/Text2Code/classifiers/agentic_rag.py @@ -36,8 +36,8 @@ async def __call__(self, activity: str) -> str: activity=activity, code=code_choice_result.chosen_code, proposed_explanation=code_choice_result.explanation, - ) proposed_confidence=code_choice_result.confidence, # confidence from CodeChoice + ) return result diff --git a/src/evaluation/__init__.py b/src/evaluation/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/evaluation/build_eval_set.py b/src/evaluation/build_eval_set.py new file mode 100644 index 0000000..08834c8 --- /dev/null +++ b/src/evaluation/build_eval_set.py @@ -0,0 +1,123 @@ +"""Construction d'un jeu d'évaluation stratifié à partir d'un parquet labellisé. + +Stratification par préfixe de code (2 caractères = division NAF par défaut) +pour couvrir les classes rares comme les sections à fort volume, avec un +tirage reproductible (seed fixée). + +Usage : + uv run -m src.evaluation.build_eval_set \ + --input projet-ape/data/08112022_27102024/naf2025/split/df_test.parquet \ + --output data/eval/eval_set.parquet \ + --n-per-stratum 10 + +Le chemin d'entrée est lu en local s'il existe, sinon sur S3 (Datalab/Onyxia, +identifiants AWS_* dans l'environnement). +""" + +import argparse +import logging +import os + +import polars as pl + +from src.evaluation.metrics import normalize_code +from src.utils.logging import configure_logging + +configure_logging() +logger = logging.getLogger(__name__) + +S3_ENDPOINT = "https://minio.lab.sspcloud.fr" + + +def load_dataframe(path: str) -> pl.DataFrame: + """Charge un parquet depuis le disque local ou S3 (Datalab).""" + if os.path.exists(path): + logger.info(f"Loading local parquet: {path}") + return pl.read_parquet(path) + + import s3fs + + logger.info(f"Loading parquet from S3: {path}") + fs = s3fs.S3FileSystem( + client_kwargs={"endpoint_url": S3_ENDPOINT}, + key=os.environ["AWS_ACCESS_KEY_ID"], + secret=os.environ["AWS_SECRET_ACCESS_KEY"], + token=os.environ["AWS_SESSION_TOKEN"], + ) + with fs.open(path, "rb") as f: + return pl.read_parquet(f) + + +def stratified_sample( + df: pl.DataFrame, + code_column: str, + n_per_stratum: int, + stratum_depth: int = 2, + seed: int = 42, +) -> pl.DataFrame: + """Tire au plus `n_per_stratum` lignes par strate de code. + + Args: + df: Données labellisées. + code_column: Colonne contenant le code de nomenclature. + n_per_stratum: Nombre maximal de lignes par strate (les strates plus + petites sont prises en entier). + stratum_depth: Longueur du préfixe de code normalisé définissant la + strate (2 = division NAF). + seed: Graine du tirage, pour un jeu reproductible. + """ + df = ( + df.with_columns( + pl.col(code_column) + .map_elements(normalize_code, return_dtype=pl.Utf8) + .alias("_norm_code") + ) + .drop_nulls("_norm_code") + .with_columns(pl.col("_norm_code").str.slice(0, stratum_depth).alias("_stratum")) + ) + + n_strata = df["_stratum"].n_unique() + logger.info(f"{n_strata} strata found at depth {stratum_depth}") + + sampled = df.filter( + pl.int_range(pl.len()).shuffle(seed=seed).over("_stratum") < n_per_stratum + ) + + logger.info(f"Sampled {len(sampled)} rows out of {len(df)}") + return sampled.drop(["_norm_code", "_stratum"]) + + +def main() -> int: + parser = argparse.ArgumentParser(description="Build a stratified evaluation set") + parser.add_argument("--input", required=True, help="Input parquet (local path or S3 key)") + parser.add_argument("--output", required=True, help="Output parquet (local path)") + parser.add_argument("--code-column", default="nace2025", help="Label column (default: nace2025)") + parser.add_argument( + "--n-per-stratum", type=int, default=10, help="Max rows per stratum (default: 10)" + ) + parser.add_argument( + "--stratum-depth", + type=int, + default=2, + help="Code prefix length defining a stratum (default: 2 = NAF division)", + ) + parser.add_argument("--seed", type=int, default=42, help="Sampling seed (default: 42)") + args = parser.parse_args() + + df = load_dataframe(args.input) + sampled = stratified_sample( + df, + code_column=args.code_column, + n_per_stratum=args.n_per_stratum, + stratum_depth=args.stratum_depth, + seed=args.seed, + ) + + os.makedirs(os.path.dirname(args.output) or ".", exist_ok=True) + sampled.write_parquet(args.output) + logger.info(f"Evaluation set written to {args.output}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/evaluation/metrics.py b/src/evaluation/metrics.py new file mode 100644 index 0000000..25debcc --- /dev/null +++ b/src/evaluation/metrics.py @@ -0,0 +1,86 @@ +"""Métriques d'évaluation pour la classification hiérarchique. + +Volontairement sans dépendance tierce : le module reste importable et testable +dans un environnement de CI minimal, sans Neo4j ni client LLM. + +Les codes sont normalisés (suppression des points/espaces, majuscules) avant +comparaison, si bien que "10.71C" et "1071c" sont considérés identiques. +Pour la NAF/NACE, les préfixes du code normalisé correspondent aux niveaux +de la hiérarchie : 2 caractères = division, 3 = groupe, 4 = classe, +code complet = sous-classe (feuille). +""" + + +def normalize_code(code) -> str | None: + """Normalise un code de nomenclature pour comparaison. + + Retourne None pour une prédiction manquante (None, chaîne vide), + ce qui matérialise un échec du classifieur (pas de code final atteint). + """ + if code is None: + return None + normalized = str(code).replace(".", "").replace(" ", "").upper() + return normalized or None + + +def accuracy_at_depth(y_true: list, y_pred: list, depth: int | None = None) -> float: + """Part des prédictions égales à la vérité terrain sur les `depth` premiers caractères. + + Args: + y_true: Codes de référence. + y_pred: Codes prédits (None = échec du classifieur, compté comme erreur). + depth: Profondeur de comparaison ; None compare les codes complets + (exactitude à la feuille). + + Returns: + Exactitude entre 0 et 1 ; NaN si aucune paire exploitable. Les paires + dont la vérité terrain est manquante sont ignorées. + """ + if len(y_true) != len(y_pred): + raise ValueError(f"y_true ({len(y_true)}) et y_pred ({len(y_pred)}) doivent avoir la même taille") + + correct = 0 + total = 0 + for true_code, pred_code in zip(y_true, y_pred): + true_norm = normalize_code(true_code) + pred_norm = normalize_code(pred_code) + if true_norm is None: + continue + total += 1 + if pred_norm is None: + continue + if depth is None: + correct += true_norm == pred_norm + else: + correct += true_norm[:depth] == pred_norm[:depth] + + return correct / total if total else float("nan") + + +def failure_rate(y_pred: list) -> float: + """Part des prédictions manquantes (le classifieur n'a pas atteint de code final).""" + if not y_pred: + return float("nan") + return sum(1 for pred in y_pred if normalize_code(pred) is None) / len(y_pred) + + +def evaluate(y_true: list, y_pred: list, depths: tuple = (2, 3, 4)) -> dict: + """Rapport d'évaluation complet d'un classifieur. + + Args: + y_true: Codes de référence. + y_pred: Codes prédits (None = échec). + depths: Profondeurs de préfixe pour l'exactitude par niveau + (par défaut : division, groupe, classe pour la NAF). + + Returns: + Dictionnaire {n, leaf_accuracy, failure_rate, accuracy_depth_...}. + """ + report = { + "n": len(y_true), + "leaf_accuracy": accuracy_at_depth(y_true, y_pred), + "failure_rate": failure_rate(y_pred), + } + for depth in depths: + report[f"accuracy_depth_{depth}"] = accuracy_at_depth(y_true, y_pred, depth=depth) + return report diff --git a/src/evaluation/run_eval.py b/src/evaluation/run_eval.py new file mode 100644 index 0000000..46f0ccd --- /dev/null +++ b/src/evaluation/run_eval.py @@ -0,0 +1,87 @@ +"""Exécution d'une campagne d'évaluation d'un classifieur sur un jeu d'évaluation. + +Charge un jeu d'évaluation (cf. build_eval_set.py), classe chaque libellé avec +la méthode choisie, calcule les métriques (exactitude feuille et par niveau, +taux d'échec) et écrit les prédictions détaillées + le rapport de métriques. + +Nécessite à l'exécution : la base Neo4j et l'API LLM configurées dans +l'environnement (mêmes prérequis que src.main). + +Usage : + uv run -m src.evaluation.run_eval \ + --eval-set data/eval/eval_set.parquet \ + --method navigator \ + --output-dir data/eval/results +""" + +import argparse +import asyncio +import json +import logging +import os + +import polars as pl + +from src.evaluation.metrics import evaluate +from src.main import classify_agentic_rag, classify_navigator +from src.utils.logging import configure_logging + +configure_logging() +logger = logging.getLogger(__name__) + +METHODS = { + "navigator": classify_navigator, + "agentic-rag": classify_agentic_rag, +} + + +async def run(args) -> int: + df = pl.read_parquet(args.eval_set) + labels = df[args.text_column].to_list() + y_true = df[args.code_column].to_list() + logger.info(f"Evaluating method '{args.method}' on {len(labels)} labels") + + method = METHODS[args.method] + predictions = await method(labels) + + # Les classifieurs renvoient des MatchVerificationInput ; un échec (pas de + # code final atteint) est représenté par une prédiction sans code. + y_pred = [getattr(pred, "code", None) for pred in predictions] + explanations = [getattr(pred, "proposed_explanation", None) for pred in predictions] + confidences = [getattr(pred, "proposed_confidence", None) for pred in predictions] + + report = evaluate(y_true, y_pred) + logger.info(f"Metrics: {report}") + + os.makedirs(args.output_dir, exist_ok=True) + + details = df.with_columns( + pl.Series("prediction", y_pred), + pl.Series("explanation", explanations), + pl.Series("confidence", confidences), + ) + details_path = os.path.join(args.output_dir, f"predictions_{args.method}.parquet") + details.write_parquet(details_path) + + report_path = os.path.join(args.output_dir, f"metrics_{args.method}.json") + with open(report_path, "w", encoding="utf-8") as f: + json.dump(report, f, indent=2, ensure_ascii=False) + + print(json.dumps(report, indent=2, ensure_ascii=False)) + logger.info(f"Predictions written to {details_path}, metrics to {report_path}") + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser(description="Run an evaluation campaign") + parser.add_argument("--eval-set", required=True, help="Evaluation parquet (cf. build_eval_set)") + parser.add_argument("--method", choices=sorted(METHODS), default="navigator") + parser.add_argument("--text-column", default="libelle", help="Text column (default: libelle)") + parser.add_argument("--code-column", default="nace2025", help="Label column (default: nace2025)") + parser.add_argument("--output-dir", default="data/eval/results", help="Output directory") + args = parser.parse_args() + return asyncio.run(run(args)) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/main.py b/src/main.py index a7d45c5..9295c97 100644 --- a/src/main.py +++ b/src/main.py @@ -1,12 +1,16 @@ import asyncio import logging +import os import sys from langfuse import get_client, propagate_attributes, observe from datetime import datetime +from src.agents.closers.match_verifier import MatchVerificationInput, MatchVerifier +from src.agents.Text2Code.classifiers.agentic_rag import AgenticRAGClassifier from src.agents.Text2Code.classifiers.navigator_classifier import NavigatorAgenticClassifier from src.config import neo4j_config from src.navigator.navigator import Navigator +from src.neo4j_graph.graph import Graph from src.utils.logging import configure_logging from src.utils.parser import parse_args @@ -52,15 +56,57 @@ async def classify_navigator( @observe -async def classify_agentic_rag(query: str, experiment_name: str): - """Classify using flat embeddings""" - logger.info(f"Flat embeddings classification: {query}") +async def classify_agentic_rag( + query: str | list[str], + experiment_name: str = "Agentic RAG Classification", +): + """Classify using embedding retrieval (top-k closest codes) + CodeChooser agent + + Args: + query: A single query string or a list of query strings + experiment_name: Name of the experiment + + Returns: + Single MatchVerificationInput if query is str, list of them if query is list + """ + queries = [query] if isinstance(query, str) else query + is_single = isinstance(query, str) + + logger.info(f"Agentic RAG classification: {len(queries)} query/queries") + + graph = Graph(neo4j_config) + top_k = int(os.environ.get("AGENTIC_RAG_TOP_K", "5")) + classifier = AgenticRAGClassifier(graph, top_k=top_k) + + results = [] + for q in queries: + logger.info(f"Classifying: {q}") + result = await classifier(q) + results.append(result) + logger.info(f"Le résultat de la classification est : {result}") + + return results[0] if is_single else results - return "10.71C" + +async def verify_classification(prediction: MatchVerificationInput, verifier: MatchVerifier): + """Chain a classifier prediction into the MatchVerifier for double-checking + + Args: + prediction: Output of a classifier (activity, proposed code, explanation, confidence) + verifier: MatchVerifier agent instance + + Returns: + MatchVerificationResult (is_match, confidence, explanation) + """ + verification = await verifier(prediction) + logger.info(f"Le résultat de la vérification est : {verification}") + return verification @observe -async def process_batch_file(filepath: str, method_func, experiment_name: str): +async def process_batch_file( + filepath: str, method_func, experiment_name: str, verifier: MatchVerifier | None = None +): """Process a batch file with queries""" logger.info(f"Processing batch file: {filepath}") @@ -73,7 +119,10 @@ async def process_batch_file(filepath: str, method_func, experiment_name: str): for i, query in enumerate(queries, 1): logger.info(f"Processing {i}/{len(queries)}: {query}") result = await method_func(query, experiment_name) - results.append({"query": query, "code": result}) + verification = None + if verifier is not None and isinstance(result, MatchVerificationInput): + verification = await verify_classification(result, verifier) + results.append({"query": query, "result": result, "verification": verification}) return results @@ -100,22 +149,30 @@ async def main(): logger.info("Use --help to see available options") return 1 + verifier = MatchVerifier(Graph(neo4j_config)) if args.verify else None + # Batch file mode if args.batch_file: - logger.error("No classification method specified!") if len(methods_to_run) > 1: logger.warning("Multiple methods specified, using first one for batch") method_name, _, method_func = methods_to_run[0] logger.info(f"Batch mode with method: {method_name}") - results = await process_batch_file(args.batch_file, method_func, args.experiment_name) + results = await process_batch_file( + args.batch_file, method_func, args.experiment_name, verifier=verifier + ) print("\n" + "=" * 80) print("BATCH RESULTS") print("=" * 80) for result in results: - print(f" {result['query']:40s} → {result['code']}") + code = getattr(result["result"], "code", result["result"]) + line = f" {result['query']:40s} → {code}" + if result["verification"] is not None: + status = "✅" if result["verification"].is_match else "❌" + line += f" | verifier: {status} ({result['verification'].confidence:.2f})" + print(line) print("=" * 80) return 0 @@ -131,6 +188,12 @@ async def main(): print(f"\n✅ Result: {result}") + if verifier is not None and isinstance(result, MatchVerificationInput): + verification = await verify_classification(result, verifier) + status = "✅ validé" if verification.is_match else "❌ rejeté" + print(f"🔍 Verification: {status} ({verification.confidence:.2f})") + print(f" {verification.explanation}") + return 0 except KeyboardInterrupt: diff --git a/src/navigator/navigator.py b/src/navigator/navigator.py index cf1c556..4f9e705 100644 --- a/src/navigator/navigator.py +++ b/src/navigator/navigator.py @@ -1,10 +1,8 @@ import logging from typing import Any, Dict, List, Optional -import json from agents import function_tool from src.neo4j_graph.graph import Graph, Neo4JConfig, _unfreeze_dict, _unfreeze_list_of_dicts -from src.agents.closers.match_verifier import MatchVerificationInput logger = logging.getLogger(__name__) @@ -28,7 +26,6 @@ def get_current_information() -> Dict[str, Any]: # Cas spécial pour root if navigator.current_code == "root": - children = get_current_children() result = { "success": True, "code": "root", diff --git a/src/utils/parser.py b/src/utils/parser.py index d2c4000..795985a 100644 --- a/src/utils/parser.py +++ b/src/utils/parser.py @@ -22,11 +22,17 @@ def parse_args() -> argparse.Namespace: const="Boulangerie", default=None, metavar="QUERY", - help="Classify with flat embeddings method. Default query: 'Boulangerie'", + help="Classify with embedding retrieval + CodeChooser agent. Default query: 'Boulangerie'", ) options = parser.add_argument_group("Options") + options.add_argument( + "--verify", + action="store_true", + help="Chain the classification into the MatchVerifier agent for double-checking", + ) + options.add_argument( "--experiment-name", type=str, diff --git a/tests/test_metrics.py b/tests/test_metrics.py new file mode 100644 index 0000000..2658071 --- /dev/null +++ b/tests/test_metrics.py @@ -0,0 +1,66 @@ +import math + +from src.evaluation.metrics import accuracy_at_depth, evaluate, failure_rate, normalize_code + + +def test_normalize_code(): + assert normalize_code("10.71C") == "1071C" + assert normalize_code(" 10 71 c ") == "1071C" + assert normalize_code(None) is None + assert normalize_code("") is None + + +def test_leaf_accuracy(): + y_true = ["10.71C", "62.01Z", "01.11Z"] + y_pred = ["1071C", "62.02A", "01.11Z"] + assert accuracy_at_depth(y_true, y_pred) == 2 / 3 + + +def test_depth_accuracy(): + y_true = ["10.71C", "62.01Z"] + y_pred = ["10.72B", "43.99C"] + # Division (depth 2): 10 == 10 mais 62 != 43 + assert accuracy_at_depth(y_true, y_pred, depth=2) == 1 / 2 + # Classe (depth 4): 1071 != 1072 + assert accuracy_at_depth(y_true, y_pred, depth=4) == 0.0 + + +def test_missing_prediction_counts_as_error(): + assert accuracy_at_depth(["10.71C"], [None]) == 0.0 + assert accuracy_at_depth(["10.71C"], [None], depth=2) == 0.0 + + +def test_missing_ground_truth_is_skipped(): + assert accuracy_at_depth([None, "10.71C"], ["10.71C", "10.71C"]) == 1.0 + + +def test_length_mismatch_raises(): + try: + accuracy_at_depth(["a"], []) + except ValueError: + pass + else: + raise AssertionError("expected ValueError") + + +def test_failure_rate(): + assert failure_rate(["10.71C", None, "", "62.01Z"]) == 2 / 4 + assert math.isnan(failure_rate([])) + + +def test_evaluate_report(): + y_true = ["10.71C", "62.01Z", "01.11Z", "43.99C"] + y_pred = ["10.71C", "62.02A", None, "43.99C"] + report = evaluate(y_true, y_pred) + assert report["n"] == 4 + assert report["leaf_accuracy"] == 2 / 4 + assert report["failure_rate"] == 1 / 4 + assert report["accuracy_depth_2"] == 3 / 4 + assert set(report) == { + "n", + "leaf_accuracy", + "failure_rate", + "accuracy_depth_2", + "accuracy_depth_3", + "accuracy_depth_4", + } From 38853be21a41f561d54229763a079f614cc76b1c Mon Sep 17 00:00:00 2001 From: th-e-o <116006109+th-e-o@users.noreply.github.com> Date: Mon, 6 Jul 2026 14:45:22 +0200 Subject: [PATCH 05/18] Revise project cadrage document and update objectives Updated project description and objectives in cadrage document. Corrected broken module references and initiated documentation for the framework. --- docs/cadrage_2026-07.md | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/docs/cadrage_2026-07.md b/docs/cadrage_2026-07.md index f00a6b4..e1a56b4 100644 --- a/docs/cadrage_2026-07.md +++ b/docs/cadrage_2026-07.md @@ -1,22 +1,15 @@ # Document de cadrage — Projet GRAAL -**Destinataires :** hiérarchie SSP Lab / DMCSI -**Auteurs :** Théo Ferry, Meilame Tayebjee — Insee, SSP Lab -**Date :** 6 juillet 2026 -**Portée du document :** rappel du projet, état d'avancement au 6 juillet, et roadmap détaillée jusqu'à fin juillet 2026. - -> Note de calage : ce document couvre le mois de **juillet** 2026 (livraison hebdomadaire chaque lundi). La roadmap détaillée ci-dessous porte donc sur les quatre semaines du **6 au 31 juillet**. - --- -## 1. Rappel du projet +## 1. Description du projet -**GRAAL** (*Graph-based Reasoning Agents for Automatic Labelling*) est un framework de recherche appliquée qui combine : +**GRAAL** (*Graph-based Reasoning Agents for Automatic Labelling*) est un framework qui combine : - une **base de données graphe** (Neo4j) représentant une nomenclature statistique hiérarchique (codes, libellés, notices explicatives, relations parent/enfant) ; - des **agents LLM à outils** (*tool-calling*), qui interrogent et parcourent ce graphe pour raisonner sur la classification d'un texte libre vers un code de nomenclature. -Le projet est actuellement instancié sur la **NAF** (Nomenclature d'Activités Française, ~700 codes terminaux, 5 niveaux hiérarchiques) et le pipeline de construction du graphe est déjà paramétré pour d'autres nomenclatures (NACE en anglais, COICOP FR/EN), ce qui matérialise l'objectif de généricité du framework. +Le projet est actuellement instancié sur la **NAF** (Nomenclature d'Activités Française, ~700 codes terminaux, 5 niveaux hiérarchiques) toutefois le pipeline a vocataion à être générique et la construction du graphe est déjà paramétrée pour d'autres nomenclatures (NACE en anglais, COICOP FR/EN). ### 1.1 Objectifs @@ -27,7 +20,7 @@ Le projet est actuellement instancié sur la **NAF** (Nomenclature d'Activités ### 1.2 Enjeux - **Enjeu métier** : disposer d'une solution de codification qui fonctionne (a) quand on n'a pas ou peu de données labellisées, (b) quand une nomenclature est révisée par le métier et qu'il faut recoder l'historique, (c) quand les données labellisées existantes sont de qualité incertaine et doivent être fiabilisées/corrigées. -- **Enjeu MLOps** : la chaîne de production actuelle (stockage S3/Datalab, entraînement distribué Argo Workflows, *serving* FastAPI conteneurisé) est mature sur les volets Data, Modèle et Déploiement, mais **le monitoring en production reste le point faible** : sans annotation humaine continue, il n'existe pas aujourd'hui de moyen de contrôler la dérive du modèle déployé. GRAAL est une piste concrète pour combler ce manque. +- **Enjeu MLOps** : la chaîne de production actuelle (stockage S3/Datalab, entraînement distribué Argo Workflows, *serving* FastAPI conteneurisé) est mature sur les volets Data, Modèle et Déploiement, mais **le monitoring en production reste le point faible** : sans annotation humaine continue, il n'existe pas aujourd'hui de moyen de contrôler la dérive du modèle déployé. GRAAL est une piste pour combler ce manque. - **Enjeu méthodologique** : un premier prototype zero-shot par RAG a été testé et a révélé plusieurs limites structurelles (dépendance au découpage des notices, dépendance au modèle d'embedding, saturation du contexte, hétérogénéité de la comparaison notice/libellé, absence de traçabilité, non prise en compte de la hiérarchie). Ces limites motivent directement le choix de l'approche agentique. ### 1.3 Positionnement par rapport aux besoins de codification automatique @@ -56,8 +49,6 @@ Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre ### 2.2 Ce qui ne fonctionne pas encore -- **Un module du dépôt est actuellement cassé** : `src/agents/Text2Code/classifiers/agentic_rag.py` — la parenthèse de l'appel à `MatchVerificationInput(...)` se ferme avant l'affectation de `proposed_confidence`, ce qui rend le fichier non exécutable en l'état. C'est le tout premier correctif à apporter (cf. roadmap semaine 1) avant toute campagne d'évaluation. → **Corrigé le 6/07.** - *(Rectificatif : une première lecture avait aussi signalé `src/agents/NaiveCode2Text/prompts/prompt_builder.py` comme cassé — vérification faite avec l'interpréteur cible du projet, ce fichier est en réalité valide. Il utilise des f-strings à guillemets imbriqués, syntaxe introduite par la PEP 701 et disponible à partir de Python 3.12 ; le projet cible Python 3.13 (`pyproject.toml`), donc pas de problème réel, à condition d'exécuter le projet avec l'interpréteur attendu.)* - **Le classifieur « Agentic RAG »** (approche alternative combinant recherche par embeddings + *CodeChooser*) n'est pas branché dans le pipeline principal : `main.py` appelle aujourd'hui une fonction *stub* (`classify_agentic_rag`) qui renvoie une valeur codée en dur. → **Corrigé le 6/07** : le classifieur est branché dans la CLI (`--agentic-rag`) ; validation fonctionnelle sur la base Neo4j à faire. - **Le chaînage *Navigator* → *MatchVerifier*** n'est pas encore implémenté : le *Navigator* s'arrête aujourd'hui dès qu'il atteint un code terminal, sans double vérification automatique par un second agent. C'est pourtant l'articulation nécessaire au cas d'usage « monitoring en production ». → **Implémenté le 6/07** via l'option `--verify` de la CLI (en mode unitaire comme en batch) ; validation fonctionnelle sur données réelles à faire. - **Aucune méthodologie d'évaluation n'est encore formalisée** : ni jeu de données de référence versionné, ni métriques automatisées, ni tableau de bord de suivi. À ce stade, l'évaluation n'existe qu'à l'état de script exploratoire ponctuel (projection UMAP/PaCMAP/t-SNE/PCA des embeddings, calcul de k-plus-proches-voisins). C'est le chantier prioritaire du mois (cf. §3). → **Premier socle posé le 6/07** : module `src/evaluation/` (métriques d'exactitude à la feuille et par niveau hiérarchique testées unitairement, échantillonnage stratifié reproductible, harnais de campagne) ; la constitution effective du jeu d'évaluation et les campagnes chiffrées restent à mener (S2–S3). @@ -65,16 +56,6 @@ Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre - **Aucune intégration continue (CI) ne teste le code applicatif** : les deux workflows GitHub existants ne font que déployer les slides de présentation et les embeddings, sans exécuter de tests. → **Corrigé le 6/07** : workflow CI ajouté (lint `ruff`, vérification de syntaxe, tests unitaires). - **Pas encore de documentation technique détaillée du framework**, au-delà du README et de la présentation de démonstration — c'est l'objet du chantier lancé cette semaine (cf. §4). -### 2.3 Nettoyage engagé cette semaine - -Premières actions de nettoyage du dépôt réalisées (branche `chore/clean-main`, à merger) : -- suppression de `newplot.png` (export Plotly oublié à la racine, 251 Ko) ; -- suppression de `presentation/_preview/` (7,7 Mo, ~90 fichiers) : un dossier de build Quarto committé par erreur, qui faisait doublon avec la branche `gh-pages` déjà utilisée pour publier le site ; -- correction des imports et variable morts détectés par `ruff` dans `src/navigator/navigator.py` ; -- exclusion d'`explorations.py` du lint `ruff` (script à cellules `# %%` pensé pour un usage interactif, pas comme script autonome). - -Côté branches Git : 7 branches `renovate/*` obsolètes (bot de dépendances, non maintenu depuis longtemps) et une branche `explorations` personnelle périmée ont été identifiées et validées pour suppression ; leur suppression effective reste à faire manuellement (limitation de droits d'accès sur l'environnement d'exécution utilisé pour cette revue). - ### 2.4 Synthèse L'architecture cible (graphe + agents génériques + closers de validation) est posée et sa faisabilité technique est démontrée sur le cas *Navigator*. Le mois de juillet doit servir à **consolider la base de code** (corriger le bug bloquant, brancher les composants manquants), puis, surtout, à **construire une évaluation chiffrée et reproductible**, condition nécessaire pour statuer sur la valeur ajoutée réelle de chacun des trois cas d'usage identifiés. @@ -91,8 +72,6 @@ Deux volets à évaluer séparément, comme identifié dès la présentation ini - **Si le jeu de test est jugé fiable** : évaluation automatique classique — exactitude (*accuracy*) au code terminal, et par niveau de hiérarchie (section, division, groupe, classe) pour distinguer une erreur « proche » (bon niveau supérieur, mauvaise feuille) d'une erreur « lointaine ». - **Si le jeu de test n'est pas jugé fiable** (label bruité, notices ambiguës) : évaluation manuelle sur échantillon, en mettant bout à bout la prédiction *ground truth*, la prédiction du classifieur, et les jugements du *CodeChooser* et du *MatchVerifier* — évaluation conjointe de toute la chaîne plutôt que du seul classifieur. - Métriques complémentaires : taux de requêtes n'atteignant **pas** un code terminal (`is_final = 0`), nombre moyen d'étapes de navigation, taux d'accord entre *Navigator* et *MatchVerifier*, comparaison au modèle supervisé de référence sur le même échantillon. -2. **Évaluation de la génération de données synthétiques (*Code2Text* / *NaiveCode2Text*)** - - Moins directe : approche retenue = ré-entraîner le modèle supervisé de production en enrichissant le jeu d'entraînement avec les libellés synthétiques (notamment sur les classes sous-représentées), et comparer les performances obtenues à une performance de référence sur un même jeu de test. ### 3.2 Jeu d'évaluation @@ -134,8 +113,7 @@ Deux volets à évaluer séparément, comme identifié dès la présentation ini --- -## 4. Focus semaine du 6 juillet — documentation du framework +## 4. Documentation du framework -En parallèle des correctifs de la semaine 1, le chantier **« documentation détaillée du framework »** est initié cette semaine. Un premier document technique a été créé : [`docs/framework.md`](./framework.md). +Un premier document technique a été créé : [`docs/framework.md`](./framework.md). -Objectif : poser une base structurée (architecture, modèle de données Neo4j, contrats des agents, configuration) qui pourra être enrichie au fil des semaines de juillet et **valorisée in fine comme document de travail DMCSI** décrivant un framework générique de codification automatique par agents sur graphe de connaissance. From 001ebf6756c5885946535226ea77204afbdd8176 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 6 Jul 2026 12:52:51 +0000 Subject: [PATCH 06/18] docs: deepen evaluation-rigor, architecture-comparison and drift-detection axes in the roadmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expand §3.3-B with statistical rigor (confidence intervals, significance testing, per-segment error analysis) and a Navigator/Agentic-RAG/supervised design-tradeoff writeup; expand §3.3-C's drift detection into a concrete plan comparing Wasserstein distance, PSI and KS-test with threshold calibration and a simulated-drift validation step. Reflected in the S3/S4 weekly objectives. --- docs/cadrage_2026-07.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/cadrage_2026-07.md b/docs/cadrage_2026-07.md index e1a56b4..1c5dd09 100644 --- a/docs/cadrage_2026-07.md +++ b/docs/cadrage_2026-07.md @@ -91,10 +91,16 @@ Deux volets à évaluer séparément, comme identifié dès la présentation ini - **Analyse des embeddings** : formaliser les explorations déjà amorcées (projections UMAP/PaCMAP/t-SNE/PCA, k-plus-proches-voisins dans `explorations.py`) en un diagnostic reproductible de la qualité de l'espace d'embedding utilisé par l'*Agentic RAG* — séparabilité des codes, zones de confusion, sensibilité au modèle d'embedding choisi. - Comparaison **plusieurs modèles LLM** sous-jacents (le framework est agnostique au modèle via une API compatible OpenAI — variable d'environnement `GENERATION_MODEL`), pour arbitrer coût/latence/qualité. - Étude du **nombre d'étapes de navigation et du taux d'échec** (requêtes n'atteignant pas de code terminal) en fonction de la formulation du prompt et des instructions du *Navigator*. +- **Rigueur statistique de la comparaison** : ne pas se limiter à un delta d'exactitude entre méthodes (*Navigator*, *Agentic RAG*, modèle supervisé) — calculer un intervalle de confiance (bootstrap sur le jeu d'évaluation) et un test de significativité avant de conclure qu'une méthode surpasse une autre, en particulier sur les strates à faible effectif (§3.2). +- **Analyse d'erreurs par segment** : ventiler l'exactitude et le taux d'échec par section/niveau de nomenclature plutôt que de s'arrêter à un score agrégé, pour identifier *où* et *pourquoi* chaque méthode échoue (ambiguïté de notice, code trop spécifique, hiérarchie profonde, etc.). +- **Note de conception (architecture) *Navigator* vs *Agentic RAG* vs modèle supervisé** : livrable écrit documentant les compromis mesurés (exactitude par niveau, latence, coût par requête, nombre d'appels LLM) et la recommandation d'usage qui en découle par cas d'usage — formalise la décision de conception plutôt que de la laisser implicite. **C. Monitoring en production** - Premiers tests du cas d'usage **monitoring** : simulation d'un flux de prédictions du modèle de production, détection par *MatchVerifier* des cas à recoder. -- **Détection de dérive par distance de Wasserstein** entre distributions de prédictions/embeddings du modèle en production dans le temps, comme méthode de détection non supervisée en amont ou en complément de *MatchVerifier* — répond directement à l'enjeu « comment contrôler le modèle en production sans annotation humaine continue ? » (§1.2). +- **Détection de dérive de distribution**, non supervisée, en amont ou en complément de *MatchVerifier* — répond directement à l'enjeu « comment contrôler le modèle en production sans annotation humaine continue ? » (§1.2). Plan de travail : + 1. implémenter et comparer plusieurs métriques de dérive sur les distributions de prédictions/embeddings dans le temps : **distance de Wasserstein**, **Population Stability Index (PSI)** et **test de Kolmogorov-Smirnov** — trois métriques usuelles en surveillance de modèles de risque (proches de ce qui est attendu dans un cadre de gouvernance de modèle type SR 11-7) ; + 2. calibrer des seuils d'alerte sur des fenêtres temporelles glissantes, à partir de l'historique de prédictions du modèle de production ; + 3. valider sur un cas de dérive simulée (ex. injection artificielle d'un décalage de distribution) avant tout test sur données réelles. **D. Génération de données et industrialisation du modèle agentique** - Premiers tests du cas d'usage **génération synthétique pour ré-entraînement**, avec une métrique proxy (gain de performance du modèle supervisé sur les classes enrichies). @@ -106,8 +112,8 @@ Deux volets à évaluer séparément, comme identifié dès la présentation ini |---|---|---| | **S1** | 6 → 11 juillet | Corriger le bug bloquant (`agentic_rag.py`) et **nettoyer le dépôt** (code mort, artefacts de build committés par erreur, structuration des scripts exploratoires, CI minimale de lint/import) pour fiabiliser la base de code. Poser les bases de la **documentation détaillée du framework** (architecture, modèle de données, contrats des agents — voir §4), première brique valorisable en document de travail DMCSI. | | **S2** | 14 → 18 juillet | Formaliser la méthode d'évaluation (§3.1) et constituer le **jeu d'évaluation stratifié** (§3.2), versionné dans le dépôt, en s'appuyant sur un premier **diagnostic de l'espace d'embedding** (formalisation des analyses UMAP/kNN déjà amorcées). Brancher le classifieur *Agentic RAG* dans le pipeline principal (retirer le stub). | -| **S3** | 21 → 25 juillet | Implémenter le chaînage *Navigator* → *MatchVerifier*. Lancer les **premières campagnes d'évaluation chiffrées** du *Navigator* (et de l'*Agentic RAG*) sur le jeu d'évaluation, avec comparaison au modèle supervisé de référence. Amorcer un **prototype d'automatisation de la pipeline d'évaluation via Argo Workflows**. | -| **S4** | 28 → 31 juillet | Évaluer la génération synthétique (*Code2Text* / *NaiveCode2Text*) via la métrique proxy de ré-entraînement. Test exploratoire de **détection de dérive par distance de Wasserstein** sur le cas d'usage monitoring. Synthèse des résultats du mois et note de recommandation sur les cas d'usage à prioriser pour la suite (monitoring, recodage, génération de données). | +| **S3** | 21 → 25 juillet | Implémenter le chaînage *Navigator* → *MatchVerifier*. Lancer les **premières campagnes d'évaluation chiffrées** du *Navigator* (et de l'*Agentic RAG*) sur le jeu d'évaluation, avec comparaison au modèle supervisé de référence **assortie d'intervalles de confiance et d'une analyse d'erreurs par segment** (§3.3-B). Amorcer un **prototype d'automatisation de la pipeline d'évaluation via Argo Workflows**. Rédiger la **note de conception *Navigator* vs *Agentic RAG* vs supervisé** (compromis exactitude/latence/coût). | +| **S4** | 28 → 31 juillet | Évaluer la génération synthétique (*Code2Text* / *NaiveCode2Text*) via la métrique proxy de ré-entraînement. **Prototype de détection de dérive** (Wasserstein, PSI, Kolmogorov-Smirnov) validé sur un cas de dérive simulée (§3.3-C). Synthèse des résultats du mois et note de recommandation sur les cas d'usage à prioriser pour la suite (monitoring, recodage, génération de données). | > Pistes identifiées mais volontairement hors périmètre resserré de juillet, à ré-examiner ensuite : industrialisation complète (au-delà du prototype) de la pipeline Argo Workflows ; exploration **LoRA/QLoRA** pour un modèle agentique plus léger (cf. §3.3-D). From 15637e504ecdfc9039c22e69362ce494bce505cd Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 6 Jul 2026 12:54:08 +0000 Subject: [PATCH 07/18] docs: fix section numbering after upstream trim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit §2.3 (Nettoyage) was removed upstream, leaving a stray §2.4; renumber to §2.3. §3.1 lost its second numbered item, so switch the remaining one from a numbered list to a flat one and adjust the intro sentence. --- docs/cadrage_2026-07.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/cadrage_2026-07.md b/docs/cadrage_2026-07.md index 1c5dd09..4556f45 100644 --- a/docs/cadrage_2026-07.md +++ b/docs/cadrage_2026-07.md @@ -56,7 +56,7 @@ Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre - **Aucune intégration continue (CI) ne teste le code applicatif** : les deux workflows GitHub existants ne font que déployer les slides de présentation et les embeddings, sans exécuter de tests. → **Corrigé le 6/07** : workflow CI ajouté (lint `ruff`, vérification de syntaxe, tests unitaires). - **Pas encore de documentation technique détaillée du framework**, au-delà du README et de la présentation de démonstration — c'est l'objet du chantier lancé cette semaine (cf. §4). -### 2.4 Synthèse +### 2.3 Synthèse L'architecture cible (graphe + agents génériques + closers de validation) est posée et sa faisabilité technique est démontrée sur le cas *Navigator*. Le mois de juillet doit servir à **consolider la base de code** (corriger le bug bloquant, brancher les composants manquants), puis, surtout, à **construire une évaluation chiffrée et reproductible**, condition nécessaire pour statuer sur la valeur ajoutée réelle de chacun des trois cas d'usage identifiés. @@ -66,12 +66,11 @@ L'architecture cible (graphe + agents génériques + closers de validation) est ### 3.1 Méthode d'évaluation envisagée -Deux volets à évaluer séparément, comme identifié dès la présentation initiale du projet : +Méthode retenue pour l'évaluation du classifieur (*Navigator*, et *Agentic RAG* une fois réparé), comme identifié dès la présentation initiale du projet : -1. **Évaluation du classifieur (*Navigator*, et *Agentic RAG* une fois réparé)** - - **Si le jeu de test est jugé fiable** : évaluation automatique classique — exactitude (*accuracy*) au code terminal, et par niveau de hiérarchie (section, division, groupe, classe) pour distinguer une erreur « proche » (bon niveau supérieur, mauvaise feuille) d'une erreur « lointaine ». - - **Si le jeu de test n'est pas jugé fiable** (label bruité, notices ambiguës) : évaluation manuelle sur échantillon, en mettant bout à bout la prédiction *ground truth*, la prédiction du classifieur, et les jugements du *CodeChooser* et du *MatchVerifier* — évaluation conjointe de toute la chaîne plutôt que du seul classifieur. - - Métriques complémentaires : taux de requêtes n'atteignant **pas** un code terminal (`is_final = 0`), nombre moyen d'étapes de navigation, taux d'accord entre *Navigator* et *MatchVerifier*, comparaison au modèle supervisé de référence sur le même échantillon. +- **Si le jeu de test est jugé fiable** : évaluation automatique classique — exactitude (*accuracy*) au code terminal, et par niveau de hiérarchie (section, division, groupe, classe) pour distinguer une erreur « proche » (bon niveau supérieur, mauvaise feuille) d'une erreur « lointaine ». +- **Si le jeu de test n'est pas jugé fiable** (label bruité, notices ambiguës) : évaluation manuelle sur échantillon, en mettant bout à bout la prédiction *ground truth*, la prédiction du classifieur, et les jugements du *CodeChooser* et du *MatchVerifier* — évaluation conjointe de toute la chaîne plutôt que du seul classifieur. +- Métriques complémentaires : taux de requêtes n'atteignant **pas** un code terminal (`is_final = 0`), nombre moyen d'étapes de navigation, taux d'accord entre *Navigator* et *MatchVerifier*, comparaison au modèle supervisé de référence sur le même échantillon. ### 3.2 Jeu d'évaluation From 358c11d403030afd61f3c923d890d3009d97fb32 Mon Sep 17 00:00:00 2001 From: theof Date: Mon, 6 Jul 2026 15:37:55 +0000 Subject: [PATCH 08/18] ruff liner --- data/eval/eval_set.parquet | Bin 0 -> 153107 bytes evaluation/dataset_eval.parquet | Bin 0 -> 153107 bytes newplot.png | Bin 251356 -> 0 bytes pyproject.toml | 1 + setup.sh | 1 + src/evaluation/build_eval_set.py | 21 ++++--- src/evaluation/config.py | 2 + src/evaluation/run_eval.py | 9 ++- tests/test_connections.py | 101 +++++++++++++++++++++++++++++++ uv.lock | 37 +++++++++++ 10 files changed, 160 insertions(+), 12 deletions(-) create mode 100644 data/eval/eval_set.parquet create mode 100644 evaluation/dataset_eval.parquet delete mode 100644 newplot.png mode change 100644 => 100755 setup.sh create mode 100644 src/evaluation/config.py create mode 100644 tests/test_connections.py diff --git a/data/eval/eval_set.parquet b/data/eval/eval_set.parquet new file mode 100644 index 0000000000000000000000000000000000000000..2121661a1975ba42df964423a6feea6ad7515e81 GIT binary patch literal 153107 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%0D0eo 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 Uhnft+&li87N+GaBLF}~t1rtxKSpWb4 literal 0 HcmV?d00001 diff --git a/evaluation/dataset_eval.parquet b/evaluation/dataset_eval.parquet new file mode 100644 index 0000000000000000000000000000000000000000..2121661a1975ba42df964423a6feea6ad7515e81 GIT binary patch literal 153107 zcma%hWn7d&_bA=9unR2REZyC)bm!76uyic70wU7g4Fb}Q|J-5(1*4 zUf%cK|NU~m+~>pdoS8W@XU=)fZ%&Pgnwb~~5A?zk^oGFz^oAIOg@pw{i~Mo62DV9J zl|ogCs4GFWn0G(>B+`4hxcGh!F=#QyU_HT#!jf?Hk}{J2{j3qOd7@_bOz%Y9ByW}P z>$4IgK(jC;#{HCJV0qry^KB@{!clZ9Gvfhwr`Vxx^9MfS3h4tqVqD(?@b}gYNW`Y6 zppy{3|74B{hoo(3B_EW$CyDFk;Aan<0Nh&KZ{)p&(|x94zEvE!TLtCdfs^Rs}L7lA7%J1 zpBCrm11Ql8B7A7=5%|iWWjk#8(RE;!)$*;3bFO^m+62y%81)cqViWgYeJ`_v&4cUGy{j!8 zKYJvb{*(b65}7B6I{r=eg$sTE(+cYe zp4Pd@vD+on#wab+l+lswPsJXeR=*5G(rM9VKG_s^_A+MwW=@t$u->cNtkY=eN1k{> zn9$U}YFhSd2Ptt|hS=yvv%rMB4Fwkx>SS!2ipE=PYSpW3!PkUl1$B0xt|+{$KJrmv zcn^QR+2g{eP2TLzQG{;Gms_8x{G#DAy_L#}umqf*!rMPAVSSSTv8G^YotFMl$E%$f!0oLCB+W0JY#s!@ z(AI_OXqHS8;tR>j5}O0FP=TN16{-ETx*L`C7E^QzDF_(Ehp~p3EWe2aR6U6_dXYtk zOqIu9A^1al8~Z#iWs#j)DmJ2e#sn@7CK!b%l)-ZGe);^wx=CfReQfIb759wcxUPiQ z+i7mD>pFE1QHh`0HU2kW;%qx3=lUVqeGz%$z{vXE@FgFV~+H{kqZ zFYSh0+Udaa{c9Y=2JN)E>py5kcppb4xylweqtQ=@Z;?o%DN0H0v+@rETIHxRSA6*Oto_*%B<6w++xQYskG|(> z59DYjDXEZ~&g1(^#RaJ022m+Rd}hA7+%#Z_`_*%yGWFVCu=qi0GeV3cl5{V2 znd%>1wjZObckh0>Sf07yYg#iV>!4M7Ir_54Ub>VO;pj*GeEj5?F%z-&truipT{V#G z{vSq7rXclbJEh8m=6B_9r&|RyGI$xA=79{X}%V@8fhjr{#_PRvWTr%Qq!JGFy2(}647k#WAs8{!m9HRCmk0f+E$K?lp!KSC$ zdytsOUfI_#bsleFWXg*qmw6KeB@CpkDyZ{s=~I+Gy@-#qfhk|vmmM1xJnO}J#>f`! zPWuLk#qSq5GokWsF%mKODwj$%`nFHFi4i+~wq(hM#tD4wm-H{}$KvW^%W_CK*6ZsLR@QLRscfvn9{^7F@L!4hjwYD5)2gB%z=iiWvONzRmR)Z?e zI?o1Z<&BB?P#YO?_bt^r;>^Q@veU^`PX$0&pdJKh8X*Y!WdfoC5r7Doq_H6Qa&n@g zHuU(SVq#)8|6{~#>6d1)a35N~Ot49ENU-qOhOzK~&coP5T$RH(WRknXxKx^KBX~fr z3sr0o42ewu_C$^l;2{^W30WesMhV&CsbYyZvrS@&c`LJHNd!6;V@ZVuur$cT=TtSw zrQb(uP{^MSYfuv2UBpqU;<1lYX#(N#0ByDyO=>1c)i||==!hnbkzx)WP%|=H6KH0j zh6l2AGr@FHgPalGer+3XZO(eA~u9^UQ z)>ch2cyuf!GWxOsCK-|0&YDaD(|{=^&v-FhX2D9+BxbMoG1@HN$(7m+k1whc$)B{2 z#Irta#U{dv!Qx29ilZ_kVo79*)doq;#prMZL8{`IQUyne$TEiahyd!yOCqiu9dTmr z0$30+kFHy6G>@WzS_17eFT%)COSbQ*rwSW zPzH}-Qxcx~akg2$M!cL(#Eepn)&@di3bK#WazjXzX;{5u%z&fw2K~GR~lU zvvjek_d%rMGd-1L)F8pJbnyHlN3=wb+i(hR|6<^<#G-1KKI@Vo2RQ+yfyO-B+Ae%v z3gcEoE-~jjX2`Kazc~BhTw}#DE;dT(*K-FrN;jUa@09MGX_9#k4{IppzEpNo z(wJYwrQrTCsE$?<(4i(_wJ*M+R6UpzHB$BH=va_180O4S#k~QWsRpMi6x@%@_B$P|d&hE76*N4K($b=pg1;WF00J zInY1ARb%#Kr4nWz2WW3Hb>UKqWT@j|iB53QkO1LJ zYS{h7`)`R>YE737=$G6K4as}pD~3`9@#eDhN3|4&4kbf`+AVQR{~rt}dGk?OeZAF+N6bSfn|RZD?EPgQ9Jp z{G6C^ipKBFb&dmHW2xQ2L<#szn5ik?&wz#b@JCDpgf1x=pfs1XjGH`$57+QX~4x5#bZfPe~7@T4;xQEy*J0}hW_!*bVE%G=cQ zhA(S@{+iTn8b)!W!5)k|i)tQE!%*hB&R=dy@ayQYxAamI>Wa8ghJaGfLV%R5Y*OP| z0o_Kn6@vjo3Bej-L~wk`t5J>1+PnGYdj|Gq>!hvE3wS*_sC~1F()Y_a0mxqb3|`{P zQHC7z?eR(k(4m*qaGeeE;oE-IyPvczGLGDf99|9pa{OBtgJ{`y4|C`#`Y#ExiK0_@ zj02(r_qR2He-cyebFqrdy<+5ol05t9p}7Qt#EXmMQTUG%k?8~9 zJc~8oF{OhZEptuo1TzKA?A5*x!Xi6ZmLwA`(iEGQv$g=d1K~Kxn0wKdvu!ETntQkB zpkk$#4e4n8Hu)YYy``asES7xIXvrOvR~XcAz$hq6-S($-CAh( z{N%~fi6dW4wt5sl`hoAv?-8x!H_&$$*!STYx=7RUsj|qqaP>@=P@;nh?-sV+B8ibN z2N=1T`MyM~E$+HapX;S-0Kj7L(TeMcsWr&s=B$GlFAwko!?evzWv|Es#7=jHX~qr9 z_j-yF;Lp|GZXut^nWsJZ0kF2?D7U}P3r`P?|LDbNz&nb(X3uj1dY=U)h7_eVu#yjv z@fbP%o}kiXSVi>i2#m`H6*8@uekR4ezevI%DuH)UigToY(&MeUE>d&*o8mq%g`5DG zhR;j=*nGMuYi%bk+k@vEjibyqM%+#QvWyd!OgHIyUX{cU<_lzJj!8=)d>2l7M-~kWlol=rJ>`ItVydL8Gzj+9sz`N0EGuH_ClaZYf2)mx@v>C8i=UoY z$eL4)kB=@m9C6*Mg`dF@@TZGMA@HY8a2@li^N}j>#CrF9k)jEpMlX8 z_Me$M3h|@oJEmi?E)pF1aOUD*ay}vEi-^;kD@rBi{5oJ5`<^K^{%3CFNA(%W2~q-N zy2b~055R~O_z(`&i(#Bakv%C#>~6(KBa;o2+8w$-MxR5IbCZkI*ntd2pNeUq2gct zZpbWex@&33<<7S9WC~v=jpa^xV0EUd`1pqqZjpwm|GV zjkJmGrzF9HXP?lT6;OBqz9M&pG=)$`26Ypm1rh8l$>uVx2KD(6+}uSQRFo79Cl%ly zt7jtYS-h`LAAN1C!zitj6E7O50T!a3F)K^_g2AgyeH0m{Y6@?KE$b9h?QZy6&Z#o9 zqB=1y0a@FN4UGWB?3b)L0*Ykfi^cz|8AV8St9;{JWWi3cNvd6(tC~G>3EWQpDuA zaHN_~@ifg4=~Cr1RlQ5E#W=IG%w2L~99w-S84`D}?{K2uCS$!f0#$e6#A&~()b@F_ ztIFwye2K3wBIy3999tsHwa^3IY0c?4wpqMuFC71pM7uy2V;(DE5~C`>SP{Z$A$$AD zEQt7q=3@Z$B-GCK-EIZPqG*uq%3*=l$PZ@xc9TnL zIl=B|5RQ(mBK%^bvFysPWoe<8s-*r7ELiz{)mLX?1)A1UAVxwaFCJ(|PG2phLD6zr zycsIvIaNbGUx2`*4Ti|tWW9)Nv;+VQ6I{cUg)tv9#Lr}@110NVB#bIi^s}izG2A^K z%1vh)!L;$Q9pp_XZWiq6F@YgRqwd}_S(Q(&jOLU0aA15)6O4vbmSw6;{1$1wk-DCK z15OdiRozbmQs7eqzn|UcT8mD&>W0`$#n;H@ndYugk7G40Lih=6#spN28ZABl2oc~q z@pyeAVd!|@xE^^1lF4vPFGsM1+X{`DYwBauaVhmhd$92++={1%ySFX)e8SPKPf@l-^@T&4Owr&rH7FWDQlGd#UEIJ~a!vp-nrikh>@wfU|@ zgS1|ua-%+@33L@~9mJdxtA?dBv(plCH@q|!iY-Dlg};-9L{OO<RXiH=y z8UprM=CgDb(t#$#O=sqRZJ&ei;wfi$g=NEY) zN@UFt%8jQ3#sQD9H)Qm<$hS(~98ij{-Yi9d3vbq3@S&Wm;pDMBT#vp0@@aK$GVm84 zBX2+ew|I*oob_8%cLOc0poXSI@;qdWTB?>f57NRIS2>B4_}~3BeQ+B7 z_f7MlFgFh0Ph8y}lEo77NwLKpIku$k?izqjs;zjjz7BJDl>xmII@*y@jnH^fKGWTg zC<;NhbVnlHv0Z=8>na=ATS*9hKy*R%9_7EE$;B$9aI73gb;(r*S;J4sbUD38uxEJ^ zwaAYN%F3qHb^>LeOa<`_V@LU(-*C~HY%PtAiLz^L=maV_X4^n;zx~iwUG!yNpw2Ip!5n0aHOO!>-NdX8PU`Dl!154nF zT@(>~-)CxG#a+OXlj7h4r^I%yGNxr3cHhorw+Fa69H+mWiB$=ru~MPb95ao|*p+-M z#<3zi|fbtw;I_;kG__}p{VITS$r!wopD z`jdn?>cXTT@_Cz^hMvNL%a$OPNiI%4NBS+nPQ%qM4w z%uuYsLj8PUgPw{|W~GgI0dh4w3TnV|ZGqvDf!VCDNQSh5k$z;AF8D`ek2?LDX;7+9 zs&RfpHGgoeRzoVa(5Fy^AV1bget z7fcjz{`LSTa6;08MRWi;K}L=xyBeP9hezc`EFEh`o|?c@#>Z8!xh!w>g~;$RJ%Y^3bEa6z$zl&4Y-r`1R944v<{=QlH~j~z7(uKFiE{>0hdm6dC z#Y+>NXJ~pMhqtT5m5(zOTpB69=oI^Nw2-Hocp9kpF)7)wv++LfV053 zdY50VFk-5k9s6hZE}frjFCqK!w~$WuR02Nyy2Kh?!Z=lSrKv(N&?w3LiFnRPapX

zp)*{gT)U~(y+~fD{u8wneeNo|_ZNG~>5Qv2LN<}f9gj3+i?h`@LP>lpTgL*jrgTqH zOW7>gljuFXOuJU-5(QYzHJ9cyS!dFt*?~ryh#6Vhs?_=s?oA+z7{u7k7`T?|BK^vJ z)`CS$W?jwF*5>6hC?-=a{00`N;69kXQXt?qqq zV@VoUx_@(1ghG!(wMw;N(yCgSh3~7Au^4;z7Lp!g%S^I9_N}#kbTT12W0Qrw>V#L; zD6ttedc8-j!JKlHXkff{`%KsER0CigD$8DO zyx5M8OwuyiWn$E#FyyD&2S%;N!qrqPt@*4m^MIH|y$gsu`Qp-xO}*@bU@0#`g{B^`>py6_+%VIq!8s)- zFNW4Z7t8$yBtIL8O$b(%sFq%+6M9(OSxxyT6r)%)>(h6qB3r$>OH~aqqm%Z^1O=un zvQn?M&Cg%fF~^IEkFOc|vft7N*H!{!H3DThfrL16Ty`W%fQ@B;5uC9cuTOi^_m8rGbr$zeHuiC}_vVi>9HRc9%y^*xPG z_DHIt&k3t!fltx96e+|_pkZIg$a1mg{QX^qD0!24QaEXtE529a&%+wKuDS-}^agwQ zla>rMQui(ihYuZOQA%y0!2x8QRrIc!{P=m(Cq>?4< z&P*p~QI6)cuO$KhwrJ(CSATnDeOS7;bN2oE?TJAKvkIX<%~5}kwkCO4zDbvmjLzsXS9~7PFN@d{<5LY zrUY&bc8VZtj0b7#_tgSC--NS8BgvESODYd=rX;5nr_n@J=J2MtYv{S9OJUaICsM2N zS(}=4=1)8G!N~iN{7Q}|n4o9I|B&m>+XtRw4-B(3PeOT;Y#sv^yXyT(Pu(`%0K&)EW?) zZjuD~4)aJSQ;)gMlnwMs*ogb8_QQnZ&^MOW)kgLp&2)OHJAs`lV!|Q96rWl(={%BS z6RvS)#Q@hn65X;S;CdOuRFDwn^u#e|59)A!I&91hxuK>Lf`!ZAJz0flGN?$X)068! z*bpfkZrmo>nZqRqD>#f~xC^Q(q2h^&^(pylunz3?=TA%WH}+x`F1n_JABS6#0g7a4 z=xBmMc%D;tFJ6>bo%;q)DRmaOta=sb7G`PXlj#sy`&q~^Gc&C9z=bg3M-wKCJ329m zc&CqmfG>QjyY%Nmuh9PV?oWo%_ z$eNos?1ES@HKc$N!9b5(NRR_pRY+NIg;{&@HG42at~y7uiar3wZ64=EO0e_4L$Xsm zVbq<*@)>`nU8~L;Qdw*7e$k_C@g{w8%g5_(4?u6p)Kif3)k| zU$_?~-^{aW|I>16%V1P0UY7}7aHSt~CH68Q^%N0?No981|Cr1v6yGPW+-88U9w9}o>;h3`(6VJWl9@3AdE!$0oIkPpf$ADqSU3JuagxN7^9=`^&)pH24IoDJz1#s> z^u9>l&(`qKpVaR~Gouj>T9;xmxU?dP8nwX=zR86M;Y2H|1l(5}>eBT4cj{Eo_~~=nCyA2S9co@IYi>DJ%jiFg+0*i3kxF6_)~$ z(f%@_UFgTAy^6->AyWK*3o{SZn-9sdpf8P7|E=F({ZIWS4SOQjKOiI^G{`I14iZn;YCen9Uav%!cyv@PGIq z9U#^yzYA;+46yb%7b4+syF-Nu?cLW4v8yO=N=+%?1t4Z(lb2RD=_o{ z3J7KM3kZVyA|Bv}@gTUr$5>;~Lj#UNxIWN$!2SPTBACtnVg6VH{9z;i<<0ehI(Bn9&&Wz(oif!rk4=74G_9_(9Ae zZ0-R;ehi-b~+y5z}Rf^ycV%mFg&B>@_Ts>( zd<#S4ynVy>MpLh)CpY#}2d9M@eBv;C;Mo=nH0Ojd0aept_{?3nLzffdeg+n(H$8LW z;~cU+-H#ZOyRRYx`am9}e=6UzUg7+^D`?l=YW$=Qkmgg%_E|zJ(K$^*QDR|Bm^*Vs zxK_Kue`nSQ{Sn-r)vYAOX*YUKmp9;g??00~UZYr`{-*7N>XVD$!rABm6=a>#~{OJoZnr5;&yE`B&sv zC5UqpngVC;ymlTPC(;@=rs=fHAEo3(2rpYe874KE1<~u09K`p7U+YXQGNcXx_f% z#$PWDP8Fi{`s)0n_Sox#X35JZr(Nw|(#rLJo|g{^BL)P2E!%3uj6uSKw5gsBismcz zOYNir(srt|8<_7K8dTI ztH0yUneAA;6Ii!js&Z{DI4@x$=~j@Ho^?;>AJ-txHroD)wFmylE`FE$%dHyy%ldJ! zR!ZUWgJLtP^_yT8%&A9OKYho$P03gpnLOu6-)7fg6W6p}+90IZ#4^k8MhAA9J*Pd~ zne7GmO!qw#3BBx!o=1xbj%I;caEv33vaEWpyPUHsP26kJV5gBrzt+V1T)HRw$Eyo| zEZgQuL_OxPf^zCEjfnswB?rYHwJta8OYwk+$rB_mUcB3?Kidc&;L~=Rtt&`;r@&jgA&UuZA5<$dN?4BE zd*-i*_-0Pl4^JOgPz|UiduM3-?({R)Jp5T;vTAT4@TXQu?cVGFKzYX(YS}WQeCz$%PzTD||tq*nSj$Y%h^T)om=_fg~ zH^`m7iCDe3>pVN9h_i3z2&(7Rt5`66NpVGa$QY>5-=(6^$9Cz`-nWthoQNR6&_xPnx3G=45EBx%b(tMf0tFtuqgtheMF)2MmLSc zY{gK$ZJR~FTHow#>3qw@I)IONTS@e@h7J9yjE!o@2cO!16!7j)nWhXOwa&ftBK)Lx zUr~DYj0cp63KOgFWv_;(wZjo+r^<`Js02{f*2deiLipSR{ngHKj@yM}S_4F7?cq+=Xf?x;1}=+xqZwB|PO@vkg||(dg7PfODie zL6Mr@qdL8KD_cj_P>9teAsoV5q}QSwg)g4sXJsC?55*1SO;>OYTYH@}rP`xAf6CDt@ zcN==RWpJK#wj*(=^v|&YC4v>9VI2Bk)jZqwhKnZpK_Y1;w4HYi+7$gmWw0~tG!aC5 zXANlf#aGm1@`QuNCK-a|uYec|^}2zR_EB^la4A6vgQt>q1Q!LTRI_NiFC%pdJ-czW z4RnhP6I~1l#z3DO9JMD$pOLs$SPV9eD!xFb8eRhoK|@|~Id_K7NH~?|Ep%D$YmY6> z+;fH7q}ao9rGZhPNw-@5YMm9W@g>_dER{AE)Z2wGR{Nd5p56~{2GyXga6OXAuKFh) zyz=nDbGm;02m2#>x9~=NGyQhQ<#AKOD$Oj+(*KZ$vFlbP4a5 zX=YE;0W%AGwN%Nl^Y02}4(Cr-ZE3KFoM@M#^yhjX+s=NncjO5AHCDd;?wf-a>3-oy z?(|;NIG!tA0@LU>h0Fe+Evr=c4}~SvO^ZO8;T)q5|`}l`*Kgah@+yV%{SKB+m$aYecGOUha9`&Fin04u)xN1Mj zwyIW_Q(A@e4*6tlu72H`a{mVkH%3lsLQedgNsjk7uYIX#1@86#O(>*4oRFLlTg<(q zc6@kIGOJc~EqMYb=@5xZI?zEJ6h#~Lpqi`CYLnwQQ!T=_2E1oIB~5+&k|KO=`c~Ra zcrd>}n}fMvX@YGS_W!F#BXv!g3oTD0`*Z z#Pd^(Umd+dtJ$>w+O2G1=RBZ>x@ zgM=QpD)Y9jpHcd@;g6i(Kxy|*!3y_zTH8|j@cfV5zY!ys9=@nG5meeoAG{m4zOZG_ zk4o=z+a&tkJQ|$*o!rnX$H{J=QS!-lUEP0Tm~(s`@RNcDfd`*V+%;_C^Y?pu)>E;t z=E1f;I7H$ud6U0S`E7lK?uIewu>}XRoXy=NR*uA&5lF<#5lv!hKz}+5Qq(jSFH!4z z&GeVO_!Md`7-zNc8~`rrtu0N~vpWh-+F1r^x6iU>AjMI&jLu;DX|5jrMzpj|+>lsmO!L2^oEB%o8%5sy1!5421Vd7GE{cJ_In3f^ ztoSBA_|%#7{^8dod(?QnX|2zoa`8EBPNVbW7cQqvpiNjU@Ez>8i&r?hPi{@cNsi_B zn15$op;VYwOK+<8rV?_}d;2P){VT_BRa;iGnebLqpE24Mt*!yDh}atZeqtdeh;<^u45#H|bbQH@%3>pjB#qv*Tt z+^24n!Tc)ol~iW|iYMValve3KX8Anjn%jS(5smuU@^sfX<&W#h8ds1|#mlG3xC@o9 z`N*gYevSB^okXOyLMK=91Q}B;409%b5kB~yC@!)XM^`k9S6lc z3OmPB`HRDd{7aXOp7l}|s zoUW}&Wab{{g#TT(o;->rVs8?vvREC7L(#J*`gHLA7>UAx)YKH6{WIzQNz={by7^>D z^ya_NNVD{ViH=6JmDH^-`mrdH5lpasHcS+1xjI&bPK>#odxMb>5zh`K*=(oVOmgGo z&A05J()XJnc!2?NW@6KytsEbFs?Buk0FQH>3oyDd~FUzUBO3eQ|tG|z7Gw_>?iG1Mmm zYc3_X?cKB&y|vEQn}6qT4^O7LLcLX@?zq3Dg8DgVM&v}xJ)C-ic0H~QlGw9tBhb;j zEG@yp{GGtaN?)qJwjZ0XtUGatX-sn_s4an7%_3ceK=0_62*l?*ud|-P`KF?sYP$X# z0Am^3>wUtj-$T}Kg~ze#hTGP@fn28JB^IU zKqZqs6B0Qh8&Oejr#F@t$l-pCypf&YX%;;n&A;a8{sL|KVW(aZ@_{l*+-EI}-T2?o zpBSkQt)5HVwCRqB6ZFgYT1{d`%;-C7J%A-}u11G8>RCFzBrAGd>jGWw^OJME7hM>e zK|#uB+HO3&vQQcV{V`z;^`mqrf5RfA$TtFJJ*lJg)`h1K96+g-X>%?Id_7veq=~eJ zOs2IBOS_6+w)~pvdfe)mQvqyay3dGv9G{hgaMT+}5!TiiI)&^s8yU_sOm70sys?7)hb}%jwo3B+G1c*c2qv7CwM!`=PqoVU`IS9~BWdf%vp>N2?8=w@HCa znkm!C2m{{}lGQJLo%IjBS^V|jfEGNWdY-5Lm+^?8Hr>Gw54{dFfpbvIrCAh5(58i? z$o}VZEe+HIHeGzurRDc-3+(tv7S&gp+{$T1F5LATXrx|JrfER=UB3EMzroJv`r=(O z`mpH1@)6xDpG@?uD?Cs9yEc4%c1Ky+tGpK`^2 zeg)7JNPH3&;gYxwgG2HyTVG27yr5V^aWCF&6^)x2EU$mv2PYjo^NsiI=ObR@f%Cl3!QP@mDxdW-eHRdT0%TbJn$Eq1rweA8-} zekWRqh4YtwC=e>mb-cYY|GQRv*U184iAHF>!;VccC8P7Lr%2p2g17B2lL+Zwu!qK9 z@UcPy(AZv!Uc|dIt+fX2j!W>0xzp%g`yoCe5$0^O^PxLCUeGh8d5jncfo+IRB1GPQ4#?ne zWVJ=`ncnycPtBgTZlPxcS7|0D$~&_T*igg7=oaAhCsLy1J!oB~z z2l=<2a!1BA9&V14x80i5+!}$29F`yI(38<$H?)3y%wYutoLxLVTK&}it%<_rxlY#m z+vE&~Ct7!x1m&^^2&thE3{$VMSmrvqO3)>+XI;4BWkc^_`-Wfeox_{VMsWnBh;K{{ zUftx~R_7dqgDDs2vICraT_=}4IDgucKJpRX2eY3oSv|SET}iV_Z%gXRVxh!|v#*GJ z?B41>B$6Fw>LK*UdENIni_)40Bn?LEtnaf;MdIBi6kYc&;t#<^i_^Jq!M#;2CbWN@ zJnZ=6XM@>rlteK{8pOjR0q{BX*e_RW{Qk z<|6Om)1gT$%@$`7OFr!^M#<%0Tqe6@D}kG&lUh}*{G@bvcM8|i^qIjpi>5Y}@rR?| zl(m#mKm!X-PkFl*!cQs0T1yKOt|{xbRBH#;;iT8j)#E8l$S+^L+SITfLZ2eNuTL_q zObnnthIqLyRlbugXCdFUMu(RVj+j7U>NW*f{U@U|>(1=_E3S1afeiQO6~8VR340fq ztK#^LDb*9gnRAsN57G^VvTuKV%2{|+joca_`Sb)sSxcWk{x){~4I9BDin~EC^S!>~ zVK+g_i$azc#ERiXN|i80C*l^(z($GKpmBev*%u3Qf?axK%xfV6|{LgcgyOSseNEgOr zF!+}HptGvc8csaqr7>ujxc`pBlFt#5q8!%YCRs|pW}9{qA0Z@8`v*X7!a9=Jl}1`J zUOl0lgYn!M)YsUwl|saydsdX zW02E{D`F8?5n^uO+Y$Ofv@>Sp-1v^ufG6+Rba|Y<3HQ7EscgWBvV9Z3?=GW8DT8Hl<;;2pt+%sVJIeMp8$;3Qf z8Y#Y&IBR)4hVIJ`7mM)6aMx^UV(LV#-Y(1oVLacu#R{`K0;8!J9zMx zE%QU_8mUY>s`HYT0C6#8Fo3a;h`+R-_RkR=54cVzFvlKMKD?|sifE3GVQ z&wZ;I?LMYigHuGtqY)lC^YXAKWU+2VpgX>;md*P(iI7yEiolxi(ht9<($5+Lr6#bZ zCa8aWCvs-{>_E&a11x9ZNlWr5zwKsKyt1bufWzK| za31)qXA)Lio zFVFGKRsYd>*UBrVSpWwvbr=mdrtO6D%PhrH!o$}mgIk&`W&87!cYXuHa`$;wTPfeX zd?x=6Ey|Cvy+0yBNT?TbHLBiI>vXxENh0=Jvy{g{JYhfLp6-&!$Nt5);^puO$?3F% z7T>R=hKKsKOO*h|S6rOi-V1m4Z(EZZ1#9YnaAvySm`}68gjBHzM}to@of5 zBi{G0Y5Opm&anrVESwc!UdU?*LN_^cy>N{8%5kuD14V&Qt2MPGJf+1PHqz1zFY411 ziPF4R^~K))-c7Eq_577B*d~=h2PQ+TCv~O1`n|4tWHy04$tmJAKcc#>0T4au{Y^lsb3!u!3c#BSD}z#DKtQt|gA z6N7uU3k_Vlh?INT5l*f6Xp=c}=fOBfw`GDC`|DehDVk(|eRcw+ zEkrN%FGY)!xyw2S3kHn2 z1x#t+t!FQ!sQ)^&_;=9{RV(|L+ItIqz1A1E6Wh(5)c(7PZKFLy%H^N5BUue-+2qq@ z$RA{akE@E;pJJmx6kVN;ux()BSKr#+l_mpIWPef5dM%ZoIQ@MkB((9OfBGf59($JX z!>%K>F6+DH5u1)ZIfmV$CDyBux55)Vx%CFzhAS=AO?sEbTRrRI*?2tI#MC@@hKxl& zaz-x5x$kW4rA~2wOt2RwlEFStG{!o0j&3qWa#A855_I3W4$fqHAc<Qt zz_{?3L=F0qdtHny(;$XZD~7TG3%|0${?D&B7(k9;D%^h7AFqzHQ3@lJ?o}LZPbc)R zQw0{M@!~7<6r2uB#fD1b{EIj_W$CJ6<-D3`srAwb2TtCb+;)~KE&O%v*&=Gr**ZS2 zrF5HKdq_soMl>7%m~DN;b~V$jep4Sz_k`0%6`@Q3# zn6dPF-FJa2FqSCI>NJR7TYB;v_gPp6-RMz3nnG(FPQ23bnyH-m5Jgb0;AK}b3N_A; zU2~VsKidrx2YzrXjyTsSmAn_FPRNxMR5BY@nT26Yi_6bq*xuYg-S-q4ADFt&i%7;2KThs@gQL|l0`65=go{q(0qz+d>M#fvcCj`6ou~)X%F0}TH7oC`T6XtbbUNk)pewA0Lo@YkSMLl=~Q~YBaqoK?` zja0z$zjq9a$qS!f`ik0@2s(lq(#m0nv-w>R1yVcVZo6}n33KLN>(?%t2c91GeByD6aOr?VkFsXcz z*>9|3wLj4DM=GNWWgj@(u~*0Ug}|1KSeU2t2(EBOiPjnsKw8=&GRgGFk$pvrQFitS zY8g4UI;`;nF#;AzBcxOYM*P4LJlOY2IU;t8-}P!k*`>8+fGAla6jYe?D?M%5Eg-az z^-J8N`)K>CU)gV?b-P~tZi~n+i|LUfyvm3U0asBaZA2a)8O)owdXvcnTA!YT!DOb& zCi0;0^rT6erbk89yI9Jk0})GW%?SK%-&vecX3ZnmNgMvCj z`8ep$E;7l^E9ZoSCG0~5xgGakYmF4-aI$$84t~={!$Mpt*Tx)6ScAQS=46D#si?39 z`(@z~%c2)^H0(QQE*VNRRc~VIRc=qmEL+cTb{Iqm0nhk>UP(Tl=s~r}sAqYWH*Km2 z!xSd-5m8*dCsmk7QPRdkx>+@x1PM;qFoFyAf7cCmk#P_kuoJ-HHMn|=d0cHWj;Z%N zC{aaulEzWft1=l1MbUa$SeTn0FAIL|izi09R3fe(Q=8{z$4P5{7)8BqRSIFF$Z%^N zI;bVYfR&?1d`O%qQ3A)BrGF1L%!py}^O$ueM3?v3oQCY=rL{j0gDEMq!I(`nabToKhUP+H zF!dx#iYiRR!6`Nw9i$C*Aw0nV_INUBv=LtVd?mFrPPbQjUO0$L?4tiQ6Onv-#($An zQjjW?)WdY{YCBK>II*xxG0Jg^T_;qUR*y4cjHKJG**#!p;9AN_3eb z4-LPH#KDo7@q1|57xRZQ>p&iZ|LSz84P_WCk(G94S3AN3QYB5%Maoz-DIQl(hiE0> zrMy=tV+VDWoKVK0b$Udy^@tU**g--#>Geeha^c{}R4-DQ&}dx;Tw1yE81WLnd#qRg zM_8{#W%SgZPKAG<#3}5xLZ{q?1`L2QDiMFgdKg@ZG#-y9epR>ZnN)JK9RUQMxTo1A z39O6_YB%^@UMt?`_C$yip>D2@W{)Wda(UqX4yVph5Rd~ zt7qhJ0z<=?Ovb_yzbb`vValcwNgs^aL@E-d9=FyqZPn&jZad0{=6dBUcP=lBOFRBC zc!}*;Lb`KH$$? zS^?e#lNQO3GOHRj6vpXr_n~Su!2d(?k_aG`$aguR^Iz9tfe#ins~uyzku(Qr?1%PH!7mGs^n+WHn0Ese7qKS%mk2;E zXWAmN5BGevYL!DJ$iXNf#0 zOo=GoWHeko3?{RoD5>I2W<>QYjCmcFm-v%BG||+Nkv3Xu6d)m4GMmkYG*y&TX|0i9 zD&6*lHP|P;YN(j1o(JVsG#kouCp%Wk&dU3f+OLwi@T*9cjSY3lRMdvj7q#GZ4t~i_ zj~NqaBZhI^4s@`C0A*mNO{S788HzMjEU7k_=)w~Apj45Dk}52rq>hZ`gNZ6i!bBb& z91&L-6HOcuHL36rtXCw3KCm)&yrmUE%?V{6$}H5IG8M%Uu|P%^G^$WxI3fyT-UlW_ ziKYsZp)h8%$xIzASt3g`ZCogc%4jHwngLHD3PvG>V-)Q3T6hFwnbukl9H3tX5>_aK zARd|Tx5Czo4AP2OBPg zTJXb(R(Ae;Ew8fwQX4vc$ic)2N^qyAlt1I;AIR@ElqvF{u&bUyT__lnUPELQCp}Wo z2@~uh;~PqF?7_2JJbAZ`SqFp<>`dzUD74lHaAC>2n8pp3aJ}w%{_%~7H3bN~kI-nq zk~)A<&-6Nd2p_3ND9hk9*ZU)wo4?s>`(Qhi!eFYK;@P3nGh=Oyd)lJHgq`(Et7k%4 z05RCpKk2*{dZ#mmrt%Ls_TO9Acq16edIAD#B!@DjI?0Nhvxiw>g*O&{#DamvbeY6l!pFuU*Jq;t^ge zaAsWRE9`c2YKbN^-u;c zmD~=yb!mV2C;b2nz^xByOjg(;MOBNe!kY*K8Q;O6vqRuVzvV(!Ih|&o9dbK5mfd=R zf+Z1mEw;{ngYY0OM^Tg!mP_TqQ<&H7)W&$k1?r^@Dk7_#q4o9$b|{QAX(9?n`pEF> zh(4a>$qTD- zihl*SBX;aA>@*n|T-{|XPHiAEpn*zTA{M_}m7YKZUTH6fU1Xt57Qxn~R}NpRVxf#d z?hA~sKfSA*9ClR*>|SIQ1|cbwSP$XfUd{v~1U!jY)?ZI3i~WICydHKNpH5E%X*jGi z`p{a#K?dse_#d&ZT5B}mV7*Sacy3e<_LIgLJE6>SDeVqIl(*Asq%6Rc%b3zFo`7V? zvttsV>OZt6gQZ6dI9sy2XM~v;Yayx|1P=>LKEJNZVlh`6MXQBKsX{8csO{QCuj^B~5FsOZ5 z{Lmh!FqjRvSYKG^N$d{S<%!baFU)UP_(~CTbR>kWow-fe`@!000000Ku=3XI{am zk&c{PWxVR&RSH^YCmXNDBInz1a}70SK4 zI+?g8KSDNms1?eg;h2OgDdP(`dTgJwOtjMR_8%5A_8;wbG^!uJkxoZVR_P8Vbo#j#yXs-YF+IAMWh2 zU})Tnbu8m_Yaw!ULA`GBdWJLE`LgMnQUAUzY6x}X7E#vzl}p;mpDL_4iuPR6^-Vu- z1xlYCq%E5B%*6TczF|f67g$;gB#$-jSer~-Ba&~;^##@1(QR;_soYViraeGOfL=VY zQE6?F(5z_C;q@SIe7D-tvXS-Ff`=lD>H(~U6Hyh;sf6M- zIjLC=pekf?3aYX+#A*-$7Lde$XzciUE-j%NO1xf5+!*noUibh`wL=ftmdVPwbrAek z6jTC~M;~>^AQF(e7!F35LGN;u_Nq0(=l)dROL~yx4|7az%F;v~`P2NMtw==`OmSs@ zGBN$K<9C&r=o8y^8=%a(K~sq01-32RlnWLMmw(2*XaLP1h#jmp+K&#F?{#iH(3&%+ zA)Dh2WR?`B6T@qxIzE<1nh*LbWUPZhG$oUqZg6`Oi{B7_bT#1DJ~Qd!4DLN$+;Kp- zwnIh%?yG$yjyV6!VtnH{Ud5D_D{pb4iRgbvmV-ckN~BL=4WrG%TAz=F!J@H#2HzKO zjw@A{ydYt-BeFozo9fhZg7Z!+dB+B5P`NDmS{$b4I>vcSVQB-K$<{sf$lTuVJ zIR4EIkUtjdB?tkX>t2D9=WwuWTE+WRR%+{z>{W??du6Ez4^xMFzm^kl=O1f*3WYBo zl7qh5!@Cj;nPY783humU+n@H*$m~fRLYun!6-#+r;NG70olM5Ny%wUmi~bwz5K=BC zF(S*O(PP07I|rtEY8b-tky`;wOqs4JmH8Sm`NZ9D#BK6n!M+%2Gmt|Lcdy8(#>XT9 zLT#)%UgruOTaGgAXX|zV44?i4f`85rQjsVK*F5-m?CAND+2Gc;b7N@|$cuuY*6}uU z$F_<_uq2c~v%Hkcj}7>sNqARJ9rZJC0u~QPZ$r{L31V_Ix+E*gjSA>I9txa~!v2XDy~q&qguMdH3v{!2?nxv6(KmiUT4+jwE}b9%-$rB_Jv91IMZD} zgblMU&cZRdx?TY=;)WwEBCgyGUc9+0xMG-rA-7&uj-#=WwNsMEQ5m==kLMF{ zE=0DTA zq@T0{a+5Xs1YC?Z{e)LIh(W4s;?F1(39X8HGlYeA8@uY@& z1ewyI(}%av|BjF$Ro`VQ<>2%6ZDve2tb5KH);K=!xf1z_zMLj@)TU$`G2p*f0MD@2 zq#8yf(_Z@c4LBp7|3`|`zJ&x*tat}0&XxhV=nY#uK+)aeGFEy1(2+EX5;j5F7VlyP5# z&|0bd3VTamUMxk%cmlg?D^5EZV9^c5vX*zW8E%YmTu8jOSKy{GsNJ-2L!CgF2u0jp zp{y*mDIKUb{M%gfr;h!gvI%U^OPGQOkaW+u>55Mcy=CPE zc`!r}m6N0W?e**8Jq2)B)*P~17!e8XXAC{AecqDaAXCiOkQ zF1|#*9ik^*g=tWqx0|tfmga1mw*giJ`eXHE?qG5x?6_#zQOgtaM5|~U+TS2}V<7%X zXeM$sDswQqa_OUSFi7aoD>Y1t4K7rpO1Tp=*1M&9uo~l8j4&GsxYC{UGV2e!oA(N! z)%56V$jh!JC&{#yCSEB!Kl4jL@Ex1C481MV-2Srw{jtu9`Fh!Z88gJ`_oyNtyp5Wr(2Hbo&%k^TYReeS41H&h%#nY~>jm}rma9UWc)dxm9}qZL-b(=@ z*Z&Z*1-`ORIN`}933xA3EwW?=eca)Mls?Jb@p3qF@Ql($v1XXO$cJi)?bAZIKVYe- z8M!SG)B=eCEtSq>;&PDuFpQTeT=iy_HvkZwj=2qUxK6tS#{B~p#EC3$HBS;LBm`3q zu(6vh|3r~xm71dHDz>K>U&i?jUs|g);xF}WGr_r25x(T1qaDiiEB*IO#aCB@RzVxE z9c8vSau@CRdP6O2WzhROK;jfQ$YW4_>_HLh$1Dc5(lpy(<}@I2qvwbd-AP(n+Yp1^ zYE=J683_prku#FW>`k08j-ItHd^asSTp~%{2RKk3v0meCQd}<@ExySVe(h<${581 zJDOd$fjYsR>k-_AW@R?pf9Mzgy1C^&Z#N}M5yGny!Hi(QA|opMK19K zpcH!9$i~oWZW|6$*Ap3B2U_uj8mvEUW`>>6M=4L5u{UCc*Y+1jAx0C^P#?GUJ3Y>( zSZU>ZJv}3CAe(r`;_wI&I5596+!?j`P#(}wY{bJd`HU+ise?h$e4D{Zduxe51|6^6 zxuvvYE#;%W)F{;F;m79yZV}aD>!o}sDE&G?N9`{lzC8&0p#XJ`u_znf?WJvnM}Vs} zJlDVXLZ&%Klr}29Fbl5Q<)zFDvw{fyoy}unsKS?EAo6V7-L~#PV}Q~$ECo<5OdaZu zdojBnWY&&}2~4q8f-Q`6{m0EY$g&*4qAATLJOdv*0;GG}G7`IfQ>5^;dcdGLm#_>h zG?Du%yO}*7!9@mNRB(G7bx9sA2(nUAG(f2RsUiN^G3P3xw)L@@EU!HuniiGPaq{OE zl$cxbpf*&>mYiLEnmz2_A2NpOY@J_X*<}xcI()9eL(dG@N^IvYthsHrljn|;&&JdN zhNSJ)S433BRJaDfbq2*zZiV9~r%%PA7cm4vj?*Mgd25c%h9^wkKvebGFfAlL?m29) zbV{u%Xd75ZbY$aS+D%x9M|oMh{_IbKjMk4bFM&kKB<2IC?u4N0$XLPwQ5)C30fXfj zwkA(CLt|Uo~fS+0$>K*byw7Mms71=-sCf72AD<% zoL`Kfxa%ZFZsnqifTSiOWz{lqf!+Z=k>xwJIm)bsVe@c|zl;;%Jf62Ns2@sI*Ai#5 zHp_;*y&#I3{D=udjY6MTXj#tmmG?SW+b@f4PH#YiOtLAU>3-gkWF`yfJr(ls(^8zv z4DYM_o~LSYqy)^23}S;pQVrN0kM*$ULp(F05ftw$PKb*=F*HwH9|ZuF*BY-YoTO_h zAb($>Xg9Nu1T4A&*%p=;u)`H+R^Hma=!GV$c44l`;3po|ak8F~m1KoVca=29f8XLI zyIH+^@XAR-Ah%7Vhb1#OM{=1nwnbzzrgFr!uOUEU>jA#uy|Q=ZFq=&o^|9n~i$?ZB zRpeXE+O8SHF#tNxdHHySEBh8R5&xsrAY}-gSh{nTmYc6Kxt_}axS@w@NI&>vq`u7< zJ9(_AAcB<$VyZ+Wg_f>82Z1fT7_>O>wYIE(sV1kv(Q<;rY6h(!E2)cW(U0=zdW~sE z>Bhfkrqdl3hpa_2CLG5Tg7}crR7wkFU{^0W+0`pw1`4?qs2D#$j;F;d1J3C2vP35< zv{zxyt{Dol%9x0KOi7grhFucfe&MlQ-VsV5D;zKKZ`2}GY03G$eumn-uFI}VxI=r~ z@vaT_py?gMHlPM8yZ%L*w98A?;u=ulS|u8X(@;4hfjZ+8(J-JM@CK)ezL_zLq4aH! zXSkL`Bn&4}mKF~N9F_`4D4~;3&A?s5f{7O;D1oz}rl*3$|L}{r`5SKw%h}p8gAYNu ztZ4XQDZ@n4$d94RHw`<>+XpaeT4J)k2FY7q+C`C8qBEsgaK4_!qM2qry|(v+nz}kI z)|w=#3POk(REC4o_8O_Ng3+SrN5~{;Ie*ZhGhiiZP^JT(C%ESD*@AWCB)0|>@NR5h z3zMaMq=OArZTN7a#qNE)XJ z$*7o(&aO2huF@fPmRwB!%3q(sfKK*F_O6YV;KRQ)MlNNJlgKlB05l`Ytj9518G$P4 zxXsEoF0mx#ddk$exlnsD{7JsA)!to2lV(5DMow8@tc1tJU|&{q*~KG#sYJY!)iL4B zt;z3arc^F1fm!H7Z=7HRMP!V*7H?}fuU>OUB!(Pm@4;T#9eIL6H%Ci}5y6U&U(q^{)ZhBOq(b%~M5h1ueeg!ksX*mG|-`0AlzQ^-8%xsSF&R z?7SVoBF8c4}P`P~C>_svv{-H(jt%`eBH<#OX5$udhl2$lODhh?rJDA^dHY zr4y2{ao)?2rCj`zERh4AX;$RPDsb>GK+7s}y=@a^10V)XQR6pPSO+1* zJa<$n+4vKn&kt*pdJO~KM6f3dX+Q+)4iQO#Fk)$%L-RRF|0i!7wuVf*QK~UAWjq zWrut|f{qEtRcXHiT`+A5YEol5WVsKi>RKjO`)LJ@xf5Hf_#08U3G(%VK9G~10R2Rc z`d~?&WbDva-W7|TH5Q*+0GU*InPWf5=X~Ec;En-y3}ur=<6&dF*-YGJkL+N=r-Hq! zun0-hy%5BunTUm+gl!awVqof@>PL0c9V7m&^Szg65Atr5H-7zc;YGjI454rT0R1UF z43|ecl5}l91y=9uX2{q;_6cPbP<_X!R(4Dfs1P1+kFjI#sC9T)L+_o{5g({=S)ryM z9_qmhYoH0TY@{)uv7Z(&f|q|rTOBNIHPb+|7_C7upIlDZkbiNGNKy%g@f~qF^TRkc z^=ma%ad9w;1$mHtnUwJ&g{+Z&{M>MkbTg$3T&x&-4^n%%dqtCylh$!;+OJK3qUhA= z^_%Q8*}yZTAf=yh(HzUf+vPNRju$BHcsuT8B!39CDtIVD_fC@~iu$VdDb_Z=CY6@dTe0hj7G$Y(Z;FA72D%L-9N2q6MQ z;c1Tn2sA9pQ5zD<2qj6DbsAHDYbbk&xykVuk5cEAKe(!bTUv5x?j+LZ$+e2J2{0BE zV9Zul36KTv!X!YtR`kdrud10DUmR#`tGT^oyn2S!GcgcVQJ-`2WQ_|&m;mxN53UFf z@ZdZn{$XF!z13kS54d+4VdwK&`fC5|AL!FOl=BNe36rXIn_2~$f@!P01>P{f;g=6= zJor{aU@G1V(;4EL4wx8aEK$KiaWqO<>qDa|RNGb>y84uT;7vA2zEe4xslBx{IGtQ_yt=AQW>E; z4ib!nlEX3hGXCwx9pN5sbTY@f#+oXeDgbP{l2(;q)>%aY)d_+VVJf!YJ0V@JnnQ0g zq|wHfqV`wgjVy{NL)I_`cLz3&?bn87!HtDg<_4`j1wcKDV)5W{@Huvtua;dtY=)E! zyjhPnWNC8bHAPHz;uT=Hd_a2__b1yFg`G?PN&S!G(TW=M_aHWPfT`hL!dLW>wc&J{ za~lJix2vk&Sqe9Jz%c88GvIM65%M(DRRy7gY|{S&CsUO34qNn(bk?yT&md~L-S+ni z!cX8?k0T;OeA+ZDU06DOZ|R1ibOyd3Y%HhCFE23s=#o|(em~C$WN3b)yi@Ns8QGhX zH2>aleA1DS=+G`Elk?|K*KC{sXqdJ<)7kI1;Bt#g1x$glZ!}FrE~`#Dsm=?B&cG=aBaL}eCDz+&WkRGF!_!lnA zv4P4KTiOv;T_y?fq^o&u`e|w%KuRLa$#Q_mQianY6F4H~aGn1LGE54V~q3zXry=sxu>x@P{b5v(cpj83A*@ ziCn&E3H#-g*Icx4Dk7|a&{`j}>5oV{1Am@Lr0e?T|ED6I*zXBw=b9Mqm(sZv?U?R% z8Q^t>9b`orGG(*ZWhWf$m$sIchddtHzQv06(HT3)l~mWgunSaoLWeE2*^cdKE10G( zwoqox4a{<_fDU@WU0futnQ(x%p{I7S#>8nG>&r7Y{>vzT5P7?ss`E#oeT!eEfT_<4 zJ^EaUbOwXKh6p>I(g6UjXa;>QvF8)8CG&giS@M)Owd@|Gr#I(Pghr?`Ha}30pI?X) zL5O3srdU%0J?Ghyv|`KL!lR?W?;sC(in56bvfAJ!3sFLUr0~I9yfAJC!h!CWB#NNX z&juir9K<60dxZQ3?;T8sre8}K%s$f=0(KJ&VP+=SRiL2z_$tT})@+^se%a;Hz9e*i zWgbn1M?sdk#teldWC3s?iw#nMO@nnGL`v3dyY6xDlhmPj0I0J|iFrLTW|EQM3Og|< zzf!qO1GUj--~5A}CVEXda3akML}!#(a8)?p`BXIb6+jGx*;{1oj9ZfXSo+F-iEg1t z9tF+I6;5;ZR6PX(qzzGhNVH@G^RSxF^)oBp?^HkBOvO z*G~6@zU;&4-HdnK#@)?<7?7s@7FJjRs)n$o`7=w>+khw$DP@aV-y}VL=9r0?;arfgU}*q8xjqR> z@UE@of zF$fkX$5>_2++ap2os`4lGm;_nc@yM@>mWKzoog_PIZyKY)#?$Soj6UZs`qh>DOH-T zcOucqX-=pIK~ZVjN~Sg$3dF|>nz(&RBs^AQA5k4#|Mngj9nQW)q{L>Wu~BJ|#RCb$ z=Xf&i#(pR6-nwb~W0Z{gCZB`T*0YF#dv2Z0jK?vEsQZvM|9{Q(859^?1nS+!Jh+tk zlY2*7`(ZiW<)@dCys;tqQo`UI8K3b*pluF#jF%_midB7EWy*_kxC z9F`w-uQ*=kdcCDTSP8cm)HrwE$);H^T>GN%`7TskMmI3i9bJTe6^VhLsoxqb`9fm7 zXP8l3hIw_A|;giR;yhXhk-U?99 zLR5PX=*A~4MZ%~`71QoiC}zi9`>W7{!JSLSnKZGr1wEGZRaxbhW{nBs?0F_z=#J=8 zj=zNHgSWZu?7DL4k*}4pao!hC`$gwvJ3P}s-Q|1IPqU83iM#sGk>N#9Ku*{J=_qdN zxL;nISg{cW^(XwYKA-M(Yete$@u0fzrBt$4&i1$?c2~=C%Ntd$cL6oxT`1fjcm>Y~ zEtsYjYXVS6P$P2=GzM_ZEXjz4Tse>;Lo_)-+Und9K6IU0*q6bkT9!}0%7CJ?>6I0u z98noWwZ`G-edSOqq+|sPNtXm5s-y9!$NPKYXL;lVmF>$rf+gD-Gw7Om3*KyjnCEg$ zDd=FP4Vyhra)a2@y+PuL>Pre@gsuF9nVVuZ*}4^LOYq$0k{RC~V6FZK|Hc3XS87LY zwhSC#^Z`>`Vo4|n^mCga{z=8Enl7E7B%oA>Ql}T%0nT2Z##<)szJy`VLKj08+Gc}O ziObroHx5O@BPL21=>>gjwslIq35ojI%}4xM-%@z3pqE^kWp#DFN}dqO|~PC zunhX+$FA-!XEfk}L4eU(G2H=nh@FYRNlc(A1IRy~geOSHlL2q$Mn&&0ajn)CXn6Zmp zFGOIGC`JBn%9!o}IQ*;T zYr>KJk|{7AG-%#w{8`NzZ+(i7O#TG$>Ur^us)2aJbVahTJyy|%9VVik0oB3WHc5@Sv0_vM$f5W)Y3V{$}gkBd<>hSGpb`)7Jdj2H) z7>wM}0HWDf5CU3w)CK>3%>f}3sn(0ML7%vdZ`5ck4nGVDeEg-7D}g}g%h?ME-H4QW zC{l6<`Zp?krlN$$yecwteut%>)WoRA{Ka>y9vHi)0!7NB*c@pg(h*UXTB3pO#vPC4 zcLf|B4cp+(V^zU|QB5?6(>g zwk`X_zYLYet2o5>P>LkCuR`6EXuF43^%sNBEX+(?xd$VwCe)i)#?UX!>5_waQK)4Pe2$9$}mQ;T@W5Ef71BsB2tIWFhr0L5nZ`_|Q zIU`^*Fr(%F06t%;F&;!-w!_`F6djE(MV9JFDZM={RA79p1O=kM%tB8V8J z8J3V(Le-R}d4Ga;pYmVcbzxEqy1;W2auMATmg=CNvLwxwk~?@JL2+rJHls{a6j;vg zUx|rCyCI++Dmb^^NwRxQ8HfwjMM4>JJbgWV77Th;Z-SI9wY7Z)O6wZ8fa{q4MCRD}~E3Bve z+5y0AIpBt7NCFup%Xr(i?(REczkrqrC8Fp-gHf_f+@RS{bpb)`%&nV_lHn<+0DSWE zuZH7`C30X+Ihv23KL68u3Pq>1S#vG)L<5s{0h_xjNvq0Zco8VaOt)xV4k6M?bTP** z2%7UJf*h(WV0Z$dXnLi%xk^z5re6~Knf4^|2>N($LYATPHUgnB>(x@iD06xQMD+vH zW7_XKO5L2`&$U+sSTwRzMMSAtd+!7Z(o0_4?)d8*r@c||%GS3p7E)*u$U=BD!GVE9yy39>l=(KOBrlxLTY>X8rl-s>+&SnvpuE8K3SV0 z8j^&}3!I46M3b=@u{b$RUrEg}GIb0@VYSf!NDHbsvvEKVCVj(TmW8UtROWfVo)_P< zbt#>+Jk~!nfFX=Lf&&wDFQKmrCc)pa1>5ED|Ii(6A`6lIw$(cQ_G3Jz2w>cRkW`3z zF6G*p0NrC5Fv zC`;9Db7wfx7a0bS_KhSnX{g8d`2S6?igMT)ERla=acwAJ&J;A9tB*7cwMXsWBRnN!0jPSEvF)7rwLP zRI1EAwK7YZ`2QD;i)F7eP=(frC2n#_HmkSss?3179bs5Cj+G5~NPoLh7WP--u_#?c z41*t_5nYc`1yqW#wZvk)sNQbdGi1!tGjX)>|M~SkF(K&g6jdxq zmM48wQz;%-06(KvL5WQpp*UYYOB})wCj+rr=qw%y*vf; z23d!HCe*+J2g=?9GF^jwyl0w`-~SdQBcP8~uSQ4U!h$U>a1EU%>cQ3UmCMWlvLqfW zGg^*a!kptA06=|yOY2Cmcs|HJc#Pl17pt*o`k76~vP{;cWYncNmB^0hN}++9`Ym>2 zwaXJgcRwG(uVR6_CBCx`DGZHemi5f6(fD#cq_FBvjU<7DP(O zXfJU~ANY!%V(CdDOaTyEsqmi`*REDt@ig^Q-g@Y!y>0iPk97wADpr4#M1@XK!d*%z zJYk;(qH=69$#-ZgDE)X*h0JV#9W`N8hD3SgJx3f-S+UOqcLH56)hL4k1+HU7`Byv2 z7%1Js)yRW!uW@Z=2S+f6UE z3yrR0Y}tt@aJP9vK7|49gGIL*q?5r$60a-VL?!>9_f1*h#$~F>e4|u<*C3m-9G%W_ z-ZIH@k&UlAi!!blHA6KRP4GUxh>#f#aVCqzP2X654#9hc(u2FL2Z`8&>4LPg(@NN9 zD7UFebzM_1wnKcWi7aM3CtEGW^t^Xk3 z*q@LgM2T3aEiw9KgFGZIBwlzT8O|nUWU2DyyTJsy)N_|8c4nzs~ngv!*!2jYe z(>{h;iAcHnT|5?KT?j8-7Ui`vp9n`UsC?-#d(l;yHAY zu6tlugs*?KR^|R$j^+8hT({W?`T~>x{i*lQyhD7L;<1pzE^ND=h_2Esky(Wz*tirB zRX{O_)amG=DjIVKfxR;nTAq+H0Cp7uV?Z`clHcog8p zlU9IRULGwD9o*$kgMTWLp1vS%*LD3$t8VF;!2%pGN+X>)x|?|g5SNOtjpVG(1>>Y) zAITZERU9_7Jhuv1(K?+#=@gHMXw-3E_V8y#C`3HOQXOTr@Dc;i0drK;@wROY-NDB> zi$)`gi^CrsUYik%M(A;$<_Ss~jf@Hd-c_g`u4XdGz-0PAfA23nonKWQFO0Zio<qDu8z2`s!6x}`5(5NvhV@*7iES^pI@-mJ;@TEu^t&F36COB>0F#o=n z5)I(|x1eL#4rF^*1#1>OBJK?LP>~6jEuRgUy@oNk6o!Y&u#I$4xkRzmOCT z2;V6Gj`ec8$AJZBdv=@uug-zzlvG3>U~KzetW{F*Xk;FsO5&%W>7-s-s2GCN0+>K7 zDHU%4_Q?iOT#`#jxUMt6#YzEkK|2-SaYLz_1d@Xs*L2UZ$?*^cm5m3-PH~Od{kR2oSXaY z`BbBT)%X!RK!5n*HLrqsHQF;b=WpbY@xTD?R(fXt6` zIVIHELtbk%w!XvJ_L{R(hqq>Ryk1BX<07R=T|%jsRIiN#)12~_;;YSmSaBT2Cq~h| zupQQWP~b0h2uwMQ0yK)Em6mi8&oe|o%TW%`-EUwY{?_v6_>~iEBJtN->KLu|1x`mU zC;(eT+{>}CO?c1d%vI${L&x=;COnp^SZvTD(nC>e>Ck!i^ed@*6s!trLK55sh(zE$ zQ*@i@9F_-@>Or97I?!w)ks13Lyc!YSH+aM|v8Cp5*r$k)QjQey){#&Df8;10p$CI0pbv@41VoMN!xB}G#Ib+@oi%_T3Mu037|5XvtYOGp&` z2%+vTBdJ+6~bKpRt0!)bJ6TzCOKCztZ`9s+rN!>r71j$5ubR zh-oqQ@hmQ1_1jxuOX~_mAi>d@d<7j|tYOyhP4B2y!MgD$=j$;smx3W)!xTM&Q{pe9 zLalaaZ;h_H157W&E0@E}X&$Kg>St)aV>!+oZQ38uKL`!_a5CmmHWHdWrU?<`D%2yL z)Ec?@NQyp51^i(S`vz(${uSmVw+S}o0Py(dhugFejRfqIG-0kXj zod;*miLU?vr<;Fj@0bZ9hAcY*NHKEwOJLo@)0afX|BT7e2DSNKj{>3PT%+Vcb;? z#Q2LHyJw5Oy!+o!uGWT2FKQdQK&EV{ivK!f;nw}90Qj_nhdxZ%G*$?6z z2g?h^LXok-2bg6(i9i=e$^PN$>%lhLi?19Zwb>96jOxRL9i)3V+F+uWZD!BPiycWW z3lQj>R!tz|Z9JtOesE5>wp4`GW}GOK3r(2AY*m?-d8DJ^?MEy#x{qCr`nGC9g4ldn z8IvNU7lR}ubX(>f6S(+%Z7*`FhHy9>(Q^ZL_h~sBkW&Iw&;w!(L4{8Ic(5&YLKtKW zI&$^5@9B^F2kTGW;OH>P)897#3ZupqCbkw#Dxmh%8P*hmy@t}3oPt6dXCRk}F+_?N_KUiS zZ%8AvQNGl~A@aJT3q%+RghC5b)Ry^%gaKam=bbbplW$$AKg);)qIS##L;V5`x2v%o zL>z52`@8oWt7~hCV#t#8QBBD+`B_GN1FVT8Kkoim&D69m_9BYOAjF^ev~X+xmNcKz z%uf4sl5KO^2a_xx5K@j!E+pDJfA9lMB?-DgU<$udWBfvNp9-c7dgR3k9oszxTu=GI zd|q^Q*34$vPNBdXnBu}&h?S4Am>-h?uL(i96$U-4uBzb?fQ^Xg2O&WC_;|4GKx6mL`vL;%yr;lpnK zep{-}=rBnA>C#KOxlxo@8?%8jP(qX%EMhXH@sZR`9`&sgw>+)CmooBwC!q|Z=mYqG zzzlpI8&Qq>NzWa7Kii{flgwTZ|FUTBA+%||kesM+zA8dNLD`1n%nrhice&hCs{BaR zv=2q7#7XVE{>>L3W>)S|k6omOi6Wz~T64w)pnU!L$t(GoI9^m+e4~B%@#YnlzC`Pp zap}mTRO4srX%_{el0X}^$34G6tOD>d_Elnbw?CT+&!^3xSwki$Y^59Y60mI_(sA~9n1%Y zfD0OvaG|ctVSJ=3xq--(cn{IYaW0WEVI-Q02dsOo$JVpBAwDT7pT%S@UB^2raSOv+ z08vigv9YXdnuK=#e{E!xI3J_Nhz!jRjK6t0V8q%AXOd#+Moy#VA#R>VmYc>_LOyeI zy<~A9w~*IrogR%bsHjWxvM_+sBsC&A`=069uvIaK`mIUO?@TnDpUE^}UH+d#xr+ta zP;})2Z$R^1+B%xE^S?)&oTNm24*EQ(c0#FZM?IK!qs&aGFB=4P-Z7C6P6DD40Hi7s zbK0VBaH@{~^H-PhWy%lPBXH|t#6@^gH0DgPHh53phIltctqxKSB#ZyjkDJ?cM5t3A z%{I=U=O(4HjLR#&s{5Xq3n9qLfFJa&#JR_<7)>}QQua|g*P0-?py`y~;S!-zgn|TB zWYO<*vNRts5+g_n0EDd%w-1g;kUdG_zHhQ*yi3G}m_zeZ2hh=*i9K@^CxPx9{Ia<9r91V$YVcDAw%Z55; zpO#M?`>h3BQYErJIO4#xhP4()K!T|_|2B0*JDdrLmSz*o(L5NHd3d?30)5)9g?;sC zZuVAEd!q*=wW2ZhIUal48ovli5D}#|3<(oVWIzK>)!!Cp_Fgbl-v9HA2rgV*p<0m3 zM?>kXZsXrk8KvazR{IfAHw)M-j2>T9zXMUDZJfF3E#+5%hP74$be={P2;Id<3ww_B zymaJqhnwCZnvntoY()kEVNrfDBKGC^)jfYBa5Wdmm*nwo$jMM#HF62Sos)1=7WwD+ zA9NC41Lo>64%)d`wDG&^qej~mM%6vJCeP0965zC`#GSe?iK=uFFeep0`W=R&hMv$< zkyINUT>%pSb=G%iNJ5}0JffoUsUWQMTO2-yIWL+XaW(`mo3SugnVLpAFZfM;SzyqD z{|@+aVBni)uRK^>{s*M2qmeU3ovRIi8g+V(;C5nkA2?Y)Ws@#TAEnjY=GP0ux=`?+ zrn#wdK|1(Vxa9+`3}5|68GxVz2~Fa@vzQzW|;3BB#XkW)lsrvqDk+NzT@ zl?aEFAB-rRt|AwgyfIbkA`d;qwDUaEPO+Q5O5%R|kqtDhG1v>Os{Qz5Kjcg}4%W}r zI@kgd;W&Y3&ldAmhTo0FDysXg3yO_ zJ?iFCaxRseW0FZ1hqI&!iFTg)i?^t0g5d1_Iu*6SJdR~7mE%uorYq1q1jEC$fa##+ zCQo1jR)OyYnA;(L`c!$*>1gG$tDUnH>pT$PB)fG<(DkZq!mS_zvJ2vt4s0yXQO=i) ztiU}W<<@DM+j={>89MbR*J58DEP97-Q^c>Fl zK{wQBEzI@?;-j{RD(?geq(v0I1@vX9?paDuj3~q1(?BK1ZNTO$(Y7Kwd+~~&J5e5H zQrz;fqttc*`663EAOX z${2uCNM;5wEcyUJ%IL@cvY1%dbXTABCX&FIvx!s{L!z_ThxOrQxxedV-0UN5@CQ8~ z%ztx>q~r~NFlkjJ&-}ScBF(pGHVe>j%N#|$&j&vlq5)w(N-wcO2Ia`A%iQk3($~&`*`hwJ_*wx0o=CV!x^Ng$=m{FauQhDRmQj&5IZm{XN;%z<%yi zOsiS~T8e>j+VdW@F$WxHnuxz<INl?{0^h`k5x3`QplzVQ4P(|6k=*f$Ac}{!xYpD(`UO~rbB1s$69cDCNye_&bi3F35{Q{O zrxAe!AUig*FqY(x9&ggEpF&rtf9I{nS`6pO0=IX_Jw1yzc$i<#411*Jwi4x) zlhcybd4L+N@LiM+7JT9|%MBSXx)&45ntt8vfLuuvUWT&;hnUbE{tm)jRsw=kJK6uNmUe}5#PYxQm2`E&GYpG zu~kRtRPH`^CK)^8j1Lsxr0 zULVDhkLO*mX?6q<{)IO@P_xKFAA3*DLhjdd!qO&k<46oQ)GeAlY|#IoV~2v6r~+R< zZJK%D)`IP-ukO2)8#&DEUOLQ=-rFw|LjuiF_!K2x++!nE!fHkPZ~Y!z=gyxG$V|o- z%^oBI#72R-nW68D76JU!PO2F6kis9*Z&I+9E^mNlR$+Lf1*Mg>+H>5@hjY6;c-Tx?5lW4=-1nv z<9|1Wj10$CYAp1TNyozKYcZfpcNH|5o0jOI0dQ2@uwxr@fPNgB!4V@5{JNBwm8(YI zUS;mxtiHHyuG5?=V*(M}ZFPNTY<)C%pn6P@;3o%vn&k;?$ zyrW`9TyLr2$J51`U!l+0l|YZh#)7wdwns0UH}XqtjyI9cN}>Ulb#Nm+$0dOiOn=II z?=*we#KTN_WZ2!Y4_tfU8{et1uP@|LPCM_6>kNmISWtyWQ9MyL??jz{7q@cv}xB#$yuN zu5uqQZlBLSp7~cj$OBYN9Ad&u>{RxA#o>B}d!*y;aMN9xY2`3U7@H-g9IYR`jL?7DchlAv9A%9ll{EDAE0b=Xh6?CN?DAC|+C2X`qU zs2yEZj5@^1+c4JdfGErOzdCdsoM1Vx zo6g@ zZeTjG*&G2)1p=VaV*h#`t=0?48N9k7l875NO(fs1WJO_CkW*AG&^_(op{W-M1nt#8 z_`9Il%NFIq6B4NAv}#XL!2CHTRsBN9F2m6C{CGcyTkH1k`($M7U?p}EJh(wBr-xj6 zvGMP7yK89*pq3@-2Ca~)`MK9LxkzWO-&lvNj%x_NVUK4cp8qF!su^@NLCL0ULYW3g zT_y>e3;`F9A%D--wTkThMVEL91< zW*r6*q0v(v9$a!>A7z47AAT!Yw4qkM0B!D;O7Gq9$&C7n5nxI85dfO-)6)^zSk%kc z*35dcg#sm*s3)-W`<$Czr{!oR0t?@9)YS;81LdZ-WLv#%BLu5e-~Vj_&2!j82Gh#m znN>Y~UE4bAKWUW4|4JHLDSwvSiOv*vtjAV`x`3bt?3EHHS8Oez9x^B)PRb)t~Qt~2)$LANlc?|%5{o!IyqR3oa zGyy5S8o@Aj$!LS02__ap3lIjfM!V6%n~)2zJ{1d^<==5|XzE(go2uAkGp;OtCmZ?@ zQM`4#2!o`zX#Kwc5$jQ`NSEv<<0Wcg?T?$b$^mm(d4ZLwjw6S2A)we6;Fi?hM1+)Q zsTs&nGE2;VB2W-51r$n#Zcf|h(&UMQ4G-P9v}29b=~;Jk2r~LzV*=-b8n0Ts1EoM%0%!zuXygk;y#QPADpKN| zTI3=VVz@gBrNXkLs57C>Rcgt~&tkV7Do54X;GGrLmo(V05<*}JApj46s@Le)-&9YWAaH|K_C?%oq31~Ew;gMvNvrMnFqT_5akvLq~iQK&~ zyBO)C)M`J}P zj%)ya%3jt=-mYOud)M_SBmXnsXPpoIqW4AA2|GSv9Fd@kw!&OAPkQ#N8d%Rh5{tCQ z)!Vad3o%XF>Anjgh48|+BGvYLrB{bWUHN&Z$+Cfb=1dAgB3~2Eu%Fq0e7fxK;4J_! znfvw!v}T&CzP8RV&F_eSAE*+)c@HpRb)WQP|mPzc4TGtx1oo!WIRBV!GO~!tyLPaZ``M|Sli1E|y9ZFD+JX+pOJOdHXEV<+KcHFlj53HuySn%fitqm9| zKLDr6?PMX$J(}26LBeVNjl2M%2LocsHK;zq(~vY2to9y>p#6fqyRZGi)!fWoa~Or? zi3{Ujv;wZ4&d_YQSsZlLIS)R&#*@@Fy%{26JNzz>SceQslLfU2!$Z-+)H~KwjA&?U z;NqnjERVMyL#6C}X{Bk5TeK#&gHQ$lasG$${2wq!K0yG)DgJQDBmgfiYI+RESxAlO zZbh)g3|~IvJ_sN2vim&o*<0s32p9t4Rw_zgCjeA}fd8};YSAtkvX@jC@K*Q1p~u1Me~(*6jBW&kx%r+eLR1{ z#rk>^BJEveN*k+kit%e5r(>k<7M{>3Ud5G}M5%AbdIVnx9RLV&c0&lYh%wG0t+?xS zrMf~oy(}+?={EhXR~C!UDBRs!E4xKa0+w*-NO`QTS_8Zezb2XxVorx{LPMgiq25Vj zjM{$@@H9ZTC;cKUVu4Fe)mI6QN3&6;G7wxsF^p3zW}Y#!?#jl`;9 zlhxXrPk^N4#bH@{PQK97%hMQ#<>d5*Qc>L^CFmbPWnJKRUncgYDfCdOz4?qIHl!`vk#xl&%wuUayX>DUk;KI6y)J33d%o-45U?m_58d_Ft+)2 z6nDzF&De6To{-yVt5H>MW+fM14U#yCwB18Qc!T^KVN9WfEdIXobnGi%MA|1LmEub4qw< z4hCH6LT8-+<9c@p%w`%v7K%UOaX4L8Mu8eg-Ofca&>ljaVs1TGccs1>{X3Ju_fx?l zucCl^k$yMK4j*q@&cenP-FjPh^;A?LcFFqh!Vf-ciWsul! zSs5SM^K72fDC^yxr9}3btapjVqr|T8c?85}_e~abh?fu`t^&)i)4nnb5}~79-iJrt zQo@BM15z;?L6!{5!DSTGw~O3!5Ih!!@lkW=Fv!+6%b-YUg4N)%V?ZUK9PRQG*aY;h zLFeHI*ds9?JF2hd=(oQL9;@S7m9^SM40}5767sdDlv^6W1?lko!eSCZO{Tf~bEDRn zUgIi~N**Mmxtz_1VTcz9(%zV+@>*?vrgvN;+a(4(?ffL~QdlBk?c?KS$pn`Ke{d4G z%UDzhEiLU#D(n{raC2EXkk~kQEI&X71FR(o{CixR$z19QvYS9@=Y6`x9t*kbDig^77Q>O)Ur zB3#BN%X^yD370KC)tv(^>Q4V%o1#Y;@B5~ap#ZB28+eqQ@yewUx+CUJ-^AzWOCE0! zK_;Xvh%S#3X#elQ2k`vHOgJqG`@8=KbHp`BX4g0Eq+T6fLP837d>~#ula1(zG<3_K z#590lQ0qwINL`bm5Q+#I1kac-K|QUSSz>r9lebGzmVRw-fx^EQFtn24hJ@5ifY(Hd zZ96RK&kV@HSVN9Df7)VTw7Qi2<3-fWXs%gYx1ik2<`pmM_Hhg3PB!%uRD~kX?POAa z*kRY_N?1+OJ>AAZQ3BH%QrW;sCNHRDm*9d<;br_WCzb2srjNzI12mA!xTyj zDw3Gns=;}i$Fg94r;&WjU)qfSoA?J*ViGRmJZqu!N5_yJAyy0rtN-436sRlNtJ(yVAdWVH3 z3}p>z=1Ycs_y%vjGfuv7z!VX%6d?UP{Zh&X2n}5yM}G)(lN1=#LIJCz^(xvuQ>fHb z`Az1)&k&4RMc3XY7+0s5YwA{7IJ8Ykxuq`6f*`!?sTJyAMs@(&i68(c47&s@we$@Y zWN*BKB@G?QKroQz9Lk1?$y2^bS!1YgV^qy-mSRPf0v_#g)v9KM2m+O1W-qZsr4x{0 zNPm&`DSrdH)a}*U8}bmh-KqX0ZaJNj{6?$< z%LP^VwCv}{n_UzxOxDGGPPB+V)~UbNs8HVuL5nViZH?8cPVpV6SPDmINs6nHt49jQ z3iwpg{cWB-YS%$cdGt4b0(pl-+RPbXl$0iW@r`GF3h4J_pHUgPm`Ucj`%FN9Ge_UPd?oUK2>0F(}7VE|B2Q9$uI9; zmdi39;o@_jt5xKOdjynI8^}g<6HLtJWPyPwO!S9_raER#c#J&)(s4#1iOKl+Wt{z) zRvXNJr*uSqRtoiV0;jSdg%Vm+^9iz~$(Nc6K@AY6bkT*JFlT^;pgBBbLH5Guj5TN&KqDW(OquINm3iw@#K6o``qm_>LA340s*sNJR0iK=0E7-4e<(~O%ju%RB?A|1uI`o7FZzYY^NcAj7>Jy3N_vjjjY*dZR zTs{gvH*vRXNr%QXxMWSgS&3j=#RIf%`=xEG^(KJ-Vs0`hU{hv$+mt-mEBoSE_v%4+g zpRZ;FG!hhiN~o699zs)5dxX9(?l=al4593>I`r+=9Am_ajmM4TJ4z4njgBlE|qcmA}~ z2wq(W*Bf>CbOSCv(mf$9#4{pbR zn5Cil+(r3}_c15emAWLw=;P6iBV?UKW)#K4SqHnlifRAq&3(uviRGDQ^3n4 z&aA*2gV&{~5#$89e7&sh@J#`58>aCSe zBaG=`zX{FS47TSUl_5aix|!Cc7zW3@o)gInbWk$-KXO*1^!YvjM|55`uDpfOXG*fu z{0y?=cCd{0!Imn#2lx(b%L*|0-E89y9{+$=8mC}MBDCZ~nGvXkgt)HSO0{E^s3ji` zPFmaInG3oSVs`(&4eK+tcEFX13m@{;f-Mj|G`IEOa}KY>>CIdj%#@SZRFNUtol2^1 zyy8RN;OvGG1=wQ#%o3)vrA|lp=AhV*u@{{rv#zaV{MU{YVqR4VH`+DA(h4y zSqmGQSqVjHbCU~MbSxB%9|bCFZk_b_{3hdj4+Ko5*pxWT=()s^ zxnL3xzrEWj$jdt%OhvAUk*8mrl1wT3m~f*(A*hBNDL#I*QR?_%>A@u<+@S$&zYcS# zsBHC-Gx&J`Wcr$!NQhvU<8^LpqqfC$<_J&1!VM(|D%F%@&cBa=AepT8lPV3d=|yh| z{mr~PG_hQ)&2FuXO;Vw;mNe9{7`{#EQ1(}O#9$<9-}t1$7-HJzYP}yxxlM6fBoh1i zv3{dZ4&H}U5Vjg>ZDklw`I=mipR?$vqnm!YT0rB{YpKQdl7{z;-{pvk%GTxMMT{(I zJ6`{KqnW3gZ7yS7#Zc=rrZV~r=gkh}B^si~#naU|nS|yFXI_L1LchXm0H+XgkHi|B zn1B;Ud!oitSCDpCrEH=q7G$YZ zEdY8tZ=E9t0&s;uojOF!{1fbi!Y(C4V42B`_n|(8AFKNC4UE^_&Ve?NwJ1@_%wwa%M$3 zG;Ma5D~t#j`mDS!{0sfo;1QRI>nu5D)DY(LqNsI0I(tm)b2P|Z09UpL_pJU0k7&;VovkR&PC?Y^&$2&FB!1&VdTK zwc!l1pFD6m7PaY23>f9+CMF3d!pxhy{`*Z18vhdONz33%s>RRuKY%*8W$a4=%{B*t zt+GiCQ3t8f+N%p?b!40P6Qn;qsA}g1)NVPyuq1G58#&k@bs#anrP(q>!J1@0HXUL>DbY6toTFd42;(YUo`R?e+C#FDLzXW zYSZu*GEAMk)B>ci-_59x_o2G&1qG9^6{QGqw4l^DNd;X?QM#P3;GB zx`W-|#}O}c#YWctwaQlBs~G}LpE0~Llo%&JHq`T;d@oKkh+F9@m^{zQD&D_mpH=y9 z^bu2m=h{2-uX!B_A}C4$BM9^-ydb2j!b@$TO(W&cLo9R+tWs;ss%JCl#qKu(_yU@K zubEW)ftVnS#%bDgGPAF?mmKgYD9~H3u0Cud9SX%a>x`3!yBz{exKyd2g2QB#a=W5Z z%m7i+1%*>W0M6A@tgB8C0`9kBv_s0T8Tx8XYSVP_5J`~peK_Lf3DNn~uP5!Tp9G3N zi2GkEcs`K&7P~qQVzkHH^f7;n-id!`VAn~IC{Nethu<0e)bJd?rwyiiD(BGj6gOo+ z{CWKU5Np&_3br^YhPY;gzY~I=q&!-KsjmyqzbvBQjR0qDiiC1U zL2dw?x!D8?h#)Gc8rC_~rX|O99@CmfT3JU*Pc}tdgnnILRNqfiB$613BhjYOTjiHU z5pdstIh!M%4}GBT+}O_HD#O^9@MtA$;mD~_&Cn^Xuxo11mqzZ!T>3<7lOCpC6J#uL zagEe%37S?s(me=#3DT8c%sBZJXK6Oqr){s<4smOAnH><+Jr$kU-GraNG_EZl zTzJJfSMO|Zvg2Y=jjvzZ!75o>^|-zEsFnKBm45z+Zg#o4|9#R{tbo9fBj#IooptsNy;kB`E4p~!bJ#PF2 zW_{>kCJD7!vdVb=gS>f8^fKYs+IcFOE0iW!H4-Y9JgGklvA|CHlqkd?@IPh)ncAP~EKW|zWMO~BpRp*#QT`$zj!DZ{| zS5QdPDPRIlQ8|HL-9|62Q!XC*^%ZYS61vY$%0bECZq#kC6ddK+b1^E>-&MH>6A-Sl z?I6Ve+4JDL)X*3rwd)%wf-1o4#w zP3Tzli~j^vlZ3j_dYMKVZG!Qk1pXlLGLPn;ps-cnpZTeFdJ+47c-FRab@|_3j1Xq3 ziJ_`x0a|;QPL|cyt6E54x8Z;|TtroDp-KhR{XmW4Uz2q1RlA}T9e`zm@@l)@wee{N za9rFQmVw_#q}IR&hckps={;wOqv`%PV4nO!@jh-*S7!-Qnh~ZUE1q5^x_#g=WTemI z!dHD%Bl8fjn+wt{`iKm*{aC&76CdEjy0zNHT%`g9uF@u%=Smm4CfLZ2*ndY($R~k~ zaMjrm+wC*24+J_K`@H3vEgnsMRuzjA>Y>WtEDA zlmjoH>)fknX;xxp{&2`|3tJq?2h0-J7IyTrQ=T>zkunYwq;JC_W0jDOL`c^g>%CQh z|7?6FJ?huc2}I>)zB4JAY=T=z#w~_URtERmzs!Z@x2tw2UEsP=57_>iaIT9=B&7g( z6S~^9S7b=3>s8#0jDwBI(BGK5b4?F-Nyd~5rhwQ9@#^WE8|E+w`@vJnxSM49de@}p ziT?OFKa|<1;gf_W>aCi=OUCxBUoqm2uE-rOT?VheIpB08vfGOsGBg3mvLdID^%T}n zfTbtM5Q71U^GwwjSAV3=>(?j*N082dJ5Vib7WJJXR^%(w7DyYoLLytYt&k{QNFuA4 zti#tmg)y@KEFSxQy->r`-4^brhqpZoPoEIBLy8d6rV`eSWr_fMSpN5VirKk1^M1gl z;M`@W{$=%TJ;*3tCWM7=0MdOG2=hfv5y{wnHBZ+m7-;thENqC9R>K{Z#I$+xAvJAT zZ>(6xejqDBVoXZ0&6;v}1O^*U2DVp9DLgL5#R8`VXR zVDi~AY9cNxr`}QC>KD#H86!nw#2##?bKZ=g86!uW6V5<_3q}Q6q~WJO3Xt0u&pjUz z12eO6WT4baynQCQ3?v6IjJT0)zx@#|{44_ZM~=-2&+m;!+?8tzCEbZsIruRnu&Utv zzm|kvs2Cx%2UCNk_%%eUNO?*3fJtreldK0b*u6&w%Xq`r-;LZ@mnGFfrCMOf#z)D< zu}tfmCWl1gg~xFUFd4NqM3k%hHVdTtC|eopL~?KA-qR>Hk_jo|tF>`{*RPTfrQDkT z3p8+_dr82&39;C@cm#;r61n^`iR57QNU0=))1YXB^6I@GyHgT?PZ!)AH+L zO!`-z2q-j3*hj>??(jIw64baAX_h%B!y?V%4ZEj-Q)USI@ZR)%Aa_laaF(9Rx7lmB z8`s7)c%}pd@la^xPweQ0d_Q9DPVgo%vNA994KbSZK~yJ(4a-Gjn}w%t z?~>wrqulwOf$R8}TL$Akt7dh~;LXex^|w#hhWTqIt<6rM;kZXIPTv3>qc}V5JB<0boOH2g|}Wr59aDJ-t!UV2%5de+$X zvOZ5@Kj7gQM?;@pM$(mJo#C%_-$N4@lDSA*^uns|{evA>?{)N80xTJhxn&chNJ-aU zV-#a9^u)=DbMb-O{h0VZe{aGyhR+O|`o^N-mZqA)Wwy>vH`BrqDr9kurZKu5`6X#G z+Wc2uIXrqf4Ge5Uyn%#Tlgk@^Sg<&35vVyu9V-T86Jt7)F2q>9aw^1)H}yIdk)MejmbA{MealAY@g>Sir0%e&}YXf=i(wb+01Ef1{u-x4aqF%nFui+Vj3r6Iw=X zht@VY_K`-y28oTw?!s`$m<5jM#t@ej14MuO0)HhwNwA!>!B^KL0hyuj=$4gjGqJZO zJb6^lcM5ssI6=e;+)=W&XIHr``?1I7vb=gTa?%t#02^6_T?JHea?CPzYdd(-_2)xF z6)EqOMG3%C*(C$_TIKsN6!xAU)~A!ogm%HcidR3C`%mRAZ-~maHM>!*tAYfFNY>hAM1T zc`;-VNRyP4uo&;4<;vlUehQBi-xpErcznHGCFROh8)vn2iwkezL(XG>sS~3#(+#BM zN<@`3+U1j5q1zEAvQHOeweR9noH)wJ;9l)G#2El%P}>)C+trF&POS%Q&{&&Wm!3aCO<9)4a?|7Xs{ea95W9+X@SO+H|R{hjl3!bJD_3OL@a}YOu?Z1`*a@( zhe|>rXcAIlG+Ol#9duP*8Veh`*XL@cCC>g>R3NZ995MkiR#_8M%;T!;;S3#lW9}o* z_P-dG?%ut868diYlu=PCqb@kq;Veq|aY#5O<4ZK^!X9lXMw25o^JnfLeX0WQ&6NMi z)ll&E+o?AcMMHy~jr7^Uw21X} zHg7{&pJNs52uLTqW_ACkNSR?Wc3Ew`{+4kCa0l6#YA%s*E_kMm9 zhga#>f~oG77sb#u&E?#s0NZHzedY`~$1#pa>AP#0rJ+&aoddg58Azq59C=v!7!)eZWJ2p}=0{VUl$ zC*4J2(n8%%R~WKDufq3}{`!i9nvqFXm`0N)?kxy2YQ7k$>PUH-MS@h*;78uIqGQfK zfR4ah1|qG8nWbu;8H53zT4bC0p&VZ-D)Qee(U1+RuO`pawbVjQ{Z{5-H&lpnv8fVt7pG@F7^P!-<~!XhwgXi;}-pM5+$V^T~aJ zjmPf?${pOy3&bkU<`@bHpC|~IYj>IYw3JIi^lsa~93)0?_`|GYhB;+7uyUYALKXvM zfpeO$@T&j|tEMkJrOdVOE$haaA)qQMfSRj83x`Pl6Ty%-w>*YB4_(SdOhAz-ZoH~R zbx^CM!~7Kk_VBpGjPojRln*AoT-O9*G|x3Uv_4Ak;~NPyoCKwxL-dyQdAtdPTebj3 zuzY1lOmuGT7}ia14uStq<}xud{YG(jU}D4dA<$T*542ml7Tm^8Rl~WilXWP*F2s6? zL>B19?mpAbvB3Xe_$sjFL?@r3gt}f$|%WY9fK#$FGa2p)08Vx|Y zJy2Ki+(poAcEVckJnGEaXp;mdFn<3{UTg$TN&Lp~(tP4Inn3IVj3mQ1wmEO%AhqoU z^(Hgcpj{c8-MFl;l&aOT!I*m)JgqsMz# zv4a4sB%5hStyT`~qLov$E{%RtwY&5K+*C~L<8DWCxze0-^F}8~#4V<#T&1jhSp5-}agJE6YRl9hWb`v}&3x%XV+yC&UhbB( za_WW7vlb)Pu4zvSA}%*+cDq&(CscF|qe7^-3IGVO`|4Ft&3-Ctjo z87$BltSq^7M(h^rV`zwj1ds+DdIUXAjwJZ0RIaa2^*&hP!6sX^XoF6r!(367f~S?~ zSKRrAPLcY%JxyxG7N$LVVi(A%+G259bS0?mGZgk&dCK|#>BhkeRziRdX zON&gKB=(Akw9Z@KAi$xoAiA~@jVE3jn!gE+QV8k$i$s@9|1yOay)1F<-iEmEx?#lW;D5hP4Dz6Nw9~b{! z6*`V<6eNy)Kd==$ru>w-Cv^Dd5U76?94FMHrke7p(J_B2N$Yr4VcoWf%Rq1cXe+mf zO2A9^FlB{85@(F7zN?k!*L`Q!eXm$^8^HY`6!cye{F-WfS*;9{WDSa(d0O3cE1Jkh~a!_q)Yr^AaS5bBNYr_l3Fd%}RtcOzBlm56cOr&59 zI#TPhH{?q57BYBa0h#tA^cA##&BKVs?NUJF6~I&j3s-~#||+Ef%Ws#Ks1 zL82bd)VO_v9)4vC(_)Zh5uAGH)7pUsRg#$a8}S)DpFPr~J77b{TNn(ij}=U5XDOQ2)20BC@$1^Z}BlqfchWFV?2Y66(vr8LJ!kusC|8 zli4{w#;z`6YO|RN(@-L?u-D*Sea3(khAHb}^R&v}I zDK0GDMq^VO+n*r)C%W`)59}I>8mK4M?dA?hJ{q%&Z4ASkzOCEb5-No3Qh9Bd0U{}J zB`eA8*N_g6FhO_|`lkL1h=vK{1%b3jqFkSWr*xWpzXI<7R6wi0$Y$Js<)Mfw3{fOi z)~8T@i#H*zT3Fi~~&VUiAnKly7^gfvnMqPAf?)t~Azkc^rP9u^KnP zDJ-?4mY@5x)~*s%>h0DhuZ=s<@XuE~SXxo{Lh!5cgSMf>#;T86GGMI*{QAlLQCZn= z{lax$g+@S#Iwh7v`842&jF{d&j=L%f4n@>-G$wBdaq4ENJqY}@JGd&Rs)?&VzMN=I zEb_#LpVXU(Ir}xmPXIwbG;%S9?;!cdE32nOX-pO7Eb1jfJsYz9a?1!r%5T93M8%fj zVeH=vKFclBwVCWUu}a8`CLlzyIB37YhF#exqux=pxOif+c;_r&rf#N*UL!@q{82m8 zu#Pz-GKTR(maZ@RcxXGAg0sRhch4N|q15%az#2LxZS_8%E53as2<=Z|X{J~i!e{oN z32TMJ_9nDa0?Z|O)hr!9+kR$q>Y1trw$+onh~?%h&#}^07an8rtEduXF@f6J>^T+MpikYsr0X>DzL1QvssD z1QVEmMDV*!?$B>AHj-s4lJQ23OzAck|5*s^7vz?uaJ})K9~;E%jvXb$_e~=x%j%1q zn)tg>V1lvlQ568c@3Wm~MX)V%i*=$7ZqwYZgHuChAv7Qk>CJF-BZ;7xt|{1w_X&3|zs^VN zS`hq3ZQB|3xJYQ=TfxgLM=R#J;s7v>^Wggg((jz?xbxQs{!f*n=6BP*DTtyL3%%)@ z2Wtr@H+T?BZ9(wzC!y2bMpU%7?PM`9Qdz-yN1U4G22;Al`=)sno?M?3N}U&P~tE2~N!3h$x? zs$SwDl>~JTQfS_S7$+IRvW;PQUA5}M>U2E*` zvN&p7R$=neLvig1WAe_y*aWk|L(!j1gRzUi*%J3-yvIiCvEjjs>>5l(HsBK^(x6ef zyG5p#vk{SLOJj0^*79>8K|-t5%o6m+3C=4IxfhG81M<%NG&mlCBzOUnX2Bx3gz{l! z95-6PxVwkHzaztZzDbgSpTI|Qrvqm>)I-oK?`2CPi-4m9^YA5C^pHqht&Lua@&ylD ziFshI*mOPhyoT?<&5{kEGb7AA?`s4-9E8=f6#YB~eQWI`Ld+Gt4`2k&mCNGxU+4s$ zvBfuGw4OwD29)Bd-5^3JiHA0@sTj_q^5OlOxM9dhNb!l0fq@meBtUs%Ydfg{(ozfv zKlSa65c|7Gma7c=Dr!h!%-Dm*2w6~fBq33w6~x$UkWPzNhei&oXCo00eJB@9;4M0 z1*qL)t3|H2QjXSygb_kvW4%Ji-N18hgbwQLozk}g81ls+@xHMANvB)*RK&|Dbh5}K z3PF{NA>x~YMvMp4QTh%P)2N9p=Rt)x`-r_D|E2>1m<3Y)gD5|8glMs-x=nHQ5nD=4 zO;N4eWT21kL2zGBeq8FSX>^|KF z?eYA)zZ~i$P$eUzRE^NAOhCX>Z|ro$C}v`jA@aZ?PcF)|fZ=muMTdHg^v~ZCSv|LC zzYhRSpr|+h0paut=3C35{{EV(-6m``Bp?V?nhSnGmuKxvaRfFd5?<~2>ZO zwYG-tAHi9u^_cGBUtMv|R z{SeyUMptl?=>~~TgZh6ry!Vu?cmEf{gCI7nlwV=)yR)PuDfg4jx zaQ`f)IYa2s&xq+42;a45vFzry=^<@y)>9`mGL>aOIdhHlG{ONz)UiX5PDnhzieuc3 z3!Oiw-d&RL5DXn#>Ao6=(|zvSt?^cWDdM?SBM9Xh#!Y7k!zDW7)eONC<#79Zaq1;$ ze*YQU2QZ}ESSZzhO|oO5 zSUIp%JHQ!ggNiNy2rt^>@fTBtAI~ftPf9 zH(?RUFF+x?h~@NCNjKh8&Hz`pcyrJQsDDsbh^CR;Z3}%E0vpYyW2M4F_}~tq@8%al zWA7~6J9Re4*_>iA^HGI#7PCsbE{(;@O91H{w<38^uk^qRcB z#aYT1Bi_>uaRGTn2EzLAyXA+M^AeB@luGQKUynjV%ZDf+0?c)GFF=keJ3Be;-1NAo zO3-JUoOgaJle3`+Dcw=MN`p8~*0+Nt{!# zfW$^cQPcsEET<7YiPaUYkBp`vg=uJ2n<#Yz$*|ZPd4*(UBCM0kmebqaC>#m=$@cp* zIyyTIIYaS^|_#e$Pzv7W$@s=bTc< z{T~kkB}eYiTSE(K2w~{6*uzkUzWaa^T7*D}e(9kggOhVo64iDZzT{cxM?e%s1b_`= z&v3xiy{~6-5yRI=i_?{!=JTX-M6Z-;-Oz+4*qofS{*1cRxp9Gs7hZNCW@jHK#+ssdzB#Bum{i$ecUu{6uWgc z%jNneD$GzA7Cl;H#0U`^y=6~UT2`nS8hWhY(H^4%gWv>hDl1!02Xoa@$~yo~?`7ZIoua1`_(bY0^ld1RN?&m3!~M=po6MtQ7Ox2<^@gf2EQ%uQ zv&$Z*7#RBOwb*vnZZGwV+_v{)t&O;?(J4MtU&3bX0nY*1u0oNxmaEFtt& ziC=D;#a0sfD3DblFZiyFMs@t4u8OiMEk21Q!y-o0;*(fF0J{Vg?Ybh?(4sOFu#AOi zu8XR4?1@At*geVG6d{xqMbQL8n1XY&%b!jGYM2d0WSYR=zP<6U?Qe+Ch`6vU5sZ zI45ly`-bg0?8k$i+%>GT3w@pTc{Q2FideL&&e(jqJ3A|2PJTMQrcR{JPf(siPy%D1Q=l8~5TxBP<)d7WGxhp+>J9Cg``SA0ZKu& z_2Mh*>|CfIt8DmQ=Vw@hPg*5M1q}ulUnWCsEE&pTv9%ihJ4f4qnLY#``o22$zJYt) z>~=0%GE_*sGRSc_LH)v~rzt@;GyrqyHj-CRDY>EMPI9{3SwRLjUwCl@P&;QqbyED! zjE52s+7+>krb5Ll!^F&`=}U`Oh^Fa*&g+r$Itvza^O!6I2-9<=$3x8y(v)tF5Xgff zxgmsbQo&+5uO*724alIO#n#FzCgn_ySIeTSL!51$6cw9yN4vwp>H0CD^j)7)F4YG(t2-LlGjnQn6GGs|&yh z>rlbzWSNk?dh)Y%Ac@JpS3ElnC8w-SV-lFAXHsu(ioBR++3q)U?fI*v@@o!#7h*0H z3Wd@XFJe_jVPbY^qMV?&lWr9HyiK`4-nq6zU$zp9P8oE>Komf23a)><`2ZdL5NdGmxf`0!ZeDk!qowxuRRb8Xm@3`Rf24Fe|#L5}w% z2zK!1Izbap5Onb$EW4gkq+pU>=;LT-!N!KYm_|_q;+<<;JKBi z=g%guOzL;ULn)2%dHp!_ag$2WWd)5r zuLuG5*`xp|8E>YAcM-8!$~%wH+M6c&cbisec-dc>T#?$Dxn55aGhtX@YxX zMrV9b-x_8Xk^C38_$1tf0VPYR|84NkT@*zFsKDkRj!ZE>4PTB(j>KZ7x!|-k%+R4l zthzSw%1&rhW0}T^8HJgF^d#PDzMPh%hlB80j)y)Guhm~jbbyk}mTnm(Q&AWVL~9g$ zjkWl!m$V0;t*m;wXK#-3#YK5|L{W5tMO7i1bzuR+4lTWbsXB|2p4PK4fadkcNtqyo z@MBmZ0}rq?A7;m1jG}4K5ODdgfr(m9+7HDYa-KS&og8Rk6?I)S6CEwHS_}<+IA%VF zkm;ftiyl`5>CR$9?1~ud1rlS)Lv6n}2%ppfl=R)RAX6Iv_Ftd8v;tS!g>b1Z%|~@z zI*XX4p*GQy5#qP2XWFR~%TyG`Qe|;d;)b5iKHA}kTcTmd1JI=CG&|brd^w%fGq2VTmgud&kND=znci^d9!!A#*Ief}M zb5y4HT=!n0xHw>fpQRT?kp_HfL#7XX?;K^$uI{J`E){$K+PFV zg;f=+$}~;Gh`}a0L9+rvBLru0XVMw$k_vpAA`o8TA0-{B~&(cpM>aILqmkr@~`)lEqwt$^i57~pO>^F^>;i=3Vk@4 zrm3SiM|sY#^*U?s^u+i!$-8>f26R_a8H5JOvJ1|a(}9Dg%ucp%6_oAfS5v0?pE)IP zvVGW}t<9OEWSUe%<%%9!W<^Yex*CfZ?IT*2X1RtpSTg?Rt}{9Yn5DrgiDeR^bvTy` zeJ}N7S>b9e(|m)@#Eog^K16bLfpFug?k0M25dy?iBE&=@L_@4ODA)Dybv17`XOo}im@4OAeFYiQ#fR|0%R@uw=;tFco%DR%_gUM)hr{%6}C`|^q_rkjv-@N!lM|Z%CD!tCFVzV4aEtXxMxK`RJogPXn zs3gD=+ou~J`n=9B2BE+cJpB3DCe?|+tn#M~beJ3%M||i6bhI>Av_Kd>fmmJfLt|YU zkj{9(4}I?ecqiUGo8L(TM<>b&eH@jXtVK}-vkY}L3JI1)jOMy%I$oC+JtCf#b~p;y ze_rVYxKJ9Q%8#cbuiWTV(J+K#ez3LOPq>=xyU?ymyebbAIQG_wMeuuIX8~z&50+S_ z#R`j=$^(6A5yL1>{`M$8l1gZExRBIAn5I;y%iESTcKA406?J8qrnxM!+BDU%GqFE3 z6_M=sdgp~6ZVue9pr`7NXXu0Y+D`WFN^g^rY;lFo&CP|ES9?%1b5-iD#1Kk$&A}3DzH019Kfd?&#_rf*AIO-Tk0Sz zfgolyC~NZ|{7Eq-;1eW2pzPtbZ&(S?BylsoZSo&-(2)Mnhwau+p`L0fEqP0xN{~Yj ztU`HES>+KejlH9Z#@-FB=z*y`8e+6dH?(M~D{dP5rD;qwj2miGQI|(0wFwkFq~>br zM1n1<^=L>tVo<4((Zq||Y$!`0htf6RErR6qRcw zEIdGC#Sn@}_7p1g@Oc%oz7YS$a zb#EiaN_9n11Om^8o-DQ)oT(O{)ezIT((j!21dEpzK{^B`WtF8dDvBZ(UfzL%f(On` z5bdPj5LBJAlO5`igy(rU1}8Kst5DY^UYq~L@0Q;)fQ}gIs!*6rJkbF;Vr%6B8XK1* zBM4YypZHcK$T`2H-atl^iC9AjFAb|yn--r0#uowiuRuR1rwdGbIU{g9xM%)b*a0>l zK6rotQDQ_CMKDkjuH{6UM0ECkB5na=!L-z#wea)>R#8{BZL`zys?WTFIu3pJv-N-Y zV1OtBKmfXl)YcWNOD10RLL5MR=TgTIVxxqJp89`U+0(-qc=r=#XxNT=4dY~KuNT`6 zg^$XL6TpB*2&w%k*LLc~q9{6nMWZek3ZxPxc?86DhiO82SQ=6un1VUndpi476WU0d<@uJd>&Z^kZ7 zQ#k=T#XI=ChMzfyHfTTwiVBmLVBlotgg(pVJO|JwL7;0nQs+uMv!^9XXQ#tq!Y1=D zfl|lvMP^52S`ZH1aXp*lbo6)hzm>2E9j#8N)R#E5bczN50003q5C8x`U|=vP92OEx z$fTNm6o3I$QY?;aTt*@c1!9zAh$&@8L*8yOK@f3m1O2 zh>MlqUQt++UUlJ-pg|E(Gf4Ig{Szz767Lu-Yemn#m-Cv(z6iD7MH=&mbst>{YcmCHxr;T`gHsd)DU~v|Qb0uvn4}EYEf6_Xo4-$u zrCGQnDT-adNeIXRY0*BbDcLN~OKgL>r_ghK#C|dDQw2k3M7NimAdp6PDJk1C`rgGZ z+({1J#IQj{hv-*E-_Qh$G_AVVDknwisnsh&ki1(4K+p8jte9-FkrtqR4juI-knOgF zg4`;>-x{H@Y6|+m#PJ>zJ%N`OL;@xoxS3{pUv(U&jd<-zS6DF$&-PBU(Fu3 zkKx$}u8RVkhzfB+G}IkZ;m=`-)0e4JT9bjJsQVeqP=+=8GX5$UY>ABQ-{Dvu zVq;u`OuULt9*T$q2t@JFynDU|kgUVFcU<{R>O5)zd+QipGOV>n^U$&*IYeEHkMb}+ zvavj}y8W<>BlY90B#c#?X zNUm^6gVIxja+a2gFzCT?_(y#6uVk9zO5WAK3LqlhaO*Y#Jdw6mz~=m-HA8cS*Wps6 zY_o&|uB*P``^4A+WChuQ-4WPDdyggf!I!`_!0PY=Vz2xkAuJ*?#@D9(z-6-2AXgwZ1w|LI%c84Y1W7t6{C5}OPeb4@?Sj>b5EA;c_p70@L?CVqkg zrc2Ub%H_Ir=|1G{rr)9kjs*MliVEO`8F+nRQ>e(>Q~F{L*)Mvr@Beth03PU(0yJD1 zSLPKQ=_89M&Fq{(lgh_$HLu>uD67rq2sK?eRE-qlP5!TRQA%nW2Odr2FN3mM41F4J zQ{GB%859ZRoDs-BDrHTJa@7Bcdd}p{1w$d{avv{Y$aCAh!|Fm51uh#buGZS0w=U&5 z)90}}bagS<9bDk=F*k8^j&A-$cNFdA>+Jk$67QS0*?X2scx{;?{tnvh#9Q*?N(``I zlQ{VUsfl4E0Zk97erB)NlqF}uY28QVaRe5z9Wlgkru{8YpTFI58`Yc(Lk}{Wb~Vgg z>2Rd8?tGKJRNjgywsX6#=Dc!P=r$dl&H$^4V{GyKqI2`7IRLON)PG0OR9t#9y&spW z%2lItPDn63(F|F9$FHI{3SmvqWGqkigljF>QdeV+W%k2xa+u?Nl%<8-HMvPH-Z;;Z zm=~d9ns_pKC3Y+y`_QzJXX{aVV5CK$VXN(zk$qsKVD9+-9A}3o)f;kgc%HNHkeIl5 zaTt#ZFm3f@=gIaZ zeR%WiWrBqlBnjKyVb0@Eb%qkupNBQaJd9d71e*dCIgayxCmJvuJNFv#V~N(`N_fzs z3*9RkWWoCzk0Fbl$bJ_4z3An-`i zPgl4nZl}dR&Ao#8f=~ddp>mJ^JCE8e*&aY)TMdsDhx`BowZCw$e;XR_L)rv^C4Mlp zoMgNH&X}BrM~Rhv9YYl(O-WRlG>~)P zvc;T|n(5G$oI=cz^(=PI(9~XDO(Q;#`sSu9L9friWeXXMpVi`ih|NF7IvqtF>X5Je z2iQe$m;R{LfOW@GNU&mj2hjM4EcS6UN3ql=N^(U6$4a9vRW@M1AQU_G0x-om_bsr+ z@~u1@fbB!Pbuv&(_RzF~%T~4au~6KyxZmtrm^=)E00t$%+KX3a__k6E1 zxI+j&!c7%ni1dGzes-aenph;-(TWYIw0)3E^sl94|O%0dX zshpkkkjVg+)2bY;9Q2t{$x?YnF^2mseGnYud|kO|c{pR|@MQ_HW`_ccl0|&8pQ<5{ zYE~(5)vkYZ8iCe&K51ys-XXaE6rF2P1@|6L9dRKC41^d959!rh^{%+8Pq%#S?KsWX z)(@)m6;Z|+?Lrhw3f}lBJa}m`CIra{dkudG8rmK%l4-KangZ7U8PrX&0-47}a1S)3 z43in|(Y98V{8Tr}kp436+??sd9sad|2TML;~$o zKu)i$0W>TU>k+)tJ9L2d=n)uc<>etfF_ow#O6PqNeeV@aSMd;SnVZ5(NNFQwA$z)p zjQs&Yza!~>1zB$msIX{hjYeCakOx>&^NJ9nO8tqLB&*e*Vb5WRXC{X+u_Sj@0K)Fd zEfl<}xeLCBj;EDCPLaUw5P2S|`nF7-ru0Qtz99V^6(3^UaOJqIe}RM6RAPo_TC|ZN zRQc)0;}LX|RxTd(RcQ|lDB%~sMusPpEll}9!vjhb2YmVq!WQ}cz~pTl^2VoytKuoi z_28hW&_sc$icjF&T&x<(r9(msveEe+)))#LE1ara0NUie;zyC~*&jJT{7S^_xIZF4 zkY9wxwe#V^0KPUl-TrY;bqEryfs5_FgMGE<_yiZ9y;woyJ;zcYr2KOG1yn{CxZkOC zcb5?nI~ySYb>fX7Uv)eNOgCUU{3KiGjBtbuf>O~&1@>C#T{<`ayHS4S9eKaFq*<;6 z9}VL61-WV_Fi(TnHie=;uUN<>XTBtS?~=_{I24yi2SvEUnm2wn3Y@ZOP~W?IVO-Pg zE)LiYp6<~wQtb1E@cj3L1HGemH9O{>$K^vVIVX&`FYdLQw){>8Q)QoC$U!5e)(3*{ z3h)}CXC#KZe{n4{+MiQ~IlYaYh25oJ$CZyYPhpc{kaw1wPy%Wd>WDS7oY5Kp+@kys zedF|}^aPw5Hr8{FE3wwHY86Bb-jKIfYPShu%=c&Xh=eTyNXv-TRdwk(RpN+fj@PB# zTn409*u#A{;z&>G3Xz24Is|KnUOG&Kv-A9w8A*K9;vA;-(Ug3lbeM@`i-XH!$<4sc zYnOvk*7JIZ7%M1FBAG%UeLa3_3Fwho{TLwvZZ%3FlI4s|)HF@t4QOxIl_}Ix{VP~!IQ<^LeTDnMMLIg2yDDJIaAMxEmfxZ*AV>1c8lrV)udzKRU>Zj3OSqb zMd;gRF_GA}o0&^6z(&IZ@gtXL1Ktc^aEstfF#aU#q1}W?^X5vYQnFisb_5_ds0MOZ z-mvUFil7mAc5*4{B=h&`xP4Yfq=<|_nTndDMk6ko3}CM}5*ssB4N#4NC*JGC9Oq_) zVwX#;Rmc5fm=HjlsuVDuy)WSY8hVFF1$Qg@m&#pqroM64lvF|xvF>svsMWfQWM3!Q zP-AGw@RH#&cT^P9uG`QtRofY)koBS{^uL^4pmD)*BJD?8`;IRvSGc(6(Rs2Q;?>+{ z1x0Jd8gc3mt!NWg7AqFjNPd zCMWq|(uT4-Ef!%t(|wq$<`BOmnr%l?YO)5exr?nA`Z#eI#TI-#>H(fIrLZ?HonS$XM%#17_deYxK`QoNTT^&ic^7+zD?T27E^L) zDqK}#BrCV&L^(1@1r~t@lmqOb9wjo>uMc8KN6H5ZBiWJeW zfkAiK=`k3eElF0R#MFXftvVDYG|XLSc*|%x2n>uSB-50!9MSrE&2z=8w?Lrim2-~; zAxE89+5KtY*akTe#qQfp;P**-zVKaYgTU5jgcwIi$RxN%xQ}Pk-OsNqpGJf{7@21? zt4oV}+^;aswW=YEfP15(omu0@~f!Hk=#b zZ{|R%Ko61jZQv%^_g(NCbJA@Gy70^%*qyKl;h$|qJD|P|FCDQvyzq$*cO+QTE>w4B zr`Fh%G|gMx5aw0_0?P*EJ% z=2qwm&z@s$KQekR+{Eidl{kkGc~agTi0NItSKK6Go=|LZx`V!k+sW1kb*f5WLJ=I8 zX15Y|k?fzaTA1<7Hm+iq_NhetFR=wH+p=M9Fo8DD{lq)qQhCt3%CpQww&SWYU1EPV^6Lf=@R`S>8th z^c|_lw~|eA2qhP}nM;?yIuyo_`6(bo{3Jw34*UT}`Z900!IeC-JR+U6B!PLZc@yOe z<*TSWCtqJ?^+&FV3Kv^-Y9X~4JdNGB8M772+iebAGV&3Du%yHQs?>c3phk0c40-4b zcWEe)nrF`ps?W%SZ#&JBWW7PqVwdB`isCm}DKz3gZErs^$2kcAs}*yycVY0giHH{# z#;NgPRx`;Q8W_JR2;)9w=Nc?8C1okINy93X+*p{46dxP zFR>&02S<>UTu^;Mtuc;}F~ zd;OG8r_akCL)r|Gz)&9yyU7MpoN6n+5qU$Wj)I^*1?a9_T%hIek6>JR%9wr1LJCNW zuq>vfS{kD8#0CPEc%v*GxZ!?SYDeswqfqtlQv_S}pLs2mhXGE#aWk^-$#*G{*}fOd z1Kyge^x`7s0FV^C`nyR_g}E?0gB#Er7zDqUF>%|0zeS+3BqoFluqCl@d4#ddSL}!R z;e115GQEY#H9y1{O7&uHc$eP-E|819esoKXt2}04jBX<{Z3P7%*NM}W|LUZ=*V)qi zE2H)erEMCH31qTrc2>sH~a%GmKm0|TCE2c zJ$;HXXbJ^6ngmCWT?PChRAN{1+5H5ZU<;iP(+k{);HTDO0&ou%S~xx3ikq5clgGkF zAgB07t}6iTn|IiLBEWPID}Zyv>8{%n6w)Mu{1idW4$ktEeRULSRgOp43JTB8owc5n zpaNr}3!`x}MIDRq+Y3~-nTCJT8(@$4?AN$v0_|?I84ynFy@)9wW(I8F}qaWXj*zv9Zq+`oSl{y6OEgA~3{; z%g!DZXG`Rl050NIMrgI7SfS4wbj~U2am2KL1@2!LFL`+nOT_D(kSz_B{!y*a?J;jP zHPf2vUc`m%fM3d^N@|u01Sz#PU;#?_wlQO2TJtj|b^0`^9G(af@eu~{w#`$)PgQy2 zdL)BZgK~uNwXtXs{-B9{DUk-bvWQP9(L%XS5tto0(1&3tb`mEUye8+ z2CT0YWl3sCqm=bYzlq3fIXzoITfSOx4CQ_nP_B^OO+ zeI?N6l8Bv|bgS;ude^SXN>(d>3{Z9uAHU7v6LttGSezpmk$Ag?&9XlD?7cWXNG_m> z9iY*Utz`KeT4gu$-vLRVJNrx0G>miU4m!ZESthIBBN$=&ot4H0~ou7EFXJMw-^t%(;nRxFhEmaK(u`0JK8$ z>qX)HUK`1}HWL@D4RC`zYAj=g1RCN9xl=Pxkp4*3=HpNCZp$f~X>w8H0yTcdGy_w- z1`)CL*|}w*2NaKLGU+b=^=`l|A{0ktur=NwpYUce)Zw@Q~EV_RSP;N6l;M2c8- zqFYi7yo&;%XJM8Ot&M0IdmjtU*meO0ca)~p3jl-o+FBD>TO#qYS<43&1F}wut5o4u zP3S-Kqfd-MX>;&ujPz)TLIy**z`i#L43A66sKdn&f1{Tr#YtnhXRr=q3F>XemYm@( zFg1dMkm?j2{lVb_fdcYlUWgiLNQfI)Z5Au$p;RTAutsSb<1ZjxA_<|A~D&|n zKzoldV^sAekEtpQi9C~pK5SD}Thek0%`{LOM^`$S@AlK)>G?YzHt&LUvrVj0S4qBa%u*GKJsh)_T zqT+_5n|o8*Hp%~mKKWm|w8TQMRq2?wFcN*}#JH~BiU zx(5AG0tyl%;4m5EWxIvaKQpKY0Yv;@i%P?T{y{hM0z<9x8S;(`FChJ&cTng|=As=C zf+94#%-tqh)mSd>iXEv^X`6lpp*B^vAPkMTi%NDgck`-<6+vipKsiI^w)2h$x==8P zg<|claN1GeKl!jvG~QeKB!Fkz>QJt?N5&Ynl>SO(m>NR^O@Q(XhDHCufn~Q=hp+t< z>-FKV*j%m4fDT$kP$mNKcnhEz808nSg7ln#-C1f)+9d*yp@jv_%xPHcmB2w7eve%A zfk)X%4UsQP^!Y22KO&e89j zk2<@v=_*g~%cTHomkqpCGudYT1pqD8nkxV)!WJKcl4vBSXBf`JX#2~aq3-EvH`pdf zD4?kbB!5}nrVu0%HT_9DPT}J_417o9LbMPc!uzBKgnTL}YX-*!-n=j7Cid#n0)mcR zdU^}b1DZ7O4hDTnf`BvDY6L;(&3C_tU#_yU$trZc5h_}~Om#^*q2rW=Ixtg@vj#Ym z#nOCAZYU?dgPR}vsw@c`D1=rYZ|DV%GUn{ZL;WY=$5CDd1M0kU5tCO83eGeA_A7v* z(g6M%bQK3J2kxu{I*G~1Sj=ie&-r?$!=ICEY2U*lWJwNr;Qdxp<+Nj%Y_0naYWQ;m zG@(XVg_52P6f*laAFmo?Hb&Y3FmzLzVLq~cq-c0WiwPc6!+ssi#+3cB9lq==jBlUz z8nKRQaXJqJ)ZBdX(Lp&C(6AB=M7IPe)e3+7N>On{>hqY1aSW-@<=pbra|4LwNb_|a zxPne(4@=?Cw3=)1PWi0rLMZ*>D1QWKm)9p@H5{3$HwCW3thCsBr?x289P?`sdJx^5 zG|BKuQha<(+#o?yTqINyQPs{920s~` zvD=0mAFgCubZ`XNU#wC2#Ei&{vOGMUL&`R;__t&4u_MC2Aerwf78*RN$Vwxs9;lHj z$PjP%KfV&71*c0pq$p&6lTD^345Ay!IVS-&iL7kg7|Obbkpx~+optCGTU{BvS_eFWAD>Dj0g2ZPv6fZhrn&9{7T5Lx$o4rOl`D9u*Q57RJ2GD1%|w92mC%*rR-fuz zY^u5>tPYWz`iJqpO(f>HW2FQg@btGd01NAkuaZCh2~jxT(NIFcbR( zSD?NABroY{5y(YOE#*ShK#DJOV<{Xpd^D`u49a@0tK8>&%e9f!U#4@vB)00jT6vk| zuf`}%;f#^k4}9%T>jTPg4qWd<7Qwe<#qsi!%CY7Qog50Kh?=aJ8FnX6xIuj@KL*}a z;*P#v;Vc$v6a`5|9roa!BLd4qV+1&X&6%hv?WeNiod{Inxh?6Q_G5TxTsoXND~>L<^u%!O;YM-lV> zjwY-KmV>P6Nh+U($iLSvf5z2BA%+PnDq=NRQFj3uF>jMqm>)eC1cr(Dt0pE3m+LYD z-Ko%2nGZjy;!C5MZHNU4B_bi%I%_LiB3Q{$c|Hn2gu8I1WNHB{-sxHU4Rp9W>`}Nn zpA8$h2WWumr+d3m2&|rBCOwzkm?fjq;!Z686hn~>Uec98Vi%AV)s~G!uK^2m0Z+KP zDM1+7!cDb)XnX>XpZzuKq5>A|j2@=EoXtLEoBsARz-q!A1UZ>76WW~CmNKd{|6$Bv zDFOWr(bJUJYk$+*h=3v^O+S;{b= z5q+Mt{g}Vo5uw}b3=mq6goV8!*h{hq$A?@t`uGNFXRZdQnNugh#v`CU4^?wT`fF4( z)>>ylDgl>%jC7#}D7l6&+I7o%iMbB(i*A-X>yxbiVsW5xuCPdG+fbLtUcm)w~YXZ`1 zp2i~rER5W0HuWffmDyBDk@F((n3zSDR~ZrYPT>dPLckyb&^Mh^D|kT_l@K8HyMNJ= zkCtYxQ9kSlC;oLRhDkb>1jcUU9u00D02)Ff#1^L-gM_rNdI+LFjm6WYKQ?D5HZpGR?vW_P)^qf&GM&7OMo)Ud+C z(<5&AC50+2UvK3!pAePS_M#dN7{LwzQMMWVh8$9JV%XB#GQjh6ZFn&@3QuT;A~^R$ z5>9%QKrvK-ef+_Uk}(b4!TZA+#F-k+B&5)szD-(vzx71s9!l<|%DPemAtwM@MWdIJ zpONFAo>RPi_QF@U9-lVh0_U@B)($4x1!ShLb;5)oAuWk7dyapKj=Dl%RAaXVb2*BI zW;XV{(tTJ_&U`8O9{gg7SQyXxNqxgdsM=sL8lEU~t~SwxY@VNNCfy?p_{8EZ+7+)& zxd~bAy@k=MiZm?oX8rOxX%G!R5x+-O^Muhk#-q6`nzIQvvL?FS8`A^Rpk#UnhrzR3 zz)V8~dqIPWVgP6@h+MKKy#m;cwe5gg?<58aZ;n4tkh9Efa572##q3PmwGy^yk`(e> zfo{1*sV<~6O}$fb)wB8$yU;q+`Y`qsS49Bgvz^WM7Xe0$#`uS%kh8Zmpj_VUK}&gj zQo$piidn#9&HyaC2r*UXWE9H{e$0oq<^W)4HhkSWDLVii;^%N9oU& zQVSk&DsJ42wX`kZ1DgO%0xW4?4@8^tMHTV}cWaq$5yQ?g+6msPOaNkx>cPXT(kWukR-IxvoSwS@QZVi*W+?o9j zY?D5dDTWqb5;1lT{7C}%Xzt`D21!cB*ETgBib9#5BfH_>ngZt|-g;=oVpDBwO0OZ3 zYRf_GS0YKoq!_+|eOb?t3Q&9LC$y<@;(v6kYgD5k`Z!sq1NnP$bxMay5zX&xU0v>C zUI#z|VuGzg-k6*yi^=>hs)5}k#RxOxanSla)>~XP3E*nnKbI&0XWvYX<(jxrM0+5G z*IFt<*YOR*(;yk1R26YRu*Q+h0sH-t6`tFQ%U=P5Yv0P!tPZNV%2ZKS0E^NCgl=7A z-DGLc|1qKyj&S$`cM+pbS$+}`%2~#1kz{v-uh)Ys;1W|<+X670ah)REG;)vfjKUE| zPPRE2R`g)MEVVHYH9CqwJ1DgZzbB@&)*}|)vFz42$)&enz)YNnf+hb;5H>`U3JHW# zljppJ8Z_@rI(-(%t+!mrSeauCppPj*p)z75&)%Oj5?uv|#8iwtO%%=)Iv%AzBq3X?BtuQ8F7!IQlls_c$g;c~`asE~&GD91 zL`wb|o0u+6{uhj0-m5J@8h&d=o}{GCo}R~u*$eXdPkaez5T|N(933%JbTFBHaVPO% zA4^rZF=wn3(*uzFgak(K9mhW5b1u8rlym2;b$3r^BVA-px@5dI#R8v|+|%|*f#c=2 z0o(bMl}^E+YxHo{^bG{W_B3H94Xtw~`32Ku>+E=TG??@FQ!{9mH;rilO|=S#xfRn} z3wL6BajR0gq!G$arcbkIhE%h>g@$n&hYV6m&&W=jxVhR6)W7_57yBcx0tbGkxik*N zvfYhmF?N&^Jc`*|=JA7T?spPzAI?5rESb3W(f^%!SpriOseIR8MlxCDM3O-0h@Hi2r>l0l+ zL`((h%M#}olS`4kj!Hp-2LS0MWSk2Q zq3};04t;`;=S1Cv@G;Y1(gto%Sgnm+;Kt=8sshbtXR>0MSI*_R;tVeN7F0pcmus`g z4X5#qaR<1&45}*Yo2sfGfrkxlo63&o053q$zvwi}Sx@qH%eNfe^mo7{xk0hQp44%Oz9jMmGpi)t9V$(~LrrVor9Plh20 zY4#x*Q&|E~7+Ki!2FWU;BA<)#`S1GygH{T$H_bM}mO}T1oNpE_#L0`TES-+Zrt$k#q{wL&Kdgo#T4vk$GCCMAqdp;#MLN511g$g@v%+8r z=wl(#H^gaxMOv(Gl>ixKZuP1Kcc3(J3}s(;P!z0{m<-@h6f+#8A|S#5)6gTe)mG#z zPEWB_Y-X4TxL2CPg`%Nh!p3a_zg|^Yp=)(|Fe*{^=(j;P}}=L~m?I>=!RHqk#MO0_WMAUulurP=hp+&R6z2p)u%LZnFn_hz;UWG(~P zip+Y10ZP8IZ3bO*1Fk=EMi++jc7XY#734Q5O*9PKfo2frWtlzG044b%C7@iNA@<1M zwm|6%l>_u5)Zw6b>Rl!4jg|AKedBDX%+H1_S7rk#oG=dLaQuvn$a38OR@r5JyK;ry z#+BW;v)Y}rFcY@a#S-(S14{M+Ng5~3QdZ8)Dz12o^K_*scsCECIsB$$`kVZxyAL_%r{&3Q*mC5YLM*y_YEGB3vGsBOo)3E}Y zi%>`Yj(}-zqC6ALx*VlOC(j2B``h2^vbY+JVv#|!CuwLFaTxMBom12 zLbn{raO$+Qjxz`T?<9ynA);xdz=acY8uaz+w>>MBuiq}nG|{oPJG^@V>rw#-u^37;K86iM!^zY8g{kEK7?KY{?qkHS;j45pleAt#Yi<) z$8{;hFB*xSdD%~$T&BX`|5zl|j5s_J7TuGCSIS~ejR-p{SnFIIvs{d!B?0YlBq0F= z$KtiBdJp_%m_NvJ;DI{&7GY0iP&y3@7PiX|t<=CX;6JZSWZn%XBrZbwNdCQ+^G7mB8Fx zKlZtDZn%o2S&dJP-&w=rM}fXeJkoY2#761mO!8ma+6x~Pf6(d39jOMLuPJ)4h^{yF z63mGt(c;~_L7{h~;^f_a;ga|cB8c^SJFuB!%pXzhEE+n#7T6f^Cy`p0|HP;anHk>s z^TnM1h=4Cg$~gr}*Y~Q<20^C>-7y%7zOr1oFl6Z)pb+YN-X;D~{H8KxU$_CXQ#jiU4j z5&=E@QjE_Kltr0ZuX-1y`}QlF1(o%1==3-Z`ypj*g z50qWcU?7A5pFDgb{3oXHC$tjMbFx_dg6Zi5Hn<7Fx|DQg#-ii(aQje2UhI0_c4%M`I2GAi%209) zPxpcgAdIr+%Akt6rn0!e@q=kBF22^2ywNh_Bg;KCj!}%oLgu(Id;gm`G~mK&ThV#r zePnIj{`o@XLKPe5L!&{NPiMn;{p`5xI?aOVZE3aFt6;uFeqs=9lnWR!AmUEe`A{xkh%|_w zXqCT7uP!plFPfp9&nIg*`rrmbAXYVJR>P4=7bcp zMAJ8u!F@DjGk<{(CpFiI3d=FD)scVR1nW)@DoVSaFD?@`08W7(%P-&!eaY)y0>@Z= z4DoWy6+|r;?|rif>f$scriLVTDbip)Zy~^mwX=~$RmmLCVp4R5lP*O8f~hXgz9Xl7 z03$x(mA&?$IQ$~az+oSx^nn^*ehN1F;pDA4p|JKCto9oAg0lub954WBcPeW@!Y6Q} z-BAtkH=5;Tj!q7_CJo~aQN_9pP7BEcEp(MN?Bvv;lKm-2J^fJ|Tycg<9{lwZxLQwk z;(avXCXleHz++^$DeaYW_;0d2`yR;s9=UhaF{moA1% zu}b5zuV>(c^tWDI%s#x+mfbEk;g-;H^Kwxy^g`@u@GBTN>7~UYjoAlvh83S#t~_8- z;XER$?UlqoY==vu>-MBA#{7WijZ(?BWf-IB5+XQ%zs4}W4?yW=bc6ku1uI$Pi05XW z6=m`{p6>|n2}_P+Dl(hQo=3rHMg^lRQXM@&0=`N{4dqKanTJh$Cf`A!yefj=D}}b8 z%mT~~yBr@qWJX@evHpOka~d$uCBRl48H!+!ALCLasFxD9n9i6Iw%@i znq5W_*+sm~R7J&puVPlDkM1!vQ?JGXsdW<)jl9&Rpgu_pb+D`QBuUlsVQepO<%kge zQ?;Z;0AM@vLfiMe6;EeBhI{mypYT=5B8>aF1g2Ec+%a-#StNqkO+6IN&`A+q7+}dn zYakX{n*q+K(Wtkqx3_q!zz?m2OD`1+9g&PiCTFXz@FKQ!=2yQXr2t!|OEnBZ5?agK ziNkja7g`plNC!>ssMnq(Kyf=O3+99FX$a;FK0bmqCR=dc&h(;x2#6&A9lQ{_Z9&145-d?do(2?}$Au6*f zi$<9w($jC5y;2}N?_mjsUsqpLn-+^(@-9{zJYr1aSW+p0FKzb>m{2AS7$@!Sdr3^P z@?~0b>S-+)A@viny15!+)1!O@84*~tMyi+cqYkO^u=Vd;MEJx{Iw{M`P9rhPPhJsX zIXG#m6W~Vf49k12!9N5UgF$01z;=6vs36?^bqd1lQKuY`oy0pD1};%8BTf$y``#?W z;X`UvT0(|ma}tp8>0o#m%~8B~FBWmV(1fr_MWO-T1loXPnV9@c*!HG!bTd(CWKQfN zSw6w^;hTG8vdTyM8cpLG3gd!8ziUh0&D(vn^IGJXXJKPTS@}A z#+7p)zn;R?}zx~7s%8uyi{Qic>vA#GBh5_26D= zN18IV60ouvhQYw3TUf=5+<-uG58u#eG*ltv!_a_!P#xcQEyyHcM48fo1EQYZ_(VZP z?~%XRZ8U|)Z8hsY31R~G3qgF$ex)QHknz^nLT^iemD~DN^viu0;*dyDv<%21+gwp` z4sL^7b6|V&URfS&=&_w6MR(}3G|NFfSc|Zvc2DwyzoIiUj6`Oby+m;}(T2t! zc|wP_$;!VFGjG>J{_tv(aP<0&iCfO7FD~OExu4*cIItZv%D#`;Y3{_`*g5g*8+S*9T< z&yNksrS+M}h|Eg0Nf}Q`eX`cp(AAQbXCFQ)8hgkMqa_*6I(iiio6Zsi3HiAIYrLLV zvi6a6K8-)(s%jZOHRED7lxLK8z3Sucnt}d47kd`6to!$yl7q!I5y59eq!%% z9D!6#FFw>}!anmJod`An{CzlV3n}5Wuj^v<2yLH4R zE_VZhQD_vmzD`p}GnKw+;%{cHz@p8dt*^crpalLC#yCJ!8O3k#tJ{O&_#j1U0{;8K z@`@$aCJ^jo3W5BuIZ&c3bNayzBIb7)D@o4lZvQpuy5!mK%? zDUPk#N|j0I9)L_!Ug`|#DIi)bC8y{WOz-5a&an_Lq1a-Uv>tRe%Ho1Q z0#g$)o}qZ4RR*?hqAvJOT#V0s1O-wA`}hWwc2o#OzeP0bTsZ(cKS?sOcn+N_Mjb|4G2Jdr99{XE2uxie17t~)tnw?zj!a2Vu?&|XNQu9kAmCyd}18IyNb7_xVsk<_4IWm7NSj;9yI ze>se5(AHD{aPrO5xxesr_SPTV5UYV0~ZP##AA1B+oQry&{)) z^X$?BTB#vuiepg=Iw4A_lb3YQwYN8dyCwYeesIj^TDJtbQ6K6IQ%-YpO4>p)q;>SF zgY29iXIP)F^knxrsT|iKQB$bA`~kan(FSJPz)m$+z4T`fifo?j4UqXu8efMdpSp$R2X% zVAjRG>26k4X6RDF(?v09Iz(u|=@$_SE^yc}x}?X28vo4W>Rc%1C{zvGtaV@yE6%c5 z$-ru6YW0Z^H9;?v|~~K<O~05Pyzpdv3O6VzZz&6ocIDNThO;_3yfE=znVDn(3D zu5qCwC0a#6uuzC;=--RGfqL?Fr0GegUL}FE3qe96qrksDV&cJ$z21vo5(k$m;Mmny zRW*~Yi%TX6eSkNqEYSZtvv5BB^mnlP2HSO_V~G?JaITwE{e6U?IXL$zfrt>sukRgG zqtKP3%U{#Not)v{5Lv)ZHouSd4jKm*ad>pTJdt@N1MAxw?RxJTjl|<>Qpuf;{+F_; zILbh(gA%7ez~7M6)}{h+w}6KrqiBv#G$gFOS%ps55VYWy&#ZAxW$^QbYU0+eE4{~u zCr;>fG%kW6y$XOl+s{DPP@<&0^P##3QghS@$9glP0puFDt}0%AMJjo3GAA#!g6Xw9 zc=)@=*`cbVB5Vuwdeu_abn90K23`D*We%TLycV+qngRrm7fuIYrTj)CcMjt=@{}2j z*au~co@j$wf8p@A*EO8_MD2FdZ1rjYl#8bI=v|ms7oF&Fh)KK&=I-^Tk&$3!eu0&( z(%OHMhZLMvz>Kb@eQ#A$YN3yZJBla+m2;Ql(@u0nv^R4hOmNR-mru+yDg+ zm{pwY+2bPRX_g*U?h!!_!ERHVT2Wq5sYG*hPYCD|wjX9B8msD&)`2f75%|Ri>v&M08SgPZa4vyVMHe@2>eFsp zT7Ao+x&`SH!5^Ab1i=jMLKS3UO=;OE4el}{*)$<4y!S!uU5JnF6q7`M?5e<_AfQgM zhiVoA@;C`RNFfe$Y1>VF6^vdvwXcksmRuRtG4_t2jSF$J5|p(73I5d{0OauTS{MF{ z;dmi|%5rMf-7jQ?%JO)qz$!bD(-$F~v*u5T(*7W7%tzYoSujCTR;PR@5n>yi>3%51 zpvv)7hgA*bcd8s4Vt~jJS2Grq9wX z(KDmY1fKE;nfZr`jIQK(!c=qe5SPoQ{Q;jqf97`cwHMXHc!3e-fwxsqBNbX2CVdB;@pq*oGN?Q!#7m zx80~UkFKs(?-FGTV9L56HoK}o_B7i$-%p0Id-9lLYsef!zBkK@I7W#4@w}p8KdU*&am)t$< z=U|=*+AuDZdzUN*N>|E9_1@8If6`{c!swF{;$-H@(5GoKJz#f-b~A&|Pf= zljN3cPV(_jiy`G~Up^Z*3QN{46cYhh&=dY`KU3o-ZsLGLyl}PL z#}KFD(`fbvhm(DckDsKg2lO8VB#+a4KSl20a#T!lENh?xf&d2*88S^Bw6zbpYOG zN>^Jhxe8*Xgl9W35TtRw;)yX5tGeww@N1JYY*MN2tfYpvaZ0BB$_vm$@?EZd9124zn@Vbk}Nx$bNA znLVM>K<|W*(CJWDJ*}|!9sNx4DOsPRQ|;(iaD6<+yN)%jC7CkgDDSEhg;FC10kPY1 zS`5$TIfr5N2uAK*X8w@NdMm9L7LyXwwy+SwSQs?$b~u2mx=F8A+;O7hSPI1`f#j` zrG@``HU*OqI#*;#~jsu*i&_u0Ua19-|EDc6sFh%fvaLeM&0&+9-_U8 zI?|!FJ0OEl;Jrdc}QFN^LR++gB3^h?I2UxvHLgROX3f5RLL1Ike#gA;Q8U zgro-p_Ub!FV%6pr&G_Z2M#d(fAxe+~Tb55fR=`6`{=;e3VgTW-j=jN+rH5KSy|0SV zfzrK(R2>Jzff@;yOkz28v&$3$A0W@jd{w=~GjaS+))}EnX6s(m5d)IIwqWVRT(#oj#mU;$lb{$OgHh z31t&-Qs~th>fBwl(kEiEFhjVmJ&$We=Qk5bp+SZ;p$k#WZ}TPf3o2(i6nruFeg@>! z7#)P185}1`Jn+AIm~}jiAxc+gjyly?yWOwXL4FXqLdBiZEAgJmblYFfO0AXF3DJ3} zF^?gpb>QIr^J^LWVEEIOT-yIB1iFCzYkFM5&@vvGnbc;w$hg^%HB0p;SIUnJz6POR`X8pN0oFQ)Z;!;nfU3#SC%mgBjIRd^!BJqQag*`OY z7n7)~12{?agn$yKFUpMwAa~%;&XC~q6I8ZNuAY-NlphMbg*#8nzUe(hjfe|V0KoHA z%CFyCY_C0|q_A+jMgGJ{3ET*j_mwYUw)Ge;6nx|K+u8V7A@{MPgY2N-38TKBp>|x2 zAT&$vN_OIb8;GZRZmPP-%pv6YHMDrvs|+pCu3@ELUb6$3su^;tEHEO@6DPiHnR*CA z$BWo+ajmpbiF~E{5QHAa50A`XND>i1fI4(NZ_v3|yp7}Rt@_||2q7sCJ>XD)lm^<1 zzSS}?o;=3=6`?M$Mg1p~h=Uf^TK-XAk3C*EXLLtAog8Hf^>+#(MnIA8Hts(_5Yj6e9Y8op!LSp&^C!Ff5rF*l zUW^;on!=}E9%cA%a#-Bc@pxL0)8D>wUtH4+p2xbZO`i~K8xcksyl&z)Yg3F3u_VcsO!k?8 z2aV4~P^bMF@dtmOM`p5{)N5{IDHBi9;FCk^`p|?K&H}I!U*Z$s=w15CK6eCk8Ak(q z@x;YYYo$nCKa|*WYzqix$~3AI9Ksg203);Z$h@N=DG|-9r2vf`U?|0ntV7xg)YI7z zW3xv7xKQSVi*U1f*307(DC1wCh@8T7b7J{~P;Zb9KNPlD4mHxSs~{i80ED53BO`N2 ziJ%x`bh6@Nz{KbZNp1qxA5)c%LdB73_nokT2N@m)+^S5%ybrHj79Mk>|LnUAEHE7;y1>TLswK0wH{MF@!j+@9s$6t z18Ng!?K(>-=8Ls%=c;eHWxnKy1To*l^&nJ_pY9F3a1-$S{lWn39Kj0-3g5#V)C>{0 z$Z@a>i`SWNcG(I7Z(ERXt;;9994?^4tim1^s5l5bgnnW5I09YMA|EbFwya-Z%|oP| zH&Wy|a&)F>+n*U0c@+70h0`11ze>~w7u4Wk>dQ+3A4mXgN89-JJ z-<7tWAB4yZ$Yp^=JZ4D5a#ez=*u@b=7Of_2DZ19soO?dwkO@s=LFEF1g$j}6a)iLJ zqp0h8i$$;M_Xv1LUvynWbx_>afba*CKM=&@Wnx-;i%oKCXc4(&?6uzUiOj+Tzg=i+Bd>XQ#TzQGYGId{qYwQfITybuAt6M)61b9` zUh1ivzrI~uzNL|KbgB`ke!^4?JBtm_5-K_y?FsI8g)WTH)uzU%k5$Ju#u6 zR(C4FzLLXyu7T7^Gj*vmHT7Bm&$eg3W8q+^JhZ@Q@#P&Fi$Y)ki+u z`yLBRA?oC>3v$!P`hYaFRV-dcg@F+n8yXS@1HlG2B3)w*QgDwIpyo+D>6Dv+*H^F| z0PvlgLJw7RhwzT={^E1SicbmsFud*PXriQX9dYbpN;gjM9+Fu`CE#|MQCy@ypt9)+ zIcImdRQ_Cz63W7rG9|>egigOFHq%9axpl5oH7GP8x*u!@y!kHipzY#b{H+D-5jPHJ zL8h6lIW8CQ+|VgcbK|#0ep?uWsKY-9CHj(u)}k9N-?syg0t&}P3K2If zQ_>ux|3F%1;jd?}Waj);pp)3d@cenTo>>XG$(B;#QE+8FTPXoE?>&*_wsZk49Zi!( zvOtHi_r;A7ps;_=fW|z;cMyqMHuF#n?`9`C&Xvcdf?JX=3wWb_6CSuC%2G>Kqy(1n zs)kDZNT1DS;Pqg(fZ>)>{K-AB{l(|!_ZglF(>GBkl=ogqV2vL7Wy84blOdrSA{2nK z+JGg-l)~aSA(gfJd7?K%Nh43#(zSQ@#;P_4=+M~N!sawZ^PZ5TTv*DJ<$K{!W`80t zlONFE?h(!mjpJ;xv>9xa9`R)WryUW?+=q4h&H?rOND+hq5tTVTAunVM19%>PmQ^3X zI!z#sWwc&s5xF}vXs&L}#>M>tO9jiQIjK@o^^7m2*Jh*u(0_iIr-^g4z_I3zK4y}N5u z+IQsDu?I7jxxBA-L%(8td|lo?4Q6uc+}@yh#R#RC?1Xn6uDfy~%`Knkw%AXPEgJk} zR8$9;>;3t%WI(RpNhl6@#6cl^6F_!+=>NWzuVQV^-=yCJ8}n_V7L#0t%;Fv8O7j{6 zo-K&ddy#W?`S&a5x#b%JI@3w(gz`eMDly&Icz(`?)vYMpnLZ0qx6%GmjK6+ND%o} znlM<=&NH^x3m=}9Jci*0arfo9c0ocX@!54RRn~yc2LSbd)t26srpE!?NEu1|8}2egMBB@VpJYsDBo7$Yfhi|i!xF%QQH7?!liWhpe#dM{i%k=;6N zE0A-l&V7ea=o4(4q#zz2uo!RcqWr!lfqU`X@r14XC~P&K6O6 zDOp;mpse&4f@Z_r9P*#5Hjs^l-53Y5)-h_=s>4_*L_;Oc;7gQWHj||31;VlXb^Lg! zPUIwSSzqQBlS{}juS(v*0!>f`v}J(J8!gP22W!bHd2BDfqwSU4uj?>IWD%sphAT^E zPH#6@+EE8Q>{JdR=#jz2^1}0-bN?NXqR3h`EMIPP^yZr8dRAUgF*w*7{2wn6ltuy} zS2d!jKYIKKO8q+m)o(c8`5$Cdc9N)EAV*g?8*f;2n3R8ixR)7|-fObYJ|(_Qo)^cy z1LAN?A}#))@!#>a1Ww)>YKu2hdxEKwhvkQuxkhakCbJS>IIXfe0t|)X2f55SyG!?E zc}1R@>aXUnA7U>7ghTOeiG7PmRc45m3?z+z&ncN14;DB3AUumj6Zt89==!P%ff5Zj z6tG}k1xFUz9UqYD^P}{UVrz=%Eq262QFe2JG0M)d&%D?rpSjDR#QJ$<+$lk+D(k~kv5(BVa`KyHvle@P*s-n!GN;i$g6zS8n$z7XIuo^K5>x#?Cyo(C3VpUPIFTQgXBd#4ug&O z(O!EEL5JW7x(KF-_xFUc{K5~U74jZZVmDu(N`tOzk z8k|hws)P_0GL=BfQA4_amgJV}0g5W&sl|drdO_sS?;`0$`iPya^tO?>*{A>5A#48@ zg{}S=%0oj#*y}lW*cXS^cqpWdd=RHvji2ud); zdAS<^cbOWa#lb|2a3osg7}yDyCBsB0V_SCz_Hh48rAw)v0%aQ+JKegetp38(JVsC0 zL$+Vx?wH)!-77qiWl2VLQnZ8f+wvDd=j@)OhPE#$luR|>`wNyrA@-u#Ee!0y+FmYp zT0DaYcQ(i}CcqjeZ$PQ96q!kv3~~8bii%!nFGit)(#R8HdC#!ckQy?>rx{YZn8$Ae zr=Ot3g&m){*D!?6=i&!9Hr+41;QQN|@!5c?mwrp~V>vv- z6osJtK?CToYujbzQ^Yt!fXjJhe>;{=dw^e5+K`V+t zYf8N}MbsCR%J!6LN+IXPqg|c4X|{`w^rOcbyqHkGyaR~K^|?EmF~F;&({23OvZ6e- z2T!4*aY84twFIJ8myU+Wv)-f28`@Yt5*s)Sb1D5sTHG)Vvsh<)6xDRXYbXV$_0umw z$J6A~ce*JC5xUDWD7&AJmt$BnmbcqgM@`!5#=@3jiTa8p+(L%o+*klBQ-HT5Q&)Kur$$Yz>C< z$o0yAu5k4WPoeHcKx}1^0?G*-s{sX|cj@_=ln9Lk3<=)($a{oznhU`OgL64kCuH+s zgh`R*G|WqjoXm-&nP9N)#5#-Y;~#m2fQQu6B<}b+6U1c?z;b%( zAnF)QS(V{Ew%wIQHT9(F2nXe&aU{>$D{o^bd_*RKc=W;6Sr{!4r49&s>?dj1=Oy|A zh$xIO+sKi1C*@{HBq#!O93LaT_SFa=+;)AMp7E3NJS08OB$=c~`?E+E_k$yf!t2I_ z!M)vIM>uPO5`O9%23(_aJlzL6Dy)eOtiO?U6#@1WO+=$`JzAyA9DBdf6UAbUa69izS=R zm|D>j*+ucZl?DCtD&&k5e3WdS-Y7N;=tYrq}exhyI5fOfuc z1`vXEa@K*e;fQp)cF)Zr=*Cu&E=J;j{~B$J7r;`NIby`MrIOAXLN6$^(r$bLbP1<( zCr}3FafDo8>(@V^yd?jfis@SxIK2UloS8)$5LcPx9VmWoWFahR9W*k~S+H8^(psrC z5hs`kVCXLq9Pi0MGNSCXm%%#Tg_hx+^JHi}Ky>qm{WTB&%ie|gN8tP5!>bSqR)|#{ zY_^pMGWR-tqgo%~S8SAAVHqpDz?ALl)v`B+k5`yV>}B?#P{xq2aBc?_|E<>!3JS}L zBH0Xdh6ZBYM5I?L{DVB(Og5O+N!0@NE(UbSCN}8Zg>}wnJG(%y67}FQYc5S@gEV#H z-M|yL4p~9(6OcS4T0-(Q}DBW6(c#g7D+;eARL-sY@- zN8V3nkXQdf;(*6)ZUBDY(F~~O!ytpaiPWKL1bwRg^BA4wQj0YcI)JK0E{gn z@QhfIE`7WMz?~U7E71Cy?QzK4R`;=?u5mfb^@OW@rf`h}ni(!=4~ZV9&8Ar2SaIkr z_HlF!SCo%4b+*T%%L2F==pdwff?K<1gqyzj;QX+jOo9>6^uYN^{zWbp?SkiYudxC_ zPR*|YCzt*X3N{~bWaSN=q_Tg6ljGTaHbmb0x|HnqD4FgRdsd}NjU4EUrJ~&lyNa-eJCnF^iPhQ~KRl&= z^~BQa6&>sC6BE^su7K(}-b~KB5qeNA-JxrN7~p7;EnC93lGBS{EDl$qKOO)a;e3XJ zwPyOy84N}V8esgQ0X`XhcRa(21#*JGSx%s8+KR*mHr5j&(m)a&OQ{aUlEA1r5^NkY zx={MqMt!0R71dT+L`>J;sU8Z(4$ZSWS-|H9zI5)Ba&H*SV({41Qo9vFKw&n=Y!+h! zlRBKHLtXJAb|qu@H=CiwE*S9tNerGtj=6`Zb&)8e^BB#x674+Z3_IA#X=)qFRMZW< zPek%va%&0f)ye}(+shbjkA z=Et&l36#AC2LBsx%hqm1 z2W;rNQ1@3cYvTa`3OCson&jq=arX)x{I*H*Ta9JCVD)ZxezdxyrB}ewc)z#P%hfPA zJ5~!GjKgZFM{s{3RdsYBM9c8%TLL|Swwo84+O}8>c(-~9pl+NC(SvZ7-rj~w1HPkf zBAeL4_EY>yB>>F3v2&)3ycB%uW?gOQzb?lMbRKffRdhK97d*)=xK;qX9G|61rzx%L z4ds{p8qynPzD|zKmgB6XI|E~u3+p0c2n!Z0bA3w(dPQ2RUi&JxUn0(~0_5gt`b{Eo z)+tg?#;e=ma=n;%t)fo7X`{98;#$}KF2(AeaW7+ZOCP+-jRB+ts`cwH{T&lx72lnk z`-HY101z$y_iznJ%~8QQETOBEER%8Lhu!Y;CrOhkXFgk^5tL9veY%AKw4qV$bEZHu zVD?=^1TJFmq!D5(_VBsb)pWo!J#-8Uc`V{dpaTYAdoV7E3UhccS_^sl5>|6E?NUml zGz7e<6U^EB=3XakmIFZ@4wxvr)L}Yj30#Y|fvXO>#59&ob|_Nyu`81){=yZOg=%Hr zs9!D@XwPx)bez8ix(!3d&2Rv9Wl@c)zt3+)WM_1-auIwRAKC=NKA zUqygo?6o1#s78tfv`~YOJPUp@T!2?xF$@wLga0UdT|P?NnaXLcBV*H@f))ag9n1H$ z@@GDWtR@c@r+y~E*NJEMuO?Fc)d`oHTyQ1bCuCgwq{K2B*a(I9)07?y z{EP^uC@2}LYbtVDnul1O8?NcIpR<D}(IK}i3r??a7 zQycNk$i*B9?+j&ti1dsNK&yr2i%^s{K5l&QY3s}}bZ7{XU|Uq#1BWJ`y6wVA2nz<+ z&Yyh|X$I^s6_AG>$YmmnnW;nhgqVjqhpjzH~mplQ_mB;|wGcYCyr; z5h+@ST~zKA7^45pH3kagvm{d8@VRWZxxjnL8DyCQP4ui4yltEuz3Cw^u()K$xx_OB zi-2excbT~(i)Sywpv+2kT@9Fh;Dz^ z^{g`3P>IQKdLa$)0@@Gs;lJ0Ti7O)H4@#ylIOYR@v}}oBM6C!WU-Avp_F27Cg~^y5 zys;Eiz$KI16!G$#&|1}y3z=SF=DimP7>{lw@MP#{q*Th~wi~|r!Wt=fDNvJ3VB0o+WTKEbLhur|0svq)+IO>;FGq9IU_9Ml}5Q4MDa=|QAiw3 za8h@vY>=!x5ri^P-%V589EeluuC!F!AXGHbQG&4bidT7VhM?$baIbeWRGqN?=$$dM zE(1E%CL%3{17M!H+)~>!Vc9jI9v{SdN6)#*^>NzMQ~o<;y1CJkW0K)mdw~!t%EvX^ zVbar+*omWI9`!JMQ|N5K+M%8EyL-yg8PX4!5HP3fxQ1Oa-g;llTy+82rrO0Wih1iH({B7Vk zxNxXUl`8t98`7X9q3;-zus!QP2=2^chM+!dGR<~pA=vdwDi`=8C$8dC%3~u20Ayut zE>tdr2RE5tra`NL9HX>pn6*Egac&yTqA(ARpoBw>&p;ca_C zL$jXAd~OoCiDey)X^R|ro`As%iE*8A^8^%nH^fD6djlj%s(#Rjf0Ua~y8DtDO6y%`hUNfkH# z&d>=wjU?YEhU?pRNIvt&jj99=jvCBVP`-x2%0s#dJJPz8-%ip(%Vo3X%kuIAsqZDN zU9`r4t2&@dkt-4f^v`E}ePd`ta46t9d5oLa#7Fz6g}4;cXmUdrN^x@?z<5{T^W?gF zYf=Mpl{9VQB3sOd2gSsTOLv)2QFv4e*{^4v2bco4;eO~JlYsm%cIt4%wy}X-Lm;x= zHf^ok)H<%0bw_}92Qg7ru*B9t?Mw#M9xny806IX$zvlG6PLYETfr8;HXBsm%jvE|C(E0q`(lDG`T746ac}!Y&>F@!Ci79w8F# ztwJW>4zm=Do%rSacR$Y3huEf9$6YbA-m9=5(s`uK-MumLJGa}YtA(r_sF7cAcy42_ z?uUJXKSCScRV`0&xZ`9kUDeT7rU4q|W-q5_+an;m|K*+vY@zEpa0z(BkTXw4`<&M9_SZ_wI% z0CdL{-AC->b{xsMhEbT5pBfA%v@B857M_h_N0A7%vjO(Q01P?m7SmL9{Ov46Eu|U# z*S}sTdl3~pfr{!u5qr^$aX|oKzQ%VEFC@8ZHuwhS^lf$857&UjgTgN8AtkOS{57H}@fT4ZmxXeiw>e zvjXI9LnX>#?gZ|-5e7SbWg)Tn9L69p}nafK8CeTG2@OEskiP`la6 zqBU$_N5uz$GJwS!NZYKjBTMzb!>QsazzX4`6F_)JwtZ?0*?*>6sg$}dpVZx5&ORz zz9k}en%zi0Qd~CMPPw2&>|b4u55;Eb71rr10ZqoUZx<1IMU$2X8HrWQ2hqH1&S;4O z7?L=^oNJw8I9sq`1{@qztwB_ksxV{#lApGC4RLC#4^2QLl60hP$2v@B+H7lD8@#a% zIS6@_c;zvp(=Apj_$`G=IvvcGejCB;KpUPd$xCfH5>pg3HbQ^ z?rO}IA8g?C1?lXno--&i$|EAsKr|yxSP_i*K}zF#Ws$*Ko`(PP+=K|tlCy|(sKm!J zU3P*hA0irQT;sAf2sSp&9nIyVCr)*b2ojlrdX(?-l20y;QO<+BoN)JPJs3g#0>zmZ^STT8mEo;e?wxEX;t*mIIUBw`A zaKfI{6LMhc-2{H$O$4J8i!ixaPq#T^0kVABh{k@fDxjxoXi>uKqe5U+;f1%Jk;IYM zJx7S<(-73>V{Mp7K~-*pjESEOkEzH2XUi|raa8%QmQ(s)xYVc)f z>tA_IszB{2B%mh1*DtV0;lt!S-snP66cRc|v+vjuR_LflJqI zVjOKl(d3eK-p`0#l6#F@c(z+P32&6jNIlQ@c~phTn1}(*X6&5ln%3zfo??~@OCq@= z-TLXZrV*ImC?r3g?4;P5Nu`7CX#_P7dXQr`BQx{+{zZjIIYT%wTLaLfig%Oys`?mq zL(|v~J8&+zNYVWtz8R8_*0Iq{H5oF=(d2qJyUZSWC#8Jxu}Ji8I%viGv*0GF>Uwc5 zEpBj4fnL0I#|#W!e=DHc{y=RVJQgVly5xd4RH;fg3wgVY^Nvtb^|m#Lk6Eg5XaiE$ zMQ3+PDnxUt+_-@_yg-20!wIUj_a{kuTMQJyWdOESyfg~c*%q5BCZFc%BvedMi-yGi z4Vzo_FV|}j3CYn-1t?5hs!8?B*Wu5{A`|9}0}a9fCWDMu#5fHqm9H3?0^C*8iKYL9 zrKgD=-wP(A9Re##&D)$C0(_Xv4mT1PLlWpsOpcNf;C@8^1zBTyOuM10%*sK8jIe|i z^cv`OO%EuLz+%aNUCB5@TQqhP|F8RwhMl%KX~oq%`e!6gAOFN=`x&7={j7i_%=by{ zUqgfq;$GJx&$~YtXBai?s&2rh%K@E{T-5-68gBx5lciiqr;*#SA z3cowZ2d)?D0`zY*xew0d#*4r%`e*i<1@7rBG+3fRS( zgXS@SuXC>pBh2!bp+1OgkUeUb&Pb-}72U52~Qg7%@G=+Z(`} zZR~VKc^;L9UK~qtvtmRI{72MGse6;})Ha|nL&ZRS<%cO51<{P}8yGYGrloMA$a5Wt z5N=pep1O0HU`<9<^zpuy_9f=?mf-ceHsLl0-@BpC!SZE#s1Fv zTYKXYMUQnc_IAG+Ya&5#C!%TsGvmB=Ti{R)s3=QFAv-2JNkkdMtLO}lnthSy2iW_B zgbF)?IeHkSK-D}A6ty>X1fjR1eGnx=zYYtz?MV8eBu|qk$x!m<8{aj7dr7cN*ssm8 zuQr(a&NSfc8d(^y9u?kMT`L8@hFhPtvPffs@T1W{iFs#;4Ggf06N_MNPpN7cy_&O^ zf_g+*lhq@+D3pq0SSFWR)*4_fU0S;J{LyK7RYGH@1c|V43wjojH+2%<&kUj9i^hXA ziDsp!Ee;ne`YiX9_+nAUpjBhxklR30Mq7z^t>1WS{Nb!r3UhA4!?pP9#7N9=qI3v! zY84qufv0vNMFi_)o3(tckPhTn@lCd@dERxQ$1Y6Q9X!-I9EkE$y@f`@6%DXVQ;8y1 zhz_6*tde&N{PuGw0w%bS|LBg({;A$xFq4uIVaT5`YUZtK#ab$S8csS(>iD#tkq}1A zf$jhdLyLZIUo-Ov@fKVkOQYYcojz&OKPD+TUE{Mu8%J$u8r;<*&O>~5Q^v{-I=*W| z>Q<(T{6QkL^qCEJJMl=uoy3tS`WSRk#-`4$ucs!9hma#}0_7YFbW92vJG}j5x3;-L z0Oot^!Znu1N@=b~tpsgVK-*5EQ2&c~%9T}%OB0OHE1sz9gxfv_P5o(zC(Qd@G4wZ8 zf(6yA(Gfc)j4YikSMY)4(i|-iQQP5O#{1>3Hq(>2IPZ`MTXGh7nVF|}Yg_z!Yqd88S$q4_$f>)1C%J!sC%~)%q4{@8B z1Tk;*Nqj_)5r#0VF)c!{LwH zT(16f8f{`I+f?lP=R8T^87b6I7WFOj0DCEVt zpVq=~>%m%FjZ>YO*oB=jp4V&Ze8?snCnhf`R_XR>`E>L0hpce5!+7w5xGi<2Kc(!d?q$OhadyS zl*Uu|k$UdG3cl_tb~hs(5^7OYtn562+Qh8iP~2DYG2PsHJuGxcc3~yzlZ!De9}Iiw z8Lu-ak_mSaQIrixAVR%3-1h6yDt|Kix9=GQ9R6 zsT?c@euMj~X;$eS(sy;bIG7aRW!Hqc7>!jO_=z{`Y!dJsq^Mtt!kcGla2v?D?j2xj-YYn?w&kI>&RuYdVwXvvo+7J} zXFOsxLQ};Aj4sHY#U1cZ+IO>8v1gAr z3RxZ*lD9^Zpr)q7N?Q1F4@0>Kj3NmTNl*gAO(_#jDZj^Hnvgmiw! zGJB5F(wLj^oI=y(#j#I&ht4#GHafP8PN+m_XX7fxK|SrelY%=g4S#Va4V%lK;bhv_ zwy=Cbbj2=kr!xAh=3kvYfZd8&FV7pRo5O{mT}?&3(@L!?p$@>zSX(7hC2WKa_;MtXF@DccCbn z1ywaa^T=VHs&rnwnR=vIkiE|6tb@SL>D8nfqbioB^4Fj`VZaUF_VMQ9LN=x?0>mvjEiKMi2-^SLg-vuSYl*a|_x&O8+ zJ51^DDsXq)-2C;m#0Q}x%WIZMQZ##yzo^d#4Mh>Pa~$)e_DbGQ!+Lj;zO$C*7+W{vaKat>;D5r%tQ^glx)ZiU?6PZLNnrsL-!n6><9eM zpf2nQ)TD-4X-9YU9Ifjq#W4kW!C_#ZW~CX&;Zf&$sN~IiLKAU#JhPlzwA=y9>EDH$ zk9hqHPMib!wCGlK6|3sW{BP;G3Y}Drm~n5gzXFW@$WVCVnhbGBDu@pt?bCr84p8)b zA|j)QsW>#;_+da6KVV@joSY%TSa*SyXJTEBubP$g)wEar0A_ID`&CqJsN(5yS_CZ; z1&A*K_zU=*nxFai51~fRGCoH07DWloLO`Zorgr}=ll z=*-j{K-w4P9T0^#tSg8nF?g&AhrZ;Ps!?b5HC2B`>UT}ANrKHhOR8K0q(wat-HULf z){Fh#G%UYR$YVN}`?=;8?WSi{Zf@T0aKM|EPO1`GZyx1Q)8(aKnH#vKddPwyN0%KE zewY1M$nDTlO&pz87+!0 zOYm{7GV90kmzPle-Sj4spvm9o^OP|T1u4|MuD#)q<{xm$z@F&{f z0LdCrk`M@J`ogCKB#&QA)lo+miim|)5$GTRa9KxmnhMbx*GfOC;i zn!y<@Fx#06#wacCo(YS^RL3NRVfXAtq6zUUZ(4~f4o2zYF>xw+i~R#NpXwBaqtS{& z(qBdSUfRkIaDcBHpDd-h&w6|oNt!($jPO9yxSjjv7?ml~kfzo0IVn9v7GmZ`VQATz z9KrY4d|S*!HE!gINvkEY2V)(;x=?pcPComM)!*Dqc&r<}>$_O7JmK1a=w%6=I(V^a zMy^%V&+^WFB)h3H9pFX8UN2`J$2VjJq|Bk_CqOlY*Q~W*rnkBcpn}N19uo|g&ef!) zgr*4N;|hoO$2;@jlt{F?0C8#6%&vctS%ilkY5285zsFQHrzG5!;e$BG4Y%*w>M1&) zI0<5-o)0KMq26gUch2Q(xuRMcHj5r&tI~WMrp2iiC|?2oatVQHGx;Z9*cArWrFfWbY9%5%Upf4k@8+$ANs2MowMOv~dt@2IFGQmQwiNx|ITuQmNh0tv|iZlMlEJ z1pTJJW+pPbFePm@?ZQ?Hug#r??Qz<5B#QP-RtkSuzvlIxBp!l>lgt0g&Z;(#YjmkE z1B&HF_C!TrT2L3M&FMay(pK%}wUl#o@2aB?PGN}iAj3EqV!zRjG>gpw)HuaW5?=-2 z0YY#$dg|_PFz!q*4_HMeol#9jWku=vDnu)w$w1jeT46**Y6pcc zBs-^7^jJ~k1HHpQganC67NAWIaf3GrOL2+mZ;_VT?IvMG-Hvy`yB&sK$Crif*nuP5 zgpuIAr8YVovIWrc*t_HD3^{Ba6&$ZX)Rs7YF09M{avPLUOX8j8wkUv7ja~$2^k7(m z!|ag%nYzmWR^pULYszh*t<{^rT+ntH$|JOsu<I=E?zLSotF|n+;ucNGS-YsO_>yD6%l# z*Jvq8^pQ#0T9d{3bJi3bc@pqh9e_vnxQz1B>en%`Y_OuMWfj7KeOp}Y|22*HOO z#2I9LH=X8sigaZ3eGsm!Ur)QxzP#9y`%zpd9$PucDGy*_N#1JsHfHV9Co}T zhT}ONqYxSSYI^D1Z=-~#-R;16ZWKDo)j9ImJ+P>pU=L*&sMuwKc=Lf7tZu;Yzn=qhXTND}|`5VJR~Ni#tLWF;+~)RBSi``VHykmOE;0!7IA( zEkq8O1Pufm1Ox=0weYf&BWh70tnfl8|CJ-!A~^02Jg2+$5W`hCEDbX~pnzqj(J4I? zxGOP-`E=!*r2l<=j^LcdOUpo=7;u^qyqFW(__$O;Zgd{$_6Ls6JfSS#Gg}=A$hQ+IY4~XDknEempDz$)wu| zt_oPzI`ayzReF{U7O;-Xp~h};inBNbvDuQL4D@(#QsE1Y!^7qse6u{0&k($ zmH<+TU5AM;g=S7O=^(%&OhVHVy@`e9S@^( zX{>CTrVm;K^8mrm+fS;lEi|9@r_wVJE@@h-Q<3CM(-ecuQz`ghFM^1KN_wVg`rtK5 zNjJYp-fiS_2xr?G37h@EjWp_P?^}{Q!h_XEAa?VSf-Qm;0Qk})iBeNQ_Gy;(NX3NREq9KG( z2e1SxHd!f)5j#1V#c7&GxH-iR6>!SWI=3pXoV+(lvavhf!SnH`G#RLawWhf`o`xFK zV)SH{Wm3CgTz9ne{4MaFoE)}Yos{H+B>Bk5mPL(ab&Gc25E*tO9vjdNKYHC@q(!O9COT%T1$ zE`45i)sk8~puhBCN%3eNoomuIbVrbQSufrEu{^rc5wkc}NT#xv!uV8ZEX>m_u=LxF z3*_-+A6cv2VD)B!F;MM~>U*|5ym!>CdRNXxB5z!M^jyZQsKfqC48z&}uqk#?{jG#{ zb*jPpde!rU2ZhX*Q9 z?bfC51=Kz3fJ#e}ydNyHZP*pOlm2PDQv8PQgoMJ07nbP>h^j%u0h%R*0oI{S(`10s zS7|XPA?Ww&>1v9c2z<2m(9NKwHpNkuAs8}w0XmD_Vn5Ic1s+7L2&YL?r z+UxA-jRT@S7f8b)QTvaA#ASm-N00T%I-2HiyE7xAp>~kFc?EpODwd`aK`bn0+2tU7 z^c3|QvJ~g@JCv%bs)n4TD6*r@oT9H^I_J_iMRUapCd{VRyKVysBuPU?k}!BmqXNqe&?_c2+N$fvI{grXWBVg^BqlIpfb}sKi;dEeG@_ScrNS;@if+20|W>T z5+0SFe%T?7#@_e0b$3 zLz%Qk1s(QdyH%$wP|jQWe$p*G-V=Z#14IZAo_-p-!ZOZfv)0{5&o zz(DcLI;rJqHZf^WWmP5`(=+2b+e=@axAbjZOS+$!u1XXQXk03djY-97NZezPD3%B| z5&1lXm=vOZxB~{YKEZ&R(N)8!u`MWbuT2edzdQjiAb5kVhP_#Gk^H@nph9;E$#!MPTrD7pL z!urT`^$l`jM*Bn)Fyqc#3YRoVoJOSurQ8J!8!#7KgiuA6I*IG2SS&t)?eztGuWZk^ zo1})M>n};AkHm+c7t@)Kh_fI`6XJ)%v9v3@u*>>{nlidx!7dLgBxVhv4Aewd_etFy zrl*SOS!b@B1UIF3WvH=}?hPks+`Pd+T}hax5wk9jtMjq4j>iWUYU%TuC%Dq!IkqF; zRPr!y>C4)Ob9G86V6!f@hAK+6UY6gJu4<@Zip=Xoqt8-!>-l4FtXD0i~%}rYF03Es1rKEU&!CDhJToM(bp(=+RL# zqMM|4ibjJZ%PM0FnHZ4+l3AW8Lnkv$69^rzEP_BfnWkZ8p|Cs}#w(NZNhY1QQ?YGz z^M}3pH-yxu2O%uMFH39XsvZ3%X-Bu|WgD9RpU$$Wk38KN5tYLMLY{$!j;$zrlXj@J z7(2V08&FFSgHh>wia*7T;J9n4-G2UCsKd)DYyb624Gve%Aky zXM$oLw0E*0hA^b`;SObTZ7h&0>oh0!4Dx+s^Xr||XulR(5U#R7-^yUo`p_&aY7Mc> z!lI`Enf4pH$~%%&j$nza*z8C{4`miz`n)Tt6!DgNi)LGf);qG*sVe)GJz~!AC480sc=1fxtlZ`+3FrQMNsERe$yFzw#x10))wx{Dz`gv zM}@?xsPx_b%FEEp5Dj@JKw1Q`uneSKZ(@IOgYT;h6hBahFKZY%7uFCuD$2gu)}vDfYR4x9ze>SX__K%+izE$ z(yfytM4pEKl{%H3gdv-f;<(4xN12AWctRS+*B4JnuiybbGEEb-muuK8v=&7o1%h9k zv$$zXN02LW+R{NwYMePqMI7jhEZl_f?aPr{lh&oCJo(CZ@*zH{J$U*Aqe5DYkcC-^9B z;{_c+Cbf0a?-WT#wFHt(l5rVHZr(fZq@ka(+L26=G5N8aBib}gFXjfllU#KX^iD!( z0Zh6dxZ(z$fXdzSFZld0ZOAlDG~lY^hF2uAdeiyzrlXm6>m-*$NK#q7Uqq=h4TyA-#FMChe-(6?jlBLd<&H>mT*~EH;N00>XI={lM0XVz>xr1LxMBJ18mrs z_Q-`(4sAuXxBp2%0j96cOI4^!#RzX_{VW`EzI670SB$v>S%;y^D(7@>cq&_4?*(z00CaLxhf@rbxO`96-}FeW1c-XO)|5 zHCTE^^GUJ?pcb`g!JlPk0Fo(OFBbS*rQ9t zQw0SDiH(fQq`Si584bUs=XGwBi;jNxx_S>PugxSD6er@NAtCThX&8`I73E3C8kI%d zN$O@TeUv7%uGSPFN!EgWn<0BkpA6xS4mITP&q@llY?AC02NX+m)Q~{=km>7K#?UfF zotzI1A8xEHW!fz%Jm^3n&Irb)v1a`5OWL(jr77bFx$a4*lGfjIHQ>0}^fayz`n zk9KLY4u$iE6t^~or08a4Xp9ii5!=vgaH#N_(*od4;wnj*#)C@=R^Ew3*=iIN8Y40; z6G~qhYKyx{4^7%hJba>-R3y9PwDgN6rFMgleJD|BEH_KCsO`!cd>BLsdQ<&&B~T)o zBRit?q^pO&LN-kk$-KDX!}u}^Fa^NgP|o}(K(xreQ}21j?8dgjT)mTB^~q&SUgV)z-_&(MX(($WT!>nvZ@#`54n{Na7(%NvO*c5ClxXR+20+58p8ZWgSh! zkWBovmT3{Qva4&Tq<9&rQ#1kq08k`D5C8xm7z_plg92jdkWMT50Th4%OGYG`a#l>D zOhs}O#1v!9AdwLO000001OPg@?6QH58qSsSx^<+b@0yR~sNILgK-D39e;|Wm#x|IF zj_Yk7m-Ioh+LS`F{(F!K;-@US8bKNmUQE?aFNl?bF0PbjdKQt(t`!g$o6u6YppIT9 z#CM<1Oqme&K~1O;>srT3Is~yz9QoSIo<@VR{?Ey);eNS}iC&B-A-i$XrO9hBk@`29&(Gjwy4n!>^CzW9!!I>x{iX#4dJwV8x-X- zUP?0Ui+YE0j+C-=k$ho^!XFcO1NMtRg0_h{C{K4Ngo7NGqNcL-LPr2Lbf137CDhzg zlG5ZHqTPu2e%H1Gph4YLIGEsfaISb6CYTmY`CMv$ zTJ?C!0cpQ zGj-t!Rc34S7st`6qr_l*bon{sZm-UzzAHgrT9LoBZ8?_ej3Y$2c;6DY+qNq0yX6Rr zxluUcq*1_$s{KM|YcTdqA;@3a)Bfh@4a(a6v&_)hQl=`PBhR++Ddp%Qy+h*FVBWTA zQ~nSZ0BTG6;z=w1vkzebAU=|VtKdU-8eA1HJ%pxT>qw zeJCJ#7nM8yc_Lz5JYF2NjP11QCZgb{;$*5`L+KvH5fw2>_wmEV2Ay);AE}6sM`27m z3f6LwI)j7BoXf;Qqdh@BRhX{~{0qr4EB1GVE<<9BD9%Zf1Lg9YUx09FhcWizEiAyO z;KJ%}A@7A?+$!)UDcvMAi8J`9mQSARbxSw|)Bq6{k~N4Rw6X1pF0{>~Mj^e6C|!)@ zSHuAhj!4UI%~GQ_pJ2|dZJp$nqJQ}fxn)pxcde8F*CO8)+>;S|*oAspE2&L(J(~i< z?3J{lUy=wsJ>(uhxm#TB|alDQ54@ODmDv^lp;qfy;BH%@={$ z>k$LPz^H}~VVon6dm_}=o&pQn%46TP)`Ld1{i1ykkgu2BNL0sIy*t{~02NjhATa-3 zA;|kF0sf93jh6hqMg)c+VsAj*QMylEly$nRpbM0|x0tn#v_+UB*uC(z^F-Gm8DQ%2 zQ}u_`%$KORG$2z$-qO~Yy&NsZLQug7346NE_72ZgtM-mA z*oyPTs?0naffgoQ;VX)8(7YbZ8XO)j+Rnz$xZlBxzb0Q}s#aAar+txLInTn>uW!kz zn=&V+G;1i?okweZu@d2jjzhaQ!8V7^Y^uLu1Kgnm z9|?b}$Ri$pk3c9W0zJ*FuWeJ{(ZVA{tVti<CUGm>t>yXNPSO}D6a)TZ+5 z{KOG9d&*a%0Yhc?NXBZe!}9(-3bxQeGGVj`H661Gz5e%BVx+Gh2s)J-e?Mb#H0Lqv^EMgky$Gb;(F~;21_^~f`A`LOgHT{n(SScN!B29lUJJkv7imyv9Hz}yQI z$zIfM9}8}7|G*%oA2ekag@~Mm@|gD{D}S{$gp1uC>Cxzbi!w_7G7Ji zf540*>z;ZesO!Rpv|9u6>d@!xRg4|ZBOfu{!qsAIc=o&emLDiHC-T@umz|}wpf>)K zmV+tjlpDr+NLm|jCLp?c9P(nR{MJu`nVq&<%yv&KMVWJ{W_4kyr&M5&2jXHV_hA zsS?ySRM8O}Mkr!re@AmnO-e5^c9lE-F#;s( z*>jU83vI_PPZ|ABfe^^B1}DjeF};<8<_DI4Xc&_GX?4)M6v{7Cm0*@Q(q!NCOMidT zOSpzM<0(a)O4IH_&dF8s)jX+SrIpj%ya4aD+@KG;rQ3?`8LuTC)G#Pi#(F)XQwo#? zX&Mo&QBoZ>3JHQTGl;U;G9LS$jFdgO$H}2iWWGi zXu4MplQ)vGQ{&64G?9`PGgqRo4w=?uD>wCoM2D$Q60#X~jSo%@1M@_wz~n@! zs&IJFV0a}G3cJRULY9@t=?3s9U!uj7AOw?rfTzH!jEVo~cmvlOMhK9bAF=hgrDNC{ z;z+WO0?V9+Z0zPsiK2R0a!tMcm7xjEwyE@!s9dWxH)xGQ z?!%E61YO{Hvoi`q(O%?F^ZioAorIz_9D5dBFG9aOt3^_0!2|k`TlhTC3+gaGu{Y^j z86dD|1Ix7#Uv{%907&X(nWR*xQ=-W;L(OH zOA;!1=gRqU%UT#EWD%w&I~n+ps!(w3*2u{v#htNjKl$7>ESzq&i=!9p+!>{zE$Moh z>x+2RAWGCU12w9g(;Gl9KJ8102TUKyp~GE#?t_bb)C@T0tyo53 z;ad{coq|C#)dz;^7N9(izg;&4qOEW^kJO<%+w?F&j*H;F+wf&*df#mGW0gug-34|8RgzLG76d$~SY0zXXR6V$;muZ;{*P+4J*#4V*W`W1%&|1y+w`%6EYx z-V1%D#ef_>#W=y#1L>kISCreEBZ9G56hbnlIhl_ZhVrDc8Wyd8QD}ORb<_7sa-BRD z@<0iL$Rj_WVWqB21E87Y&;33MR zXuxPw{E#MX^jQQ6BjT>9i{}7rIKm-CAQBmZ?7~47o(lh^q#x6bjR;|}D6Nl!Od%y0 z3QB0a?zt!#Hz26SXYY-T78r>ak{jKD>t|sMG{nbU;lou^{>JDCYwo~L2dJnGsvYsT zL?8I^uKB0~FS`Kh$sHE6^zYN0Ko9o1--KsnT@IQ7k-ju>r3_I-3~ga2)X_IfI?N%)~6TTil>^q=N@7F z=A{5yo<|kVzkE#sy&MT~0;ifTSZ`ebIpYST-!;@yr@2YrR-)y`NiSVBG;)poC~U{R z`UB7aP*7enl05eV?{>57Tth5^Z*~v!<;qc?WdjHtVta0L}4BqR5ABrx~*3`9rdj0W-A z@TIOo2}9{JEmek8+|s&5FFLSY^o6d;D1U4?u$ge13t!b53?ejQ)`F=%8BHrjakgX7 zr_y^;P>~Pf|Co+Qv{M)NNb07hU6Do&!D>{F-v`gU!bdiK$RIx@`)MT8wDLstzpWEddPb zkEqLsD`%3#$zcm_&h;jEo^4KUk6p)7ZUrBdCS{}Uhxj#EOA5T}Mx6GAk2ctjl?iD} z5bgjtL}+A`Dh3(kL?fM%`}=_J;CdiMSWC&uM}>;^=JYhVr8;F2w_nYsKXFE+M3$mK z7dg!YWwdby#98ksL4QE@hn<4Rb7@P)RZVBpoSS9$N`R~pWtP9~2&m1Rw`6!&m)Y`^ z2dY9~k}LW*q#S|EX91AC5Yx)TcRQGHftbE}`5U1{ym@l?^!9!ki~p$y@iK4#l*k>E z$F!%;RNtAiDo1k$%di9G#x^5l{$*jKAu>RZ@U+U-T6{SILNb7#EE)7ee&viURWtCi zd>LjB<vq}-B?7CyBE0O3yqOs?IuiqlZV zQL1Z7WSHz`CiHNycmj*)AL9%i^>s*l(TjGv@`hWFei(DHy@cfT@X^vmw3wJRAWKU9q_Ku#|m$9ox}|)f{1>d zhSAn}`{<9xm-3{7hng+2X%j-|ODxgtnnYW{*q7(^cS5HaXHvYtV-{c{0kUX!obo3v zOvqR@%m$G_Xi6Y}KhZ8M8^L+RhGpl-_^sWZCji4z+GLy~x`S@C{lo+#ZoRGfp8|7} z;3y_>rkgkXF33A_mT?ZfStC#Kqp@x7%dd+MqdHma|2EGx!hF9i-Jt4A&S{qSES9MA z#@?JpUMdeC10ai@?jUU>6O0uRB(RmMt7!P-kzKF_Bq8WM%2V zC~mxufFL#A$*x{ajoBM;@)7fs^^8`A&9S+|>>Aq2`GI$biaRpGjez!aATNI-x|Ij! z)-Ib6*QjvPf%1{+zY|=lCM&S2_43#wiK?MB-ZZjHiPdU;R9A$t*$xOB(9_zoQNG5h zYXoFuM1VUKYAyPEGWGq87DEd^O;x1eZ>)v(0V1dGlQH-zP-ivVr(2uyqx+O*P~j(r zX4thNz50+z|I*{(&{D9J(R=VqAn-^X7Liewpkpu`@Fjv=s2U566DupDJxqx33gp8x zHx?i3eSjm8dl|{dyK1Ufx=$9x@*U&pWB-TwXhglUn^g|70Be{vCa0`_RT-^`!#dO@ zdL>hF4a)hrsBXY>H;A{TQ-I025y*inT?tSrejhs)?o&+Mpi2#6MQ6XC792W4r@s&T zULdL9t?D$kt_yL|vP5|`4jBIo($x!y1N^{`V_KsL6H%UjUVuX>n7t_wirz#?_1voL z6?FKBV17xxPL2mwu7aeG5#cXxjq1?2baF6~9ta@6x6E7f7Wkk;M6eSj1;g)c^;RIZ z5xMlhS9A2bU@*~P#1u+^g&P~@KauBI!+NYi2u%}&@D7!bF*L%ygQhZkJEJ;eqYx4D zDAd-17((Z!+j$dRu{vBnQwyE4bg{(%OTE?rN9nbbUDe9;TEBh)ZXm+lR#`CXK@$8CuPo_eCXgW+Qh!^k=eZ>3)F;VdF$Agafc2qn{l+lP?!11Y~Ux8}0B2xI)-ck=N9e3R09|{g_1q9SM zD8zWf9#}}WGf`YgL`1{ixosLxliZ?18eKzp!1!LtAuyrQ2TdJ}z5_3HCiWgo)r{?X zN8U7^i{JgLq8dxDmdaj-n#;#_P+$$!hMoztrovgJPg1(}yY!wpjGy9)d|*-~spaUr zSEI2vw(J3Asul59m`O)5Dhl;N6v?|94_|xG&DO9ty94=wJ2$QeS8H!jV*|xT3ysR0 z-C?8w_XM(o3ZgG=!E2LF_C}y(+u%^3Exp0}g7{&59H7fO1d%jf4>{g+ND`RjQxGJ5 z;R1fONVRKe*-%D=Epz0FkKW1dd#u=MbvS_F5sTgx(kp3SmQ%mIF6I<*y*)u%i>7|U z3-}cdtG?a?pTlH=0CM!Dr>{AwVz7sv$vJJLG%Tl!0w>Y}**gW2ggs@~`lZO`RL7KV zI=>YU8aY#m9lCw;*vTIJqJ#=+^g{D~u4tv&bc?O!b7O)C=m07hu8l@3)MJ;%-llq^ z0G}x1Yz`m^qHiKTqDNL#kev~R^U&Qz2k0T>Dr^TRodFpklbE(;t(RRv`<*!(Cki|P z;>KDcplyFcKW(m7q!&p1$7BSy6u0bcq7HrpkS~2Fo3Q{hPpqIg2Gfw<6WwQB^x1vu zv#jIWXM!LCETUJzAF#C)`C~+%qI!U4<=7bXNq_npeT0!m8phS^)I*GVp6?bX6QC1Q z8}M0}Akc2(iUVzpnwns~HnQ&O>f3*H$r%LrMY;b#3^S8L=3Nx|+Kn-pEW9>5z_S8B zscwOz9xl-FvWvMT>rJq*<-Bs5cWgw0glyxFC>g%g&e{d@0Yd#&AJ_MTI*!bFgqY3l zqrJmZgIQYRQ*QhSOyULk2;Sh4lM)cgrxf&M)&}CLO^bMJ3>t8V47GwTXC~GV5lutR zO&5|gKqx(XsPzhlV} zFLiycFt{V%YwnJ$lpWyf{oLwss`6{2xe|VEb&E_Lq6N?bTl1(IAXKw&3A*rQzh0Rg z>EbO1Pq5K(Su{2IR*sXWl27SXHx+nYpJ#~1-IB+EbnoNK*rC#7K2npkS1jhVZbtxc zkeKg70|KfscfoQNEq7qGLr! z7L29|MsQrB6r3kmt%TD_f0*mJe1nD-n}$0u*PfOj2~Kw$N0wvDla~QuGUh4dSIsq| z<8rWOZkzr1)aHeg$R<*1mS4}W+hAc_PZ=(HXq^y1=L0cS$v0{*>hwSyMuvKxSh;J1 zA*chjwRFK_^~VbQusR269wwJCn`~Vd?X#FoKMmACe8x~MzxY}7J=9z^AQ%`(o$=zdyj%_&w40B#^Q|zRJ zR-MaJr3e50%4z;At7oUdW<-Jpn9`MyAjtURQ#T>pU&CfZ4ogO7xaMrh=EBL0Yzqx} zK*}^MoxDzJG`V^3avndnc4Wm;sb@=*M+i$^sABXZA0c zqv%PO`OnuyFO$U3S%278EcG!jYp_&NYCA3J(9+f9f~)6URJ1gu(L47{G=l4Fx3Y z3}eEo(|@-VB5xy=&&Uk)6p$16J5ESPqndQ`f6UPk12%BtE_|$jHqndQeR-z;LX_2irT}mdC_jiXl!A} zP_T3mzOMnXx^U~~2tl2P)VAOc1IwU!_X6*;rp`SiSXpG`P>`L6K|CNySe2$sXHNh65?h#L|9U4k(>In=?MKnVa$x6$--Pl&y>Z#me=}%8*Efvx9`JKu_ z#2po05UanN2?fOUKN4LnFx1XsC;=)kO;k+`&mPwENW_F!yUOYIAW=f{IE9RFH`rH% zZ`_(EBb*B52>1OQD?4`^4%>zMK#~poXend+Ci+*>=R^e2K-TD~*@tilFri(%83!YD zUc{PL#nd??y0OhlE7C~}C#}6Pz2uYgMHFh4LJ^L|E^H?;2e9n^#P!n9fgqN-Y2`7c zIJ#UUNs;2F^jVskIuLo{f|iEA75J{YhBxS|_dr~|_Y3sop()W#D2|uamNOhc;mRv8 z2PN2uq>Wi+jvDy+ePe`L#jaDAgvwhg1VeE_yat4_I~icNQprkSEMMi`6LI!wWWb4> zkW^x?rs6HKIKOO61aL5MU~`%0!ptf7Hm(H8x|Lut_+sZ?q8@O}6VcH@ktsg_IRfy0 zpbCcXu^60$2kEg>4lMfBf&lM4;`i_jjMVzEM(_#2vL{$xr|qjQn=UP6lAH~|LbVb#r0+3NYi!_Sq9)$nT-3Q zV^qCmpG>3&o26ZJp7rdTdAynk*);TgYSBk*6D2|y7AZfTlwD>_S&Rf)DkoEjan)V{ zZ;eL4o~Zzrk_bUI+vu$zfI_b9mAI1BVaw7U8uv0Sn|J3;#aEW@{Nq%!xx25o`BFLK^1eLk2j6 zLeB#03rogKra` zcvm!?KKm#n=^P$F4x0FNJ6f!gw(1s?k3Ia|EF(pztoL($lWbXEphvvHsb*a`C=uLP zEbeB;FxWN!%UAIXm35$kij-2P3#l-J6p2g0S4dmUvt<{v-vBR3VBl8ULO3@@gj}U6 z4>!XX4aveUF~g7v#~&D`m;`m_o1F~{rKnby*IBKLjZgbp+{-;cKEaPX5jHlYY*)Li z#Oo{x`i@RbRj>tqA8RmktPxPM1#`X;yreDvxUhr;_${ZPZz3EVg;BK~D=xKA$ashC(qh%Xjntow9l;i}8IAvdJ$Z0N3{XtgJ5lLEEQklcbfftXicS z8-ZJ$C-gES2OB0RRI!9F#y@*!!dd%xintN^2dyv+FkcbjjF0BPeF>zepp???ZAM0y z)Rl?YYa99y5zaY_@?w$;)ybZlEC4)taK$ZD2qtr3-=#WJdOH309D`RB#!BUPYxIS!O>md^NGI>vsnV zcm%7OB`2)YNM{N%25}le6m%SM{z;k{NF%{JYBwN6QMe;Q%No3I&DO3aUKz&O;AYfW z{L{cs`A@8z&Z;6P>!)m%(W;9Mr`FRwh90sPep(s7g^|j16+qy4DP2zU!6<%~I z0FuT27!|gU41sIkt>oOK&JZYYfIe%VbULqd^4>1#GrutmLGR612>2K7EMH;x(FUL8 z3~5+)MNo0C5hABKOHPvfe&c-Zv12%r`oAv=&_{9gbnMyGn3fc78 z${?IP#e$Er`|5ROoEElk(s_6u?OC5=j6VCU@WSq8?4845)!Q)+wC2gG=<(3k`T;7m z-$@;Ru@M}vkCgFlV*a>!LO`XJo$w!5V@v)!yH5DrHz(8tzyhzVR7hb@*2z0(7A0hf z*Rm=S#UO?kj%Y1>+@;_KDLrx-Q zCE|4bpRLbCMu}lF1aD=JFXiZ3UiDX>b*Gh=)ynD8w%TS;F{K~T+<7>>te!hw_t2QnGu-$_$(4Drb1G^o=Cs!@F9Ag{Eg1xWJ* zjpRY}5c##EwrQ(a^hZk22LxkAEZfoNs0 z9Wk<0yrS<0X$GENuVP18$}%%uj(ZOzaP`R8MDNIV-%!x!93u<~ei_pbxx}iv9K0*M z>Iib*qXyLvn~TlQ^}EP5W7nf?9oNx@Ra+|jI(Sl3R>iTWL(#v3!4nNq*cJc}y{?A6 zSCGj^iy@pD^(fS6Q4WloWx%mg!-MT|+RjfHGn|c_>e%p7Be0o*_A8J&=GPPIE{pj= z{>B}&yN!u{R6^y5rUYwuHu+t;a~kC_*;CNTG8w-H=quu~{6X+tLjfA$MQ&~OI&bQV zw_}U^`!goJ*IbS;;S`rsaDI=i_$SquX!a3`H_xQBfP}rd)+7x4QJV^B`wvO8UHxjy(`yPo;p{=4p32e9BJNr3bG` z?3zfn6)TlFoWzqnSj|EmB)KUd)G$b*v6%5Hs(b_L%kx>Q=(Z%+XA2*&JWW)QWRtj% z?=2Q1U9@fS`rRTO>>*N(YM$ZltUgHC_}SFr+Bp>~5oB2Hva)S6tsTC*u9|k_+c8Wj zJ!N_H+qYF`Ok!HI)iN))#5J^@D3M2*v@HP|0vgQuye$`t7rTS-+IAEn8;*gx6nAZ= zw1+!YZ6FjHItPjiOS+#6HCi2xA4bA#uROW7&7=!YELy{tZ6amRH$0)7KN6c5ae#3E z7-fen;{(nN5!shgaoig0_kXSX{y$@mn;dN+->>zc=8qEsb=tIbPLP z;^73Nza46svtrJUbaVMZq9&+`bU@TaO;uxIW7>Ax|CD2h!$YC`3XCvZQfOp18j6_9 zp1DPzOH57=zw#s^)N38j{Ti1wx~T3^B0hboPk~|Ji z1^f_*99r4N&?r!J{0seAYKF5WG{x`SV*Ppu=Uft_Bbg$BZxh_BpNHsAGB8hd5OSsqQAS9wcXPmadO&R2R=P?zcC$p|`aqak3LopmiQXBwnhmJK`#)XER6tyQK+ z^~Uf40EK9Jo%pxWFE4O!t0-eB4aRabQ!woLV%$UEMg!?=Q(+mu=wDo06 zo2wYsF8XX>bM=5iS8jU3>cKSjNemcL)K#$6cJrXw@7pR%7QCCK8&{x>s{*qY)TPOg zf_m^{7(s%h|83;M)h~we$b&|%ERF(!OCL&)FLSquCum~2aoOT%Pwo1*2GsI0Xb6|u zgm{ul?fjQPu!4GOyzpuUi04vRa-m_$TdnkkefgH93v^2Ne<^x(8Q#HrHUpCQ!N0Jq zPheg-uc5l|Lc~xf$+uXe{8+4-W7EwBvJij3@}KsT;`5*=OmaiuA@Vz9yqMn{C6XAs z0F$ez;%~v59Uw3{$Yx-STL$Jj=IL9R^S-s!^*Tec677wJOjEt)c> zA$xOBFK76jM%8Lvd=Otjq*GN%IRUtSU50LW;cY{nF;uB?Eeu@v;rAnuMUUhEK?`D2 zOD^ytkA!F?$qYB`baiyJ6wuxUWW7d{t;}GdG0F1mQ?S7>jt3%vM{o*X3QG54$`W&$ z*bu#xR?xT@_P3TW*^)EyOf%4#p^SGo@zyy!M^IZg6u|teak3IC;p=1;^WQTGQ=>5& z(|2e(idVLX@B^Pkk1LiIl#gGK%1$K`YqXK_00!x64atL=xIg8VN zUnEK9OszQAWKpaTo%K5Vn;>kWVGChRT6jYEh)?w>P)J2?f6)Faj41+DGg=aA)GhPd zPkWfd0qNfR*=TszSIA^)&cn}Z*6*eEjI z?FuVm$MVH+h>+e`ygG^kfHkERqNn+kxc!GBZDNM1E#9gPy9 z7!UZlkRqm(@(i~6&rC6I1!t3b{DD2=Gq$!ujgts+A(HnZE1JJmm83#`#bYTlN+_P; zFbbl?>QM3caVL@Cd1>KmzBhTFcB!YM&=QMd$b2hFCiFtqPdYy!4sz;cph4{J1dZe9 zW9>FwWk5NnM6}94(XqRGqC*`F&r($^n8+VVhgvP#ekmo}NRX~U%oM-xn8PAO$L!Vx zw!2>T)ecGpqo#GxDs4pd1A@_JCKfY|6gwF|1^W-fI-dNRx%;`m(j5e9{>eclQRbT)Kg* z!H5L|Pqp}khFc$vH_ne7t05pLzD=Q~r@&0@Yig?9nX;$#3Km3Zk0ODb2k=HTfM%nx z6A!Z?{fNK}gdw0BtU~e@Q_z61ZRKG}TM|i@QHM)KWZha>$wb|x(d@ukcw)l2*-)nv zbA5oK7ev2Qfl0!Q*`ol?S)rk=5CVUcnOMx$Wyx9Mn}3GLl4$!^)#!Wox%Nem3}~Jt&+7Tn(q1C^plS+*>YQ)7Y@_BKf7X?if>YXcQuYNrx638>Ne< zK~qHmgM5z?q?am!eV;3jkp=p@@Ky0EEDU%6F#&?rH;tN-OSn3dj%xyu0rrP0hMva* zo4jNJ9EwVKpSPL>X+skHN(0XHNA_Mtpo6r^9LO^dW;S8?PgH>yU7`Qcjzpb$5cvxMObJyk>R17_>N? z=FMLy)iU9}W3fTHfmG40fnf9fS#`-d*z}M>at=KsU}FFZGwg6zdp2GtBFC&4NO!uL zuc;WE3$-0Y)|BW#Ei(!ii~WJbu}|e>CCf!%)Yra@i`4^BzP=LEV&Ik|BTDQjOII3F zXCQ#(yFV>uHm$pasJBI0HqGmP!t{VYK`dkxLCSCr*4y~H3i$#?%H~noV#1fIfhAyr z%T~TMW)3jm>USm*seRw>QQ>SpvU)hatQ0`P6*a2{3x92$2AP{XAXfVWQ$?QGDM{!y z`OI$Fiq3Et{3(lvG^qTbzkUlB`*r~%bAr^*3CkJc!HJZ^z^dNc{L@0GcgXJae3@q_ z(Sb1N(`XAWE~8o_QYM>G1No-V9yXIFv(xZ5!?2o0p`3hS!{8>s7*+nT27+M7kS^{E z5z7p-o3gCB^zMMQ1QH~^)?iHF`)X%iI7O4L*Hl;x9m#%FX;aVJy|Gzwa=QvnW&c9< zZ&VdFdSqar9;P$;#(D|AuMlt_QS}jD5@*);}l9`|zoIv^Nn*yRC)x2P}^n3!FScNL-c>iNc6$I$D+;${TCy zs~Ty}p0EGYMpg4*MmoDaOPwQ;!lyagsc!$hbp9l6B^N=j;j;N-X%AHBCrgeDk=Xx& zxhbV@-W~Pr^sbB0u6-M10lU0o@#mqV6+Q4LG;M{|rKw}V!p~A}m}+Eb>`amIMXr07 zvQ%@P#Q{ru+F(D!UD_PjYzw{+4^Ge%5n9huy{AJrH96P-CKRgmaI#ATm@M?8Y3S70 zt->m6c1IBH5T;}roM$P*($jsobCitW(g}W15(0%~+J;b#@R=lAmu8O<=|s-`%8!gr zG05x?B>9|e;OE=#1QXz6*}FIe^Bo{k40txa0vHA(=H$qk(8~(@72n{HY10&*>hwNj z9OF3}R?yooHEo|CCbH}xdy0y*km+FzJ~&ubvC;{v@(UbdC^B$xNI z8_?r|5*EhdegXKQAVeCxU##`+J_tg1>z}vaE80Wg{gajEneGnsf@%BY$7X17@+au$ zBB1ME;vs8Un08tV$&@R82~~^-%t9l(?!0R85_s#@;<_F*UF54;P3^SEAMXjq@@(3w z2y1uie!Sjw>qtfHIIWRO`givk9`y+XpK5>CP6{=U?&iSw!~BA;)3P<5P-0!M`peTm znir6((Yw9`ilAcHmcV4dZAh$t3q1SLoYP3)&ZczrMu!@KQEs^qy4d6}2y|;im6)Q{ zdxk=&?9FA6w$^Y}XVcffY5EnMBL?+^;FYH-w` z%u1>n%adyQR%1dHe*|OljFL`*T~dR9pZin+)(zBXWlh*Zn8{iyR{E24#T?7R&ZWi* zLjJNTl$(%yxX8Hm1z~hvP-a9rNDYBB`mK^my)c5-2cn#z1XC=#TrMx#_;(RpiYb7|A+!uJo(mTf+n`^eK%-kXbH`vk=V;BCDm(YodkuaFsaPT$JAN^JoOX_orb5pv3tCtxBh1gFjR=O2Yl2 zd*qqlCpRXAX5Ct_kf_b6xQ^5>N064(jO3_AwZ)555E|tPPAUuM*4)rmmGDUq?T2Gj zPlMIPDj5+PF@RZxa6vz}+gE(KQR{p9^E8bX(*#jawUs^xmemYz&Us^m)MC-~Y-Klkt7kc& zPgVhMER$kq1i> zrpicH{4S8K&(f9knnb}TxukbS2&nUls(MiaaWY~*+}*#l+{lFw362{WA7tf!F{!kD z-7*3hCsN@(TSy`)8`>7f(NwSfcL0F*0wa=3)B!@Nr-P^DetT2sfsu>3$?(}q)72qz zhURgZ!Op-_Ni9U%4a#c(@P|_3T+PnOR_(M;XU2JCY0C!bKU!iT%U_sNMt!0$$)uNFcMsm$$(2QPX?}{ z%s`?wU3hJ?ZfZxP`i#w+n(>}Wo_)cTjjUjgped1X(hHvXM(DWAkMq$l;KQ9P#<8z+ z^dx*F3~(ax<{$&I?T#c^l(}zLr&h4z?nu%2avxC*JkO>t<@O%uKU#U)C$Fj56%1h) zc_i}bo&tcPQ^};((a<$q8Zs?xVUek|2wTY=H{($Eo5UI3@XhLfQsipVDK0dfrg;wd z9qMq&vN(j&I^yA*Fr8lUIx6!P+caJnXDV%+3`8%rZJ9G5a8lhnvDlVNl# zKA6EP7#Sf#(5HIa3Be*vsxPhHiGiTPNDE&(E}0${HrrS`nh#i5&!~yL^M`B)eQ6Ja zG?93iFovPS@QB2*EW0v22Zy1KBLpSVh`nrxMh`^;apa{3ia0s~tC0FfH_;VH38ZqK zE{PrF59Ak2pTI)27&q3oj)LvhPuwpEd7&?~Fu-mUWJG@_{1PJ)gcK299pPd$BOjLu zL(N7g2J7|=F%1O*nhl>h9CEda3THKHGK7V!ZXTvwp3i5g7GnEP1wmH;6r}zqc<{@{ z(n@=0NQgALkVa0-;n>5*3Y2;fL`c6VA^gfST*&9eF-C=NcS-pH;nr7>H$g9OG?Z8e zU-E64XjZLt~NSC@hfT`6N~DBW&XW67^Kvi2TupJUfR;p+{KQVa}~ z7WAMC=76cEFdG3vcTM_Zk-T3{q2UN^;xpg2FEHVGFCZ1{lH6Poa#DpkJOhEZ8xXG4 zYz9y|sXaS%?RVN+g3HU7o^*}HkISCgYMAm8F-wOlE3c6%Ke9wQ2mD8Wy;oO#5-%82 zS9a!+u1>|t50D44Ei4!k^}K0-%x^$lGN3bI`QaVP?1dKvLNbNBQbN*67c}7po6zKS zLIBC!)C%(&;3dox4iu!mMV>QssrN>862)%il;RIk%lD$J4MQ2gvUUB=3cT z2JGVR&McVIOgId1t}OivKPPcEj<0%ph%@lBEXWK?T2g3n7^rd`0s+Lt4M7670NrJ8 zWTWL2plcG%7}6-SHe-@4 zYcT*gckJw7_00&Nyl_T(TS&+UYM9J~6U~lpt!b&~Wf8?B1`sr}FKDKKzBpiN{V_+a zQMgex6R2ZwT>cck>;^Rivyur?2DY{^$C&nUk$4~z=PjyHS)Y!%{Jdu;tdSvkPlk4` z8)*i5$X5ICXYZV$tBH#W9@#dk1@ZqiXuo^2nX>xcM4<1A(ez^$kX6P6Z~-yR;+v2tWiL6l-GQU-+PEdY705*4mXSfCILOxj$D5v(XJ3ecy} zrO=H1e&lcEOA8LTf+3S#7Dr0@8of2V`Ow4iVZ$(YWG1=Yme)%!g455uC~RvW|KI`~YLGW&}SICj>P**EHHDPBGt zVWLNWWx~1CtK)qwD`X(b8j4N#?0@#Ew4IsO;js#OMf%*b z5L3w5L3Z!h5Oo^)WFW@TVip=#QRvWJs~C_HK8X)CV50{my%GhYTS-~$TX1_MT`Btg z%n}be$NTQ`8++A7s za|aT~66-U?5vq(cU6aw7#Bzw?nrr=Rut7AX82GA)%rnQ^;+wBk**$sxGe>OL4+S8z z3STK`A?$J1!2sFEfu&vto+1Q5fEZkMmfcYwi!!+yh(36kr?yr1$^eINE8(SX_%wtL z%(JaRMj?FVMO#z>Jwg}C^qqJPm%&A4j@`|rLsu)pR`#;nLh2AlIkd;2Ef30tA%c~r zFVRrZY*-OUULF9$Oha@7q5mZ!;gdTVJ%_*^2V?6H;!OkCUOlNjq33N4fsPfPzMqwu z)MKIFc9WMt2DlX&Pk7BL0g6rfkl)n-O;aW$;AC7O3o73tWHh6{sTRPDawtjf5-xVW zL&RkVw9d1n+JF~Uf2YSJbD$cHLBqOefYzN#C?@{FQ+eT7P)>6`c^Dw3X6ej?b%t5c z22LE_vT0(^hT5>1Pn>^z@6^zN`cCh>GHl@EpxwhaAh_%-f)&h2i6~b{5*a{N`U^{t z`l@E`2K>$+NfuVXVh;dAYRW-A(A2Hh@VVD7S8t?ldAC>>In*`CK>?d^mH>+DmL%p2 z>DyU2-EsxfCY{BFCpkNXHglYBAuOUUzn-?aA6BLi`_nFPJ3_P*jR8{TRIf%S!2FvU z{`O^rR-}=yD&e*5NB$tHO`LlkD7pYF{c<55Pd1feN8{;+2-2`S5Nm0pK3NDVTMalV z2ZUCl0o$sOND6Za428@)WUWZvjYFro0ze;nuzp!(t25~Cpl`*GUJ9culty7>Y3@qU z$mDI~Z=roJz7TvOf@lF>gf}s}?=EuISxtkX_&piu8Yw@z)}EHvB9Y_MBh727Q!TDi zMX>gJcsXHn_NufXFeRo4cyiSMWL&N6yFl%1tezV?x0^Lt#!U&PNnm||<%f6IQhR3X zAeFV%ECZS4eAM#jSidt`KrHE003F%6LXzkMGG?Um@4YaxOr5!HOxt>++wYz$R3Nf8 zdrZr0Gm)9F+mZ53eQ9AIc;E*w1USJHk)a=)V&`@CA?U8VfRg)5p^!op2H1Cm9i2lH zD~0Y&$Q#o9#Q(yBv{e|;RP_(1381GsZ71wein|;TeY8iK3tDO;B@-AWW`&OF$vcgF zS!FTY{I=DU7Yx%2N$_XwBzKCYMIMDrQwKDU68X2E4M*apS%IMa!b$lKbN<-5qELDx zY*gPBMLs8*PU3Kg#+>sDyV_Fg@Kqax}HCh*hhYN^vgmGO@ zptGEuu>ubAH`fWauh{N}B})@SN~hz?w!8=Ij#UOI#RX>YJ2289TBuHy8B9@ApP?-9 zQ4c}b`JGCm&j2dr?$>crS_VQSe9ceib@ErX<(AYA5Kg2{REK;ztp`z+P%IyU?~QcR zGqUxx0ASixa4^9lP~EV*cd5FGzbzIy7fbsqy4H2l-Q1)!xFld>L+lEclfAdlmzwtv zCV3ngijy_~?@Jy^;V_cyEL_@2Dt|Uc)qk@yROGTzbam`QYE>Mtb%b~cC^X}mWWgSp zkg7;L`ZA4B-Y#zAWG-L}u920H^lO6+70>(bQM)YMu%1xcRG~i9jIYRr^M`n4ruxPOFls#|baRV$@dvqK8UEcrYE0eAdSgmM6 zEeu)w{{TYfwSPJv24ApCQZ(2ojJ|z;q3EMgcce8rS>}mG9zZTsPTdB-(ZpgJ2_|$MOVKl*%-_P$K>bppmYQ}!s@lvBS+m{BoK{!1x!reiJrH!&UxKl8}M=^hS zmOG-VuEg0Xi!W2&7va>b;8R5l^#C4tJYs6bg61F)P#D}Ag^1DI6S|UE2{(Ef*_K<0 z(Ms)^T_w1`Oej?O$KG(PMS?#j@xj6R{nEk_X}5{|;SK;hGcDAV34z}QANdE!*ss6| zw(t%c2pFjNI^WRd&*cziIy_HrxcHiEnqlEfCe7)8krk{R(LS~BvdKt2-*h@;%B zaj684!(yR>$C(=tp$WpERc{}u2J3=>W!8qee67#--G@Hvl?ANT8>z~tYLMJU6Yt&> zv1aQHF^h)Q*S}vl;1Z83E9UeEQ85-BkX$1uaP4v@z!PW%r~le+kT9}|oRvi{@8{f# zto;}|Iux#9cC-X)bI6^EHyrAekMtxhqUbmQj^$XzR%L>xIi|~){?=ZmBWQMN0e{mr zz!Pm>t-vXxmR1=!<7esO4c}CNdG21phSBC0T37xR6@|{wILGWDl4!H+{ zQA&b#!MS-U;n@_-h0%5?^CsmAgZxeJnsaxO8M&^ZS8JEV#SAJBVARZumze^yiA`UZ zB+NE%BT`yVHyc*daTkbBr2BMul@0CA;q90-fDz(`*1t!{t2vv47TLx^7Nk;I2uQiWC42aJuCY+U}ie6Fi0%uWRyElD^+5rYm~PJwe1WsIUZ%- zDDHxiTQ`pW&$>`NgYbDvaBoX`5>B2KpR4APfDUS>mlg~Stfnx7nlW-&R<>LdeCq4@ z+-37h4gpK7zEp(~?wVg$fv#J|np%TCPonL(PBfJKb4!o$4KB-n^_66Gw6WxpzW@+K z!mcb&KXzwr;Ij#!Z2Sef>9lG{!w=pprBv1+mcPQDHKHJv>_n%1V72gn-Vi77BH-Qc zVH%NPfZb0Cgpn^OHw{LI0)thHk{9@nm^mjg;Xd@5ZhwZWl??^oxNX zMo%sGSbM*DlA`49p+F|UZHS~SJFR(R*cW0w;JyLETJ~@f^d`qn$=^u1*6C`mxy|^gihJ2{4=kXFS6ibCFg%hyzU#Tl)yeg0aeBG9Q zU~v?G`I1u=gr#bB&X22G-p0H)_lTG#2xj00xW6BW-qM``?ZzHOS@^lBuy3-DNMo+3 zA(z?I#K@Gg&3@n;urYR8_l3^@`7HOc5)1UZ0znegDmQqv)DZ}0zzYG|9d)kGm<|)2 zT*E_8*dc+2ZZy-xo^l}R!M5oQxcjx7BDtXIpaIOyz9)Epoh|`kk>tD7Z zrpR-+;-UR5F}(wd!k8&+3no`-c>N&QH)x*S#X-$#em$9(mm5~OXv*vgOQ1qarzXb#sk*y5`pJQ2NC$O!ee5& zPw%tKG%@qzlrv?}(EErelJJIa*{Vb3GYGH%_bW5Ucn6qN$EK|bn0^i@+BfkU)`CRt z%en#)7Ku8i>7?~w8p>yiZJ!hvknyreR}r_GfnItg@+4c+>ga4a(0pR9{XZLBuSM5V z#XNx1X0=ex#QBB6?5Ih-X|H~@k=)9Id6gKar7LDg?6v*-ti9Y3d@XZjA>9~+zFMB z`jb+G748%CCIf=dAi)vzf(FrNFpwYP9cbdZQ>LSt`w5S9?c7qt9|=GF2>N&9PpvYB z8SJ{*xsL`vXrukXIc)Lp$m`aE>GeYP>%Utul z0YbhC=KA1X$-3Kez&JYOak;=*6mwYaNFh55@(Q;c;l&ADIBX0K`kFM*63`h1jpO6? zp=aeFZ-6>jaU(pRw_&Qed#ve@QFD=S4C~&B%nut1b)Q*Sys2KTw!sea z;l?%5O$tsQ?F)=j%at1!7Z##Q7u0#{S+rIo0D$e|@Pb6e`}Ux{$U%P^Id`_c9tpbf z<<`~-3n#i5>%73V3or9jjl9_?_P7Sh{uMl(D-%%rUDz0Znp|d^jj<8Yl*ifnks!`L zBw=0eZS-6AvvE1 zj5I-$gCFeE=Diw#BM8@_2GP;9$a1P`I=T~D8G~%HL$-f6oqyGI8LjRQ!-h({d1rRg)1^b|#bMwn zlm}w!M8F+mRAl4qd}sEhiBt8G8W%N-d*OB3RB8BIQZK9Oj40@UrdC3(QLY*UWHyMF zVVF1tB$pkU_FEZuqHy6^;8(0A`3St$EhHmImTQ?r@dQ|-Q!S=fipb5YGHIyvGBweoE2iwdERgQ{7x3X1(^lKtLtVtSr%4XS4k)S8!=p1Y@XnM669TiJFqcbWosF9Zm_ODd zNu>V%7b8+o37K5cLDZQF`x-BvG}@+tvR&xX>V8W;o4 zCR~j6{aOhzpey>8;{trXj~T(;U=iM=Er#=rijmz089u#wq)oT3aI5?jMdyavF<{t7 z-pgm9F|8$S`-BW|z~=xjgrpwBbElW|OGt^6Y)zW}9un>>f#-rta8@X}v+4l)fgbl7 zXFm6Pr=WnpBLM^x$?2pPoq&n20y4tFSJc^w(c&@EXq6p1q^3{9B!yzXxRNVQPu>0t zF;NuwE><1H#OBz>h@B+!4z5w#S<%*tl)Z|1Oxq2H=FHI1*Nr{<`tE+yj zBor}NIaNDK22^3EGY59hKmStuQLnW z@|*FK1UReYvT?%hd#5T^w}--U@bRpqDo7VHc3pNN-S>L#$GgOGZ=d-mrHGxZh37(P z6q6vy0t{-EB!c9eGjI@Vc-(wG8uGZUj&& z@L5Xv#H(Ay^10T0mfwGpNC>a_nIJ|j*^k=YhXb$KkaY^J3z8B|iIyn1^$xL|KJjdW zB#x~+vgEA1@5l!Dr%aQ}&I^8JmOV_X?hpCpLY9OTwpO5=7%E{?Ocg~{B~qh$x4t1P z5%;mhsaQ!3lSmjwW78i|?PpQIDG{mlRd7v5cwg;6nV_B)+Tec$7(Kr7jTOFkL8PZF z;c?79Y8W&quhUonxSSJiK7dU--K96?MY6jExW$Skx?#t@nae1m-;Z>&0N z^PDS4Gr45jLQ`qJr6(j3oKWPxa~J(}ysrG}IG&k2$WJwke_s&sWuKqQDDe98}qy>d=sGCtV;qJk>m4FNf8DUUG zf?m36Npa;2Y~Jd0v`-M~01RPAgH49#-X-_tHU@{15u{1`7`7d@HKP-MUu`Smen<^f z-Ao|CQkW&iUA^c$e1#Z^Jb1JB3(MAY0wq?R%4O z@2~Xu_^|RbZ=%>l=E%=1$G7R0rnoTFcojS-sZ+ZNsJpk4rb#-a!LIJx=(SmGHL>BL( zVpJ<8In2EhnJ$S(D7OY{WK2+$X9Y%3p+@tdLw9H_0IZ}84T6XLAbNAmWG@DHpMlBm zDV>5+;-6ttvP8}g^1Lu=mkD*^CPsOKD5j&7J9s^%7Vqj45O2z&d;~vG;yuL+7J|le zi?o{{1#KVF*|n}Q;fEA#6Z$7wCMQY(@SQYs=qVGNrds(&O2#Be`=uCpY>leZAdDAE zz&b4m?n)2mg9d~w>VLK%ntWIs+Eufe_|=xW(ADocc^6BS5OFghp-92m+$8(`IKK68 zLBd=irwqc)N0$zq82lb0wxcXSv-=p^7*}~+$(LXFHiZA@|kB{+J& zJULtZ(9V+7Byv*oGnJ=)H;$V7hI9#{4a$-O*E9v4F+vejqG77y2@=f4<^=hVFF4Sk zH8sep6`F73%PQ`h5j|>zg$J_5J1V!vga~=frELHu0|%K~Feq+l?fLYEl zEQH)T08QW}5=&gKj~<%Up!k`_gw!_~tcV1peo>8-DMH|Gla8uD>N;t63(f}l ze~n-X<7rG}V}unS685l<*cM~&!#KLZYty43m-}Ifw(13cU!mI)vwV_~2S)-98(zL8 z+MpFeD*O&Z=05KPGgAavzk}-nelF4nAIhg1cjgMmBfaA z+V~KHc-~fCOibo zCyZS4PA8gakqoq0+8sxr!OfV)vkGc1wkj;fC^R!P8CMx}iYKWutx+wN$l@jeyAkMY zW0&+2!|!{&nQzcTYGs%X)6|_GkIFJ(tpND8u&3+A^gye~e=^GjD02i;CzIfhn&_JU zQNji%!avTT9t^hZv3;F7b7Jmb$^9U0u>N>O1av&#H-uH^Xwpu|PVysMZqr}ES6Jss zsKuv?1}1VjlYxU01xQ#ZH2`QCTimSZO@nx%ei~V~3?yr}0uyK|RLhHq9RLHph7YvY z>xpbw2nrGOb#GNfT<)FdPC{s<98O^&WabBzSQ|RLa~Z&?XS?Y!1SyYShMEC%Un3GM zPG>F%LF%eF&yKpoNqD^7bZYUIY9e=7b42 z#+slNb$p=hJ9t9Ol@i##dqUnSyA${UI-?++9!cjOlb-Ge;X6m-5nT`>1M5~2pSd}0 zSN-D`rb5EdR?M`K!TWfWy?hj)T_HQcjtWu!xqtc%VJO}Co(i-Wy<1eJt2Fh%DX_7ZKSEKpl+E%Z@7$zx42>wf-2-_9X;V-LwvApmgUjX=HRsD z5Y#7B?3oSi59eJql9pEw?CQwZ17@fn@%7262^JbmUob36tBYhs#g&&~cyTLih-ABLz;IIT`@(h0N40k? zF8{Zzdd@**{o9PPnZ~ZvTk$p#+&lzTG4x3hMp<@`<;8jlPVzr|*oe_TR6YZQyp)bL zh$yv(w>jYY9yB}7*lIZ%_*eTYXF6M%I{P^*!c8PZ4096+I@p+Ad)nIJx3CPW1{La+ z2bc@~>t1p!gS`@-uK-Ej@_L|auOYJc>mjTpfxCO+H;7zb4q4xO3r{=S60;-Eylg}M zD8+COqKs+h82A&Su*f|BtoyA~=84@bShOUM zyhhsE;6#BoiNNADTA?$QTn7W)OLedcEEb^POkzC}p@KrqKC7s*Z(LJ{!+=?7Pb;)l z!C>;a3X7O_oePL7CDNK_dAh*^wlIu^zq_^Lf~I91f(Absmx*sK1jKskvUb4N^dMc7 zCC^v|!;7)!_(SK8(YsZc`{vwq{HFpj3F4~<6R&{@XC*sH-VVU4NksB2B<>oo%s7-R z4{V6?>}X6zB5(&!b9(>&8JY|H0QJTnC=#zm%h9~%RPyHCB7pH*DmhNeFiz%$z6i8C zg3dW0&&xUh@oHSjX_Svi47KbB^%|W=$hkI@kIjDI^%^?gWy((%_RFSkJ+s3b@yXXp z!>R$~D*{qLU2G~nbw6P#XK|m?ZJo5d8o3TyUm}({Wo3cb65U@kH4P+=)PNiTXC*B# z_LWxIFU0_asrafP;|@LV(uk^9DPzqID+CRR@twx)pw$0l8x-k0(Y zIa={Ic#lrQND*gMoW&q=0|o#EV4;2x_C#+?qfWGr$oNdlJ*uKou!gW$jS!-9H%(;* zqWLm}?lV#rjHakuLp1eRGEs00YzIHz#1s_!2}@5w8#Iv#*Q5|(ocAG69zg();G`C; zPE>kDD=u9IPmKT{LpOVD7ssPtOyu=dlnxPG6@Y;?G#(}_7)d9W!Mp~8m+ocQ%6*Mi zNlyW#d{axVs|CRAH`_gJkZ!l(SiCRNrbS({t6G#i z6_35s7I{xiQk8^|^m8-?l`|?t#N7rl78KzRzK@P*YJOu{%nEdC|a2KEIk+R+3;Sx1wx~2!>nG z;Ln4BxZm1$TDIJK)4s6ss*_d}i9}@^n1?{LJoQofb=y{Wip;)r8kD>Zde$;KlUD3^ zusCQVa48gwuQ{u&%!&z4H9n#%Rcp)&OVq`v4COBo2w{DzF~R^J7?kG20y2kssV{=RD@S9}9&zfwqd}mxlR~L{mg) zZ8>&$140dvzm< zn5P*eHve70zcd67T)-Hp5KSzOapi)4pNmZ?@SKXNmJrV04Lpi*Fch-9GZc&+5V;g! zrNLpK5aO09Gkg0*cdNvIM9#lFZ}7KXJBGzpKN8}3C;7@tgTwdY)TMEo#Bq{Puy-5b zb*huRxARiAbr>JB-TL$@RI~Z>WrDA@6|S`hn}2k&tcw5U8hgb%gA-nMq>?qZUlTLS z6oluwWT8wb$(>06$*iC1GZ8MOxtwY3NXiSda51~d-$N=RD#(ZH(8eH^fR*8M(-_|U zM46>nf2}=i9!QQAEUkdc^0&D|t$d!;f{k$voohP^Rr%Y~i<2t{_w)yJi9VTN>=-%Q9*j zQE~W=eX>J))hi7B!agpJ--}>2s7yrd7h<2}-jMKmoG0N$6Ha(IwsM8-+>DPhP)_`D z1@Ux0=>Ha_A++aj^B>Q+$U+++)Lf84ssZe(6nKPjd5^rX(|QeJ|mWm#%kN08azv$@JM}&O~7+^ zEKURSmC!L@L>(XahL3uLGJz1eAqQlZ3u9(QFyv9t?%u~#&O)qG(1v1WKv#M`%Wkt` ztXw9j9@8S80g&k9B?ghwUQ*XeVULT!b?}ncN#@U3CB;9)8HPeDOXzDI~ydQoWErGj|peZgWtAIU4P#gw1M%DZ+OEkiPB3yFL*P2U-pawXM7?Ol}06QBo|RB&bM3C&0fg<6bG#6Qez4}AJ&uLF)OVGQM`^#Rd| zwo5*G@@Qi%lh=01@(nB0LhSD7)TYw4@Km2KyK02PjPPs4@dz>|$O*d{l!>9N{*dx? za2(L7ch!(-SUx%{jxhB9wqnh4Q1y?!Bv8i)-%k~_ow*^N&I}OYM&f{QS|_vRb~nLv zb~!>GvFvR{6PTZ14EuXUIJSdv`OACdN^~a@sBcZu>W8o8}1$Tdt-ua*#R$Q?Hy%JPFC-yEp^_MDa!crI=-V_b)t z?#td%ndQ(>&gm_9eVxrRw>pIhSEt#6pvrpaHF>3^Q+$}{7QH2;d;%npfbii^`W8F| zTE#SgqlLm~@>0tY8axD!&A4anC1;vGYOXMo&87VPv<4R063eX0EP*?S6*Lwk?DHeC zoM(4^0qDX+YOo75w6BSD?~W78M2ZI|ZJ9WvjAYS!7^v}^hqm?=_O>2-ex8a4kFL1? zJ0F;i!qx9|fEmKMAAvUB#*Y#>unU=Fl~l6hRvk++=)DN9@i8_y!2k!?F#|?sh!4zg zKUMeo5&Bx!3W}dnVNw#&OH-XJg7xL}tD_pAOl!^Az(j?6F>z@>2tZ`XqATHRz`pUcJ|G?QTYHn z`2JB?Ti)Il5TRdyU#p<<*;k<<-{iG18^8f!bEJZL^XUNrtn$+XA!+1gfrOn3xysfE z@0X>7G|}8JdO79Pnv=uQsjW}54~#=JQ|854vMd)D?t3G@A5dg9k%fY*Jv&V`pF>-{ z#}DLun18A0P=MCeMgmd&u44he3(aOOcY8&#`>$ zYNx9Lfg@tXfC-%4WzNtXe?PZuFbxrTKrO_581?TdD6El*iB2>uCwcxe1^mdLhYWI5 zisKy|RMpT`1Ev3jnMVL$6q>8QpTonNtm1Fbj`9SULDIOyR%;p>x)m}dN&>t#s?#(D zW$J^XuZ4x#1>X(gt4%!04wyLze%wcl*PB%_CdOFMotuE~-UIAQ_3}Ha@pWI6EVOZ{ z5GR3fcwPCfqd0&${tE}N9nG&cUkFL7fcMIgGGq}F^YE>%Q)=~H6aIH7L4r70$Aq~Z z;4&sf5_B=A9?PQS9kyZJ$$MSV(mA|qWXa>@K|r^QO%!a0ONtlKvY)^C3H0TQ056Ow zI_KMq({Xx>Svx1eEllwt-|;#{;m?=_!TYlqZZgm<1P=A<8q0+SHO0ZMrI9|~gjP?&H?Vs(;%T{h;^;|E^^*aGhKxcR9Vfk~OhGR;6BecVl)?mYxR6Wk)Lmnmho zAq}XSOo18p!{FlN`#o~3Y*0%QfV9Q4@h?xXrT{>gO;P~-4$_3&AH)@o>qs%DS{lE5 z8;lj+NFvI=3t4cax-JF;8>kO)veP6>9@pA!2*$4G`O{>ItmT6Lr@CVsxkPVFHAxvv z!H4ioAD{C3Cp`P^V6LLXO#36{X7>Ozn(DN8x@h(?5+`3ZDt7zr@4%x>Mqj5S9F-){ z&#tNpa=XI$X?Iqz<=q|q69Xev3k3}UUUBX^gF8xV<#P!0vBccfs+FvvLN9`#gtuUZk1(6RVSXBdG`8e=w!1yib<-Jq1+`YW z&vj@G8T9wA#zr^7>}LCPPdUOliTVSX1aoe*9BDcZ@o!QnUb(D42cGd2Db=x|{ui#U z2a6z>^ksCUDPgD_TC`=N;4|kf!^5X|lwc#GDppi4ss*(+KHydPVZE&VAVXc}lCy(= zYa{jVCdSIyaE&8n$dmOH`vFef>3Bf87iA4LdPF?Z;_hcvs)jEY!%HW97ZhHAvxjgf9H9rpmOsn*sEi#tGqt%+QB4tao+t7M%-M#A@I2;P<$Z1o37W5B^j~eSbyaaqiamn>{YtPx`n1Ci7HbpfyFQU^jmT=^2Iaq6T&P-JEhNrRS>Kr>R22g5(V;V@&JEYz}1mD z4Bhh)9jT+ZKmwL9cLelV#L^}5N?>BIt1a?JDmwkxkq`+;pLOP7nu|ost|PctKGqap z^$PA6eim39pzh;vnX8LlgTOE)9wpo_o|{AljJUT#k5Qagl-}?zLgNRvd zxwb3BtS<$OikzIj&$Kmt(hhH#>JEZgAXW7`h3$0)5oZ(Dh3gx@spI;~7Hty4&nhijbJ5k%_}s@dWwL zIAj;EgDu~l=Co$UETGF4HxlRlf&_5J$ia#}ukhHb z;8)PJwW{Sn(0c}ILTgyE>j)MQJ91#E(Vpp3%ZL)1tx`cdR>m6N|UFKE65du9AOJ6 z%E3T^T_RJ=hc@T(M9*49oxwFZ$?oE}DnZ6$b;%*4@NW6WNcfLFcLcpjSGL38Z^(m@ z2^bb-oeJntMQ~7`%K{~lnA;K~4-nhb1giE#NinNZr`N;o$N9(fIU zS<&8i3eg3VQ?2W{HMHUnEfgtnFT}6(e-(1}3#*s{qG5k%aH;Lp>t_4hoG5#tdOztj zoJ%uMdeCX?c#@&l!An9|J4Y=Yc3)KP{Y;AM;Dfk)>TC-~aK4>9a9E*$Ue^V699RcQ z-5f|(TSEMLY=WuE=!ZhHfn01@d{7#o4g&yCBs5XOusG(u%YY0H*K023$Yo`O*1d77B1^P$!3m7^hkM@mtqkhPY08 zxGZJckne>rnqf1`1wV~Yr$(!dv04cHBl<7~nK~ZZ$rb;!aR8v_6V4-sAyr(tqpR6e zv>9__h5?8@6f9&VkIw zGKXtji9ei2bzY!A1ZBH;17axV3G_$mv=5>RhpVPFve97eG(X9mP3#pP?19T_0Soi*?!$h={; zyCaC7lJgkL^H3C%m=s3b7Np*0&mqMmc0xr<9whypOCC#i(ZgS7iN?-5$Wexmsa;l(Tp3^mAEGewi=&0Zj~ zL(tN*H{vEgXO#kTqP39Vd5o#zK_{hXDebpu(}jfi>g?51VAADECTAA8KY#Z_)`Rac#;@D&a$s=j!A*2ixp zusGxcWL6c_N4ki%&dFVKs=)_=w5}fm5Z^L?*n+ou))o|FYTM?r6j;E17=Au&IOzGC zm!*+eND*!Rtx~B=T3tmSVLE*lnOy!>u^-TW96O~F1mKUmIIpvvL{U`Yv(IcZz`Fn% z6?BV2c6HpjtHZL&+djSrBr$WbQ?B1t_(YZ!&l{fK!_eoYbFs;DCbPbOWms29mZeo2 zkdF+(1SBXISJGiht`m(@epMZ(HhEhW7~l=dD(R;{eCD?>2vBRtGQCV1MYDaL;0@G+ zs(3;Ul+w;OQXW}5*C6bp@mYeaIGo94`Lwu7Q)L{_g%0D0eo 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 Uhnft+&li87N+GaBLF}~t1rtxKSpWb4 literal 0 HcmV?d00001 diff --git a/newplot.png b/newplot.png deleted file mode 100644 index 0f91e00693bca84db1f4aaeaa721aeb502160f6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251356 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.5.1", "polars>=1.38.1", "pyarrow>=23.0.1", + "pytest>=9.1.1", "s3fs>=2024.12.0", "transformers>=4.57.3", "umap-learn>=0.5.11", diff --git a/setup.sh b/setup.sh old mode 100644 new mode 100755 index 0215714..ac3e164 --- a/setup.sh +++ b/setup.sh @@ -1,2 +1,3 @@ uv sync uv run pre-commit install +uv run pytest tests/testconnections.py diff --git a/src/evaluation/build_eval_set.py b/src/evaluation/build_eval_set.py index 08834c8..0747512 100644 --- a/src/evaluation/build_eval_set.py +++ b/src/evaluation/build_eval_set.py @@ -20,14 +20,13 @@ import polars as pl +from src.evaluation.config import PATH_EVAL_INPUT, PATH_EVAL_OUTPUT from src.evaluation.metrics import normalize_code from src.utils.logging import configure_logging configure_logging() logger = logging.getLogger(__name__) -S3_ENDPOINT = "https://minio.lab.sspcloud.fr" - def load_dataframe(path: str) -> pl.DataFrame: """Charge un parquet depuis le disque local ou S3 (Datalab).""" @@ -39,7 +38,7 @@ def load_dataframe(path: str) -> pl.DataFrame: logger.info(f"Loading parquet from S3: {path}") fs = s3fs.S3FileSystem( - client_kwargs={"endpoint_url": S3_ENDPOINT}, + client_kwargs={"endpoint_url": os.environ["AWS_ENDPOINT_URL"]}, key=os.environ["AWS_ACCESS_KEY_ID"], secret=os.environ["AWS_SECRET_ACCESS_KEY"], token=os.environ["AWS_SESSION_TOKEN"], @@ -79,9 +78,7 @@ def stratified_sample( n_strata = df["_stratum"].n_unique() logger.info(f"{n_strata} strata found at depth {stratum_depth}") - sampled = df.filter( - pl.int_range(pl.len()).shuffle(seed=seed).over("_stratum") < n_per_stratum - ) + sampled = df.filter(pl.int_range(pl.len()).shuffle(seed=seed).over("_stratum") < n_per_stratum) logger.info(f"Sampled {len(sampled)} rows out of {len(df)}") return sampled.drop(["_norm_code", "_stratum"]) @@ -89,16 +86,20 @@ def stratified_sample( def main() -> int: parser = argparse.ArgumentParser(description="Build a stratified evaluation set") - parser.add_argument("--input", required=True, help="Input parquet (local path or S3 key)") - parser.add_argument("--output", required=True, help="Output parquet (local path)") - parser.add_argument("--code-column", default="nace2025", help="Label column (default: nace2025)") + parser.add_argument( + "--input", default=PATH_EVAL_INPUT, help="Input parquet (local path or S3 key)" + ) + parser.add_argument("--output", default=PATH_EVAL_OUTPUT, help="Output parquet (local path)") + parser.add_argument( + "--code-column", default="apet2025", help="Label column (default: apet2025)" + ) parser.add_argument( "--n-per-stratum", type=int, default=10, help="Max rows per stratum (default: 10)" ) parser.add_argument( "--stratum-depth", type=int, - default=2, + default=5, help="Code prefix length defining a stratum (default: 2 = NAF division)", ) parser.add_argument("--seed", type=int, default=42, help="Sampling seed (default: 42)") diff --git a/src/evaluation/config.py b/src/evaluation/config.py new file mode 100644 index 0000000..487f091 --- /dev/null +++ b/src/evaluation/config.py @@ -0,0 +1,2 @@ +PATH_EVAL_INPUT = "projet-ape/data/25062026/naf2025/split/df_test.parquet" +PATH_EVAL_OUTPUT = "data/eval/eval_set.parquet" diff --git a/src/evaluation/run_eval.py b/src/evaluation/run_eval.py index 46f0ccd..2e09eda 100644 --- a/src/evaluation/run_eval.py +++ b/src/evaluation/run_eval.py @@ -22,6 +22,7 @@ import polars as pl +from src.evaluation.config import PATH_EVAL_OUTPUT from src.evaluation.metrics import evaluate from src.main import classify_agentic_rag, classify_navigator from src.utils.logging import configure_logging @@ -74,10 +75,14 @@ async def run(args) -> int: def main() -> int: parser = argparse.ArgumentParser(description="Run an evaluation campaign") - parser.add_argument("--eval-set", required=True, help="Evaluation parquet (cf. build_eval_set)") + parser.add_argument( + "--eval-set", default=PATH_EVAL_OUTPUT, help="Evaluation parquet (cf. build_eval_set)" + ) parser.add_argument("--method", choices=sorted(METHODS), default="navigator") parser.add_argument("--text-column", default="libelle", help="Text column (default: libelle)") - parser.add_argument("--code-column", default="nace2025", help="Label column (default: nace2025)") + parser.add_argument( + "--code-column", default="apet2025", help="Label column (default: apet2025)" + ) parser.add_argument("--output-dir", default="data/eval/results", help="Output directory") args = parser.parse_args() return asyncio.run(run(args)) diff --git a/tests/test_connections.py b/tests/test_connections.py new file mode 100644 index 0000000..842ce1f --- /dev/null +++ b/tests/test_connections.py @@ -0,0 +1,101 @@ +"""Connectivity smoke tests for the external services the project depends on. + +Each test performs a minimal, real network call against a service (Neo4j, +the generation LLM API, the embedding API, S3, Langfuse) using the environment +variables documented in docs/framework.md. A test is skipped automatically +when its required variables aren't set, so the suite stays green on a +fresh clone or in CI without Datalab/Onyxia secrets, while still catching +misconfigured endpoints/credentials when they are. + +Run explicitly with: + uv run pytest tests/test_connections.py -v +""" + +import os + +import pytest +from dotenv import load_dotenv + +load_dotenv(override=True) + + +def _require_env(*names): + missing = [name for name in names if not os.environ.get(name)] + return pytest.mark.skipif( + bool(missing), + reason=f"missing env var(s): {', '.join(missing)}", + ) + + +@_require_env("NEO4J_URL", "NEO4J_USERNAME", "NEO4J_PWD") +def test_neo4j_connection(): + from neo4j import GraphDatabase + + driver = GraphDatabase.driver( + os.environ["NEO4J_URL"], + auth=(os.environ["NEO4J_USERNAME"], os.environ["NEO4J_PWD"]), + ) + try: + driver.verify_connectivity() + finally: + driver.close() + + +@_require_env("OPENAI_BASE_URL", "OPENAI_API_KEY") +def test_generation_model_api_connection(): + from openai import OpenAI + + client = OpenAI(base_url=os.environ["OPENAI_BASE_URL"], api_key=os.environ["OPENAI_API_KEY"]) + assert list(client.models.list()) + + +def test_embedding_api_connection(): + base_url = os.environ.get("URL_EMBEDDING_API") or os.environ.get("OPENAI_BASE_URL") + if not base_url: + pytest.skip("missing env var(s): URL_EMBEDDING_API or OPENAI_BASE_URL") + + from openai import OpenAI + + client = OpenAI(base_url=base_url, api_key=os.environ.get("OPENAI_API_KEY", "EMPTY")) + assert list(client.models.list()) + + +_S3_PROBE_PATH = "projet-ape/notices/Notices-NAF2025-FR.parquet" + + +@_require_env("AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY") +def test_s3_connection(): + import s3fs + + fs = s3fs.S3FileSystem( + client_kwargs={"endpoint_url": os.environ.get("AWS_ENDPOINT_URL")}, + key=os.environ["AWS_ACCESS_KEY_ID"], + secret=os.environ["AWS_SECRET_ACCESS_KEY"], + token=os.environ.get("AWS_SESSION_TOKEN"), + # Fail fast rather than hang: this endpoint has been observed to time + # out (instead of erroring) on requests it won't serve. + config_kwargs={"connect_timeout": 5, "read_timeout": 8, "retries": {"max_attempts": 1}}, + ) + assert fs.exists(_S3_PROBE_PATH) + + +@_require_env("LLM_URL", "LLM_API_KEY") +def test_naive_code2text_llm_connection(): + """NaiveCode2Text uses its own LLM_URL/LLM_API_KEY pair (see naive_code2text.py).""" + from openai import OpenAI + + client = OpenAI(base_url=os.environ["LLM_URL"], api_key=os.environ["LLM_API_KEY"]) + assert list(client.models.list()) + + +@_require_env("LANGFUSE_PUBLIC_KEY", "LANGFUSE_SECRET_KEY") +def test_langfuse_connection(): + """Langfuse backs the application tracing used in src/main.py.""" + from langfuse import Langfuse + + client = Langfuse( + public_key=os.environ["LANGFUSE_PUBLIC_KEY"], + secret_key=os.environ["LANGFUSE_SECRET_KEY"], + base_url=os.environ.get("LANGFUSE_BASE_URL"), + ) + assert client.auth_check() diff --git a/uv.lock b/uv.lock index 90c7266..af66a46 100644 --- a/uv.lock +++ b/uv.lock @@ -14,6 +14,7 @@ dependencies = [ sdist = { url = "https://files.pythonhosted.org/packages/4c/d4/6585f3b6fdb75648bca294664af4becc8aa2fb3fb08f4e4e9fd27e10d773/adjusttext-1.3.0.tar.gz", hash = "sha256:4ab75cd4453af4828876ac3e964f2c49be642ea834f0c1f7449558d5f12cbca1", size = 15724, upload-time = "2024-10-31T16:45:36.101Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/53/1c/8feedd607cc14c5df9aef74fe3af9a99bf660743b842a9b5b1865326b4aa/adjustText-1.3.0-py3-none-any.whl", hash = "sha256:da23d7b24b6db5ffa039bb136bfa556207365e32f48ac74b07ad26dd485bc691", size = 13154, upload-time = "2024-10-31T16:45:35.227Z" }, + { url = "https://files.pythonhosted.org/packages/2d/80/7ad35ee5321a86b842f9e8516c8ae4c86f58db7b40e82ce9759f94517a50/adjusttext-1.3.0-py3-none-any.whl", hash = "sha256:bc6c118cd9d7caf6ae37f9355e51d840a2d7f64b4fb2956b8401de27c5af803b", size = 13264, upload-time = "2026-06-08T16:40:05.041Z" }, ] [[package]] @@ -843,6 +844,7 @@ dependencies = [ { name = "plotly" }, { name = "polars" }, { name = "pyarrow" }, + { name = "pytest" }, { name = "s3fs" }, { name = "transformers" }, { name = "umap-learn" }, @@ -878,6 +880,7 @@ requires-dist = [ { name = "plotly", specifier = ">=6.5.1" }, { name = "polars", specifier = ">=1.38.1" }, { name = "pyarrow", specifier = ">=23.0.1" }, + { name = "pytest", specifier = ">=9.1.1" }, { name = "s3fs", specifier = ">=2024.12.0" }, { name = "transformers", specifier = ">=4.57.3" }, { name = "umap-learn", specifier = ">=0.5.11" }, @@ -1053,6 +1056,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, ] +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "ipykernel" version = "7.1.0" @@ -2348,6 +2360,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/8e/24e0bb90b2d75af84820693260c5534e9ed351afdda67ed6f393a141a0e2/plotly-6.5.1-py3-none-any.whl", hash = "sha256:5adad4f58c360612b6c5ce11a308cdbc4fd38ceb1d40594a614f0062e227abe1", size = 9894981, upload-time = "2026-01-07T20:11:38.124Z" }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "polars" version = "1.38.1" @@ -2718,6 +2739,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/99/3147435e15ccd97c0451efc3d13495dc22602e9887f81e64f1b135bae821/pypdf-6.4.2-py3-none-any.whl", hash = "sha256:014dcff867fd99fc0b6fc90ed1f7e1347ef2317ae038a489c2caa64106d268f4", size = 328212, upload-time = "2025-12-14T14:30:56.701Z" }, ] +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" From 804981b19bd9d26fb64dda9e846b7063141641c2 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 7 Jul 2026 13:26:12 +0000 Subject: [PATCH 09/18] feat: add supervised-model classifier and drift-detection module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add SupervisedClassifier: wraps the production torchTextClassifiers model (loaded via MLflow pyfunc, MLFLOW_TRACKING_URI/MLFLOW_MODEL_URI) behind the same MatchVerificationInput contract as the agentic classifiers, wired into the CLI (--supervised) and run_eval.py's METHODS, so it can serve as the reference baseline for the Navigator/Agentic-RAG/supervised comparison called for in the cadrage's design-tradeoff note (S3). Output parsing handles several plausible pyfunc output shapes but is unverified against the real model (no MLflow access in this sandbox) — flagged accordingly. - Add src/evaluation/drift.py: Wasserstein distance, PSI (continuous and categorical) and KS-test drift detection, with alert thresholds calibrated empirically from the reference sample (resampling under the no-drift null) rather than arbitrary constants. Covered by unit tests on synthetic data, including injected/rolling drift. - Add an MLflow connectivity smoke test alongside the existing ones. - Remove the duplicate eval_set parquet left over from before src/evaluation/config.py existed. Docs updated to reflect what's built vs. still needing validation against real Neo4j/LLM/MLflow (none of which is reachable here). --- docs/cadrage_2026-07.md | 22 +- docs/framework.md | 31 +- evaluation/dataset_eval.parquet | Bin 153107 -> 0 bytes pyproject.toml | 2 + .../classifiers/supervised_classifier.py | 104 ++++ src/evaluation/drift.py | 198 +++++++ src/evaluation/run_eval.py | 5 +- src/main.py | 39 ++ src/utils/parser.py | 12 + tests/test_connections.py | 15 + tests/test_drift.py | 114 ++++ uv.lock | 486 +++++++++++++++++- 12 files changed, 1012 insertions(+), 16 deletions(-) delete mode 100644 evaluation/dataset_eval.parquet create mode 100644 src/agents/Text2Code/classifiers/supervised_classifier.py create mode 100644 src/evaluation/drift.py create mode 100644 tests/test_drift.py diff --git a/docs/cadrage_2026-07.md b/docs/cadrage_2026-07.md index 4556f45..bf9dd22 100644 --- a/docs/cadrage_2026-07.md +++ b/docs/cadrage_2026-07.md @@ -51,7 +51,9 @@ Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre - **Le classifieur « Agentic RAG »** (approche alternative combinant recherche par embeddings + *CodeChooser*) n'est pas branché dans le pipeline principal : `main.py` appelle aujourd'hui une fonction *stub* (`classify_agentic_rag`) qui renvoie une valeur codée en dur. → **Corrigé le 6/07** : le classifieur est branché dans la CLI (`--agentic-rag`) ; validation fonctionnelle sur la base Neo4j à faire. - **Le chaînage *Navigator* → *MatchVerifier*** n'est pas encore implémenté : le *Navigator* s'arrête aujourd'hui dès qu'il atteint un code terminal, sans double vérification automatique par un second agent. C'est pourtant l'articulation nécessaire au cas d'usage « monitoring en production ». → **Implémenté le 6/07** via l'option `--verify` de la CLI (en mode unitaire comme en batch) ; validation fonctionnelle sur données réelles à faire. -- **Aucune méthodologie d'évaluation n'est encore formalisée** : ni jeu de données de référence versionné, ni métriques automatisées, ni tableau de bord de suivi. À ce stade, l'évaluation n'existe qu'à l'état de script exploratoire ponctuel (projection UMAP/PaCMAP/t-SNE/PCA des embeddings, calcul de k-plus-proches-voisins). C'est le chantier prioritaire du mois (cf. §3). → **Premier socle posé le 6/07** : module `src/evaluation/` (métriques d'exactitude à la feuille et par niveau hiérarchique testées unitairement, échantillonnage stratifié reproductible, harnais de campagne) ; la constitution effective du jeu d'évaluation et les campagnes chiffrées restent à mener (S2–S3). +- **Aucune méthodologie d'évaluation n'est encore formalisée** : ni jeu de données de référence versionné, ni métriques automatisées, ni tableau de bord de suivi. À ce stade, l'évaluation n'existe qu'à l'état de script exploratoire ponctuel (projection UMAP/PaCMAP/t-SNE/PCA des embeddings, calcul de k-plus-proches-voisins). C'est le chantier prioritaire du mois (cf. §3). → **Socle posé et jeu d'évaluation construit le 6/07** : module `src/evaluation/` (métriques d'exactitude à la feuille et par niveau hiérarchique testées unitairement, échantillonnage stratifié reproductible, harnais de campagne) ; **`data/eval/eval_set.parquet` est constitué et versionné** (5 181 lignes, stratifié par code complet `apet2025`, ~10 exemples/code). Restent à mener : les campagnes chiffrées elles-mêmes (S3). +- **Le modèle supervisé de production n'était pas mobilisable comme référence de comparaison** : aucun wrapper ne l'exposait avec le même contrat que les classifieurs agentiques. → **Ajouté le 6/07** : `SupervisedClassifier` (`src/agents/Text2Code/classifiers/supervised_classifier.py`) charge le modèle (`torchTextClassifiers`) via MLflow pyfunc et l'expose en `--supervised` dans la CLI et dans `run_eval.py` ; **non validé fonctionnellement** (format de sortie du modèle réel non vérifiable dans cet environnement). +- **La détection de dérive (§3.3-C) n'existait qu'à l'état d'idée.** → **Prototype ajouté le 6/07** : `src/evaluation/drift.py` (Wasserstein, PSI, Kolmogorov-Smirnov, seuils calibrés empiriquement par rééchantillonnage), testé sur données synthétiques (dérive simulée) — reste à valider sur un flux réel de prédictions (S4). - **La génération synthétique agentique** (*Code2Text*, par opposition à l'approche *Naive*) est au stade de squelette de code, non encore évaluée ni comparée à l'approche naïve. - **Aucune intégration continue (CI) ne teste le code applicatif** : les deux workflows GitHub existants ne font que déployer les slides de présentation et les embeddings, sans exécuter de tests. → **Corrigé le 6/07** : workflow CI ajouté (lint `ruff`, vérification de syntaxe, tests unitaires). - **Pas encore de documentation technique détaillée du framework**, au-delà du README et de la présentation de démonstration — c'est l'objet du chantier lancé cette semaine (cf. §4). @@ -74,10 +76,10 @@ Méthode retenue pour l'évaluation du classifieur (*Navigator*, et *Agentic RAG ### 3.2 Jeu d'évaluation -- **Source de référence** : réutiliser le jeu de test déjà utilisé pour le modèle supervisé de production (split `df_train`/test du projet APE, colonnes `libelle` / `nace2025`), déjà mobilisé de façon exploratoire dans `explorations.py`. Cela permet une comparaison directe et un jeu de labels dont la qualité est déjà connue. -- **Construction d'un échantillon d'évaluation stratifié** : tirage représentatif par section/niveau de la NAF (pas uniquement aléatoire), pour garantir une couverture des cas rares et des sections à fort volume. +- **Source de référence** : réutiliser le jeu de test déjà utilisé pour le modèle supervisé de production (split `df_test` du projet APE, colonnes `libelle` / `apet2025`), déjà mobilisé de façon exploratoire dans `explorations.py`. Cela permet une comparaison directe et un jeu de labels dont la qualité est déjà connue. +- **Construction d'un échantillon d'évaluation stratifié** : tirage représentatif par code (pas uniquement aléatoire), pour garantir une couverture des cas rares et des codes à fort volume. → **Fait le 6/07** : `data/eval/eval_set.parquet`, 5 181 lignes, ~10 exemples par code complet. - **Isolation d'un sous-échantillon à ré-annoter manuellement** : pour les cas où le label historique est jugé incertain, base du protocole d'évaluation manuelle décrit en §3.1. -- Le jeu d'évaluation et son protocole de constitution seront versionnés dans le dépôt (et documentés dans `docs/framework.md`, cf. §4) pour être réutilisables et auditable. +- Le jeu d'évaluation et son protocole de constitution sont versionnés dans le dépôt (et documentés dans `docs/framework.md`, cf. §4) pour être réutilisables et auditable. ### 3.3 Pistes à explorer @@ -97,9 +99,9 @@ Méthode retenue pour l'évaluation du classifieur (*Navigator*, et *Agentic RAG **C. Monitoring en production** - Premiers tests du cas d'usage **monitoring** : simulation d'un flux de prédictions du modèle de production, détection par *MatchVerifier* des cas à recoder. - **Détection de dérive de distribution**, non supervisée, en amont ou en complément de *MatchVerifier* — répond directement à l'enjeu « comment contrôler le modèle en production sans annotation humaine continue ? » (§1.2). Plan de travail : - 1. implémenter et comparer plusieurs métriques de dérive sur les distributions de prédictions/embeddings dans le temps : **distance de Wasserstein**, **Population Stability Index (PSI)** et **test de Kolmogorov-Smirnov** — trois métriques usuelles en surveillance de modèles de risque (proches de ce qui est attendu dans un cadre de gouvernance de modèle type SR 11-7) ; - 2. calibrer des seuils d'alerte sur des fenêtres temporelles glissantes, à partir de l'historique de prédictions du modèle de production ; - 3. valider sur un cas de dérive simulée (ex. injection artificielle d'un décalage de distribution) avant tout test sur données réelles. + 1. implémenter et comparer plusieurs métriques de dérive sur les distributions de prédictions/embeddings dans le temps : **distance de Wasserstein**, **Population Stability Index (PSI)** et **test de Kolmogorov-Smirnov** — trois métriques usuelles en surveillance de modèles de risque (proches de ce qui est attendu dans un cadre de gouvernance de modèle type SR 11-7) ; → **Fait le 6/07** : `src/evaluation/drift.py`. + 2. calibrer des seuils d'alerte sur des fenêtres temporelles glissantes, à partir de l'historique de prédictions du modèle de production ; → **Fait le 6/07** pour la calibration (empirique, par rééchantillonnage de la référence) ; l'application à un historique réel de prédictions reste à faire. + 3. valider sur un cas de dérive simulée (ex. injection artificielle d'un décalage de distribution) avant tout test sur données réelles. → **Fait le 6/07** (tests unitaires avec dérive synthétique injectée) ; validation sur données réelles toujours à faire (S4). **D. Génération de données et industrialisation du modèle agentique** - Premiers tests du cas d'usage **génération synthétique pour ré-entraînement**, avec une métrique proxy (gain de performance du modèle supervisé sur les classes enrichies). @@ -110,9 +112,9 @@ Méthode retenue pour l'évaluation du classifieur (*Navigator*, et *Agentic RAG | Semaine | Dates | Objectifs | |---|---|---| | **S1** | 6 → 11 juillet | Corriger le bug bloquant (`agentic_rag.py`) et **nettoyer le dépôt** (code mort, artefacts de build committés par erreur, structuration des scripts exploratoires, CI minimale de lint/import) pour fiabiliser la base de code. Poser les bases de la **documentation détaillée du framework** (architecture, modèle de données, contrats des agents — voir §4), première brique valorisable en document de travail DMCSI. | -| **S2** | 14 → 18 juillet | Formaliser la méthode d'évaluation (§3.1) et constituer le **jeu d'évaluation stratifié** (§3.2), versionné dans le dépôt, en s'appuyant sur un premier **diagnostic de l'espace d'embedding** (formalisation des analyses UMAP/kNN déjà amorcées). Brancher le classifieur *Agentic RAG* dans le pipeline principal (retirer le stub). | -| **S3** | 21 → 25 juillet | Implémenter le chaînage *Navigator* → *MatchVerifier*. Lancer les **premières campagnes d'évaluation chiffrées** du *Navigator* (et de l'*Agentic RAG*) sur le jeu d'évaluation, avec comparaison au modèle supervisé de référence **assortie d'intervalles de confiance et d'une analyse d'erreurs par segment** (§3.3-B). Amorcer un **prototype d'automatisation de la pipeline d'évaluation via Argo Workflows**. Rédiger la **note de conception *Navigator* vs *Agentic RAG* vs supervisé** (compromis exactitude/latence/coût). | -| **S4** | 28 → 31 juillet | Évaluer la génération synthétique (*Code2Text* / *NaiveCode2Text*) via la métrique proxy de ré-entraînement. **Prototype de détection de dérive** (Wasserstein, PSI, Kolmogorov-Smirnov) validé sur un cas de dérive simulée (§3.3-C). Synthèse des résultats du mois et note de recommandation sur les cas d'usage à prioriser pour la suite (monitoring, recodage, génération de données). | +| **S2** | 14 → 18 juillet | Formaliser la méthode d'évaluation (§3.1) et constituer le **jeu d'évaluation stratifié** (§3.2), versionné dans le dépôt — ✅ fait le 6/07 (`data/eval/eval_set.parquet`) — en s'appuyant sur un premier **diagnostic de l'espace d'embedding** (formalisation des analyses UMAP/kNN déjà amorcées, reste à faire). Brancher le classifieur *Agentic RAG* dans le pipeline principal — ✅ fait le 6/07. | +| **S3** | 21 → 25 juillet | Implémenter le chaînage *Navigator* → *MatchVerifier* — ✅ fait le 6/07. Lancer les **premières campagnes d'évaluation chiffrées** du *Navigator*, de l'*Agentic RAG* **et du modèle supervisé de référence** (`--supervised`, ✅ branché le 6/07, non validé fonctionnellement) sur le jeu d'évaluation, assorties d'intervalles de confiance et d'une analyse d'erreurs par segment (§3.3-B). Amorcer un **prototype d'automatisation de la pipeline d'évaluation via Argo Workflows**. Rédiger la **note de conception *Navigator* vs *Agentic RAG* vs supervisé** (compromis exactitude/latence/coût). | +| **S4** | 28 → 31 juillet | Évaluer la génération synthétique (*Code2Text* / *NaiveCode2Text*) via la métrique proxy de ré-entraînement. **Prototype de détection de dérive** (Wasserstein, PSI, Kolmogorov-Smirnov) — ✅ fait le 6/07 (`src/evaluation/drift.py`), validé sur dérive simulée ; validation sur un flux réel de prédictions à faire. Synthèse des résultats du mois et note de recommandation sur les cas d'usage à prioriser pour la suite (monitoring, recodage, génération de données). | > Pistes identifiées mais volontairement hors périmètre resserré de juillet, à ré-examiner ensuite : industrialisation complète (au-delà du prototype) de la pipeline Argo Workflows ; exploration **LoRA/QLoRA** pour un modèle agentique plus léger (cf. §3.3-D). diff --git a/docs/framework.md b/docs/framework.md index d4ba7db..68c4030 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -80,6 +80,7 @@ Chaque appel d'outil est journalisé (position avant/après, données renvoyées - `BaseClassifier` — spécialise `BaseAgent` en fixant le type de sortie à `MatchVerificationInput` (activité, code proposé, explication, confiance), le format commun attendu par les agents « closers ». - `NavigatorAgenticClassifier` — classifieur concret : instructions demandant au *Navigator* de descendre jusqu'à un code terminal (`is_final = 1`) en justifiant chaque choix, en démarrant systématiquement par `get_current_children()`. - `AgenticRAGClassifier` (`agentic_rag.py`) — approche alternative : récupération des *top-k* codes les plus proches par similarité d'embedding (`Graph.get_closest_codes`, recherche vectorielle Neo4j filtrée sur les codes finaux), puis arbitrage par l'agent `CodeChooser`. Branché dans la CLI via `--agentic-rag` ; le nombre de candidats est réglable par la variable d'environnement `AGENTIC_RAG_TOP_K` (défaut : 5). +- `SupervisedClassifier` (`supervised_classifier.py`) — **pas un agent LLM** : charge le modèle supervisé de production (*deep learning*, package `torchTextClassifiers`, cf. cadrage §1.1) via l'API MLflow pyfunc (`MLFLOW_TRACKING_URI` / `MLFLOW_MODEL_URI`) et l'expose avec le même contrat de sortie (`MatchVerificationInput`) que les deux classifieurs agentiques, pour servir de référence dans la comparaison chiffrée (cf. cadrage §3.3-B, note de conception). Branché dans la CLI via `--supervised`. **Non validé** : le format exact de sortie du modèle logué (nom des colonnes, présence d'un score de confiance) n'a pas pu être vérifié dans cet environnement — `_parse_prediction` gère plusieurs formats plausibles et journalise un avertissement s'il doit se rabattre sur une confiance par défaut de 1.0. ### 3.5 Agents « closers » (`src/agents/closers/`) @@ -104,11 +105,13 @@ La CLI (`src/utils/parser.py`) expose deux méthodes de classification, avec vé ```bash uv run -m src.main --navigator "Boulangerie artisanale avec vente directe" uv run -m src.main --agentic-rag "Boulangerie" --verify +uv run -m src.main --supervised "Boulangerie" uv run -m src.main --navigator --batch-file requetes.txt --experiment-name mon-experience ``` - `--navigator QUERY` — classification agentique par navigation hiérarchique (*Navigator*) ; - `--agentic-rag QUERY` — classification par recherche vectorielle *top-k* + arbitrage `CodeChooser` (cf. §3.4) ; +- `--supervised QUERY` — classification par le modèle supervisé de production via MLflow (cf. §3.4) ; - `--verify` — chaîne la prédiction dans le *MatchVerifier* pour double vérification (cf. §3.5) ; - `--batch-file FILE` — traite un fichier de requêtes (une par ligne) avec la méthode choisie ; - `--experiment-name` — nom d'expérience propagé au traçage Langfuse. @@ -126,6 +129,26 @@ uv run -m src.evaluation.build_eval_set --input --output data uv run -m src.evaluation.run_eval --eval-set data/eval/eval_set.parquet --method navigator ``` +Le jeu d'évaluation est désormais construit et versionné (`data/eval/eval_set.parquet`, 5 181 lignes, stratifié par code complet — `apet2025`, ~10 exemples/code) ; `run_eval.py` propose trois méthodes : `navigator`, `agentic-rag`, `supervised`. + +### 5.1 Détection de dérive (`src/evaluation/drift.py`) + +Implémente le plan de travail du cas d'usage monitoring (cf. cadrage §3.3-C), sans dépendance à Neo4j ni à un LLM — testable sur données synthétiques : + +- `wasserstein_drift`, `ks_drift` — pour un signal continu (ex. scores de confiance renvoyés par `CodeChooser`/`MatchVerifier`). +- `psi` (continu, bins par quantiles de la référence) et `psi_categorical` (fréquences de catégories, ex. distribution des codes prédits). +- `calibrate_threshold` — calibre un seuil d'alerte **empiriquement** à partir de la seule référence (rééchantillonnage sous l'hypothèse « pas de dérive »), plutôt qu'un seuil arbitraire. +- `drift_report` / `rolling_drift_reports` — combine les trois métriques (alerte si au moins 2 sur 3 concordent) sur une fenêtre, ou une suite de fenêtres temporelles glissantes. + +```python +from src.evaluation.drift import drift_report + +report = drift_report(reference_confidences, current_window_confidences) +report["any_drift"] # bool +``` + +**[à compléter]** : validation sur un flux réel de prédictions du modèle de production (données synthétiques uniquement à ce stade). + ## 6. Configuration (variables d'environnement) | Variable | Usage | @@ -136,9 +159,12 @@ uv run -m src.evaluation.run_eval --eval-set data/eval/eval_set.parquet --method | `MAX_TURNS` | Nombre maximal de tours d'agent (boucle outil → réponse) | | `EMBEDDING_MODEL`, `URL_EMBEDDING_API`, `MAX_TOKENS` | Modèle et service d'embedding utilisés lors de la construction du graphe | | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_ENDPOINT_URL` | Accès S3 (Datalab/Onyxia) pour les données sources et notices | +| `MLFLOW_TRACKING_URI`, `MLFLOW_MODEL_URI` | Chargement du modèle supervisé de production par `SupervisedClassifier` (`MLFLOW_MODEL_URI` ex. `models:/apet_classifier/Production`) | Le traçage applicatif (sessions, coûts, latence, arbre d'appels des agents) est assuré par **Langfuse** (`get_client`, `propagate_attributes`, `@observe` dans `src/main.py`). +Un test de connectivité par service externe (Neo4j, LLM de génération, embedding, S3, Langfuse, MLflow) est disponible dans `tests/test_connections.py` — chaque test se saute automatiquement si les variables requises sont absentes, pour rester vert en CI sans secrets Datalab tout en détectant un endpoint/identifiant mal configuré quand ils sont présents. + ## 7. Comment étendre GRAAL à une nouvelle nomenclature **[à compléter]** Cette section documentera, une fois formalisée, le mode opératoire complet pour instancier GRAAL sur une nouvelle nomenclature : format attendu du fichier de notices, exécution du pipeline de construction du graphe, adaptation minimale des prompts si nécessaire. @@ -148,8 +174,9 @@ Cette section documentera, une fois formalisée, le mode opératoire complet pou Recensées ici pour mémoire (suivi détaillé dans le document de cadrage) : - Les composants branchés le 6/07 (classifieur *Agentic RAG* dans la CLI, chaînage `--verify`, harnais `run_eval`) sont vérifiés statiquement (lint, syntaxe, tests unitaires des métriques) mais **pas encore validés fonctionnellement** contre la base Neo4j et l'API LLM — à faire dès le retour sur l'environnement Datalab. -- La CI couvre lint, syntaxe et tests unitaires purs, mais **pas de tests d'intégration** (agents + graphe) : ils nécessiteraient un service Neo4j et un LLM de test dans le workflow. -- Le jeu d'évaluation lui-même n'est pas encore constitué ni versionné (l'outillage est prêt, il manque l'accès aux données — chantier semaine 2 de la roadmap de juillet). +- `SupervisedClassifier` (modèle de production via MLflow) est également non validé fonctionnellement : le parsing de la sortie `.predict()` est écrit pour plusieurs formats plausibles mais n'a pas pu être testé contre le modèle réel dans cet environnement (pas d'accès au tracking MLflow). +- La CI couvre lint, syntaxe et tests unitaires purs (dont le module `drift.py`, testé sur données synthétiques), mais **pas de tests d'intégration** (agents + graphe + MLflow) : ils nécessiteraient les services correspondants dans le workflow. `tests/test_connections.py` comble partiellement ce manque en local/Datalab (smoke tests skippés si les identifiants sont absents). +- Le jeu d'évaluation est désormais constitué et versionné (`data/eval/eval_set.parquet`) ; restent les campagnes chiffrées elles-mêmes (S3 de la roadmap). - **Le projet requiert Python ≥ 3.12** (idéalement 3.13, cf. `pyproject.toml` et `.python-version`) : certains modules (ex. `prompt_builder.py`) utilisent des f-strings à guillemets imbriqués, syntaxe introduite par la PEP 701 et invalide sur des versions antérieures. Exécuter le projet avec un interpréteur plus ancien (3.11 par exemple) produit de fausses erreurs de syntaxe sur ces fichiers. --- diff --git a/evaluation/dataset_eval.parquet b/evaluation/dataset_eval.parquet deleted file mode 100644 index 2121661a1975ba42df964423a6feea6ad7515e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153107 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%0D0eo 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 Uhnft+&li87N+GaBLF}~t1rtxKSpWb4 diff --git a/pyproject.toml b/pyproject.toml index b265fe3..194814b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,7 @@ dependencies = [ "langchain-text-splitters>=1.1.0", "langfuse>=3.11.2", "matplotlib>=3.10.8", + "mlflow>=2.19.0", "nbclient>=0.10.4", "nbformat>=5.10.4", "networkx>=3.6.1", @@ -29,6 +30,7 @@ dependencies = [ "pyarrow>=23.0.1", "pytest>=9.1.1", "s3fs>=2024.12.0", + "scipy>=1.14.0", "transformers>=4.57.3", "umap-learn>=0.5.11", ] diff --git a/src/agents/Text2Code/classifiers/supervised_classifier.py b/src/agents/Text2Code/classifiers/supervised_classifier.py new file mode 100644 index 0000000..32416c3 --- /dev/null +++ b/src/agents/Text2Code/classifiers/supervised_classifier.py @@ -0,0 +1,104 @@ +"""Wrapper autour du modèle supervisé de production (torchTextClassifiers, MLflow). + +Ce classifieur n'est PAS un agent LLM : il charge le modèle de *deep learning* +actuellement en production (cf. cadrage §1.1, entraîné avec le package +`torchTextClassifiers`, distribué via MLflow) et l'expose avec le même contrat +de sortie (`MatchVerificationInput`) que `NavigatorAgenticClassifier` et +`AgenticRAGClassifier`, pour qu'il puisse être comparé aux méthodes agentiques +dans `src/evaluation/run_eval.py` (cf. cadrage §3.3-B, note de conception). + +Le modèle est chargé une seule fois par processus (cache module-level) via +l'API MLflow pyfunc, indépendante du framework d'entraînement sous-jacent. + +**Non validé à ce stade** : le format exact renvoyé par `.predict()` pour ce +modèle précis (nom des colonnes de sortie, présence d'un score de confiance) +n'a pas pu être vérifié dans cet environnement (pas d'accès au tracking +MLflow). `_parse_prediction` gère plusieurs formats plausibles et journalise +un avertissement s'il doit se rabattre sur une confiance par défaut — à +corriger après un premier essai réel sur le Datalab. +""" + +import asyncio +import logging +import os + +logger = logging.getLogger(__name__) + +_model = None # cache module-level : un seul chargement par processus + + +def _load_model(): + global _model + if _model is None: + import mlflow + + tracking_uri = os.environ["MLFLOW_TRACKING_URI"] + model_uri = os.environ["MLFLOW_MODEL_URI"] # ex. "models:/apet_classifier/Production" + logger.info(f"Loading supervised model '{model_uri}' from MLflow ({tracking_uri})") + + mlflow.set_tracking_uri(tracking_uri) + _model = mlflow.pyfunc.load_model(model_uri) + return _model + + +def _parse_prediction(raw_prediction, text: str) -> tuple[str, float]: + """Extrait (code, confiance) d'une sortie `.predict()` MLflow pyfunc. + + Gère les formats plausibles pour un modèle de classification logué en + pyfunc : DataFrame avec colonnes code/confiance explicites, DataFrame à + une seule colonne (pas de confiance dans la sortie), ou liste/array brute. + """ + try: + import pandas as pd + + if isinstance(raw_prediction, pd.DataFrame): + row = raw_prediction.iloc[0] + code_col = next( + (c for c in ("code", "prediction", "label", "apet2025") if c in row.index), None + ) + confidence_col = next( + (c for c in ("confidence", "score", "probability") if c in row.index), None + ) + if code_col is not None: + code = str(row[code_col]) + confidence = float(row[confidence_col]) if confidence_col is not None else None + if confidence is None: + logger.warning( + f"No confidence column in model output for '{text}'; defaulting to 1.0" + ) + return code, confidence if confidence is not None else 1.0 + except ImportError: + pass + + # Repli : liste/array de labels, éventuellement de tuples (label, score) + first = raw_prediction[0] if hasattr(raw_prediction, "__getitem__") else raw_prediction + if isinstance(first, (list, tuple)) and len(first) >= 2: + return str(first[0]), float(first[1]) + + logger.warning(f"Unrecognized model output shape for '{text}'; defaulting confidence to 1.0") + return str(first), 1.0 + + +class SupervisedClassifier: + """Classifieur de référence : modèle supervisé de production via MLflow.""" + + def __init__(self): + self.model = _load_model() + + async def __call__(self, activity: str): + from src.agents.closers.match_verifier import MatchVerificationInput + + code, confidence = await asyncio.to_thread(self._predict, activity) + + return MatchVerificationInput( + activity=activity, + code=code, + proposed_explanation="Prédiction du modèle supervisé de production (torchTextClassifiers)", + proposed_confidence=confidence, + ) + + def _predict(self, activity: str) -> tuple[str, float]: + import pandas as pd + + raw_prediction = self.model.predict(pd.DataFrame({"text": [activity]})) + return _parse_prediction(raw_prediction, activity) diff --git a/src/evaluation/drift.py b/src/evaluation/drift.py new file mode 100644 index 0000000..89b762e --- /dev/null +++ b/src/evaluation/drift.py @@ -0,0 +1,198 @@ +"""Détection de dérive de distribution, sans étiquettes (cf. cadrage §3.3-C). + +Sert le cas d'usage monitoring : surveiller la distribution des prédictions +d'un modèle en production (scores de confiance, fréquence des codes prédits) +et détecter un décalage par rapport à une période de référence, sans +nécessiter d'annotation humaine continue. + +Trois métriques usuelles en surveillance de modèles : +- **distance de Wasserstein** et **test de Kolmogorov-Smirnov** : pour des + signaux continus (ex. scores de confiance du *CodeChooser*/*MatchVerifier*). +- **Population Stability Index (PSI)** : pour un signal continu (bins par + quantiles de la référence) ou catégoriel (ex. fréquence des codes prédits). + +Les seuils d'alerte ne sont pas des constantes arbitraires : `calibrate_threshold` +les dérive empiriquement de la référence elle-même (rééchantillonnage sous +l'hypothèse « pas de dérive »), pour un taux de fausse alerte contrôlé. +""" + + +import numpy as np +from scipy.stats import ks_2samp, wasserstein_distance + + +def wasserstein_drift(reference: np.ndarray, current: np.ndarray) -> float: + """Distance de Wasserstein (terre déplacée) entre deux échantillons continus. + + 0 = distributions identiques ; croît avec l'ampleur du décalage. Sensible + à l'échelle du signal (ex. pas comparable entre un score de confiance + dans [0, 1] et un signal à plus grande échelle). + """ + return float(wasserstein_distance(reference, current)) + + +def ks_drift(reference: np.ndarray, current: np.ndarray) -> dict: + """Test de Kolmogorov-Smirnov à deux échantillons. + + Returns: + {"statistic": écart maximal entre fonctions de répartition empiriques, + "p_value": probabilité d'observer un tel écart sous H0 (même distribution)} + """ + statistic, p_value = ks_2samp(reference, current) + return {"statistic": float(statistic), "p_value": float(p_value)} + + +def psi(reference: np.ndarray, current: np.ndarray, n_bins: int = 10, eps: float = 1e-4) -> float: + """Population Stability Index entre deux échantillons continus. + + Les bins sont définis par les quantiles de `reference` (pas de `current`), + pour que le découpage ne dépende que de la période de référence. + + Repères usuels en gouvernance de modèle : PSI < 0.1 = stable, + 0.1-0.25 = dérive modérée à surveiller, > 0.25 = dérive significative. + """ + quantile_edges = np.quantile(reference, np.linspace(0, 1, n_bins + 1)) + quantile_edges[0], quantile_edges[-1] = -np.inf, np.inf + + ref_counts, _ = np.histogram(reference, bins=quantile_edges) + cur_counts, _ = np.histogram(current, bins=quantile_edges) + + return _psi_from_counts(ref_counts, cur_counts, eps=eps) + + +def psi_categorical(reference_labels: list, current_labels: list, eps: float = 1e-4) -> float: + """Population Stability Index entre deux échantillons catégoriels. + + Cas d'usage typique ici : comparer la distribution des codes prédits sur + deux fenêtres temporelles. Les catégories vues dans l'une des deux + fenêtres mais pas l'autre sont incluses (fréquence 0 lissée par `eps`). + """ + categories = sorted(set(reference_labels) | set(current_labels)) + ref_counts = np.array([reference_labels.count(c) for c in categories]) + cur_counts = np.array([current_labels.count(c) for c in categories]) + return _psi_from_counts(ref_counts, cur_counts, eps=eps) + + +def _psi_from_counts(ref_counts: np.ndarray, cur_counts: np.ndarray, eps: float) -> float: + ref_pct = ref_counts / ref_counts.sum() if ref_counts.sum() else ref_counts.astype(float) + cur_pct = cur_counts / cur_counts.sum() if cur_counts.sum() else cur_counts.astype(float) + ref_pct = np.clip(ref_pct, eps, None) + cur_pct = np.clip(cur_pct, eps, None) + return float(np.sum((cur_pct - ref_pct) * np.log(cur_pct / ref_pct))) + + +def calibrate_threshold( + reference: np.ndarray, + metric_fn, + alpha: float = 0.05, + n_resamples: int = 500, + seed: int = 42, +) -> float: + """Calibre un seuil d'alerte empirique à partir de la seule référence. + + Principe : sous l'hypothèse « pas de dérive », deux sous-échantillons + aléatoires de la référence devraient donner une valeur de métrique + proche de 0. On simule cette hypothèse par rééchantillonnage (bootstrap) + et on prend le quantile (1 - alpha) de la distribution obtenue comme + seuil : au-delà, la dérive observée est trop grande pour être due au + seul bruit d'échantillonnage, au taux de faux positifs `alpha` près. + + Args: + reference: Échantillon de la période de référence. + metric_fn: Fonction (échantillon_a, échantillon_b) -> métrique scalaire + (ex. `wasserstein_drift`, ou `lambda a, b: ks_drift(a, b)["statistic"]`). + alpha: Taux de fausse alerte visé (défaut : 5 %). + n_resamples: Nombre de tirages bootstrap. + seed: Graine, pour un seuil reproductible. + + Returns: + Seuil au-delà duquel une valeur de métrique est considérée comme une + dérive réelle plutôt qu'une fluctuation d'échantillonnage. + """ + rng = np.random.default_rng(seed) + reference = np.asarray(reference) + half = len(reference) // 2 + if half < 1: + raise ValueError("reference must have at least 2 elements to calibrate a threshold") + + null_values = [] + for _ in range(n_resamples): + shuffled = rng.permutation(reference) + null_values.append(metric_fn(shuffled[:half], shuffled[half:])) + + return float(np.quantile(null_values, 1 - alpha)) + + +def drift_report( + reference: np.ndarray, + current: np.ndarray, + alpha: float = 0.05, + n_resamples: int = 500, + seed: int = 42, +) -> dict: + """Rapport de dérive combinant les trois métriques sur un signal continu. + + Chaque métrique a son propre seuil calibré empiriquement sur `reference` + (cf. `calibrate_threshold`) plutôt qu'un seuil arbitraire partagé. + + Returns: + Dictionnaire avec, pour chaque métrique, la valeur observée, le seuil + calibré et un booléen `is_drift`, plus `any_drift` (majorité simple). + """ + reference = np.asarray(reference) + current = np.asarray(current) + + wasserstein_value = wasserstein_drift(reference, current) + wasserstein_threshold = calibrate_threshold( + reference, wasserstein_drift, alpha=alpha, n_resamples=n_resamples, seed=seed + ) + + ks_result = ks_drift(reference, current) + + psi_value = psi(reference, current) + psi_threshold = calibrate_threshold( + reference, psi, alpha=alpha, n_resamples=n_resamples, seed=seed + ) + + report = { + "wasserstein": { + "value": wasserstein_value, + "threshold": wasserstein_threshold, + "is_drift": wasserstein_value > wasserstein_threshold, + }, + "ks": { + "statistic": ks_result["statistic"], + "p_value": ks_result["p_value"], + "is_drift": ks_result["p_value"] < alpha, + }, + "psi": { + "value": psi_value, + "threshold": psi_threshold, + "is_drift": psi_value > psi_threshold, + }, + } + n_alerts = sum(m["is_drift"] for m in report.values()) + report["any_drift"] = n_alerts >= 2 # majorité sur les 3 métriques + return report + + +def rolling_drift_reports( + reference: np.ndarray, + windows: list, + alpha: float = 0.05, + n_resamples: int = 500, + seed: int = 42, +) -> list: + """Applique `drift_report` sur une suite de fenêtres temporelles glissantes. + + Args: + reference: Échantillon de la période de référence (fixe). + windows: Liste d'échantillons, un par fenêtre temporelle successive. + + Returns: + Liste de rapports (un par fenêtre), dans l'ordre fourni. + """ + return [ + drift_report(reference, window, alpha=alpha, n_resamples=n_resamples, seed=seed) + for window in windows + ] diff --git a/src/evaluation/run_eval.py b/src/evaluation/run_eval.py index 2e09eda..aa2d113 100644 --- a/src/evaluation/run_eval.py +++ b/src/evaluation/run_eval.py @@ -24,7 +24,7 @@ from src.evaluation.config import PATH_EVAL_OUTPUT from src.evaluation.metrics import evaluate -from src.main import classify_agentic_rag, classify_navigator +from src.main import classify_agentic_rag, classify_navigator, classify_supervised from src.utils.logging import configure_logging configure_logging() @@ -33,6 +33,9 @@ METHODS = { "navigator": classify_navigator, "agentic-rag": classify_agentic_rag, + # Reference baseline: production model, for the Navigator/Agentic-RAG/supervised + # comparison called for in the cadrage's note de conception (§3.3-B). + "supervised": classify_supervised, } diff --git a/src/main.py b/src/main.py index 9295c97..78709b2 100644 --- a/src/main.py +++ b/src/main.py @@ -8,6 +8,7 @@ from src.agents.closers.match_verifier import MatchVerificationInput, MatchVerifier from src.agents.Text2Code.classifiers.agentic_rag import AgenticRAGClassifier from src.agents.Text2Code.classifiers.navigator_classifier import NavigatorAgenticClassifier +from src.agents.Text2Code.classifiers.supervised_classifier import SupervisedClassifier from src.config import neo4j_config from src.navigator.navigator import Navigator from src.neo4j_graph.graph import Graph @@ -88,6 +89,41 @@ async def classify_agentic_rag( return results[0] if is_single else results +@observe +async def classify_supervised( + query: str | list[str], + experiment_name: str = "Supervised Model Classification", +): + """Classify using the production supervised model (torchTextClassifiers via MLflow) + + Serves as the reference baseline for comparing the agentic methods + (cf. cadrage §3.3-B, note de conception). Requires MLFLOW_TRACKING_URI + and MLFLOW_MODEL_URI to be set. + + Args: + query: A single query string or a list of query strings + experiment_name: Name of the experiment + + Returns: + Single MatchVerificationInput if query is str, list of them if query is list + """ + queries = [query] if isinstance(query, str) else query + is_single = isinstance(query, str) + + logger.info(f"Supervised model classification: {len(queries)} query/queries") + + classifier = SupervisedClassifier() + + results = [] + for q in queries: + logger.info(f"Classifying: {q}") + result = await classifier(q) + results.append(result) + logger.info(f"Le résultat de la classification est : {result}") + + return results[0] if is_single else results + + async def verify_classification(prediction: MatchVerificationInput, verifier: MatchVerifier): """Chain a classifier prediction into the MatchVerifier for double-checking @@ -144,6 +180,9 @@ async def main(): if args.agentic_rag: methods_to_run.append(("agentic-rag", args.agentic_rag, classify_agentic_rag)) + if args.supervised: + methods_to_run.append(("supervised", args.supervised, classify_supervised)) + # No method specified if not methods_to_run: logger.info("Use --help to see available options") diff --git a/src/utils/parser.py b/src/utils/parser.py index 795985a..83893e8 100644 --- a/src/utils/parser.py +++ b/src/utils/parser.py @@ -24,6 +24,18 @@ def parse_args() -> argparse.Namespace: metavar="QUERY", help="Classify with embedding retrieval + CodeChooser agent. Default query: 'Boulangerie'", ) + methods.add_argument( + "--supervised", + type=str, + nargs="?", + const="Boulangerie", + default=None, + metavar="QUERY", + help=( + "Classify with the production supervised model (torchTextClassifiers via MLflow). " + "Default query: 'Boulangerie'" + ), + ) options = parser.add_argument_group("Options") diff --git a/tests/test_connections.py b/tests/test_connections.py index 842ce1f..1cf668b 100644 --- a/tests/test_connections.py +++ b/tests/test_connections.py @@ -99,3 +99,18 @@ def test_langfuse_connection(): base_url=os.environ.get("LANGFUSE_BASE_URL"), ) assert client.auth_check() + + +@_require_env("MLFLOW_TRACKING_URI", "MLFLOW_MODEL_URI") +def test_mlflow_supervised_model_connection(): + """Backs SupervisedClassifier (src/agents/Text2Code/classifiers/supervised_classifier.py). + + Only checks that the model can be *loaded*, not that a real prediction + matches the expected output shape — `_parse_prediction` there is + unverified against the real model and may need adjusting after this + passes. + """ + import mlflow + + mlflow.set_tracking_uri(os.environ["MLFLOW_TRACKING_URI"]) + assert mlflow.pyfunc.load_model(os.environ["MLFLOW_MODEL_URI"]) is not None diff --git a/tests/test_drift.py b/tests/test_drift.py new file mode 100644 index 0000000..b7fe1dc --- /dev/null +++ b/tests/test_drift.py @@ -0,0 +1,114 @@ +import numpy as np + +from src.evaluation.drift import ( + calibrate_threshold, + drift_report, + ks_drift, + psi, + psi_categorical, + rolling_drift_reports, + wasserstein_drift, +) + + +def _confidence_scores(n, low, high, seed): + rng = np.random.default_rng(seed) + return rng.uniform(low, high, size=n) + + +def test_wasserstein_zero_for_identical_distributions(): + reference = _confidence_scores(500, 0.6, 1.0, seed=1) + current = _confidence_scores(500, 0.6, 1.0, seed=2) + # Same distribution, different draws: should be small, not exactly 0. + assert wasserstein_drift(reference, reference) == 0.0 + assert wasserstein_drift(reference, current) < 0.05 + + +def test_wasserstein_detects_shift(): + reference = _confidence_scores(500, 0.6, 1.0, seed=1) + shifted = _confidence_scores(500, 0.1, 0.5, seed=2) + assert wasserstein_drift(reference, shifted) > 0.3 + + +def test_ks_drift_no_shift_high_pvalue(): + reference = _confidence_scores(500, 0.6, 1.0, seed=1) + current = _confidence_scores(500, 0.6, 1.0, seed=2) + result = ks_drift(reference, current) + assert result["p_value"] > 0.05 + + +def test_ks_drift_detects_shift(): + reference = _confidence_scores(500, 0.6, 1.0, seed=1) + shifted = _confidence_scores(500, 0.1, 0.5, seed=2) + result = ks_drift(reference, shifted) + assert result["p_value"] < 0.01 + + +def test_psi_no_shift_is_small(): + reference = _confidence_scores(1000, 0.6, 1.0, seed=1) + current = _confidence_scores(1000, 0.6, 1.0, seed=2) + assert psi(reference, current) < 0.1 # seuil usuel de stabilité + + +def test_psi_detects_shift(): + reference = _confidence_scores(1000, 0.6, 1.0, seed=1) + shifted = _confidence_scores(1000, 0.1, 0.5, seed=2) + assert psi(reference, shifted) > 0.25 # seuil usuel de dérive significative + + +def test_psi_categorical_identical_is_zero(): + labels = ["10.71C"] * 50 + ["62.01Z"] * 30 + ["43.99C"] * 20 + assert psi_categorical(labels, labels) == 0.0 + + +def test_psi_categorical_detects_shift(): + reference = ["10.71C"] * 50 + ["62.01Z"] * 30 + ["43.99C"] * 20 + # Same categories, frequencies reversed + shifted = ["10.71C"] * 20 + ["62.01Z"] * 30 + ["43.99C"] * 50 + assert psi_categorical(reference, shifted) > 0.25 + + +def test_psi_categorical_handles_unseen_category(): + reference = ["10.71C"] * 50 + ["62.01Z"] * 50 + current = ["10.71C"] * 50 + ["01.11Z"] * 50 # 62.01Z disappeared, 01.11Z appeared + assert psi_categorical(reference, current) > 0 + + +def test_calibrate_threshold_is_positive_and_reproducible(): + reference = _confidence_scores(500, 0.6, 1.0, seed=1) + threshold_a = calibrate_threshold(reference, wasserstein_drift, seed=42, n_resamples=100) + threshold_b = calibrate_threshold(reference, wasserstein_drift, seed=42, n_resamples=100) + assert threshold_a == threshold_b + assert threshold_a > 0 + + +def test_drift_report_no_drift(): + reference = _confidence_scores(500, 0.6, 1.0, seed=1) + current = _confidence_scores(500, 0.6, 1.0, seed=2) + report = drift_report(reference, current, n_resamples=100) + assert report["any_drift"] is False + assert report["ks"]["is_drift"] is False + + +def test_drift_report_flags_injected_drift(): + reference = _confidence_scores(500, 0.6, 1.0, seed=1) + shifted = _confidence_scores(500, 0.1, 0.5, seed=2) + report = drift_report(reference, shifted, n_resamples=100) + assert report["any_drift"] is True + assert report["wasserstein"]["is_drift"] is True + assert report["ks"]["is_drift"] is True + assert report["psi"]["is_drift"] is True + + +def test_rolling_drift_reports_tracks_progressive_shift(): + reference = _confidence_scores(500, 0.6, 1.0, seed=1) + windows = [ + _confidence_scores(200, 0.6, 1.0, seed=10), # pas de dérive + _confidence_scores(200, 0.6, 1.0, seed=11), # pas de dérive + _confidence_scores(200, 0.1, 0.5, seed=12), # dérive injectée + ] + reports = rolling_drift_reports(reference, windows, n_resamples=100) + assert len(reports) == 3 + assert reports[0]["any_drift"] is False + assert reports[1]["any_drift"] is False + assert reports[2]["any_drift"] is True diff --git a/uv.lock b/uv.lock index af66a46..a0f561c 100644 --- a/uv.lock +++ b/uv.lock @@ -133,6 +133,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, ] +[[package]] +name = "alembic" +version = "1.18.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/cc/ac0bed8e562e7407fe55c3ba85a4dce86e6dbd8730887bd1e406a6c5c18a/alembic-1.18.5.tar.gz", hash = "sha256:1554982221dd17e9a749b53902407578eb305e453f71999e8c7f0a48389fff8e", size = 2060480, upload-time = "2026-06-25T15:20:54.888Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/78/5fe6dc3a3a5b2f5a2a4faef8bfe336d5fa049a38884ab3172e0098160c01/alembic-1.18.5-py3-none-any.whl", hash = "sha256:06d8ba9d04558022f5395e9317de03d270f3dced49cee01f89fe7a13c26f14bc", size = 264664, upload-time = "2026-06-25T15:20:56.673Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + [[package]] name = "annotated-types" version = "0.7.0" @@ -196,6 +219,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" }, ] +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, +] + [[package]] name = "botocore" version = "1.41.5" @@ -210,6 +242,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4e/4e/21cd0b8f365449f1576f93de1ec8718ed18a7a3bc086dfbdeb79437bba7a/botocore-1.41.5-py3-none-any.whl", hash = "sha256:3fef7fcda30c82c27202d232cfdbd6782cb27f20f8e7e21b20606483e66ee73a", size = 14337008, upload-time = "2025-11-26T20:27:35.208Z" }, ] +[[package]] +name = "cachetools" +version = "7.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/8b/0d3945a13955303b81272f759a0331e54c5c793da455e6f5706b89d2639c/cachetools-7.1.4.tar.gz", hash = "sha256:437f55a4e0c1b01a4f3077cc470e6991d47430970e36fbcb77e2be0df4fc1cd6", size = 40085, upload-time = "2026-05-21T22:40:43.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/7b/1fc1c09cc0756cf25861a3be10565915953876da48bb228fb9a672b20a42/cachetools-7.1.4-py3-none-any.whl", hash = "sha256:323dc4127934744db5b54eb4924482d7edafbf9554e820d1531c2e08c0e4ef54", size = 16761, upload-time = "2026-05-21T22:40:41.845Z" }, +] + [[package]] name = "certifi" version = "2025.11.12" @@ -326,6 +367,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] +[[package]] +name = "cloudpickle" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, +] + [[package]] name = "colorama" version = "0.4.6" @@ -531,6 +581,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, ] +[[package]] +name = "databricks-sdk" +version = "0.120.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "protobuf" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/49/d6c19f037d8543831fbcfdac48c62bd741b25bca2fd36e9d03aa21e6b9e8/databricks_sdk-0.120.0.tar.gz", hash = "sha256:12c41492e5d6e7105cb06e6d1a0f1bdf11b76b0630f3a7da85aa8db4fe91dee8", size = 1009418, upload-time = "2026-07-02T14:55:50.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/54/83fae982cdf334cb06919ada810ca98c5012f23d1e36c4574a01c0bb963e/databricks_sdk-0.120.0-py3-none-any.whl", hash = "sha256:2d8e19444df30f714123b330fb616d7775f96631f6e36b4dd252adb4f2e010e2", size = 954576, upload-time = "2026-07-02T14:55:48.546Z" }, +] + [[package]] name = "dataclasses-json" version = "0.6.7" @@ -602,6 +667,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, ] +[[package]] +name = "docker" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload-time = "2024-05-23T11:13:57.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload-time = "2024-05-23T11:13:55.01Z" }, +] + [[package]] name = "duckdb" version = "1.4.4" @@ -633,6 +712,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, ] +[[package]] +name = "fastapi" +version = "0.139.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/af/a5f50ccfa659ec1802cb4ca842c23f06d906a8cc9aef6016a2caeea3d4ed/fastapi-0.139.0.tar.gz", hash = "sha256:99ab7b2d92223c76d6cf10757ab3f89d45b38267fc20b2a136cf02f6beac3145", size = 423016, upload-time = "2026-07-01T16:35:33.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/7c/8e3c6ad324ea5cb36604fc3f968554887891c316d9dfde57761611d907ad/fastapi-0.139.0-py3-none-any.whl", hash = "sha256:cf15e1e9e667ddb0ad63811e60bd11390d1aac838ca4a7a23f421807b2308189", size = 130339, upload-time = "2026-07-01T16:35:32.19Z" }, +] + [[package]] name = "fastjsonschema" version = "2.21.2" @@ -690,6 +785,36 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e3/7f/a1a97644e39e7316d850784c642093c99df1290a460df4ede27659056834/filelock-3.20.1-py3-none-any.whl", hash = "sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a", size = 16666, upload-time = "2025-12-15T23:54:26.874Z" }, ] +[[package]] +name = "flask" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker" }, + { name = "click" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "markupsafe" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424, upload-time = "2026-02-19T05:00:56.027Z" }, +] + +[[package]] +name = "flask-cors" +version = "6.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flask" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/47/03/4e464a50860f9adf08b5c1d3479cb8ea1f12af2aa69535c7042c6e628135/flask_cors-6.0.5.tar.gz", hash = "sha256:30c5031552cd59f620ac0c8211dac45b345d3b2df310e7721879e4f46ef9c601", size = 101386, upload-time = "2026-06-08T20:20:17.765Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/55/5bb1a2d918e9f02f131e47a59032bae70e48050e986e941511fd737a935c/flask_cors-6.0.5-py3-none-any.whl", hash = "sha256:68fcf75693e961f3af26683b23c4b9a8fb6b64de17d20d0c37b95e8de7ab2ed8", size = 16692, upload-time = "2026-06-08T20:20:16.247Z" }, +] + [[package]] name = "fonttools" version = "4.61.1" @@ -805,6 +930,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/de/86/5486b0188d08aa643e127774a99bac51ffa6cf343e3deb0583956dca5b22/fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2", size = 183862, upload-time = "2024-12-19T19:57:28.258Z" }, ] +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/354ae6491228b5eb40e10d89c4d13c651fe1cf7556e35ebdded50cff57ce/gitpython-3.1.50.tar.gz", hash = "sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc", size = 219798, upload-time = "2026-05-06T04:01:26.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", size = 212507, upload-time = "2026-05-06T04:01:23.799Z" }, +] + +[[package]] +name = "google-auth" +version = "2.55.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyasn1-modules" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/6f/f3f4ac177c67bbee8fe8e88f2ab4f36af88c44a096e165c5217accf6e5d3/google_auth-2.55.1.tar.gz", hash = "sha256:fb2d9b730f2c9b8d326ec8d7222f21aef2ead15bf0513793d6442485d87af0a1", size = 349527, upload-time = "2026-06-25T23:39:27.182Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/1d/f6d3ca1ad0725f2e08a1c6915640748a52de2e66596160a4d53b010cccf0/google_auth-2.55.1-py3-none-any.whl", hash = "sha256:eada68dfd52b3b81191827601e2a0c3fa12540c818534b630ddc5355769c3995", size = 252349, upload-time = "2026-06-25T23:38:52.946Z" }, +] + [[package]] name = "googleapis-common-protos" version = "1.72.0" @@ -834,6 +996,7 @@ dependencies = [ { name = "langchain-text-splitters" }, { name = "langfuse" }, { name = "matplotlib" }, + { name = "mlflow" }, { name = "nbclient" }, { name = "nbformat" }, { name = "networkx" }, @@ -846,6 +1009,7 @@ dependencies = [ { name = "pyarrow" }, { name = "pytest" }, { name = "s3fs" }, + { name = "scipy" }, { name = "transformers" }, { name = "umap-learn" }, ] @@ -870,6 +1034,7 @@ requires-dist = [ { name = "langchain-text-splitters", specifier = ">=1.1.0" }, { name = "langfuse", specifier = ">=3.11.2" }, { name = "matplotlib", specifier = ">=3.10.8" }, + { name = "mlflow", specifier = ">=2.19.0" }, { name = "nbclient", specifier = ">=0.10.4" }, { name = "nbformat", specifier = ">=5.10.4" }, { name = "networkx", specifier = ">=3.6.1" }, @@ -882,6 +1047,7 @@ requires-dist = [ { name = "pyarrow", specifier = ">=23.0.1" }, { name = "pytest", specifier = ">=9.1.1" }, { name = "s3fs", specifier = ">=2024.12.0" }, + { name = "scipy", specifier = ">=1.14.0" }, { name = "transformers", specifier = ">=4.57.3" }, { name = "umap-learn", specifier = ">=0.5.11" }, ] @@ -892,6 +1058,42 @@ dev = [ { name = "ruff", specifier = ">=0.14.9" }, ] +[[package]] +name = "graphene" +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "graphql-core" }, + { name = "graphql-relay" }, + { name = "python-dateutil" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/f6/bf62ff950c317ed03e77f3f6ddd7e34aaa98fe89d79ebd660c55343d8054/graphene-3.4.3.tar.gz", hash = "sha256:2a3786948ce75fe7e078443d37f609cbe5bb36ad8d6b828740ad3b95ed1a0aaa", size = 44739, upload-time = "2024-11-09T20:44:25.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/e0/61d8e98007182e6b2aca7cf65904721fb2e4bce0192272ab9cb6f69d8812/graphene-3.4.3-py2.py3-none-any.whl", hash = "sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71", size = 114894, upload-time = "2024-11-09T20:44:23.851Z" }, +] + +[[package]] +name = "graphql-core" +version = "3.2.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/90/f2aff026ab4aebd80eb71905106a0885f4cfde85dcf965543f45bed0d9ee/graphql_core-3.2.11.tar.gz", hash = "sha256:e7e156d10beb127cab5c89ff0da71416fc73d27c484a4757d3b2d35633774802", size = 528407, upload-time = "2026-06-05T13:45:22.915Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/15/b92b4e1d88d02c6eff9733c9eea21846ab435cc4d813d84ccc5d335955df/graphql_core-3.2.11-py3-none-any.whl", hash = "sha256:0b3e35ff41e9adba53021ab0cef475eb18f57c7f53f0f2ca55567fbf3c537ea0", size = 214879, upload-time = "2026-06-05T13:45:21.245Z" }, +] + +[[package]] +name = "graphql-relay" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "graphql-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/13/98fbf8d67552f102488ffc16c6f559ce71ea15f6294728d33928ab5ff14d/graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c", size = 50027, upload-time = "2022-04-16T11:03:45.447Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/16/a4cf06adbc711bd364a73ce043b0b08d8fa5aae3df11b6ee4248bcdad2e0/graphql_relay-3.2.0-py3-none-any.whl", hash = "sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5", size = 16940, upload-time = "2022-04-16T11:03:43.895Z" }, +] + [[package]] name = "greenlet" version = "3.3.0" @@ -901,6 +1103,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/2f/28592176381b9ab2cafa12829ba7b472d177f3acc35d8fbcf3673d966fff/greenlet-3.3.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:a1e41a81c7e2825822f4e068c48cb2196002362619e2d70b148f20a831c00739", size = 275140, upload-time = "2025-12-04T14:23:01.282Z" }, { url = "https://files.pythonhosted.org/packages/2c/80/fbe937bf81e9fca98c981fe499e59a3f45df2a04da0baa5c2be0dca0d329/greenlet-3.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f515a47d02da4d30caaa85b69474cec77b7929b2e936ff7fb853d42f4bf8808", size = 599219, upload-time = "2025-12-04T14:50:08.309Z" }, { url = "https://files.pythonhosted.org/packages/c2/ff/7c985128f0514271b8268476af89aee6866df5eec04ac17dcfbc676213df/greenlet-3.3.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d2d9fd66bfadf230b385fdc90426fcd6eb64db54b40c495b72ac0feb5766c54", size = 610211, upload-time = "2025-12-04T14:57:43.968Z" }, + { url = "https://files.pythonhosted.org/packages/79/07/c47a82d881319ec18a4510bb30463ed6891f2ad2c1901ed5ec23d3de351f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30a6e28487a790417d036088b3bcb3f3ac7d8babaa7d0139edbaddebf3af9492", size = 624311, upload-time = "2025-12-04T15:07:14.697Z" }, { url = "https://files.pythonhosted.org/packages/fd/8e/424b8c6e78bd9837d14ff7df01a9829fc883ba2ab4ea787d4f848435f23f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:087ea5e004437321508a8d6f20efc4cfec5e3c30118e1417ea96ed1d93950527", size = 612833, upload-time = "2025-12-04T14:26:03.669Z" }, { url = "https://files.pythonhosted.org/packages/b5/ba/56699ff9b7c76ca12f1cdc27a886d0f81f2189c3455ff9f65246780f713d/greenlet-3.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab97cf74045343f6c60a39913fa59710e4bd26a536ce7ab2397adf8b27e67c39", size = 1567256, upload-time = "2025-12-04T15:04:25.276Z" }, { url = "https://files.pythonhosted.org/packages/1e/37/f31136132967982d698c71a281a8901daf1a8fbab935dce7c0cf15f942cc/greenlet-3.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5375d2e23184629112ca1ea89a53389dddbffcf417dad40125713d88eb5f96e8", size = 1636483, upload-time = "2025-12-04T14:27:30.804Z" }, @@ -908,6 +1111,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/7c/f0a6d0ede2c7bf092d00bc83ad5bafb7e6ec9b4aab2fbdfa6f134dc73327/greenlet-3.3.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:60c2ef0f578afb3c8d92ea07ad327f9a062547137afe91f38408f08aacab667f", size = 275671, upload-time = "2025-12-04T14:23:05.267Z" }, { url = "https://files.pythonhosted.org/packages/44/06/dac639ae1a50f5969d82d2e3dd9767d30d6dbdbab0e1a54010c8fe90263c/greenlet-3.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a5d554d0712ba1de0a6c94c640f7aeba3f85b3a6e1f2899c11c2c0428da9365", size = 646360, upload-time = "2025-12-04T14:50:10.026Z" }, { url = "https://files.pythonhosted.org/packages/e0/94/0fb76fe6c5369fba9bf98529ada6f4c3a1adf19e406a47332245ef0eb357/greenlet-3.3.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3a898b1e9c5f7307ebbde4102908e6cbfcb9ea16284a3abe15cab996bee8b9b3", size = 658160, upload-time = "2025-12-04T14:57:45.41Z" }, + { url = "https://files.pythonhosted.org/packages/93/79/d2c70cae6e823fac36c3bbc9077962105052b7ef81db2f01ec3b9bf17e2b/greenlet-3.3.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dcd2bdbd444ff340e8d6bdf54d2f206ccddbb3ccfdcd3c25bf4afaa7b8f0cf45", size = 671388, upload-time = "2025-12-04T15:07:15.789Z" }, { url = "https://files.pythonhosted.org/packages/b8/14/bab308fc2c1b5228c3224ec2bf928ce2e4d21d8046c161e44a2012b5203e/greenlet-3.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5773edda4dc00e173820722711d043799d3adb4f01731f40619e07ea2750b955", size = 660166, upload-time = "2025-12-04T14:26:05.099Z" }, { url = "https://files.pythonhosted.org/packages/4b/d2/91465d39164eaa0085177f61983d80ffe746c5a1860f009811d498e7259c/greenlet-3.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac0549373982b36d5fd5d30beb8a7a33ee541ff98d2b502714a09f1169f31b55", size = 1615193, upload-time = "2025-12-04T15:04:27.041Z" }, { url = "https://files.pythonhosted.org/packages/42/1b/83d110a37044b92423084d52d5d5a3b3a73cafb51b547e6d7366ff62eff1/greenlet-3.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d198d2d977460358c3b3a4dc844f875d1adb33817f0613f663a656f463764ccc", size = 1683653, upload-time = "2025-12-04T14:27:32.366Z" }, @@ -915,6 +1119,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/66/bd6317bc5932accf351fc19f177ffba53712a202f9df10587da8df257c7e/greenlet-3.3.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d6ed6f85fae6cdfdb9ce04c9bf7a08d666cfcfb914e7d006f44f840b46741931", size = 282638, upload-time = "2025-12-04T14:25:20.941Z" }, { url = "https://files.pythonhosted.org/packages/30/cf/cc81cb030b40e738d6e69502ccbd0dd1bced0588e958f9e757945de24404/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9125050fcf24554e69c4cacb086b87b3b55dc395a8b3ebe6487b045b2614388", size = 651145, upload-time = "2025-12-04T14:50:11.039Z" }, { url = "https://files.pythonhosted.org/packages/9c/ea/1020037b5ecfe95ca7df8d8549959baceb8186031da83d5ecceff8b08cd2/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:87e63ccfa13c0a0f6234ed0add552af24cc67dd886731f2261e46e241608bee3", size = 654236, upload-time = "2025-12-04T14:57:47.007Z" }, + { url = "https://files.pythonhosted.org/packages/69/cc/1e4bae2e45ca2fa55299f4e85854606a78ecc37fead20d69322f96000504/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2662433acbca297c9153a4023fe2161c8dcfdcc91f10433171cf7e7d94ba2221", size = 662506, upload-time = "2025-12-04T15:07:16.906Z" }, { url = "https://files.pythonhosted.org/packages/57/b9/f8025d71a6085c441a7eaff0fd928bbb275a6633773667023d19179fe815/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3c6e9b9c1527a78520357de498b0e709fb9e2f49c3a513afd5a249007261911b", size = 653783, upload-time = "2025-12-04T14:26:06.225Z" }, { url = "https://files.pythonhosted.org/packages/f6/c7/876a8c7a7485d5d6b5c6821201d542ef28be645aa024cfe1145b35c120c1/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:286d093f95ec98fdd92fcb955003b8a3d054b4e2cab3e2707a5039e7b50520fd", size = 1614857, upload-time = "2025-12-04T15:04:28.484Z" }, { url = "https://files.pythonhosted.org/packages/4f/dc/041be1dff9f23dac5f48a43323cd0789cb798342011c19a248d9c9335536/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c10513330af5b8ae16f023e8ddbfb486ab355d04467c4679c5cfe4659975dd9", size = 1676034, upload-time = "2025-12-04T14:27:33.531Z" }, @@ -932,6 +1137,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl", hash = "sha256:6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3", size = 150705, upload-time = "2025-11-10T15:03:13.549Z" }, ] +[[package]] +name = "gunicorn" +version = "26.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/b7/a4a3f632f823e432ce6bc65f62961b7980c898c77f075a2f7118cb3846fe/gunicorn-26.0.0.tar.gz", hash = "sha256:ca9346f85e3a4aeeb64d491045c16b9a35647abd37ea15efe53080eb8b090baf", size = 727286, upload-time = "2026-05-05T06:38:25.529Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/40/9c2384fc2be4ad25dd4a49decd5ad9ea5a3639814c11bd40ab77cb9f0a14/gunicorn-26.0.0-py3-none-any.whl", hash = "sha256:40233d26a5f0d1872916188c276e21641155111c2853f0c2cd55260aec0d24fc", size = 212009, upload-time = "2026-05-05T06:38:23.007Z" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -1007,6 +1224,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, ] +[[package]] +name = "huey" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/77/6ede51ab59bc7b35110e5817eeb47db03d0e5b4b716d6cff81a8cb379a3b/huey-3.1.1.tar.gz", hash = "sha256:156f30e90f0fae81ae2e004f2062e1b18ec9dcbc684564df63159ef546b13502", size = 281531, upload-time = "2026-07-02T22:10:46.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/3a/ee216ca4e7e4fa5bf1dbe7dd502f23981d02252d277d8ee74ea0afa8937f/huey-3.1.1-py3-none-any.whl", hash = "sha256:8773231c7bc7a40b9b9191d72cf1c6580bbf6742a4118c70dde6b5c2e7ccb7ce", size = 99335, upload-time = "2026-07-02T22:10:44.805Z" }, +] + [[package]] name = "huggingface-hub" version = "0.36.0" @@ -1138,6 +1364,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, ] +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, +] + [[package]] name = "jedi" version = "0.19.2" @@ -1150,6 +1385,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, ] +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + [[package]] name = "jiter" version = "0.12.0" @@ -1619,6 +1866,70 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/30/a8/e61a8c2b3cc7a597073d9cde1fcbb567e9d827f1db30c93cf80422eac70d/llvmlite-0.46.0-cp314-cp314-win_amd64.whl", hash = "sha256:7821eda3ec1f18050f981819756631d60b6d7ab1a6cf806d9efefbe3f4082d61", size = 39153056, upload-time = "2025-12-08T18:15:33.938Z" }, ] +[[package]] +name = "mako" +version = "1.3.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/62/791b31e69ae182791ec67f04850f2f062716bbd205483d63a215f3e062d3/mako-1.3.12.tar.gz", hash = "sha256:9f778e93289bd410bb35daadeb4fc66d95a746f0b75777b942088b7fd7af550a", size = 400219, upload-time = "2026-04-28T19:01:08.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/b1/a0ec7a5a9db730a08daef1fdfb8090435b82465abbf758a596f0ea88727e/mako-1.3.12-py3-none-any.whl", hash = "sha256:8f61569480282dbf557145ce441e4ba888be453c30989f879f0d652e39f53ea9", size = 78521, upload-time = "2026-04-28T19:01:10.393Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + [[package]] name = "marshmallow" version = "3.26.2" @@ -1715,6 +2026,87 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/0d/5cf14e177c8ae655a2fd9324a6ef657ca4cafd3fc2201c87716055e29641/mcp-1.24.0-py3-none-any.whl", hash = "sha256:db130e103cc50ddc3dffc928382f33ba3eaef0b711f7a87c05e7ded65b1ca062", size = 232896, upload-time = "2025-12-12T14:19:36.14Z" }, ] +[[package]] +name = "mlflow" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "alembic" }, + { name = "cryptography" }, + { name = "docker" }, + { name = "flask" }, + { name = "flask-cors" }, + { name = "graphene" }, + { name = "gunicorn", marker = "sys_platform != 'win32'" }, + { name = "huey" }, + { name = "matplotlib" }, + { name = "mlflow-skinny" }, + { name = "mlflow-tracing" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "skops" }, + { name = "sqlalchemy" }, + { name = "waitress", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/0b/3404a057daceffe9ce18cd08868648a1e9b817270177bdf8a764576b988b/mlflow-3.14.0.tar.gz", hash = "sha256:5a1f818fa003035c724162096ce3ded7bc7bc47a1cae595df6173961983f4718", size = 11792369, upload-time = "2026-06-17T07:57:44.712Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/b9/76dcdef7f7f856b36f18cfcd752c2717d9847812a0aaa36d50a7baed569d/mlflow-3.14.0-py3-none-any.whl", hash = "sha256:dbf77f7cdb5b5c0ec59b4671c61730b1b914b4dff7a2892e267a547cb5454f56", size = 12564161, upload-time = "2026-06-17T07:57:42.348Z" }, +] + +[[package]] +name = "mlflow-skinny" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "click" }, + { name = "cloudpickle" }, + { name = "databricks-sdk" }, + { name = "fastapi" }, + { name = "gitpython" }, + { name = "importlib-metadata" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "sqlparse" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "uvicorn" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/4f/a054cd8860590e4e942aee1aab3c94307878159f945fa844acc9ea787721/mlflow_skinny-3.14.0.tar.gz", hash = "sha256:e50f4506422c7737157ae6643c165122af7898345f2e828fa93c4f10128653cf", size = 2901772, upload-time = "2026-06-17T07:57:44.252Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/e7/b80f76ce689b9d6f21cdb84abb2b02148a1149e63a6428dd2c629cefd061/mlflow_skinny-3.14.0-py3-none-any.whl", hash = "sha256:a4880e086365871ef9d78e727a34ea5fb1ce615689579998d48e8c65ee1665a9", size = 3462788, upload-time = "2026-06-17T07:57:42.583Z" }, +] + +[[package]] +name = "mlflow-tracing" +version = "3.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachetools" }, + { name = "databricks-sdk" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "pydantic" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/34/ff5e72919b4eec8fe65e6fc843978a1a512194e6fafbd1761deca48269ad/mlflow_tracing-3.14.0.tar.gz", hash = "sha256:c2f701e001d35964f23fbbdfdda36c818a76c157b912ae83781199fd714be09a", size = 1429017, upload-time = "2026-06-17T07:58:00.647Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/4a/4658a9e514c8f079e40b608661844b9beb21c7530e6ee1e7f830cf81541e/mlflow_tracing-3.14.0-py3-none-any.whl", hash = "sha256:854488dd18068f15e2a56f1cc7b8868c611d09ea39068d0a691a3f07e0048cae", size = 1703863, upload-time = "2026-06-17T07:57:58.687Z" }, +] + [[package]] name = "multidict" version = "6.7.0" @@ -2413,6 +2805,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, ] +[[package]] +name = "prettytable" +version = "3.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/74/ba08d81e668ccfe8658d7520a307e63c19862c08eb4ccb26f356c5239a7a/prettytable-3.18.0.tar.gz", hash = "sha256:439217116152244369caf3d9f1caf2f9fe29b03bd79e88d2928c8e718c95d680", size = 76373, upload-time = "2026-06-22T16:07:50.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/be/2e6798ace5cc036f5d05d36b7b2fd85346f1a708c87060890b070d0ec607/prettytable-3.18.0-py3-none-any.whl", hash = "sha256:b3346e0e6f79180833aebaac088ae926340586cf6d7d991b9eb125b65f72313a", size = 37357, upload-time = "2026-06-22T16:07:48.595Z" }, +] + [[package]] name = "prompt-toolkit" version = "3.0.52" @@ -2591,6 +2995,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/f2/c0e76a0b451ffdf0cf788932e182758eb7558953f4f27f1aff8e2518b653/pyarrow-23.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:527e8d899f14bd15b740cd5a54ad56b7f98044955373a17179d5956ddb93d9ce", size = 28365807, upload-time = "2026-02-16T10:14:03.892Z" }, ] +[[package]] +name = "pyasn1" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + [[package]] name = "pycparser" version = "2.23" @@ -3246,6 +3671,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] +[[package]] +name = "skops" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "prettytable" }, + { name = "scikit-learn" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c8/9f/46448c4e41a4c5ee4bdb74b3758af48e5ff0faeffe40f4e301bfc7594894/skops-0.14.0.tar.gz", hash = "sha256:6c8c0e047f691a3a582c3258943eecafcbfd79c8c7eef66260f3703e363254f0", size = 608084, upload-time = "2026-04-20T18:23:55.336Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/0e/3ae19fa941522cd98e119762e7181d371c8dba0b2d72bfaf9522692e329c/skops-0.14.0-py3-none-any.whl", hash = "sha256:60a5db78a9db46ccee2139a0ba13ab5afb1c96f4749b382e75a371291bbe3e36", size = 132198, upload-time = "2026-04-20T18:23:54.018Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, +] + [[package]] name = "sniffio" version = "1.3.1" @@ -3284,6 +3734,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/e1/3ccb13c643399d22289c6a9786c1a91e3dcbb68bce4beb44926ac2c557bf/sqlalchemy-2.0.45-py3-none-any.whl", hash = "sha256:5225a288e4c8cc2308dbdd874edad6e7d0fd38eac1e9e5f23503425c8eee20d0", size = 1936672, upload-time = "2025-12-09T21:54:52.608Z" }, ] +[[package]] +name = "sqlparse" +version = "0.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" }, +] + [[package]] name = "sse-starlette" version = "3.0.4" @@ -3642,13 +4101,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl", hash = "sha256:c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b", size = 6005095, upload-time = "2025-10-29T06:57:37.598Z" }, ] +[[package]] +name = "waitress" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/cb/04ddb054f45faa306a230769e868c28b8065ea196891f09004ebace5b184/waitress-3.0.2.tar.gz", hash = "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f", size = 179901, upload-time = "2024-11-16T20:02:35.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/57/a27182528c90ef38d82b636a11f606b0cbb0e17588ed205435f8affe3368/waitress-3.0.2-py3-none-any.whl", hash = "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e", size = 56232, upload-time = "2024-11-16T20:02:33.858Z" }, +] + [[package]] name = "wcwidth" -version = "0.2.14" +version = "0.8.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, +] + +[[package]] +name = "werkzeug" +version = "3.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" }, ] [[package]] From 3e9d60bcd025419ddba7c6dbbbc465a7a1dce1c0 Mon Sep 17 00:00:00 2001 From: theof Date: Tue, 7 Jul 2026 13:57:57 +0000 Subject: [PATCH 10/18] Ruff liner --- evaluation/dataset_eval.parquet | Bin 153107 -> 0 bytes evaluation/evaluation.py | 11 ++++++++ setup.sh | 2 +- src/evaluation/build_eval_set.py | 2 +- src/evaluation/run_eval.py | 4 +++ src/main.py | 45 ++++++++++++++++++------------- src/neo4j_graph/graph.py | 40 +++++++++++++-------------- tests/test_connections.py | 10 +++---- 8 files changed, 67 insertions(+), 47 deletions(-) delete mode 100644 evaluation/dataset_eval.parquet create mode 100644 evaluation/evaluation.py diff --git a/evaluation/dataset_eval.parquet b/evaluation/dataset_eval.parquet deleted file mode 100644 index 2121661a1975ba42df964423a6feea6ad7515e81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153107 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%0D0eo z_x*yPAWMkja7v%w#s1-smEukPo_acd@IN8F;_w!T%~uMmUAx z)TBk%(Js#7woT)6YToQ1@|YgRm6-jDXgOBJk}6_d?~blCGl~JQ~sb% z(sfQ9;q*LKa5|+Q*UjUvMn+t;@Oep*r;|8|Tad3{`fkGhVFZ-k`_S7nR z4fuwh@$7wk3SVMx!|{pZa+-A|D}8Zg(+tz(oim##iol;H8iuD>d-F#IGgh!z5#rO% z9pGB#C?9MIead{9LNd>gd`vI-#hb_ay7Q^wOrCWpE1128(1$kEF?m;pX`Hu}xOQPD znyunY{OVv;iFdTyG#J<6T%5)^Z__G`cdklf#T7cjwRPstR7(idLUnX1%}?qD!}FK5 zt27$l6@yuWU00+LKMfinwM9`hG3(+qlg|S}2g2=~^x|8^Wf;~bu`;RT55sYR|6zcH|2jN{mpPyW}N}i~>Ljy6HO;oG7#EN?8=WHl{ljTSBC`@5VoL5y}s!>qsXPyTG`uC_Y$Y zY!Px{pxHDmA#U`%XV-CK3vS$juG;5Uzgs__9@2VzmNjSlrBu=-*&{RaU}-~mJB{C1 zKh|+eD71NZR=}AUGYkN$Pn*MgN1t0o=jy3p-L!(PtT?B5FW$QD z*x{UWhA!^QbW1D{-=T|3Tp-sn^T;Mfr=(9!Gj;9v`0+eq@=%LS(UUI|CTg2qR`zR~ zCm%sdbfE>T^D>Tmn`@rLRT<4DPBbz)j&q$TibOv6OunZCPO(@&E0+h^LvAg4NK4ue znCr$bp*~$5EUUa2o?V$|{L-||@=No)(<)wGcEgG!pXLmFSBd1YLjc`{ zbu^A&Hr)AAVsR!Lync?EnLKA5jdpoiiH0$d;=oKvxz2+mtHwVYV0X}ug$P|R3uW>j z?}_W`8_3Be>rf`UQgya>a{M$r^LpTtH)Z8P4h7!XlIA>lu2@FK<@_?w%<@hYMVtNM zukkpgW_w2z;Z|9`Rh+B6iuz*TVFqN%V4l*f(MwLrB^GD$?9xu;u}8Jxj&a)sep#0q zSzi;b;Qp@OmAsU&Ik1r6M1@({#+7t8L`#vE6sz{kX4ghh9(J6K!#eL=9qr<1+Xl-z z&f_jn#Vw)HhOz8ia#msHA)JcPY<0_iki26E&TT%u7@e18qzot^aRC)YQ4zL&pJ#No z-eQcNfur(b_+^E7NGrV_pd}P~PRa3tA^xrTi!f+wf*4Z5D*%a@AR;3e&$y00g5i9` z=VgTm3yh1&HI;^OE}wY{DND$j9vgzMcR0=90J@-s2o-4&MNtw?-(Q3J0m-z@FRKcb z)TjhG3N51<0006r5DFOL6?igGpw=_~4Z!lb%(UZ||#BzkY`s52Sqpwc`6qwiAzx zacM1v@-tFYtkrM|_bOcS+TIUUA#eLz;vu;e%PW~xt}F!HHlzYqXhxECzef&1EdjDX zLE*3e;Z4z-d3-bk+-I$UQHgp>6TpCD|jikhETf;N6ESrOC$79MT7w$q2BJhO8@Mt;3~dM_G|6@=46 z8a3I=RcIY*4lN@hEt~pQkg7%6(68a);6f!~ z{4=!JAgss8XX%Os9F(O2M1fuNUwjnUQ_|1cSSf~$W+V@e!doVSxTl&%@tif;X8;c0 zMCVKIF>kne6WuVJgube#y?IeW!okndgr6GAe1%$4{kOHFNV=gRFel8>F_HXu>w6>v zEw6hoq<=sx4 z+8k$x_;EQ5+?|TTiH)krLH5U&RACl54ftCWMEkUnOXgi>rV>qWn2;~|xgZXj1kkZ_ z>!wbM?LyC8qk+|TT3|7Q;TK)w9e#(WGQ#6ZjzbV5hCEl9BUig?VjERd>g>p5&U*KpM`=e>02Yzy~3c ziFV6Fx~c%PztPtvmF_?hC8&4bEYj zGg!$J_Owxd5YxOk6;r<0F@yjVppf7f2UJ|UeC_o1{t#ve_fVwy>nU73bIypmJu=b? zGjg0%0e`zc6VIonSL-)4f-0cTq`30Vzg>cGntLcIbGTGJJ-lUvV&{zAv{#@WSWv20 zqJbP71OXs8v|@|FtHy^Zhz=T!aF=7vucaWPB0Xb0?Og@0sD`3g`3~T!bL}L8f~=3Q za!{JOjb61IXlgM^i&N`fv}2B?O$G1{iD7@#@LGj}tKo)bFe5ZP$f9If8765oU?m*k zq3J$E3*hk!MO`?hVsE5`n|!KJfX;*!`7q9&PF25Ou5${PP)j*Cs$moNxK&mETzc*k zZpkCaa~|IrY^lJWPD_)&3y~y#ap~#j$avqEREuVUYbJaxZTC@Q*oAknN*6h7zF7*i z4`Xww(^+*c5HH_%IX+-)))V=wxzkdGiJu^V&y>RAK^oivo=M+&JW;sOzD7GTSV?m z1~8M-KbB?){#!tpxnnwLX>%oZ2 zVSk8brMhhIdBtb@TPD^hLr7xWD+-3(?DS`-_CbJQMX{`x#{)s*D&;e5V$}j1KDfzk z(Me~H>dmsn1D2o*fkF75$i<+1y~qs7zTF2H+yDw`juv%cj8s@LF}d$s3iz|BBM7Z@ z(05Q3#{)`n+bes%Q!@90kXq6uVzip572KZuUFH;KdFP_46x_4^pqMchc*GA`KO z-^rM7llm`HB}7`Uu>=-QR%l2btldC(;@HP5Q9zA;A}=yBk`bW`;0J5;MQ4Sl$ZACd|@553H@`nmUQZZuSd^h2|vUMmUiUFx0JVmv4p0|e} z%;nA0!ItTi7F$`P7$>g`*j`t5nG-O+ggJh3rJCDn!^la+@DTLq`2Z2^cD3?|KVI8A zP-5mD?@etgRrqiLj_INX>~&g!qQsE4L5N<3{n%1K=f$DcTk2sPQwcAz=93*Y@?%Y9 zw)%PloD{Vsx(!j;Dme)9FdTe4dOI+v z@CmJP>k0({-vA<0EN2+Tj+8%SyXCM%7BW;E78wO{ej&WoCpWPh;@9#$OmDpru_*DLu(WacgX`H(Iq#6JczWXoR4PJP9)ql~HH%c8akBEzzT{mu|GNm!{ni~UKJdhz~A)2B!rUZ7a0H#hN$*<+@4FNCgw ztE~F0UHN!uP_8mAA-IAJL&F0Fw7+NZM85IFlCHnX8wdZ0+>8))7rVFcr_V@{9WsvQVP0+Ll~v$`cnDnn$mbiK%tsG!VbJ zEeF^^fpd#Tx-UO#pSKqH?`lY*vhVsjH2WKZ^@%@Sa|bTz03~J~0MGJq_h3R$Jp%QO z3H20L;G{{O5)3Tt?yW^BWGn8#0+3q_FM~)pD+rAr-D(QGP*ghAlPQ10ad!_sXJ3TO zMij!n$JDn`5u6(JX6$h6djSofQS%*%#4jr}Z0RgyTHKJNBEG~AUZ=nmc#|y1z?Xw# z1?ybR@V87ods|fN;|wQ3wajU?OC=|sfotW@a?*L9>v9U*?_H5r7$*?hWo7If3XKpy zmq-TP>x4#K6vR6DNX*i$_DIe~6J@d4pV6|z0D`gHaMrmg{BT3ZZU!roh42M3bf=Jf z(s6Rh39YdC7?_?K&TMy)!5WK{hjyHWqf2?r@z&6vbmiQ=l~pOqs&V#FUuX+Fl6%Dt z#&c4m!vwuMx#yjAUvBCw89%u;vkuYA)l=q|$*T0>8Je>@?Z|5>5w4KlsDLQpP)0;J z*;6wHARR6K{3ECfp1XziNKJ~a)Et}{6gW>25{NXR79xZM@=9kDanQYZE@^>f@durP zE(IJTYA}Apqt|o!0B60CT{`2w?&+dw;Nbl83*WqY4uJ=C;PXo4N&~teXR42F@Y}C|%_mXF- zauB_t_=z<`lHZan+xQ^wM$o^5jcAePHu(;Gl_MqD5TfcUuV(Y>NB5>ws$CCRzOjhj zqqjrCibB62V4e(Kr!H}Za_L(~zNI&)gRuQ`LbOf}uamr$<0GAv2;ie{&r9e@H3eLl z8j8%BvSJC()%xfE3{;+T`LZy8;obK1@I1cPI~nmmxPc3yGCS!l)UAGcH!u5$+JBY9 z6B3rssMF1DK}QPC=|V|cXiNpwfOgs*S(w;sG;xaurwdxtLDS?nyohMhqGMs2myzmk;Z zzNbn$$&B$20^eG=Kmi$`0@31{E%8ZxnV`A3U=UZ*-7R8;P3)HKs$&RuVNhtaXd}?b zs543{emX=8Nx`})#aD+%qD;zhF6D&Pn@JG0GP3V2IlM3VoMjKX49barc+p?b(d9-E zNae0`fm&WUYekFm#J1wS%?0AC4Dh7We?O}WAAuP&03oXGnzRaGKKym0%l`_vmvl{`g7ZXX-!Dy_glnuz~-ssC9jEz|{DqwqXIO7 z8v4gD*ILYeszZS57b=IRVPosB@dena2((-kG|6nd9(X1E7s$7Dt$r)oSUy^LJswX! z4j$%(!~07c$XO}0&O5|+!Nn#6gBwf}3RrYs2p0SNmTGRl4wLGU*dnhTrBd>~qz=$f zge5nNf>YsFv2+D9KEAlox~^YkUcA zs?-f8fO(SHHrO%KGqwayNHb*REA|#apjP#8s1GNC#x|mMgp=jbePl4SC9-wtNc%sq zHB;rAF=wL;U{MpG1r?@3LphSWLxN{&r3LaGuc%g0Wh|{&!p2B&?7asz)M54i{|R^l z+%Cz5!GxAfRTMahN#3WBjXiSxEwhfP4ll(@*K3D#4Faq@EYY_4vUSvoRA2fj66Qo) z|N9l>5a*GZE}FHfx4RT=5>V9n#z&UP1U|^ujw+DDull*dRxPA^S?Ke4>~CLvO`S|t zOUe|aCxe==L3}sKscPUDQ!cf<^15Iv&&JD`V?KGx1yLWzf(P*gZFXe`0E5$epR#&= zaQgy|-j`=i2=~iZS&>)>^DU=1y%NKRd3*3f6N7*&Mc<$zmmNY&HI$PI{$O2efggL? z&)043R%;jaN|L0L1JV$HVDDN5I=-nO65%Oi1+p8)qV1K)kz9?Z_!$NMAUk;V$1i_b z5GPHiqyXjrcLfu%et!NxLg%!DrDS|{Q~#v7-Q<|61F&_+$`wL&#xV+#kc5GAHfsYS zm4}d?cOOOv5WhO}sF%GLl1mYP7q)xA-|I%Pv1fovh7L_-P$-q zH;pO(3Lqzbovv()7aks(lV^|c>e?}&j=9@s2uu27mkvk(B`sOlYVOzjDz-kO1^QEp z3?i2FP)8J&69sxnb_akdQf!9#GlTpR`DI!>nfy{f_8<@)3&mo`V*I+UF^hp(L9=@q z1`6h=HnJBJw%#uxEmt>eHz|zcZasRJf+%0c#f`E9;&~2=cG<5|x5azd&qyI;FH|&F zZHJ_@6G3HEeIU{tU?Zoru2q1bAD0vI`Nxc8*b0RJ$Ln;uNmOHODn_#OHKE(F5IeRs zI0KZMZJ@f323B9v9|=Xs?Qn?>y|0gJJTe_RJ4q;EQW#fsCx92i)htSn##V?#Q^jZl@Rh&xm&#QFuEV-8YNenETk@Z0piRmogH z#XxT|t(`~_g{N+je6;u?hIVB1?TtUyUP|ko(F6XAue8OV9L$U|uDTWQFFd+|PYre6 zv^oC7lb^09bT%enrmw2%BmR395pB`?Jm6zaN?5FJT?DotexSLgia#$Y6DAge$(p zk>xilK!Jh5?*2_LRtPiH^)v`B)@&#C^ty<*a=Iqc77vl*b;oa-c!(bMtwC>6QYBhS z+ymAgCohDj7q&z_g$wgpr;dY>)7-rsF!*%E5>rLrnK5#B3Pg)0~+33AB9XtraQ= zg_{jNV%%Xhr2nJw6GG8H%YAjH7s&b_)K0N_{$XVlP+UJEN%ml>!u(H(#}4APz``Gr z0v;!K5B}~778F;BdJY38TXd``hbCvxXB?Dk4F{10dp?V&wY(9Kd`!!cB3T}+TjY?Y zjD3h3w>gwHgo_mjc#2h9{qE?KWTxPiitz$S<3+=b9bA4}&ZPD?yUFh4T-Jnd#uX^& z1VZ&JY-dLoDvZ5zkS9U&J~+1R`HXGbwr$(CZQGt5?%3S1cWisd#?AZ1?=CLxkL!-; zs_M$Btjy?$=jrOsDi5f(EX(S&O4wVltJnq+j&n5xIzp8(TQ8nb8+q})L`XGJ<*SGn zQv6wdj}V>(d_OMynJ5*|e@(U}RShQ4S{Mt1)##De@AKc(li33a>pO0pXhX_YF-PY6UBdLQ@% ztAsz5@Tpl7P<}a{ARVn9I>&im9Zx1}ix(Lya5WcfD_g5y{q@ zn03%Xa*e>^fo=;N5Fx38_#<1_DyplkOFp9|BfV6?U0q}Q=O&I;{={=y(u0Pe;f@0f z@XaByPMq9SW)OI6nfoe$h$R3!%-TPNelUDDqZ|^?sX-1&nK}hrONl)Q_Nem1Amo;P zb$V+?E7X{h9?wtyJ&S^==W=jmhq~lt{KP|i?mRsWh}I^O=$iL{G4i0SdS-q58RO$Z z#=DP?CSQ$05~Hh$WT;LJ@Jw#Jh!kSks;q*5iH{er!*)H376zC2$V4kSUjsWImF|mb z(q6d(ounkn&#YE2ualFHL6pH&6A}Cz@#-*))Yv2QYk&$^0ZW8e`(yTRWCWTr64yyR z#ip0@P)Txt2lsm?7>Q1}X?rguOERp#yz_7dqE`NLd2DvFCS19#F1yVB+)4W`)VQ8m zf7pX#ZTVX>T1XjxFH=tmb%CC0Q?j!5zIMehkCqBP3mNAW33q8S?{C^wf$l&5R2QkX zs80ir&|mO2phF&EX@@-jMA`ibWk9Y>=XRL0LIPYi|3>BQbIUflhafx^8G17Z1t_sn zF~VT-b!985=S8?DLzOJ_jkpGjLBFYft5|uebPoC*i^hQ4ObBEc_fIp(S0sO2q_6zHbv6Q z(Uiy?r+PBu>W1h7u4sNc2fob2B{Kw)U45wgMof$MfmML92i#g8FU^3RCcm!&yV9N){73}Gp==tCcrkqgw@V z-NT|IzoNL(<1HH4fQ~Spks>EAbE&NGQ_U1XK=7Ckc$;ikvS#Hjj!dNP95|q@hOVON zp(`^yIZa`yd-ttGbqS3%1z1WY!{9>tgG1LuRLNoZ2hayaUwg|P84^d%fq3qKA+~6J zya|6>3j;z>79b&{0Mg=j662pK1b>J~@4lZ@rVwJ`$9|caev1Id!^)Fup3dXMffI8b zOOlhN(=)8=7S_d`YwXQ%CY+VZ1#T|G5>@~=G0w7V-yz;AyA<|3RyemFz;V(24Y6S} zaA7cIXTO4_QkqZR+Jtvjn8JRvy`)`+Lsd5h^nJ_=YYAr;5=< zGcYXt=DckiAxovINV>}NTZ`&tK^o$@V^5aKHKE@vRO*96cAo&cd{%j^h zt+ImPIeERPU&z?}OFicwO8pb8Le|i)i$Ba4sRv4zOVdoW#@yt%8}Ual0nIyz<_W)> zC4t8T|2O(*TG?eN=$W;cmt-hX6je3%pTVFnxVLR>GJG5`>eYYj0+?H3VZXG72%SrG zxgn=FEU|(kPG#a`vI}|Xp!e?{=W(ne+N~b`Vp=!eK97mP--AqlJG7KCUZBL z6R&_nn6O%%>U~=s)^krIxD_i#3`NwfoDM&tiQzzed-N4=}MMgn*;ala1Naz>9lwE=qtl-cq&! zsmirhP;h-+lb&Wn%O5)8H{~QIkye3HX8B0wBn*Q|lZ;7T%g3lmS{5e@7P-j3^?}cY zhodjHq&&2z{VI(ZD~Cgc;Na@PwgL^;QUL!QSwjKr2{U#%l@uXbERT~{p@DJd-B>F` zjp^jB%C=54M|~X{hV5;Nd;{aq_s)h^x0>gP5MQ6$wjG)#)=wH9G00rL$JVUW#EbsJDIw6kMl`zK&%83^j2=AgejePcj z{ZSsO!2SrLmk2WQ+;Vv+7lDLHGELe)wI2xE~TYyc0(Sl^VJH7%JVP zewIsY+JpX6$r5Q%f^$9htwhyWvv`@(SqhsT?m~B}j+cev+_`{qX-OVPnR-2xzz@l; zd|p8QcPOyHf*Iu&1wkgkicUBuLnygcopxSEgt!Gw2C{7IwI~pk!=hhkz~`GScKkz` zw|3GXQJvfK$+*FfT=1%LY|apu=WsHFGk8)|eMv}Oy$HQfu$R%OrTdw4ez7!sYZf!3FC0WIuB;|6jY@9(ZSJyW3-`&g3r}z6^W(M_L%@_kAN9pd26z?UX9kIAA?J7s7{N04VT8<*dOJ4Cdqj^H{U zFvs&V=;1ywiNYW`jn=3ELj`YyDQ-HVX7$@0Lh}LaBfQCNZJ5x1z%t0qK`onaz~g8` zp{T_R6|yE3dSoV?67o*6U*xG>?lxo~1St4J; z<{@-6@!m%|t z{LEp<#G&Z0`MOkdCNYX@S0HWE;{sM%OFgfn#@t^JFx_Ddo2i*9#gRpX6eqwxwY1yHI1-A$Xg;8DXhv@q@I+Ik?Mkj-NNZgvCBq9vN63?di884B}rk48_+0kV@?y zyrG?U^)@Bng#;{0F*vAY@(`_ESU>haz=sv?_ zb@omhVzQIpXEX2yY9?h$ir}AM?r7H)AL+o)ju+O1653 z6L90T)?3D}cK>&l_&5A;Nx!n`AA46tF*)KcG2ZctqZvIJc?PL0bA<$a9@6xxX*6N+ zN+$7kZ1!$vT~M?9#S$#FIhg@@B;+@vNB}HHW})RKtl0|r4IPY(>2WThSzTb;9{whM zsHILTgKjj07U0Aa)7@FGDdi#7!u6TsVrD#>dUXjp5C^mMq?V?ghg2$fIQO)gT=Q3F zvN$vq$Y7q3I9FFpQP(-;^cx;DS^2*Q~|@T(baY3GHZ9Lh=MKaQCZ z6wvnC@#S!L@c-f&43L8+x^?jOU7S@kZU;n3Kiyy>JD9h;*A@n~HgvToNjwADo5#T> zuj>N#%r)TzbzmLglrvvMlG#|7#;hils$g0@1;S2Z<$GRX#(3>W@zv6oRqF+ch6FY7e9lST5hvl-H@+r zQ=AS@5PN|;np`?|#2%87P;E@a@(TAz?^1Upz;L+CB0Y9VxpGR7TLX?S-b$VhUJkco z7^}3?R2so@>ovrL)rjQ_F6cDPG>H?jH!;eD)azQF=l>}SdMyk*4MLq4QD{z8s45~M zO38|>m&+p8vNy`)Pf0BS9wXo&@t_#xyIp(ghbtu7tbJ5Fe(ssWm1sXKWUMj7<1bMhm591ahV#Nc%d9i<>H zbJm=syXK2e`Kh+znuI+=^WbtCM z#=H`KE0oqce;Tj1nK7>2T5^jfT}iU_O$%zwPYg3|-pjy+<&o#lC5qN#;Glj*YBv&0 z4QGvNd{YA9lL!}nK=K=XL)0oM+UAmXS06!E&N%K@7Ys!?ZPQ5()q{s|)qd_>SGY_A>V^umGPmtCtLn$5?R_V1ae! z$=MS-aH?>!pZ9)yFM7Rmk4SP*uNX|yoybFVp`Ix1fAn%cA;h!ZW-eC(8Aam?dTANr zQ{HIn?@)c|7%XZhI3N?M@Gi|0ki^^r2do?GHlih0#0R>HsqnqBSevbzr=z3ENLUbB z7ZpUmuuiI0pr8O{J}pu;&j&k?=IA|!hmRQ~2T+Rkiz0OXO&%~!1cj$s+YK+7y7CYF zj<`7zs6++EfItrJt6wzE5StwjVBuko$LtIK7$Y)T28E>)i_ zgwbgBV{va|O5QQir7TAYE6*{q2r)L{DG2HdSl37;IF=~(lUj2-nt9Tr=I2{ADpqsy2le|b$e-D9Hwx} z8)bM+Bxoye*bEymO1ha;PB^Pb>c@7F3L5Ev5!xPEhzgpTnHZ`!62o7pkX@CMm0dS* zV_dG^rQK%$%bb3ytbzC0i*(VamnxPSCeSb4C{3 zH9`?jTUw~+a7@jVf~oDAC9T7s79tV~vmP<>9yB;$9jNPKkI}$-ngC29D76KgGD&-1 zRq2S#BGuY3UVloooDb*TKjGo&qQEaXx*}^QmB0@C;ji>W8(>kC z4i+gR{H??&2j@CcT|hgv1jdd2h>C~wyJP)+co=Q5cNF%1QfQZpm&(q#@ zvOH5V5E8dE$#6s=d)==!JNztS0xaKP?%>y}Edz{7KL2k|N8P)^Km_RgF;$!Pie+S8 zG)F9{{F_!&e&pVC2&^~Y{8{kKq4RK;i$6x8fo0x0COEs$f80{`e@#BweX1^7_2_4%JqvGEZh0$SH~g9Zrtdl*~eo?VgFaJ|$kly8Y(8rrL20aE(MX-5qZn zR2i+mml-k!&)*TJll3ENZ7}W@q(I~3clez5pJtg|$XI2=yF7&QSVi`~Oq3ofUD#l* zlh6Xr5bNJ|0>ODEq)8cNF+%91wnpG){y_L*8Dk6rS381+O$*DIO;i}~AZmY=lyDN| z2J?9i8d(l`O)1}zhZpt~%DfyGdl337uU35OL^xcfhM?k-L4~z+D%Fd&Zg6C|->8tY zoBc@z8^;}iFBf;UnF141l22%y0=7+i4LzP>N0pFoI9m_S)++>&eD zjq}ej*Kb=Ild?JM`N$Y_kd7E;RkaqNWJ77U2p>t)|Jm*$bPO3yeK~G~$wBDt=k;W@ zP*C5ghh$DWAJ4Mh7XYn7gofSLbCc(J0ZGq~{}Rpq6IHDq9j7ipu z_~*BW&0p&5{WsdFe`#qUvY@^sVizqA7qSytM`R!5UUV~=Ha zUC*?|vxrFJG)UG$^-yI`n`=&@Su zYCsx2(Jz_yb!y@3bR&iOq19l9Cti_~pgIe2QEgCFgGfc8`GR1G6Ml_>sgm)@tGeO* zbs{<~0~5`Q0}Ltx+P{GyQOci<5<1p8ln%oVLMX-!&Z;Yp1xp=8 zls-=1KKe|)MIFc!OYSfc zYBRy?0Koh<2Rt*f6Z{&I*c0XKlviVeI%Z9T|lm0%PwCaJI!zM;0*9mm$llDaGHw97IZqV#NJ<&3FX zpNUwoLVj=AZMfzVjfa85Rf34Uuz6ihOs8x1-R}HZG&(wzzo>qco#Ne*} zhr*xKMyMR18(kbrc?u1urV5VQ{ z;eK3J4xCMm{5X6pXkXpGGBncA@7>d~EFDKkDkq+a$Zw9x`i+r`miecBeRoNGbp9IoFdiT8Fflw%y@v}9AofL;nVu@dXW+>94USXCC+Bi3 zOzchuEBK=y)LQOD*y>3k%00ewUlA%Q-im{uaU`Y?b~dZjAg9#u9h(oBAH0LcLS4*{ z{#w?{-MZ4U&qS^rx!r4YSizsbtBFsSW(R|EkH>}F7!;wn1$BW{j;bV#Ja_Iu-V-{k zU}-boH-^w3}zQ8Cl`q zt3U{mHZ{%mnw*98E2lkhQ@}InXP-#;eM@=$B??Lg4IuVRzlbtiUYbvt#hgFWmXM^# zD%+us7_iQ+J9)o|kK2*Jd8;4QGZ$(;Kqs%cqNj>T;J`H#i2#|DZF|+h-3Fu}#C~`~ zz{(5mh!lf*#1PPqOI?YfD8%se+)dFBv~_+e;`guK!{HztQTn9%4_1?=Ttbc zDxH71rW!ib(hO~2@lHeFn_yxD)50z7r1nO6Jjc z(K1V061SdC;6t{>br93VRSvl9pDOFW7XVFk(7>{M_(h16aO8yaOm8om+_1`yk9|Q^ zZ5$$W)-WaQaI)&Y$@EF@ptoP%^>VUkN^h#8a7T1FdF5bR#f9fja3XUT2=e0TyZins zV@OyDns?gyZYTe&>gvG@VKvYNl6El0X}%i6!XN?)psx>P4sIQE?tQYx3Jn)l>8yn9 z%ba<@=2Nte%yS*xL+7B!^x8r>Qp2Xt1SsL!)`@{!rW=<;i=fQ$vgtlOWP0^sE%se-TQgj%6E*G$}3sMek zH4@1&?-p#vp2&xj<$bfUmtHv> z`ce(ucd)pnV;WTCR)0|#shU1)KyFzw`N!%Q0$Bv<7n|7qUiWTYJ{Sml*OR>cf}yaO z1oMEdOrChhL%GxPT3yg}bEEL@6Fz|Ui2bvMdX!ZEM;NHrGqWZN+wTLNbD5skR=@_?C}$7^#_+cH`;NYdfM+NR2?PfM|$JPMZ=6> z1j*?T-ny%PiCQHmQP^?IORJ{m_~sh(*~p1NtsPqUQBGm_#WwC`RfPi>&R%luSp9=4 zQ2cvjdd#Q$B;0Qwh}LLaKLg8*E$x)(C>CMqZYT{nRXbBtteo@M)!%=PXk%kry zK=W>#l=!nCd>u|Aj-An-l)-N`zg*zO&sTPNKmRNtg5u39b^-`8C%-Y`iI?r=(in5w;9QRzr@BmaYJJ#?Xbpu(X*8VJJnFnOuo2AQTahR6085UJNAWb3H$$@VcpaY$8F;~i%Tnq>?qz0n~K1S5n zf{N81Z`EtReaL+e%vU-_T-Ci)gFnEYu}564C_J+`T~YVN3nq&BR8q-2lWxD1xjKQF zj7P@~2#-crDpYGoNQkYI*_#&{DKGmtniM^1NGrduV!8iGl}2Qbk$cmM57{TXWZav; zF|djuL+IAG5QB}2nGJVoTVEO7lCnO`r zivOeDgE)Dhq1c@jOwFK~GSNR^x`BQn)gtUf>F6g<=B=`L`fygo0EbGQK=stP3a+Js zLdMb72QFwKC416-GZ*AL9E{J`M#{O>@`R@2wJ34)|v~10}A`>%|5T+F+*KY|d3H*19TFGel=6x`Eu1I78)>M?2^X!z0 zeRSqds=`Sq$Q6Y8iB~ns$UjRJj|tL+@H)OK9nDsbMqux{37-;g;-DlA=t8`f^aw*? z!-pbJFjQ`y!_ZYN&a&KZW4GY3_%VTsh#dz}v{|#H;Q`1gah+W2g+NLw#jCNDP=flx z6%6-+Y84#xB6mT%dqAt4Lsct|zxD?N1Z~(Cmi64clDEt~sbxLSofiU`#3t zqG)@0*%imE2iG3k?IY~;Tok8^@F1P zyI2R2Bh$b%d9_4VAlH=s@^F3nXKsAJFwE`Qe!E=gIZGy7KN>z&l$p8s0TQR8QLleV zeOMf5sMpIGf%I9o?{cZeW?;D-reuUeOgw3uY+<9;o06MQM4q1$y8|ZeD&39cu6W6q z2nr4kh+GLUwp!D}9mvp~TOs{*n^Gt7a|+CZ0l@z?qghJvJ(+*sl+7H`8-JAm$VK#xfB)pC>0Y zz^XVf<|;6(1rH=bvk$__FdiHWVOBJeRmT#?7%k;jxKm;06#@VgA+o>@i4PY~HJD^~ z6X^w`kagBy)3K3G>c!hLC1Fvv;yVgsP-L>`0;9GwJ+emYYBqjW$!y@Cet&#q+6MoG zwCci7;Ab#2GNk^M{zaexP#&{e+PlATr?sjW`&mUfR*8rehEWPXK$3lEKaKD^kbcVytBpLh~dV{b2h~|+240GW(zEGrE2Kq@T z;~a+zJ+EI~PD;tc3iO&1ryeE>um3J}Grdv>72#s`E5!|$QZpSekfb2~Y_%iq2|*a-4hx7JG1-*D4i)On3VCh3%|VMTVdWXMp!(9*0S0u<*Q!@ACJQ zB+AVM+riuyCJMKD;iJwk$lL}~%f&sy!802a#v{dvs}XvY5`^WBoYsU$u~6CMMPKMF z(8VfBLyInfTZS^1d0^Ky^$}lH9Jl&czTp=UrJF9{dCo;sG>|A=zX~sQGst8m0q3@3pK2d?nNH)p0Dv%79s zE4C>^*od$Zoizz{NQ@-G1?q&$RN{zj%gFP-f#MRvgd_aFK9kGqiR*mBFXv8KNpnLt zyNtqoZ*eC56huDUWc7%wM1Dn@uf)Im;Z6~fe%P@Pv#I^tqTZAw4UdpT%>b~u73Kyj zOZP%id7>Z0CXh?Q^>B*!LWw2;hdc0&%#D$*aUdyW6YZB+2O=3=DAm}QirDHH_~&e^ ztKJ6D!YDl-yX1+w!S?4s1VJi_%v!qsjGJg?rYl!qs*jA&I&8X-;cmJj8$TfKKlOBd2 z1xSonj(1b$xalZIJm9KsA(D?Tw~QozYlh9~T}#KUV}3vLmZy}4`z*;C>WfM_WouO6 zWnGBOc3GfoUsQTQuC4$9S)le z2m%`m($>n@%+}Tn9S-A75u-bS6JxXFrEqYzFtWFDF>z#=_AUThGZ%onm4*FJV)i3# z1aNeAaCC67`fq6pGf&5%DrYM*dy^l5pT?#`RTge8uK(2;J;2Ds)ymzE&YO}h|A^Vz8X5l#`oA3ZBl40C#D>sp-@SmB#spXBjE->F-Kb;UQnon&=9lBwc0Q4yr<7D z^VGiqYSHv72~O5NW$T7rN7pDA1wLhyABAI3oP>0UUJnu-2>p^5J(8Ff{Y?=a2^|6* z0`KP$1eG_E#{y$wWMuqbQ`r&ziU3L56ru>-tdio_CXhSjPVuxtZLClsDxhCaghdu9 z^-V616OV3CDhC;I**cQKvRegW(6bWg&bQa++FY^8$al^BZ59284-1SBj13Im%kbOa zLLErDj;cq(0&nh#E!nN0E;HaywXO*WlZh~PSy~& zgU6KGrmbkyj>!wo&z7;*_dcnM8Ua`JsSC@xXS<8ql?UZsU$rxGilUgJW>*Dousj28 zgEY2>mCgiQ9#6dw?3K5-jU`^2Q-80m=gCh06vZGUt0|(EBD`U_TETbb%wh=?-$PKmMR&Cby$&!A*soVIX@k=9{Ngp)@y<^@iudF z=WxM3#+SOLEe76hN{gl8MY1Zk+FOWU@zk7Dy8i0PIQInjbQehmf?=~e6wZKaPR94B z<~d!XKB)Gp*fLHUoL(<|F#Xg&wV$X5Opm;kixI!y^O?~2X(>blIXsggsO@OViQQG3ueEbT`szJO&)7QD5W0U;GG zFV(weQE+2aB=*or_QSp#&!|?Ck|oz`miF(eKH^;Ozk9p)G9XK_Jx59ZS(3Bt9!YNl z&rSl8dZn|h=cBv_rE%cjHF*^)e?e^#JD;t*PS&?Yy|7FaEH9ITu3e~irB4hNVw&w- z!faI!2=eRbypjtLzoh6iTSjk92Rek)lCAk0g~ z-B%TcOa}lb$UmYL*_sugjQ3;C-Q_jFEFB&*u z7Ee0(Q%j<@zYbFWP8|BixhmQR0>WOgZF+PqC?nOqe}zwMr;V1%$NGm(kfbZ+9>Cg8 zo?2dym%6T>e>{iq3Gqf)$&0$WlX5^L6A%Ht)RZPtswwF4>f>u0PeOFaSmGfkT_>b8 zG-m%ByIQn&O&M|+&cR}3Cscq^i5Wt8Q6p~(iZBazTLa@lmuiX_)C71%z9Wr`NeoHa zVr{f|iP;eXQtAm%s}8^`fVnER!TGxF`PkUCWZxt;+FB(M^12mT>pbWo%!X_XX(@w1 zJM%=TVt3mXKM3A+U1gv&z^o>U3aYs1vc=m!cpPw1lc{JNK5^-XWXN-d)Q6S#1etP9 z;f?9CX3y$Cy?D@yTqwi;pyeKZ_gj9Po!S3O44a~9?1*)Q>i?^0!*M<%BA#7)2>2(Y zn2cIMCxN}M-fscL9<+=P)(UvBxWT^yL8M;-X+?!Pw&b4AG_02=Ds6WyGk&DulXF-i zr%COp``r}_Hq*z6Op_qZ9*_y8QixNi9q%(547W)E+>Zd*AwIzIMngoYP8#e^nl2~< zq8Fw$&ep$eJ&)G-C5$&1E2^yq#F2|&fF^s3(+BAcg>w<(>Cp}JCN@S=EPB=cVe&jA zNgQdb6~en7e-BHhYKojd5x*29>}6!KWKy?3MZIyD8HBD5Wm_}R?q#3^id_0qyy2Ge za*eltHKNVBwkt<-!nm{EY598N9#{Y(1K+(rt$A7-BlmasRCJ1)_Qv%OPWk9O)+@P) zfDMiG4N(3c!38Q`Vcl?Js6oF`%@>wxC_C5p%tu-#ZVD3pLP1KbpqpAWW}(3?A^GRYiYJZj+w6 zZJ_C9&5UljQlJy3W{jC0D^xJcYbU--=84X=cT)_>d?mQKdo^A9R6D*!V(Wj9R%mm46)VoMQKQYdn;-+4MWvTXi?kh)J-DgXx zGX|R*Dig`qrX^dwGy^wRzuBd*GseIpWh;e;5MOQCmQTFrhdc0-TC8JwuyRFcW0T4_ z+Bx(zW$qKVa-5@0uW&HQmFTE~4RrKG_*rQsb@@D0g}64%o2ry7l>x<|pBS9(UK3R> z|MJhpqZi%TDI8Ze?DVO#Tx6{<$^K%d-=_S;>fJD8p)!1TSGEH;!xWBe(S2S{V#T^| zc;L^ayVy-%*^)!-pib1&=}0@A%p68Ji1;K1di40pzPM}Ez9TZkDO%YBSWqyHoNXZ`P zbGq#@(KN(3#;_`{i6+Z5H)2s^p~1-7Ak6cDl)Oq&)(jGQg-S4-vOmW>&^zK|*LKe{ z)`iK`i}J*+6(zA3+14S1mrLg?A8(^vhT9N>QR6qs3i{Sm_|*ilOv>#TYd|I&WCnDN-D z3Ri-6ok(^Uwh~fNN$3Ad!dbio->MP4Sh%)%P8LnSA-S8?;pUsesWfJqRCi2|-bS>p zNKz*zQvO68ul0@MPpJ2Oey9<58RF{}gqWWx#+rqtdJcRJe^VxQWbSN@&X>oXKGSr( z;LZgZf*NwcUY;m;DZVtxJ{Z#_FyCCA8N$_tK_)GR{P%lg!}9~a5_lTgKEsniRP8MW zb|4ofyH*6ni@zvKVGV7#f7hnMVK!+G!8csFJnH_ch3$p#pKT#kN!Pc|!Z2~~DlQw0 z+@d*8*Awi{(&H`-OI5U(0R&qswOWF_guhISd1@|u`&ZMX7_aXA$f)8w6|(Px zWAyRU->7-wp~Y_FMu?4aV-*so5so7Vox_O^sHc3{^1>_H0%fW?B0Q7ErqkmW31}Nz zzn454Hu5~IIJ9p+;oNq8HZ%tf!EC#U1rV`LkHg=-Y!=6sRv(LS6s|MzUMl|*qG#!O zByh*%nSkGygV7WsXAKCB@)7_NPcxaBQvq3(*^+U>qc z>X=M8pewI*zn8-1smVF)@xxJl>0LIZs!@l#qUAol5m0APrZOOvq&zss(}01%K!AT> zOzJ-uIT0}-6-`+QWks$3!N>pH6@>u<7VHOx0K+r05`FIfg^9pgSinO6 z3y9RvkE}q}>9knFjCKpI{r`0UL5ox)U1UGSuxB#SRV}ONB6IFjd~fmSM!?%4k-d-n z#xWTr;JCGeWlOcbGxD+GziqVU8w9DZfB$w#s03$b+m|1%++^{WcEAi?a^C+xe~7IR1&Eh*~| z^s*#oj61iV*gbu8ZQXO8Sp}|p?vHXncg^+?g%cdj5lM*L6e6KGe-dJZ63s@A8*eGj z@k*~9=_v?)?{T*VRCtu{!bQ4xHcN4{V}L^jb}QQi-_H+*x{%lad9LH}HxKj~At@G^ ziGy51kjq#$+trg6YVXnAg*~TupZ9%zbZzX8qP=eBr{Z>E6oMS7eqV|3kul=uQXc_T zJP4cyqez*OvJLg&;w{n1(>eoMGx&HAYG7JClJI-9M|Fve{rJGk`*p zm4K$V&jkb41!ZQ7=vZ2$3ecYw0w4Wz0J+Smk#}=#GkC#0u8tmf*fG}Z=OnTIQ?8`IJl2m2WQ4>2Cm>{J zUCl#_GpqBG!-*<+@u^7EnTcyIAOS?=8HSmi^L8XE%Gt5M&AbE_f>$*z9#@iuRG7)n zX9*m_%TZvf66iS8DZ@a>V6BE*bjpXF@N0-lVQ6G{(9hRDuyn-m0nC$(|C_#|+PM85 zzw+kHRM;H{_S^?Uc@-0ye-<8B+Br!NiHe4hefZd#D0u{}Zjvw#id0Of3RojWNU>9+mG}~{e@;Xp*8%U z-WB0~_GPHO}ovuKTuw3yhU0IhU%}xR*0MIxC9Yr{w_f{hDmZ3 zr@}8`US@L~ZEuLO&9z>{Spkh_d?__VrGBhc@$hDYxwG6l;PcnCag;okGHBaGcSH5f zk+kIWlOucuNvLO!s@TBH)tzO*q-*)QBQ=N+5gF$2O&IpL7dnk{A{2$hcp_15)9{(d z!ziNxls%f1LnQQeHF?}%A&@V>MiYFacVf`0d`(?nN^M!a{yGbd0ia9Jd_ZQaXEdSK zvQqUS`;OQu8q}>!8RBUm9D^fuI5<-3vl(`vc3i>xTcM_EUDWxamPDv8A#$85%0m

@_}@wLLDg_;H(X;X4l}U<_}2IeVI?UWn|$9d2$#S_pnDqs6q>M z&);%xgB)_%;5Oj>L#!5Sf-P;qVr^vcAN=~@e|IAJzuG(Ua46UPH`cLbX7Y_0CR>@Z zWlR#4^w|lGH4}xkV;rH9q$=a(G} z$O#Dwh^`bC2!6Krv2em3)t+do>{zzOd(W!6@$j#%AFw?<(-3(nIf*#o2QB%wMWEt!r-00Vc@p-v2SpUA>>sk)@to7@z@7yX5?W4Y{ z(aB~+{W4wGfL9nctMN8_z?LW6Dcaec6Wj%#HCQ3rjuYgJ0oq$J$6Ft{>NNIp> z*O~F1aqYMU)9bwR@kS?SMWgpZvgysl1QlDQwe!!Um}4u6j;}SB2D`A>ERzwh=k?t+ zp$&3B4vx`ouQK!6!00x7EL1uDyIa<`W3<#R7ncs#)@)YJ37-MdjW05mt zu2O2doHTehr!@U!Q_!aDsX?phHfV(*%wc#GJg6&dr!+3j-D=ucUxWx)j27XH)y*u zUu0yT^}H-uU}>yWN$0Smq!kQ{at|{3?d?ptu2h{UNNyFUPi2zO4Vf=`3z&~8!P-{9 zqk!|E2WSe!BM^knI9ZEkpZ353;|TBtk>(bm_sS3Qc{Zfc z(qf@svASBuv@@a4_DW+4Ny+Y(0Ti#`dcE)T^45qGm&=z46vb$4)Rn(9a(*A5VEZvO zifdyABR%y>ujEcfQ#q$ztvAKD@6`SW*>WLk+X{OL3(q|_8P}3*^b`)rkOM5%+-RCt zjd?m_Bby68J37u%{LNyhrYnlMW6w6#K+Wz)(+w$<{Xc0tb(hYDwa@MKvBL)zoY?r{ zG}DxsE7i^5+m&kJEljAT7vrXs$qQ?L1s}^T^>j#!n>*|w@`IEZv-#w6)n01I^7XYD zZF@vi20E;4oOiU|S#L4k)h{0AHNRQDg!rS?lgGxDpKn-=nJg?1HMxYZfy_rE#65J8CZ>|%uPe7P=sg_!ulinB=yU4^!H z+H+E}bA>*|1tUA&f-06sE)k{YUBqnpqvi1;gVUD+Lt?|nz%XU-!AK`BNZ_Cl)VAkY zI0)bYmmp*wZ0AjbJn+xcC1R7sLU12^NrK}M7!u&MGs4Ty$2W}YRh7W2N^tbNtBbtq z-?E|-`KS~@hL)BV8$9*&7z{QHQOOX55&k~D2e%j$sFeSyOBIXy2Rme^Vnf>^ELgt( z2M&i&DY(U5`*9vZSUJ$fRi+#oHG^$NKj6U?|tf|Vfp%{(CZ-%QTPeVCeR zpk@<9zhAmI|38U~ya7WBm?h@A1(82Bh1Pp-}< zNuk3NMI5oS+q!K%$J5s<(1UVIKod1UzjK zH5Q;pM4)sF1o7eVVNY#9MvPIJt*E?_E=mkQ|CnL=Fc{4Uv2jq-)YSDvU$GpxdJGXv zEkJIu0-5N7EP*~$)ZE5*m$M;fyOZ9U?b`x^Jj^kD7Jy093}wQUqU8a}4x^!O7#-7T zVq@zs0 z8eof%Ta3TX&!uDSVao_c5Nn68^K7RlLeYmC+3 z3Poa?Kqb+Hwil?Zi4Uk6`n2V?BUU&-*2MbT7A0X#$96Uh*llbPVeRjTKolWXaDYcB Uhnft+&li87N+GaBLF}~t1rtxKSpWb4 diff --git a/evaluation/evaluation.py b/evaluation/evaluation.py new file mode 100644 index 0000000..3b993b9 --- /dev/null +++ b/evaluation/evaluation.py @@ -0,0 +1,11 @@ +# %% +import polars as pl + +# %% +eval_dataset = pl.read_parquet("../data/eval/eval_set.parquet") +eval_dataset.head() + +# %% +eval = pl.read_parquet("dataset_eval.parquet") +eval.head() +# %% diff --git a/setup.sh b/setup.sh index ac3e164..24c0533 100755 --- a/setup.sh +++ b/setup.sh @@ -1,3 +1,3 @@ uv sync uv run pre-commit install -uv run pytest tests/testconnections.py +uv run pytest tests/test_connections.py diff --git a/src/evaluation/build_eval_set.py b/src/evaluation/build_eval_set.py index 0747512..a18d604 100644 --- a/src/evaluation/build_eval_set.py +++ b/src/evaluation/build_eval_set.py @@ -51,7 +51,7 @@ def stratified_sample( df: pl.DataFrame, code_column: str, n_per_stratum: int, - stratum_depth: int = 2, + stratum_depth: int = 5, seed: int = 42, ) -> pl.DataFrame: """Tire au plus `n_per_stratum` lignes par strate de code. diff --git a/src/evaluation/run_eval.py b/src/evaluation/run_eval.py index 2e09eda..d19dd96 100644 --- a/src/evaluation/run_eval.py +++ b/src/evaluation/run_eval.py @@ -38,6 +38,7 @@ async def run(args) -> int: df = pl.read_parquet(args.eval_set) + df = df.sample(fraction=args.fraction) labels = df[args.text_column].to_list() y_true = df[args.code_column].to_list() logger.info(f"Evaluating method '{args.method}' on {len(labels)} labels") @@ -78,6 +79,9 @@ def main() -> int: parser.add_argument( "--eval-set", default=PATH_EVAL_OUTPUT, help="Evaluation parquet (cf. build_eval_set)" ) + parser.add_argument( + "--fraction", default="1.0", help="Dataset's fraction to evaluate (default: 1.0)" + ) parser.add_argument("--method", choices=sorted(METHODS), default="navigator") parser.add_argument("--text-column", default="libelle", help="Text column (default: libelle)") parser.add_argument( diff --git a/src/main.py b/src/main.py index 9295c97..0c9b339 100644 --- a/src/main.py +++ b/src/main.py @@ -2,9 +2,10 @@ import logging import os import sys -from langfuse import get_client, propagate_attributes, observe from datetime import datetime +from langfuse import get_client, observe, propagate_attributes + from src.agents.closers.match_verifier import MatchVerificationInput, MatchVerifier from src.agents.Text2Code.classifiers.agentic_rag import AgenticRAGClassifier from src.agents.Text2Code.classifiers.navigator_classifier import NavigatorAgenticClassifier @@ -20,37 +21,38 @@ # @observe async def classify_navigator( - query: str | list[str], - experiment_name: str = "Navigator Classification" + query: str | list[str], experiment_name: str = "Navigator Classification" ): """Classify using agentic method - + Args: query: A single query string or a list of query strings experiment_name: Name of the experiment - + Returns: Single result dict if query is str, list of result dicts if query is list """ # Normalize input to always work with a list queries = [query] if isinstance(query, str) else query is_single = isinstance(query, str) - + logger.info(f"Navigator classification: {len(queries)} query/queries") - + # TODO: add the management for exp_name navigator = Navigator(neo4j_config) - + # Built once: tools/Agent are closures over `navigator`, so state resets + # (below) are enough between queries — no need to rebuild them each time. + classifier = NavigatorAgenticClassifier(navigator) + results = [] for q in queries: logger.info(f"Classifying: {q}") - logger.info(f'Current position of the navigator: {navigator.current_code}') - classifier = NavigatorAgenticClassifier(navigator) + logger.info(f"Current position of the navigator: {navigator.current_code}") result = await classifier(q) results.append(result) logger.info(f"Le résultat de la classification est : {result}") navigator.reset_to_root() - + # Return single result or list based on input type return results[0] if is_single else results @@ -76,16 +78,23 @@ async def classify_agentic_rag( graph = Graph(neo4j_config) top_k = int(os.environ.get("AGENTIC_RAG_TOP_K", "5")) + concurrency = int(os.environ.get("AGENTIC_RAG_CONCURRENCY", "5")) classifier = AgenticRAGClassifier(graph, top_k=top_k) - results = [] - for q in queries: - logger.info(f"Classifying: {q}") - result = await classifier(q) - results.append(result) - logger.info(f"Le résultat de la classification est : {result}") + # Stateless per query (unlike NavigatorAgenticClassifier), so queries can + # run concurrently against the single shared classifier/graph connection. + semaphore = asyncio.Semaphore(concurrency) - return results[0] if is_single else results + async def classify_one(q: str): + async with semaphore: + logger.info(f"Classifying: {q}") + result = await classifier(q) + logger.info(f"Le résultat de la classification est : {result}") + return result + + results = await asyncio.gather(*(classify_one(q) for q in queries)) + + return results[0] if is_single else list(results) async def verify_classification(prediction: MatchVerificationInput, verifier: MatchVerifier): diff --git a/src/neo4j_graph/graph.py b/src/neo4j_graph/graph.py index 97b6f46..908e31f 100644 --- a/src/neo4j_graph/graph.py +++ b/src/neo4j_graph/graph.py @@ -120,26 +120,22 @@ def __init__(self, neo4j_config: Neo4JConfig) -> None: enhanced_schema=True, ) - try: - self.emb_model = OpenAIEmbeddings( - model=os.environ["EMBEDDING_MODEL"], - openai_api_base=os.environ["URL_EMBEDDING_API"], - openai_api_key=os.environ["OPENAI_API_KEY"], - ) - - self.db = Neo4jVector.from_existing_graph( - graph=self.graph, - embedding=self.emb_model, - index_name="id", - node_label="Chunk", - text_node_properties=["text"], - keyword_index_name="text", - embedding_node_property="embedding", - search_type="vector", - ) - - except Exception as e: - logger.info(f"Not able to connect to the embedder: {e}") + self.emb_model = OpenAIEmbeddings( + model=os.environ["EMBEDDING_MODEL"], + openai_api_base=os.environ["URL_EMBEDDING_API"], + openai_api_key=os.environ["OPENAI_API_KEY"], + ) + + self.db = Neo4jVector.from_existing_graph( + graph=self.graph, + embedding=self.emb_model, + index_name="id", + node_label="Chunk", + text_node_properties=["text"], + keyword_index_name="text", + embedding_node_property="embedding", + search_type="vector", + ) # ------------------------------------------------------------------ # Get tools @@ -285,7 +281,7 @@ def _cached_get_parent(self, code: str) -> Tuple[Tuple[str, Any], ...]: return _freeze_dict(result[0]) # ------------------------------------------------------------------ - # search_codes + # search_codes # ------------------------------------------------------------------ @lru_cache(maxsize=0) @@ -296,7 +292,7 @@ def _cached_search_codes(self, search_term: str) -> Tuple[Tuple[Tuple[str, Any], OR toLower(node.text) CONTAINS toLower($search_term) RETURN node.CODE as code, node.LEVEL as level, - node.FINAL as is_final, + node.FINAL as is_final, node.NAME as name, node.text as description ORDER BY node.LEVEL, node.CODE diff --git a/tests/test_connections.py b/tests/test_connections.py index 842ce1f..a319561 100644 --- a/tests/test_connections.py +++ b/tests/test_connections.py @@ -49,14 +49,14 @@ def test_generation_model_api_connection(): assert list(client.models.list()) +@_require_env("URL_EMBEDDING_API", "EMBEDDING_MODEL") def test_embedding_api_connection(): - base_url = os.environ.get("URL_EMBEDDING_API") or os.environ.get("OPENAI_BASE_URL") - if not base_url: - pytest.skip("missing env var(s): URL_EMBEDDING_API or OPENAI_BASE_URL") - from openai import OpenAI - client = OpenAI(base_url=base_url, api_key=os.environ.get("OPENAI_API_KEY", "EMPTY")) + client = OpenAI( + base_url=os.environ.get("URL_EMBEDDING_API"), + api_key=os.environ.get("OPENAI_API_KEY", "EMPTY"), + ) assert list(client.models.list()) From 2b42a2e741feb658d530af2aba17681657684222 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 7 Jul 2026 15:26:01 +0000 Subject: [PATCH 11/18] fix: guard against MLflow browser-URL mistakenly used as MLFLOW_MODEL_URI Fail with a clear message instead of an opaque MLflow error when MLFLOW_MODEL_URI is an http(s) link to the MLflow UI rather than a models:/ URI, and document the related tracking-server-vs-model-registry mismatch pitfall. --- docs/framework.md | 4 +++- .../Text2Code/classifiers/supervised_classifier.py | 11 +++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/framework.md b/docs/framework.md index 68c4030..037a32d 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -159,10 +159,12 @@ report["any_drift"] # bool | `MAX_TURNS` | Nombre maximal de tours d'agent (boucle outil → réponse) | | `EMBEDDING_MODEL`, `URL_EMBEDDING_API`, `MAX_TOKENS` | Modèle et service d'embedding utilisés lors de la construction du graphe | | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_ENDPOINT_URL` | Accès S3 (Datalab/Onyxia) pour les données sources et notices | -| `MLFLOW_TRACKING_URI`, `MLFLOW_MODEL_URI` | Chargement du modèle supervisé de production par `SupervisedClassifier` (`MLFLOW_MODEL_URI` ex. `models:/apet_classifier/Production`) | +| `MLFLOW_TRACKING_URI`, `MLFLOW_MODEL_URI` | Chargement du modèle supervisé de production par `SupervisedClassifier` | Le traçage applicatif (sessions, coûts, latence, arbre d'appels des agents) est assuré par **Langfuse** (`get_client`, `propagate_attributes`, `@observe` dans `src/main.py`). +**Piège fréquent sur `MLFLOW_MODEL_URI`** : ce n'est pas le lien de la page MLflow ouverte dans le navigateur, mais une URI au schéma `models:` — ex. `models:/FastText-pytorch/9` (pas `https://.../#/models/FastText-pytorch/versions/9`). Et `MLFLOW_TRACKING_URI` doit pointer vers le serveur MLflow où ce modèle est **effectivement enregistré** (le plus souvent l'instance MLflow partagée du projet, ex. `projet-ape-mlflow.user.lab.sspcloud.fr`) — pas nécessairement l'instance MLflow personnelle par défaut sur le Datalab, qui n'a pas accès au registre d'un autre projet. `SupervisedClassifier` lève une erreur explicite si `MLFLOW_MODEL_URI` est un lien `http(s)://` plutôt qu'une URI `models:`. + Un test de connectivité par service externe (Neo4j, LLM de génération, embedding, S3, Langfuse, MLflow) est disponible dans `tests/test_connections.py` — chaque test se saute automatiquement si les variables requises sont absentes, pour rester vert en CI sans secrets Datalab tout en détectant un endpoint/identifiant mal configuré quand ils sont présents. ## 7. Comment étendre GRAAL à une nouvelle nomenclature **[à compléter]** diff --git a/src/agents/Text2Code/classifiers/supervised_classifier.py b/src/agents/Text2Code/classifiers/supervised_classifier.py index 32416c3..998faef 100644 --- a/src/agents/Text2Code/classifiers/supervised_classifier.py +++ b/src/agents/Text2Code/classifiers/supervised_classifier.py @@ -34,6 +34,17 @@ def _load_model(): tracking_uri = os.environ["MLFLOW_TRACKING_URI"] model_uri = os.environ["MLFLOW_MODEL_URI"] # ex. "models:/apet_classifier/Production" + + if model_uri.startswith(("http://", "https://")): + raise ValueError( + f"MLFLOW_MODEL_URI={model_uri!r} looks like a browser link to the MLflow UI, " + "not a model URI. mlflow.pyfunc.load_model() expects the 'models:' scheme, " + "e.g. 'models://' (for '.../#/models/" + "FastText-pytorch/versions/9', use 'models:/FastText-pytorch/9'). Also check " + "that MLFLOW_TRACKING_URI points to the MLflow server where that model is " + "actually registered, not a different (e.g. personal) instance." + ) + logger.info(f"Loading supervised model '{model_uri}' from MLflow ({tracking_uri})") mlflow.set_tracking_uri(tracking_uri) From ebb941a093e20f6f2a790aabfc474ccc1975da87 Mon Sep 17 00:00:00 2001 From: theof Date: Wed, 8 Jul 2026 15:11:00 +0000 Subject: [PATCH 12/18] liner --- docs/framework.md | 13 +-- .../Text2Code/classifiers/agentic_rag.py | 88 +++++++++----- .../Text2Code/classifiers/base_classifier.py | 4 + .../classifiers/navigator_classifier.py | 9 +- .../classifiers/supervised_classifier.py | 110 +++++------------- src/agents/base_agent.py | 8 +- src/main.py | 38 +++--- src/navigator/navigator.py | 82 +++++++------ src/utils/parser.py | 5 +- 9 files changed, 176 insertions(+), 181 deletions(-) diff --git a/docs/framework.md b/docs/framework.md index 68c4030..76663b7 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -79,7 +79,7 @@ Chaque appel d'outil est journalisé (position avant/après, données renvoyées - `BaseClassifier` — spécialise `BaseAgent` en fixant le type de sortie à `MatchVerificationInput` (activité, code proposé, explication, confiance), le format commun attendu par les agents « closers ». - `NavigatorAgenticClassifier` — classifieur concret : instructions demandant au *Navigator* de descendre jusqu'à un code terminal (`is_final = 1`) en justifiant chaque choix, en démarrant systématiquement par `get_current_children()`. -- `AgenticRAGClassifier` (`agentic_rag.py`) — approche alternative : récupération des *top-k* codes les plus proches par similarité d'embedding (`Graph.get_closest_codes`, recherche vectorielle Neo4j filtrée sur les codes finaux), puis arbitrage par l'agent `CodeChooser`. Branché dans la CLI via `--agentic-rag` ; le nombre de candidats est réglable par la variable d'environnement `AGENTIC_RAG_TOP_K` (défaut : 5). +- `AgenticRAGClassifier` (`agentic_rag.py`) — approche hybride : récupération du code le plus proche par similarité d'embedding (`Graph.get_closest_codes`, recherche vectorielle Neo4j filtrée sur les codes finaux), utilisé comme point de départ (*warm start*) pour le *Navigator* plutôt que la racine. L'agent vérifie ce point de départ avec les outils du *Navigator* (informations du noeud, enfants, frères, parent) et navigue pour le corriger si besoin, avant de rendre un `MatchVerificationInput`. Branché dans la CLI via `--agentic-rag`. - `SupervisedClassifier` (`supervised_classifier.py`) — **pas un agent LLM** : charge le modèle supervisé de production (*deep learning*, package `torchTextClassifiers`, cf. cadrage §1.1) via l'API MLflow pyfunc (`MLFLOW_TRACKING_URI` / `MLFLOW_MODEL_URI`) et l'expose avec le même contrat de sortie (`MatchVerificationInput`) que les deux classifieurs agentiques, pour servir de référence dans la comparaison chiffrée (cf. cadrage §3.3-B, note de conception). Branché dans la CLI via `--supervised`. **Non validé** : le format exact de sortie du modèle logué (nom des colonnes, présence d'un score de confiance) n'a pas pu être vérifié dans cet environnement — `_parse_prediction` gère plusieurs formats plausibles et journalise un avertissement s'il doit se rabattre sur une confiance par défaut de 1.0. ### 3.5 Agents « closers » (`src/agents/closers/`) @@ -110,7 +110,7 @@ uv run -m src.main --navigator --batch-file requetes.txt --experiment-name mon-e ``` - `--navigator QUERY` — classification agentique par navigation hiérarchique (*Navigator*) ; -- `--agentic-rag QUERY` — classification par recherche vectorielle *top-k* + arbitrage `CodeChooser` (cf. §3.4) ; +- `--agentic-rag QUERY` — classification par recherche vectorielle comme point de départ (*warm start*) du *Navigator* (cf. §3.4) ; - `--supervised QUERY` — classification par le modèle supervisé de production via MLflow (cf. §3.4) ; - `--verify` — chaîne la prédiction dans le *MatchVerifier* pour double vérification (cf. §3.5) ; - `--batch-file FILE` — traite un fichier de requêtes (une par ligne) avec la méthode choisie ; @@ -129,7 +129,7 @@ uv run -m src.evaluation.build_eval_set --input --output data uv run -m src.evaluation.run_eval --eval-set data/eval/eval_set.parquet --method navigator ``` -Le jeu d'évaluation est désormais construit et versionné (`data/eval/eval_set.parquet`, 5 181 lignes, stratifié par code complet — `apet2025`, ~10 exemples/code) ; `run_eval.py` propose trois méthodes : `navigator`, `agentic-rag`, `supervised`. +Le jeu d'évaluation est désormais construit (`data/eval/eval_set.parquet`, 5 181 lignes, stratifié par code complet — `apet2025`, ~10 exemples/code) ; `run_eval.py` propose trois méthodes : `navigator`, `agentic-rag`, `supervised`. ### 5.1 Détection de dérive (`src/evaluation/drift.py`) @@ -173,12 +173,7 @@ Cette section documentera, une fois formalisée, le mode opératoire complet pou Recensées ici pour mémoire (suivi détaillé dans le document de cadrage) : -- Les composants branchés le 6/07 (classifieur *Agentic RAG* dans la CLI, chaînage `--verify`, harnais `run_eval`) sont vérifiés statiquement (lint, syntaxe, tests unitaires des métriques) mais **pas encore validés fonctionnellement** contre la base Neo4j et l'API LLM — à faire dès le retour sur l'environnement Datalab. +- Les composants branchés le 6/07 (classifieur *Agentic RAG* dans la CLI, chaînage `--verify`, harnais `run_eval`) n'ont pas encore été évaluées. - `SupervisedClassifier` (modèle de production via MLflow) est également non validé fonctionnellement : le parsing de la sortie `.predict()` est écrit pour plusieurs formats plausibles mais n'a pas pu être testé contre le modèle réel dans cet environnement (pas d'accès au tracking MLflow). - La CI couvre lint, syntaxe et tests unitaires purs (dont le module `drift.py`, testé sur données synthétiques), mais **pas de tests d'intégration** (agents + graphe + MLflow) : ils nécessiteraient les services correspondants dans le workflow. `tests/test_connections.py` comble partiellement ce manque en local/Datalab (smoke tests skippés si les identifiants sont absents). -- Le jeu d'évaluation est désormais constitué et versionné (`data/eval/eval_set.parquet`) ; restent les campagnes chiffrées elles-mêmes (S3 de la roadmap). -- **Le projet requiert Python ≥ 3.12** (idéalement 3.13, cf. `pyproject.toml` et `.python-version`) : certains modules (ex. `prompt_builder.py`) utilisent des f-strings à guillemets imbriqués, syntaxe introduite par la PEP 701 et invalide sur des versions antérieures. Exécuter le projet avec un interpréteur plus ancien (3.11 par exemple) produit de fausses erreurs de syntaxe sur ces fichiers. - --- - -*Prochaine mise à jour prévue : semaine du 14 juillet 2026, à l'issue de la formalisation de la méthode et du jeu d'évaluation.* diff --git a/src/agents/Text2Code/classifiers/agentic_rag.py b/src/agents/Text2Code/classifiers/agentic_rag.py index 6bfaa32..2d3dd45 100644 --- a/src/agents/Text2Code/classifiers/agentic_rag.py +++ b/src/agents/Text2Code/classifiers/agentic_rag.py @@ -1,54 +1,78 @@ import logging -from src.agents.closers.code_chooser import CodeChooser from src.agents.closers.match_verifier import MatchVerificationInput from src.agents.Text2Code.classifiers.base_classifier import BaseClassifier -from src.neo4j_graph.graph import Graph +from src.navigator.navigator import Navigator logger = logging.getLogger(__name__) class AgenticRAGClassifier(BaseClassifier): """ - 1. Retrive the top_k closest codes from the graph - 2. A CodeChooser agent to select the most appropriate code for the given activity. + 1. Retrieve the single closest code from the graph via embedding similarity search. + 2. Use it as a warm-start position for the Navigator agent, which verifies it against + the hierarchy (siblings, parent, children, is_final) and refines it if needed. - Output is a CodeChoice, which is converted in a MatchVerificationInput as per requirements for classifiers. - - Confidence of AgenticRAGClassifier is the confidence given by the CodeChooser. + Output is a MatchVerificationInput, produced directly by the agent's structured output + (same contract as NavigatorAgenticClassifier). + Confidence of AgenticRAGClassifier is the confidence given by the agent itself. """ - def __init__(self, graph: Graph, top_k): + def __init__(self, graph: Navigator): super().__init__(graph) - self.top_k = top_k - self.code_chooser = CodeChooser(graph, num_choices=top_k) - - async def __call__(self, activity: str) -> str: - closest_codes = await self.get_closest_codes(activity) - logger.info(f"Closest codes for activity '{activity}': {closest_codes}") - code_choice_result = await self.code_chooser(activity=activity, codes=closest_codes) - - # We need to convert the CodeChoice into MatchVerificationInput - # because all classifiers must return that type - code_choice_result = code_choice_result.final_output - result = MatchVerificationInput( - activity=activity, - code=code_choice_result.chosen_code, - proposed_explanation=code_choice_result.explanation, - proposed_confidence=code_choice_result.confidence, # confidence from CodeChoice - ) - - return result + + async def __call__(self, activity: str) -> MatchVerificationInput: + start_code = await self.get_starting_code(activity) + logger.info(f"RAG starting point for activity '{activity}': {start_code}") + + self.graph.current_code = start_code + self.graph.history = [start_code] + + return await super().__call__(activity, start_code) def get_agent_name(self) -> str: return "Agentic RAG Classifier" def get_instructions(self) -> str: - return None + return """ + Vous êtes un expert en classification NACE. + + Une recherche par similarité d'embeddings vous propose un point de départ dans + l'arborescence, mais cette suggestion peut être imprécise ou erronée : ne la validez + jamais aveuglément. Vérifiez-la avec les outils disponibles (informations du noeud + courant, enfants, frères, parent) avant de conclure. + + Si le point de départ semble incorrect, naviguez vers une meilleure position (remontez + au parent, explorez les frères ou les enfants) plutôt que de le valider tel quel. + + Après avoir vérifié que votre position finale est bien terminale (is_final = 1), + renvoyez le code choisi, une explication concise et votre niveau de confiance. + Commencez par get_current_information() pour examiner le point de départ proposé. + + RÈGLE STRICTE : il est interdit de répondre avec un code dont is_final = 0, ou + avec le point de départ suggéré si vous avez constaté qu'il ne correspond pas à + l'activité. Si votre position actuelle n'est pas satisfaisante, vous DEVEZ appeler + un autre outil (get_current_children, go_to_child, go_to_parent...) avant de + conclure — ne vous arrêtez jamais après un seul appel d'outil si is_final n'est + pas à 1 ou si le code ne correspond pas à l'activité décrite. + """ + + async def get_starting_code(self, activity: str) -> str: + closest_codes = await self.graph.get_closest_codes(activity, top_k=1) + return closest_codes[0] + + def build_prompt(self, activity: str, start_code: str) -> str: + return f""" + Vous êtes un classificateur NACE. + + Activité à classifier : {activity} - async def get_closest_codes(self, activity): - return await self.graph.get_closest_codes(activity, top_k=self.top_k) + Un système de recherche par similarité d'embeddings suggère de partir du code + {start_code} comme point de départ probable. Ce point de départ n'est qu'une + suggestion : il peut être imprécis ou erroné. - def build_prompt(self): - return None + Votre mission : vérifier rigoureusement ce point de départ et naviguer si nécessaire + vers le code le plus spécifique et approprié pour cette activité, jusqu'à atteindre + une position finale (is_final = 1). + """ diff --git a/src/agents/Text2Code/classifiers/base_classifier.py b/src/agents/Text2Code/classifiers/base_classifier.py index 65980c4..4346ea8 100644 --- a/src/agents/Text2Code/classifiers/base_classifier.py +++ b/src/agents/Text2Code/classifiers/base_classifier.py @@ -1,3 +1,4 @@ +from agents.model_settings import ModelSettings from src.agents.base_agent import BaseAgent from src.agents.closers.match_verifier import MatchVerificationInput @@ -5,3 +6,6 @@ class BaseClassifier(BaseAgent): def get_output_type(self): return MatchVerificationInput + + def get_model_settings(self) -> ModelSettings: + return ModelSettings(temperature=0, tool_choice="required") diff --git a/src/agents/Text2Code/classifiers/navigator_classifier.py b/src/agents/Text2Code/classifiers/navigator_classifier.py index 2c7a76b..696c72a 100644 --- a/src/agents/Text2Code/classifiers/navigator_classifier.py +++ b/src/agents/Text2Code/classifiers/navigator_classifier.py @@ -19,11 +19,10 @@ def build_prompt(self, query: str) -> str: def get_instructions(self) -> str: return """ - Vous êtes un expert en classification NACE. Votre mission est de naviguer + Vous êtes un expert en classification NACE. Votre mission est de naviguer dans l'arborescence afin d'atteindre le code le plus spécifique caractérisant l'activité indiquée. - Après avoir vérifié que votre position actuelle est bien finale (is_final = 1), - vous renverrez votre position. - Si vous n'avez pas réussi à atteindre une position finale, dites-le. + Après avoir vérifié que votre position actuelle est bien finale (is_final = 1), + vous renverrez votre position. + Si vous n'avez pas réussi à atteindre une position finale, dites-le. Soyez méthodique et justifiez chaque choix ! Commence par get_current_children() pour voir les options disponibles. """ - diff --git a/src/agents/Text2Code/classifiers/supervised_classifier.py b/src/agents/Text2Code/classifiers/supervised_classifier.py index 32416c3..1a7c941 100644 --- a/src/agents/Text2Code/classifiers/supervised_classifier.py +++ b/src/agents/Text2Code/classifiers/supervised_classifier.py @@ -1,104 +1,58 @@ -"""Wrapper autour du modèle supervisé de production (torchTextClassifiers, MLflow). +"""Wrapper autour du modèle supervisé de production, exposé via l'API déployée +codif-ape-API (https://github.com/InseeFrLab/codif-ape-API). -Ce classifieur n'est PAS un agent LLM : il charge le modèle de *deep learning* -actuellement en production (cf. cadrage §1.1, entraîné avec le package -`torchTextClassifiers`, distribué via MLflow) et l'expose avec le même contrat -de sortie (`MatchVerificationInput`) que `NavigatorAgenticClassifier` et -`AgenticRAGClassifier`, pour qu'il puisse être comparé aux méthodes agentiques -dans `src/evaluation/run_eval.py` (cf. cadrage §3.3-B, note de conception). +Sert de baseline de référence, comparée aux méthodes agentiques dans +`src/evaluation/run_eval.py` (cf. cadrage §3.3-B, note de conception), avec le +même contrat de sortie (`MatchVerificationInput`) que `NavigatorAgenticClassifier` +et `AgenticRAGClassifier`. -Le modèle est chargé une seule fois par processus (cache module-level) via -l'API MLflow pyfunc, indépendante du framework d'entraînement sous-jacent. - -**Non validé à ce stade** : le format exact renvoyé par `.predict()` pour ce -modèle précis (nom des colonnes de sortie, présence d'un score de confiance) -n'a pas pu être vérifié dans cet environnement (pas d'accès au tracking -MLflow). `_parse_prediction` gère plusieurs formats plausibles et journalise -un avertissement s'il doit se rabattre sur une confiance par défaut — à -corriger après un premier essai réel sur le Datalab. +Nécessite les variables d'environnement CODIF_APE_API_USERNAME et +CODIF_APE_API_PASSWORD (authentification HTTP Basic de l'API). CODIF_APE_API_URL +est optionnelle (défaut : l'instance de production sur le SSP Cloud). """ -import asyncio import logging import os -logger = logging.getLogger(__name__) - -_model = None # cache module-level : un seul chargement par processus - - -def _load_model(): - global _model - if _model is None: - import mlflow - - tracking_uri = os.environ["MLFLOW_TRACKING_URI"] - model_uri = os.environ["MLFLOW_MODEL_URI"] # ex. "models:/apet_classifier/Production" - logger.info(f"Loading supervised model '{model_uri}' from MLflow ({tracking_uri})") - - mlflow.set_tracking_uri(tracking_uri) - _model = mlflow.pyfunc.load_model(model_uri) - return _model +import httpx +logger = logging.getLogger(__name__) -def _parse_prediction(raw_prediction, text: str) -> tuple[str, float]: - """Extrait (code, confiance) d'une sortie `.predict()` MLflow pyfunc. - - Gère les formats plausibles pour un modèle de classification logué en - pyfunc : DataFrame avec colonnes code/confiance explicites, DataFrame à - une seule colonne (pas de confiance dans la sortie), ou liste/array brute. - """ - try: - import pandas as pd - - if isinstance(raw_prediction, pd.DataFrame): - row = raw_prediction.iloc[0] - code_col = next( - (c for c in ("code", "prediction", "label", "apet2025") if c in row.index), None - ) - confidence_col = next( - (c for c in ("confidence", "score", "probability") if c in row.index), None - ) - if code_col is not None: - code = str(row[code_col]) - confidence = float(row[confidence_col]) if confidence_col is not None else None - if confidence is None: - logger.warning( - f"No confidence column in model output for '{text}'; defaulting to 1.0" - ) - return code, confidence if confidence is not None else 1.0 - except ImportError: - pass - - # Repli : liste/array de labels, éventuellement de tuples (label, score) - first = raw_prediction[0] if hasattr(raw_prediction, "__getitem__") else raw_prediction - if isinstance(first, (list, tuple)) and len(first) >= 2: - return str(first[0]), float(first[1]) - - logger.warning(f"Unrecognized model output shape for '{text}'; defaulting confidence to 1.0") - return str(first), 1.0 +DEFAULT_API_URL = "https://codification-ape2025-pytorch.lab.sspcloud.fr" class SupervisedClassifier: - """Classifieur de référence : modèle supervisé de production via MLflow.""" + """Classifieur de référence : modèle supervisé de production via l'API codif-ape-API.""" def __init__(self): - self.model = _load_model() + base_url = os.environ.get("CODIF_APE_API_URL", DEFAULT_API_URL) + auth = ( + os.environ["CODIF_APE_API_USERNAME"], + os.environ["CODIF_APE_API_PASSWORD"], + ) + self.client = httpx.AsyncClient(base_url=base_url, auth=auth, timeout=60.0) async def __call__(self, activity: str): from src.agents.closers.match_verifier import MatchVerificationInput - code, confidence = await asyncio.to_thread(self._predict, activity) + code, confidence, libelle = await self._predict(activity) return MatchVerificationInput( activity=activity, code=code, - proposed_explanation="Prédiction du modèle supervisé de production (torchTextClassifiers)", + proposed_explanation=( + f"Prédiction du modèle supervisé de production (codif-ape-API) : {libelle}" + ), proposed_confidence=confidence, ) - def _predict(self, activity: str) -> tuple[str, float]: - import pandas as pd + async def _predict(self, activity: str) -> tuple[str, float, str]: + payload = {"forms": [{"description_activity": activity}]} + # nb_echos_max=1 makes the API crash with a 500 (server-side bug); ask + # for 2 and keep only the top prediction. + response = await self.client.post("/predict/", params={"nb_echos_max": 2}, json=payload) + response.raise_for_status() + result = response.json()[0] - raw_prediction = self.model.predict(pd.DataFrame({"text": [activity]})) - return _parse_prediction(raw_prediction, activity) + top_prediction = result["1"] + return top_prediction["code"], result["IC"], top_prediction["libelle"] diff --git a/src/agents/base_agent.py b/src/agents/base_agent.py index d2f7785..adc7d50 100644 --- a/src/agents/base_agent.py +++ b/src/agents/base_agent.py @@ -44,6 +44,7 @@ def __init__(self, graph: Graph): model=os.environ["GENERATION_MODEL"], model_settings=self.get_model_settings(), output_type=self.output_type, + reset_tool_choice=False, ) @abstractmethod @@ -61,13 +62,10 @@ def get_output_type(self) -> BaseModel: @abstractmethod def build_prompt(self, *args, **kwargs) -> str: pass - + async def __call__(self, *args, **kwargs): prompt = self.build_prompt(*args, **kwargs) - result = await Runner.run( - self.agent, - prompt, - max_turns=int(os.environ["MAX_TURNS"])) + result = await Runner.run(self.agent, prompt, max_turns=int(os.environ["MAX_TURNS"])) logger.info(f"Result of the __call__ in BaseAgent: \n {result.final_output}") return result.final_output diff --git a/src/main.py b/src/main.py index 78709b2..3499380 100644 --- a/src/main.py +++ b/src/main.py @@ -1,10 +1,10 @@ import asyncio import logging -import os import sys -from langfuse import get_client, propagate_attributes, observe from datetime import datetime +from langfuse import get_client, observe, propagate_attributes + from src.agents.closers.match_verifier import MatchVerificationInput, MatchVerifier from src.agents.Text2Code.classifiers.agentic_rag import AgenticRAGClassifier from src.agents.Text2Code.classifiers.navigator_classifier import NavigatorAgenticClassifier @@ -21,37 +21,36 @@ # @observe async def classify_navigator( - query: str | list[str], - experiment_name: str = "Navigator Classification" + query: str | list[str], experiment_name: str = "Navigator Classification" ): """Classify using agentic method - + Args: query: A single query string or a list of query strings experiment_name: Name of the experiment - + Returns: Single result dict if query is str, list of result dicts if query is list """ # Normalize input to always work with a list queries = [query] if isinstance(query, str) else query is_single = isinstance(query, str) - + logger.info(f"Navigator classification: {len(queries)} query/queries") - + # TODO: add the management for exp_name navigator = Navigator(neo4j_config) - + results = [] for q in queries: logger.info(f"Classifying: {q}") - logger.info(f'Current position of the navigator: {navigator.current_code}') + logger.info(f"Current position of the navigator: {navigator.current_code}") classifier = NavigatorAgenticClassifier(navigator) result = await classifier(q) results.append(result) logger.info(f"Le résultat de la classification est : {result}") navigator.reset_to_root() - + # Return single result or list based on input type return results[0] if is_single else results @@ -61,7 +60,11 @@ async def classify_agentic_rag( query: str | list[str], experiment_name: str = "Agentic RAG Classification", ): - """Classify using embedding retrieval (top-k closest codes) + CodeChooser agent + """Classify using embedding retrieval as a Navigator warm-start + + Finds the closest code by vector similarity, then lets the Navigator agent verify + and refine that starting position instead of walking down from the root + (cf. classify_navigator). Args: query: A single query string or a list of query strings @@ -75,9 +78,8 @@ async def classify_agentic_rag( logger.info(f"Agentic RAG classification: {len(queries)} query/queries") - graph = Graph(neo4j_config) - top_k = int(os.environ.get("AGENTIC_RAG_TOP_K", "5")) - classifier = AgenticRAGClassifier(graph, top_k=top_k) + navigator = Navigator(neo4j_config) + classifier = AgenticRAGClassifier(navigator) results = [] for q in queries: @@ -94,11 +96,11 @@ async def classify_supervised( query: str | list[str], experiment_name: str = "Supervised Model Classification", ): - """Classify using the production supervised model (torchTextClassifiers via MLflow) + """Classify using the production supervised model, via the deployed codif-ape-API Serves as the reference baseline for comparing the agentic methods - (cf. cadrage §3.3-B, note de conception). Requires MLFLOW_TRACKING_URI - and MLFLOW_MODEL_URI to be set. + (cf. cadrage §3.3-B, note de conception). Requires CODIF_APE_API_USERNAME + and CODIF_APE_API_PASSWORD to be set (CODIF_APE_API_URL is optional). Args: query: A single query string or a list of query strings diff --git a/src/navigator/navigator.py b/src/navigator/navigator.py index 4f9e705..1a8f81e 100644 --- a/src/navigator/navigator.py +++ b/src/navigator/navigator.py @@ -15,15 +15,19 @@ def make_tools(navigator): @function_tool def get_current_information() -> Dict[str, Any]: """ - Retourne les informations du noeud actuel. - Fournis les codes et les noms des noeuds enfants. - Pour avoir l'information détaillée sur un enfant, utilise get_code_information(code) - + Retourne les informations du noeud actuel, y compris les codes et noms de ses + enfants directs. Rappeler cet outil sans avoir changé de position renvoie + exactement le même résultat. Si un enfant correspond déjà à l'activité à + classifier, appelez go_to_child(child_code) directement plutôt que de + ré-appeler cet outil. + Returns: Informations complètes du noeud courant avec historique de navigation """ - logger.info(f"Navigator: get_current_information called at the position: {navigator.current_code}") - + logger.info( + f"Navigator: get_current_information called at the position: {navigator.current_code}" + ) + # Cas spécial pour root if navigator.current_code == "root": result = { @@ -36,7 +40,7 @@ def get_current_information() -> Dict[str, Any]: } logger.info(f"get_current_information (root): Data sent to the llm: {result}") return result - + # Cas normal (pas root) data = _unfreeze_dict(navigator._cached_get_code_information(navigator.current_code)) if not data: @@ -44,12 +48,12 @@ def get_current_information() -> Dict[str, Any]: return { "success": False, "error": f"Code {navigator.current_code} not found", - "current_position": navigator.current_code + "current_position": navigator.current_code, } - + result = { - "success": True, - **data, + "success": True, + **data, "current_position": navigator.current_code, } logger.info(f"get_current_information: Data sent to the llm: {result}") @@ -58,7 +62,11 @@ def get_current_information() -> Dict[str, Any]: @function_tool def get_code_information(code: str) -> Dict[str, Any]: """ - Retourne les informations d'un code spécifique sans changer la position. + Retourne les informations détaillées d'un code spécifique, sans changer la + position. À utiliser en cas d'hésitation entre plusieurs enfants candidats — + ce n'est pas une étape obligatoire : si un enfant correspond déjà clairement + à l'activité d'après get_current_children, appelez directement + go_to_child(child_code) sans consulter cet outil au préalable. Args: code: Code NACE à consulter @@ -92,24 +100,26 @@ def get_code_information(code: str) -> Dict[str, Any]: logger.info(f"get_code_information with code {code}: Data sent to the llm: {filtered_data}") return filtered_data - @function_tool def get_current_children() -> List[Dict[str, Any]]: """ - Retourne les codes et les noms des enfants directs du noeud actuel. - Pour avoir l'information détaillée sur un enfant, utilise get_code_information(code) + Retourne les codes, noms et is_final des enfants directs du noeud actuel. + Dès qu'un enfant correspond à l'activité à classifier, appelez immédiatement + go_to_child(child_code) pour vous y déplacer — ne rappelez pas cet outil sans + avoir changé de position, son résultat sera identique. Returns: Liste des codes enfants du noeud courant, contient le code et son nom """ - logger.info(f"Navigator: get_current_children called at the position {navigator.current_code}") - children_found = _unfreeze_list_of_dicts(navigator._cached_get_children(navigator.current_code)) + logger.info( + f"Navigator: get_current_children called at the position {navigator.current_code}" + ) + children_found = _unfreeze_list_of_dicts( + navigator._cached_get_children(navigator.current_code) + ) keys_to_keep = ["code", "name", "is_final"] - filtered_children_found = [ - {k: d[k] for k in keys_to_keep} - for d in children_found - ] + filtered_children_found = [{k: d[k] for k in keys_to_keep} for d in children_found] logger.info(f"get_current_children: Data sent to the llm {filtered_children_found}") return filtered_children_found @@ -169,7 +179,7 @@ def navigate_to(code: str) -> Dict[str, Any]: navigator.current_code = code navigator.history.append(code) logger.info(f"Navigated to: {code}") - + result = { "success": True, "node": info, @@ -200,11 +210,11 @@ def go_to_parent() -> Dict[str, Any]: navigator.current_code = parent_code navigator.history.append(parent_code) logger.info(f"Move up to: {parent_code}") - + parent_info_filtered = { - 'code': parent_info['code'], - 'level': parent_info['level'], - 'name': parent_info['name'], + "code": parent_info["code"], + "level": parent_info["level"], + "name": parent_info["name"], } result = { @@ -215,11 +225,14 @@ def go_to_parent() -> Dict[str, Any]: logger.info(f"go_to_parent: data sent to the llm: {result}") return result - + @function_tool def go_to_child(child_code: str) -> Dict[str, Any]: """ - Descend vers un enfant spécifique du noeud actuel. + Descend vers un enfant spécifique du noeud actuel. C'est l'action à utiliser + dès qu'un enfant pertinent a été identifié via get_current_children ou + get_current_information — appelez-la directement, sans consultation + systématique de get_code_information au préalable. Args: child_code: Code de l'enfant vers lequel naviguer @@ -245,13 +258,15 @@ def go_to_child(child_code: str) -> Dict[str, Any]: new_node_information = { "code": target_info["code"], "level": target_info["level"], - "is_final": target_info['is_final'], - "name": target_info["name"], - } + "is_final": target_info["is_final"], + "name": target_info["name"], + } navigator.current_code = child_code navigator.history.append(child_code) logger.info(f"Move down to: {child_code}") - logger.info(f"Navigator.current_code is {navigator.current_code} and navigator.history is {navigator.history}") + logger.info( + f"Navigator.current_code is {navigator.current_code} and navigator.history is {navigator.history}" + ) result = { "success": True, @@ -293,6 +308,7 @@ def reset_to_root() -> Dict[str, Any]: go_to_child, ] + class Navigator(Graph): """ Classe de navigation dans la hiérarchie NACE avec état persistant. @@ -316,4 +332,4 @@ def get_tools(self): def reset_to_root(self): self.current_code = "root" self.history = ["root"] - logger.info("Navigator: Reset to root") \ No newline at end of file + logger.info("Navigator: Reset to root") diff --git a/src/utils/parser.py b/src/utils/parser.py index 83893e8..28c1987 100644 --- a/src/utils/parser.py +++ b/src/utils/parser.py @@ -22,7 +22,10 @@ def parse_args() -> argparse.Namespace: const="Boulangerie", default=None, metavar="QUERY", - help="Classify with embedding retrieval + CodeChooser agent. Default query: 'Boulangerie'", + help=( + "Classify with embedding retrieval as a Navigator warm-start. " + "Default query: 'Boulangerie'" + ), ) methods.add_argument( "--supervised", From 99fe2ac305373ea5b50dacab0837c8397dc86852 Mon Sep 17 00:00:00 2001 From: theof Date: Wed, 8 Jul 2026 16:49:01 +0000 Subject: [PATCH 13/18] fix: replace free-running Navigator agent loop with a Python-owned step loop A single model-driven Runner.run loop can't reliably both use tools and know when to stop: the SDK only resets tool_choice on "any tool used", with no concept of the domain stop condition (is_final=1). Testing showed every configuration of that single loop failing (0/8 on an 8-query benchmark): free tool_choice skips tools and guesses, forcing it for turn 1 only produces a wrong non-final answer, and forcing it permanently navigates correctly but can never emit the final structured answer (MaxTurnsExceeded every time). BaseClassifier now drives two Agent variants (via Agent.clone()) itself: an exploration agent (tools forced, no output_type) and a finalize agent (tool_choice="none", tools kept declared to avoid a chat-template hang), switching between them based on Navigator.is_current_final() - ground truth read from the graph, never the model's self-reported completion - checked only right after an actual move so a wrong RAG-seeded position can't be "verified" and returned unchanged. Also includes a repeat-call breaker for the occasional exact-repeat loop seen under greedy decoding, and go_to_child/ go_to_parent now return the destination's children directly (fewer turns). Verified 8/8 on both --navigator and --agentic-rag across a diverse query set, --verify chaining, and no change to CodeChooser/MatchVerifier/ SupervisedClassifier behavior. --- .../Text2Code/classifiers/agentic_rag.py | 12 +- .../Text2Code/classifiers/base_classifier.py | 103 ++++++++++++++++++ .../classifiers/navigator_classifier.py | 9 +- src/agents/base_agent.py | 1 - src/navigator/navigator.py | 40 +++++-- 5 files changed, 137 insertions(+), 28 deletions(-) diff --git a/src/agents/Text2Code/classifiers/agentic_rag.py b/src/agents/Text2Code/classifiers/agentic_rag.py index 2d3dd45..16c92ee 100644 --- a/src/agents/Text2Code/classifiers/agentic_rag.py +++ b/src/agents/Text2Code/classifiers/agentic_rag.py @@ -29,7 +29,7 @@ async def __call__(self, activity: str) -> MatchVerificationInput: self.graph.current_code = start_code self.graph.history = [start_code] - return await super().__call__(activity, start_code) + return await self._run_navigator_loop(self.build_prompt(activity, start_code)) def get_agent_name(self) -> str: return "Agentic RAG Classifier" @@ -45,17 +45,7 @@ def get_instructions(self) -> str: Si le point de départ semble incorrect, naviguez vers une meilleure position (remontez au parent, explorez les frères ou les enfants) plutôt que de le valider tel quel. - - Après avoir vérifié que votre position finale est bien terminale (is_final = 1), - renvoyez le code choisi, une explication concise et votre niveau de confiance. Commencez par get_current_information() pour examiner le point de départ proposé. - - RÈGLE STRICTE : il est interdit de répondre avec un code dont is_final = 0, ou - avec le point de départ suggéré si vous avez constaté qu'il ne correspond pas à - l'activité. Si votre position actuelle n'est pas satisfaisante, vous DEVEZ appeler - un autre outil (get_current_children, go_to_child, go_to_parent...) avant de - conclure — ne vous arrêtez jamais après un seul appel d'outil si is_final n'est - pas à 1 ou si le code ne correspond pas à l'activité décrite. """ async def get_starting_code(self, activity: str) -> str: diff --git a/src/agents/Text2Code/classifiers/base_classifier.py b/src/agents/Text2Code/classifiers/base_classifier.py index 4346ea8..0d799e9 100644 --- a/src/agents/Text2Code/classifiers/base_classifier.py +++ b/src/agents/Text2Code/classifiers/base_classifier.py @@ -1,11 +1,114 @@ +import logging +import os + +from agents import Runner from agents.model_settings import ModelSettings from src.agents.base_agent import BaseAgent from src.agents.closers.match_verifier import MatchVerificationInput +logger = logging.getLogger(__name__) + +_MOVEMENT_TOOLS = {"go_to_child", "go_to_parent"} + + +def _last_tool_call(result): + """(name, arguments) of the last tool call in a Runner.run result, or None.""" + for item in reversed(result.new_items): + if item.type == "tool_call_item": + name = getattr(item.raw_item, "name", None) + arguments = getattr(item.raw_item, "arguments", None) + if name is not None: + return (name, arguments) + return None + class BaseClassifier(BaseAgent): + """Classifiers that drive a Navigator through a Python-owned step loop instead of + one free-running agentic Runner.run call. + + A single model-controlled loop can't reliably both use tools and know when to + stop: the SDK only resets tool_choice on "any tool used", with no concept of the + domain stop condition (is_final=1). So exploration and finalization are split into + two Agent variants (see __init__) and Python decides when to switch between them, + using Navigator.is_current_final() as the ground truth instead of the model's + self-reported completion. + """ + def get_output_type(self): return MatchVerificationInput def get_model_settings(self) -> ModelSettings: return ModelSettings(temperature=0, tool_choice="required") + + def get_finalize_instructions(self) -> str: + return """ + Vous avez terminé l'exploration de la hiérarchie NACE ci-dessus. Sur la base des + informations recueillies, renvoyez votre réponse finale : le code retenu (qui doit + être une position terminale, is_final = 1), une explication concise de votre choix, + et votre niveau de confiance entre 0 et 1. + """ + + def __init__(self, graph): + super().__init__(graph) + # Exploration: tools forced, no output_type — nothing to finalize yet, so no + # response_format competes with tool selection. Stops as soon as one tool call + # executes (no need for the model to react to the tool result itself — Python + # drives the next step). + self.exploration_agent = self.agent.clone( + output_type=None, + tool_use_behavior="stop_on_first_tool", + ) + # Finalize: tool_choice="none" rather than dropping `tools` — the conversation + # history carries prior tool_calls/tool messages, and clearing `tools` while + # those references remain hangs the backend's chat-template rendering instead + # of erroring. Keeping tools declared (but disallowed) avoids that. + self.finalize_agent = self.agent.clone( + instructions=self.get_finalize_instructions(), + model_settings=ModelSettings(temperature=0, tool_choice="none"), + ) + + async def _run_navigator_loop(self, initial_prompt: str) -> MatchVerificationInput: + conversation = initial_prompt + last_call = None + max_turns = int(os.environ["MAX_TURNS"]) + + for step in range(max_turns): + result = await Runner.run(self.exploration_agent, conversation, max_turns=1) + conversation = result.to_input_list() + call = _last_tool_call(result) + + if call is not None and call == last_call: + logger.info(f"Navigator loop: repeated call {call} at step {step}, retrying") + conversation = conversation + [ + { + "role": "user", + "content": ( + "Vous venez de refaire exactement le même appel qu'à l'étape " + "précédente, sans faire progresser la navigation. Choisissez une " + "action différente : si un enfant correspond à l'activité, appelez " + "go_to_child avec son code exact." + ), + } + ] + retry_agent = self.exploration_agent.clone( + model_settings=ModelSettings(temperature=0.4, tool_choice="required") + ) + result = await Runner.run(retry_agent, conversation, max_turns=1) + conversation = result.to_input_list() + call = _last_tool_call(result) + + last_call = call + + # Only stop right after an actual move: a read-only lookup (e.g. checking + # the RAG-suggested starting leaf) must never end the loop on its own, even + # if that position happens to already be is_final=1 — otherwise the model + # can "verify" a wrong RAG seed, say so, and still return it unchanged. + moved = call is not None and call[0] in _MOVEMENT_TOOLS + if moved and self.graph.is_current_final(): + break + else: + logger.warning("Navigator loop: step budget exhausted before reaching is_final") + + result = await Runner.run(self.finalize_agent, conversation, max_turns=1) + logger.info(f"Result of the navigator loop: \n {result.final_output}") + return result.final_output diff --git a/src/agents/Text2Code/classifiers/navigator_classifier.py b/src/agents/Text2Code/classifiers/navigator_classifier.py index 696c72a..ce51612 100644 --- a/src/agents/Text2Code/classifiers/navigator_classifier.py +++ b/src/agents/Text2Code/classifiers/navigator_classifier.py @@ -5,6 +5,9 @@ class NavigatorAgenticClassifier(BaseClassifier): def __init__(self, navigator): super().__init__(navigator) + async def __call__(self, query: str): + return await self._run_navigator_loop(self.build_prompt(query)) + def get_agent_name(self) -> str: return "Navigator Agentic Classifier" @@ -21,8 +24,6 @@ def get_instructions(self) -> str: return """ Vous êtes un expert en classification NACE. Votre mission est de naviguer dans l'arborescence afin d'atteindre le code le plus spécifique caractérisant l'activité indiquée. - Après avoir vérifié que votre position actuelle est bien finale (is_final = 1), - vous renverrez votre position. - Si vous n'avez pas réussi à atteindre une position finale, dites-le. - Soyez méthodique et justifiez chaque choix ! Commence par get_current_children() pour voir les options disponibles. + Soyez méthodique et justifiez chaque choix ! Commencez par get_current_children() pour voir les + options disponibles. """ diff --git a/src/agents/base_agent.py b/src/agents/base_agent.py index adc7d50..67a959d 100644 --- a/src/agents/base_agent.py +++ b/src/agents/base_agent.py @@ -44,7 +44,6 @@ def __init__(self, graph: Graph): model=os.environ["GENERATION_MODEL"], model_settings=self.get_model_settings(), output_type=self.output_type, - reset_tool_choice=False, ) @abstractmethod diff --git a/src/navigator/navigator.py b/src/navigator/navigator.py index 1a8f81e..af97bfa 100644 --- a/src/navigator/navigator.py +++ b/src/navigator/navigator.py @@ -8,6 +8,11 @@ def make_tools(navigator): + def _children_summary(code: str) -> List[Dict[str, Any]]: + children_found = _unfreeze_list_of_dicts(navigator._cached_get_children(code)) + keys_to_keep = ["code", "name", "is_final"] + return [{k: d[k] for k in keys_to_keep} for d in children_found] + # ------------------------------------------------------------------ # Information methods # ------------------------------------------------------------------ @@ -115,11 +120,7 @@ def get_current_children() -> List[Dict[str, Any]]: logger.info( f"Navigator: get_current_children called at the position {navigator.current_code}" ) - children_found = _unfreeze_list_of_dicts( - navigator._cached_get_children(navigator.current_code) - ) - keys_to_keep = ["code", "name", "is_final"] - filtered_children_found = [{k: d[k] for k in keys_to_keep} for d in children_found] + filtered_children_found = _children_summary(navigator.current_code) logger.info(f"get_current_children: Data sent to the llm {filtered_children_found}") return filtered_children_found @@ -191,10 +192,12 @@ def navigate_to(code: str) -> Dict[str, Any]: @function_tool def go_to_parent() -> Dict[str, Any]: """ - Remonte au parent du noeud actuel. + Remonte au parent du noeud actuel et retourne directement ses enfants + (les frères du noeud de départ) — inutile d'appeler get_current_children + juste après. Returns: - Résultat de la navigation avec informations du parent + Résultat de la navigation avec informations du parent et ses enfants """ logger.info("Navigator: go_to_parent called") parent_info = _unfreeze_dict(navigator._cached_get_parent(navigator.current_code)) @@ -220,6 +223,7 @@ def go_to_parent() -> Dict[str, Any]: result = { "success": True, "parent": parent_info_filtered, + "children": _children_summary(parent_code), "current_position": navigator.current_code, } @@ -229,16 +233,19 @@ def go_to_parent() -> Dict[str, Any]: @function_tool def go_to_child(child_code: str) -> Dict[str, Any]: """ - Descend vers un enfant spécifique du noeud actuel. C'est l'action à utiliser - dès qu'un enfant pertinent a été identifié via get_current_children ou - get_current_information — appelez-la directement, sans consultation - systématique de get_code_information au préalable. + Descend vers un enfant spécifique du noeud actuel et retourne directement les + enfants de cette nouvelle position — inutile d'appeler get_current_children + juste après. C'est l'action à utiliser dès qu'un enfant pertinent a été + identifié via get_current_children ou get_current_information — appelez-la + directement, sans consultation systématique de get_code_information au + préalable. Si le noeud atteint a is_final = 1 (ou une liste d'enfants vide), + c'est une position terminale : arrêtez la navigation et concluez. Args: child_code: Code de l'enfant vers lequel naviguer Returns: - Résultat de la navigation avec validation + Résultat de la navigation avec validation et les enfants du nouveau noeud """ logger.info(f"Navigator: go_to_child called with child_code: {child_code}") @@ -271,6 +278,7 @@ def go_to_child(child_code: str) -> Dict[str, Any]: result = { "success": True, "node": new_node_information, + "children": _children_summary(child_code), "current_position": navigator.current_code, } logger.info(f"go_to_child: Data sent to the llm: {result}") @@ -333,3 +341,11 @@ def reset_to_root(self): self.current_code = "root" self.history = ["root"] logger.info("Navigator: Reset to root") + + def is_current_final(self) -> bool: + """Ground-truth check on the current position, read straight from the graph + (never from the model's self-reported completion).""" + if self.current_code == "root": + return False + data = _unfreeze_dict(self._cached_get_code_information(self.current_code)) + return bool(data.get("is_final")) if data else False From a54f7d7af0ea71c2fe7be31032132468eca2fcb6 Mon Sep 17 00:00:00 2001 From: theof Date: Wed, 8 Jul 2026 18:07:51 +0000 Subject: [PATCH 14/18] fix: fall back to last graph position when classifier finalization fails A single Runner.run cannot both use tools reliably and know when to stop, so BaseClassifier now drives an explicit two-phase step loop (explore then finalize). When the finalize call itself errors, return a MatchVerificationInput at the last graph position reached (confidence 0.0) via _fallback_output instead of letting the exception propagate and losing the row entirely. Co-Authored-By: Claude Sonnet 5 --- docs/framework.md | 11 +++---- .../Text2Code/classifiers/agentic_rag.py | 2 +- .../Text2Code/classifiers/base_classifier.py | 29 ++++++++++++++++--- .../classifiers/navigator_classifier.py | 2 +- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/docs/framework.md b/docs/framework.md index 29519d3..4734f89 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -52,7 +52,7 @@ Classe abstraite dont héritent tous les agents. Elle encapsule : - la connexion à un client LLM compatible OpenAI (`OPENAI_BASE_URL` / `OPENAI_API_KEY`), avec tracing désactivé au niveau du SDK `agents` (le traçage applicatif passe par Langfuse, voir §5) ; - le modèle utilisé pour la génération (`GENERATION_MODEL`), avec une température fixée à 0 par défaut (`get_model_settings`) ; - un contrat commun : chaque sous-classe doit définir un nom d'agent (`get_agent_name`), des instructions système (`get_instructions`), un type de sortie structuré (`get_output_type`, un modèle Pydantic) et une méthode de construction du prompt (`build_prompt`) ; -- l'exécution (`__call__`) via `Runner.run` du SDK `agents`, avec un nombre maximal de tours (`MAX_TURNS`). +- l'exécution (`__call__`) via `Runner.run` du SDK `agents`, avec un nombre maximal de tours (`MAX_TURNS`). Cette description vaut pour `CodeChooser`/`MatchVerifier`/`SupervisedClassifier` ; `BaseClassifier` (§3.4) remplace cette boucle par sa propre boucle pas-à-pas. Chaque agent = **un prompt + un jeu d'outils + un contrat de sortie typé**. C'est cette homogénéité qui permet de composer des agents entre eux sans coder de logique de parsing ad hoc. @@ -70,17 +70,18 @@ Le *Navigator* hérite de `Graph` et ajoute un **état de position courante** da - `get_current_information` / `get_code_information(code)` — information sur la position courante ou sur un code arbitraire (sans déplacement) ; - `get_current_children` / `get_current_siblings` / `get_current_parent` — exploration locale relative à la position courante ; -- `navigate_to(code)` / `go_to_child(child_code)` / `go_to_parent()` — déplacement dans la hiérarchie, avec validation (un `go_to_child` vers un code qui n'est pas un enfant direct échoue explicitement) ; -- `reset_to_root()` — réinitialisation avant une nouvelle requête. +- `navigate_to(code)` / `go_to_child(child_code)` / `go_to_parent()` — déplacement dans la hiérarchie, avec validation (un `go_to_child` vers un code qui n'est pas un enfant direct échoue explicitement) ; `go_to_child`/`go_to_parent` renvoient directement les enfants de la nouvelle position, pour fusionner « se déplacer » et « voir les options » en un seul appel ; +- `reset_to_root()` — réinitialisation avant une nouvelle requête ; +- `is_current_final()` — vérité terrain lue directement sur le graphe (jamais déduite d'une auto-évaluation du LLM), utilisée par `BaseClassifier` (§3.4) pour savoir quand arrêter l'exploration. Chaque appel d'outil est journalisé (position avant/après, données renvoyées au LLM), ce qui fournit une trace complète et rejouable du raisonnement de l'agent. ### 3.4 Classifieurs (`src/agents/Text2Code/`) -- `BaseClassifier` — spécialise `BaseAgent` en fixant le type de sortie à `MatchVerificationInput` (activité, code proposé, explication, confiance), le format commun attendu par les agents « closers ». +- `BaseClassifier` — spécialise `BaseAgent` en fixant le type de sortie à `MatchVerificationInput` (activité, code proposé, explication, confiance), le format commun attendu par les agents « closers ». Remplace la boucle unique de `BaseAgent` par une boucle pas-à-pas pilotée en Python (`_run_navigator_loop`) : un seul `Runner.run` piloté par le LLM ne peut pas à la fois utiliser les outils de façon fiable et savoir quand s'arrêter (le SDK ne réinitialise `tool_choice` que sur « un outil a été utilisé », sans notion du critère métier `is_final`). La boucle alterne donc entre deux variantes d'`Agent` (`Agent.clone()`) : un agent d'exploration (outils forcés via `tool_choice="required"`, sans `output_type`) et un agent de finalisation (`tool_choice="none"`, outils gardés déclarés pour éviter un blocage du rendu du chat-template côté serveur, `output_type=MatchVerificationInput`). L'arrêt est décidé par `Navigator.is_current_final()` et seulement juste après un déplacement réel (jamais après une simple consultation), pour éviter qu'une position de départ RAG erronée soit « vérifiée » puis renvoyée telle quelle. - `NavigatorAgenticClassifier` — classifieur concret : instructions demandant au *Navigator* de descendre jusqu'à un code terminal (`is_final = 1`) en justifiant chaque choix, en démarrant systématiquement par `get_current_children()`. - `AgenticRAGClassifier` (`agentic_rag.py`) — approche hybride : récupération du code le plus proche par similarité d'embedding (`Graph.get_closest_codes`, recherche vectorielle Neo4j filtrée sur les codes finaux), utilisé comme point de départ (*warm start*) pour le *Navigator* plutôt que la racine. L'agent vérifie ce point de départ avec les outils du *Navigator* (informations du noeud, enfants, frères, parent) et navigue pour le corriger si besoin, avant de rendre un `MatchVerificationInput`. Branché dans la CLI via `--agentic-rag`. -- `SupervisedClassifier` (`supervised_classifier.py`) — **pas un agent LLM** : charge le modèle supervisé de production (*deep learning*, package `torchTextClassifiers`, cf. cadrage §1.1) via l'API MLflow pyfunc (`MLFLOW_TRACKING_URI` / `MLFLOW_MODEL_URI`) et l'expose avec le même contrat de sortie (`MatchVerificationInput`) que les deux classifieurs agentiques, pour servir de référence dans la comparaison chiffrée (cf. cadrage §3.3-B, note de conception). Branché dans la CLI via `--supervised`. **Non validé** : le format exact de sortie du modèle logué (nom des colonnes, présence d'un score de confiance) n'a pas pu être vérifié dans cet environnement — `_parse_prediction` gère plusieurs formats plausibles et journalise un avertissement s'il doit se rabattre sur une confiance par défaut de 1.0. +- `SupervisedClassifier` (`supervised_classifier.py`) — **pas un agent LLM** : appelle le modèle supervisé de production via l'API déployée `codif-ape-API` (authentification HTTP Basic, `CODIF_APE_API_USERNAME` / `CODIF_APE_API_PASSWORD` / `CODIF_APE_API_URL`), plutôt que chargé en local via MLflow, pour éviter d'ajouter torch/transformers/torchfasttext aux dépendances de ce dépôt. L'expose avec le même contrat de sortie (`MatchVerificationInput`) que les deux classifieurs agentiques, pour servir de référence dans la comparaison chiffrée (cf. cadrage §3.3-B, note de conception). Branché dans la CLI via `--supervised`. ### 3.5 Agents « closers » (`src/agents/closers/`) diff --git a/src/agents/Text2Code/classifiers/agentic_rag.py b/src/agents/Text2Code/classifiers/agentic_rag.py index 16c92ee..df907c6 100644 --- a/src/agents/Text2Code/classifiers/agentic_rag.py +++ b/src/agents/Text2Code/classifiers/agentic_rag.py @@ -29,7 +29,7 @@ async def __call__(self, activity: str) -> MatchVerificationInput: self.graph.current_code = start_code self.graph.history = [start_code] - return await self._run_navigator_loop(self.build_prompt(activity, start_code)) + return await self._run_navigator_loop(activity, self.build_prompt(activity, start_code)) def get_agent_name(self) -> str: return "Agentic RAG Classifier" diff --git a/src/agents/Text2Code/classifiers/base_classifier.py b/src/agents/Text2Code/classifiers/base_classifier.py index 0d799e9..cf057c2 100644 --- a/src/agents/Text2Code/classifiers/base_classifier.py +++ b/src/agents/Text2Code/classifiers/base_classifier.py @@ -67,7 +67,20 @@ def __init__(self, graph): model_settings=ModelSettings(temperature=0, tool_choice="none"), ) - async def _run_navigator_loop(self, initial_prompt: str) -> MatchVerificationInput: + def _fallback_output(self, activity: str) -> MatchVerificationInput: + return MatchVerificationInput( + activity=activity, + code=self.graph.current_code, + proposed_explanation=( + "Échec de la génération de la réponse finale par le modèle ; dernière " + f"position atteinte lors de l'exploration : {self.graph.current_code}." + ), + proposed_confidence=0.0, + ) + + async def _run_navigator_loop( + self, activity: str, initial_prompt: str + ) -> MatchVerificationInput: conversation = initial_prompt last_call = None max_turns = int(os.environ["MAX_TURNS"]) @@ -109,6 +122,14 @@ async def _run_navigator_loop(self, initial_prompt: str) -> MatchVerificationInp else: logger.warning("Navigator loop: step budget exhausted before reaching is_final") - result = await Runner.run(self.finalize_agent, conversation, max_turns=1) - logger.info(f"Result of the navigator loop: \n {result.final_output}") - return result.final_output + try: + result = await Runner.run(self.finalize_agent, conversation, max_turns=2) + final_output = result.final_output + except Exception: + logger.exception( + "Navigator loop: finalize call failed, falling back to current position" + ) + final_output = self._fallback_output(activity) + + logger.info(f"Result of the navigator loop: \n {final_output}") + return final_output diff --git a/src/agents/Text2Code/classifiers/navigator_classifier.py b/src/agents/Text2Code/classifiers/navigator_classifier.py index ce51612..521baf8 100644 --- a/src/agents/Text2Code/classifiers/navigator_classifier.py +++ b/src/agents/Text2Code/classifiers/navigator_classifier.py @@ -6,7 +6,7 @@ def __init__(self, navigator): super().__init__(navigator) async def __call__(self, query: str): - return await self._run_navigator_loop(self.build_prompt(query)) + return await self._run_navigator_loop(query, self.build_prompt(query)) def get_agent_name(self) -> str: return "Navigator Agentic Classifier" From 4c0b118638a708b9c6b17142bb6e3092d958eee0 Mon Sep 17 00:00:00 2001 From: theof Date: Wed, 8 Jul 2026 18:09:27 +0000 Subject: [PATCH 15/18] feat: add weighted accuracy, bootstrap CIs, and paired comparison to eval harness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes the statistical-rigor gap flagged in the cadrage doc (§3.3-B): the eval set's rare-code oversampling meant unweighted accuracy didn't represent real traffic, and there was no way to tell if a delta between two methods was significant. - build_eval_set.py stores ipw_weight (inverse-probability-of-selection) and eval_stratum per row. - metrics.py: accuracy_at_depth/evaluate take optional weights (emitting *_weighted keys alongside, never replacing the unweighted ones) and a new low_confidence_rate, distinguishing "agent gave up" (confidence 0 fallback) from a genuinely wrong answer. - bootstrap.py: stratum-aware cluster bootstrap for confidence intervals. - compare.py: paired bootstrap + McNemar's test to compare two methods run on the same eval set, since independent-CI-overlap is invalid for paired data. - run_eval.py wires weights/confidences into evaluate() and adds --bootstrap. Co-Authored-By: Claude Sonnet 5 --- docs/framework.md | 13 +- src/evaluation/bootstrap.py | 76 +++++++++++ src/evaluation/build_eval_set.py | 20 ++- src/evaluation/compare.py | 209 +++++++++++++++++++++++++++++++ src/evaluation/metrics.py | 88 +++++++++++-- src/evaluation/run_eval.py | 56 ++++++++- tests/test_bootstrap.py | 73 +++++++++++ tests/test_build_eval_set.py | 44 +++++++ tests/test_compare.py | 77 ++++++++++++ tests/test_metrics.py | 56 ++++++++- 10 files changed, 691 insertions(+), 21 deletions(-) create mode 100644 src/evaluation/bootstrap.py create mode 100644 src/evaluation/compare.py create mode 100644 tests/test_bootstrap.py create mode 100644 tests/test_build_eval_set.py create mode 100644 tests/test_compare.py diff --git a/docs/framework.md b/docs/framework.md index 4734f89..674cb38 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -121,16 +121,19 @@ uv run -m src.main --navigator --batch-file requetes.txt --experiment-name mon-e Socle du chantier prioritaire du mois (cf. cadrage §3.1–3.2), en trois briques : -- **`metrics.py`** — métriques pures Python (sans dépendance, testées unitairement dans `tests/`) : normalisation des codes (`"10.71C"` ≡ `"1071C"`), exactitude à la feuille, exactitude par niveau hiérarchique (préfixes : 2 = division, 3 = groupe, 4 = classe pour la NAF), taux d'échec (prédictions n'ayant pas atteint de code final, comptées comme erreurs). -- **`build_eval_set.py`** — construction du jeu d'évaluation stratifié : lecture du parquet labellisé (local ou S3/Datalab), stratification par préfixe de code (division par défaut), tirage plafonné par strate et reproductible (seed) — les strates plus petites que le plafond sont conservées en entier. -- **`run_eval.py`** — harnais de campagne : exécute une méthode (`navigator` ou `agentic-rag`) sur le jeu d'évaluation, écrit les prédictions détaillées (parquet) et le rapport de métriques (JSON). Nécessite Neo4j et l'API LLM à l'exécution. +- **`metrics.py`** — métriques pures Python (sans dépendance, testées unitairement dans `tests/`) : normalisation des codes (`"10.71C"` ≡ `"1071C"`), exactitude à la feuille, exactitude par niveau hiérarchique (préfixes : 2 = division, 3 = groupe, 4 = classe pour la NAF), taux d'échec (prédictions n'ayant pas atteint de code final, comptées comme erreurs), taux de faible confiance (`low_confidence_rate`, distinct du taux d'échec : un code peut être renvoyé avec une confiance nulle par le repli de finalisation `_fallback_output`). `accuracy_at_depth`/`evaluate` acceptent un paramètre `weights` optionnel pour une lecture pondérée en plus de la lecture non pondérée historique (jamais en remplacement, cf. ci-dessous). +- **`build_eval_set.py`** — construction du jeu d'évaluation stratifié : lecture du parquet labellisé (local ou S3/Datalab), stratification par préfixe de code (division par défaut), tirage plafonné par strate et reproductible (seed) — les strates plus petites que le plafond sont conservées en entier. Le sur-échantillonnage des strates rares casse la fréquence réelle des codes ; deux colonnes sont donc ajoutées au jeu produit : `eval_stratum` (clé de strate, réutilisée par le bootstrap stratifié) et `ipw_weight` (poids de repondération, population de la strate / lignes tirées) qui permet de reconstruire une exactitude représentative du trafic réel via `evaluate(..., weights=...)`. +- **`bootstrap.py`** — intervalle de confiance bootstrap (`bootstrap_ci`) pour une métrique, par rééchantillonnage en grappes **à l'intérieur de chaque strate** (jamais entre strates, pour respecter le plan d'échantillonnage de `build_eval_set.py`). +- **`compare.py`** — comparaison statistique appariée de deux campagnes exécutées sur le même jeu d'évaluation (mêmes lignes, même vérité terrain) : bootstrap apparié en grappes sur la différence d'exactitude, et test de McNemar en complément — répond au chantier « rigueur statistique » de la note de conception (cadrage §3.3-B) et évite l'erreur classique de comparer deux IC indépendants sur des données appariées. +- **`run_eval.py`** — harnais de campagne : exécute une méthode (`navigator`, `agentic-rag` ou `supervised`) sur le jeu d'évaluation, écrit les prédictions détaillées (parquet) et le rapport de métriques (JSON), avec exactitude pondérée automatique si `ipw_weight` est présent dans le jeu d'évaluation. Nécessite Neo4j et l'API LLM à l'exécution. ```bash uv run -m src.evaluation.build_eval_set --input --output data/eval/eval_set.parquet -uv run -m src.evaluation.run_eval --eval-set data/eval/eval_set.parquet --method navigator +uv run -m src.evaluation.run_eval --eval-set data/eval/eval_set.parquet --method navigator --bootstrap 1000 +uv run -m src.evaluation.compare --a data/eval/results/predictions_navigator.parquet --b data/eval/results/predictions_agentic-rag.parquet ``` -Le jeu d'évaluation est désormais construit (`data/eval/eval_set.parquet`, 5 181 lignes, stratifié par code complet — `apet2025`, ~10 exemples/code) ; `run_eval.py` propose trois méthodes : `navigator`, `agentic-rag`, `supervised`. +Le jeu d'évaluation est désormais construit (`data/eval/eval_set.parquet`, 5 181 lignes, stratifié par code complet — `apet2025`, ~10 exemples/code) ; `run_eval.py` propose trois méthodes : `navigator`, `agentic-rag`, `supervised`. **[à compléter]** : le jeu d'évaluation versionné a été construit avant l'ajout d'`ipw_weight`/`eval_stratum` — à reconstruire depuis la source (`df_test`) pour bénéficier de poids non triviaux (voir `stratified_sample`) et d'un bootstrap qui n'ait pas à se rabattre sur une strate unique. ### 5.1 Détection de dérive (`src/evaluation/drift.py`) diff --git a/src/evaluation/bootstrap.py b/src/evaluation/bootstrap.py new file mode 100644 index 0000000..b7d67ef --- /dev/null +++ b/src/evaluation/bootstrap.py @@ -0,0 +1,76 @@ +"""Intervalles de confiance bootstrap, respectant la stratification du jeu d'évaluation. + +cf. cadrage_2026-07.md §3.3-B : ne pas se limiter à un delta d'exactitude entre +méthodes sans intervalle de confiance, en particulier sur les strates à faible +effectif. Le jeu d'évaluation (`build_eval_set.stratified_sample`) est construit +par strate (tirage plafonné par code) : un bootstrap qui rééchantillonne les +lignes empilées sans distinction de strate ne représente pas ce plan +d'échantillonnage. `bootstrap_ci` rééchantillonne donc à l'intérieur de chaque +strate (bootstrap en grappes), jamais entre strates. +""" + +import numpy as np + + +def bootstrap_ci( + y_true: list, + y_pred: list, + strata: list, + metric_fn, + n_resamples: int = 1000, + alpha: float = 0.05, + seed: int = 42, + weights: list | None = None, +) -> tuple[float, tuple[float, float]]: + """Intervalle de confiance bootstrap pour une métrique, par rééchantillonnage en grappes. + + Args: + y_true: Codes de référence. + y_pred: Codes prédits, alignés avec `y_true`. + strata: Clé de strate par ligne (ex. colonne `eval_stratum` de l'eval + set) ; chaque rééchantillonnage tire, pour chaque strate, autant + de lignes que la strate en contient, avec remise, uniquement + parmi les lignes de cette même strate. + metric_fn: Fonction `(y_true, y_pred, weights) -> float` (ex. + `lambda t, p, w: accuracy_at_depth(t, p, weights=w)`). + n_resamples: Nombre de tirages bootstrap. + alpha: Taux de risque (défaut 5 %, IC à 95 %). + seed: Graine, pour un IC reproductible. + weights: Poids par ligne, propagés au rééchantillonnage (ex. + `ipw_weight`) ; None = poids uniformes. + + Returns: + `(estimation ponctuelle, (borne basse, borne haute))`, l'IC étant + calculé par la méthode des percentiles sur la distribution des + rééchantillonnages. + """ + n = len(y_true) + if n != len(y_pred) or n != len(strata): + raise ValueError("y_true, y_pred et strata doivent avoir la même taille") + if weights is not None and len(weights) != n: + raise ValueError("weights doit avoir la même taille que y_true") + + y_true_arr = np.asarray(y_true, dtype=object) + y_pred_arr = np.asarray(y_pred, dtype=object) + weights_arr = np.asarray(weights, dtype=float) if weights is not None else None + + strata_indices: dict = {} + for i, s in enumerate(strata): + strata_indices.setdefault(s, []).append(i) + strata_index_arrays = [np.array(idx) for idx in strata_indices.values()] + + point_estimate = metric_fn(list(y_true), list(y_pred), weights) + + rng = np.random.default_rng(seed) + resample_values = np.empty(n_resamples) + for r in range(n_resamples): + resampled_idx = np.concatenate( + [rng.choice(idx, size=len(idx), replace=True) for idx in strata_index_arrays] + ) + resampled_y_true = y_true_arr[resampled_idx].tolist() + resampled_y_pred = y_pred_arr[resampled_idx].tolist() + resampled_weights = weights_arr[resampled_idx].tolist() if weights_arr is not None else None + resample_values[r] = metric_fn(resampled_y_true, resampled_y_pred, resampled_weights) + + lo, hi = np.quantile(resample_values, [alpha / 2, 1 - alpha / 2]) + return float(point_estimate), (float(lo), float(hi)) diff --git a/src/evaluation/build_eval_set.py b/src/evaluation/build_eval_set.py index 0747512..d1f82aa 100644 --- a/src/evaluation/build_eval_set.py +++ b/src/evaluation/build_eval_set.py @@ -64,6 +64,16 @@ def stratified_sample( stratum_depth: Longueur du préfixe de code normalisé définissant la strate (2 = division NAF). seed: Graine du tirage, pour un jeu reproductible. + + Le sur-échantillonnage des strates rares casse la fréquence réelle des + codes : une exactitude moyennée sans pondération sur le jeu obtenu répond + à « quelle est la performance moyenne par code », pas « quelle serait la + performance sur le trafic réel ». `ipw_weight` (population de la strate / + lignes effectivement tirées) permet de reconstruire cette seconde lecture + a posteriori (cf. `metrics.evaluate(..., weights=...)`). `eval_stratum` + est conservée pour que le rééchantillonnage stratifié (bootstrap) n'ait + pas à redériver les strates depuis le code, avec un risque de dérive si + `stratum_depth` change. """ df = ( df.with_columns( @@ -78,10 +88,18 @@ def stratified_sample( n_strata = df["_stratum"].n_unique() logger.info(f"{n_strata} strata found at depth {stratum_depth}") + df = df.with_columns(pl.len().over("_stratum").alias("_population_count")) sampled = df.filter(pl.int_range(pl.len()).shuffle(seed=seed).over("_stratum") < n_per_stratum) + sampled = sampled.with_columns( + pl.len().over("_stratum").alias("_sampled_count"), + ).with_columns( + (pl.col("_population_count") / pl.col("_sampled_count")).alias("ipw_weight"), + ) logger.info(f"Sampled {len(sampled)} rows out of {len(df)}") - return sampled.drop(["_norm_code", "_stratum"]) + return sampled.rename({"_stratum": "eval_stratum"}).drop( + ["_norm_code", "_population_count", "_sampled_count"] + ) def main() -> int: diff --git a/src/evaluation/compare.py b/src/evaluation/compare.py new file mode 100644 index 0000000..f92746f --- /dev/null +++ b/src/evaluation/compare.py @@ -0,0 +1,209 @@ +"""Comparaison appariée de deux méthodes exécutées sur le même jeu d'évaluation. + +cf. cadrage_2026-07.md §3.3-B. Deux méthodes évaluées sur le même jeu (mêmes +lignes, même vérité terrain) forment un plan **apparié** : comparer deux +intervalles de confiance indépendants et vérifier s'ils se chevauchent est un +test conservateur et statistiquement inadapté ici (il ignore la corrélation +ligne à ligne entre les deux méthodes). On utilise donc : + +- un bootstrap apparié en grappes (par strate) sur la différence d'exactitude + (`accuracy_b - accuracy_a`) ; +- le test de McNemar sur les paires discordantes, en complément rapide et + sans rééchantillonnage, standard pour comparer deux classifieurs sur les + mêmes observations. + +Usage : + uv run -m src.evaluation.compare \ + --a data/eval/results/predictions_navigator.parquet \ + --b data/eval/results/predictions_agentic-rag.parquet +""" + +import argparse +import json + +import numpy as np +import polars as pl +from scipy.stats import binomtest + +from src.evaluation.metrics import accuracy_at_depth, normalize_code + + +def _is_correct(true_code, pred_code, depth: int | None = None) -> bool | None: + """True/False si comparable, None si la vérité terrain est manquante (paire ignorée).""" + true_norm = normalize_code(true_code) + pred_norm = normalize_code(pred_code) + if true_norm is None: + return None + if pred_norm is None: + return False + if depth is None: + return true_norm == pred_norm + return true_norm[:depth] == pred_norm[:depth] + + +def paired_bootstrap_diff( + y_true: list, + y_pred_a: list, + y_pred_b: list, + strata: list, + depth: int | None = None, + n_resamples: int = 1000, + alpha: float = 0.05, + seed: int = 42, +) -> tuple[float, tuple[float, float]]: + """IC bootstrap apparié (grappes par strate) sur `accuracy(b) - accuracy(a)`. + + Chaque rééchantillonnage tire les mêmes indices de lignes pour les deux + méthodes (le rééchantillonnage porte sur les lignes, pas sur les + prédictions séparément), ce qui préserve l'appariement. + """ + n = len(y_true) + if n != len(y_pred_a) or n != len(y_pred_b) or n != len(strata): + raise ValueError("y_true, y_pred_a, y_pred_b et strata doivent avoir la même taille") + + y_true_arr = np.asarray(y_true, dtype=object) + y_pred_a_arr = np.asarray(y_pred_a, dtype=object) + y_pred_b_arr = np.asarray(y_pred_b, dtype=object) + + strata_indices: dict = {} + for i, s in enumerate(strata): + strata_indices.setdefault(s, []).append(i) + strata_index_arrays = [np.array(idx) for idx in strata_indices.values()] + + def diff_for(idx: np.ndarray) -> float: + t = y_true_arr[idx].tolist() + acc_a = accuracy_at_depth(t, y_pred_a_arr[idx].tolist(), depth=depth) + acc_b = accuracy_at_depth(t, y_pred_b_arr[idx].tolist(), depth=depth) + return acc_b - acc_a + + point_diff = diff_for(np.arange(n)) + + rng = np.random.default_rng(seed) + diffs = np.empty(n_resamples) + for r in range(n_resamples): + resampled_idx = np.concatenate( + [rng.choice(idx, size=len(idx), replace=True) for idx in strata_index_arrays] + ) + diffs[r] = diff_for(resampled_idx) + + lo, hi = np.quantile(diffs, [alpha / 2, 1 - alpha / 2]) + return float(point_diff), (float(lo), float(hi)) + + +def mcnemar_test(y_true: list, y_pred_a: list, y_pred_b: list, depth: int | None = None) -> float: + """P-valeur du test de McNemar exact sur les paires discordantes entre deux méthodes. + + Une paire est discordante quand une méthode a raison et l'autre a tort sur + la même ligne ; les lignes sans vérité terrain exploitable sont ignorées. + """ + n_a_only = 0 # a correct, b incorrect + n_b_only = 0 # a incorrect, b correct + for true_code, pred_a, pred_b in zip(y_true, y_pred_a, y_pred_b): + correct_a = _is_correct(true_code, pred_a, depth=depth) + correct_b = _is_correct(true_code, pred_b, depth=depth) + if correct_a is None or correct_b is None: + continue + if correct_a and not correct_b: + n_a_only += 1 + elif correct_b and not correct_a: + n_b_only += 1 + + discordant = n_a_only + n_b_only + if discordant == 0: + return 1.0 + return float(binomtest(min(n_a_only, n_b_only), discordant, p=0.5).pvalue) + + +def compare( + df_a: pl.DataFrame, + df_b: pl.DataFrame, + code_column: str = "apet2025", + prediction_column: str = "prediction", + stratum_column: str = "eval_stratum", + depth: int | None = None, + n_resamples: int = 1000, + alpha: float = 0.05, + seed: int = 42, +) -> dict: + """Compare deux campagnes exécutées sur le même jeu d'évaluation (même ordre de lignes).""" + if len(df_a) != len(df_b): + raise ValueError("Les deux jeux de prédictions doivent avoir le même nombre de lignes") + + y_true = df_a[code_column].to_list() + if y_true != df_b[code_column].to_list(): + raise ValueError( + "Les vérités terrain diffèrent entre les deux fichiers : lignes non alignées" + ) + + y_pred_a = df_a[prediction_column].to_list() + y_pred_b = df_b[prediction_column].to_list() + strata = ( + df_a[stratum_column].to_list() if stratum_column in df_a.columns else list(range(len(df_a))) + ) + + accuracy_a = accuracy_at_depth(y_true, y_pred_a, depth=depth) + accuracy_b = accuracy_at_depth(y_true, y_pred_b, depth=depth) + diff_point, diff_ci = paired_bootstrap_diff( + y_true, + y_pred_a, + y_pred_b, + strata, + depth=depth, + n_resamples=n_resamples, + alpha=alpha, + seed=seed, + ) + p_value = mcnemar_test(y_true, y_pred_a, y_pred_b, depth=depth) + + return { + "n": len(y_true), + "accuracy_a": accuracy_a, + "accuracy_b": accuracy_b, + "diff": diff_point, + "diff_ci": list(diff_ci), + "mcnemar_p_value": p_value, + "significant": p_value < alpha, + } + + +def main() -> int: + parser = argparse.ArgumentParser( + description="Paired statistical comparison of two evaluation campaigns" + ) + parser.add_argument("--a", required=True, help="predictions_.parquet for method A") + parser.add_argument("--b", required=True, help="predictions_.parquet for method B") + parser.add_argument("--code-column", default="apet2025") + parser.add_argument("--prediction-column", default="prediction") + parser.add_argument("--stratum-column", default="eval_stratum") + parser.add_argument( + "--depth", type=int, default=None, help="Prefix depth to compare (default: leaf)" + ) + parser.add_argument("--n-resamples", type=int, default=1000) + parser.add_argument("--alpha", type=float, default=0.05) + parser.add_argument("--seed", type=int, default=42) + parser.add_argument("--output", default=None, help="Optional path to write the JSON report") + args = parser.parse_args() + + df_a = pl.read_parquet(args.a) + df_b = pl.read_parquet(args.b) + report = compare( + df_a, + df_b, + code_column=args.code_column, + prediction_column=args.prediction_column, + stratum_column=args.stratum_column, + depth=args.depth, + n_resamples=args.n_resamples, + alpha=args.alpha, + seed=args.seed, + ) + + print(json.dumps(report, indent=2, ensure_ascii=False)) + if args.output: + with open(args.output, "w", encoding="utf-8") as f: + json.dump(report, f, indent=2, ensure_ascii=False) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/evaluation/metrics.py b/src/evaluation/metrics.py index 25debcc..4d17427 100644 --- a/src/evaluation/metrics.py +++ b/src/evaluation/metrics.py @@ -23,7 +23,9 @@ def normalize_code(code) -> str | None: return normalized or None -def accuracy_at_depth(y_true: list, y_pred: list, depth: int | None = None) -> float: +def accuracy_at_depth( + y_true: list, y_pred: list, depth: int | None = None, weights: list | None = None +) -> float: """Part des prédictions égales à la vérité terrain sur les `depth` premiers caractères. Args: @@ -31,28 +33,40 @@ def accuracy_at_depth(y_true: list, y_pred: list, depth: int | None = None) -> f y_pred: Codes prédits (None = échec du classifieur, compté comme erreur). depth: Profondeur de comparaison ; None compare les codes complets (exactitude à la feuille). + weights: Poids par ligne (ex. correction de sur-échantillonnage des + strates rares, cf. `build_eval_set.ipw_weight`). None = poids + uniformes (comportement historique : exactitude moyenne par + ligne du jeu d'évaluation, pas par la fréquence réelle des codes). Returns: Exactitude entre 0 et 1 ; NaN si aucune paire exploitable. Les paires dont la vérité terrain est manquante sont ignorées. """ if len(y_true) != len(y_pred): - raise ValueError(f"y_true ({len(y_true)}) et y_pred ({len(y_pred)}) doivent avoir la même taille") - - correct = 0 - total = 0 - for true_code, pred_code in zip(y_true, y_pred): + raise ValueError( + f"y_true ({len(y_true)}) et y_pred ({len(y_pred)}) doivent avoir la même taille" + ) + if weights is not None and len(weights) != len(y_true): + raise ValueError( + f"weights ({len(weights)}) et y_true ({len(y_true)}) doivent avoir la même taille" + ) + + correct = 0.0 + total = 0.0 + for i, (true_code, pred_code) in enumerate(zip(y_true, y_pred)): true_norm = normalize_code(true_code) pred_norm = normalize_code(pred_code) if true_norm is None: continue - total += 1 + weight = weights[i] if weights is not None else 1.0 + total += weight if pred_norm is None: continue if depth is None: - correct += true_norm == pred_norm + is_correct = true_norm == pred_norm else: - correct += true_norm[:depth] == pred_norm[:depth] + is_correct = true_norm[:depth] == pred_norm[:depth] + correct += weight if is_correct else 0.0 return correct / total if total else float("nan") @@ -64,7 +78,39 @@ def failure_rate(y_pred: list) -> float: return sum(1 for pred in y_pred if normalize_code(pred) is None) / len(y_pred) -def evaluate(y_true: list, y_pred: list, depths: tuple = (2, 3, 4)) -> dict: +def low_confidence_rate(confidences: list, threshold: float = 0.0) -> float: + """Part des prédictions à confiance faible ou nulle. + + Distinct de `failure_rate` : un classifieur peut renvoyer un code réel + (pas None) avec une confiance nulle quand la finalisation a échoué et + qu'un repli sur la dernière position atteinte a été utilisé (cf. + `_fallback_output`). Ces cas ne sont pas des échecs au sens de + `failure_rate` (il y a bien un code) mais ne doivent pas être confondus + avec une prédiction confiante lors de l'analyse d'erreurs. + + Args: + confidences: Scores de confiance par prédiction (None = non renseigné, + ignoré du calcul). + threshold: Seuil (inclusif) en dessous duquel une confiance est + considérée comme faible (défaut : 0.0, le sentinel de repli). + + Returns: + Part des prédictions dont la confiance est renseignée et <= threshold, + rapportée à l'ensemble des prédictions (confiances manquantes comptées + au dénominateur, jamais au numérateur) ; NaN si la liste est vide. + """ + if not confidences: + return float("nan") + return sum(1 for c in confidences if c is not None and c <= threshold) / len(confidences) + + +def evaluate( + y_true: list, + y_pred: list, + depths: tuple = (2, 3, 4), + weights: list | None = None, + confidences: list | None = None, +) -> dict: """Rapport d'évaluation complet d'un classifieur. Args: @@ -72,9 +118,18 @@ def evaluate(y_true: list, y_pred: list, depths: tuple = (2, 3, 4)) -> dict: y_pred: Codes prédits (None = échec). depths: Profondeurs de préfixe pour l'exactitude par niveau (par défaut : division, groupe, classe pour la NAF). + weights: Poids par ligne pour une lecture pondérée (représentative de + la fréquence réelle des codes) en complément de la lecture non + pondérée (moyenne égale par code) — les deux sont toujours + calculées quand `weights` est fourni, aucune n'écrase l'autre. + confidences: Scores de confiance par prédiction, pour reporter + `low_confidence_rate` en plus de `failure_rate` (optionnel). Returns: - Dictionnaire {n, leaf_accuracy, failure_rate, accuracy_depth_...}. + Dictionnaire {n, leaf_accuracy, failure_rate, accuracy_depth_...}, + avec en plus {leaf_accuracy_weighted, accuracy_depth__weighted...} + si `weights` est fourni, et {low_confidence_rate} si `confidences` + est fourni. """ report = { "n": len(y_true), @@ -83,4 +138,15 @@ def evaluate(y_true: list, y_pred: list, depths: tuple = (2, 3, 4)) -> dict: } for depth in depths: report[f"accuracy_depth_{depth}"] = accuracy_at_depth(y_true, y_pred, depth=depth) + + if weights is not None: + report["leaf_accuracy_weighted"] = accuracy_at_depth(y_true, y_pred, weights=weights) + for depth in depths: + report[f"accuracy_depth_{depth}_weighted"] = accuracy_at_depth( + y_true, y_pred, depth=depth, weights=weights + ) + + if confidences is not None: + report["low_confidence_rate"] = low_confidence_rate(confidences) + return report diff --git a/src/evaluation/run_eval.py b/src/evaluation/run_eval.py index aa2d113..57cdf2e 100644 --- a/src/evaluation/run_eval.py +++ b/src/evaluation/run_eval.py @@ -22,8 +22,9 @@ import polars as pl +from src.evaluation.bootstrap import bootstrap_ci from src.evaluation.config import PATH_EVAL_OUTPUT -from src.evaluation.metrics import evaluate +from src.evaluation.metrics import accuracy_at_depth, evaluate from src.main import classify_agentic_rag, classify_navigator, classify_supervised from src.utils.logging import configure_logging @@ -45,16 +46,58 @@ async def run(args) -> int: y_true = df[args.code_column].to_list() logger.info(f"Evaluating method '{args.method}' on {len(labels)} labels") + if "ipw_weight" in df.columns: + weights = df["ipw_weight"].to_list() + else: + logger.warning( + "No 'ipw_weight' column in eval set: weighted accuracy skipped " + "(eval set predates IPW weighting, rebuild it with build_eval_set.py)." + ) + weights = None + method = METHODS[args.method] predictions = await method(labels) # Les classifieurs renvoient des MatchVerificationInput ; un échec (pas de - # code final atteint) est représenté par une prédiction sans code. + # code final atteint) est représenté par une prédiction sans code. Une + # confiance nulle avec un code renseigné signale un repli de finalisation + # (`_fallback_output`), pas un échec au sens strict : cf. low_confidence_rate. y_pred = [getattr(pred, "code", None) for pred in predictions] explanations = [getattr(pred, "proposed_explanation", None) for pred in predictions] confidences = [getattr(pred, "proposed_confidence", None) for pred in predictions] - report = evaluate(y_true, y_pred) + report = evaluate(y_true, y_pred, weights=weights, confidences=confidences) + + if args.bootstrap > 0: + if "eval_stratum" in df.columns: + strata = df["eval_stratum"].to_list() + else: + logger.warning( + "No 'eval_stratum' column in eval set: bootstrap falls back to a single " + "stratum (unstratified), understating the effect of the sampling design." + ) + strata = [0] * len(y_true) + + def accuracy_metric(t, p, w): + return accuracy_at_depth(t, p, weights=w) + + _, ci = bootstrap_ci( + y_true, y_pred, strata, accuracy_metric, n_resamples=args.bootstrap, seed=args.seed + ) + report["leaf_accuracy_ci"] = list(ci) + + if weights is not None: + _, weighted_ci = bootstrap_ci( + y_true, + y_pred, + strata, + accuracy_metric, + n_resamples=args.bootstrap, + seed=args.seed, + weights=weights, + ) + report["leaf_accuracy_weighted_ci"] = list(weighted_ci) + logger.info(f"Metrics: {report}") os.makedirs(args.output_dir, exist_ok=True) @@ -87,6 +130,13 @@ def main() -> int: "--code-column", default="apet2025", help="Label column (default: apet2025)" ) parser.add_argument("--output-dir", default="data/eval/results", help="Output directory") + parser.add_argument( + "--bootstrap", + type=int, + default=0, + help="Number of bootstrap resamples for accuracy CIs (0 = off, default)", + ) + parser.add_argument("--seed", type=int, default=42, help="Bootstrap seed (default: 42)") args = parser.parse_args() return asyncio.run(run(args)) diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py new file mode 100644 index 0000000..d7a7fe5 --- /dev/null +++ b/tests/test_bootstrap.py @@ -0,0 +1,73 @@ +from src.evaluation.bootstrap import bootstrap_ci +from src.evaluation.metrics import accuracy_at_depth + + +def _accuracy_metric(y_true, y_pred, weights): + return accuracy_at_depth(y_true, y_pred, weights=weights) + + +def _synthetic_dataset(): + # Two strata of 4 rows each: stratum "A" is 3/4 correct, stratum "B" is 1/4 correct. + y_true = ["10.71C", "10.71C", "10.71C", "10.71C", "62.01Z", "62.01Z", "62.01Z", "62.01Z"] + y_pred = ["10.71C", "10.71C", "10.71C", "99.99Z", "62.01Z", "99.99Z", "99.99Z", "99.99Z"] + strata = ["A", "A", "A", "A", "B", "B", "B", "B"] + return y_true, y_pred, strata + + +def test_point_estimate_matches_accuracy_at_depth(): + y_true, y_pred, strata = _synthetic_dataset() + point, _ = bootstrap_ci(y_true, y_pred, strata, _accuracy_metric, n_resamples=200) + assert point == accuracy_at_depth(y_true, y_pred) + + +def test_ci_bounds_are_in_unit_interval_and_contain_point_estimate(): + y_true, y_pred, strata = _synthetic_dataset() + point, (lo, hi) = bootstrap_ci(y_true, y_pred, strata, _accuracy_metric, n_resamples=500) + assert 0.0 <= lo <= hi <= 1.0 + # The point estimate need not sit exactly inside a percentile CI in general, + # but for a symmetric, well-behaved statistic like accuracy here it should. + assert lo <= point <= hi + + +def test_reproducible_for_fixed_seed(): + y_true, y_pred, strata = _synthetic_dataset() + result_a = bootstrap_ci(y_true, y_pred, strata, _accuracy_metric, n_resamples=300, seed=7) + result_b = bootstrap_ci(y_true, y_pred, strata, _accuracy_metric, n_resamples=300, seed=7) + assert result_a == result_b + + +def test_resampling_never_mixes_rows_across_strata(): + # Unequal stratum sizes (4 vs 6) with per-row unique, stratum-tagged codes: + # a resample that leaked rows across strata would break the exact 4/6 count. + y_true = [f"A{i}" for i in range(4)] + [f"B{i}" for i in range(6)] + y_pred = list(y_true) + strata = ["A"] * 4 + ["B"] * 6 + + def recording_metric(t, p, w): + n_a = sum(1 for code in t if code.startswith("A")) + n_b = sum(1 for code in t if code.startswith("B")) + assert (n_a, n_b) == (4, 6) + return accuracy_at_depth(t, p, weights=w) + + bootstrap_ci(y_true, y_pred, strata, recording_metric, n_resamples=50, seed=1) + + +def test_weights_are_resampled_alongside_rows(): + y_true, y_pred, strata = _synthetic_dataset() + weights = [1, 1, 1, 1, 5, 5, 5, 5] + point_unweighted, _ = bootstrap_ci(y_true, y_pred, strata, _accuracy_metric, n_resamples=200) + point_weighted, _ = bootstrap_ci( + y_true, y_pred, strata, _accuracy_metric, n_resamples=200, weights=weights + ) + # Stratum B (weight 5, only 1/4 correct) dominates the weighted estimate, + # so the weighted accuracy should be markedly lower than the unweighted one. + assert point_weighted < point_unweighted + + +def test_raises_on_length_mismatch(): + try: + bootstrap_ci(["a", "b"], ["a"], ["s", "s"], _accuracy_metric) + except ValueError: + pass + else: + raise AssertionError("expected ValueError") diff --git a/tests/test_build_eval_set.py b/tests/test_build_eval_set.py new file mode 100644 index 0000000..cf1a9e7 --- /dev/null +++ b/tests/test_build_eval_set.py @@ -0,0 +1,44 @@ +import polars as pl + +from src.evaluation.build_eval_set import stratified_sample + + +def test_stratum_smaller_than_cap_is_kept_whole_with_weight_one(): + # Stratum "1071C" has only 2 rows, well under n_per_stratum=10. + df = pl.DataFrame({"code": ["10.71C", "10.71C", "62.01Z", "62.01Z", "62.01Z"]}) + sampled = stratified_sample(df, code_column="code", n_per_stratum=10, stratum_depth=5) + + small_stratum = sampled.filter(pl.col("eval_stratum") == "1071C") + assert len(small_stratum) == 2 + assert small_stratum["ipw_weight"].to_list() == [1.0, 1.0] + + +def test_capped_stratum_gets_inverse_probability_weight(): + # Stratum "6201Z" has 8 rows, capped to 4: weight should be 8/4 = 2. + df = pl.DataFrame({"code": ["62.01Z"] * 8 + ["10.71C"] * 2}) + sampled = stratified_sample(df, code_column="code", n_per_stratum=4, stratum_depth=5) + + capped_stratum = sampled.filter(pl.col("eval_stratum") == "6201Z") + assert len(capped_stratum) == 4 + assert capped_stratum["ipw_weight"].to_list() == [2.0, 2.0, 2.0, 2.0] + + whole_stratum = sampled.filter(pl.col("eval_stratum") == "1071C") + assert len(whole_stratum) == 2 + assert whole_stratum["ipw_weight"].to_list() == [1.0, 1.0] + + +def test_helper_columns_are_not_leaked(): + df = pl.DataFrame({"code": ["10.71C", "62.01Z"]}) + sampled = stratified_sample(df, code_column="code", n_per_stratum=10, stratum_depth=5) + assert "_norm_code" not in sampled.columns + assert "_population_count" not in sampled.columns + assert "_sampled_count" not in sampled.columns + assert "eval_stratum" in sampled.columns + assert "ipw_weight" in sampled.columns + + +def test_reproducible_for_fixed_seed(): + df = pl.DataFrame({"code": ["62.01Z"] * 10, "id": list(range(10))}) + sampled_a = stratified_sample(df, code_column="code", n_per_stratum=4, stratum_depth=5, seed=1) + sampled_b = stratified_sample(df, code_column="code", n_per_stratum=4, stratum_depth=5, seed=1) + assert sampled_a["id"].to_list() == sampled_b["id"].to_list() diff --git a/tests/test_compare.py b/tests/test_compare.py new file mode 100644 index 0000000..e2c0599 --- /dev/null +++ b/tests/test_compare.py @@ -0,0 +1,77 @@ +import polars as pl + +from src.evaluation.compare import compare, mcnemar_test, paired_bootstrap_diff + + +def _make_df(y_true, y_pred, strata): + return pl.DataFrame({"apet2025": y_true, "prediction": y_pred, "eval_stratum": strata}) + + +def test_mcnemar_no_difference_when_predictions_identical(): + y_true = ["10.71C", "62.01Z", "01.11Z", "43.99C"] * 5 + y_pred = ["10.71C", "62.02A", "01.11Z", "99.99Z"] * 5 + p_value = mcnemar_test(y_true, y_pred, y_pred) + assert p_value == 1.0 + + +def test_mcnemar_detects_clear_difference(): + # Method A always wrong, method B always right on 20 discordant rows. + y_true = [f"{i:02d}.00Z" for i in range(20)] + y_pred_a = ["99.99Z"] * 20 + y_pred_b = list(y_true) + p_value = mcnemar_test(y_true, y_pred_a, y_pred_b) + assert p_value < 0.05 + + +def test_paired_bootstrap_diff_matches_manual_point_estimate(): + y_true = ["10.71C", "10.71C", "62.01Z", "62.01Z"] + y_pred_a = ["10.71C", "99.99Z", "62.01Z", "99.99Z"] # 2/4 correct + y_pred_b = ["10.71C", "10.71C", "62.01Z", "62.01Z"] # 4/4 correct + strata = ["A", "A", "B", "B"] + point_diff, (lo, hi) = paired_bootstrap_diff( + y_true, y_pred_a, y_pred_b, strata, n_resamples=300, seed=1 + ) + assert point_diff == 4 / 4 - 2 / 4 + assert lo <= point_diff <= hi + + +def test_compare_flags_significant_difference(): + n = 20 + y_true = [f"{i:02d}.00Z" for i in range(n)] + y_pred_a = ["99.99Z"] * n # always wrong + y_pred_b = list(y_true) # always right + strata = ["S"] * n + df_a = _make_df(y_true, y_pred_a, strata) + df_b = _make_df(y_true, y_pred_b, strata) + + report = compare(df_a, df_b, n_resamples=300, seed=1) + assert report["n"] == n + assert report["accuracy_a"] == 0.0 + assert report["accuracy_b"] == 1.0 + assert report["diff"] == 1.0 + assert report["diff_ci"][0] > 0 + assert report["mcnemar_p_value"] < 0.05 + assert report["significant"] is True + + +def test_compare_no_significant_difference_when_predictions_identical(): + n = 20 + y_true = [f"{i:02d}.00Z" for i in range(n)] + strata = ["S"] * n + df_a = _make_df(y_true, y_true, strata) + df_b = _make_df(y_true, y_true, strata) + + report = compare(df_a, df_b, n_resamples=300, seed=1) + assert report["diff"] == 0.0 + assert report["significant"] is False + + +def test_compare_raises_on_misaligned_ground_truth(): + df_a = _make_df(["10.71C", "62.01Z"], ["10.71C", "62.01Z"], ["A", "B"]) + df_b = _make_df(["10.71C", "01.11Z"], ["10.71C", "01.11Z"], ["A", "B"]) + try: + compare(df_a, df_b) + except ValueError: + pass + else: + raise AssertionError("expected ValueError") diff --git a/tests/test_metrics.py b/tests/test_metrics.py index 2658071..f49702e 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -1,6 +1,12 @@ import math -from src.evaluation.metrics import accuracy_at_depth, evaluate, failure_rate, normalize_code +from src.evaluation.metrics import ( + accuracy_at_depth, + evaluate, + failure_rate, + low_confidence_rate, + normalize_code, +) def test_normalize_code(): @@ -64,3 +70,51 @@ def test_evaluate_report(): "accuracy_depth_3", "accuracy_depth_4", } + + +def test_weighted_accuracy_matches_manual_computation(): + y_true = ["10.71C", "62.01Z", "01.11Z"] + y_pred = ["1071C", "62.02A", "01.11Z"] # correct, wrong, correct + weights = [1, 2, 1] + # correct weight = 1 (row 0) + 1 (row 2) = 2 ; total weight = 1 + 2 + 1 = 4 + assert accuracy_at_depth(y_true, y_pred, weights=weights) == 2 / 4 + # unweighted accuracy on the same data is unaffected (2/3, not 2/4) + assert accuracy_at_depth(y_true, y_pred) == 2 / 3 + + +def test_weighted_accuracy_length_mismatch_raises(): + try: + accuracy_at_depth(["a"], ["a"], weights=[1, 2]) + except ValueError: + pass + else: + raise AssertionError("expected ValueError") + + +def test_evaluate_includes_weighted_keys_when_weights_given(): + y_true = ["10.71C", "62.01Z", "01.11Z"] + y_pred = ["1071C", "62.02A", "01.11Z"] + weights = [1, 2, 1] + report = evaluate(y_true, y_pred, weights=weights) + assert report["leaf_accuracy"] == 2 / 3 + assert report["leaf_accuracy_weighted"] == 2 / 4 + assert "accuracy_depth_2_weighted" in report + + +def test_evaluate_omits_weighted_and_confidence_keys_by_default(): + report = evaluate(["10.71C"], ["10.71C"]) + assert "leaf_accuracy_weighted" not in report + assert "low_confidence_rate" not in report + + +def test_low_confidence_rate(): + assert low_confidence_rate([0.0, 0.9, None, 0.0]) == 2 / 4 + assert math.isnan(low_confidence_rate([])) + + +def test_evaluate_includes_low_confidence_rate_when_given(): + y_true = ["10.71C", "62.01Z"] + y_pred = ["10.71C", "62.01Z"] + confidences = [0.0, 0.9] + report = evaluate(y_true, y_pred, confidences=confidences) + assert report["low_confidence_rate"] == 0.5 From c37fc792d844fd3bfa6f7107548c5e34dfe10925 Mon Sep 17 00:00:00 2001 From: theof Date: Thu, 9 Jul 2026 16:21:16 +0000 Subject: [PATCH 16/18] fix: propagate errors and experiment names to Langfuse traces - Re-enable @observe on classify_navigator so its trace has a parent span. - Attach --experiment-name to the Langfuse trace (name/tag/metadata) in all four entry points instead of only logging it. - Flag finalize-call failures in _run_navigator_loop as ERROR spans instead of silently succeeding with confidence 0.0. - Fix CodeChooser returning the raw agents-SDK RunResult instead of its final_output. - Let MatchVerifier judge raw ground-truth labels (no proposed_explanation/ confidence) and surface the official code definition in its prompt. - Add Graph.get_{code_information,children,descendants,siblings,parent} wrappers with a shared dotted/undotted code retry, used by both the Navigator tools and graph.py's own tool set. --- .gitignore | 9 + data/eval/eval_set_sample15.parquet | Bin 0 -> 4594 bytes data/eval/eval_set_sample30.parquet | Bin 0 -> 4666 bytes docs/cadrage_2026-07.md | 10 +- docs/framework.md | 25 + evaluate_embeddings.py | 340 ++++++++++++ evaluate_train_labels.py | 224 ++++++++ pyproject.toml | 9 +- .../Text2Code/classifiers/base_classifier.py | 13 +- src/agents/closers/code_chooser.py | 2 +- src/agents/closers/match_verifier.py | 42 +- src/evaluation/human_review_app.py | 485 ++++++++++++++++++ src/evaluation/verify_train_labels.py | 122 +++++ src/main.py | 19 +- src/navigator/navigator.py | 21 +- src/neo4j_graph/graph.py | 60 ++- uv.lock | 56 +- 17 files changed, 1396 insertions(+), 41 deletions(-) create mode 100644 data/eval/eval_set_sample15.parquet create mode 100644 data/eval/eval_set_sample30.parquet create mode 100644 evaluate_embeddings.py create mode 100644 evaluate_train_labels.py create mode 100644 src/evaluation/human_review_app.py create mode 100644 src/evaluation/verify_train_labels.py diff --git a/.gitignore b/.gitignore index fcb1181..2e9edef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,15 @@ # Personnal usage test.ipynb +# Generated evaluation run artifacts (predictions, metrics, diagnostics, review +# logs) - reproducible outputs of scripts in src/evaluation/ and the root-level +# eval scripts, not source. Versioned inputs (eval_set*.parquet) are not ignored. +data/eval/results/ +data/eval/results_sample*/ +data/eval/train_verification/ +data/eval/embedding_diagnostics/ +data/eval/human_review/ + # Byte-compiled / optimized / DLL files __pycache__/ *.py[codz] diff --git a/data/eval/eval_set_sample15.parquet b/data/eval/eval_set_sample15.parquet new file mode 100644 index 0000000000000000000000000000000000000000..8ef0edd2129859fc6dc7d27f8bb93871c745d81e GIT binary patch literal 4594 zcmeHLc~nzZ8ow_I2nZOJ`tkE3JGMvItFYfIg%4>FR&!VQ@%-9qT{nzjJq3xC5Jn2 zc(Q$YCyt5;2p}IyMJNgzx=UIPmt}mIph_Le6{lS2SpA zn@+qlV~^rQ{B2zn{{Dv=j)FbNEFSgcdyM~_Cx9JX4tkym^NHrcFtwWEq>R^ zu(Pd4>qjo_F>Ty&pCD`m`@dntdjQeO{DQ6?gEExX)HSb(#EqdYk>igoB9VJ_Q5+4^$ zeWz3vJAAi=d)(M< zt?JlrE;wNhYfZVrIC8wZ^--}R$MP`fvi7sHqCIZLW=T_aUtoB|KG}{0UnW1H)>^uj z$u61q$5g46NW75gXJ{>%$}g|#eC$=nZn~PW`BKJPll5n2?J4uNHa3&R+>e66U;L*% zx!U_-bR@BLS097%y=>d=H!b(>8`8g(y%hS}nr~(6-ak^&VoiT^;~~G+0*l-h-v@_3 zVx-4y5d|&VHDznJVbZ{^_@<#efwyaDvj5e+9tX60L#Yh?4LARJcdTsYWX-F2-}%GP zhP5F>xn3W9)_H4rfn_A7M9C-$$f!K+;`3F9>Eg#l?V+vAp_w^X71K-h>(;whtiAq$ zS6Qpqa@N46-!UE>6WqOZ@n6$4**Wqn6{iFA_lAQD#cxk=*}4gRfKpYiw21h6CBI5z zuxQXMKvz*|G+C4uozZ|vO^q|D;hQZ+)k>unt19^wO2cXkGPLPx_!g56@$snCSu_<$ zLX#$qYK=_cPa?)+j8qyK5rf);SS)6O@N6*Wd_ycc)I1nEu7j|UqL{?-=A?)+R zQ0&Gi$tMJi#>)>J4cra+1fWL|&#}#D()NT{-vmH`t&d{`)YA9PndOoUJ-7nk%H=S# z70Gm@&l#kZ5MJctNE5n4`Ey{f91X}j{W|ef0)R8lwC@YT;{%1`&IOUl!7J#n@W^tU z3BqNAQ@V)?+sbbs$o(kY*>t)NQ(MBZ6C@0V;~WVO$2nrGKY$R~6GmJn&WaIBZQs)W4Zr_XYN!6*Zw?0BmG)}fJ*{E3;rh+k<0l%uWC*U zM%M{0hraSoY;;Z0fkel}iAPXe4w3D|7(L+V5sJ2)KJ`vwY>q54omh5@;W&o{+FZMs zhb}s-LHh`}JhFWXY<98FFZ;qu`?PKbTw$LcnhDkR=|w)Y685=u4lJ=xJN;oD&4vta zV+zY;G+H1V6+QuD?8z(uavq9EGaW6=nTM*QGl|R6I2zRk2kn9U;u~yp#zfc1Su*~l z1JaMn<64EEGkBwQ=2@Td09(m2maZQ9CC9gWMe4Wk#lolC=foJF=qG^O^j^EX0;+12!wTfC$pzC9I_AF91_9VKsY#y z_wzdkc@<~bFMI0OM8&jgZw zLN~IN=Yuaj$CFYhGV){1=xtk} zW>Ir9k-WMZ%Tp;zYuBU42qdOt*d_zpCq`qT9{((&{n0cIM5X7<4GW7_;VB)#<|l!o z-6G}^ISLYuLLz_IG$p;fv>?H}G%qH6X};c|OriayBBiiJSc!Iu@t{vZ%kYer(>{~Z zv-40ASf5sM*3U}Ay6BTdVL5_=Toz)NGR)1DEM7zDevNr)mW<9{j+wM4 zlqCM}dZA>Kv?w(^X4%$}28YC9^nPby5xsPU1qph!EVVjqMJ@$6u9-%?(q!gZQGuWE N4^ly|6ZF45{|4et7;OLm literal 0 HcmV?d00001 diff --git a/data/eval/eval_set_sample30.parquet b/data/eval/eval_set_sample30.parquet new file mode 100644 index 0000000000000000000000000000000000000000..6509b3349eef81429741393805583b1d282354a4 GIT binary patch literal 4666 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.html`. +- **Comparaison multi-modèles** : éditer la liste `CANDIDATE_MODELS` en tête de script pour comparer plusieurs modèles d'embedding déployés derrière `URL_EMBEDDING_API`. + +```bash +uv run python evaluate_embeddings.py +``` + +**Résultat du premier diagnostic (8/07)** avec le modèle actuellement configuré (`qwen3-embedding-8b`) : accuracy@1 = recall@5 = 0 % sur l'échantillon de 30 libellés — voir la limite documentée en §8. + ## 6. Configuration (variables d'environnement) | Variable | Usage | @@ -164,9 +178,19 @@ report["any_drift"] # bool | `EMBEDDING_MODEL`, `URL_EMBEDDING_API`, `MAX_TOKENS` | Modèle et service d'embedding utilisés lors de la construction du graphe | | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_ENDPOINT_URL` | Accès S3 (Datalab/Onyxia) pour les données sources et notices | | `MLFLOW_TRACKING_URI`, `MLFLOW_MODEL_URI` | Chargement du modèle supervisé de production par `SupervisedClassifier` | +| `LANGFUSE_PUBLIC_KEY`, `LANGFUSE_SECRET_KEY`, `LANGFUSE_BASE_URL` | Traçage applicatif Langfuse (voir ci-dessous) | Le traçage applicatif (sessions, coûts, latence, arbre d'appels des agents) est assuré par **Langfuse** (`get_client`, `propagate_attributes`, `@observe` dans `src/main.py`). +### 6.1 Traçage Langfuse — chantiers restants **[à compléter]** + +Audit du 8/07 : le traçage fonctionne pour `classify_agentic_rag`, `classify_supervised` et `process_batch_file` (`@observe` actif, appels LLM individuels journalisés via `langfuse.openai.AsyncOpenAI` dans `base_agent.py`), mais reste incomplet sur plusieurs points, à traiter avant de présenter le traçage comme un acquis : + +- **`classify_navigator` n'est pas tracé** (`@observe` commenté dans `src/main.py`) alors que c'est le chemin agentique principal (cf. cadrage §2.1) — chaque appel LLM est bien journalisé individuellement mais sans trace/span parent qui les relie en un arbre de raisonnement cohérent. +- **Les échecs de finalisation de `_run_navigator_loop` ne remontent plus comme des erreurs dans Langfuse** depuis l'ajout du repli `_fallback_output` (`base_classifier.py`) : l'exception est journalisée en log applicatif seulement, la trace Langfuse correspondante apparaît comme un succès normal (confiance 0.0) plutôt que marquée en erreur. +- **`--experiment-name` n'est pas réellement propagé au traçage Langfuse** malgré ce qu'indique le §4 : la valeur circule comme argument/log applicatif mais n'est jamais attachée à la trace (nom, tag ou métadonnée), donc impossible de filtrer/grouper les runs par expérience dans l'UI Langfuse. +- Pas de `langfuse.flush()`/`shutdown()` explicite avant la sortie du script CLI (repose sur le hook `atexit` du SDK, suffisant en usage normal mais fragile en cas d'arrêt forcé d'un job batch). + **Piège fréquent sur `MLFLOW_MODEL_URI`** : ce n'est pas le lien de la page MLflow ouverte dans le navigateur, mais une URI au schéma `models:` — ex. `models:/FastText-pytorch/9` (pas `https://.../#/models/FastText-pytorch/versions/9`). Et `MLFLOW_TRACKING_URI` doit pointer vers le serveur MLflow où ce modèle est **effectivement enregistré** (le plus souvent l'instance MLflow partagée du projet, ex. `projet-ape-mlflow.user.lab.sspcloud.fr`) — pas nécessairement l'instance MLflow personnelle par défaut sur le Datalab, qui n'a pas accès au registre d'un autre projet. `SupervisedClassifier` lève une erreur explicite si `MLFLOW_MODEL_URI` est un lien `http(s)://` plutôt qu'une URI `models:`. Un test de connectivité par service externe (Neo4j, LLM de génération, embedding, S3, Langfuse, MLflow) est disponible dans `tests/test_connections.py` — chaque test se saute automatiquement si les variables requises sont absentes, pour rester vert en CI sans secrets Datalab tout en détectant un endpoint/identifiant mal configuré quand ils sont présents. @@ -180,6 +204,7 @@ Cette section documentera, une fois formalisée, le mode opératoire complet pou Recensées ici pour mémoire (suivi détaillé dans le document de cadrage) : - Les composants branchés le 6/07 (classifieur *Agentic RAG* dans la CLI, chaînage `--verify`, harnais `run_eval`) n'ont pas encore été évaluées. +- **L'espace d'embedding utilisé par l'Agentic RAG comme *warm start* est de très mauvaise qualité avec le modèle actuellement configuré** (`EMBEDDING_MODEL=qwen3-embedding-8b`) : premier diagnostic formalisé le 8/07 (`evaluate_embeddings.py`, cf. §5.2) — accuracy@1 = recall@5 = 0 % sur l'échantillon annoté de 30 libellés (ex. « FOOTBALL FEMININ » classé 373ᵉ/747 par similarité cosinus à sa propre notice). Cause probable non tranchée : modèle d'embedding non adapté au domaine, ou format d'instruction attendu par ce modèle (Qwen3-Embedding est *instruction-tuned*) différent du préfixe générique `"query : "` actuellement câblé dans `Graph.get_closest_codes`. À investiguer avant de considérer l'Agentic RAG comme fiable. - `SupervisedClassifier` (modèle de production via MLflow) est également non validé fonctionnellement : le parsing de la sortie `.predict()` est écrit pour plusieurs formats plausibles mais n'a pas pu être testé contre le modèle réel dans cet environnement (pas d'accès au tracking MLflow). - La CI couvre lint, syntaxe et tests unitaires purs (dont le module `drift.py`, testé sur données synthétiques), mais **pas de tests d'intégration** (agents + graphe + MLflow) : ils nécessiteraient les services correspondants dans le workflow. `tests/test_connections.py` comble partiellement ce manque en local/Datalab (smoke tests skippés si les identifiants sont absents). --- diff --git a/evaluate_embeddings.py b/evaluate_embeddings.py new file mode 100644 index 0000000..2f35700 --- /dev/null +++ b/evaluate_embeddings.py @@ -0,0 +1,340 @@ +""" +Diagnostic de l'espace d'embedding : notices (NAF2025) vs libellés (exemples). + +Le classifieur Agentic RAG (src/agents/Text2Code/classifiers/agentic_rag.py) se sert +d'une recherche par similarité entre le libellé d'activité à classer et les embeddings +des notices de nomenclature stockées dans Neo4j (src/neo4j_graph/graph.py:get_closest_codes) +pour choisir un code de départ. Ce script évalue la qualité de cette recherche +indépendamment de la navigation LLM qui la suit, sur un petit échantillon annoté : + + - quantitatif : accuracy@1 et recall@k du k-NN libellé -> notice (cosinus) + - visuel : projection 2D (UMAP / PaCMAP / t-SNE / PCA) des notices et des libellés, + avec les arêtes k-NN correctes/incorrectes et la vérité terrain + +et permet de comparer plusieurs modèles d'embedding candidats (déployés derrière le +même endpoint URL_EMBEDDING_API) en éditant CANDIDATE_MODELS ci-dessous. + +Usage: + python evaluate_embeddings.py +""" + +# %% Imports +import json +import os + +import numpy as np +import pacmap +import pandas as pd +import plotly.graph_objects as go +import umap +from langchain_core.documents import Document +from langchain_openai import OpenAIEmbeddings +from plotly.subplots import make_subplots +from sklearn.decomposition import PCA +from sklearn.manifold import TSNE +from sklearn.metrics.pairwise import cosine_distances +from sklearn.neighbors import NearestNeighbors + +from src.neo4j_graph.graph_builder.config import COLUMNS_TO_KEEP, MAX_TOKENS, URL_EMBEDDING_API +from src.neo4j_graph.graph_builder.utils.embed_manager import truncate_docs_to_max_tokens +from src.neo4j_graph.graph_builder.utils.notice_manager import load_notices + +# %% Config +# Add more model names deployed behind URL_EMBEDDING_API to compare them. +CANDIDATE_MODELS = [os.environ["EMBEDDING_MODEL"]] + +EVAL_SAMPLE_PATH = "data/eval/eval_set_sample30.parquet" +# Ground truth (apet2025) is NAF2025-coded, so notices must come from the NAF2025 +# nomenclature regardless of whatever NOTICES_PATH graph_builder/config is set to. +NAF2025_NOTICES_PATH = "projet-ape/notices/Notices-NAF2025-FR.parquet" + +K_NN = 5 +REDUCTION_METHODS = ["umap", "pacmap", "tsne", "pca"] +OUTPUT_DIR = "data/eval/embedding_diagnostics" + + +def normalize_code(code: str) -> str: + return str(code).replace(".", "").replace(" ", "").upper() + + +def build_embedding_model(model_name: str) -> OpenAIEmbeddings: + # check_embedding_ctx_length=False is required for self-hosted, non-OpenAI models: + # otherwise langchain pre-tokenizes the text with tiktoken (falling back to + # cl100k_base for unrecognized model names) and sends the resulting integer + # token IDs as `input`, which the server then decodes with its own tokenizer's + # vocabulary — silently corrupting every embedding. Disabling it sends plain text. + return OpenAIEmbeddings( + model=model_name, + openai_api_base=URL_EMBEDDING_API, + openai_api_key=os.environ["OPENAI_API_KEY"], + check_embedding_ctx_length=False, + ) + + +# %% Data loading +def load_eval_sample(path: str) -> pd.DataFrame: + df = pd.read_parquet(path)[["libelle", "apet2025"]].dropna() + df["apet2025"] = df["apet2025"].map(normalize_code) + return df.reset_index(drop=True) + + +def load_leaf_notices(path: str) -> pd.DataFrame: + df = load_notices(path, COLUMNS_TO_KEEP) + df = df[df["FINAL"] == 1].copy() + df["CODE"] = df["CODE"].map(normalize_code) + df["text_to_embed"] = ( + df["NAME"].fillna("") + + "\n" + + df["Implementation_rule"].fillna("") + + "\n" + + df["Includes"].fillna("") + + "\n" + + df["IncludesAlso"].fillna("") + ) + return df.reset_index(drop=True) + + +def truncate_texts(texts: list[str], max_tokens: int) -> list[str]: + docs = [Document(page_content=t) for t in texts] + docs = truncate_docs_to_max_tokens(docs, max_tokens) + return [d.page_content for d in docs] + + +# %% k-NN retrieval +def compute_knn(label_embeddings: np.ndarray, notice_embeddings: np.ndarray, k: int): + """For each libellé embedding, find its k nearest notice embeddings (cosine).""" + nbrs = NearestNeighbors(n_neighbors=k, metric="cosine").fit(notice_embeddings) + distances, indices = nbrs.kneighbors(label_embeddings) + return indices, distances + + +def score_retrieval( + indices: np.ndarray, distances: np.ndarray, notice_codes: list[str], target_codes: list[str] +): + n = len(target_codes) + hits_at_1 = 0 + hits_at_k = 0 + correct_sims, incorrect_sims = [], [] + edges = [] # (label_idx, notice_idx, distance, is_correct) — notice_idx indexes notice_codes + + for label_idx, (idx_row, dist_row, target) in enumerate(zip(indices, distances, target_codes)): + retrieved_codes = [notice_codes[j] for j in idx_row] + hits_at_1 += int(retrieved_codes[0] == target) + hits_at_k += int(target in retrieved_codes) + + for notice_idx, dist in zip(idx_row, dist_row): + is_correct = notice_codes[notice_idx] == target + edges.append((label_idx, int(notice_idx), float(dist), is_correct)) + (correct_sims if is_correct else incorrect_sims).append(1 - dist) + + metrics = { + "n": n, + "accuracy_at_1": hits_at_1 / n, + f"recall_at_{indices.shape[1]}": hits_at_k / n, + "mean_cosine_sim_correct": float(np.mean(correct_sims)) if correct_sims else None, + "mean_cosine_sim_incorrect": float(np.mean(incorrect_sims)) if incorrect_sims else None, + } + return metrics, edges + + +# %% Dimensionality reduction +def reduce_dimensions(embeddings: np.ndarray, method: str, random_state: int = 42): + if method == "umap": + reducer = umap.UMAP( + random_state=random_state, n_neighbors=10, min_dist=0.1, metric="cosine" + ) + return reducer.fit_transform(embeddings), "UMAP (cosine)" + if method == "pacmap": + reducer = pacmap.PaCMAP( + n_components=2, + n_neighbors=10, + MN_ratio=0.5, + FP_ratio=2.0, + distance="angular", + random_state=random_state, + ) + return reducer.fit_transform(embeddings), "PaCMAP (angular)" + if method == "tsne": + distances = cosine_distances(embeddings) + reducer = TSNE( + n_components=2, + random_state=random_state, + perplexity=min(30, len(embeddings) - 1), + metric="precomputed", + init="random", + ) + return reducer.fit_transform(distances), "t-SNE (cosine)" + if method == "pca": + reducer = PCA(n_components=2, random_state=random_state) + coords = reducer.fit_transform(embeddings) + return coords, f"PCA (variance: {reducer.explained_variance_ratio_.sum():.1%})" + raise ValueError(f"Unknown reduction method: {method}") + + +# %% Plotting +def build_comparison_figure( + combined_embeddings: np.ndarray, + n_notices: int, + notice_hover: list[str], + label_hover: list[str], + edges: list[tuple], + methods: list[str], +) -> go.Figure: + positions = [(1, 1), (1, 2), (2, 1), (2, 2)] + fig = make_subplots( + rows=2, cols=2, subplot_titles=methods, horizontal_spacing=0.06, vertical_spacing=0.1 + ) + + for method, (row, col) in zip(methods, positions): + coords, method_name = reduce_dimensions(combined_embeddings, method) + X, Y = coords.T + is_first = row == 1 and col == 1 + + for label_idx, notice_idx, dist, is_correct in edges: + label_pt = n_notices + label_idx + color = ( + "rgba(50, 205, 50, 0.9)" + if is_correct + else f"rgba(100, 150, 255, {max(0.2, 1 - dist / 2):.2f})" + ) + fig.add_trace( + go.Scatter( + x=[X[label_pt], X[notice_idx]], + y=[Y[label_pt], Y[notice_idx]], + mode="lines", + line=dict( + color=color, + width=3 if is_correct else 1.5, + dash="solid" if is_correct else "dot", + ), + showlegend=False, + hoverinfo="skip", + ), + row=row, + col=col, + ) + + fig.add_trace( + go.Scatter( + x=X[:n_notices], + y=Y[:n_notices], + mode="markers", + name="Notices NAF", + legendgroup="notices", + showlegend=is_first, + marker=dict(size=6, color="steelblue", line=dict(width=0.3, color="white")), + text=notice_hover, + hovertemplate="%{text}", + ), + row=row, + col=col, + ) + fig.add_trace( + go.Scatter( + x=X[n_notices:], + y=Y[n_notices:], + mode="markers", + name="Libellés", + legendgroup="labels", + showlegend=is_first, + marker=dict( + size=11, color="red", symbol="star", line=dict(width=0.8, color="darkred") + ), + text=label_hover, + hovertemplate="%{text}", + ), + row=row, + col=col, + ) + fig.update_xaxes(showticklabels=False, title_text=method_name, row=row, col=col) + fig.update_yaxes(showticklabels=False, row=row, col=col) + + fig.add_trace( + go.Scatter( + x=[None], + y=[None], + mode="lines", + line=dict(color="rgba(50, 205, 50, 0.9)", width=3), + name="k-NN correct", + ), + row=1, + col=1, + ) + fig.add_trace( + go.Scatter( + x=[None], + y=[None], + mode="lines", + line=dict(color="rgba(100, 150, 255, 0.6)", width=1.5, dash="dot"), + name="k-NN incorrect", + ), + row=1, + col=1, + ) + fig.update_layout(height=1000, width=1600, hovermode="closest", plot_bgcolor="white") + return fig + + +# %% Per-model evaluation +def evaluate_model( + model_name: str, eval_df: pd.DataFrame, notices_df: pd.DataFrame, output_dir: str +) -> dict: + print(f"\n=== {model_name} ===") + emb_model = build_embedding_model(model_name) + + notice_texts = truncate_texts(notices_df["text_to_embed"].tolist(), MAX_TOKENS) + notice_codes = notices_df["CODE"].tolist() + notice_embeddings = np.array(emb_model.embed_documents(notice_texts)) + # Mirrors the "query : {activity}" prefix used at retrieval time in + # src/neo4j_graph/graph.py:get_closest_codes — required for a fair comparison with + # instruction-tuned/asymmetric embedding models (query vs. passage formatting). + query_texts = [f"query : {libelle}" for libelle in eval_df["libelle"]] + label_embeddings = np.array(emb_model.embed_documents(query_texts)) + + indices, distances = compute_knn( + label_embeddings, notice_embeddings, k=min(K_NN, len(notice_codes)) + ) + metrics, edges = score_retrieval(indices, distances, notice_codes, eval_df["apet2025"].tolist()) + print(json.dumps(metrics, indent=2)) + + combined_embeddings = np.vstack([notice_embeddings, label_embeddings]) + notice_hover = [ + f"{code}
{name}" for code, name in zip(notice_codes, notices_df["NAME"]) + ] + label_hover = [ + f"{libelle[:80]}
Cible: {target}" + for libelle, target in zip(eval_df["libelle"], eval_df["apet2025"]) + ] + fig = build_comparison_figure( + combined_embeddings, len(notice_codes), notice_hover, label_hover, edges, REDUCTION_METHODS + ) + fig.update_layout( + title_text=f"{model_name} — accuracy@1={metrics['accuracy_at_1']:.1%}, " + f"recall@{K_NN}={metrics[f'recall_at_{K_NN}']:.1%}" + ) + + os.makedirs(output_dir, exist_ok=True) + safe_name = model_name.replace("/", "_") + fig.write_html(os.path.join(output_dir, f"{safe_name}_comparison.html")) + + return metrics + + +# %% Main +def main(): + eval_df = load_eval_sample(EVAL_SAMPLE_PATH) + notices_df = load_leaf_notices(NAF2025_NOTICES_PATH) + print(f"Loaded {len(eval_df)} labeled examples and {len(notices_df)} leaf notices") + + summary = { + model: evaluate_model(model, eval_df, notices_df, OUTPUT_DIR) for model in CANDIDATE_MODELS + } + + os.makedirs(OUTPUT_DIR, exist_ok=True) + with open(os.path.join(OUTPUT_DIR, "summary.json"), "w") as f: + json.dump(summary, f, indent=2) + print(f"\nSummary written to {OUTPUT_DIR}/summary.json") + + +if __name__ == "__main__": + main() diff --git a/evaluate_train_labels.py b/evaluate_train_labels.py new file mode 100644 index 0000000..dd3d263 --- /dev/null +++ b/evaluate_train_labels.py @@ -0,0 +1,224 @@ +""" +Audit interactif des labels du jeu d'entraînement, de bout en bout. + +On ne fait pas confiance aux labels du jeu d'entraînement (libelle -> nace2025). +Ce script enchaîne, sur un même échantillon, les briques déjà utilisées +séparément ailleurs dans le repo : + + 1. MatchVerifier juge si le label existant lui semble correct + (src/agents/closers/match_verifier.py) + 2. Les trois méthodes de classification (Navigator, Agentic-RAG, modèle + supervisé de production) proposent chacune un code (src/main.py) + 3. CodeChooser arbitre entre le label d'origine et les 3 prédictions + (src/agents/closers/code_chooser.py) + 4. MatchVerifier rejuge le choix final de CodeChooser + +C'est la démarche d'"évaluation manuelle" décrite dans +presentation/presentation.qmd (ground truth + prédiction + jugement des +closers, mis bout à bout), appliquée ici au jeu d'entraînement plutôt qu'à un +jeu de test annoté. + +Pensé pour être exécuté cellule par cellule (VS Code Jupyter interactive, ou +`quarto render evaluate_train_labels.py`) plutôt qu'en batch : les appels +`await` nécessitent un kernel Jupyter (top-level await), comme déjà fait dans +explorations.py pour classify_navigator. + +Usage : + quarto render evaluate_train_labels.py --to html +""" + +# %% Imports +import os + +import pandas as pd + +from src.agents.closers.code_chooser import CodeChoice, CodeChooser +from src.agents.closers.match_verifier import MatchVerificationInput, MatchVerifier +from src.config import neo4j_config +from src.evaluation.build_eval_set import load_dataframe +from src.evaluation.metrics import normalize_code +from src.evaluation.verify_train_labels import TRAIN_SET_PATH, verify_rows +from src.main import classify_agentic_rag, classify_navigator, classify_supervised +from src.neo4j_graph.graph import Graph + +# %% Config +# Cost per row: 1 verify + 3 reclassify + (at most) 1 arbitrate + 1 re-verify calls, +# and Navigator/Agentic-RAG are themselves multi-turn agents, so this adds up fast. +# Start small, bump this up once a run looks right. +N_SAMPLES = 10 +SEED = 42 +TEXT_COLUMN = "libelle" +CODE_COLUMN = "nace2025" +OUTPUT_PATH = "data/eval/train_verification/train_label_reclassification.parquet" + +# %% Sample the train set +df = load_dataframe(TRAIN_SET_PATH) +sample = df.sample(n=N_SAMPLES, seed=SEED) +labels = sample[TEXT_COLUMN].to_list() +train_codes = sample[CODE_COLUMN].to_list() +print(f"Sampled {len(labels)} train rows") + +graph = Graph(neo4j_config) +verifier = MatchVerifier(graph) + +# %% Step 1 - verify the original train labels +original_verifications = await verify_rows(verifier, sample.to_dicts(), TEXT_COLUMN, CODE_COLUMN) + +# %% Step 2 - reclassify with the other methods +navigator_preds = await classify_navigator(labels) +agentic_rag_preds = await classify_agentic_rag(labels) +supervised_preds = await classify_supervised(labels) + + +# %% Step 3 - arbitrate with CodeChooser among the 4 candidates +async def choose_best(activity: str, candidates: list[str | None]) -> CodeChoice | None: + """Dedupe candidate codes by normalized value, let CodeChooser pick the best. + + Returns None if the candidates all collapse to a single unique code: there is + nothing to arbitrate. + """ + unique = {} + for code in candidates: + if not code: + continue + norm = normalize_code(code) + if norm and norm not in unique: + unique[norm] = code + codes = list(unique.values()) + if len(codes) < 2: + return None + chooser = CodeChooser(graph, num_choices=len(codes)) + return await chooser(activity=activity, codes=codes) + + +chosen = [] +for i, activity in enumerate(labels): + candidates = [ + train_codes[i], + getattr(navigator_preds[i], "code", None), + getattr(agentic_rag_preds[i], "code", None), + getattr(supervised_preds[i], "code", None), + ] + chosen.append(await choose_best(activity, candidates)) + +# %% Step 4 - close the loop: re-verify CodeChooser's final pick +final_verifications = [] +for i, choice in enumerate(chosen): + if choice is None: + # Only one unique candidate: nothing was arbitrated, reuse the original verdict. + final_verifications.append(original_verifications[i]) + continue + verification = await verifier( + MatchVerificationInput( + activity=labels[i], + code=choice.chosen_code, + proposed_explanation=choice.explanation, + proposed_confidence=choice.confidence, + ) + ) + final_verifications.append( + { + "llm_is_match": verification.is_match, + "llm_confidence": verification.confidence, + "llm_explanation": verification.explanation, + } + ) + + +# %% Assemble the comparison table +def agrees(code: str | None, ref_norm: str | None) -> bool: + return bool(code) and normalize_code(code) == ref_norm + + +rows = [] +for i, activity in enumerate(labels): + ref_norm = normalize_code(train_codes[i]) + nav_code = getattr(navigator_preds[i], "code", None) + rag_code = getattr(agentic_rag_preds[i], "code", None) + sup_code = getattr(supervised_preds[i], "code", None) + choice = chosen[i] + chooser_code = choice.chosen_code if choice else train_codes[i] + + rows.append( + { + "libelle": activity, + "nace2025": train_codes[i], + "verifier_is_match": original_verifications[i]["llm_is_match"], + "verifier_confidence": original_verifications[i]["llm_confidence"], + "verifier_explanation": original_verifications[i]["llm_explanation"], + "navigator_code": nav_code, + "navigator_agrees": agrees(nav_code, ref_norm), + "agentic_rag_code": rag_code, + "agentic_rag_agrees": agrees(rag_code, ref_norm), + "supervised_code": sup_code, + "supervised_agrees": agrees(sup_code, ref_norm), + "chooser_code": chooser_code, + "chooser_confidence": choice.confidence if choice else None, + "chooser_explanation": ( + choice.explanation if choice else "Candidats identiques, pas d'arbitrage nécessaire." + ), + "chooser_agrees_with_label": agrees(chooser_code, ref_norm), + "final_verifier_is_match": final_verifications[i]["llm_is_match"], + "final_verifier_confidence": final_verifications[i]["llm_confidence"], + "final_verifier_explanation": final_verifications[i]["llm_explanation"], + } + ) + +comparison = pd.DataFrame(rows) + +os.makedirs(os.path.dirname(OUTPUT_PATH), exist_ok=True) +comparison.to_parquet(OUTPUT_PATH) +print(f"Comparison table written to {OUTPUT_PATH}") + + +# %% Display - highlighted comparison table +def highlight_disagreements(row: pd.Series) -> list[str]: + styles = [""] * len(row) + agreement_columns = { + "navigator_code": "navigator_agrees", + "agentic_rag_code": "agentic_rag_agrees", + "supervised_code": "supervised_agrees", + "chooser_code": "chooser_agrees_with_label", + } + for code_col, agree_col in agreement_columns.items(): + if not row[agree_col]: + styles[row.index.get_loc(code_col)] = "background-color: #ffcccc" + if not row["verifier_is_match"]: + styles[row.index.get_loc("nace2025")] = "background-color: #ffe0b3" + if row["final_verifier_is_match"] and not row["verifier_is_match"]: + styles[row.index.get_loc("chooser_code")] = "background-color: #ccffcc" + return styles + + +comparison.style.apply(highlight_disagreements, axis=1) + +# %% Display - summary numbers +n = len(comparison) +summary = { + "n": n, + "pct_labels_flagged_by_verifier": 1 - comparison["verifier_is_match"].mean(), + "navigator_agreement_rate": comparison["navigator_agrees"].mean(), + "agentic_rag_agreement_rate": comparison["agentic_rag_agrees"].mean(), + "supervised_agreement_rate": comparison["supervised_agrees"].mean(), + "pct_rescued_by_chooser": ( + ( + ~comparison["verifier_is_match"] + & ~comparison["chooser_agrees_with_label"] + & comparison["final_verifier_is_match"] + ).sum() + / n + if n + else None + ), +} +print(summary) + +# %% Display - standout relabeling candidates +relabeling_candidates = comparison[ + ~comparison["verifier_is_match"] + & ~comparison["chooser_agrees_with_label"] + & comparison["final_verifier_is_match"] +] +print(f"\n{len(relabeling_candidates)} candidate(s) for relabeling:") +for _, r in relabeling_candidates.iterrows(): + print(f" {r['libelle']!r}: {r['nace2025']} -> {r['chooser_code']} ({r['chooser_explanation']})") diff --git a/pyproject.toml b/pyproject.toml index 194814b..c1337bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,7 @@ requires-python = ">=3.13" dependencies = [ "duckdb>=1.4.4", "fastparquet>=2025.12.0", + "flask>=3.1.3", "ipykernel>=7.1.0", "ipywidgets>=8.1.8", "jupyter-cache>=1.0.1", @@ -37,6 +38,7 @@ dependencies = [ [dependency-groups] dev = [ + "jupytext>=1.19.4", "pre-commit>=4.5.1", "ruff>=0.14.9", ] @@ -44,9 +46,10 @@ dev = [ [tool.ruff] line-length = 100 extend-include = ["*.ipynb"] -# Cell-based script meant to be run interactively (VS Code / Jupytext), relies -# on IPython magics that are not valid standalone Python syntax. -extend-exclude = ["explorations.py"] +# Cell-based scripts meant to be run interactively (VS Code / Jupytext) or +# rendered with `quarto render`, relying on top-level `await`/IPython magics +# that are not valid standalone Python syntax. +extend-exclude = ["explorations.py", "evaluate_train_labels.py"] [tool.pytest.ini_options] pythonpath = ["."] diff --git a/src/agents/Text2Code/classifiers/base_classifier.py b/src/agents/Text2Code/classifiers/base_classifier.py index cf057c2..31454d3 100644 --- a/src/agents/Text2Code/classifiers/base_classifier.py +++ b/src/agents/Text2Code/classifiers/base_classifier.py @@ -1,6 +1,8 @@ import logging import os +from langfuse import get_client + from agents import Runner from agents.model_settings import ModelSettings from src.agents.base_agent import BaseAgent @@ -125,10 +127,19 @@ async def _run_navigator_loop( try: result = await Runner.run(self.finalize_agent, conversation, max_turns=2) final_output = result.final_output - except Exception: + except Exception as e: logger.exception( "Navigator loop: finalize call failed, falling back to current position" ) + # Don't re-raise: the fallback below lets the caller's batch loop continue + # to the next query. But without this, the exception being swallowed here + # means the enclosing @observe span (classify_navigator/classify_agentic_rag) + # completes as a normal success in Langfuse — flag it as an error explicitly + # so it's visible/filterable there instead of only in application logs. + get_client().update_current_span( + level="ERROR", + status_message=f"Finalize call failed, fell back to last position: {e}", + ) final_output = self._fallback_output(activity) logger.info(f"Result of the navigator loop: \n {final_output}") diff --git a/src/agents/closers/code_chooser.py b/src/agents/closers/code_chooser.py index 2915f18..a6598bb 100644 --- a/src/agents/closers/code_chooser.py +++ b/src/agents/closers/code_chooser.py @@ -29,7 +29,7 @@ async def __call__(self, activity: str, codes: list[str]) -> str: prompt = self.build_prompt(activity, codes) result = await Runner.run(self.agent, prompt) - return result + return result.final_output def get_agent_name(self) -> str: return "Code Chooser Agent" diff --git a/src/agents/closers/match_verifier.py b/src/agents/closers/match_verifier.py index ba5572d..b925b8c 100644 --- a/src/agents/closers/match_verifier.py +++ b/src/agents/closers/match_verifier.py @@ -18,9 +18,16 @@ def __str__(self): class MatchVerificationInput(BaseModel): activity: str = Field(description="The textual label of the activity to verify") code: str = Field(description="The code that has been associated with the activity") - proposed_explanation: str = Field(description="The explanation provided for the proposed code") - proposed_confidence: float = Field( - description="The confidence level of the proposed match, between 0 and 1", ge=0, le=1 + proposed_explanation: str | None = Field( + default=None, + description="The explanation provided for the proposed code, if any (absent for a " + "raw ground-truth label with no accompanying model rationale)", + ) + proposed_confidence: float | None = Field( + default=None, + description="The confidence level of the proposed match, between 0 and 1, if any", + ge=0, + le=1, ) @@ -33,7 +40,8 @@ def get_agent_name(self) -> str: def get_instructions(self) -> str: return """ - Tu es un agent spécialisé dans la vérification de la validité d'une correspondance entre un libellé textuel et le code qui lui a été associé. + Tu es un agent spécialisé dans la vérification de la validité d'une + correspondance entre un libellé textuel et le code qui lui a été associé. """ def get_output_type(self): @@ -43,13 +51,37 @@ def build_prompt(self, match_verification_input: MatchVerificationInput) -> str: """ Construire le prompt pour l'agent de vérification de correspondance. """ + if match_verification_input.proposed_explanation: + explanation_line = ( + f"Explication proposée : {match_verification_input.proposed_explanation}" + ) + else: + explanation_line = ( + "Aucune explication n'est fournie : il s'agit probablement d'un code de " + "référence (vérité terrain), pas de la proposition d'un modèle. Juge la " + "correspondance activité/code sur le fond, sans présumer qu'elle est correcte." + ) + + code_info = self.graph.get_code_information(match_verification_input.code) + if code_info.get("description"): + code_definition_line = ( + f"Définition officielle du code ({code_info.get('name')}) : " + f"{code_info['description']}" + ) + else: + code_definition_line = ( + "Aucune définition trouvée dans la base pour ce code : appuie-toi sur " + "ta connaissance de la nomenclature." + ) + prompt = f""" Vérifie si le code suivant correspond bien à l'activité décrite. Activité : {match_verification_input.activity} Code proposé : {match_verification_input.code} - Explication proposée : {match_verification_input.proposed_explanation} + {code_definition_line} + {explanation_line} Réponds en fournissant : 1. Un booléen indiquant si la correspondance est valide. diff --git a/src/evaluation/human_review_app.py b/src/evaluation/human_review_app.py new file mode 100644 index 0000000..f6b4a4c --- /dev/null +++ b/src/evaluation/human_review_app.py @@ -0,0 +1,485 @@ +"""Petite appli web pour l'évaluation humaine du MatchVerifier. + +Pour un échantillon de labels du jeu d'entraînement déjà jugés par +MatchVerifier (cf. src.evaluation.verify_train_labels), affiche l'activité, +le code de la vérité terrain avec sa notice officielle NACE, et le verdict +du vérificateur (is_match, confiance, justification). L'humain indique si ce +verdict est correct ("right") ou non ("wrong") ; les jugements sont +journalisés en JSONL (append-only, ré-exécutable) et servent à calculer +l'accuracy, la précision et le rappel du vérificateur. + +Le rappel/précision sont dérivés en traitant le jugement humain comme la +vérité terrain sur le match réel : si l'humain dit "right", le label réel vaut +le verdict du vérificateur ; s'il dit "wrong", le label réel est l'inverse. + +Nécessite Neo4j configuré dans l'environnement pour afficher la notice du +code (comme src.main) ; sans connexion, la revue reste possible mais sans +notice. + +Usage : + uv run -m src.evaluation.human_review_app \ + --input data/eval/train_verification/train_label_verification.parquet \ + --output data/eval/human_review/match_verifier_review.jsonl \ + --port 5050 +""" + +import argparse +import hashlib +import json +import logging +import os +from datetime import datetime, timezone + +import polars as pl +from flask import Flask, redirect, render_template_string, url_for + +from src.config import neo4j_config +from src.neo4j_graph.graph import Graph +from src.utils.logging import configure_logging + +configure_logging() +logger = logging.getLogger(__name__) + +DEFAULT_INPUT = "data/eval/train_verification/train_label_verification.parquet" +DEFAULT_OUTPUT = "data/eval/human_review/match_verifier_review.jsonl" + + +def row_id_for(libelle: str, code: str) -> str: + return hashlib.sha1(f"{libelle}|{code}".encode("utf-8")).hexdigest()[:12] + + +def load_rows(input_path: str, n: int | None, seed: int) -> list[dict]: + df = pl.read_parquet(input_path) + if n is not None and n < len(df): + df = df.sample(n=n, seed=seed) + return [ + { + "row_id": row_id_for(r["libelle"], r["nace2025"]), + "libelle": r["libelle"], + "nace2025": r["nace2025"], + "llm_is_match": bool(r["llm_is_match"]), + "llm_confidence": r["llm_confidence"], + "llm_explanation": r["llm_explanation"], + } + for r in df.to_dicts() + ] + + +def load_judgments(output_path: str) -> dict[str, dict]: + judgments = {} + if not os.path.exists(output_path): + return judgments + with open(output_path, encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + entry = json.loads(line) + judgments[entry["row_id"]] = entry + return judgments + + +def append_judgment(output_path: str, entry: dict) -> None: + os.makedirs(os.path.dirname(output_path) or ".", exist_ok=True) + with open(output_path, "a", encoding="utf-8") as f: + f.write(json.dumps(entry, ensure_ascii=False) + "\n") + + +def compute_metrics(rows: list[dict], judgments: dict[str, dict]) -> dict: + """Confusion matrix of llm_is_match (predicted) vs. human-derived actual label. + + actual = predicted if the human marked the verdict "right", else `not predicted` + (the human is asserting the verifier got it backwards). + """ + tp = fp = fn = tn = 0 + n_right = 0 + n_reviewed = 0 + for row in rows: + judgment = judgments.get(row["row_id"]) + if judgment is None: + continue + n_reviewed += 1 + predicted = row["llm_is_match"] + is_right = judgment["human_verdict"] == "right" + n_right += int(is_right) + actual = predicted if is_right else not predicted + if predicted and actual: + tp += 1 + elif predicted and not actual: + fp += 1 + elif not predicted and actual: + fn += 1 + else: + tn += 1 + + accuracy = n_right / n_reviewed if n_reviewed else None + precision = tp / (tp + fp) if (tp + fp) else None + recall = tp / (tp + fn) if (tp + fn) else None + f1 = 2 * precision * recall / (precision + recall) if precision and recall else None + + return { + "n_total": len(rows), + "n_reviewed": n_reviewed, + "accuracy": accuracy, + "precision": precision, + "recall": recall, + "f1": f1, + "tp": tp, + "fp": fp, + "fn": fn, + "tn": tn, + } + + +_code_notice_cache: dict[str, dict | None] = {} +_graph: Graph | None | bool = None + + +def get_graph() -> Graph | None: + global _graph + if _graph is None: + try: + _graph = Graph(neo4j_config) + except Exception: + logger.exception("Could not connect to Neo4j, code notices will be unavailable") + _graph = False + return _graph or None + + +def get_code_notice(code: str) -> dict | None: + if code in _code_notice_cache: + return _code_notice_cache[code] + graph = get_graph() + notice = None + if graph is not None: + try: + info = graph.get_code_information(code) + if info and not info.get("error"): + notice = info + except Exception: + logger.exception(f"Failed to fetch code information for {code}") + _code_notice_cache[code] = notice + return notice + + +STYLE = """ + +""" + +NAV = """ +

+""" + +REVIEW_TEMPLATE = ( + STYLE + + NAV + + """ +{% if existing_verdict %} +
+ Déjà jugé : verdict du vérificateur marqué {{ "correct" if existing_verdict == "right" else "incorrect" }} +
+{% endif %} + +
+
Activité ({{ idx }} / {{ total }})
+
{{ row.libelle }}
+ +
Code de la vérité terrain
+
+ {{ row.nace2025 }} + {% if notice %} — {{ notice.name }}{% endif %} +
+ + {% if notice %} +
Notice officielle NACE
+
{{ notice.description or "(pas de description)" }}
+ {% else %} +
Notice indisponible (pas de connexion Neo4j ou code introuvable).
+ {% endif %} +
+ +
+
+ {% if row.llm_is_match %} + MATCH + {% else %} + NO MATCH + {% endif %} + confiance : {{ "%.0f"|format(row.llm_confidence * 100) }}% +
+
Justification du MatchVerifier
+
{{ row.llm_explanation }}
+
+ + + + +""" +) + +METRICS_TEMPLATE = ( + STYLE + + NAV + + """ +

Métriques du MatchVerifier

+ +
+
{{ m.n_reviewed }}/{{ m.n_total }}Jugés
+
{{ "%.0f%%"|format(m.accuracy * 100) if m.accuracy is not none else "—" }}Accuracy
+
{{ "%.0f%%"|format(m.precision * 100) if m.precision is not none else "—" }}Précision
+
{{ "%.0f%%"|format(m.recall * 100) if m.recall is not none else "—" }}Rappel
+
{{ "%.0f%%"|format(m.f1 * 100) if m.f1 is not none else "—" }}F1
+
+ +

+ Accuracy = part des verdicts jugés corrects. Précision/rappel traitent + "is_match" comme prédiction positive, avec un label réel dérivé du jugement + humain (verdict inversé quand il est jugé incorrect). +

+ + + + + +
Réel : matchRéel : no match
Prédit : matchTP = {{ m.tp }}FP = {{ m.fp }}
Prédit : no matchFN = {{ m.fn }}TN = {{ m.tn }}
+ +

Lignes jugées

+ + + {% for r in rows %} + + + + + + + + {% endfor %} +
ActivitéCodeVerdict LLMJugement humain
{{ r.libelle[:60] }}{{ "…" if r.libelle|length > 60 else "" }}{{ r.nace2025 }}{{ "MATCH" if r.llm_is_match else "NO MATCH" }}{{ "correct" if r.human_verdict == "right" else "incorrect" }}revoir
+""" +) + + +class PrefixMiddleware: + """Make the app work whether or not the reverse proxy strips its own path prefix. + + Onyxia/code-server serves this app through a path-based reverse proxy + (`/proxy//...`). Whether that proxy strips the prefix before + forwarding to us, or forwards the full path unstripped, is not something + we can rely on: it 404s one way and 404s the other way if we hard-code + either assumption. So: if an incoming request's PATH_INFO still carries + the prefix, strip it ourselves before Werkzeug routes it (handles the + "forwarded unstripped" case; a no-op if the proxy already stripped it). + Either way, set SCRIPT_NAME so url_for()/redirect() re-add the prefix to + every generated link and Location header, since plain `` links in + the HTML body are never rewritten by the proxy itself. + """ + + def __init__(self, app, prefix: str): + self.app = app + self.prefix = prefix + + def __call__(self, environ, start_response): + if self.prefix: + path = environ.get("PATH_INFO", "") + if path.startswith(self.prefix): + environ["PATH_INFO"] = path[len(self.prefix) :] or "/" + environ["SCRIPT_NAME"] = self.prefix + return self.app(environ, start_response) + + +def create_app( + input_path: str, output_path: str, n: int | None, seed: int, url_prefix: str = "" +) -> Flask: + app = Flask(__name__) + if url_prefix: + app.wsgi_app = PrefixMiddleware(app.wsgi_app, url_prefix) + rows = load_rows(input_path, n, seed) + rows_by_id = {r["row_id"]: r for r in rows} + order = [r["row_id"] for r in rows] + logger.info(f"Loaded {len(rows)} rows from {input_path}") + + def first_unreviewed() -> str | None: + judgments = load_judgments(output_path) + for row_id in order: + if row_id not in judgments: + return row_id + return None + + @app.route("/") + def index(): + next_id = first_unreviewed() + if next_id is None: + return redirect(url_for("metrics")) + return redirect(url_for("review", row_id=next_id)) + + @app.route("/review/") + def review(row_id): + if row_id not in rows_by_id: + return redirect(url_for("index")) + row = rows_by_id[row_id] + judgments = load_judgments(output_path) + notice = get_code_notice(row["nace2025"]) + idx = order.index(row_id) + existing = judgments.get(row_id) + return render_template_string( + REVIEW_TEMPLATE, + row=row, + notice=notice, + idx=idx + 1, + total=len(order), + n_reviewed=len(judgments), + n_total=len(order), + prev_id=order[idx - 1] if idx > 0 else None, + next_id=order[idx + 1] if idx + 1 < len(order) else None, + existing_verdict=existing["human_verdict"] if existing else None, + ) + + @app.route("/judge//") + def judge(row_id, verdict): + if row_id not in rows_by_id or verdict not in ("right", "wrong"): + return redirect(url_for("index")) + + row = rows_by_id[row_id] + append_judgment( + output_path, + { + "row_id": row_id, + "libelle": row["libelle"], + "nace2025": row["nace2025"], + "llm_is_match": row["llm_is_match"], + "llm_confidence": row["llm_confidence"], + "llm_explanation": row["llm_explanation"], + "human_verdict": verdict, + "reviewed_at": datetime.now(timezone.utc).isoformat(), + }, + ) + + idx = order.index(row_id) + if idx + 1 < len(order): + return redirect(url_for("review", row_id=order[idx + 1])) + return redirect(url_for("index")) + + @app.route("/metrics") + def metrics(): + judgments = load_judgments(output_path) + m = compute_metrics(rows, judgments) + reviewed_rows = [ + {**row, **judgments[row["row_id"]]} for row in rows if row["row_id"] in judgments + ] + return render_template_string( + METRICS_TEMPLATE, + m=m, + rows=reviewed_rows, + n_reviewed=m["n_reviewed"], + n_total=m["n_total"], + ) + + return app + + +def main() -> int: + parser = argparse.ArgumentParser(description="Human review app for MatchVerifier") + parser.add_argument( + "--input", default=DEFAULT_INPUT, help="Parquet with libelle/nace2025/llm_* columns" + ) + parser.add_argument("--output", default=DEFAULT_OUTPUT, help="JSONL log of human judgments") + parser.add_argument("--n", type=int, default=None, help="Subsample size (default: all rows)") + parser.add_argument("--seed", type=int, default=42) + parser.add_argument("--host", default="127.0.0.1") + parser.add_argument("--port", type=int, default=5050) + parser.add_argument("--debug", action="store_true") + parser.add_argument( + "--url-prefix", + default=None, + help="Path prefix to prepend to generated links (default: auto-detect Onyxia's " + "/proxy/ reverse proxy from VSCODE_PROXY_URI; pass '' to disable)", + ) + args = parser.parse_args() + + if args.url_prefix is not None: + url_prefix = args.url_prefix + elif os.environ.get("VSCODE_PROXY_URI"): + url_prefix = f"/proxy/{args.port}" + else: + url_prefix = "" + + app = create_app(args.input, args.output, args.n, args.seed, url_prefix=url_prefix) + if url_prefix: + logger.info(f"Prefixing generated links with {url_prefix!r} (Onyxia reverse proxy)") + app.run(host=args.host, port=args.port, debug=args.debug) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/evaluation/verify_train_labels.py b/src/evaluation/verify_train_labels.py new file mode 100644 index 0000000..b6ff134 --- /dev/null +++ b/src/evaluation/verify_train_labels.py @@ -0,0 +1,122 @@ +"""Audit de la qualité des labels du jeu d'entraînement via un LLM vérificateur. + +Tire un échantillon aléatoire du jeu d'entraînement et demande au MatchVerifier +s'il pense que le code associé à chaque libellé est correct. Ne compare pas à +une prédiction de modèle : c'est un contrôle qualité du label de référence +lui-même (cf. src.evaluation.run_eval pour l'évaluation d'un classifieur). + +Nécessite à l'exécution : la base Neo4j et l'API LLM configurées dans +l'environnement (mêmes prérequis que src.main). + +Usage : + uv run -m src.evaluation.verify_train_labels \ + --train-set projet-ape/data/08112022_27102024/naf2025/split/df_train.parquet \ + --n-samples 200 \ + --output data/eval/train_verification +""" + +import argparse +import asyncio +import json +import logging +import os + +import polars as pl + +from src.agents.closers.match_verifier import MatchVerificationInput, MatchVerifier +from src.config import neo4j_config +from src.evaluation.build_eval_set import load_dataframe +from src.neo4j_graph.graph import Graph +from src.utils.logging import configure_logging + +configure_logging() +logger = logging.getLogger(__name__) + +TRAIN_SET_PATH = "projet-ape/data/08112022_27102024/naf2025/split/df_train.parquet" + + +async def verify_rows( + verifier: MatchVerifier, rows: list[dict], text_column: str, code_column: str +) -> list[dict]: + """Verify each row's existing (text, code) label with MatchVerifier. + + No `proposed_explanation`/`proposed_confidence` is passed, so the verifier + treats each code as a raw ground-truth label rather than a model's guess + (cf. the "no explanation provided" prompt branch in MatchVerifier). + """ + results = [] + for i, row in enumerate(rows, 1): + text = row[text_column] + code = row[code_column] + logger.info(f"{i}/{len(rows)}: {text!r} -> {code}") + + verification = await verifier(MatchVerificationInput(activity=text, code=str(code))) + results.append( + { + text_column: text, + code_column: code, + "llm_is_match": verification.is_match, + "llm_confidence": verification.confidence, + "llm_explanation": verification.explanation, + } + ) + return results + + +async def run(args) -> int: + df = load_dataframe(args.train_set) + sample = df.sample(n=min(args.n_samples, len(df)), seed=args.seed) + logger.info(f"Verifying {len(sample)} train labels with MatchVerifier") + + verifier = MatchVerifier(Graph(neo4j_config)) + results = await verify_rows(verifier, sample.to_dicts(), args.text_column, args.code_column) + + details = pl.DataFrame(results) + n = len(details) + n_flagged = int((~details["llm_is_match"]).sum()) if n else 0 + summary = { + "n": n, + "n_flagged": n_flagged, + "agreement_rate": (1 - n_flagged / n) if n else None, + "mean_llm_confidence": float(details["llm_confidence"].mean()) if n else None, + } + + os.makedirs(args.output, exist_ok=True) + details_path = os.path.join(args.output, "train_label_verification.parquet") + details.write_parquet(details_path) + summary_path = os.path.join(args.output, "train_label_verification_summary.json") + with open(summary_path, "w", encoding="utf-8") as f: + json.dump(summary, f, indent=2, ensure_ascii=False) + + print(json.dumps(summary, indent=2, ensure_ascii=False)) + + flagged = details.filter(~pl.col("llm_is_match")) + if len(flagged): + print("\nFlagged rows (LLM thinks the label may be wrong):") + for r in flagged.to_dicts(): + print(f" {r[args.text_column]!r} -> {r[args.code_column]}: {r['llm_explanation']}") + + logger.info(f"Details written to {details_path}, summary to {summary_path}") + return 0 + + +def main() -> int: + parser = argparse.ArgumentParser(description="Verify a sample of train-set labels with an LLM") + parser.add_argument( + "--train-set", default=TRAIN_SET_PATH, help="Train parquet (local path or S3 key)" + ) + parser.add_argument("--text-column", default="libelle", help="Text column (default: libelle)") + parser.add_argument( + "--code-column", default="nace2025", help="Label column (default: nace2025)" + ) + parser.add_argument( + "--n-samples", type=int, default=200, help="Number of rows to sample (default: 200)" + ) + parser.add_argument("--seed", type=int, default=42, help="Sampling seed (default: 42)") + parser.add_argument("--output", default="data/eval/train_verification", help="Output directory") + args = parser.parse_args() + return asyncio.run(run(args)) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/main.py b/src/main.py index 3499380..5426939 100644 --- a/src/main.py +++ b/src/main.py @@ -19,7 +19,7 @@ logger = logging.getLogger(__name__) -# @observe +@observe async def classify_navigator( query: str | list[str], experiment_name: str = "Navigator Classification" ): @@ -32,13 +32,16 @@ async def classify_navigator( Returns: Single result dict if query is str, list of result dicts if query is list """ + get_client().update_current_trace( + name=experiment_name, tags=[experiment_name], metadata={"experiment_name": experiment_name} + ) + # Normalize input to always work with a list queries = [query] if isinstance(query, str) else query is_single = isinstance(query, str) logger.info(f"Navigator classification: {len(queries)} query/queries") - # TODO: add the management for exp_name navigator = Navigator(neo4j_config) results = [] @@ -73,6 +76,10 @@ async def classify_agentic_rag( Returns: Single MatchVerificationInput if query is str, list of them if query is list """ + get_client().update_current_trace( + name=experiment_name, tags=[experiment_name], metadata={"experiment_name": experiment_name} + ) + queries = [query] if isinstance(query, str) else query is_single = isinstance(query, str) @@ -109,6 +116,10 @@ async def classify_supervised( Returns: Single MatchVerificationInput if query is str, list of them if query is list """ + get_client().update_current_trace( + name=experiment_name, tags=[experiment_name], metadata={"experiment_name": experiment_name} + ) + queries = [query] if isinstance(query, str) else query is_single = isinstance(query, str) @@ -146,6 +157,10 @@ async def process_batch_file( filepath: str, method_func, experiment_name: str, verifier: MatchVerifier | None = None ): """Process a batch file with queries""" + get_client().update_current_trace( + name=experiment_name, tags=[experiment_name], metadata={"experiment_name": experiment_name} + ) + logger.info(f"Processing batch file: {filepath}") with open(filepath, "r", encoding="utf-8") as f: diff --git a/src/navigator/navigator.py b/src/navigator/navigator.py index af97bfa..467f211 100644 --- a/src/navigator/navigator.py +++ b/src/navigator/navigator.py @@ -2,14 +2,14 @@ from typing import Any, Dict, List, Optional from agents import function_tool -from src.neo4j_graph.graph import Graph, Neo4JConfig, _unfreeze_dict, _unfreeze_list_of_dicts +from src.neo4j_graph.graph import Graph, Neo4JConfig logger = logging.getLogger(__name__) def make_tools(navigator): def _children_summary(code: str) -> List[Dict[str, Any]]: - children_found = _unfreeze_list_of_dicts(navigator._cached_get_children(code)) + children_found = navigator.get_children(code) keys_to_keep = ["code", "name", "is_final"] return [{k: d[k] for k in keys_to_keep} for d in children_found] @@ -47,7 +47,7 @@ def get_current_information() -> Dict[str, Any]: return result # Cas normal (pas root) - data = _unfreeze_dict(navigator._cached_get_code_information(navigator.current_code)) + data = navigator.get_code_information(navigator.current_code) if not data: logger.warning(f"No data for code: {navigator.current_code}") return { @@ -81,7 +81,7 @@ def get_code_information(code: str) -> Dict[str, Any]: """ logger.info(f"Navigator: get_code_information called with code {code}") - data = navigator._cached_get_code_information(code) + data = navigator.get_code_information(code) if not data: logger.info(f"No data for the code: {code}") @@ -91,8 +91,6 @@ def get_code_information(code: str) -> Dict[str, Any]: "current_position": navigator.current_code, } - data = _unfreeze_dict(data) - filtered_data = { "success": True, "code": data.get("code"), @@ -133,7 +131,7 @@ def get_current_siblings() -> List[Dict[str, Any]]: Liste des siblings du noeud courant """ logger.info("Navigator: get_current_siblings called") - result = _unfreeze_list_of_dicts(navigator._cached_get_siblings(navigator.current_code)) + result = navigator.get_siblings(navigator.current_code) logger.info(f"get_current_siblings: Data sent to the llm: {result}") return result @@ -146,8 +144,7 @@ def get_current_parent() -> Optional[Dict[str, Any]]: Dictionnaire du parent ou None si pas de parent """ logger.info("Navigator: get_current_parent called") - data = navigator._cached_get_parent(navigator.current_code) - result = _unfreeze_dict(data) if data else None + result = navigator.get_parent(navigator.current_code) logger.info(f"get_current_parent: Data sent to the llm: {result}") return result @@ -200,7 +197,7 @@ def go_to_parent() -> Dict[str, Any]: Résultat de la navigation avec informations du parent et ses enfants """ logger.info("Navigator: go_to_parent called") - parent_info = _unfreeze_dict(navigator._cached_get_parent(navigator.current_code)) + parent_info = navigator.get_parent(navigator.current_code) if parent_info is None: logger.warning("parent_info is None, go_to_parent failed") return { @@ -249,7 +246,7 @@ def go_to_child(child_code: str) -> Dict[str, Any]: """ logger.info(f"Navigator: go_to_child called with child_code: {child_code}") - children = _unfreeze_list_of_dicts(navigator._cached_get_children(navigator.current_code)) + children = navigator.get_children(navigator.current_code) child_codes = [child["code"] for child in children] if child_code not in child_codes: @@ -347,5 +344,5 @@ def is_current_final(self) -> bool: (never from the model's self-reported completion).""" if self.current_code == "root": return False - data = _unfreeze_dict(self._cached_get_code_information(self.current_code)) + data = self.get_code_information(self.current_code) return bool(data.get("is_final")) if data else False diff --git a/src/neo4j_graph/graph.py b/src/neo4j_graph/graph.py index 97b6f46..5c9f453 100644 --- a/src/neo4j_graph/graph.py +++ b/src/neo4j_graph/graph.py @@ -45,8 +45,8 @@ def get_code_information(code: str) -> Dict[str, Any]: Dictionnaire avec code, level, name, description, includes, includes_also, excludes, implementation_rule, parent_code, children_codes, children_count """ - data = graph._cached_get_code_information(code) - return _unfreeze_dict(data) if data else {"error": f"Code {code} not found"} + data = graph.get_code_information(code) + return data if data else {"error": f"Code {code} not found"} @function_tool def get_children(code: str) -> List[Dict[str, Any]]: @@ -59,7 +59,7 @@ def get_children(code: str) -> List[Dict[str, Any]]: Returns: Liste des codes enfants avec code, level, name, description, includes, excludes """ - return _unfreeze_list_of_dicts(graph._cached_get_children(code)) + return graph.get_children(code) @function_tool def get_descendants(code: str, levels: int = 2) -> List[Dict[str, Any]]: @@ -73,7 +73,7 @@ def get_descendants(code: str, levels: int = 2) -> List[Dict[str, Any]]: Returns: Liste de tous les descendants jusqu'au niveau spécifié """ - return _unfreeze_list_of_dicts(graph._cached_get_descendants(code, levels)) + return graph.get_descendants(code, levels) @function_tool def get_siblings(code: str) -> List[Dict[str, Any]]: @@ -86,7 +86,7 @@ def get_siblings(code: str) -> List[Dict[str, Any]]: Returns: Liste des codes siblings (excluant le code d'origine) """ - return _unfreeze_list_of_dicts(graph._cached_get_siblings(code)) + return graph.get_siblings(code) @function_tool def get_parent(code: str) -> Optional[Dict[str, Any]]: @@ -99,8 +99,7 @@ def get_parent(code: str) -> Optional[Dict[str, Any]]: Returns: Dictionnaire du parent ou None si pas de parent """ - data = graph._cached_get_parent(code) - return _unfreeze_dict(data) if data else None + return graph.get_parent(code) return [get_code_information, get_children, get_descendants, get_siblings, get_parent] @@ -125,6 +124,7 @@ def __init__(self, neo4j_config: Neo4JConfig) -> None: model=os.environ["EMBEDDING_MODEL"], openai_api_base=os.environ["URL_EMBEDDING_API"], openai_api_key=os.environ["OPENAI_API_KEY"], + check_embedding_ctx_length=False, ) self.db = Neo4jVector.from_existing_graph( @@ -138,7 +138,7 @@ def __init__(self, neo4j_config: Neo4JConfig) -> None: search_type="vector", ) - except Exception as e: + except Exception as e: logger.info(f"Not able to connect to the embedder: {e}") # ------------------------------------------------------------------ @@ -154,6 +154,46 @@ def get_tools(self): """ return make_tools(self) + def _with_dotted_retry(self, code: str, fetch): + """Call `fetch(code)`, retrying once on a dotted variant if it comes back empty. + + Les noeuds du graphe utilisent un code pointé (ex: "85.51Y"), alors que les + jeux de données bruts type NAF et l'API codif-ape en donnent la forme non + pointée (ex: "8551Y"). Si le code tel quel ne matche aucun noeud, on retente + avec un point inséré après les 2 premiers caractères. Partagé par tous les + lookups par code (get_code_information, get_children, get_descendants, + get_siblings, get_parent) plutôt que dupliqué dans chacun. + """ + data = fetch(code) + if not data and "." not in code and len(code) > 2: + data = fetch(f"{code[:2]}.{code[2:]}") + return data + + def get_code_information(self, code: str) -> Dict[str, Any]: + """Retourne les informations d'un code (nom, description, parent, enfants).""" + data = self._with_dotted_retry(code, self._cached_get_code_information) + return _unfreeze_dict(data) if data else {} + + def get_children(self, code: str) -> List[Dict[str, Any]]: + """Retourne les enfants directs d'un code (niveau N+1).""" + data = self._with_dotted_retry(code, self._cached_get_children) + return _unfreeze_list_of_dicts(data) if data else [] + + def get_descendants(self, code: str, levels: int = 2) -> List[Dict[str, Any]]: + """Retourne les descendants d'un code jusqu'à N niveaux de profondeur.""" + data = self._with_dotted_retry(code, lambda c: self._cached_get_descendants(c, levels)) + return _unfreeze_list_of_dicts(data) if data else [] + + def get_siblings(self, code: str) -> List[Dict[str, Any]]: + """Retourne les codes au même niveau hiérarchique (même parent).""" + data = self._with_dotted_retry(code, self._cached_get_siblings) + return _unfreeze_list_of_dicts(data) if data else [] + + def get_parent(self, code: str) -> Optional[Dict[str, Any]]: + """Retourne le parent direct d'un code (niveau N-1), ou None si pas de parent.""" + data = self._with_dotted_retry(code, self._cached_get_parent) + return _unfreeze_dict(data) if data else None + async def get_closest_codes(self, activity: str, top_k: int = 5) -> List[str]: retrieval = await self.db.asimilarity_search( f"query : {activity}", k=top_k, filter={"FINAL": 1} @@ -285,7 +325,7 @@ def _cached_get_parent(self, code: str) -> Tuple[Tuple[str, Any], ...]: return _freeze_dict(result[0]) # ------------------------------------------------------------------ - # search_codes + # search_codes # ------------------------------------------------------------------ @lru_cache(maxsize=0) @@ -296,7 +336,7 @@ def _cached_search_codes(self, search_term: str) -> Tuple[Tuple[Tuple[str, Any], OR toLower(node.text) CONTAINS toLower($search_term) RETURN node.CODE as code, node.LEVEL as level, - node.FINAL as is_final, + node.FINAL as is_final, node.NAME as name, node.text as description ORDER BY node.LEVEL, node.CODE diff --git a/uv.lock b/uv.lock index a0f561c..acb4b81 100644 --- a/uv.lock +++ b/uv.lock @@ -986,6 +986,7 @@ source = { virtual = "." } dependencies = [ { name = "duckdb" }, { name = "fastparquet" }, + { name = "flask" }, { name = "ipykernel" }, { name = "ipywidgets" }, { name = "jupyter-cache" }, @@ -1016,6 +1017,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "jupytext" }, { name = "pre-commit" }, { name = "ruff" }, ] @@ -1024,6 +1026,7 @@ dev = [ requires-dist = [ { name = "duckdb", specifier = ">=1.4.4" }, { name = "fastparquet", specifier = ">=2025.12.0" }, + { name = "flask", specifier = ">=3.1.3" }, { name = "ipykernel", specifier = ">=7.1.0" }, { name = "ipywidgets", specifier = ">=8.1.8" }, { name = "jupyter-cache", specifier = ">=1.0.1" }, @@ -1054,6 +1057,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "jupytext", specifier = ">=1.19.4" }, { name = "pre-commit", specifier = ">=4.5.1" }, { name = "ruff", specifier = ">=0.14.9" }, ] @@ -1103,7 +1107,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/2f/28592176381b9ab2cafa12829ba7b472d177f3acc35d8fbcf3673d966fff/greenlet-3.3.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:a1e41a81c7e2825822f4e068c48cb2196002362619e2d70b148f20a831c00739", size = 275140, upload-time = "2025-12-04T14:23:01.282Z" }, { url = "https://files.pythonhosted.org/packages/2c/80/fbe937bf81e9fca98c981fe499e59a3f45df2a04da0baa5c2be0dca0d329/greenlet-3.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f515a47d02da4d30caaa85b69474cec77b7929b2e936ff7fb853d42f4bf8808", size = 599219, upload-time = "2025-12-04T14:50:08.309Z" }, { url = "https://files.pythonhosted.org/packages/c2/ff/7c985128f0514271b8268476af89aee6866df5eec04ac17dcfbc676213df/greenlet-3.3.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d2d9fd66bfadf230b385fdc90426fcd6eb64db54b40c495b72ac0feb5766c54", size = 610211, upload-time = "2025-12-04T14:57:43.968Z" }, - { url = "https://files.pythonhosted.org/packages/79/07/c47a82d881319ec18a4510bb30463ed6891f2ad2c1901ed5ec23d3de351f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30a6e28487a790417d036088b3bcb3f3ac7d8babaa7d0139edbaddebf3af9492", size = 624311, upload-time = "2025-12-04T15:07:14.697Z" }, { url = "https://files.pythonhosted.org/packages/fd/8e/424b8c6e78bd9837d14ff7df01a9829fc883ba2ab4ea787d4f848435f23f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:087ea5e004437321508a8d6f20efc4cfec5e3c30118e1417ea96ed1d93950527", size = 612833, upload-time = "2025-12-04T14:26:03.669Z" }, { url = "https://files.pythonhosted.org/packages/b5/ba/56699ff9b7c76ca12f1cdc27a886d0f81f2189c3455ff9f65246780f713d/greenlet-3.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab97cf74045343f6c60a39913fa59710e4bd26a536ce7ab2397adf8b27e67c39", size = 1567256, upload-time = "2025-12-04T15:04:25.276Z" }, { url = "https://files.pythonhosted.org/packages/1e/37/f31136132967982d698c71a281a8901daf1a8fbab935dce7c0cf15f942cc/greenlet-3.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5375d2e23184629112ca1ea89a53389dddbffcf417dad40125713d88eb5f96e8", size = 1636483, upload-time = "2025-12-04T14:27:30.804Z" }, @@ -1111,7 +1114,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/7c/f0a6d0ede2c7bf092d00bc83ad5bafb7e6ec9b4aab2fbdfa6f134dc73327/greenlet-3.3.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:60c2ef0f578afb3c8d92ea07ad327f9a062547137afe91f38408f08aacab667f", size = 275671, upload-time = "2025-12-04T14:23:05.267Z" }, { url = "https://files.pythonhosted.org/packages/44/06/dac639ae1a50f5969d82d2e3dd9767d30d6dbdbab0e1a54010c8fe90263c/greenlet-3.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a5d554d0712ba1de0a6c94c640f7aeba3f85b3a6e1f2899c11c2c0428da9365", size = 646360, upload-time = "2025-12-04T14:50:10.026Z" }, { url = "https://files.pythonhosted.org/packages/e0/94/0fb76fe6c5369fba9bf98529ada6f4c3a1adf19e406a47332245ef0eb357/greenlet-3.3.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3a898b1e9c5f7307ebbde4102908e6cbfcb9ea16284a3abe15cab996bee8b9b3", size = 658160, upload-time = "2025-12-04T14:57:45.41Z" }, - { url = "https://files.pythonhosted.org/packages/93/79/d2c70cae6e823fac36c3bbc9077962105052b7ef81db2f01ec3b9bf17e2b/greenlet-3.3.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dcd2bdbd444ff340e8d6bdf54d2f206ccddbb3ccfdcd3c25bf4afaa7b8f0cf45", size = 671388, upload-time = "2025-12-04T15:07:15.789Z" }, { url = "https://files.pythonhosted.org/packages/b8/14/bab308fc2c1b5228c3224ec2bf928ce2e4d21d8046c161e44a2012b5203e/greenlet-3.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5773edda4dc00e173820722711d043799d3adb4f01731f40619e07ea2750b955", size = 660166, upload-time = "2025-12-04T14:26:05.099Z" }, { url = "https://files.pythonhosted.org/packages/4b/d2/91465d39164eaa0085177f61983d80ffe746c5a1860f009811d498e7259c/greenlet-3.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac0549373982b36d5fd5d30beb8a7a33ee541ff98d2b502714a09f1169f31b55", size = 1615193, upload-time = "2025-12-04T15:04:27.041Z" }, { url = "https://files.pythonhosted.org/packages/42/1b/83d110a37044b92423084d52d5d5a3b3a73cafb51b547e6d7366ff62eff1/greenlet-3.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d198d2d977460358c3b3a4dc844f875d1adb33817f0613f663a656f463764ccc", size = 1683653, upload-time = "2025-12-04T14:27:32.366Z" }, @@ -1119,7 +1121,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/66/bd6317bc5932accf351fc19f177ffba53712a202f9df10587da8df257c7e/greenlet-3.3.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d6ed6f85fae6cdfdb9ce04c9bf7a08d666cfcfb914e7d006f44f840b46741931", size = 282638, upload-time = "2025-12-04T14:25:20.941Z" }, { url = "https://files.pythonhosted.org/packages/30/cf/cc81cb030b40e738d6e69502ccbd0dd1bced0588e958f9e757945de24404/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9125050fcf24554e69c4cacb086b87b3b55dc395a8b3ebe6487b045b2614388", size = 651145, upload-time = "2025-12-04T14:50:11.039Z" }, { url = "https://files.pythonhosted.org/packages/9c/ea/1020037b5ecfe95ca7df8d8549959baceb8186031da83d5ecceff8b08cd2/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:87e63ccfa13c0a0f6234ed0add552af24cc67dd886731f2261e46e241608bee3", size = 654236, upload-time = "2025-12-04T14:57:47.007Z" }, - { url = "https://files.pythonhosted.org/packages/69/cc/1e4bae2e45ca2fa55299f4e85854606a78ecc37fead20d69322f96000504/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2662433acbca297c9153a4023fe2161c8dcfdcc91f10433171cf7e7d94ba2221", size = 662506, upload-time = "2025-12-04T15:07:16.906Z" }, { url = "https://files.pythonhosted.org/packages/57/b9/f8025d71a6085c441a7eaff0fd928bbb275a6633773667023d19179fe815/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3c6e9b9c1527a78520357de498b0e709fb9e2f49c3a513afd5a249007261911b", size = 653783, upload-time = "2025-12-04T14:26:06.225Z" }, { url = "https://files.pythonhosted.org/packages/f6/c7/876a8c7a7485d5d6b5c6821201d542ef28be645aa024cfe1145b35c120c1/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:286d093f95ec98fdd92fcb955003b8a3d054b4e2cab3e2707a5039e7b50520fd", size = 1614857, upload-time = "2025-12-04T15:04:28.484Z" }, { url = "https://files.pythonhosted.org/packages/4f/dc/041be1dff9f23dac5f48a43323cd0789cb798342011c19a248d9c9335536/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c10513330af5b8ae16f023e8ddbfb486ab355d04467c4679c5cfe4659975dd9", size = 1676034, upload-time = "2025-12-04T14:27:33.531Z" }, @@ -1580,6 +1581,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, ] +[[package]] +name = "jupytext" +version = "1.19.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/52/e014296ac8f40ca783aeb73dae52e65edbb0eaae0dcdc1ea41bfaa8aebf7/jupytext-1.19.4.tar.gz", hash = "sha256:739bcd4bc12aa4fe298a38017cdb5ae27b08a6ba3a5470728d2fe9e04b155db1", size = 4581977, upload-time = "2026-06-21T21:48:58.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/e9/e2ae007456069dbe01865c69a4203a7ada6f7e337b78fc2f12e51bd3fae7/jupytext-1.19.4-py3-none-any.whl", hash = "sha256:032d4ef4bd2e96addcac780b9b1d6b5a266ca39beceaaca95bfb4f06e0b77029", size = 170889, upload-time = "2026-06-21T21:48:56.352Z" }, +] + [[package]] name = "kiwisolver" version = "1.4.9" @@ -1878,6 +1895,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bc/b1/a0ec7a5a9db730a08daef1fdfb8090435b82465abbf758a596f0ea88727e/mako-1.3.12-py3-none-any.whl", hash = "sha256:8f61569480282dbf557145ce441e4ba888be453c30989f879f0d652e39f53ea9", size = 78521, upload-time = "2026-04-28T19:01:10.393Z" }, ] +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + [[package]] name = "markupsafe" version = "3.0.3" @@ -2026,6 +2055,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/0d/5cf14e177c8ae655a2fd9324a6ef657ca4cafd3fc2201c87716055e29641/mcp-1.24.0-py3-none-any.whl", hash = "sha256:db130e103cc50ddc3dffc928382f33ba3eaef0b711f7a87c05e7ded65b1ca062", size = 232896, upload-time = "2025-12-12T14:19:36.14Z" }, ] +[[package]] +name = "mdit-py-plugins" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "mlflow" version = "3.14.0" From 4aac712eb9200679505c6fa943644addd6ef289f Mon Sep 17 00:00:00 2001 From: theof Date: Thu, 9 Jul 2026 16:45:23 +0000 Subject: [PATCH 17/18] docs: reflect 9/07 Langfuse fixes and Agentic RAG warm-start redesign MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cadrage_2026-07.md and framework.md §6.1 both still described the Langfuse tracing gaps (audit du 8/07) as pending code fixes; the fixes themselves landed today (@observe on classify_navigator, --experiment-name attached to the trace, ERROR span on finalize failure). Mark them done, keep the still-open langfuse.flush()/shutdown() item. - cadrage §2.2's Agentic RAG bullet still described the pre-8/07 design (embedding search + CodeChooser arbitration); the classifier was redesigned that day to use the closest code as a Navigator warm-start instead. Note the redesign explicitly. --- docs/cadrage_2026-07.md | 8 ++++---- docs/framework.md | 13 ++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/cadrage_2026-07.md b/docs/cadrage_2026-07.md index b6557da..bc23614 100644 --- a/docs/cadrage_2026-07.md +++ b/docs/cadrage_2026-07.md @@ -49,7 +49,7 @@ Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre ### 2.2 Ce qui ne fonctionne pas encore -- **Le classifieur « Agentic RAG »** (approche alternative combinant recherche par embeddings + *CodeChooser*) n'est pas branché dans le pipeline principal : `main.py` appelle aujourd'hui une fonction *stub* (`classify_agentic_rag`) qui renvoie une valeur codée en dur. → **Corrigé le 6/07** : le classifieur est branché dans la CLI (`--agentic-rag`) ; validation fonctionnelle sur la base Neo4j à faire. +- **Le classifieur « Agentic RAG »** (approche alternative combinant recherche par embeddings + *CodeChooser*) n'est pas branché dans le pipeline principal : `main.py` appelle aujourd'hui une fonction *stub* (`classify_agentic_rag`) qui renvoie une valeur codée en dur. → **Corrigé le 6/07** : le classifieur est branché dans la CLI (`--agentic-rag`) ; validation fonctionnelle sur la base Neo4j à faire. **Redesigné le 8/07** : l'approche n'arbitre plus entre des candidats via *CodeChooser*, mais utilise le code le plus proche par similarité d'embeddings comme simple *point de départ* (*warm start*), que l'agent *Navigator* vérifie et corrige ensuite via ses outils habituels (cf. §2.2 ci-dessous et `docs/framework.md` §5.2) — voir aussi le résultat préoccupant du diagnostic de l'espace d'embedding qui sous-tend ce point de départ. - **Le chaînage *Navigator* → *MatchVerifier*** n'est pas encore implémenté : le *Navigator* s'arrête aujourd'hui dès qu'il atteint un code terminal, sans double vérification automatique par un second agent. C'est pourtant l'articulation nécessaire au cas d'usage « monitoring en production ». → **Implémenté le 6/07** via l'option `--verify` de la CLI (en mode unitaire comme en batch) ; validation fonctionnelle sur données réelles à faire. - **Aucune méthodologie d'évaluation n'est encore formalisée** : ni jeu de données de référence versionné, ni métriques automatisées, ni tableau de bord de suivi. À ce stade, l'évaluation n'existe qu'à l'état de script exploratoire ponctuel (projection UMAP/PaCMAP/t-SNE/PCA des embeddings, calcul de k-plus-proches-voisins). C'est le chantier prioritaire du mois (cf. §3). → **Socle posé et jeu d'évaluation construit le 6/07** : module `src/evaluation/` (métriques d'exactitude à la feuille et par niveau hiérarchique testées unitairement, échantillonnage stratifié reproductible, harnais de campagne) ; **`data/eval/eval_set.parquet` est constitué et versionné** (5 181 lignes, stratifié par code complet `apet2025`, ~10 exemples/code). Restent à mener : les campagnes chiffrées elles-mêmes (S3). - **L'espace d'embedding utilisé par l'Agentic RAG comme *warm start* n'avait jamais été évalué formellement**, seulement via le script exploratoire ponctuel ci-dessus (`explorations.py`). → **Diagnostic formalisé le 8/07** : `evaluate_embeddings.py` (script autonome, hors `src/evaluation/`) calcule l'accuracy@1 / recall@5 d'un k-NN cosinus libellé → notice sur `data/eval/eval_set_sample15.parquet` / `eval_set_sample30.parquet`, avec projections UMAP/PaCMAP/t-SNE/PCA et comparaison multi-modèles. **Premier résultat préoccupant** : avec le modèle actuellement configuré (`qwen3-embedding-8b`), accuracy@1 = recall@5 = 0 % sur l'échantillon de 30 libellés (ex. « FOOTBALL FEMININ » classé 373ᵉ/747 par similarité cosinus à sa propre notice). Cause probable non tranchée (modèle non adapté au domaine, ou format d'instruction spécifique attendu par ce modèle différent du préfixe générique `"query : "` câblé dans `Graph.get_closest_codes`) — à investiguer avant de considérer l'Agentic RAG comme fiable. @@ -58,7 +58,7 @@ Ce positionnement conditionne la roadmap : la priorité n'est pas de « battre - **La génération synthétique agentique** (*Code2Text*, par opposition à l'approche *Naive*) est au stade de squelette de code, non encore évaluée ni comparée à l'approche naïve. - **Aucune intégration continue (CI) ne teste le code applicatif** : les deux workflows GitHub existants ne font que déployer les slides de présentation et les embeddings, sans exécuter de tests. → **Corrigé le 6/07** : workflow CI ajouté (lint `ruff`, vérification de syntaxe, tests unitaires). - **Pas encore de documentation technique détaillée du framework**, au-delà du README et de la présentation de démonstration — c'est l'objet du chantier lancé cette semaine (cf. §4). -- **Le traçage Langfuse est incomplet** (audit du 8/07, cf. `docs/framework.md` §6.1) : `classify_navigator` (chemin agentique principal) n'est pas tracé (`@observe` commenté), le repli de finalisation ajouté à `_run_navigator_loop` masque les échecs plutôt que de les faire remonter en erreur dans les traces, `--experiment-name` n'est pas réellement attaché aux traces Langfuse malgré ce qu'indique `framework.md` §4, et les variables `LANGFUSE_*` n'étaient pas documentées (corrigé le 8/07). +- **Le traçage Langfuse était incomplet** (audit du 8/07, cf. `docs/framework.md` §6.1) : `classify_navigator` (chemin agentique principal) n'était pas tracé (`@observe` commenté), le repli de finalisation ajouté à `_run_navigator_loop` masquait les échecs plutôt que de les faire remonter en erreur dans les traces, `--experiment-name` n'était pas réellement attaché aux traces Langfuse malgré ce qu'indiquait `framework.md` §4, et les variables `LANGFUSE_*` n'étaient pas documentées (documentation corrigée le 8/07). → **Correctifs de code faits le 9/07** : `@observe` ré-activé sur `classify_navigator`, échecs de finalisation remontés en `ERROR` sur le span courant, `--experiment-name` propagé à la trace (nom/tag/métadonnée) dans les quatre points d'entrée. Reste à faire : `langfuse.flush()`/`shutdown()` explicite avant sortie CLI (cf. `docs/framework.md` §6.1). ### 2.3 Synthèse @@ -88,7 +88,7 @@ Méthode retenue pour l'évaluation du classifieur (*Navigator*, et *Agentic RAG **A. Fiabilisation et industrialisation du framework** - **Nettoyage du dépôt** : suppression du code mort, structuration des scripts exploratoires (`explorations.py`), mise en cohérence des modules d'agents, mise en place d'une CI minimale (lint, vérification d'import) pour éviter que des fichiers cassés comme ceux identifiés en §2.2 ne passent inaperçus. - Réparation et **branchement effectif du chaînage *Navigator* → *MatchVerifier*** (nécessaire au cas d'usage monitoring). -- **Réparation du traçage Langfuse** (audit du 8/07, cf. `docs/framework.md` §6.1) : ré-activer `@observe` sur `classify_navigator`, faire remonter en erreur les échecs de finalisation capturés par `_fallback_output`, propager réellement `--experiment-name` à la trace (nom/tag/métadonnée plutôt que simple argument de log). +- **Réparation du traçage Langfuse** (audit du 8/07, cf. `docs/framework.md` §6.1) : ré-activer `@observe` sur `classify_navigator`, faire remonter en erreur les échecs de finalisation capturés par `_fallback_output`, propager réellement `--experiment-name` à la trace (nom/tag/métadonnée plutôt que simple argument de log). → **Fait le 9/07** ; reste `langfuse.flush()`/`shutdown()` explicite avant sortie CLI. - **Automatisation de la pipeline d'évaluation via Argo Workflows** (déjà utilisé pour l'entraînement du modèle supervisé de production) : exécuter le jeu d'évaluation de façon reproductible et programmée, avec des métriques versionnées à chaque évolution du framework, plutôt que des lancements manuels ponctuels. **B. Diagnostic et évaluation** @@ -114,7 +114,7 @@ Méthode retenue pour l'évaluation du classifieur (*Navigator*, et *Agentic RAG | Semaine | Dates | Objectifs | |---|---|---| -| **S1** | 6 → 11 juillet | Corriger le bug bloquant (`agentic_rag.py`) et **nettoyer le dépôt** (code mort, artefacts de build committés par erreur, structuration des scripts exploratoires, CI minimale de lint/import) pour fiabiliser la base de code. Poser les bases de la **documentation détaillée du framework** (architecture, modèle de données, contrats des agents — voir §4), première brique valorisable en document de travail DMCSI. **Réparer le traçage Langfuse** (audit du 8/07, cf. §3.3-A) : tracer `classify_navigator`, faire remonter les échecs de finalisation, propager `--experiment-name` aux traces, documenter les variables `LANGFUSE_*` — ✅ documentation faite le 8/07, correctifs de code à faire. | +| **S1** | 6 → 11 juillet | Corriger le bug bloquant (`agentic_rag.py`) et **nettoyer le dépôt** (code mort, artefacts de build committés par erreur, structuration des scripts exploratoires, CI minimale de lint/import) pour fiabiliser la base de code. Poser les bases de la **documentation détaillée du framework** (architecture, modèle de données, contrats des agents — voir §4), première brique valorisable en document de travail DMCSI. **Réparer le traçage Langfuse** (audit du 8/07, cf. §3.3-A) : tracer `classify_navigator`, faire remonter les échecs de finalisation, propager `--experiment-name` aux traces, documenter les variables `LANGFUSE_*` — ✅ fait le 9/07 (documentation le 8/07, correctifs de code le 9/07) ; reste `langfuse.flush()`/`shutdown()` explicite. | | **S2** | 14 → 18 juillet | Formaliser la méthode d'évaluation (§3.1) et constituer le **jeu d'évaluation stratifié** (§3.2), versionné dans le dépôt — ✅ fait le 6/07 (`data/eval/eval_set.parquet`) — en s'appuyant sur un premier **diagnostic de l'espace d'embedding** — ✅ formalisé le 8/07 (`evaluate_embeddings.py`, cf. §2.2), résultat préoccupant à creuser. Brancher le classifieur *Agentic RAG* dans le pipeline principal — ✅ fait le 6/07. | | **S3** | 21 → 25 juillet | Implémenter le chaînage *Navigator* → *MatchVerifier* — ✅ fait le 6/07. Lancer les **premières campagnes d'évaluation chiffrées** du *Navigator*, de l'*Agentic RAG* **et du modèle supervisé de référence** (`--supervised`, ✅ branché le 6/07, non validé fonctionnellement) sur le jeu d'évaluation, assorties d'intervalles de confiance et d'une analyse d'erreurs par segment (§3.3-B). Amorcer un **prototype d'automatisation de la pipeline d'évaluation via Argo Workflows**. Rédiger la **note de conception *Navigator* vs *Agentic RAG* vs supervisé** (compromis exactitude/latence/coût). | | **S4** | 28 → 31 juillet | Évaluer la génération synthétique (*Code2Text* / *NaiveCode2Text*) via la métrique proxy de ré-entraînement. **Prototype de détection de dérive** (Wasserstein, PSI, Kolmogorov-Smirnov) — ✅ fait le 6/07 (`src/evaluation/drift.py`), validé sur dérive simulée ; validation sur un flux réel de prédictions à faire. Synthèse des résultats du mois et note de recommandation sur les cas d'usage à prioriser pour la suite (monitoring, recodage, génération de données). | diff --git a/docs/framework.md b/docs/framework.md index 76ee773..6cac0cc 100644 --- a/docs/framework.md +++ b/docs/framework.md @@ -182,13 +182,16 @@ uv run python evaluate_embeddings.py Le traçage applicatif (sessions, coûts, latence, arbre d'appels des agents) est assuré par **Langfuse** (`get_client`, `propagate_attributes`, `@observe` dans `src/main.py`). -### 6.1 Traçage Langfuse — chantiers restants **[à compléter]** +### 6.1 Traçage Langfuse -Audit du 8/07 : le traçage fonctionne pour `classify_agentic_rag`, `classify_supervised` et `process_batch_file` (`@observe` actif, appels LLM individuels journalisés via `langfuse.openai.AsyncOpenAI` dans `base_agent.py`), mais reste incomplet sur plusieurs points, à traiter avant de présenter le traçage comme un acquis : +Audit du 8/07 : le traçage fonctionnait pour `classify_agentic_rag`, `classify_supervised` et `process_batch_file` (`@observe` actif, appels LLM individuels journalisés via `langfuse.openai.AsyncOpenAI` dans `base_agent.py`), mais restait incomplet sur plusieurs points. **Corrigé le 9/07** : + +- **`classify_navigator` est maintenant tracé** (`@observe` ré-activé dans `src/main.py`) alors que c'est le chemin agentique principal (cf. cadrage §2.1) — chaque appel LLM était déjà journalisé individuellement mais sans trace/span parent qui les relie en un arbre de raisonnement cohérent. +- **Les échecs de finalisation de `_run_navigator_loop` remontent maintenant comme des erreurs dans Langfuse** : en plus du repli `_fallback_output` (`base_classifier.py`), le span courant est explicitement marqué `level="ERROR"` (`get_client().update_current_span`) avant de retomber sur la dernière position connue, au lieu d'apparaître comme un succès normal (confiance 0.0). +- **`--experiment-name` est maintenant réellement propagé au traçage Langfuse** : la valeur est attachée à la trace courante (nom, tag et métadonnée via `get_client().update_current_trace`) dans les quatre points d'entrée (`classify_navigator`, `classify_agentic_rag`, `classify_supervised`, `process_batch_file`), donc filtrable/groupable par expérience dans l'UI Langfuse. + +Reste à faire : -- **`classify_navigator` n'est pas tracé** (`@observe` commenté dans `src/main.py`) alors que c'est le chemin agentique principal (cf. cadrage §2.1) — chaque appel LLM est bien journalisé individuellement mais sans trace/span parent qui les relie en un arbre de raisonnement cohérent. -- **Les échecs de finalisation de `_run_navigator_loop` ne remontent plus comme des erreurs dans Langfuse** depuis l'ajout du repli `_fallback_output` (`base_classifier.py`) : l'exception est journalisée en log applicatif seulement, la trace Langfuse correspondante apparaît comme un succès normal (confiance 0.0) plutôt que marquée en erreur. -- **`--experiment-name` n'est pas réellement propagé au traçage Langfuse** malgré ce qu'indique le §4 : la valeur circule comme argument/log applicatif mais n'est jamais attachée à la trace (nom, tag ou métadonnée), donc impossible de filtrer/grouper les runs par expérience dans l'UI Langfuse. - Pas de `langfuse.flush()`/`shutdown()` explicite avant la sortie du script CLI (repose sur le hook `atexit` du SDK, suffisant en usage normal mais fragile en cas d'arrêt forcé d'un job batch). **Piège fréquent sur `MLFLOW_MODEL_URI`** : ce n'est pas le lien de la page MLflow ouverte dans le navigateur, mais une URI au schéma `models:` — ex. `models:/FastText-pytorch/9` (pas `https://.../#/models/FastText-pytorch/versions/9`). Et `MLFLOW_TRACKING_URI` doit pointer vers le serveur MLflow où ce modèle est **effectivement enregistré** (le plus souvent l'instance MLflow partagée du projet, ex. `projet-ape-mlflow.user.lab.sspcloud.fr`) — pas nécessairement l'instance MLflow personnelle par défaut sur le Datalab, qui n'a pas accès au registre d'un autre projet. `SupervisedClassifier` lève une erreur explicite si `MLFLOW_MODEL_URI` est un lien `http(s)://` plutôt qu'une URI `models:`. From 162d7f8ddfec6eb689a7cae644bbaae7cfd38a94 Mon Sep 17 00:00:00 2001 From: theof Date: Thu, 9 Jul 2026 16:49:37 +0000 Subject: [PATCH 18/18] chore: gitignore generated notebook renders and train-verification variants; polish evaluate_train_labels.py - .gitignore: evaluate_train_labels.ipynb (jupytext-rendered from the .py source) and data/eval/train_verification*/ (covers train_verification_fixed/ alongside train_verification/) are generated outputs, not source. - evaluate_train_labels.py: document the actual jupytext -> Quarto render path (Quarto can't run a .py directly without a project kernel attached), and cast summary stats to float() so the JSON-facing values aren't numpy scalars. --- .gitignore | 6 +++++- evaluate_train_labels.py | 43 ++++++++++++++++++++++++---------------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 2e9edef..0a30224 100644 --- a/.gitignore +++ b/.gitignore @@ -6,10 +6,14 @@ test.ipynb # eval scripts, not source. Versioned inputs (eval_set*.parquet) are not ignored. data/eval/results/ data/eval/results_sample*/ -data/eval/train_verification/ +data/eval/train_verification*/ data/eval/embedding_diagnostics/ data/eval/human_review/ +# Notebooks rendered from jupytext percent-format scripts (evaluate_train_labels.py +# and similar) via `jupytext --to notebook` - the .py is the source of truth. +evaluate_train_labels.ipynb + # Byte-compiled / optimized / DLL files __pycache__/ *.py[codz] diff --git a/evaluate_train_labels.py b/evaluate_train_labels.py index dd3d263..22204e1 100644 --- a/evaluate_train_labels.py +++ b/evaluate_train_labels.py @@ -18,13 +18,20 @@ closers, mis bout à bout), appliquée ici au jeu d'entraînement plutôt qu'à un jeu de test annoté. -Pensé pour être exécuté cellule par cellule (VS Code Jupyter interactive, ou -`quarto render evaluate_train_labels.py`) plutôt qu'en batch : les appels -`await` nécessitent un kernel Jupyter (top-level await), comme déjà fait dans -explorations.py pour classify_navigator. - -Usage : - quarto render evaluate_train_labels.py --to html +Pensé pour être exécuté cellule par cellule (VS Code Jupyter interactive) +plutôt qu'en batch : les appels `await` nécessitent un kernel Jupyter +(top-level await), comme déjà fait dans explorations.py pour classify_navigator. + +Pour un rendu HTML via Quarto, il faut d'abord convertir ce script en notebook +avec un kernel pointant sur le venv du projet (Quarto ne détecte pas tout +seul un .py au format "percent", et le kernel `python3` par défaut n'a pas les +dépendances du projet) : + + uv run python -m ipykernel install --user --name graalbis \ + --display-name "Python (GRAALbis .venv)" # une seule fois + uv run jupytext --to notebook --set-kernel graalbis \ + evaluate_train_labels.py -o evaluate_train_labels.ipynb + quarto render evaluate_train_labels.ipynb --to html --execute """ # %% Imports @@ -196,17 +203,19 @@ def highlight_disagreements(row: pd.Series) -> list[str]: n = len(comparison) summary = { "n": n, - "pct_labels_flagged_by_verifier": 1 - comparison["verifier_is_match"].mean(), - "navigator_agreement_rate": comparison["navigator_agrees"].mean(), - "agentic_rag_agreement_rate": comparison["agentic_rag_agrees"].mean(), - "supervised_agreement_rate": comparison["supervised_agrees"].mean(), + "pct_labels_flagged_by_verifier": float(1 - comparison["verifier_is_match"].mean()), + "navigator_agreement_rate": float(comparison["navigator_agrees"].mean()), + "agentic_rag_agreement_rate": float(comparison["agentic_rag_agrees"].mean()), + "supervised_agreement_rate": float(comparison["supervised_agrees"].mean()), "pct_rescued_by_chooser": ( - ( - ~comparison["verifier_is_match"] - & ~comparison["chooser_agrees_with_label"] - & comparison["final_verifier_is_match"] - ).sum() - / n + float( + ( + ~comparison["verifier_is_match"] + & ~comparison["chooser_agrees_with_label"] + & comparison["final_verifier_is_match"] + ).sum() + / n + ) if n else None ),