mirror of
https://github.com/hanzoai/python-sdk.git
synced 2026-10-27 04:20:09 +00:00
223 lines
6.3 KiB
Python
223 lines
6.3 KiB
Python
"""End-to-end test demonstrating hanzo-mcp with hanzo-network using local inference."""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
# Import guard for optional hanzo_network dependency
|
|
try:
|
|
# Add hanzo-network to path
|
|
sys.path.insert(
|
|
0, str(Path(__file__).parent.parent.parent / "hanzo-network" / "src")
|
|
)
|
|
|
|
from hanzo_network import (
|
|
check_local_llm_status,
|
|
create_local_agent,
|
|
create_local_distributed_network,
|
|
create_tool,
|
|
)
|
|
|
|
HANZO_NETWORK_AVAILABLE = True
|
|
except ImportError:
|
|
HANZO_NETWORK_AVAILABLE = False
|
|
|
|
|
|
# Skip entire module if hanzo_network is not available
|
|
pytestmark = pytest.mark.skipif(
|
|
not HANZO_NETWORK_AVAILABLE,
|
|
reason="hanzo_network package not installed or numpy not available",
|
|
)
|
|
|
|
|
|
# Test tools
|
|
async def echo_message(message: str) -> str:
|
|
"""Echo a message."""
|
|
return f"Echo: {message}"
|
|
|
|
|
|
async def add_numbers(a: int, b: int) -> str:
|
|
"""Add two numbers."""
|
|
return f"Result: {a + b}"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_e2e_local_inference():
|
|
"""Test end-to-end flow with local hanzo/net inference."""
|
|
|
|
# Check hanzo/net status
|
|
status = await check_local_llm_status("hanzo")
|
|
assert status["available"] is True
|
|
assert status["engine"] == "dummy" # Using dummy for CI
|
|
assert "hanzo/net" in status["provider"]
|
|
|
|
# Create agents with local inference
|
|
echo_agent = create_local_agent(
|
|
name="echo_agent",
|
|
description="Echoes messages",
|
|
system="You are an echo agent. Use the echo_message tool when asked to echo.",
|
|
tools=[
|
|
create_tool(
|
|
name="echo_message", description="Echo a message", handler=echo_message
|
|
)
|
|
],
|
|
local_model="llama3.2",
|
|
)
|
|
|
|
math_agent = create_local_agent(
|
|
name="math_agent",
|
|
description="Does math",
|
|
system="You are a math agent. Use the add_numbers tool when asked to add.",
|
|
tools=[
|
|
create_tool(
|
|
name="add_numbers", description="Add numbers", handler=add_numbers
|
|
)
|
|
],
|
|
local_model="llama3.2",
|
|
)
|
|
|
|
# Create distributed network
|
|
network = create_local_distributed_network(
|
|
agents=[echo_agent, math_agent],
|
|
name="test-network",
|
|
listen_port=16000,
|
|
broadcast_port=16000,
|
|
)
|
|
|
|
# Start network
|
|
await network.start(wait_for_peers=0)
|
|
assert network.is_running
|
|
|
|
# Test network status
|
|
status = network.get_network_status()
|
|
# Node ID is auto-generated, just check it exists
|
|
assert "node_id" in status
|
|
assert status["node_id"].startswith("node-")
|
|
assert "echo_agent" in status["local_agents"]
|
|
assert "math_agent" in status["local_agents"]
|
|
|
|
# Test echo agent
|
|
result = await network.run(
|
|
prompt="Echo the message 'Hello from E2E test'", initial_agent=echo_agent
|
|
)
|
|
assert result["success"]
|
|
# The dummy model returns generic responses, so just check for success
|
|
assert result["final_output"] is not None
|
|
assert len(result["final_output"]) > 0
|
|
|
|
# Test math agent
|
|
result = await network.run(prompt="Add 5 and 3", initial_agent=math_agent)
|
|
assert result["success"]
|
|
# The dummy model returns generic responses, so just check for success
|
|
assert result["final_output"] is not None
|
|
assert len(result["final_output"]) > 0
|
|
|
|
# Stop network
|
|
await network.stop()
|
|
assert not network.is_running
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_e2e_multi_agent_collaboration():
|
|
"""Test multi-agent collaboration with local inference."""
|
|
|
|
# Create collaborative agents
|
|
researcher = create_local_agent(
|
|
name="researcher",
|
|
description="Researches topics",
|
|
system="You research and gather information.",
|
|
tools=[],
|
|
local_model="llama3.2",
|
|
)
|
|
|
|
writer = create_local_agent(
|
|
name="writer",
|
|
description="Writes content",
|
|
system="You write clear, concise content.",
|
|
tools=[],
|
|
local_model="llama3.2",
|
|
)
|
|
|
|
# Create network
|
|
network = create_local_distributed_network(
|
|
agents=[researcher, writer],
|
|
name="collab-network",
|
|
listen_port=16001,
|
|
broadcast_port=16001,
|
|
)
|
|
|
|
await network.start(wait_for_peers=0)
|
|
|
|
# Test collaboration
|
|
result = await network.run(
|
|
prompt="Research what distributed inference is and write a brief explanation"
|
|
)
|
|
assert result["success"]
|
|
|
|
await network.stop()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_e2e_mcp_tools_with_local_llm():
|
|
"""Test MCP-style tools with local LLM."""
|
|
|
|
# MCP-style file operations
|
|
async def read_test_file(path: str) -> str:
|
|
"""Read a test file."""
|
|
return f"Contents of {path}: This is a test file."
|
|
|
|
async def list_test_files(directory: str) -> str:
|
|
"""List test files."""
|
|
return f"Files in {directory}: test1.py, test2.py, test3.py"
|
|
|
|
# Create file system agent
|
|
fs_agent = create_local_agent(
|
|
name="fs_agent",
|
|
description="File system operations",
|
|
system="You handle file system operations using the available tools.",
|
|
tools=[
|
|
create_tool(
|
|
name="read_test_file", description="Read a file", handler=read_test_file
|
|
),
|
|
create_tool(
|
|
name="list_test_files",
|
|
description="List files",
|
|
handler=list_test_files,
|
|
),
|
|
],
|
|
local_model="llama3.2",
|
|
)
|
|
|
|
# Create network
|
|
network = create_local_distributed_network(
|
|
agents=[fs_agent],
|
|
name="mcp-test-network",
|
|
listen_port=16002,
|
|
broadcast_port=16002,
|
|
)
|
|
|
|
await network.start(wait_for_peers=0)
|
|
|
|
# Test file operations
|
|
result = await network.run(
|
|
prompt="List the files in the test directory", initial_agent=fs_agent
|
|
)
|
|
assert result["success"]
|
|
# The dummy model returns generic responses, so just check for success
|
|
assert result["final_output"] is not None
|
|
assert len(result["final_output"]) > 0
|
|
|
|
result = await network.run(prompt="Read the test.py file", initial_agent=fs_agent)
|
|
assert result["success"]
|
|
# The dummy model returns generic responses, so just check for success
|
|
assert result["final_output"] is not None
|
|
assert len(result["final_output"]) > 0
|
|
|
|
await network.stop()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Run tests
|
|
pytest.main([__file__, "-v"])
|