KOHAMI Docs

Changelog

Ce changelog liste les évolutions back-end qui impactent les intégrateurs front-end (Nathan Lengagne, JUWA). Les ADRs internes sont référencés depuis le repo (apps/api/docs/decisions/).

2026-07-10

  • Module visio livré (chantier avenant 2026-3). Côté senior : POST /v1/video/initiate (appel vers un contact du carnet), GET /v1/video/quota, GET /v1/video/:id/status, POST /v1/video/:id/end. Côté aidant : GET /v1/me/video/sessions (sessions actives avec direction), POST /v1/me/video/sessions/:id/join, POST /v1/me/video/sessions/:id/end, POST /v1/me/seniors/:id/video/initiate. Quota 5 appels par jour et par senior (toutes directions), cadence anti-harcèlement à partir de la troisième tentative vers un même contact, aucun enregistrement. Raccrocher n'est pas terminer : quitter avec au moins deux participants restants laisse l'appel vivre, le dernier départ ferme la salle.
  • Authentification duale dans l'app mobile. Un appareil non enrôlé propose l'espace aidant : login email et mot de passe (POST /v1/auth/login), annuaire GET /v1/me/seniors, écrans d'appel entrant et sortant. Le kiosque senior reste inchangé et prioritaire quand une session device existe.
  • Page de jonction proche (apps/visio-join) : application web minimale (Vite + React) que le proche ouvre depuis son lien, prénom prérempli, un bouton pour rejoindre l'appel.
  • Infrastructure basculée sur serveur dédié. Les environnements quittent les conteneurs serverless Scaleway pour une Dedibox à Paris pilotée en Ansible ; l'environnement dev tourne sur k3s et se redéploie à chaque push develop (workflow deploy-box). Les URLs publiques passent sur *.195-154-239-8.sslip.io en attendant l'enregistrement du domaine définitif. Voir Environnements.
  • Le smoke de déploiement vérifie désormais l'enregistrement du worker vocal auprès de LiveKit : un déploiement qui rendrait Helena muette échoue au lieu de passer au vert.

2026-06-09

  • Politique de modèles révisée : tout en Mistral Small (mistral-small-2603). Medium rejoint Large dans les paliers interdits (latence et coût). Les limites connues de Small sont compensées par des garde-fous déterministes côté runtime et mesurées par un banc comportemental dédié. Révision documentée dans l'ADR llm-model-policy.md.
  • Runtime vocal réécrit en Python (apps/voice-agent, SDK LiveKit Agents). L'ancien worker TypeScript hébergé dans apps/api est retiré ; les outils de l'agent restent des clients HTTP vers /v1/voice/internal/*. Aucun changement de contrat pour les clients.

2026-05-25

  • Endpoint GET /v1/admin/seniors/:id/reminders/all exposé. Vue brute table reminders, opposé sémantique de /reminders (qui filtre status='active' AND scheduled_at >= now()). Filtres opt-in ?status=, ?kind=, ?from=, ?to=. Pagination cursor base64url ordonnée (created_at DESC, id DESC), ?limit=1..200 (default 50).
  • Endpoint GET /v1/admin/seniors/:id/mood-entries exposé. Journal humeur brut, 1 row par capture mood_scores avec score 0-100, confidence 0-1, source (per_turn | end_of_day | manual_entry | onboarding_j7), captured_at (alias recorded_at). Filtres ?source=, ?from=, ?to=. Pagination cursor (recorded_at DESC, id DESC), ?limit=1..200.
  • Endpoint POST /v1/admin/stats/tokens/seed-test exposé. Dev seed pour la rendition du widget tokens/cost du dashboard. Body { days_back?: 1..90 default 30, models?: string[], flux?: ("cache" | "memory" | "agent")[] }. Réponse { senior_id, days_back, models, flux, seeded_count, tokens_used_total, cost_eur_micros_total }. Hard-gate KOHAMI_ENV !== 'prod' (override ALLOW_TEST_SEED_IN_PROD=true). Rate-limit 5 / actor / heure.
  • GET /v1/admin/users reçoit deux extensions :
    • paramètre ?search= (1..256, trim) : ILIKE %search% case-insensitive sur users.email et seniors.display_name via LEFT JOIN,
    • champ meta.total_count dans la réponse (COUNT(*) OVER () window function, ignore le cursor mais respecte les filtres role, include_deleted, search).
  • Restoration du prompt système Helena à sa version minimale concise (546 → 65 lignes, 163 → 10 règles strictes). Le comportement vocal retombe sur le contour Phase A : deux phrases courtes maximum, zéro relance fin de tour, anti-hallucination outils, mood adaptation, anti-marqueurs [DEV QA MODE].
  • Sanitization adapter-side de la sortie NLU MistralOnboardingNluAdapter :
    • sentinels "null" / "undefined" / "none" / "n/a" / "nul" ramenés à null réel,
    • chaînes vides ou whitespace-only ramenées à null,
    • valeurs hors-enum (housing_type, chronotype) ramenées à null avec un log warn.
  • SlotGuidance étendu avec acceptedValues?: readonly string[] pour les slots enum, injecté dans le prompt NLU pour bloquer la mauvaise extraction silencieuse.

2026-05-20

  • Refonte de la documentation développeur (Phase A), palette vert santé, FR-only, composants EndpointReference, EventCard, InvariantBadge.

2026-05-17

  • Catalogue d'événements DataChannel élargi à 13 entries (ajout des familles assistance et outbound_call).
  • Endpoint POST /v1/onboarding/postpone exposé pour reporter l'onboarding.
  • Endpoint GET / PUT /v1/onboarding/caregiver-config exposé pour configuration aidant.

2026-05-13

  • Architecture C, le voice-worker est isolé physiquement de l'API (ADR voice-agent-process-model.md).

2026-05-08

  • Endpoint POST /v1/admin/caregivers/:id/reactivation-notice exposé (escalade admin).
  • Endpoint GET /v1/admin/alerts/recent exposé (dashboard JUWA).

2026-05-01

  • Endpoints POST /v1/auth/password-reset/request et POST /v1/auth/password-reset/apply exposés.

2026-04-15

  • 2FA TOTP rollout pour aidants et admins (ADR auth-2fa-totp-rollout.md).

2026-03-20

  • Jalon 1 livré, contrat API REST stable.