84 lines
2.5 KiB
Python
84 lines
2.5 KiB
Python
|
|
# -*- 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)],
|
|||
|
|
)
|