Die Engine

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.

02 SDK surface

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.

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

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.

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)

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.

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

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.

03 Leistungsspezifikation
FähigkeitDetail
gefilterter SuchlaufNearest-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.
PersistenzWAL-gesicherte Schreibvorgänge, MVCC-Snapshots, versiegelte Segmente. save() schreibt atomar; open_collection() stellt die Daten, das angewandte Tuning und den Einbettungsraum wieder her.
temporales ModellVersionierte 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.
EmbeddingsEmbedding-agnostisch. Eigene Vektoren mitbringen oder einen EmbeddingProvider / CallableEmbedder anhängen. Ein On-Device-Bigram-Embedder ist enthalten — lexikalisch, in-process, kein Modell-Download.
PlattformenmacOS arm64 · Linux x86_64 / arm64 · Windows unter WSL2.
LizenzApache-2.0 öffentliches SDK auf PyPI (pip install telys) plus eine signierte, lizenzierte On-Device-Runtime, installiert durch telys login. Public Beta.
gemessene Latenzp50/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.
04 Architektur

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.

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
SDK-Fassade

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

Signierte Runtime

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.

Physisches Layout

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.

05 Das Speichermodell

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.

Gültigkeitsfenster

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.

Ablöseketten

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.

as_of-Rekonstruktion

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
Ausgeliefert in 0.1.0b4
  • 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