Ajout du tool schema_donnees
This commit is contained in:
+26
-2
@@ -1,11 +1,11 @@
|
|||||||
# src/mcp/queries.py
|
# src/mcp/queries.py
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from src.api.filters import FilterError, build_where
|
from src.api.filters import OPERATORS, FilterError, build_where
|
||||||
from src.db import aggregate_marches, count_marches, query_marches
|
from src.db import aggregate_marches, count_marches, query_marches
|
||||||
from src.db import schema as duckdb_schema
|
from src.db import schema as duckdb_schema
|
||||||
from src.mcp.serialization import to_json_records
|
from src.mcp.serialization import to_json_records
|
||||||
from src.utils.data import DF_ACHETEURS, DF_TITULAIRES
|
from src.utils.data import DATA_SCHEMA, DF_ACHETEURS, DF_TITULAIRES
|
||||||
from src.utils.search import search_org
|
from src.utils.search import search_org
|
||||||
|
|
||||||
PAGE_SIZE = 50
|
PAGE_SIZE = 50
|
||||||
@@ -41,6 +41,30 @@ _NAMED_FILTERS = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def describe_schema() -> dict:
|
||||||
|
"""Schéma des marchés (même source que /schema de l'API REST).
|
||||||
|
|
||||||
|
Limité aux colonnes réellement filtrables via filtres_avances (présentes
|
||||||
|
dans la table DuckDB). L'agrégation (groupby/sum/...) n'est pas supportée
|
||||||
|
ici : c'est une fonctionnalité de l'API REST /data.
|
||||||
|
"""
|
||||||
|
colonnes = {
|
||||||
|
name: {
|
||||||
|
"type": field.get("type"),
|
||||||
|
"titre": field.get("title"),
|
||||||
|
"description": field.get("description"), # inclut les énumérations
|
||||||
|
}
|
||||||
|
for name, field in DATA_SCHEMA.items()
|
||||||
|
if name in duckdb_schema # exclut la colonne virtuelle "marche"
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
"colonnes_filtrables": colonnes,
|
||||||
|
"colonnes_retournees": MARCHES_COLUMNS,
|
||||||
|
"operateurs": sorted(OPERATORS),
|
||||||
|
"filtres_nommes": {p: f"{c}__{o}" for p, c, o in _NAMED_FILTERS},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def build_where_args(
|
def build_where_args(
|
||||||
named: dict, filtres_avances: dict | None
|
named: dict, filtres_avances: dict | None
|
||||||
) -> list[tuple[str, str]]:
|
) -> list[tuple[str, str]]:
|
||||||
|
|||||||
+18
-1
@@ -45,6 +45,22 @@ def stats_titulaire(titulaire_id: str) -> dict:
|
|||||||
return queries.compute_org_stats("titulaire", titulaire_id)
|
return queries.compute_org_stats("titulaire", titulaire_id)
|
||||||
|
|
||||||
|
|
||||||
|
@mcp_enabled(name="schema_donnees", expose_docstring=True)
|
||||||
|
def schema_donnees() -> dict:
|
||||||
|
"""Schéma des données marchés (DECP) pour construire des filtres.
|
||||||
|
|
||||||
|
À consulter avant d'utiliser `filtres_avances` de rechercher_marches.
|
||||||
|
- colonnes_filtrables : {colonne: {type, titre, description}}, utilisables
|
||||||
|
comme "colonne__operateur" (la description inclut les valeurs possibles).
|
||||||
|
- colonnes_retournees : colonnes présentes dans chaque marché renvoyé.
|
||||||
|
- operateurs : opérateurs de filtre valides (exact, contains, greater, less,
|
||||||
|
in, isnull, sort…). L'agrégation n'est pas supportée ici (API REST /data).
|
||||||
|
- filtres_nommes : correspondance paramètre nommé -> "colonne__operateur".
|
||||||
|
"""
|
||||||
|
track_mcp_tool("schema_donnees")
|
||||||
|
return queries.describe_schema()
|
||||||
|
|
||||||
|
|
||||||
@mcp_enabled(name="rechercher_marches", expose_docstring=True)
|
@mcp_enabled(name="rechercher_marches", expose_docstring=True)
|
||||||
def rechercher_marches(
|
def rechercher_marches(
|
||||||
acheteur_id: str | None = None,
|
acheteur_id: str | None = None,
|
||||||
@@ -66,7 +82,8 @@ def rechercher_marches(
|
|||||||
date_min / date_max (format YYYY-MM-DD, sur dateNotification),
|
date_min / date_max (format YYYY-MM-DD, sur dateNotification),
|
||||||
departement (code département de l'acheteur).
|
departement (code département de l'acheteur).
|
||||||
filtres_avances : dict optionnel {"colonne__operateur": valeur} pour les
|
filtres_avances : dict optionnel {"colonne__operateur": valeur} pour les
|
||||||
besoins pointus (mêmes colonnes/opérateurs que l'API REST colibre).
|
besoins pointus. Colonnes et opérateurs disponibles via l'outil
|
||||||
|
schema_donnees().
|
||||||
page : numéro de page (50 résultats par page).
|
page : numéro de page (50 résultats par page).
|
||||||
Retourne {meta: {page, page_size, total}, marches: [...]}.
|
Retourne {meta: {page, page_size, total}, marches: [...]}.
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user