From 0ec105bb825fadbc67fccdaaaf974ab61ef665ec Mon Sep 17 00:00:00 2001 From: "xuyan.wxy" Date: Wed, 6 May 2026 19:58:39 +0800 Subject: [PATCH 1/2] fix(config): resolve sparse_embedder provider from dict on MemoryConfig deserialization When Memory is initialized with a dict config (e.g. from auto_config()), MemoryConfig coerced sparse_embedder dicts into BaseSparseEmbedderConfig, leaving _provider_name=None and all fields empty. Add a field_validator that resolves the correct provider subclass before Pydantic coercion. Fixes #904 --- src/powermem/configs.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/powermem/configs.py b/src/powermem/configs.py index dcc46415..fc044661 100644 --- a/src/powermem/configs.py +++ b/src/powermem/configs.py @@ -6,7 +6,7 @@ """ from typing import Optional, Dict, Any -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, field_validator from powermem.integrations.embeddings.config.base import BaseEmbedderConfig from powermem.integrations.embeddings.config.providers import OpenAIEmbeddingConfig @@ -266,6 +266,19 @@ class MemoryConfig(BaseModel): default=None, ) + @field_validator('sparse_embedder', mode='before') + @classmethod + def resolve_sparse_embedder(cls, v): + if isinstance(v, dict) and 'provider' in v: + provider = v['provider'].lower() + config_dict = v.get('config', {}) + config_cls = ( + BaseSparseEmbedderConfig.get_provider_config_cls(provider) + or BaseSparseEmbedderConfig + ) + return config_cls(**config_dict) + return v + def __init__(self, **data): super().__init__(**data) if self.agent_memory is None: From f927649e97d2fe123f32f04b20de7834e89dc653 Mon Sep 17 00:00:00 2001 From: "xuyan.wxy" Date: Thu, 7 May 2026 12:07:00 +0800 Subject: [PATCH 2/2] fix(config): ensure sparse provider registry is populated before MemoryConfig validation Without an explicit import of sparse_providers, BaseSparseEmbedderConfig._registry may be empty when MemoryConfig is first constructed (e.g. in isolated tests or partial imports), causing the field_validator to silently fall back to the base class instead of the correct provider subclass. Add side-effect import to guarantee the registry is filled before any MemoryConfig instance is created. --- src/powermem/configs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/powermem/configs.py b/src/powermem/configs.py index fc044661..23a651e2 100644 --- a/src/powermem/configs.py +++ b/src/powermem/configs.py @@ -11,6 +11,7 @@ from powermem.integrations.embeddings.config.base import BaseEmbedderConfig from powermem.integrations.embeddings.config.providers import OpenAIEmbeddingConfig from powermem.integrations.embeddings.config.sparse_base import BaseSparseEmbedderConfig +import powermem.integrations.embeddings.config.sparse_providers # noqa: F401 — ensures sparse provider registry is populated from powermem.integrations.llm.config.base import BaseLLMConfig from powermem.integrations.llm.config.qwen import QwenConfig from powermem.storage.config.base import BaseVectorStoreConfig, BaseGraphStoreConfig