c2743251e9
Self-evolving AI scientist framework built on LangGraph/LangChain with CLI/TUI core, FastAPI gateway, and Next.js frontend. Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
80 lines
2.3 KiB
Python
80 lines
2.3 KiB
Python
from types import SimpleNamespace
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from langchain_core.messages import SystemMessage
|
|
|
|
from EvoScientist.middleware.memory import EvoMemoryMiddleware, create_memory_middleware
|
|
|
|
|
|
class DummyRequest:
|
|
def __init__(self, *, messages=None, system_message="base"):
|
|
self.state = {"messages": messages or []}
|
|
self.runtime = None
|
|
self.system_message = SystemMessage(content=system_message)
|
|
|
|
def override(self, **kwargs):
|
|
clone = object.__new__(DummyRequest)
|
|
clone.__dict__ = dict(self.__dict__)
|
|
clone.__dict__.update(kwargs)
|
|
return clone
|
|
|
|
|
|
class Human:
|
|
def __init__(self, content):
|
|
self.content = content
|
|
|
|
|
|
def _middleware(**kwargs):
|
|
return EvoMemoryMiddleware(backend=MagicMock(), **kwargs)
|
|
|
|
|
|
def test_empty_memory_does_not_inject_placeholder():
|
|
mw = _middleware()
|
|
request = DummyRequest()
|
|
|
|
result = mw.modify_request(request)
|
|
|
|
assert result is request
|
|
|
|
|
|
def test_explicit_memory_request_injects_write_instructions(monkeypatch):
|
|
mw = _middleware()
|
|
request = DummyRequest(messages=[Human("请记住:默认使用中文回答")])
|
|
monkeypatch.setattr(
|
|
"EvoScientist.middleware.memory.EvoMemoryMiddleware._latest_user_text",
|
|
lambda _self, _request: "请记住:默认使用中文回答",
|
|
)
|
|
|
|
result = mw.modify_request(request)
|
|
|
|
assert result is not request
|
|
content = str(result.system_message.content)
|
|
assert "/memory/MEMORY.md" in content
|
|
assert "evo_memory" not in content
|
|
|
|
|
|
def test_existing_memory_is_bounded():
|
|
mw = _middleware(max_injected_chars=5)
|
|
request = DummyRequest()
|
|
request.state["evo_memory_content"] = "abcdefghijklmnopqrstuvwxyz"
|
|
|
|
result = mw.modify_request(request)
|
|
|
|
content = str(result.system_message.content)
|
|
assert "Earlier memory omitted" in content
|
|
assert "vwxyz" in content
|
|
assert "abcdefghij" not in content
|
|
|
|
|
|
@patch("EvoScientist.config.load_config")
|
|
def test_create_memory_middleware_reads_injection_config(mock_load_config, tmp_path):
|
|
mock_load_config.return_value = SimpleNamespace(
|
|
memory_injection_enabled=False,
|
|
memory_injection_max_chars=123,
|
|
)
|
|
|
|
mw = create_memory_middleware(memory_dir=str(tmp_path / "memory"))
|
|
|
|
assert mw._inject_memory is False
|
|
assert mw._max_injected_chars == 123
|