Aller au contenu
Documentation SDK — ELYSÉA CERVEAU

La documentation technique du SDK.
Tout ce qu'il faut pour intégrer, rien de plus.

Authentification, API surface, 8 prohibitions Guardian, paliers, trust mark, sandbox et codes d'erreur. Canons figés. Rédaction outillée par des agents IA sous la direction du fondateur, sous protocole de preuve : tests, intégration continue, empreinte vérifiable.

Outils pour constructeurs

À VENIRScript officiel du widget (CDN versionné, empreinte SRI)

Le widget parle à votre passerelle (paquet @elysea/gateway), qui détient la clé secrète ; la clé publiable pk_ est émise par cette passerelle. Le fichier est servi par jsDelivr depuis le paquet npm, à une version figée, avec son empreinte d’intégrité (SRI).

Aucune version n’est servie : @elysea/widget 0.4.0 doit être publié sur npm (geste de Sébastien) ; la version publiée 0.3.1 pointe vers des domaines inexistants et est refusée.

§1 — Authentification

Clé de test sk_test_

Sandbox uniquement. Aucune donnée utilisateur réelle. Aucune facturation UAM. Toutes les prohibitions Guardian sont actives (le sandbox est un test de conformité, pas un mode permissif).

Clé de production sk_live_

Production uniquement. Facturation UAM active (token LLM à la charge du constructeur — Décision KJ). Un mélange sk_test_/sk_live_ est refusé à l'authentification côté Core — AUTH_UNAUTHORIZED (HTTP 401).

typescript
import { createElyseaClient } from '@elysea/core';

const elysea = createElyseaClient({
  baseUrl:     process.env.ELYSEA_BASE_URL!,
  auth: { apiKey: process.env.ELYSEA_API_KEY!, apiSecret: process.env.ELYSEA_API_SECRET! },
  appId:       process.env.ELYSEA_APP_ID!,
  countryCode: 'FR',
  region:      'EU',
});

