Один движок, привязанный к директории, встроенный в ваш процесс.
Telys — встраиваемый движок памяти и поиска для AI-агентов. Поскольку движок управляет физическим расположением данных, запрос «ближайшие соседи, где ключ равен x» сводится к поиску в директории и последовательному сканированию одного непрерывного блока — внутри вашего процесса, без внешних вызовов во время запроса.
Публичный API — это фасад: движок, хранящий именованные коллекции; каждая — фильтрованный векторный индекс с внешними идентификаторами, ключами партиций и фильтруемыми столбцами на основе метаданных, а также явной семантикой add / upsert / delete.
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.
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.
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 атомарен, а повторное открытие восстанавливает данные, применённую настройку и пространство эмбеддингов.
| Возможность | Описание |
|---|---|
| фильтрованный поиск | Запросы по ключу партиции сводятся к поиску в директории и одному последовательному сканированию непрерывного блока — 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 — с исходными выборками и скриптом. См. страницу бенчмарков. |
Тонкий публичный фасад над подписанным рантаймом.
Публичный SDK не содержит реализации движка. Он взаимодействует с рантаймом через единственный фиксированный шов — RuntimeHandle — а рантайм держит горячие циклы в Mojo SIMD-ядрах: путь без единой строки Python внутри вашего 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
Фасады Telys и Collection, Eq и scope_key, интерфейсы EmbeddingProvider и Tuner, загрузчик рантайма и telys CLI. Защита релиза гарантирует, что исходный код движка никогда не попадёт в публичный wheel.
telys login устанавливает его
Один вход выдаёт бесплатную лицензию устройства и загружает подписанный рантайм; подпись и лицензия повторно верифицируются офлайн. Рантайм содержит партиционный индекс, MVCC, компакцию и IVF — и необходим для выполнения.
Партиции хранятся непрерывно
Директория отображает ключ партиции на её блок; строки каждой партиции хранятся непрерывно. Запрос с ограничением — это один последовательный скан, а не разброс по индексу, который игнорирует ваши ключи.
Время — это модель данных.
Вектор плюс метаданные — это не память агента. Модель памяти наделяет каждый факт окном действия, явной цепочкой замещения и представлением as_of, восстанавливающим то, что было известно в заданный момент реального времени. Здесь она представлена такой, какая есть: зафиксированное направление, под которым уже работает соответствующий механизм хранения.
Факты действуют в интервалах
Память несёт окно [valid_from, valid_to) в реальном времени. Противоречие закрывает старое окно вместо удаления строки — для агента недостаточно знать лишь «есть или нет».
Никакой тихой перезаписи
Корректирующий факт указывает на тот, который он замещает. Цепочка явная и восстанавливаемая: во что верил агент и когда перестал — это запрос.
Что было известно в момент T
Представление as_of точно восстанавливает воспоминания, действовавшие в реальный момент T в рамках заданного MVCC-снимка — воспроизводимый и проверяемый ретроспективно результат.
Спецификация, обозначенная как спецификация.
remember, recall и as_of определены в черновике MEMORY-SEMANTICS — это направление, а не справочник по поставляемому API. Они опираются на механизмы, работающие уже сегодня: версионные обновления, замещение, tombstone-записи и MVCC-снимки.
Читать о принципе работы- add / upsert — существующий id становится новой видимой версией, а не дублирующей строкой
- search / search_text — фильтры where=, планы explain, пороги target_recall
- delete — tombstone-записи: немедленно скрыты от чтения, удаляются при компакции
- compact / build_ivf — обслуживание сегментов; пер-партиционный IVF для крупных партиций
- snapshot / save / stats — MVCC-представления для чтения, атомарное надёжное сохранение, повторное открытие
- MVCC замещение — каждое обновление замещает предшественника; ничто не перезаписывается молча