Un moteur, ancré dans un répertoire, lié à votre processus.
Telys est un moteur de mémoire et de récupération embarqué pour les agents IA. Parce que le moteur contrôle la disposition physique, nearest-neighbours-where-key-equals-x se résout en une recherche de répertoire et un scan séquentiel d'un bloc contigu — dans votre processus, sans appel externe au moment des requêtes.
L'API publique est une façade : un moteur gérant des collections nommées, chacune étant un index vectoriel filtré avec des identifiants externes, des clés de partition pilotées par les métadonnées, des colonnes de filtre, et une sémantique explicite d'ajout, d'upsert et de suppression.
from telys import Telys, scope_key db = Telys("./memory") col = db.create_collection("docs", dim=768, partition_by="tenant_id", filter_columns=["lang"]) col.add(vectors, ids=ids, metadata=metadata) # new rows only — raises on an existing id col.upsert(vectors, ids=ids, metadata=metadata) # existing id → a new visible version
L'ingestion est explicite. add lève une erreur sur un identifiant existant ; upsert donne à un identifiant existant une nouvelle version visible sous MVCC — le moteur ne conserve jamais deux lignes physiques pour un identifiant logique.
hits = col.search(qvec, top_k=10, where={"tenant_id": "acme"}, explain=True) hits["explain"]["plan"] # "PartitionSliceExactF32" # composite scope → one physical partition key sk = scope_key("acme/shop", "payments", "python") res = symbols.search_text("refund pending after migration", top_k=40, where={"scope_key": sk}, explain=True, target_recall=0.98)
Chaque requête accepte un filtre where en colonnes et peut retourner un plan d'exécution nommant la stratégie physique utilisée. target_recall fixe le seuil de recall que le planificateur doit respecter ; les portées composites partitionnent sur une clé physique unique construite par scope_key.
col.delete(stale_ids) # tombstone — hidden from reads now, dropped at compact() col.compact() col.build_ivf(min_rows=20000, target_recall=0.98) # oversized partitions only snap = col.snapshot() # frozen MVCC read view col.save() # atomic — collection.json is written last, as the commit point col.stats() # partitions · external_ids · embedding_space
La maintenance fait partie de la surface. Les suppressions posent un tombstone immédiatement et sont retirées physiquement à la compaction ; l'IVF est construit par partition, uniquement lorsqu'une partition dépasse le chemin exact ; save est atomique, et la réouverture restaure les données, le réglage appliqué et l'espace d'embedding.
| Capacité | Détail |
|---|---|
| recherche filtrée | Les requêtes par clé de partition se résolvent en une recherche de répertoire et un scan séquentiel d'un bloc contigu — recall de 1,0 sur le chemin exact (D≤384 ; D=768 donne 0,999–0,9995 sur les égalités d'ordre de réduction, zéro manqué réel). Sur un sous-ensemble contigu identique, ce scan égale FAISS brut : le gain est l'organisation, non le noyau. Les filtres hors clé se replient sur le scatter-gather, et le plan d'exécution l'indique. |
| persistance | Écritures sauvegardées par WAL, snapshots MVCC, segments scellés. save() valide de manière atomique ; open_collection() restaure les données, le réglage appliqué et l'espace d'embedding. |
| modèle temporel | Upserts versionnés : un identifiant existant reçoit une nouvelle version visible qui remplace l'ancienne — jamais de ligne dupliquée. Les tombstones masquent immédiatement les lignes supprimées ; la compaction les retire physiquement. |
| embeddings | Agnostique aux embeddings. Apportez vos propres vecteurs, ou attachez un EmbeddingProvider / CallableEmbedder. Un embedder bigramme sur appareil est inclus — lexical, in-process, sans téléchargement de modèle. |
| plateformes | macOS arm64 · Linux x86_64 / arm64 · Windows sous WSL2. |
| licence | SDK public Apache-2.0 sur PyPI (pip install telys) plus un runtime sur appareil signé et licencié, installé par telys login. Bêta publique. |
| latence mesurée | p50/p95 rapportés par sélectivité à recall 1,0, mono-thread, in-process, sur un rig M4 Max déclaré — avec les échantillons bruts et le script. Voir la page des benchmarks. |
Une fine façade publique sur un runtime signé.
Le SDK public ne contient aucune implémentation moteur. Il communique avec le runtime via une seule interface figée — RuntimeHandle — et le runtime conserve ses boucles critiques dans des noyaux Mojo SIMD : un chemin d'exécution sans Python au sein de votre processus Python.
Telys / Collection # public SDK facade — no engine code
└─ RuntimeHandle # the frozen SDK–engine seam
└─ signed runtime # hot loops in Mojo SIMD kernels — zero-Python hot path
├─ partition directory # key → contiguous block
└─ contiguous segments # one sequential scan per scopeTelys — Apache-2.0
Les façades Telys et Collection, Eq et scope_key, les interfaces EmbeddingProvider et Tuner, un chargeur de runtime, et la CLI telys. Un garde de publication vérifie qu'aucune source moteur n'est jamais incluse dans la wheel publique.
telys login l'installe
Une seule connexion provisionne une licence d'appareil gratuite et récupère le runtime signé ; la signature et la licence sont revérifiées hors ligne. Le runtime contient l'index de partitions, MVCC, la compaction et IVF — il est requis pour l'exécution.
Les partitions sont contiguës
Le répertoire associe une clé de partition à son bloc ; les lignes de chaque partition sont stockées de manière contiguë. Une requête délimitée est un seul parcours séquentiel — non une dispersion sur un index qui ignore vos clés.
Le temps est le modèle de données.
Un vecteur associé à un blob de métadonnées n'est pas une mémoire d'agent. Le modèle mémoire donne à chaque fait une fenêtre de validité, une chaîne de supersession explicite, et une vue as_of qui reconstruit ce qui était connu à un instant du temps réel. Il est présenté ici pour ce qu'il est : la direction spécifiée, avec sa machinerie de stockage déjà en production.
Les faits sont valides sur des intervalles
Une mémoire porte une fenêtre [valid_from, valid_to) en temps réel. Une contradiction ferme l'ancienne fenêtre au lieu de détruire la ligne — présent ou absent ne suffit pas pour un agent.
Aucun écrasement silencieux
Un fait correctif pointe vers le fait qu'il remplace. La chaîne est explicite et reconstructible : ce que l'agent croyait, et quand il a cessé de le croire, est une requête.
Ce qui était connu à T
Une vue as_of reconstruit exactement les mémoires valides au temps réel T sous un snapshot MVCC donné — un rappel reproductible et auditable après coup.
Spec, identifiée comme telle.
remember, recall, et as_of sont définis dans le brouillon MEMORY-SEMANTICS — ils indiquent la direction, non une référence d'API livrée. Ils s'appuient sur une machinerie déjà en production : mises à jour versionnées, supersession, tombstones et snapshots MVCC.
Lire le fonctionnement- add / upsert — un id existant devient une nouvelle version visible, jamais une ligne dupliquée
- search / search_text — filtres where=, plans explain, seuils target_recall
- delete — tombstones : masqués des lectures immédiatement, supprimés à la compaction
- compact / build_ivf — maintenance des segments ; IVF par partition pour les partitions surdimensionnées
- snapshot / save / stats — vues de lecture MVCC, sauvegarde durable atomique, réouverture
- Supersession MVCC — chaque mise à jour remplace son prédécesseur ; rien n'est écrasé silencieusement