Files
daily-opencode-workspace/.opencode/skills/uni-agent/scripts/test_all.py

369 lines
11 KiB
Python

#!/usr/bin/env python3
"""
UniAgent 完整测试脚本
启动测试服务器,测试所有协议的真实交互
"""
import asyncio
import json
import subprocess
import sys
import time
import signal
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
from adapters import get_adapter
SERVERS = {}
def start_server(name: str, script: str, port: int) -> subprocess.Popen:
"""启动测试服务器"""
script_path = Path(__file__).parent.parent / "test_servers" / script
proc = subprocess.Popen(
[sys.executable, str(script_path)],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
time.sleep(0.5)
if proc.poll() is not None:
stderr = proc.stderr.read().decode()
print(f"{name} 启动失败: {stderr}")
return None
print(f"{name} 启动成功 (port {port})")
return proc
def stop_servers():
"""停止所有服务器"""
for name, proc in SERVERS.items():
if proc and proc.poll() is None:
proc.terminate()
proc.wait(timeout=2)
async def test_anp():
"""测试 ANP 适配器"""
print("\n" + "=" * 50)
print("[ANP] Agent Network Protocol")
print("=" * 50)
adapter = get_adapter("anp")
config = {
"id": "amap",
"protocol": "anp",
"ad_url": "https://agent-connect.ai/mcp/agents/amap/ad.json"
}
try:
conn = await adapter.connect(config)
print(f"✅ 连接成功: {conn.endpoint[:50]}...")
result = await adapter.call(conn, "maps_weather", {"city": "北京"})
city = result.get("result", {}).get("city", "")
print(f"✅ maps_weather: {city}")
result = await adapter.call(conn, "maps_text_search", {"keywords": "咖啡厅", "city": "上海"})
pois = result.get("result", {}).get("pois", [])
print(f"✅ maps_text_search: 找到 {len(pois)} 个结果")
await adapter.close(conn)
print(f"✅ 关闭连接")
return True
except Exception as e:
print(f"❌ 测试失败: {e}")
return False
async def test_a2a():
"""测试 A2A 适配器"""
print("\n" + "=" * 50)
print("[A2A] Agent-to-Agent Protocol")
print("=" * 50)
adapter = get_adapter("a2a")
config = {
"id": "test_agent",
"protocol": "a2a",
"endpoint": "http://localhost:8100"
}
try:
conn = await adapter.connect(config)
print(f"✅ 连接成功")
methods = await adapter.get_methods(conn)
print(f"✅ 获取方法: {len(methods)} 个 (包含 skills)")
result = await adapter.call(conn, "tasks/send", {
"message": {
"role": "user",
"parts": [{"type": "text", "text": "Hello A2A!"}]
}
})
if result.get("success"):
task = result.get("result", {})
history = task.get("history", [])
if len(history) >= 2:
response = history[-1].get("parts", [{}])[0].get("text", "")
print(f"✅ tasks/send: {response}")
else:
print(f"✅ tasks/send: 任务已创建")
else:
print(f"❌ tasks/send 失败: {result}")
return False
await adapter.close(conn)
print(f"✅ 关闭连接")
return True
except Exception as e:
print(f"❌ 测试失败: {e}")
return False
async def test_aitp():
"""测试 AITP 适配器"""
print("\n" + "=" * 50)
print("[AITP] Agent Interaction & Transaction Protocol")
print("=" * 50)
adapter = get_adapter("aitp")
config = {
"id": "test_shop",
"protocol": "aitp",
"endpoint": "http://localhost:8101"
}
try:
conn = await adapter.connect(config)
print(f"✅ 连接成功 (Thread: {conn.session[:8]}...)")
result = await adapter.call(conn, "message", {"content": "Hello AITP!"})
if result.get("success"):
response = result.get("result", {}).get("content", "")
print(f"✅ message: {response}")
else:
print(f"❌ message 失败")
return False
result = await adapter.call(conn, "payment", {
"amount": 10,
"currency": "NEAR",
"recipient": "shop.near"
})
if result.get("success"):
payment = result.get("result", {}).get("payment_response", {})
status = payment.get("status", "")
tx_id = payment.get("transaction_id", "")[:8]
print(f"✅ payment: {status} (tx: {tx_id}...)")
else:
print(f"❌ payment 失败")
return False
result = await adapter.call(conn, "decision", {
"question": "选择颜色",
"options": ["红色", "蓝色", "绿色"]
})
if result.get("success"):
decision = result.get("result", {}).get("decision_response", {})
selected = decision.get("selected", "")
print(f"✅ decision: 选择了 {selected}")
else:
print(f"❌ decision 失败")
return False
await adapter.close(conn)
print(f"✅ 关闭连接")
return True
except Exception as e:
print(f"❌ 测试失败: {e}")
return False
async def test_agent_protocol():
"""测试 Agent Protocol 适配器"""
print("\n" + "=" * 50)
print("[AP] Agent Protocol")
print("=" * 50)
adapter = get_adapter("agent_protocol")
config = {
"id": "test_agent",
"protocol": "agent_protocol",
"endpoint": "http://localhost:8102"
}
try:
conn = await adapter.connect(config)
print(f"✅ 连接成功")
result = await adapter.call(conn, "create_task", {"input": "Hello Agent Protocol!"})
if result.get("success"):
task_id = result.get("task_id", "")
print(f"✅ create_task: {task_id[:8]}...")
else:
print(f"❌ create_task 失败")
return False
result = await adapter.call(conn, "execute_step", {
"task_id": task_id,
"input": "Process this"
})
if result.get("success"):
step = result.get("result", {})
output = step.get("output", "")
print(f"✅ execute_step: {output}")
else:
print(f"❌ execute_step 失败")
return False
result = await adapter.call(conn, "get_task", {"task_id": task_id})
if result.get("success"):
task = result.get("result", {})
status = task.get("status", "")
print(f"✅ get_task: status={status}")
else:
print(f"❌ get_task 失败")
return False
result = await adapter.call(conn, "get_artifacts", {"task_id": task_id})
if result.get("success"):
artifacts = result.get("result", {}).get("artifacts", [])
print(f"✅ get_artifacts: {len(artifacts)} 个产物")
else:
print(f"❌ get_artifacts 失败")
return False
await adapter.close(conn)
print(f"✅ 关闭连接")
return True
except Exception as e:
print(f"❌ 测试失败: {e}")
return False
async def test_lmos():
"""测试 LMOS 适配器"""
print("\n" + "=" * 50)
print("[LMOS] Language Model Operating System")
print("=" * 50)
adapter = get_adapter("lmos")
config = {
"id": "calculator",
"protocol": "lmos",
"endpoint": "http://localhost:8103/agents/calculator"
}
try:
conn = await adapter.connect(config)
print(f"✅ 连接成功")
result = await adapter.call(conn, "invoke", {
"capability": "add",
"input": {"a": 10, "b": 20}
})
if result.get("success"):
output = result.get("result", {}).get("output", {})
calc_result = output.get("result", "")
print(f"✅ invoke add(10, 20): {calc_result}")
else:
print(f"❌ invoke add 失败")
return False
result = await adapter.call(conn, "invoke", {
"capability": "multiply",
"input": {"a": 6, "b": 7}
})
if result.get("success"):
output = result.get("result", {}).get("output", {})
calc_result = output.get("result", "")
print(f"✅ invoke multiply(6, 7): {calc_result}")
else:
print(f"❌ invoke multiply 失败")
return False
greeter_config = {
"id": "greeter",
"protocol": "lmos",
"endpoint": "http://localhost:8103/agents/greeter"
}
conn2 = await adapter.connect(greeter_config)
result = await adapter.call(conn2, "invoke", {
"capability": "greet",
"input": {"name": "test_user"}
})
if result.get("success"):
output = result.get("result", {}).get("output", {})
greeting = output.get("greeting", "")
print(f"✅ invoke greet: {greeting}")
else:
print(f"❌ invoke greet 失败")
return False
await adapter.close(conn)
await adapter.close(conn2)
print(f"✅ 关闭连接")
return True
except Exception as e:
print(f"❌ 测试失败: {e}")
return False
async def main():
print("=" * 60)
print(" UniAgent 完整交互测试")
print("=" * 60)
print("\n[1] 启动测试服务器...")
SERVERS["A2A"] = start_server("A2A Server", "a2a_server.py", 8100)
SERVERS["AITP"] = start_server("AITP Server", "aitp_server.py", 8101)
SERVERS["AP"] = start_server("Agent Protocol Server", "agent_protocol_server.py", 8102)
SERVERS["LMOS"] = start_server("LMOS Server", "lmos_server.py", 8103)
time.sleep(1)
print("\n[2] 开始测试...")
results = {}
try:
results["ANP"] = await test_anp()
results["A2A"] = await test_a2a()
results["AITP"] = await test_aitp()
results["Agent Protocol"] = await test_agent_protocol()
results["LMOS"] = await test_lmos()
finally:
print("\n[3] 停止测试服务器...")
stop_servers()
print(" ✅ 所有服务器已停止")
print("\n" + "=" * 60)
print(" 测试汇总")
print("=" * 60)
all_passed = True
for name, passed in results.items():
status = "" if passed else ""
print(f" {status} {name}")
if not passed:
all_passed = False
print()
if all_passed:
print("🎉 所有协议测试通过!")
else:
print("⚠️ 部分测试失败")
sys.exit(1)
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
stop_servers()
print("\n测试中断")