Движок

Один движок, привязанный к директории, встроенный в ваш процесс.

Telys — встраиваемый движок памяти и поиска для AI-агентов. Поскольку движок управляет физическим расположением данных, запрос «ближайшие соседи, где ключ равен x» сводится к поиску в директории и последовательному сканированию одного непрерывного блока — внутри вашего процесса, без внешних вызовов во время запроса.

02 Поверхность SDK

Публичный API — это фасад: движок, хранящий именованные коллекции; каждая — фильтрованный векторный индекс с внешними идентификаторами, ключами партиций и фильтруемыми столбцами на основе метаданных, а также явной семантикой add / upsert / delete.

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

Загрузка данных явная. add выбрасывает исключение при существующем id; upsert создаёт новую видимую версию существующего id под MVCC — движок никогда не хранит две физические строки для одного логического 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)

Каждый запрос принимает столбцовый фильтр where и может возвращать план explain с указанием физической стратегии выполнения. target_recall задаёт нижнюю границу recall, которую планировщик обязан соблюдать; составные области партиционируются по единому физическому ключу, построенному через 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

Обслуживание — часть поверхности. Удаления немедленно помечаются надгробием и физически удаляются при уплотнении; IVF строится на партицию только там, где партиция превышает точный путь; save атомарен, а повторное открытие восстанавливает данные, применённую настройку и пространство эмбеддингов.

03 Спецификация возможностей
ВозможностьОписание
фильтрованный поискЗапросы по ключу партиции сводятся к поиску в директории и одному последовательному сканированию непрерывного блока — recall 1.0 на точном пути (D≤384; D=768 даёт 0.999–0.9995 при совпадениях по порядку редукции, без подлинных промахов). На идентичном непрерывном подмножестве этот скан не уступает сырому FAISS — выигрыш даёт раскладка, а не ядро. Фильтры вне ключа переключаются на scatter-gather, и план explain сообщает об этом.
персистентностьЗаписи с поддержкой WAL, MVCC-снимки, запечатанные сегменты. save() фиксирует атомарно; open_collection() восстанавливает данные, применённую настройку и пространство эмбеддингов.
темпоральная модельВерсионированные upsert-операции: существующий id получает новую видимую версию, замещающую старую — без дублирования строк. Надгробия немедленно скрывают удалённые строки; уплотнение удаляет их физически.
эмбеддингиНезависимость от модели эмбеддингов. Используйте собственные векторы или подключите EmbeddingProvider / CallableEmbedder. Встроен биграммный эмбеддер на устройстве — лексический, внутри процесса, без загрузки модели.
платформыmacOS arm64 · Linux x86_64 / arm64 · Windows под WSL2.
лицензияПубличный SDK под Apache-2.0 в PyPI (pip install telys) и подписанная лицензированная среда выполнения на устройстве, устанавливаемая через telys login. Публичная бета.
измеренная задержкаp50/p95 по селективности при recall 1.0, однопоточный режим, in-process, на раскрытом стенде M4 Max — с исходными выборками и скриптом. См. страницу бенчмарков.
04 Архитектура

Тонкий публичный фасад над подписанным рантаймом.

Публичный SDK не содержит реализации движка. Он взаимодействует с рантаймом через единственный фиксированный шов — RuntimeHandle — а рантайм держит горячие циклы в Mojo SIMD-ядрах: путь без единой строки Python внутри вашего 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
SDK-фасад

Telys — Apache-2.0

Фасады Telys и Collection, Eq и scope_key, интерфейсы EmbeddingProvider и Tuner, загрузчик рантайма и telys CLI. Защита релиза гарантирует, что исходный код движка никогда не попадёт в публичный wheel.

Подписанный рантайм

telys login устанавливает его

Один вход выдаёт бесплатную лицензию устройства и загружает подписанный рантайм; подпись и лицензия повторно верифицируются офлайн. Рантайм содержит партиционный индекс, MVCC, компакцию и IVF — и необходим для выполнения.

Физическое размещение

Партиции хранятся непрерывно

Директория отображает ключ партиции на её блок; строки каждой партиции хранятся непрерывно. Запрос с ограничением — это один последовательный скан, а не разброс по индексу, который игнорирует ваши ключи.

05 Модель памяти

Время — это модель данных.

Вектор плюс метаданные — это не память агента. Модель памяти наделяет каждый факт окном действия, явной цепочкой замещения и представлением as_of, восстанавливающим то, что было известно в заданный момент реального времени. Здесь она представлена такой, какая есть: зафиксированное направление, под которым уже работает соответствующий механизм хранения.

Окна действия

Факты действуют в интервалах

Память несёт окно [valid_from, valid_to) в реальном времени. Противоречие закрывает старое окно вместо удаления строки — для агента недостаточно знать лишь «есть или нет».

Цепочки замещения

Никакой тихой перезаписи

Корректирующий факт указывает на тот, который он замещает. Цепочка явная и восстанавливаемая: во что верил агент и когда перестал — это запрос.

as_of реконструкция

Что было известно в момент T

Представление as_of точно восстанавливает воспоминания, действовавшие в реальный момент T в рамках заданного MVCC-снимка — воспроизводимый и проверяемый ретроспективно результат.

Спецификация, обозначенная как спецификация.

remember, recall и as_of определены в черновике MEMORY-SEMANTICS — это направление, а не справочник по поставляемому API. Они опираются на механизмы, работающие уже сегодня: версионные обновления, замещение, tombstone-записи и MVCC-снимки.

Читать о принципе работы
Поставляется в 0.1.0b4
  • add / upsert — существующий id становится новой видимой версией, а не дублирующей строкой
  • search / search_text — фильтры where=, планы explain, пороги target_recall
  • delete — tombstone-записи: немедленно скрыты от чтения, удаляются при компакции
  • compact / build_ivf — обслуживание сегментов; пер-партиционный IVF для крупных партиций
  • snapshot / save / stats — MVCC-представления для чтения, атомарное надёжное сохранение, повторное открытие
  • MVCC замещение — каждое обновление замещает предшественника; ничто не перезаписывается молча