Skip to content

Commit 2770582

Browse files
authored
fix: adjust memory schema override precedence (#2062)
1 parent 51f1c0c commit 2770582

3 files changed

Lines changed: 106 additions & 4 deletions

File tree

openviking/session/memory/memory_type_registry.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,12 @@ def __init__(self, load_schemas: bool = True):
3939
self._load_schemas()
4040

4141
def _load_schemas(self) -> None:
42-
"""Load schemas from the resolved memory templates directory and custom directory."""
42+
"""Load schemas from built-in templates, then custom/configured overrides."""
4343
import os
4444

4545
from openviking_cli.utils.config import get_openviking_config
4646

47-
memory_templates_dir = str(resolve_memory_templates_dir())
47+
memory_templates_dir = str(PromptManager._get_bundled_templates_dir() / "memory")
4848
config = get_openviking_config()
4949
custom_dir = config.memory.custom_templates_dir
5050

@@ -57,14 +57,24 @@ def _load_schemas(self) -> None:
5757
)
5858
logger.info(f"Loaded {loaded} memory schemas from templates: {memory_templates_dir}")
5959

60-
# Load from custom directory (if configured) - use replace to allow overriding built-in templates
6160
if custom_dir:
6261
custom_dir_expanded = os.path.expanduser(custom_dir)
6362
if os.path.exists(custom_dir_expanded):
6463
custom_loaded = self.load_from_directory(custom_dir_expanded, replace=True)
6564
logger.info(
6665
f"Loaded {custom_loaded} memory schemas from custom: {custom_dir_expanded}"
6766
)
67+
else:
68+
memory_templates_dir = str(resolve_memory_templates_dir())
69+
if memory_templates_dir != str(
70+
PromptManager._get_bundled_templates_dir() / "memory"
71+
) and os.path.exists(memory_templates_dir):
72+
loaded = self.load_from_directory(memory_templates_dir, replace=True)
73+
logger.info(
74+
"Loaded %s memory schemas from configured prompt templates: %s",
75+
loaded,
76+
memory_templates_dir,
77+
)
6878

6979
def register(self, memory_type: MemoryTypeSchema) -> None:
7080
"""Register a memory type. Raises error if already exists."""

openviking/session/memory/session_extract_context_provider.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
from openviking.core.namespace import to_agent_space, to_user_space
1414
from openviking.message.part import ToolPart
15+
from openviking.prompts.manager import PromptManager
1516
from openviking.server.identity import RequestContext, ToolContext
1617
from openviking.session.memory.core import ExtractContextProvider
1718
from openviking.session.memory.dataclass import MemoryFileContent
@@ -473,14 +474,20 @@ def get_memory_schemas(self, ctx: RequestContext) -> List[Any]:
473474
def get_schema_directories(self) -> List[str]:
474475
"""返回需要加载的 schema 目录"""
475476
if self._schema_directories is None:
476-
memory_templates_dir = str(resolve_memory_templates_dir())
477+
memory_templates_dir = str(PromptManager._get_bundled_templates_dir() / "memory")
477478
config = get_openviking_config()
478479
custom_dir = config.memory.custom_templates_dir
479480
self._schema_directories = [memory_templates_dir]
480481
if custom_dir:
481482
custom_dir_expanded = os.path.expanduser(custom_dir)
482483
if os.path.exists(custom_dir_expanded):
483484
self._schema_directories.append(custom_dir_expanded)
485+
else:
486+
memory_templates_dir = str(resolve_memory_templates_dir())
487+
if memory_templates_dir != str(
488+
PromptManager._get_bundled_templates_dir() / "memory"
489+
) and os.path.exists(memory_templates_dir):
490+
self._schema_directories.append(memory_templates_dir)
484491
return self._schema_directories
485492

486493
def _get_registry(self) -> MemoryTypeRegistry:

