Initial commit to git.yoin
This commit is contained in:
368
uni-agent/scripts/test_all.py
Normal file
368
uni-agent/scripts/test_all.py
Normal file
@@ -0,0 +1,368 @@
|
||||
#!/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测试中断")
|
||||
Reference in New Issue
Block a user