v2.7.0
Added
- MemoryProvider abstraction — Introduced
MemoryBackendABC (devsper/memory/providers/base.py) mirroring theLLMBackendpattern. All memory backends implement a unified async interface:store,retrieve,delete,list_memory,list_all_ids,query_similar,health. - MemoryProvider factory —
get_memory_provider()singleton factory resolves the active backend from config ([memory] provider),DEVSPER_MEMORY_PROVIDERenv var, or legacybackendfield. Defaults to Vektori (pgvector) with automatic SQLite fallback whenDATABASE_URLis not set. - Snowflake memory backend — New
SnowflakeBackendusingVECTOR(FLOAT, 1536)columns andVECTOR_COSINE_SIMILARITYfor native semantic search. Credentials resolved exclusively via the devsper credential store orSNOWFLAKE_*env vars — never from config files. - SQLite, Redis, Vektori, Platform backends — Existing stores wrapped as
MemoryBackendimplementations withget_sync_store()escape hatch for legacy sync callers. - Credential store: Snowflake + Redis — Added
snowflakeandredis_memoryproviders to keyring mappings.devsper credentials set snowflake passwordstores the Snowflake password securely;inject_into_env()propagates allSNOWFLAKE_*vars automatically. - Config schema — Added
RedisMemoryConfigandSnowflakeMemoryConfigsub-models under[memory].SnowflakeMemoryConfighas nopasswordfield — credentials are credential-store-only. devsper doctormemory provider health check —run_doctor()now callsprovider.health()and reports the active backend name and status.devsper[snowflake]anddevsper[redis-memory]extras —snowflake-connector-python>=3.6.0andredis>=5.0.0optional dependency groups.deregister(name)in tool registry — Public function to remove a single tool by name without clearing the whole registry.MemoryIndexnative search delegation — When the active backend hassupports_native_vector_search=True,query_memory()andquery_across_runs()delegate directly tobackend.query_similar(), bypassing in-process cosine ranking.
Changed
MemoryRouterandMemoryIndexaccept an optionalbackend: MemoryBackendparameter. The_build_memory_store()fallback now calls the factory instead of constructingMemoryStore()directly.get_effective_memory_store()preserved as a backwards-compatible alias; newget_effective_memory_backend()returns the fullMemoryBackend. Async-only backends (Vektori, Snowflake) are bridged via_AsyncBridgeStorefor sync callers.- Legacy
backendvalues (local,supermemory,hybrid) now map to"vektori"as the default production store.
Fixed
test_pipelines.py— Replacedregistry._tools.pop()(broken module-level access) with newderegister()function.test_e2e_redis_loop.py— Import guard preventsModuleNotFoundErrorwhenredisis not installed; test now correctly skips instead of failing.
Full Changelog: v2.6.0...v2.7.0