hermes-agent-features/tests/plugins/test_semantic_rle_context_engine.py

103 lines
4.0 KiB
Python

"""Tests for the experimental semantic_rle context engine plugin."""
from __future__ import annotations
from agent.context_engine import ContextEngine
from plugins.context_engine import discover_context_engines, load_context_engine
from plugins.context_engine.semantic_rle import SemanticRLEEngine
def _messages() -> list[dict[str, str]]:
return [
{"role": "system", "content": "You are Hermes."},
{"role": "user", "content": "server alpha.example is the current deployment target"},
{"role": "assistant", "content": "Noted: server alpha.example."},
{"role": "user", "content": "decision: use postgres for the ledger"},
{"role": "assistant", "content": "I will use postgres."},
{"role": "user", "content": "todo: compare misses against baseline"},
{"role": "assistant", "content": "Added comparison todo."},
{"role": "user", "content": "unresolved question: how often to compact?"},
{"role": "assistant", "content": "We can measure compaction cadence."},
{"role": "user", "content": "server beta.example is the current deployment target now"},
{"role": "assistant", "content": "Switched to beta.example."},
{"role": "user", "content": "hot tail user message"},
{"role": "assistant", "content": "hot tail assistant message"},
]
def test_semantic_rle_satisfies_abc_and_returns_valid_messages():
engine = SemanticRLEEngine(hot_tail_messages=4)
assert isinstance(engine, ContextEngine)
assert engine.name == "semantic_rle"
result = engine.compress(_messages())
assert isinstance(result, list)
assert all("role" in message and "content" in message for message in result)
assert result[0]["role"] == "system"
assert any("Semantic RLE context ledger" in message["content"] for message in result)
def test_hot_tail_preserved_verbatim():
engine = SemanticRLEEngine(hot_tail_messages=4)
messages = _messages()
result = engine.compress(messages)
assert result[-4:] == messages[-4:]
def test_server_supersession_marks_old_fact_inactive():
engine = SemanticRLEEngine(hot_tail_messages=2)
result = engine.compress(_messages())
summary = "\n".join(str(message["content"]) for message in result if message["role"] == "system")
assert "server: beta.example" in summary
assert "[superseded by beta.example] server: alpha.example" in summary
def test_fake_tokens_and_ip_like_strings_are_redacted_to_refs():
engine = SemanticRLEEngine(hot_tail_messages=2)
fake_token = "sk-test_abcdefghijklmnopqrstuvwxyz1234567890"
fake_pat = "ghp_abcdefghijklmnopqrstuvwxyz1234567890"
messages = [
{"role": "user", "content": f"api_key={fake_token} server 203.0.113.9"},
{"role": "assistant", "content": f"token: {fake_pat}"},
{"role": "user", "content": "tail one"},
{"role": "assistant", "content": "tail two"},
{"role": "user", "content": "tail three"},
]
result = engine.compress(messages)
rendered = "\n".join(str(message["content"]) for message in result)
assert fake_token not in rendered
assert fake_pat not in rendered
assert "203.0.113.9" not in rendered
assert "credential_ref:credential:" in rendered
assert "[REDACTED_IP]" in rendered
def test_deterministic_failure_path_returns_original_messages(monkeypatch):
engine = SemanticRLEEngine(hot_tail_messages=2)
messages = _messages()
def explode(*args, **kwargs):
raise RuntimeError("boom")
monkeypatch.setattr(engine, "_build_ledger", explode)
assert engine.compress(messages) == messages
def test_plugin_discovery_and_explicit_load_without_global_activation():
discovered = {name: (description, available) for name, description, available in discover_context_engines()}
assert "semantic_rle" in discovered
assert discovered["semantic_rle"][1] is True
engine = load_context_engine("semantic_rle")
assert isinstance(engine, SemanticRLEEngine)
assert engine.name == "semantic_rle"