[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
