Changement d'architecture demande par l'utilisateur : le dataset d'entrainement (TECH_STEP_TRAINING_DATA) quitte apps/api pour vivre entierement dans services/tech-step-intent-service (intent_service/training_data.py). Ce service est desormais autonome : il s'entraine lui-meme une seule fois, a son propre demarrage (PipelineRegistry.initialize, dans le lifespan FastAPI), sans plus dependre d'un POST /v1/train pousse par apps/api (route supprimee). apps/api ne connait plus aucune technique/synonyme, uniquement le resultat de POST /v1/process. Corpus enrichi avec les 48 techniques du lexique fourni (Arroser, Appertiser, Braiser, Caraméliser, Confire, Julienne/Brunoise/Mirepoix/ Paysanne, Cuire à blanc/au bain-marie/à l'étouffée, Déglacer variantes, Emulsionner, Glacer, Pocher, Réduire, Suer, Zester, etc.), soit 74 techniques au total (26 + 48). Integration complete bout en bout : - reference-seed-data.ts : 48 nouvelles entrees TECH_STEPS - apps/web/locales/fr/translation.json : libelles francais correspondants - "Mitonner" fondu comme synonyme de simmer (pas une technique distincte, sa propre definition le dit) - "Blanchir un oeuf" (whiskPale) distingue de "Blanchir un legume" (blanch, existant) via des synonymes en phrase complete plutot qu'au mot nu — filter_spans (deja en place) resout la collision par specificite Impact performance mesure : le corpus elargi (74 classes vs 26) rend l'entrainement bien plus lent a nombre d'iterations egal (150 iterations depassait 17 minutes par run de test) — reduit a 40 iterations apres mesures repetees en local (~200s/locale, ~400s pour fr+en combines). docker-compose.yml (healthcheck start_period 600s), CI (timeout curl 600s) et le README du service documentent ce nouveau temps de demarrage. CONFIDENCE_THRESHOLD recalibre a 0.2 par verification manuelle (0.75 puis 0.45 ne tenaient plus compte tenu du nombre de classes) — marque explicitement comme placeholder en attendant une vraie repasse de calibrate-tech-step-threshold.ts (necessite Postgres, indisponible dans cet environnement). Verifie : 28/28 tests pytest du service (suite complete re-ecrite pour s'entrainer une seule fois par session sur le vrai corpus, fixture partagee dans conftest.py), lint + build complets du monorepo. La suite Mocha d'apps/api reste a confirmer via CI (le root hook mocha n'attend plus l'entrainement, seulement CI's propre attente sur /health). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
40 lines
2.2 KiB
TypeScript
40 lines
2.2 KiB
TypeScript
import { techStepClassifier } from "../src/lib/recipe-matching/tech-step-matcher.js";
|
|
import { resetDatabase } from "./reset-db.js";
|
|
|
|
/**
|
|
* Mocha root hook plugin (see `.mocharc.json`'s `require`) — runs once
|
|
* before every test file's own suites, regardless of load order.
|
|
*
|
|
* Warms up `techStepClassifier` here — resolving the `TechStep.key -> id`
|
|
* lookup from the DB (see `TechStepClassifierService._loadTechStepIds`) —
|
|
* instead of leaving it to happen lazily on whichever test file Mocha
|
|
* happens to load first, same as `server.ts` does before the real server
|
|
* ever accepts traffic. Fast by itself (one DB query, one HTTP call to
|
|
* `services/tech-step-intent-service`): that service now trains itself
|
|
* entirely at its own process startup (see its own README), so unlike
|
|
* before this migration, nothing here waits on a slow training pass — CI's
|
|
* own "wait for `/health`" step (`.github/workflows/ci.yml`) is what
|
|
* ensures that service is already fully trained before `pnpm --filter api
|
|
* test` even starts.
|
|
*
|
|
* `resetDatabase()` runs first, deliberately: id resolution needs
|
|
* `TechStep` rows, and a freshly-migrated (never-seeded) test database has
|
|
* none yet. Every per-test `beforeEach` in this suite already calls
|
|
* `resetDatabase()` again before its own test, which is a no-op
|
|
* duplication of effort but not a correctness problem: `TRUNCATE ...
|
|
* RESTART IDENTITY` plus deterministic re-seeding (`seedReferenceData`)
|
|
* assigns the exact same ids every time, so the `uid -> id` map memoized
|
|
* here from this first reset stays valid for every reset after it.
|
|
*/
|
|
export const mochaHooks = {
|
|
// biome-ignore lint/suspicious/noExplicitAny: Mocha's root hook `this` (a Context with `.timeout()`) isn't typed without @types/mocha (not a dependency here) — same untyped-`this` shape already used in tech-step-worker.routes.test.ts.
|
|
async beforeAll(this: any): Promise<void> {
|
|
// A little more generous than Mocha's normal 10s per-test default
|
|
// (`.mocharc.json`) purely for a slower/contended CI runner's first
|
|
// network round-trip to `services/tech-step-intent-service` — not
|
|
// because anything here waits on training anymore.
|
|
this.timeout(30000);
|
|
await resetDatabase();
|
|
await techStepClassifier.warmUp();
|
|
},
|
|
};
|