[project] name = "tech-step-intent-service" version = "0.1.0" description = "Microservice de détection d'intention (technique de cuisine) — remplace node-nlp côté apps/api." requires-python = ">=3.12" dependencies = [ "fastapi>=0.115,<0.116", "uvicorn[standard]>=0.32,<0.33", "spacy>=3.8,<3.9", # Fournit les tables de lookup ("lexeme_norm" notamment) que # `nlp.initialize()` réclame pour l'anglais lors de l'entraînement du # textcat (`en_core_web_md` ne les embarque pas lui-même, contrairement à # `fr_core_news_md`) — sans ce paquet, entraîner un pipeline "en" lève # `E955`. "spacy-lookups-data>=1.0,<1.1", "pydantic-settings>=2.6,<3", # Modèles spaCy installés comme des dépendances pip normales, pinnées par # URL de release GitHub (pas via `python -m spacy download`, qui résout # "la dernière version compatible" et n'est pas verrouillable par # `uv.lock`). `uv sync --frozen` installe donc déjà les modèles — aucune # étape `spacy download` séparée, ni au Dockerfile ni en CI. Version # 3.8.0 choisie pour matcher la ligne spaCy 3.8 pinnée ci-dessus (voir # https://github.com/explosion/spacy-models/releases). "fr_core_news_md @ https://github.com/explosion/spacy-models/releases/download/fr_core_news_md-3.8.0/fr_core_news_md-3.8.0-py3-none-any.whl", "en_core_web_md @ https://github.com/explosion/spacy-models/releases/download/en_core_web_md-3.8.0/en_core_web_md-3.8.0-py3-none-any.whl", ] [dependency-groups] dev = [ "pytest>=8,<9", # Requis par fastapi.testclient.TestClient (httpx en interne depuis FastAPI 0.110+). "httpx>=0.27,<0.28", ] [tool.uv] # Les deux modèles ci-dessus sont publiés comme des builds "any" universels # (pas de wheel spécifique par plateforme) — rien à déclarer de plus ici, # contrairement à un paquet avec des extras natifs par OS/arch. [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["intent_service"] [tool.hatch.metadata] # Requis par hatchling pour accepter des dépendances pinnées par URL directe # (les wheels de modèles spaCy ci-dessus) plutôt qu'un nom+version résolu # depuis un index PyPI — voir la note sur `pyproject.toml` dans le plan de # migration pour pourquoi ces modèles sont déclarés ainsi plutôt que via # `python -m spacy download`. allow-direct-references = true