Aller au contenu

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.

  1. Lancer la stack

    Copier le modèle de configuration, renseigner les secrets, démarrer.

    terminal
    git 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 -d

    Le 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 }
  2. Se connecter en admin

    Au premier démarrage, si aucun utilisateur n'existe et que JEVIS_ADMIN_EMAIL et JEVIS_ADMIN_PASSWORD sont définis, un compte admin est créé (aussi possible via jevis 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": { … } }
  3. 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"
  4. 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ète jaas_<prefix>_<secret> n'est jamais renvoyée ensuite. Seul le préfixe de 8 caractères reste visible dans la console.
  5. 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
    }
  6. 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 :