Le moteur

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.

02 Surface SDK

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.

create + ingest
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.

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

maintain + persist
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.

03 Spécification des capacités
CapacitéDétail
recherche filtréeLes 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 temporelUpserts 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.
embeddingsAgnostique 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.
plateformesmacOS arm64 · Linux x86_64 / arm64 · Windows sous WSL2.
licenceSDK 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éep50/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.
04 Architecture

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.

call path
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 scope
Façade SDK

Telys — 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.

Runtime signé

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.

Disposition physique

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.

05 Le modèle mémoire

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.

Fenêtres de validité

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.

Chaînes de supersession

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.

Reconstruction as_of

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
Livré dans 0.1.0b4
  • 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