Files

84 lines
2.7 KiB
Python

# -*- coding: utf-8 -*-
"""A2A list tool: list registered remote A2A agents for the current agent.
Reads the per-agent ``a2a_config.json`` and returns a summary of all
registered remote agents with their connection info and capabilities.
"""
import json
import logging
from agentscope.message import TextBlock
from agentscope.message import ToolResultState
from agentscope.tool import ToolChunk
logger = logging.getLogger("qwenpaw").getChild(
__name__.replace("plugin_cloudpaw.", ""),
)
async def a2a_list() -> ToolChunk:
"""列出当前智能体已注册的远程 A2A Agent。
无需参数。自动读取当前智能体的 A2A 配置,返回所有已注册的
远程 Agent 信息(别名、URL、认证类型、连接状态、技能列表等)。
Returns:
ToolChunk: 包含已注册 Agent 列表的 JSON:
- agents: Agent 列表,每个包含 alias, url, auth_type, name,
description, skills, capabilities, status 等字段
"""
from .a2a_config_helper import load_a2a_agents
from modules.a2a.client_manager import get_a2a_manager
agents_cfg = load_a2a_agents()
manager = get_a2a_manager()
agents_list = []
for alias, reg in agents_cfg.items():
url = reg.get("url", "")
entry: dict = {
"alias": alias,
"url": url,
"auth_type": reg.get("auth_type", ""),
}
card_info = await manager.get_card_info(url)
if not card_info:
try:
card_info = await manager.connect(
agent_url=url,
auth_type=reg.get("auth_type", ""),
auth_token=reg.get("auth_token", ""),
gateway_config=reg.get("gateway_config"),
)
except Exception as exc:
logger.debug("a2a_list: connect to %s failed: %s", url, exc)
entry["status"] = "error"
entry["error"] = str(exc)
agents_list.append(entry)
continue
if card_info:
entry["status"] = card_info.get("status", "connected")
entry["name"] = card_info.get("name", "")
entry["description"] = card_info.get("description", "")
entry["skills"] = card_info.get("skills", [])
entry["capabilities"] = card_info.get("capabilities", {})
else:
entry["status"] = "disconnected"
agents_list.append(entry)
result = json.dumps(
{"agents": agents_list, "count": len(agents_list)},
ensure_ascii=False,
indent=2,
)
logger.info("a2a_list: found %d registered agents", len(agents_list))
return ToolChunk(
state=ToolResultState.SUCCESS,
content=[TextBlock(type="text", text=result)],
)