Le champ region est obligatoire. Il fixe les régions UE du cerveau ; le code accepte encore des chemins hors UE possibles (accès direct au modèle, prestataires dont la région n'est pas fixée), listés dans la politique de confidentialité.


§2 — API surface

identity.resolve()

typescript
const { coreUserId } = await elysea.identity.resolve({
  userJwt: req.headers.authorization, // JWT émis par votre auth provider
});
// coreUserId : identifiant opaque dérivé de l'ELYSEAID
// Jamais le pseudonyme réel — jamais l'identité sous-jacente

pipeline.run()

typescript
const result = await elysea.pipeline.run({
  userInput:           message,
  coreUserId,
  conversationHistory: history,   // Message[] — { role, content }[]
});

// result : PipelineResult
// {
//   response:         string,    // réponse texte
//   posture:          string,    // posture Guardian active
//   guardianAction:   string,    // 'pass'|'warn'|'block'
//   canonConformance: boolean,   // true si conforme aux canons
//   errorCode?:       string,    // si guardianAction === 'block'
//   errorMessage?:    string,    // si guardianAction === 'block'
// }

memory.write()

typescript
await elysea.memory.write(
  coreUserId,
  {
    type:       'contexte_utile',                        // l'un des 5 types autorisés
    content:    'Travaille en UTC+2, équipe distribuée.', // ≤ 256 caractères
    expires_at: '2027-01-01T00:00:00Z',                  // TTL obligatoire
  },
  consentToken, // token de consentement ELYSÉA (P7 sans ce token)
  preuve,       // preuve de consentement du constructeur — obligatoire (voir ci-dessous)
);

guardian.audit()

typescript
// Construire le résultat d'audit après pipeline.run()
const auditPost = elysea.guardian.buildAuditResult(
  coreUserId,
  result.posture ?? 'present_neutral',
  result.guardianAction,
  null,
);
const { auditId, persisted } = await elysea.guardian.audit(auditPost);
// auditId   → identifiant d'audit persisté
// persisted → true si enregistré côté Core

Mémoire : consentement prouvé obligatoire

Effectif dans le cerveau déployé : sans preuve, l'écriture est refusée. Le SDK l'exige aussi : sans preuve, rien n'est envoyé.

ELYSÉA n'écrit aucune mémoire sans une preuve de consentement fournie par vous, le constructeur. Le consentToken authentifie l'opération (P7) ; il ne vaut pas consentement.

Ce que vous devez montrer — un texte de consentement mémoire explicite et séparé (pas noyé dans des conditions générales), accepté par un geste positif de l'utilisateur.

Ce que vous devez conserver — le texte exact affiché, sa version, l'horodatage de l'accord et l'utilisateur concerné, pour pouvoir prouver l'accord.

Ce que vous devez envoyer — à chaque memory.write, une preuve MemoryConsentProof. Tous les champs sont obligatoires et non vides ; le SDK n'en remplit aucun à votre place.

ChampContenu
grantedtrue
consent_text_versionversion du texte affiché
libelle_sha256libelleSha256(texte) — SHA-256 hexadécimal des octets UTF-8 du texte exact affiché, sans aucune normalisation
consent_granted_athorodatage ISO 8601 de l'accord, enregistré par vous
constructor_legal_entityvotre entité juridique
app_idvotre application
typescript
import { libelleSha256, ElyseaSDKError, ElyseaNetworkError, type MemoryConsentProof } from '@elysea/core';

// Votre enregistrement de l'accord (texte exact affiché, version, horodatage)
const preuve: MemoryConsentProof = {
  granted: true,
  consent_text_version: accord.version,
  libelle_sha256: libelleSha256(accord.texteAffiche),
  consent_granted_at: accord.accepteLe,
  constructor_legal_entity: 'Votre Société SAS',
  app_id: 'votre-app',
};

try {
  await elysea.memory.write(
    coreUserId,
    { type: 'preferences_communication', content: 'Réponses courtes.', expires_at: '2027-01-01T00:00:00Z' },
    consentToken,
    preuve,
  );
} catch (e) {
  if ((e instanceof ElyseaSDKError || e instanceof ElyseaNetworkError) && e.errorCode === 'CONSENT_PROOF_REQUIRED') {
    // Mémoire désactivée pour cet utilisateur : ne pas réessayer sans preuve complète.
  }
}

Sans preuve, la mémoire reste désactivée

  • preuve absente ou incomplète → ElyseaSDKError CONSENT_PROOF_REQUIRED, avant tout envoi ;
  • refus du cerveau (HTTP 403 CONSENT_PROOF_REQUIRED) → ElyseaNetworkError avec errorCode 'CONSENT_PROOF_REQUIRED' — jamais silencieux, jamais confondu avec une erreur d'authentification.

Retrait — dès que l'utilisateur retire son accord, cessez d'envoyer la preuve (aucune nouvelle écriture n'est alors possible) et effacez les éléments déjà écrits avec memory.delete(coreUserId, itemId, consentToken). Le cerveau n'expose pas encore de route SDK pour retirer l'accord lui-même.


ELYSEA.ARCH.CANON_GUARDIAN_SDK.v1 — FIGÉ

§3 — 8 prohibitions

Un tiers peut RESTREINDRE — jamais affaiblir.

Vous pouvez configurer ELYSÉA pour être plus strict que la baseline (bloquer des sujets, réduire les types de mémoire utilisés, exiger un consentement plus fin). Vous ne pouvez pas configurer ELYSÉA pour être moins protecteur. Le Guardian SDK rejette toute configuration qui affaiblirait une prohibition existante — dans le pipeline, pas seulement dans une politique.

Comportement de bloc : le Guardian ne retourne jamais HTTP 403. Il retourne une réponse pipeline normale — guardianAction: “block”, posture: “present_neutral”. L'utilisateur ne sait pas qu'une tentative de contournement a eu lieu. Le log interne, lui, le sait.

P1BLOC immédiat

Contourner ou modifier D0

Toute tentative de remplacer, neutraliser ou court-circuiter la directive éthique socle (D0). D0 ne peut être restreinte — jamais affaiblie.

signal: P1_D0_OVERRIDE_ATTEMPT
P2BLOC immédiat

Accéder à la mémoire brute

Lecture directe des items mémoire d'un utilisateur sans passer par le pipeline de résolution consentie. Aucun endpoint SDK n'existe pour ça.

signal: P2_MEMORY_RAW_ACCESS
P3BLOC immédiat

Bypass de la safety gate

Toute requête conçue pour contourner les garde-fous (jailbreak de prompt, injection système, wrapping LLM externe non signé).

signal: P3_SAFETY_GATE_BYPASS_ATTEMPT
P4BLOC immédiat

LLM sans wrapper conforme

Appel direct à un LLM externe sans passer par runLLMControlled. Le constructeur choisit son moteur dans le pipeline canon — jamais en le contournant. Bloc depuis v0.4.1.

signal: P4_NON_CONFORM_LLM_SIGNATURE
P5BLOC

Watermark absent dans la sortie

Réponse pipeline renvoyée sans métadonnée de traçabilité ELYSÉA. La chaîne de conformité est rompue.

signal: P5_WATERMARK_MISSING
P6BLOC immédiat

Désactivation de la télémétrie éthique

Désactiver la télémétrie de conformité canon (posture, Guardian log). L'enforcement est architectural côté Core — aucune API ne permet de la couper.

signal: P6_TELEMETRY_DISABLED
P7BLOC

Appel sans token de consentement

Requête pipeline ou memory.write lancée sans fournir le token de consentement ELYSÉA valide pour l'utilisateur concerné.

signal: P7_MISSING_CONSENT_TOKEN
P8BLOC immédiat

Badge vérifié sans attestation

Afficher « Vérifié — mesures publiques » ou tout badge de certification ELYSÉA sans attestation Core valide. Bloc depuis v0.4.1 — révocation immédiate si fraude confirmée.

signal: P8_UNCERTIFIED_BADGE_USAGE

Source : ELYSEA.ARCH.CANON_GUARDIAN_SDK.v1 §3 — ELYSEA.SDK.INTEGRITY_PROTECTION.v1 §4. Ce canon est figé : ELYSÉA ne retire pas une prohibition par décision commerciale.


§4 — Paliers & accès

PalierPrixCléEnvironnementQuotaBadge
TESTGratuitsk_test_Sandbox · sans limite de durée · 500 interactions par mois1 app · communautairePowered by ELYSÉA
VOTRE PRODUIT2,50 € HT, puis dégressifsk_live_Production · par utilisateur actif dans le moisDégressif par tranche : 2,50 € / 1,50 € / 0,80 € HTPowered by ELYSÉA
VOS ÉQUIPES

Enterprise · Plateformes · Public · Éducation : sur demande

30 € HT / an, puis dégressif au volumesk_live_Production · par employé couvertLicence annuelle · rapport conformité inclusPowered by ELYSÉA

Le pipeline du cerveau exige la clé de modèle du constructeur (BYOK) ; le dépôt de clé n’est pas encore ouvert : le pipeline n’est donc pas encore ouvert aux constructeurs. TEST gratuit : 500 interactions par mois. VOTRE PRODUIT dégressif par tranche dès le premier utilisateur actif, aucun frais fixe, aucun abonnement minimum. Chaque formule comprend 200 messages par utilisateur actif et par mois ; au-delà, 0,005 € HT par message, facturé au prorata. Suspension du service après 10 jours d'impayé. Ouverture des ventes prochainement. Aucun paiement n'est encore accepté.VOS ÉQUIPES licence annuelle par employé couvert. Enterprise et cas spéciaux sur demande. Détail complet : page tarifs.


§5 — Trust mark & badges

Powered by ELYSÉA

Test et production

Badge de premier niveau. Indique que l'app intègre le SDK ELYSÉA avec les 8 prohibitions actives. Vérifiable par l'utilisateur via son portail ID.

Vérifié — mesures publiques

Mesure sur corpus scellés

Niveau supérieur. Attribué après procédure de mesure sur états précis du pipeline — résultats versionnés et publiés à l'issue de la campagne. Ce niveau n'est pas encore émis (campagne en cours). Processus distinct de l'abonnement.

Révocation

Révocation immédiate

P1, P2, P3 (tentative active de contournement) et P8 (fraude de badge confirmée). Aucun délai de grâce.

Délai de 10 jours

P4, P5, P6, P7 — infractions non-frauduleuses. Le constructeur reçoit une notification et dispose de 10 jours pour corriger avant révocation.

Appel — 15 jours

Toute révocation peut être contestée dans un délai de 15 jours calendaires suivant la notification. Procédure décrite dans le contrat partenaire.

Source : ELYSEA.SDK.TRUST_MARK.v1 §3, §5. Voir aussi : page Trust mark.

trust.verify() — vérification programmatique

Le namespace trust du SDK permet de vérifier le statut de vérification d’une app et de valider l’authenticité d’une attestation HMAC côté Core. Usage typique : afficher le badge correct à l’utilisateur, ou auditer un partenaire tiers.

trust.fetchAttestation(appId)

→ Promise<TrustMarkAttestation | null>

Récupère l'attestation trust mark depuis le Core pour un appId donné. Retourne null si le Core est inaccessible ou l'appId inconnu.

trust.getStatus(attestation)

→ CertificationStatus

Dérive le statut de vérification depuis une attestation. Fonction pure — aucun appel réseau. Résultat : 'powered_by' | 'certified_ethical' | 'none'.

trust.verify(attestation)

→ Promise<{ valid: boolean }>

Vérifie l'attestationToken HMAC auprès du Core (POST /verify/attestation). Le Core contrôle la signature côté serveur. Retourne { valid: false } sur tout échec — aucune exception levée.

typescript
// Vérifier le trust mark d'une app partenaire
const attestation = await elysea.trust.fetchAttestation('app_a40a8bd4-008c-4ef4-aef7-b9666d6846a8');

if (!attestation) {
  // App inconnue ou Core inaccessible
  return { certified: false };
}

const status = elysea.trust.getStatus(attestation);
// status → 'powered_by' | 'certified_ethical' | 'none'

const { valid } = await elysea.trust.verify(attestation);
// valid → true si le HMAC est confirmé côté Core
// valid → false si le token est invalide, expiré, ou falsifié

ELYSEA.SDK.SANDBOX_PARTNER.v1 — FIGÉ

§6 — Sandbox — 5 invariants

I-SB-1

firm_safety toujours actif

Le mode de sécurité principal ne peut pas être désactivé en sandbox. Toute tentative de passer firm_safety: false est ignorée silencieusement.

I-SB-2

D0 active sans exception

La directive éthique socle (D0) est active en sandbox exactement comme en production. Le comportement Guardian est identique.

I-SB-3

Guardian SDK actif

Tous les blocs Guardian sont fonctionnels en sk_test_. Le sandbox est un vrai test de conformité — pas un bac à sable permissif.

I-SB-4

8 prohibitions actives

P1 à P8 sont intégralement appliquées. Les signaux d'erreur retournés sont identiques à la production.

I-SB-5

Règle K appliquée

Règle K : les souvenirs bruts de l'utilisateur (items marqués K) ne sortent pas vers une autre application — garde de données, en sandbox comme en production. Aucun endpoint de test ne contourne cette règle.

Erreur de mismatch environnement

typescript
// Une clé vide ou sans préfixe sk_test_/sk_live_ lève ElyseaSDKError au démarrage
import { createElyseaClient, ElyseaSDKError } from '@elysea/core';

try {
  const elysea = createElyseaClient({
    baseUrl:     process.env.ELYSEA_BASE_URL!,
    auth: { apiKey: '', apiSecret: 'secret' }, // clé vide → erreur synchrone
    appId:       'my-app',
    countryCode: 'FR',
    region:      'EU',
  });
} catch (err) {
  if (err instanceof ElyseaSDKError) {
    console.log(err.code);   // 'AUTH_INVALID_KEY'
    console.log(err.action); // action recommandée
  }
}

§7 — Codes d'erreur

CodeTypeCauseAction recommandée
AUTH_INVALID_KEYConfigClé vide ou sans préfixe sk_test_/sk_live_ — erreur synchrone au démarrageVérifier ELYSEA_API_KEY dans createElyseaClient({ auth: { apiKey } })
P1_D0_OVERRIDE_ATTEMPTGuardian BLOCTentative de bypass D0Violation P1 — révision architecture requise
P2_MEMORY_RAW_ACCESSGuardian BLOCLecture directe mémoire utilisateurUtiliser uniquement le pipeline de résolution consentie
P3_SAFETY_GATE_BYPASS_ATTEMPTGuardian BLOCContournement safety gate détectéRevue complète du prompt et de l'architecture LLM
P4_NON_CONFORM_LLM_SIGNATUREGuardian BLOCAppel LLM direct sans passer par le pipeline canonUtiliser uniquement le pipeline canon via pipeline.run()
P5_WATERMARK_MISSINGGuardian BLOCRéponse pipeline sans métadonnée de traçabilitéVérifier l'intégration — ne pas modifier la réponse pipeline brute
P6_CROSS_BUILDER_CONSENT_MISSINGGuardian BLOCCroisement mémoire inter-app sans consentement scopéVérifier le token de consentement cross-app actif
CONSENT_PROOF_REQUIREDMémoirememory.write sans preuve de consentement du constructeur complète — levée avant envoi, ou HTTP 403 du cerveau ; aucune mémoire écriteEnvoyer une MemoryConsentProof complète — voir « Mémoire : consentement prouvé obligatoire »
P7_MISSING_CONSENT_TOKENGuardian BLOCAppel sans token de consentement ELYSÉA valideRecueillir le consentement utilisateur avant tout appel
P8_UNCERTIFIED_BADGE_USAGEGuardian BLOCBadge « Vérifié — mesures publiques » affiché sans attestation Core valideRetirer le badge ou obtenir une attestation via audit officiel ELYSÉA

Les blocs Guardian ne génèrent pas de HTTP 4xx. La réponse est toujours un PipelineResult valide avec guardianAction: “block” et posture: “present_neutral”.

Une question sur la conformité ? Un cas limite non documenté ?

Écrire au fondateurTélécharger la doc (PDF)Quickstart dev