Eine Engine, verwurzelt in einem Verzeichnis, eingebunden in Ihren Prozess.
Telys ist eine eingebettete Memory- und Retrieval-Engine für KI-Agenten. Da die Engine das physische Layout besitzt, löst sich nearest-neighbours-where-key-equals-x in einen Verzeichnis-Lookup plus einen sequenziellen Scan eines zusammenhängenden Blocks auf — in Ihrem Prozess, ohne externe Aufrufe zur Abfragezeit.
Die öffentliche API ist eine Fassade: eine Engine, die benannte Collections verwaltet — jede ein gefilterter Vektorindex mit externen IDs, metadatengesteuerten Partition Keys und Filterspalten sowie expliziter add-/upsert-/delete-Semantik.
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
Ingest ist explizit. add wirft bei einer vorhandenen ID einen Fehler; upsert gibt einer vorhandenen ID unter MVCC eine neue sichtbare Version — die Engine hält niemals zwei physische Zeilen für eine logische ID.
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)
Jede Abfrage nimmt einen spaltenbasierten where-Filter entgegen und kann einen explain-Plan zurückgeben, der die physische Strategie benennt, die sie bedient hat. target_recall setzt den Recall-Schwellenwert, den der Planer einhalten muss; zusammengesetzte Scopes partitionieren auf einem einzigen physischen Schlüssel, der durch scope_key gebildet wird.
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
Wartung ist Teil der Oberfläche. Deletes setzen sofort Tombstones und werden bei der Kompaktierung physisch entfernt; IVF wird pro Partition gebaut, nur wenn eine Partition den exakten Pfad überwächst; save ist atomar, und das erneute Öffnen stellt die Daten, das angewandte Tuning und den Einbettungsraum wieder her.
| Fähigkeit | Detail |
|---|---|
| gefilterter Suchlauf | Nearest-neighbors-where-key-equals-x löst sich in einen Verzeichnis-Lookup plus einen sequenziellen Scan eines zusammenhängenden Blocks auf — Recall 1,0 auf dem exakten Pfad (D≤384; D=768 liefert 0,999–0,9995 bei Reduction-Order-Ties, null echte Fehltreffer). Auf einem identischen zusammenhängenden Subset erzielt dieser Scan dasselbe Ergebnis wie rohes FAISS — der Gewinn liegt im Layout, nicht im Kernel. |
| Persistenz | WAL-gesicherte Schreibvorgänge, MVCC-Snapshots, versiegelte Segmente. save() schreibt atomar; open_collection() stellt die Daten, das angewandte Tuning und den Einbettungsraum wieder her. |
| temporales Modell | Versionierte Upserts: Eine vorhandene ID erhält eine neue sichtbare Version, die die alte ablöst — niemals eine doppelte Zeile. Tombstones verbergen gelöschte Zeilen sofort; die Kompaktierung entfernt sie physisch. |
| Embeddings | Embedding-agnostisch. Eigene Vektoren mitbringen oder einen EmbeddingProvider / CallableEmbedder anhängen. Ein On-Device-Bigram-Embedder ist enthalten — lexikalisch, in-process, kein Modell-Download. |
| Plattformen | macOS arm64 · Linux x86_64 / arm64 · Windows unter WSL2. |
| Lizenz | Apache-2.0 öffentliches SDK auf PyPI (pip install telys) plus eine signierte, lizenzierte On-Device-Runtime, installiert durch telys login. Public Beta. |
| gemessene Latenz | p50/p95 je Selektivität bei Recall 1,0 ausgewiesen, Single-Thread, In-Process, auf einem offengelegten M4-Max-System — mit Rohdaten und dem Skript. Siehe Benchmarks-Seite. |
Eine schlanke öffentliche Fassade über einer signierten Runtime.
Das öffentliche SDK enthält keine Engine-Implementierung. Es kommuniziert mit der Runtime über eine einzige eingefrorene Naht — RuntimeHandle — und die Runtime hält ihre Hot Loops in Mojo SIMD-Kerneln: ein Python-freier Hot Path innerhalb Ihres Python-Prozesses.
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
Die Telys- und Collection-Fassaden, Eq und scope_key, die EmbeddingProvider- und Tuner-Interfaces, ein Runtime-Loader sowie die telys CLI. Ein Release-Guard stellt sicher, dass kein Engine-Quellcode je im öffentlichen Wheel ausgeliefert wird.
telys login installiert sie
Ein einmaliges Anmelden stellt eine kostenlose Gerätelizenz bereit und lädt die signierte Runtime; Signatur und Lizenz werden offline erneut geprüft. Die Runtime enthält den Partitionsindex, MVCC, Kompaktierung und IVF — und ist für die Ausführung erforderlich.
Partitionen sind zusammenhängend
Das Verzeichnis ordnet einem Partitionsschlüssel seinen Block zu; die Zeilen jeder Partition werden zusammenhängend gespeichert. Eine bereichsbegrenzte Abfrage ist ein einziger sequenzieller Scan — kein Scatter über einen Index, der Ihre Schlüssel ignoriert.
Zeit ist das Datenmodell.
Ein Vektor plus ein Metadaten-Blob ist kein Agenten-Gedächtnis. Das Speichermodell gibt jedem Fakt ein Gültigkeitsfenster, eine explizite Ablösekette und eine as_of-Sicht, die rekonstruiert, was zu einem Zeitpunkt in der Weltzeit bekannt war. Es wird hier als das präsentiert, was es ist: die festgelegte Richtung, mit der darunter bereits ausgelieferten Speichermaschinerie.
Fakten gelten über Intervalle
Eine Erinnerung trägt ein [valid_from, valid_to)-Fenster in der Weltzeit. Ein Widerspruch schließt das alte Fenster, anstatt die Zeile zu löschen — vorhanden oder nicht ist für einen Agenten nicht ausreichend.
Kein stilles Überschreiben
Ein korrigierender Fakt verweist auf den Fakt, den er ersetzt. Die Kette ist explizit und rekonstruierbar: was der Agent geglaubt hat und wann er aufgehört hat, es zu glauben, ist eine Abfrage.
Was zum Zeitpunkt T bekannt war
Eine as_of-Sicht rekonstruiert exakt die Erinnerungen, die zum Weltzeit-Zeitpunkt T unter einem gegebenen MVCC-Snapshot gültig waren — ein Abruf, der im Nachhinein reproduzierbar und prüfbar ist.
Spec, als Spec gekennzeichnet.
remember, recall und as_of sind im MEMORY-SEMANTICS-Entwurf definiert — sie sind die Richtung, keine ausgelieferte API-Referenz. Sie werden auf Maschinerie abgebildet, die heute ausgeliefert wird: versionierte Updates, Ablösung, Tombstones und MVCC-Snapshots.
Funktionsweise lesen- add / upsert — eine vorhandene id wird zu einer neuen sichtbaren Version, nie zu einer doppelten Zeile
- search / search_text — where=-Filter, explain-Pläne, target_recall-Untergrenzen
- delete — Tombstones: sofort für Lesezugriffe verborgen, bei der Kompaktierung entfernt
- compact / build_ivf — Segment-Wartung; partitionsweises IVF für überdimensionierte Partitionen
- snapshot / save / stats — MVCC-Leseansichten, atomares dauerhaftes Speichern, Wiedereröffnen
- MVCC-Ablösung — jedes Update löst seinen Vorgänger ab; nichts wird still überschrieben