Files
agent-desktop/plugins/bundle/cloudpaw/tools/a2a_discover.py
T

84 lines
2.5 KiB
Python
Raw Normal View History

2026-08-23 22:43:52 +08:00
# -*- coding: utf-8 -*-
"""A2A discover tool: discover remote A2A Agent and get its info.
Resolves Agent Card, establishes authenticated connection,
and returns agent capabilities for the calling agent to decide
whether/how to interact with the remote agent.
"""
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_discover(
agent_url: str,
auth_type: str = "",
auth_token: str = "",
) -> ToolChunk:
"""发现远程 A2A Agent 并获取其信息。
解析远程 Agent 的 Agent Card,获取其名称、描述、技能列表、
支持的传输协议等信息。同时建立认证连接供后续 a2a_call 复用。
Args:
agent_url: 远程 A2A Agent 的基础 URL
(例: https://agent.example.com)
auth_type: 认证类型,可选值:
- "bearer": Bearer Token 认证
- "api_key": API Key 认证
- "gateway": 智能网关(自动用 AK-SK 换取 Token
- "": 无认证
auth_token: 认证凭证(Bearer Token 或 API Key 值)
auth_type="gateway" 时无需传入
Returns:
ToolChunk: 包含 Agent Card 信息的 JSON
- name: Agent 名称
- description: Agent 描述
- skills: 技能列表(名称和描述)
- interfaces: 支持的传输协议
- capabilities: 是否支持流式/推送通知
- status: 连接状态
"""
from modules.a2a.client_manager import get_a2a_manager
manager = get_a2a_manager()
try:
info = await manager.connect(
agent_url=agent_url,
auth_type=auth_type,
auth_token=auth_token,
)
result = json.dumps(info, ensure_ascii=False, indent=2)
logger.info(
"a2a_discover success: %s (%s)",
info.get("name"),
agent_url,
)
except Exception as e:
logger.error("a2a_discover failed for %s: %s", agent_url, e)
result = json.dumps(
{
"url": agent_url,
"status": "error",
"error": str(e),
},
ensure_ascii=False,
)
return ToolChunk(
state=ToolResultState.SUCCESS,
content=[TextBlock(type="text", text=result)],
)