Documentation Souvenis
Donnez une memoire a votre IA en 10 minutes.
Ce guide couvre tout ce dont vous avez besoin pour integrer Souvenis.
Quickstart — Copie dans ton AI de codage
Donne ce contexte a Cursor, Windsurf, Claude Code ou tout autre AI de codage pour une installation automatique
Installe et configure Souvenis — API memoire persistante pour LLMs.
Installation :
npm install souvenis
Initialisation :
import Souvenis from 'souvenis'
const memory = new Souvenis({
apiKey: process.env.SOUVENIS_API_KEY
})
Methodes principales :
await memory.save({ userId, content })
await memory.getContext({ userId })
await memory.retrieve({ userId })
Documentation complete :
https://souvenis.eu/docs
Endpoints API REST :
https://souvenis.eu/api/v1
Authentification :
Authorization: Bearer sk-souv-***Demarrage rapide
3 etapes pour donner une memoire a votre IA.
Installez le SDK
npm install souvenisSauvegardez votre premiere memoire
import Souvenis from 'souvenis'
const memory = new Souvenis({
apiKey: process.env.SOUVENIS_API_KEY
})
// Sauvegarder une memoire
await memory.save({
userId: 'user-123',
content: "L'utilisateur s'appelle Alice et prefere le francais."
})
// La retrouver plus tard
const results = await memory.retrieve({ userId: 'user-123' })
console.log(results.memories[0].content)
// → "L'utilisateur s'appelle Alice et prefere le francais."C'est tout. Votre IA a maintenant une memoire persistante.
Authentification
Chaque requete a l'API Souvenis necessite une cle API. Votre cle commence par sk-souv-.
Ou trouver votre cle
- Connectez-vous a votre Dashboard
- Allez dans la section Cles API
- Cliquez sur Nouvelle cle
- Copiez votre cle — elle ne sera affichee qu'une seule fois
Utilisation
Ajoutez votre cle dans le header Authorization de chaque requete :
Authorization: Bearer sk-souv-votre-cle-iciNe jamais exposer votre cle API
- Ne la mettez jamais dans du code cote client (React, Vue, navigateur)
- Utilisez toujours une variable d'environnement :
process.env.SOUVENIS_API_KEY - Ne la commitez jamais dans Git
- En cas de fuite, faites une rotation immediate
SDK Reference
Le SDK TypeScript Souvenis expose 9 methodes. Toutes retournent une Promise.
memory.save()
Enregistre une nouvelle memoire. Le texte est chiffre en AES-256-GCM avant stockage.
Parametres
{
userId: string // Identifiant de l'utilisateur
content: string // Le texte a memoriser
metadata?: object // Donnees supplementaires (optionnel)
}Retour
{
memory: {
id: string // Identifiant unique de la memoire
content: string
metadata: object
createdAt: string // Date de creation ISO 8601
updatedAt: string
}
}Exemple
import Souvenis from 'souvenis'
const memory = new Souvenis({ apiKey: process.env.SOUVENIS_API_KEY })
const result = await memory.save({
userId: 'user-123',
content: "L'utilisateur prefere les reponses courtes.",
metadata: { source: 'conversation', topic: 'preferences' }
})
console.log(result.memory.id) // "550e8400-..."memory.retrieve()
Recupere les memoires d'un utilisateur avec pagination par curseur.
Parametres
{
userId: string // Identifiant de l'utilisateur
limit?: number // Nombre max de resultats (defaut: 20)
cursor?: string // Curseur pour la page suivante
search?: string // Recherche textuelle (optionnel)
sortBy?: string // Tri : 'created_at' | 'updated_at'
order?: string // Ordre : 'asc' | 'desc'
}Retour
{
memories: Array<{
id: string
content: string
metadata: object
createdAt: string
updatedAt: string
}>
hasMore: boolean // true s'il y a une page suivante
cursor?: string // Curseur pour la page suivante
}Exemple
const results = await memory.retrieve({
userId: 'user-123',
limit: 5
})
results.memories.forEach(m => {
console.log(m.content)
})
// Pagination
if (results.hasMore) {
const page2 = await memory.retrieve({
userId: 'user-123',
cursor: results.cursor
})
}memory.getContext()
Recupere un contexte structure pret a injecter dans un prompt LLM. Combine les memoires les plus pertinentes.
Parametres
{
userId: string // Identifiant de l'utilisateur
maxTokens?: number // Limite de tokens (defaut: 2000)
limit?: number // Nombre max de memoires (optionnel)
}Retour
{
context: string // Texte formate pour injection prompt
memoriesUsed: number // Nombre de memoires incluses
memoriesTotal: number // Nombre total de memoires
memoriesFiltered: number // Memoires exclues (injection ou erreur)
truncated: boolean // true si le contexte a ete tronque
tokensEstimated: number // Estimation du nombre de tokens
}Exemple
const ctx = await memory.getContext({
userId: 'user-123',
maxTokens: 1500
})
// Injecter dans votre prompt LLM
const prompt = `Contexte utilisateur :
${ctx.context}
Question : ...`memory.update()
Met a jour le contenu ou les metadonnees d'une memoire existante. Au moins un champ parmi content ou metadata est requis.
Parametres
{
memoryId: string // ID de la memoire a modifier
content?: string // Nouveau contenu (optionnel)
metadata?: object // Nouvelles metadonnees (optionnel)
}Retour
{
memory: {
id: string
content: string
metadata: object
updatedAt: string // Date de mise a jour ISO 8601
}
}Exemple
await memory.update({
memoryId: "550e8400-...",
content: "L'utilisateur prefere les reponses detaillees.",
metadata: { category: 'preference', updated_reason: 'user feedback' }
})memory.delete()
Supprime definitivement une memoire par son identifiant.
Parametres
{
memoryId: string // ID de la memoire a supprimer
}Retour
// void — aucune valeur de retour (204 No Content)Exemple
await memory.delete({ memoryId: "550e8400-..." })memory.deleteAll()
Supprime toutes les donnees d'un utilisateur. Action irreversible — droit a l'effacement RGPD Art. 17.
Parametres
{
userId: string // Identifiant de l'utilisateur
}Retour
{
status: string // "erased"
erasureId: string // ID de preuve de suppression
erasedAt: string // Date de suppression ISO 8601
regulation: string // "RGPD (UE) 2016/679 — Article 17"
erasedResources: {
memories: number // Nombre de memoires supprimees
consents: number // Nombre de consentements supprimes
}
}Exemple
// Attention : action irreversible
const result = await memory.deleteAll({ userId: 'user-123' })
console.log(result.erasureId) // Conserver comme preuve
console.log(result.erasedResources) // { memories: 42, consents: 3 }memory.export()
Exporte toutes les donnees d'un utilisateur au format JSON. Droit a la portabilite RGPD Art. 20.
Parametres
{
userId: string // Identifiant de l'utilisateur
}Retour
{
data: {
exportMetadata: {
formatVersion: string
exportedAt: string
regulation: string // "RGPD (UE) 2016/679 — Article 20"
}
data: {
memories: Memory[]
consents: Consent[]
processingHistory: ProcessingLog[]
}
statistics: {
totalMemories: number
totalConsents: number
totalOperations: number
}
}
}Exemple
const result = await memory.export({ userId: 'user-123' })
console.log(result.data.statistics.totalMemories)
console.log(result.data.data.memories) // Memoires dechiffrees
console.log(result.data.exportMetadata.regulation)memory.getConsent()
Recupere tous les consentements d'un utilisateur (RGPD Art. 15 — Droit d'acces).
Parametres
{
userId: string // Identifiant de l'utilisateur
}Retour
{
consents: Array<{
consentType: string // Ex: 'memory_storage', 'research', etc.
granted: boolean
grantedAt: string | null
revokedAt: string | null
createdAt: string
updatedAt: string
}>
}Exemple
const result = await memory.getConsent({ userId: 'user-123' })
result.consents.forEach(c => {
console.log(`${c.consentType}: ${c.granted ? 'accorde' : 'refuse'}`)
})memory.updateConsent()
Met a jour le consentement d'un utilisateur (RGPD Art. 7). Enregistre dans un journal d'audit immutable.
Parametres
{
userId: string // Identifiant de l'utilisateur
consentType: string // 'memory_storage' | 'ai_processing' | 'data_retention' | ...
granted: boolean // true = accorde, false = revoque
}Retour
{
consent: {
consentType: string
granted: boolean
grantedAt: string | null
revokedAt: string | null
updatedAt: string
}
}Exemple
// Accorder le consentement recherche
await memory.updateConsent({
userId: 'user-123',
consentType: 'ai_processing',
granted: true
})
// Revoquer le consentement
await memory.updateConsent({
userId: 'user-123',
consentType: 'ai_processing',
granted: false
})API REST
Pour les developpeurs qui preferent les appels HTTP directs sans SDK.
Base URL : https://souvenis.eu/api/v1
/api/v1/memoriesCreer une nouvelle memoire
Body
{
"content": "L'utilisateur aime le jazz.",
"metadata": { "source": "chat" },
"tags": ["musique", "preference"]
}Reponse
{
"id": "mem_abc123",
"created_at": "2026-03-21T10:00:00Z"
}/api/v1/memoriesLister et rechercher les memoires
Reponse
{
"memories": [
{
"id": "mem_abc123",
"content": "L'utilisateur aime le jazz.",
"metadata": { "source": "chat" },
"tags": ["musique"],
"created_at": "2026-03-21T10:00:00Z"
}
],
"total": 1
}/api/v1/memories/:idMettre a jour une memoire existante
Body
{
"content": "L'utilisateur adore le jazz et le blues.",
"tags": ["musique", "preference", "updated"]
}Reponse
{
"id": "mem_abc123",
"updated_at": "2026-03-21T11:00:00Z"
}/api/v1/memories/:idSupprimer une memoire
Reponse
{ "deleted": true }/api/v1/memories/contextObtenir un contexte structure pour injection dans un prompt
Reponse
{
"context": "Preferences utilisateur : ...",
"sources": ["mem_abc123", "mem_def456"],
"tokenCount": 340
}/api/v1/keysCreer une nouvelle cle API
Reponse
{
"id": "key_xyz789",
"key": "sk-souv-...",
"created_at": "2026-03-21T10:00:00Z"
}/api/v1/keysLister les cles API actives
Reponse
{
"keys": [
{
"id": "key_xyz789",
"prefix": "sk-souv-abc...",
"created_at": "2026-03-21T10:00:00Z",
"last_used": "2026-03-21T12:00:00Z"
}
]
}/api/v1/keys/:id/rotateRotation d'une cle API — genere une nouvelle cle et desactive l'ancienne
Reponse
{
"id": "key_new123",
"key": "sk-souv-...",
"rotated_at": "2026-03-21T10:00:00Z"
}/api/v1/keys/:idRevoquer (supprimer) une cle API
Reponse
{ "deleted": true }/api/v1/keys/:idActiver ou desactiver une cle API
Body
{ "is_active": false }Reponse
{
"id": "key_xyz789",
"is_active": false,
"updated_at": "2026-03-21T10:00:00Z"
}/api/v1/keys/:id/signing-secretRecuperer le signing secret pour la verification de webhooks
Reponse
{
"signing_secret": "whsec_..."
}/api/v1/transparencyInformations de transparence IA (EU AI Act Art. 13)
Reponse
{
"data": {
"system_name": "SOUVENIS Memory API",
"risk_category": "limited_risk",
"regulation": "Reglement (UE) 2024/1689",
"automated_decisions": false,
"human_oversight": true
}
}/api/v1/users/:idSupprimer un compte et toutes ses donnees (droit a l'effacement)
Reponse
{ "deleted": true }/api/v1/users/:id/exportExporter toutes les donnees personnelles (droit a la portabilite)
Reponse
{
"data": {
"memories": [...],
"keys": [...],
"consent": {...},
"exported_at": "2026-03-21T10:00:00Z"
}
}/api/v1/users/:id/consentRecuperer l'etat du consentement
Reponse
{
"research_consent": false,
"consented_at": null
}/api/v1/users/:id/consentMettre a jour le consentement
Body
{ "research_consent": true }Reponse
{
"research_consent": true,
"updated_at": "2026-03-21T10:00:00Z"
}Exemples complets
Integrations completes avec les principaux modeles IA. Copy-paste et c'est parti.
Avec Claude (Anthropic)
import Anthropic from '@anthropic-ai/sdk'
import Souvenis from 'souvenis'
const anthropic = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY
})
const memory = new Souvenis({
apiKey: process.env.SOUVENIS_API_KEY
})
async function chat(userMessage: string) {
// 1. Recuperer le contexte memorise
const ctx = await memory.getContext({ userId: 'user-123', maxTokens: 1500 })
// 2. Appeler Claude avec le contexte
const response = await anthropic.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
system: `Tu es un assistant avec une memoire persistante.
Voici ce que tu sais de l'utilisateur :
${ctx.context}`,
messages: [{ role: 'user', content: userMessage }]
})
const assistantReply = response.content[0].type === 'text'
? response.content[0].text
: ''
// 3. Sauvegarder les nouvelles informations
await memory.save({
userId: 'user-123',
content: `User: ${userMessage}\nAssistant: ${assistantReply}`,
metadata: { model: 'claude-sonnet-4-20250514', source: 'chat' }
})
return assistantReply
}
// Utilisation
const reply = await chat("Je m'appelle Alice et j'adore le jazz.")
console.log(reply)Avec GPT-4 (OpenAI)
import OpenAI from 'openai'
import Souvenis from 'souvenis'
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY
})
const memory = new Souvenis({
apiKey: process.env.SOUVENIS_API_KEY
})
async function chat(userMessage: string) {
// 1. Recuperer le contexte
const ctx = await memory.getContext({ userId: 'user-123', maxTokens: 1500 })
// 2. Appeler GPT-4 avec le contexte
const response = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [
{
role: 'system',
content: `Tu es un assistant avec une memoire persistante.
Voici ce que tu sais de l'utilisateur :
${ctx.context}`
},
{ role: 'user', content: userMessage }
]
})
const assistantReply = response.choices[0].message.content ?? ''
// 3. Sauvegarder
await memory.save({
userId: 'user-123',
content: `User: ${userMessage}\nAssistant: ${assistantReply}`,
metadata: { model: 'gpt-4o', source: 'chat' }
})
return assistantReply
}
const reply = await chat("Mon film prefere est Interstellar.")
console.log(reply)Avec Mistral
import MistralClient from '@mistralai/mistralai'
import Souvenis from 'souvenis'
const mistral = new MistralClient({
apiKey: process.env.MISTRAL_API_KEY
})
const memory = new Souvenis({
apiKey: process.env.SOUVENIS_API_KEY
})
async function chat(userMessage: string) {
// 1. Recuperer le contexte
const ctx = await memory.getContext({ userId: 'user-123', maxTokens: 1500 })
// 2. Appeler Mistral avec le contexte
const response = await mistral.chat.complete({
model: 'mistral-large-latest',
messages: [
{
role: 'system',
content: `Tu es un assistant avec une memoire persistante.
Voici ce que tu sais de l'utilisateur :
${ctx.context}`
},
{ role: 'user', content: userMessage }
]
})
const assistantReply = response.choices?.[0]?.message?.content ?? ''
// 3. Sauvegarder
await memory.save({
userId: 'user-123',
content: `User: ${userMessage}\nAssistant: ${assistantReply}`,
metadata: { model: 'mistral-large', source: 'chat' }
})
return assistantReply
}
const reply = await chat("J'habite a Paris et je travaille en IA.")
console.log(reply)Rate Limits
Chaque cle API est soumise a des limites pour garantir la disponibilite du service.
| Endpoint | Par seconde | Par minute | Par jour |
|---|---|---|---|
| Standard (memories, keys, users) | 10 | 100 | 10 000 |
| Context (GET /memories/context) | 5 | 50 | 1 000 |
En cas de depassement, l'API retourne 429 Too Many Requests avec un header Retry-After.
// Reponse 429
{
"error": "Too Many Requests",
"retry_after_seconds": 12,
"hint": "100 req/min per API key. Retry after 12s."
}Codes d'erreur
Toutes les reponses d'erreur retournent un objet JSON avec un champ error et un hint optionnel.
{
"error": "Missing API key",
"hint": "Add header: Authorization: Bearer sk-souv-YOUR_KEY"
}| Code | Message | Description |
|---|---|---|
401 | Unauthorized | Cle API manquante ou invalide. Verifiez le header Authorization. |
403 | Forbidden | Permissions insuffisantes. Cette cle n'a pas acces a cette ressource. |
404 | Not Found | La ressource demandee n'existe pas. Verifiez l'ID. |
422 | Unprocessable Entity | Donnees invalides. Verifiez le format du body JSON. |
429 | Too Many Requests | Trop de requetes. Attendez quelques secondes et reessayez. |
500 | Internal Server Error | Erreur serveur. Reessayez plus tard ou contactez le support. |
RGPD
Souvenis est concu RGPD-natif. Vos utilisateurs ont un controle total sur leurs donnees.
Droit d'acces
Vos utilisateurs peuvent consulter toutes leurs donnees a tout moment.
GET /api/v1/users/:id/exportDroit a la portabilite
Export complet au format JSON standard.
GET /api/v1/users/:id/exportDroit a l'effacement
Suppression complete et irreversible du compte et de toutes les donnees.
DELETE /api/v1/users/:idConsentement
Le partage de donnees anonymisees pour la recherche est optionnel et revocable.
PATCH /api/v1/users/:id/consentToutes les donnees sont hebergees en Europe (Supabase EU West — Paris).
Chiffrement AES-256-GCM au repos. TLS 1.3 en transit. Aucun transfert hors UE.
Lire la politique de confidentialite complète →Besoin d'aide ? Contactez-nous a contact@souvenis.eu
Commencer gratuitement