tests/test_prompt_manager.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,57 @@ def test_memory_type_registry_loads_schemas_from_prompt_manager_resolved_templat
167167
assert registry.get("custom_memory") is not None
168168

169169

170+
def test_memory_type_registry_prefers_custom_memory_dir_over_prompt_manager_templates_root(
171+
tmp_path, monkeypatch
172+
):
173+
resolved_templates_dir = tmp_path / "resolved-prompts"
174+
resolved_memory_dir = resolved_templates_dir / "memory"
175+
custom_memory_dir = tmp_path / "custom-memory"
176+
resolved_memory_dir.mkdir(parents=True)
177+
custom_memory_dir.mkdir(parents=True)
178+
(resolved_memory_dir / "prompt_root.yaml").write_text(
179+
json.dumps(
180+
{
181+
"memory_type": "prompt_root_memory",
182+
"description": "schema from prompt manager root",
183+
"directory": "viking://user/{{ user_space }}/memories/prompt-root",
184+
"filename_template": "prompt-root.md",
185+
"fields": [],
186+
}
187+
),
188+
encoding="utf-8",
189+
)
190+
(custom_memory_dir / "custom.yaml").write_text(
191+
json.dumps(
192+
{
193+
"memory_type": "custom_memory",
194+
"description": "schema from custom memory dir",
195+
"directory": "viking://user/{{ user_space }}/memories/custom",
196+
"filename_template": "custom.md",
197+
"fields": [],
198+
}
199+
),
200+
encoding="utf-8",
201+
)
202+
203+
monkeypatch.setattr(
204+
PromptManager,
205+
"_resolve_templates_dir",
206+
classmethod(lambda cls, templates_dir=None: resolved_templates_dir),
207+
)
208+
monkeypatch.setattr(
209+
"openviking_cli.utils.config.get_openviking_config",
210+
lambda: SimpleNamespace(
211+
memory=SimpleNamespace(custom_templates_dir=str(custom_memory_dir))
212+
),
213+
)
214+
215+
registry = MemoryTypeRegistry(load_schemas=True)
216+
217+
assert registry.get("custom_memory") is not None
218+
assert registry.get("prompt_root_memory") is None
219+
220+
170221
def test_context_provider_schema_directories_use_prompt_manager_resolved_templates_root(
171222
tmp_path, monkeypatch
172223
):
@@ -188,3 +239,37 @@ def test_context_provider_schema_directories_use_prompt_manager_resolved_templat
188239
provider = SessionExtractContextProvider(messages=[])
189240

190241
assert provider.get_schema_directories() == [str(expected_memory_dir)]
242+
243+
244+
def test_context_provider_schema_directories_prefer_custom_memory_dir_over_prompt_manager_root(
245+
tmp_path, monkeypatch
246+
):
247+
resolved_templates_dir = tmp_path / "resolved-prompts"
248+
custom_memory_dir = tmp_path / "custom-memory"
249+
250+
monkeypatch.setattr(
251+
PromptManager,
252+
"_resolve_templates_dir",
253+
classmethod(lambda cls, templates_dir=None: resolved_templates_dir),
254+
)
255+
monkeypatch.setattr(
256+
"openviking.session.memory.session_extract_context_provider.get_openviking_config",
257+
lambda: SimpleNamespace(
258+
memory=SimpleNamespace(
259+
custom_templates_dir=str(custom_memory_dir),
260+
eager_prefetch=False,
261+
)
262+
),
263+
)
264+
monkeypatch.setattr(
265+
"os.path.exists",
266+
lambda path: path == str(custom_memory_dir)
267+
or path == str(PromptManager._get_bundled_templates_dir() / "memory"),
268+
)
269+
270+
provider = SessionExtractContextProvider(messages=[])
271+
272+
assert provider.get_schema_directories() == [
273+
str(PromptManager._get_bundled_templates_dir() / "memory"),
274+
str(custom_memory_dir),
275+
]

0 commit comments

Comments
 (0)