Mini-Agent / tests /test_integration.py
AbdulElahGwaith's picture
Upload folder using huggingface_hub
dc893fb verified
"""Integration test cases - Full agent demos."""
import asyncio
import json
import tempfile
from pathlib import Path
import pytest
from mini_agent import LLMClient
from mini_agent.agent import Agent
from mini_agent.config import Config
from mini_agent.tools import BashTool, EditTool, ReadTool, WriteTool
from mini_agent.tools.mcp_loader import load_mcp_tools_async
from mini_agent.tools.note_tool import RecallNoteTool, SessionNoteTool
@pytest.mark.asyncio
async def test_basic_agent_usage():
"""Test basic agent usage with file creation task.
This is the integration test for basic agent functionality,
converted from example.py.
"""
print("\n" + "=" * 80)
print("Integration Test: Basic Agent Usage")
print("=" * 80)
# Load configuration
config_path = Path("mini_agent/config/config.yaml")
if not config_path.exists():
pytest.skip("config.yaml not found")
config = Config.from_yaml(config_path)
# Check API key
if not config.llm.api_key or config.llm.api_key == "YOUR_MINIMAX_API_KEY_HERE":
pytest.skip("API key not configured")
# Use temporary workspace
with tempfile.TemporaryDirectory() as workspace_dir:
# Load system prompt (Agent will auto-inject workspace info)
system_prompt_path = Path("mini_agent/config/system_prompt.md")
if system_prompt_path.exists():
system_prompt = system_prompt_path.read_text(encoding="utf-8")
else:
system_prompt = "You are a helpful AI assistant."
# Initialize LLM client
llm_client = LLMClient(
api_key=config.llm.api_key,
api_base=config.llm.api_base,
model=config.llm.model,
)
# Initialize basic tools
tools = [
ReadTool(workspace_dir=workspace_dir),
WriteTool(workspace_dir=workspace_dir),
EditTool(workspace_dir=workspace_dir),
BashTool(),
]
# Add Note tools for session memory
memory_file = Path(workspace_dir) / ".agent_memory.json"
tools.extend(
[
SessionNoteTool(memory_file=str(memory_file)),
RecallNoteTool(memory_file=str(memory_file)),
]
)
# Load MCP tools (optional) - with timeout protection
try:
# MCP tools are disabled by default to prevent test hangs
# Enable specific MCP servers in mcp.json if needed
mcp_tools = await load_mcp_tools_async(
config_path="mini_agent/config/mcp.json"
)
if mcp_tools:
print(f"✓ Loaded {len(mcp_tools)} MCP tools")
tools.extend(mcp_tools)
else:
print("⚠️ No MCP tools configured (mcp.json is empty)")
except Exception as e:
print(f"⚠️ MCP tools not loaded: {e}")
# Create agent
agent = Agent(
llm_client=llm_client,
system_prompt=system_prompt,
tools=tools,
max_steps=config.agent.max_steps,
workspace_dir=workspace_dir,
)
# Task: Create a Python file with hello world
task = """
Create a Python file named hello.py in the workspace that prints "Hello, Mini Agent!".
Then execute it to verify it works.
"""
print(f"\nTask: {task}")
print("\n" + "=" * 80 + "\n")
agent.add_user_message(task)
result = await agent.run()
print("\n" + "=" * 80)
print(f"Result: {result}")
print("=" * 80)
# Verify the file was created or task completed
hello_file = Path(workspace_dir) / "hello.py"
assert hello_file.exists() or "complete" in result.lower(), (
"Agent should create the file or indicate completion"
)
print("\n✅ Basic agent usage test passed")
@pytest.mark.asyncio
async def test_session_memory_demo():
"""Test session memory functionality across multiple agent instances.
This is the integration test for session note tool,
converted from example_memory.py.
"""
print("\n" + "=" * 80)
print("Integration Test: Session Memory Demo")
print("=" * 80)
# Load config
config_path = Path("mini_agent/config/config.yaml")
if not config_path.exists():
pytest.skip("config.yaml not found")
config = Config.from_yaml(config_path)
# Check API key
if not config.llm.api_key or config.llm.api_key == "YOUR_MINIMAX_API_KEY_HERE":
pytest.skip("API key not configured")
# Use temporary workspace
with tempfile.TemporaryDirectory() as workspace_dir:
# Use simplified system prompt for faster testing
system_prompt = """You are a helpful AI assistant.
You have record_note and recall_notes tools:
- record_note: Save important information (use category to organize)
- recall_notes: Retrieve saved information
"""
# Initialize LLM
llm_client = LLMClient(
api_key=config.llm.api_key,
api_base=config.llm.api_base,
model=config.llm.model,
)
# Memory file path
memory_file = Path(workspace_dir) / ".agent_memory.json"
# Initialize tools (only Session Note Tools for this test)
tools = [
SessionNoteTool(memory_file=str(memory_file)),
RecallNoteTool(memory_file=str(memory_file)),
]
print("\n📝 Creating Agent with Session Note tools...")
agent = Agent(
llm_client=llm_client,
system_prompt=system_prompt,
tools=tools,
max_steps=8, # Reduced from 15
workspace_dir=workspace_dir,
)
# Task 1: First conversation - agent should save memories
task1 = """
Please remember these details about me:
- Name: Alex
- Project: mini-agent
- Tech stack: Python 3.12, async/await
- Preference: concise code style
Use record_note to save this information.
"""
print(f"\n📌 First Conversation:\n{task1}")
print("=" * 80)
agent.add_user_message(task1)
result1 = await agent.run()
print("\n" + "=" * 80)
print(f"Agent completed: {result1[:200]}...")
print("=" * 80)
# Check if notes were recorded
if memory_file.exists():
notes = json.loads(memory_file.read_text())
print(f"\n✅ Agent recorded {len(notes)} notes:")
for note in notes:
print(f" - [{note['category']}] {note['content']}")
assert len(notes) > 0, "Agent should have recorded some notes"
else:
print("\n⚠️ No notes found - agent may not have used record_note tool")
print("\n\n" + "=" * 80)
print("Simulating New Session (Agent should recall previous information)")
print("=" * 80)
# Task 2: New conversation - agent should recall memories
agent2 = Agent(
llm_client=llm_client,
system_prompt=system_prompt,
tools=tools,
max_steps=5, # Reduced from 10
workspace_dir=workspace_dir,
)
task2 = """
Use recall_notes to check: What do you know about me and my project?
"""
print(f"\n📌 Second Conversation (new session):\n{task2}")
print("=" * 80)
agent2.add_user_message(task2)
result2 = await agent2.run()
print("\n" + "=" * 80)
print(f"Agent response: {result2}")
print("=" * 80)
print("\n✅ Session Note Tool test completed!")
print("\nKey Points Verified:")
print(" 1. Agent can record important information")
print(" 2. Notes persist in memory file")
print(" 3. New agent instances can recall previous notes")
async def main():
"""Run all integration tests."""
print("=" * 80)
print("Running Integration Tests")
print("=" * 80)
print("\nNote: These tests require a valid MiniMax API key in config.yaml")
print("These tests will actually call the LLM API and may take some time.\n")
try:
await test_basic_agent_usage()
except Exception as e:
print(f"❌ Basic usage test failed: {e}")
try:
await test_session_memory_demo()
except Exception as e:
print(f"❌ Session memory test failed: {e}")
print("\n" + "=" * 80)
print("Integration tests completed!")
print("=" * 80)
if __name__ == "__main__":
asyncio.run(main())