Docs · Démarrage
Démarrer avec Jevis
Lancer la stack, créer un schéma, une application et une clé, puis faire le premier appel. Tout se fait aussi depuis la console ; ici on montre l'API pour être explicite.
Prérequis : Docker Compose v2 et une machine de 6 vCPU / 12 Go pour un réplica du modèle. La gateway est le seul composant exposé ; le serveur modèle n'est joignable que depuis le réseau Docker interne.
Lancer la stack
Copier le modèle de configuration, renseigner les secrets, démarrer.
terminalgit clone https://github.com/rochesebastien/jevis.git && cd jevis cp deploy/.env.example deploy/.env # renseigner les secrets docker compose -f deploy/docker-compose.yml --profile vm up -dLe premier démarrage télécharge les poids (~1,6 Go) dans un volume nommé et vérifie leurs checksums SHA-256. Ensuite, plus aucun appel réseau sortant. Vérifier que tout répond :
curl https://jevis.example.com/health # { "status": "ok" } curl https://jevis.example.com/health/ready # { "status": "ok", "database": true, "redis": true }Se connecter en admin
Au premier démarrage, si aucun utilisateur n'existe et que
JEVIS_ADMIN_EMAILetJEVIS_ADMIN_PASSWORDsont définis, un compteadminest créé (aussi possible viajevis bootstrap-admin). La console est sur/console. Côté API :curl -X POST https://jevis.example.com/admin/v1/auth/login \ -H "Content-Type: application/json" \ -d '{ "email": "admin@example.com", "password": "…" }' # → { "access_token": "eyJ…", "token_type": "bearer", "expires_in": 43200, "user": { … } }Créer et publier un schéma
Un schéma porte les questions, le seuil d'abstention et la température par type. Une version publiée est immuable. Détails dans Schémas et templates.
curl -X POST https://jevis.example.com/admin/v1/schemas \ -H "Authorization: Bearer $ADMIN_TOKEN" -H "Content-Type: application/json" \ -d '{ "slug": "triage", "name": "Triage tickets", "abstain_threshold": 0.6, "questions": { "department": { "type": "choice", "instructions": "Quel service doit traiter ce ticket ?", "criteria": { "billing": "Facturation, paiement", "shipping": "Livraison" } } } }' # crée le schéma et sa version 1 en brouillon, puis : curl -X POST https://jevis.example.com/admin/v1/schemas/$SCHEMA_ID/versions/1/publish \ -H "Authorization: Bearer $ADMIN_TOKEN"Créer une application et une clé
L'application porte les quotas et les schémas autorisés (
schema_ids). La clé n'est affichée qu'une seule fois : la stocker tout de suite.curl -X POST https://jevis.example.com/admin/v1/applications \ -H "Authorization: Bearer $ADMIN_TOKEN" -H "Content-Type: application/json" \ -d '{ "name": "support-triage", "owner": "équipe support", "quota_daily": 10000, "rate_limit_per_min": 120, "schema_ids": ["'$SCHEMA_ID'"] }' curl -X POST https://jevis.example.com/admin/v1/applications/$APP_ID/keys \ -H "Authorization: Bearer $ADMIN_TOKEN" -H "Content-Type: application/json" -d '{}' # → { "id": "…", "prefix": "a1b2c3d4", "key": "jaas_a1b2c3d4_…", "expires_at": null, "created_at": "…" }La clé complètejaas_<prefix>_<secret>n'est jamais renvoyée ensuite. Seul le préfixe de 8 caractères reste visible dans la console.Premier appel
Avec
x_schema, les questions viennent du schéma publié : l'application n'envoie que le state.curl -X POST https://jevis.example.com/v1/systemone \ -H "Authorization: Bearer $JEVIS_API_KEY" -H "Content-Type: application/json" \ -d '{ "model": "kev-0.8b", "state": "Bonjour, prélevé deux fois pour la commande 4521. Merci de corriger.", "x_schema": { "id": "triage" } }'200 OK{ "model": "kev-0.8b", "answers": { "department": { "type": "choice", "choice": "billing", "probabilities": { "billing": 0.81, "shipping": 0.19 }, "confidence": 0.81 } }, "x_decision_id": "019a1b2c-…", "x_backend": "kev-0.8b-cpu", "x_schema": { "id": "triage", "version": 1 }, "x_schema_version": 1 }Renvoyer l'outcome
Quand la vraie réponse est connue (un agent a reclassé le ticket, par exemple), l'envoyer. C'est ce qui alimente la calibration.
curl -X POST https://jevis.example.com/v1/decisions/019a1b2c-…/outcome \ -H "Authorization: Bearer $JEVIS_API_KEY" -H "Content-Type: application/json" \ -d '{ "answers": { "department": "billing" }, "source": "agent-ui" }' # → { "decision_id": "019a1b2c-…", "recorded": ["department"] }
Pour aller plus loin :
- Référence de l'API : tous les champs, les extensions
x_et les erreurs. - SDK TypeSafe : brancher une application existante.
- Calibration : seuil, température, ECE.