| """AgentFrame 核心测试 (离线, 无需 API key)""" |
| import os |
| import sys |
| import tempfile |
|
|
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) |
|
|
| from agentframe.config import AgentFrameConfig |
| from agentframe.core.engine import ContextEngine |
| from agentframe.embed.provider import HashEmbedding |
|
|
|
|
| def make_engine() -> ContextEngine: |
| cfg = AgentFrameConfig.from_env() |
| cfg.llm.provider = "mock" |
| return ContextEngine(cfg) |
|
|
|
|
| def test_ingest_and_retrieve(): |
| eng = make_engine() |
| eng.ingest("KV 缓存压缩 28.4x 实测", ["kv"]) |
| eng.ingest("注意力分数不等于任务重要性", ["agent"]) |
| eng.ingest("Minecraft 1.20.4 逆向完成", ["mc"]) |
| assert len(eng.agent.chunk_meta) == 3 |
| r = eng.ask("KV 压缩多少倍?", chat=False) |
| assert len(r.retrieved) >= 1 |
| print("✓ test_ingest_and_retrieve") |
|
|
|
|
| def test_similar_text_retrieval(): |
| eng = make_engine() |
| eng.ingest("吸收式 MLA 缓存 576 维潜在向量", ["method"]) |
| eng.ingest("HiLS 分层软max 端到端块选择", ["method"]) |
| eng.ingest("今天天气很好适合出去玩", ["life"]) |
| |
| r = eng.ask("MLA 潜在向量维度是多少?", chat=False) |
| tops = [cid for cid, _ in r.retrieved] |
| assert 0 in tops, f"期望命中 chunk_0, 实际 {tops}" |
| print(f"✓ test_similar_text_retrieval (top: {tops[:3]})") |
|
|
|
|
| def test_forget_curve(): |
| eng = make_engine() |
| eng.ingest("A", ["x"]) |
| eng.ingest("B", ["x"]) |
| eng.ingest("C", ["x"]) |
| |
| for _ in range(500): |
| eng.now += 1 |
| |
| victims = eng.forget(0.1) |
| assert len(victims) >= 2, f"长时间不访问应遗忘, 实际 {len(victims)}" |
| print(f"✓ test_forget_curve (遗忘 {len(victims)}/3)") |
|
|
|
|
| def test_save_load(): |
| eng = make_engine() |
| eng.ingest("持久化测试内容", ["test"]) |
| with tempfile.NamedTemporaryFile(suffix=".json", delete=False) as f: |
| path = f.name |
| eng.save(path) |
| eng2 = make_engine() |
| ok = eng2.load(path) |
| assert ok |
| assert len(eng2.agent.chunk_meta) == 1 |
| os.unlink(path) |
| print("✓ test_save_load") |
|
|
|
|
| def test_hash_embedding_deterministic(): |
| emb = HashEmbedding(dim=576) |
| v1 = emb.embed("同一句话") |
| v2 = emb.embed("同一句话") |
| v3 = emb.embed("完全不同的话") |
| assert (v1 == v2).all() |
| sim_same = float(v1 @ v2) |
| sim_diff = float(v1 @ v3) |
| assert sim_same > sim_diff, f"{sim_same} vs {sim_diff}" |
| print(f"✓ test_hash_embedding (同句相似度 {sim_same:.3f} > 异句 {sim_diff:.3f})") |
|
|
|
|
| def test_tool_exec(): |
| eng = make_engine() |
| out = eng._exec_tool("print(6*7)") |
| assert "42" in out |
| bad = eng._exec_tool("print(undefined_var)") |
| assert "Traceback" in bad or "Error" in bad |
| print("✓ test_tool_exec") |
|
|
|
|
| if __name__ == "__main__": |
| test_ingest_and_retrieve() |
| test_similar_text_retrieval() |
| test_forget_curve() |
| test_save_load() |
| test_hash_embedding_deterministic() |
| test_tool_exec() |
| print("\n 全部核心测试通过!") |
|
|