feat(mcp): parametre colonnes (enum) pour rechercher_marches (#114)
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
from dash.mcp import mcp_enabled
|
from dash.mcp import mcp_enabled
|
||||||
|
|
||||||
from src.mcp import queries
|
from src.mcp import queries
|
||||||
|
from src.mcp.queries import ColonneMarche
|
||||||
from src.utils.tracking import track_mcp_tool
|
from src.utils.tracking import track_mcp_tool
|
||||||
|
|
||||||
|
|
||||||
@@ -74,6 +75,7 @@ def rechercher_marches(
|
|||||||
departement: str | None = None,
|
departement: str | None = None,
|
||||||
page: int = 1,
|
page: int = 1,
|
||||||
filtres_avances: dict | None = None,
|
filtres_avances: dict | None = None,
|
||||||
|
colonnes: list[ColonneMarche] | None = None,
|
||||||
) -> dict:
|
) -> dict:
|
||||||
"""Recherche paginée de marchés publics (DECP).
|
"""Recherche paginée de marchés publics (DECP).
|
||||||
|
|
||||||
@@ -84,6 +86,13 @@ def rechercher_marches(
|
|||||||
filtres_avances : dict optionnel {"colonne__operateur": valeur} pour les
|
filtres_avances : dict optionnel {"colonne__operateur": valeur} pour les
|
||||||
besoins pointus. Colonnes et opérateurs disponibles via l'outil
|
besoins pointus. Colonnes et opérateurs disponibles via l'outil
|
||||||
schema_donnees().
|
schema_donnees().
|
||||||
|
colonnes : liste optionnelle de colonnes à renvoyer. Par défaut, un jeu
|
||||||
|
standard (uid, objet, montant, dateNotification, codeCPV, acheteur_id,
|
||||||
|
acheteur_nom, acheteur_departement_code, titulaire_id, titulaire_nom). Si
|
||||||
|
fournie, REMPLACE le jeu par défaut (le champ uid reste toujours présent).
|
||||||
|
Colonnes disponibles via schema_donnees().colonnes_disponibles.
|
||||||
|
Chaque marché renvoyé contient en plus un champ `lien` (URL de la fiche
|
||||||
|
marché sur colibre).
|
||||||
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: [...]}.
|
||||||
"""
|
"""
|
||||||
@@ -100,4 +109,5 @@ def rechercher_marches(
|
|||||||
departement=departement,
|
departement=departement,
|
||||||
page=page,
|
page=page,
|
||||||
filtres_avances=filtres_avances,
|
filtres_avances=filtres_avances,
|
||||||
|
colonnes=colonnes,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -31,3 +31,26 @@ def test_stats_acheteur_returns_stats():
|
|||||||
def test_stats_titulaire_returns_stats():
|
def test_stats_titulaire_returns_stats():
|
||||||
result = tools.stats_titulaire("345")
|
result = tools.stats_titulaire("345")
|
||||||
assert result["nb_marches"] >= 1
|
assert result["nb_marches"] >= 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_rechercher_marches_colonnes_param_is_enum():
|
||||||
|
import typing
|
||||||
|
|
||||||
|
from pydantic import TypeAdapter
|
||||||
|
|
||||||
|
hints = typing.get_type_hints(tools.rechercher_marches)
|
||||||
|
schema = TypeAdapter(hints["colonnes"]).json_schema()
|
||||||
|
# list[ColonneMarche] | None -> anyOf[array(items.enum), null]
|
||||||
|
array_schema = next(s for s in schema["anyOf"] if s.get("type") == "array")
|
||||||
|
enum = array_schema["items"]["enum"]
|
||||||
|
assert "objet" in enum
|
||||||
|
assert "montant" in enum
|
||||||
|
assert "uid" in enum
|
||||||
|
|
||||||
|
|
||||||
|
def test_rechercher_marches_colonnes_passthrough(monkeypatch):
|
||||||
|
monkeypatch.setenv("APP_BASE_URL", "https://colibre.fr")
|
||||||
|
result = tools.rechercher_marches(acheteur_id="123", colonnes=["objet"])
|
||||||
|
m = result["marches"][0]
|
||||||
|
assert set(m.keys()) == {"uid", "objet", "lien"}
|
||||||
|
assert m["lien"] == f"https://colibre.fr/marche/{m['uid']}"
|
||||||
|
|||||||
Reference in New Issue
Block a user