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

283 lines
8.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
UniAgent 适配器测试脚本
测试所有协议适配器的基本功能
"""
import asyncio
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
from adapters import get_adapter, ADAPTERS, list_protocols
class TestResult:
def __init__(self, protocol: str):
self.protocol = protocol
self.passed = 0
self.failed = 0
self.skipped = 0
self.errors = []
def pass_(self, msg: str):
self.passed += 1
print(f"{msg}")
def fail(self, msg: str, error: str = ""):
self.failed += 1
self.errors.append(f"{msg}: {error}")
print(f"{msg}: {error[:100]}")
def skip(self, msg: str):
self.skipped += 1
print(f" ⏭️ {msg} (跳过)")
def summary(self) -> str:
status = "" if self.failed == 0 else ""
return f"{status} {self.protocol}: {self.passed} passed, {self.failed} failed, {self.skipped} skipped"
async def test_anp() -> TestResult:
"""测试 ANP 适配器"""
result = TestResult("ANP")
print("\n[ANP] 测试 Agent Network Protocol...\n")
try:
adapter = get_adapter("anp")
result.pass_("获取适配器")
except Exception as e:
result.fail("获取适配器", str(e))
return result
agent_config = {
"id": "amap",
"protocol": "anp",
"ad_url": "https://agent-connect.ai/mcp/agents/amap/ad.json"
}
try:
connection = await adapter.connect(agent_config)
result.pass_(f"建立连接: {connection.endpoint[:50]}...")
except Exception as e:
result.fail("建立连接", str(e))
return result
try:
methods = await adapter.get_methods(connection)
result.pass_(f"获取方法列表: {len(methods)} 个方法")
except Exception as e:
result.fail("获取方法列表", str(e))
try:
res = await adapter.call(connection, "maps_weather", {"city": "北京"})
if res.get("success") or res.get("result"):
city = res.get("result", {}).get("city", "")
result.pass_(f"调用 maps_weather: {city}")
else:
result.fail("调用 maps_weather", str(res))
except Exception as e:
result.fail("调用 maps_weather", str(e))
try:
res = await adapter.call(connection, "maps_text_search", {"keywords": "咖啡厅", "city": "上海"})
if res.get("success") or res.get("result"):
pois = res.get("result", {}).get("pois", [])
result.pass_(f"调用 maps_text_search: 找到 {len(pois)} 个结果")
else:
result.fail("调用 maps_text_search", str(res))
except Exception as e:
result.fail("调用 maps_text_search", str(e))
try:
agents = await adapter.discover()
result.pass_(f"发现 Agent: {len(agents)}")
except Exception as e:
result.fail("发现 Agent", str(e))
try:
await adapter.close(connection)
result.pass_("关闭连接")
except Exception as e:
result.fail("关闭连接", str(e))
return result
async def test_mcp() -> TestResult:
"""测试 MCP 适配器"""
result = TestResult("MCP")
print("\n[MCP] 测试 Model Context Protocol...\n")
try:
adapter = get_adapter("mcp")
result.pass_("获取适配器")
except Exception as e:
result.fail("获取适配器", str(e))
return result
result.skip("MCP 需要本地 npx 环境,跳过实际连接测试")
result.skip("如需测试,请配置 config/agents.yaml 中的 MCP Server")
return result
async def test_a2a() -> TestResult:
"""测试 A2A 适配器"""
result = TestResult("A2A")
print("\n[A2A] 测试 Agent-to-Agent Protocol...\n")
try:
adapter = get_adapter("a2a")
result.pass_("获取适配器")
except Exception as e:
result.fail("获取适配器", str(e))
return result
result.skip("A2A 需要配置 Agent endpoint跳过实际连接测试")
result.skip("如需测试,请配置 config/agents.yaml 中的 A2A Agent")
try:
agents = await adapter.discover()
result.pass_(f"发现 Agent: {len(agents)} 个 (本地配置)")
except Exception as e:
result.fail("发现 Agent", str(e))
return result
async def test_aitp() -> TestResult:
"""测试 AITP 适配器"""
result = TestResult("AITP")
print("\n[AITP] 测试 Agent Interaction & Transaction Protocol...\n")
try:
adapter = get_adapter("aitp")
result.pass_("获取适配器")
except Exception as e:
result.fail("获取适配器", str(e))
return result
result.skip("AITP 需要配置 NEAR 钱包和 endpoint跳过实际连接测试")
result.skip("如需测试,请配置 config/agents.yaml 中的 AITP Agent")
try:
agents = await adapter.discover()
result.pass_(f"发现 Agent: {len(agents)} 个 (本地配置)")
except Exception as e:
result.fail("发现 Agent", str(e))
try:
methods = [
{"name": "message", "desc": "发送消息"},
{"name": "payment", "desc": "发起支付"},
{"name": "decision", "desc": "请求决策"},
]
result.pass_(f"支持方法: {', '.join([m['name'] for m in methods])}")
except Exception as e:
result.fail("检查方法", str(e))
return result
async def test_agent_protocol() -> TestResult:
"""测试 Agent Protocol 适配器"""
result = TestResult("Agent Protocol")
print("\n[AP] 测试 Agent Protocol...\n")
try:
adapter = get_adapter("agent_protocol")
result.pass_("获取适配器 (agent_protocol)")
except Exception as e:
result.fail("获取适配器", str(e))
return result
try:
adapter2 = get_adapter("ap")
result.pass_("获取适配器 (别名 ap)")
except Exception as e:
result.fail("获取适配器别名", str(e))
result.skip("Agent Protocol 需要运行中的 Agent 服务,跳过实际连接测试")
result.skip("如需测试,请启动 AutoGPT 或其他兼容服务")
try:
agents = await adapter.discover()
result.pass_(f"发现 Agent: {len(agents)} 个 (本地配置)")
except Exception as e:
result.fail("发现 Agent", str(e))
return result
async def test_lmos() -> TestResult:
"""测试 LMOS 适配器"""
result = TestResult("LMOS")
print("\n[LMOS] 测试 Language Model Operating System...\n")
try:
adapter = get_adapter("lmos")
result.pass_("获取适配器")
except Exception as e:
result.fail("获取适配器", str(e))
return result
result.skip("LMOS 需要配置注册中心或 Agent endpoint跳过实际连接测试")
result.skip("如需测试,请配置 config/agents.yaml 中的 LMOS Agent")
try:
agents = await adapter.discover()
result.pass_(f"发现 Agent: {len(agents)} 个 (本地配置)")
except Exception as e:
result.fail("发现 Agent", str(e))
return result
async def main():
print("=" * 60)
print(" UniAgent 适配器测试")
print("=" * 60)
print(f"\n支持的协议: {list_protocols()}\n")
results = []
results.append(await test_anp())
results.append(await test_mcp())
results.append(await test_a2a())
results.append(await test_aitp())
results.append(await test_agent_protocol())
results.append(await test_lmos())
print("\n" + "=" * 60)
print(" 测试汇总")
print("=" * 60 + "\n")
total_passed = 0
total_failed = 0
total_skipped = 0
for r in results:
print(r.summary())
total_passed += r.passed
total_failed += r.failed
total_skipped += r.skipped
print(f"\n总计: {total_passed} passed, {total_failed} failed, {total_skipped} skipped")
if total_failed > 0:
print("\n失败详情:")
for r in results:
for err in r.errors:
print(f" - [{r.protocol}] {err}")
sys.exit(1)
else:
print("\n🎉 所有测试通过!")
if __name__ == "__main__":
asyncio.run(main())