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.

1

Creez votre compte

Inscrivez-vous en 30 secondes. Aucune carte bancaire requise.

2

Installez le SDK

bash
npm install souvenis
3

Sauvegardez votre premiere memoire

typescript
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

  1. Connectez-vous a votre Dashboard
  2. Allez dans la section Cles API
  3. Cliquez sur Nouvelle cle
  4. Copiez votre cle — elle ne sera affichee qu'une seule fois

Utilisation

Ajoutez votre cle dans le header Authorization de chaque requete :

http
Authorization: Bearer sk-souv-votre-cle-ici

Ne 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

typescript
{
  userId: string        // Identifiant de l'utilisateur
  content: string       // Le texte a memoriser
  metadata?: object     // Donnees supplementaires (optionnel)
}

Retour

typescript
{
  memory: {
    id: string          // Identifiant unique de la memoire
    content: string
    metadata: object
    createdAt: string   // Date de creation ISO 8601
    updatedAt: string
  }
}

Exemple

typescript
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

typescript
{
  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

typescript
{
  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

typescript
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

typescript
{
  userId: string        // Identifiant de l'utilisateur
  maxTokens?: number    // Limite de tokens (defaut: 2000)
  limit?: number        // Nombre max de memoires (optionnel)
}

Retour

typescript
{
  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

typescript
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

typescript
{
  memoryId: string      // ID de la memoire a modifier
  content?: string      // Nouveau contenu (optionnel)
  metadata?: object     // Nouvelles metadonnees (optionnel)
}

Retour

typescript
{
  memory: {
    id: string
    content: string
    metadata: object
    updatedAt: string   // Date de mise a jour ISO 8601
  }
}

Exemple

typescript
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

typescript
{
  memoryId: string      // ID de la memoire a supprimer
}

Retour

typescript
// void — aucune valeur de retour (204 No Content)

Exemple

typescript
await memory.delete({ memoryId: "550e8400-..." })

memory.deleteAll()

Supprime toutes les donnees d'un utilisateur. Action irreversible — droit a l'effacement RGPD Art. 17.

Parametres

typescript
{
  userId: string        // Identifiant de l'utilisateur
}

Retour

typescript
{
  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

typescript
// 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

typescript
{
  userId: string        // Identifiant de l'utilisateur
}

Retour

typescript
{
  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

typescript
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

typescript
{
  userId: string        // Identifiant de l'utilisateur
}

Retour

typescript
{
  consents: Array<{
    consentType: string   // Ex: 'memory_storage', 'research', etc.
    granted: boolean
    grantedAt: string | null
    revokedAt: string | null
    createdAt: string
    updatedAt: string
  }>
}

Exemple

typescript
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

typescript
{
  userId: string        // Identifiant de l'utilisateur
  consentType: string   // 'memory_storage' | 'ai_processing' | 'data_retention' | ...
  granted: boolean      // true = accorde, false = revoque
}

Retour

typescript
{
  consent: {
    consentType: string
    granted: boolean
    grantedAt: string | null
    revokedAt: string | null
    updatedAt: string
  }
}

Exemple

typescript
// 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

POST/api/v1/memories

Creer une nouvelle memoire

Body

json
{
  "content": "L'utilisateur aime le jazz.",
  "metadata": { "source": "chat" },
  "tags": ["musique", "preference"]
}

Reponse

json
{
  "id": "mem_abc123",
  "created_at": "2026-03-21T10:00:00Z"
}
GET/api/v1/memories

Lister et rechercher les memoires

Reponse

json
{
  "memories": [
    {
      "id": "mem_abc123",
      "content": "L'utilisateur aime le jazz.",
      "metadata": { "source": "chat" },
      "tags": ["musique"],
      "created_at": "2026-03-21T10:00:00Z"
    }
  ],
  "total": 1
}
PATCH/api/v1/memories/:id

Mettre a jour une memoire existante

Body

json
{
  "content": "L'utilisateur adore le jazz et le blues.",
  "tags": ["musique", "preference", "updated"]
}

Reponse

json
{
  "id": "mem_abc123",
  "updated_at": "2026-03-21T11:00:00Z"
}
DELETE/api/v1/memories/:id

Supprimer une memoire

Reponse

json
{ "deleted": true }
GET/api/v1/memories/context

Obtenir un contexte structure pour injection dans un prompt

Reponse

json
{
  "context": "Preferences utilisateur : ...",
  "sources": ["mem_abc123", "mem_def456"],
  "tokenCount": 340
}
POST/api/v1/keys

Creer une nouvelle cle API

Reponse

json
{
  "id": "key_xyz789",
  "key": "sk-souv-...",
  "created_at": "2026-03-21T10:00:00Z"
}
GET/api/v1/keys

Lister les cles API actives

Reponse

json
{
  "keys": [
    {
      "id": "key_xyz789",
      "prefix": "sk-souv-abc...",
      "created_at": "2026-03-21T10:00:00Z",
      "last_used": "2026-03-21T12:00:00Z"
    }
  ]
}
POST/api/v1/keys/:id/rotate

Rotation d'une cle API — genere une nouvelle cle et desactive l'ancienne

Reponse

json
{
  "id": "key_new123",
  "key": "sk-souv-...",
  "rotated_at": "2026-03-21T10:00:00Z"
}
DELETE/api/v1/keys/:id

Revoquer (supprimer) une cle API

Reponse

json
{ "deleted": true }
PATCH/api/v1/keys/:id

Activer ou desactiver une cle API

Body

json
{ "is_active": false }

Reponse

json
{
  "id": "key_xyz789",
  "is_active": false,
  "updated_at": "2026-03-21T10:00:00Z"
}
GET/api/v1/keys/:id/signing-secret

Recuperer le signing secret pour la verification de webhooks

Reponse

json
{
  "signing_secret": "whsec_..."
}
GET/api/v1/transparency

Informations de transparence IA (EU AI Act Art. 13)

Reponse

json
{
  "data": {
    "system_name": "SOUVENIS Memory API",
    "risk_category": "limited_risk",
    "regulation": "Reglement (UE) 2024/1689",
    "automated_decisions": false,
    "human_oversight": true
  }
}
DELETE/api/v1/users/:id

Supprimer un compte et toutes ses donnees (droit a l'effacement)

Reponse

json
{ "deleted": true }
GET/api/v1/users/:id/export

Exporter toutes les donnees personnelles (droit a la portabilite)

Reponse

json
{
  "data": {
    "memories": [...],
    "keys": [...],
    "consent": {...},
    "exported_at": "2026-03-21T10:00:00Z"
  }
}
GET/api/v1/users/:id/consent

Recuperer l'etat du consentement

Reponse

json
{
  "research_consent": false,
  "consented_at": null
}
PATCH/api/v1/users/:id/consent

Mettre a jour le consentement

Body

json
{ "research_consent": true }

Reponse

json
{
  "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)

typescript
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)

typescript
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

typescript
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.

EndpointPar secondePar minutePar jour
Standard (memories, keys, users)1010010 000
Context (GET /memories/context)5501 000

En cas de depassement, l'API retourne 429 Too Many Requests avec un header Retry-After.

json
// 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.

json
{
  "error": "Missing API key",
  "hint": "Add header: Authorization: Bearer sk-souv-YOUR_KEY"
}
CodeMessageDescription
401UnauthorizedCle API manquante ou invalide. Verifiez le header Authorization.
403ForbiddenPermissions insuffisantes. Cette cle n'a pas acces a cette ressource.
404Not FoundLa ressource demandee n'existe pas. Verifiez l'ID.
422Unprocessable EntityDonnees invalides. Verifiez le format du body JSON.
429Too Many RequestsTrop de requetes. Attendez quelques secondes et reessayez.
500Internal Server ErrorErreur 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/export

Droit a la portabilite

Export complet au format JSON standard.

GET /api/v1/users/:id/export

Droit a l'effacement

Suppression complete et irreversible du compte et de toutes les donnees.

DELETE /api/v1/users/:id

Consentement

Le partage de donnees anonymisees pour la recherche est optionnel et revocable.

PATCH /api/v1/users/:id/consent

Toutes 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