Add Memori (https://github.com/MemoriLabs/Memori) integration for persistent cross-session memory capabilities in both create_agent and create_deep_agent. ## New Files - agent/memori_config.py: MemoriConfig dataclass for configuration - agent/memori_manager.py: MemoriManager for connection and instance management - agent/memori_middleware.py: MemoriMiddleware for memory recall/storage - tests/: Unit tests for Memori components ## Modified Files - agent/agent_config.py: Added enable_memori, memori_semantic_search_top_k, etc. - agent/deep_assistant.py: Integrated MemoriMiddleware into init_agent() - utils/settings.py: Added MEMORI_* environment variables - pyproject.toml: Added memori>=3.1.0 dependency ## Features - Semantic memory search with configurable top-k and threshold - Multi-tenant isolation (entity_id=user, process_id=bot, session_id) - Memory injection into system prompt - Background asynchronous memory augmentation - Graceful degradation when Memori is unavailable 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
"""
|
|
Memori 配置测试
|
|
"""
|
|
|
|
import pytest
|
|
from agent.memori_config import MemoriConfig
|
|
|
|
|
|
class TestMemoriConfig:
|
|
"""测试 MemoriConfig 配置类"""
|
|
|
|
def test_default_values(self):
|
|
"""测试默认值"""
|
|
config = MemoriConfig()
|
|
assert config.enabled is False
|
|
assert config.api_key is None
|
|
assert config.semantic_search_top_k == 5
|
|
assert config.semantic_search_threshold == 0.7
|
|
assert config.inject_memory_to_system_prompt is True
|
|
|
|
def test_enabled_check(self):
|
|
"""测试 is_enabled 方法"""
|
|
config = MemoriConfig(enabled=False)
|
|
assert config.is_enabled() is False
|
|
|
|
config.enabled = True
|
|
assert config.is_enabled() is True
|
|
|
|
def test_get_attribution_tuple(self):
|
|
"""测试 get_attribution_tuple 方法"""
|
|
config = MemoriConfig(
|
|
entity_id="user_123",
|
|
process_id="bot_456"
|
|
)
|
|
entity_id, process_id = config.get_attribution_tuple()
|
|
assert entity_id == "user_123"
|
|
assert process_id == "bot_456"
|
|
|
|
def test_get_attribution_tuple_missing_values(self):
|
|
"""测试缺少 entity_id 或 process_id 时抛出异常"""
|
|
config = MemoriConfig(entity_id="user_123")
|
|
with pytest.raises(ValueError, match="entity_id and process_id are required"):
|
|
config.get_attribution_tuple()
|
|
|
|
def test_get_memory_prompt(self):
|
|
"""测试 get_memory_prompt 方法"""
|
|
config = MemoriConfig()
|
|
memories = ["User likes coffee", "User prefers dark mode"]
|
|
prompt = config.get_memory_prompt(memories)
|
|
|
|
assert "相关记忆" in prompt
|
|
assert "User likes coffee" in prompt
|
|
assert "User prefers dark mode" in prompt
|
|
|
|
def test_get_memory_prompt_empty(self):
|
|
"""测试空记忆列表"""
|
|
config = MemoriConfig()
|
|
prompt = config.get_memory_prompt([])
|
|
assert prompt == ""
|
|
|
|
def test_with_session(self):
|
|
"""测试 with_session 方法"""
|
|
config = MemoriConfig(
|
|
entity_id="user_123",
|
|
process_id="bot_456",
|
|
session_id="session_789"
|
|
)
|
|
|
|
new_config = config.with_session("new_session_999")
|
|
assert new_config.session_id == "new_session_999"
|
|
assert new_config.entity_id == "user_123"
|
|
assert new_config.process_id == "bot_456"
|
|
|
|
# 原配置不受影响
|
|
assert config.session_id == "session_789"
|