Aller au contenu

Produit

Six briques, un seul contrat.

Tout ce qu'il faut entre une application et un modèle de décision : authentification, contexte, calibration, traçabilité. Rien de plus.

01

Gateway

Un seul point d'entrée : clés API, quotas, rate limit, validation, routage.

  • Clés jaas_<prefix>_<secret>, hash argon2id, cache 60 s, révocation immédiate.
  • Rate limit en token bucket et quota journalier dans Redis. Dépassement : 429 + Retry-After.
  • Coût d'un appel : 1 + nombre de questions.
  • Validation des questions, rendu du state, routage vers le backend du schéma.
02

Schémas & templates

Questions versionnées et templates Jinja typés. L'application envoie des variables.

  • Schéma = questions au format TypeSafe, seuil d'abstention, température par type.
  • Brouillon → publié. Une version publiée est immuable.
  • Template Jinja2 sandboxé, variables typées (string, number, boolean, array, object).
  • Questions inline rattachées par empreinte structurelle SHA-256.
seuil 0,600,54
tone → annoyedx_abstain: true
03

Calibration & abstention

Température par type de question, seuil d'abstention, ECE mesuré sur les outcomes.

  • Temperature scaling par type de question, stocké sur la version de schéma.
  • Sous le seuil : x_abstain: true, la réponse est conservée.
  • ECE, Brier, accuracy et courbe de fiabilité sur 10 bins.
  • Refit pair/impair proposé, appliqué à la main. Rien avant 200 outcomes.
04

Console d'admin

Applications, clés, schémas, backends, décisions et playground au même endroit.

  • Applications, clés (affichées une seule fois), quotas, schémas attribués.
  • Éditeur de schémas et de templates avec prévisualisation du rendu.
  • Santé des réplicas, journal des décisions filtrable, export JSONL.
  • Playground : un appel réel, sans quota ni journalisation.
05

Backends interchangeables

kev.serve aujourd'hui, tout serveur /v1/systemone demain. Seule l'URL change.

  • Interface DecisionBackend : kev.serve est une implémentation parmi d'autres.
  • Un backend = une liste d'URL, un modèle, une clé optionnelle.
  • Round-robin entre réplicas, éviction 30 s après un échec.
  • Le backend renvoie des probabilités brutes ; la gateway calibre.
06

Journal des décisions

Chaque appel est une ligne : probabilités, schéma, backend, latence, puis outcome.

  • Décision en UUIDv7, table PostgreSQL partitionnée par mois.
  • Une ligne par réponse : probabilités, confiance, abstention.
  • Par défaut, seul le state_hash est gardé. State complet sur option (log_state).
  • Outcome idempotent via POST /v1/decisions/{id}/outcome.

Un appel, en vrai

Une question typée, une réponse typée.

POST /v1/systemone avec un schéma et un template : la gateway rend le contexte, interroge le backend, calibre et renvoie des probabilités. Sous le seuil, x_abstain: true.

decision_answer ⟗ outcomeen direct
Exemple de décisions enregistrées avec leur outcome
x_decision_idquestionréponseconf.outcome
019a1b2c…0a63departmentbilling0,81 billing
019a1b2c…0a63tone1abstain0,60 2
019a1b2b…7f21departmentshipping0,92 shipping
019a1b2b…41c8urgent0,930,93en attente_
019a1b2a…9e05departmentbilling0,74en attente_
~/support-app — curl

Périmètre

Ce qui est là, ce qui vient.

La V1 fait peu de choses, et les fait jusqu'au bout. Le reste est listé, pas promis.

V1

  • Gateway /v1/systemone compatible TypeSafe
  • Schémas, templates, empreinte structurelle
  • Calibration à la demande (API admin)
  • Console d'admin, comptes locaux
  • Docker Compose sur une VM

Plus tard

  • Worker nocturne (refit planifié, purge, export)
  • SSO OIDC pour la console
  • /metrics et tableaux de bord
  • Backend Jev hébergé
  • Quantisation int8 si la latence l'exige