Nouvelle table product_matches (status: pending/validated/rejected).
Matching via RapidFuzz token_sort_ratio, seuil configurable (défaut 85%).
Workflow :
1. python -m tickettracker.cli match [--threshold 85]
→ calcule et stocke les paires candidates
2. http://localhost:8000/matches
→ l'utilisateur valide ou rejette chaque paire
3. La comparaison de prix enrichie avec les paires validées
Nouvelles dépendances : rapidfuzz, watchdog (requirements.txt).
10 tests ajoutés (test_matcher.py), tous passent.
Suite complète : 129 passent, 1 xfail, 0 échec.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
55 lines
2.1 KiB
Python
55 lines
2.1 KiB
Python
"""
|
||
Configuration de TicketTracker.
|
||
|
||
Toutes les valeurs sensibles (clé API) sont lues depuis des variables
|
||
d'environnement et ne doivent jamais être codées en dur.
|
||
|
||
Variables d'environnement disponibles :
|
||
TICKETTRACKER_LLM_URL URL de l'endpoint OpenAI-compatible
|
||
TICKETTRACKER_LLM_MODEL Nom du modèle LLM
|
||
TICKETTRACKER_LLM_API_KEY Clé API (obligatoire pour Mammouth)
|
||
TICKETTRACKER_LLM_TIMEOUT Timeout en secondes (défaut : 60)
|
||
TICKETTRACKER_LLM_BATCH_SIZE Taille des batchs de normalisation (défaut : 20)
|
||
"""
|
||
|
||
import os
|
||
from pathlib import Path
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Base de données
|
||
# ---------------------------------------------------------------------------
|
||
|
||
from tickettracker.db.schema import DEFAULT_DB_PATH as _DEFAULT_DB_PATH
|
||
|
||
# Chemin vers la base SQLite (surchargeable par variable d'environnement)
|
||
DB_PATH: Path = Path(os.environ.get("TICKETTRACKER_DB_PATH", str(_DEFAULT_DB_PATH)))
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# LLM
|
||
# ---------------------------------------------------------------------------
|
||
|
||
# URL de l'endpoint compatible OpenAI (Mammouth)
|
||
LLM_URL: str = os.environ.get(
|
||
"TICKETTRACKER_LLM_URL",
|
||
"https://api.mammouth.ai/v1/chat/completions",
|
||
)
|
||
|
||
# Modèle à utiliser
|
||
LLM_MODEL: str = os.environ.get("TICKETTRACKER_LLM_MODEL", "mistral-small-3.2-24b-instruct")
|
||
|
||
# Clé API — jamais de valeur par défaut sensible ici
|
||
LLM_API_KEY: str = os.environ.get("TICKETTRACKER_LLM_API_KEY", "")
|
||
|
||
# Timeout par appel en secondes (le modèle local peut être lent)
|
||
LLM_TIMEOUT: int = int(os.environ.get("TICKETTRACKER_LLM_TIMEOUT", "60"))
|
||
|
||
# Nombre d'articles traités par appel LLM
|
||
LLM_BATCH_SIZE: int = int(os.environ.get("TICKETTRACKER_LLM_BATCH_SIZE", "20"))
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# Fuzzy matching
|
||
# ---------------------------------------------------------------------------
|
||
|
||
# Seuil de similarité minimum (0–100) pour rapprocher un produit Picnic d'un produit Leclerc
|
||
FUZZY_THRESHOLD: float = float(os.environ.get("TICKETTRACKER_FUZZY_THRESHOLD", "85"))
|