Files
wehub-resource-sync 75c67150d0
build / build (3.13) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build wheels (macos-aarch64) (push) Has been cancelled
release-please / build wheels (macos-x86_64) (push) Has been cancelled
release-please / build wheels (windows-x86_64) (push) Has been cancelled
release-please / build wheels (linux-aarch64) (push) Has been cancelled
release-please / build wheels (linux-x86_64) (push) Has been cancelled
release-please / build sdist (push) Has been cancelled
release-please / publish release artifacts (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:36:10 +08:00

162 lines
5.4 KiB
Python

"""
Test OpenRouter integration with MemU's full workflow.
Tests:
1. Conversation memorization using OpenRouter
2. RAG-based retrieval using OpenRouter embeddings
3. LLM-based retrieval using OpenRouter
Usage:
export OPENROUTER_API_KEY=your_api_key
python tests/test_openrouter.py
"""
import asyncio
import json
import os
import sys
from typing import Any
import pytest
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "src")))
from memu.app import MemoryService
def _print_categories(categories, max_items=3):
"""Print category summaries."""
if categories:
print(" Categories:")
for cat in categories[:max_items]:
summary = cat.get("summary") or cat.get("description", "")
print(f" - {cat.get('name')}: {summary[:60]}...")
def _print_items(items, max_items=3):
"""Print memory item summaries."""
if items:
print(" Items:")
for item in items[:max_items]:
memory_type = item.get("memory_type", "unknown")
summary = item.get("summary", "")[:80]
print(f" - [{memory_type}] {summary}...")
async def _test_memorize(service, file_path, output_data):
"""Test conversation memorization."""
print("\n[OPENROUTER] Test 1: Memorizing conversation...")
memory = await service.memorize(
resource_url=file_path, modality="conversation", user={"user_id": "openrouter_test_user"}
)
items_count = len(memory.get("items", []))
categories_count = len(memory.get("categories", []))
print(f" Memorized {items_count} items")
print(f" Created {categories_count} categories")
output_data["memorize"] = memory
assert items_count > 0, "Expected at least 1 memory item"
assert categories_count > 0, "Expected at least 1 category"
_print_categories(memory.get("categories", []))
return memory
async def _test_retrieve(service, queries, method, test_num, output_data):
"""Test retrieval with specified method."""
print(f"\n[OPENROUTER] Test {test_num}: {method.upper()}-based retrieval...")
service.retrieve_config.method = method
result = await service.retrieve(queries=queries, where={"user_id": "openrouter_test_user"})
categories_retrieved = len(result.get("categories", []))
items_retrieved = len(result.get("items", []))
print(f" Retrieved {categories_retrieved} categories")
print(f" Retrieved {items_retrieved} items")
output_data[f"retrieve_{method}"] = result
_print_categories(result.get("categories", []))
_print_items(result.get("items", []))
return result
async def test_openrouter_full_workflow():
"""Test OpenRouter integration with full MemU workflow."""
api_key = os.environ.get("OPENROUTER_API_KEY")
if not api_key:
pytest.skip("OPENROUTER_API_KEY environment variable not set")
file_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "example", "example_conversation.json"))
if not os.path.exists(file_path):
pytest.skip(f"Test file not found: {file_path}")
output_data: dict[str, Any] = {}
print("\n" + "=" * 60)
print("[OPENROUTER] Starting full workflow test...")
print("=" * 60)
service = MemoryService(
llm_profiles={
"default": {
"provider": "openrouter",
"client_backend": "httpx",
"base_url": "https://openrouter.ai",
"api_key": api_key,
"chat_model": "anthropic/claude-3.5-sonnet",
"embed_model": "openai/text-embedding-3-small",
},
},
database_config={
"metadata_store": {"provider": "inmemory"},
},
retrieve_config={
"method": "rag",
"route_intention": False,
},
)
queries = [
{"role": "user", "content": {"text": "What foods does the user like to eat?"}},
]
await _test_memorize(service, file_path, output_data)
await _test_retrieve(service, queries, "rag", 2, output_data)
await _test_retrieve(service, queries, "llm", 3, output_data)
# Test 4: List memory items
print("\n[OPENROUTER] Test 4: List memory items...")
items_result = await service.list_recall_entries(where={"user_id": "openrouter_test_user"})
items_list = items_result.get("items", [])
print(f" Listed {len(items_list)} memory items")
output_data["list_items"] = items_result
assert len(items_list) > 0, "Expected at least 1 item in list"
# Test 5: List memory categories
print("\n[OPENROUTER] Test 5: List memory categories...")
cats_result = await service.list_recall_files(where={"user_id": "openrouter_test_user"})
cats_list = cats_result.get("categories", [])
print(f" Listed {len(cats_list)} categories")
output_data["list_categories"] = cats_result
assert len(cats_list) > 0, "Expected at least 1 category in list"
# Save output to file
output_file = os.path.abspath(
os.path.join(os.path.dirname(__file__), "..", "examples", "output", "openrouter_test_output.json")
)
os.makedirs(os.path.dirname(output_file), exist_ok=True)
with open(output_file, "w", encoding="utf-8") as f:
json.dump(output_data, f, indent=2, default=str)
print(f"\n[OPENROUTER] Output saved to: {output_file}")
print("\n" + "=" * 60)
print("[OPENROUTER] All tests completed!")
print("=" * 60)
if __name__ == "__main__":
asyncio.run(test_openrouter_full_workflow())