API & clé composite
Deux champs, zéro réécriture. CLOISON expose un endpoint OpenAI-compatible : vous renseignez la base URL et la clé composite, puis chaque requête part pseudonymisée — champs PII convertis en jetons ⟦…⟧ — et la réponse revient restaurée, sans toucher à votre code.
| Base URL | https://api.wonkom.ai |
|---|---|
| Clé composite | CLOISON_v1_acme_e8f2…9ab1 |
| Authentification | En-tête Authorization: Bearer — aucun secret dans l'URL |
01Endpoints
Tout passe par un unique endpoint OpenAI-compatible. Il n'existe pas de SDK propriétaire à apprendre : vous conservez votre client, vos modèles et vos prompts. La seule chose qui change est l'adresse à laquelle votre interface envoie ses requêtes.
Le protocole est celui que votre client connaît déjà. Les champs model, messages, temperature et max_tokens transitent sans être réécrits — CLOISON n'intercepte que les champs déclarés par votre politique de pseudonymisation.
# Deux valeurs, et rien d'autre à toucher.
OPENAI_BASE_URL = "https://api.wonkom.ai"
OPENAI_API_KEY = "CLOISON_v1_acme_e8f2…9ab1"
# Le protocole OpenAI est conservé tel quel :
# model, messages, temperature … transitent sans être réécrits.| Opération | Chemin | Méthode |
|---|---|---|
| Complétion | /v1/chat/completions | POST |
| Liste des modèles | /v1/models | GET |
| Comptes (usage) | /v1/usage | GET |
Cloison n'expose pas de route dédiée par tenant : le même endpoint dessert tous les espaces, isolés par la clé composite.
02Clé composite
Une seule valeur transporte tout : l'identifiant du tenant et la clé secrète, réunis dans le seul champ clé. Aucun secret ne transite dans l'URL — l'authentification passe par l'en-tête Authorization, révocable à tout moment.
La clé composite isole chaque tenant. Deux espaces ne partagent ni clés, ni politique de pseudonymisation, ni journal : la séparation reste étanche, même sur un endpoint partagé.
# Génère la clé, provisionne l'espace et écrit ./.cloison
$ cloison onboarding --tenant acme --out ./.cloison
# Sortie :
tenant acme
base https://api.wonkom.ai
key CLOISON_v1_acme_e8f2…9ab1 # stockée, jamais réaffichéeAuthorization: Bearer CLOISON_v1_acme_e8f2…9ab1
# ❌ jamais https://api.wonkom.ai?token=CLOISON_v1_…Ne placez jamais la clé dans une URL ou une chaîne de requête : elle serait consignée dans les journaux des proxys et des serveurs. La clé est révocable — en cas de fuite, cloison rotate --tenant acme en émet une nouvelle sans interruption de service.
03Exemples
L'envoi se fait en curl ou via le SDK OpenAI. Avant le modèle, les champs PII sont remplacés par des jetons ⟦…⟧ ; à la réponse, les vraies valeurs sont réintégrées.
curl https://api.wonkom.ai/v1/chat/completions \
-H "Authorization: Bearer $CLOISON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{
"role": "user",
"content": "Résume le dossier de ⟦PII-PATIENT⟧."
}]
}'from openai import OpenAI
client = OpenAI(
base_url="https://api.wonkom.ai",
api_key="CLOISON_v1_acme_e8f2…9ab1",
)
r = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user",
"content": "Résume le dossier de ⟦PII-PATIENT⟧."}],
){
"id": "chatcmpl-7fN9…",
"object": "chat.completion",
"model": "gpt-4o",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "Le dossier de Marie Dupont (n° 7fN9…) compte 3 analyses."
},
"finish_reason": "stop"
}]
}Seuls les champs déclarés par la politique sont convertis. Un champ non reconnu passe tel quel : en mode observe-only, rien n'est transformé, tout est journalisé (voir section audit).
04Journal & logs
Chaque appel produit un événement horodaté dans un journal append-only. Trois états rendent la vie du jeton lisible d'un coup d'œil — et vérifiable.
| Horodatage | Appel | Champs touchés | État |
|---|---|---|---|
| 09:12:03Z | c-7fN9 | patient.nom · patient.date | Pseudonymisé |
| 09:12:03Z | c-7fN9 | — | Restauré |
| 09:12:04Z | c-7fN7 | ⟦PII-PATIENT⟧ | Verrouillé |
{
"ts": "2025-06-04T09:12:03Z",
"tenant": "acme",
"call": "c-7fN9",
"state": "pseudonymise",
"fields": ["patient.nom", "patient.date"],
"sig": "ed25519:4F2A…C9D1"
}05Section audit
Le rapport d'audit est conçu pour être remis à votre autorité de protection des données. En Afrique de l'Ouest, le cadre de référence est celui de la loi n° 2008-12 du 25 janvier 2008 relative à la protection des données à caractère personnel (Sénégal), complété par l'Acte additionnel CEDEAO A/SA.1/01/10 — applicable aussi dans l'espace UEMOA — et par la Convention de Malabo (2014) sur la cybersécurité et la protection des données.
Le régime sénégalais est à deux étages devant la Commission de protection des Données personnelles (CDP) : déclaration pour les traitements courants, autorisation préalable pour ceux qui présentent des risques particuliers. Le rapport documente aussi la distinction entre responsable de traitement et sous-traitant — elle détermine qui doit déclarer et qui doit solliciter l'autorisation. Le RGPD n'intervient qu'en complément (fast-follow Europe), jamais comme cadre principal du rapport.
Le rapport s'appuie d'abord sur le cadre ouest-africain, et ne mentionne le RGPD qu'en complément :
- Loi n° 2008-12 (Sénégal) — traitement des données à caractère personnel
- Acte additionnel CEDEAO A/SA.1/01/10 — applicable aussi dans l'espace UEMOA
- Convention de Malabo (2014) — cybersécurité et protection des données
- Régime deux étages de la CDP — déclaration / autorisation préalable
- Responsable de traitement ≠ sous-traitant — répartition des obligations
Le mode observe-only produit un rapport par tenant, signé : compteurs k-anonymes par type de PII, restaurations incomplètes, cellules dont le compte est inférieur à k, le tout signé Ed25519 et vérifiable avec cloison-verify.
{
"tenant": "acme",
"mode": "observe-only",
"cadre": "loi-2008-12 · CEDEAO-A/SA.1/01/10 · Malabo-2014",
"k_anonymity": 12,
"compteurs": {
"patient.nom": 1842,
"patient.date": 917,
"adresse": 403
},
"restaurations_incompletes": 3,
"cellules_redactees": 17, // < k
"responsabilite": "responsable-de-traitement",
"signature_ed25519": "4F2A…C9D1"
}