đŹđ§ English version
SystÚme de mémoire
Interface et types
IMemoryProvider (Orkeon.Domain.Memory) définit le contrat avec sept méthodes : StoreAsync, GetAsync, SearchAsync, DeleteAsync, ClearAsync, StoreWithEmbeddingAsync et SearchSimilarAsync (recherche vectorielle par similarité cosinus).
Cinq types de mémoire sont définis par MemoryType : ShortTerm (contexte immédiat), LongTerm (informations persistantes), Episodic (séquences d'événements), Entity (informations sur des entités spécifiques), Procedural (compétences apprises).
Implémentations
| Provider | Classe | Caractéristiques |
|---|---|---|
| In-Memory | InMemoryProvider |
ConcurrentDictionary, recherche vectorielle cosinus, développement/tests |
| Redis | RedisMemoryProvider |
Clés préfixées, politiques Polly, sérialisation JSON camelCase |
| SQLite | SqliteMemoryProvider |
Microsoft.Data.Sqlite, persistance locale (fichier ou :memory:), embeddings en BLOB, recherche plein texte LIKE + recherche vectorielle cosinus (scan en mémoire), identifiants et métadonnées préservés à la relecture |
| ChromaDB | ChromaDbMemoryProvider |
API REST v2 (routes tenant/database), base vectorielle |
| Pinecone | PineconeMemoryProvider |
Cloud vector database |
| LanceDB | LanceDbMemoryProvider |
Serveur distant LanceDB Cloud/Enterprise â REST + Arrow IPC, recherche vectorielle et plein-texte cĂŽtĂ© serveur |
LanceDB (intégration distante réelle)
LanceDbMemoryProvider cible un serveur LanceDB Cloud / Enterprise via le
protocole Lance REST Namespace
(HttpClient brut, aucun SDK). Il n'existe plus de store local : l'ancienne
implémentation « fichier JSON (+gzip) sur le VFS avec scoring cosinus local » a été
remplacĂ©e (dĂ©cision R4.11 â implĂ©menter LanceDB rĂ©ellement).
Protocole
| Opération provider | Endpoint REST | Payload |
|---|---|---|
InitializeAsync (table auto-créée au premier usage) |
POST /v1/table/{t}/exists, POST /v1/table/{t}/create, POST /v1/table/{t}/create_index (FTS) |
JSON / Arrow IPC stream |
StoreAsync / UpdateAsync (upsert) |
POST /v1/table/{t}/merge_insert?on=id&when_matched_update_all=true&when_not_matched_insert_all=true |
Arrow IPC stream |
GetAsync / ListKeysAsync |
POST /v1/table/{t}/query (filtre SQL / pagination k+offset) |
JSON â Arrow IPC file |
SearchAsync (plein-texte BM25) |
POST /v1/table/{t}/query avec full_text_query |
JSON â Arrow IPC file |
SearchSimilarAsync (vectoriel) |
POST /v1/table/{t}/query avec vector.single_vector + distance_type |
JSON â Arrow IPC file |
DeleteAsync / ClearAsync |
POST /v1/table/{t}/delete (prédicat SQL) |
JSON |
CountAsync |
POST /v1/table/{t}/count_rows |
JSON â entier brut |
L'authentification utilise l'en-tĂȘte x-api-key (+ x-lancedb-database optionnel).
Les payloads de données sont encodés/décodés en Arrow IPC via le paquet
Apache.Arrow (Apache-2.0, cf. THIRD-PARTY-NOTICES.md). Le schéma de table est
fixe : id, content, vector (FixedSizeListimportance,
source, tags (JSON), created_at, metadata_json.
Configuration
{
"Orkeon": {
"LanceDb": {
"Endpoint": "https://my-deployment.us-east-1.api.lancedb.com",
"ApiKey": "âŠ",
"Database": "optionnel",
"TableName": "orkeon_memories",
"EmbeddingDimension": 1536,
"DistanceType": "cosine",
"CreateFullTextIndexOnInit": true
}
}
}
Enregistrement : services.AddOrkeonLanceDb(configuration) (section Orkeon:LanceDb).
Sans Endpoint, la résolution du provider échoue explicitement (pas de repli local).
Limites connues
- Plein-texte :
SearchAsyncexige un index FTS surcontent. Le provider tente de le créer à la création de la table (CreateFullTextIndexOnInit) ; si la création échoue, un avertissement est journalisé et l'erreur serveur est propagée telle quelle aux appelsSearchAsyncsuivants (aucune simulation locale). - Hybride : l'endpoint
queryn'exĂ©cute pas la fusion vectoriel+plein-texte en un appel ;HybridSearchAsyncĂ©met deux requĂȘtes serveur (classements_distanceet_scorecalculĂ©s cĂŽtĂ© serveur) puis fusionne localement les deux listes classĂ©es avecVectorWeight/FullTextWeightâ mĂȘme approche que les rerankers des SDK officiels LanceDB. - Scores : la similaritĂ© retournĂ©e vaut
1 â _distance, pertinente pour la mĂ©triquecosine(dĂ©faut) ; pourl2/dotl'Ă©chelle diffĂšre. DeleteAsync/UpdateAsync: l'API delete renvoie une version de commit, pas un compteur â le provider vĂ©rifie d'abord l'existence de la clĂ© (1 requĂȘtequerysupplĂ©mentaire) pour prĂ©server le contrat boolĂ©en.- Filtres mĂ©tadonnĂ©es :
sourcese traduit en Ă©galitĂ© SQL ;tag/tagset les clĂ©s custom enLIKE '%âŠ%'sur les colonnes JSON (sĂ©mantique de sous-chaĂźne â les caractĂšres jokers SQL%/_dans les valeurs matchent largement). - Dimension fixe : un embedding dont la taille diffĂšre de
EmbeddingDimensionprovoque uneInvalidOperationExceptionexplicite (le schéma serveur est figé).
ChromaDB â version supportĂ©e et configuration
ChromaDbMemoryProvider cible l'API REST v2 de ChromaDB
(/api/v2/tenants/{tenant}/databases/{database}/collections/...), c'est-Ă -dire les
serveurs ChromaDB ℠0.6.x, y compris la série 1.x. Les routes historiques
/api/v1 ont été retirées cÎté serveur (réponse HTTP 410) et ne sont plus utilisées
par le provider â les serveurs †0.5.x (v1 uniquement) ne sont donc pas supportĂ©s.
Le tenant et la base de données ciblés sont configurables via ChromaDbOptions
(section de configuration Orkeon:ChromaDb) et valent par défaut
default_tenant/default_database, les valeurs créées d'office par un serveur
ChromaDB mono-tenant. Un tenant ou une base non par défaut doit déjà exister sur
le serveur (le provider ne les crée pas ; seule la collection est créée à la volée
via get_or_create).
{
"Orkeon": {
"ChromaDb": {
"BaseUrl": "http://localhost:8000",
"Tenant": "default_tenant",
"Database": "default_database",
"CollectionName": "orkeon_memories",
"DefaultTopK": 10
}
}
}
Le provider expose en outre HeartbeatAsync() qui sonde la vivacité du serveur via
GET /api/v2/heartbeat et renvoie false (sans lever) si le serveur est injoignable
ou répond en erreur.
Sélection par configuration
MemoryProviderFactory (port IMemoryProviderFactory) résout le provider depuis
MemoryProviderConfigDto.Type : inmemory, redis, sqlite, chromadb, pinecone, lancedb.
Pour SQLite, ConnectionString est la chaĂźne de connexion SQLite
(ex. Data Source=orkeon-memory.db) et Options["TableName"] permet de changer la table
(identifiant validé contre l'injection SQL). Pour LanceDB, ConnectionString est l'endpoint
REST LanceDB Cloud/Enterprise et Options peut porter ApiKey, TableName, Database
(sans endpoint : avertissement explicite et repli In-Memory ; cĂąblage DI via
AddOrkeonLanceDb). Un type inconnu retombe sur In-Memory avec un avertissement explicite.
Sélection du provider par crew
Une crew peut déclarer son propre provider via memoryProvider en YAML (ou CrewBuilder.WithMemoryProvider).
La sĂ©lection voyage jusqu'au run au lieu d'ĂȘtre figĂ©e globalement par la configuration Memory:Provider :
memoryProviderest mappé dansCrewConfiguration.MemoryProvider, queCrewFactoryreporte sur l'agrégat de domaineCrew(Crew.MemoryProvider).- Au kickoff, l'orchestrateur enregistre
Crew.Id â Crew.MemoryProviderdans le singletonCrewMemoryProviderRegistry(indexĂ© par crew, donc les sĂ©lections ne fuient jamais d'une crew Ă l'autre). - Quand
MemoryServicematĂ©rialise le systĂšme de mĂ©moire de cette crew, il rĂ©sout la chaĂźne enregistrĂ©e en unIMemoryProviderconcret viaMemoryProviderFactoryet adosse la mĂ©moire long terme de la crew Ă ce provider (la mĂ©moire court terme reste une fenĂȘtre glissante in-process). Les types inconnus/indisponibles conservent le repli In-Memory-avec-avertissement de la factory.
Une crew qui ne dĂ©clare aucun memoryProvider utilise le store in-process par dĂ©faut â le comportement est inchangĂ©.
Chiffrement au repos
EncryptedMemoryProviderDecorator enveloppe n'importe quel IMemoryProvider (SQLite,
Redis, In-MemoryâŠ) : le contenu est chiffrĂ© via IEncryptionProvider avant stockage et
dĂ©chiffrĂ© Ă la lecture. Les embeddings et les mĂ©tadonnĂ©es restent en clair (nĂ©cessaires Ă
l'indexation) ; la recherche vectorielle (SearchSimilarAsync) est déléguée au provider
interne et le contenu des résultats est déchiffré au retour. La recherche plein texte
(SearchAsync) sur un store chiffrĂ© ne matche que le texte chiffrĂ© â utilisez la recherche
vectorielle dans ce cas.
Mémoire cognitive
Le sous-systÚme cognitif dans Orkeon.Infrastructure.Memory.Cognitive ajoute des capacités avancées : MemoryAnalysis (scoring d'importance 0.0-1.0, catégorisation, extraction d'entités), ContradictionCheck (détection de conflits entre mémoires), ScoredMemory (scoring composite : similarité sémantique 0.5 + récence 0.3 + importance 0.2), et MemoryConsolidator (consolidation et résolution de conflits).
Voir aussi : Fournisseurs LLM · Sécurité · Retour à l'index