BotOf TechAI / IoT / Full-Stack / 植物养护知识分享
返回首页AWS Agent Registry 运行时发现:工具上百以后,不要再把整个目录塞进 Prompt

AWS Agent Registry 运行时发现:工具上百以后,不要再把整个目录塞进 Prompt

2026 年 10 月 20 日,AWS 发布基于 AWS Agent Registry 的运行时能力发现实践。它针对一个必然出现的规模问题:工具从几个增长到几百个后,硬编码会迫使 Orchestrator 每新增能力就改代码、重新部署;把完整 schema 全塞进 Prompt 又浪费 token,并降低工具选择精度。

Registry 将 MCP Server、A2A Agent 和 Skills 作为带版本、描述、协议 descriptor 与审批状态的记录。运行时执行 Discover → Instantiate → Execute:先语义/关键词检索少量候选,再根据 descriptor 创建客户端,只将候选能力交给请求级内部 Agent,完成后销毁。

流程图:请求先从已批准注册表发现候选能力,再创建短生命周期 MCP/A2A 客户端执行并回收。

Registry 返回连接元数据,不返回调用凭证;发现与授权必须是两条独立链路。

注册记录是可治理的软件资产

记录不应只有名字和 URL。MCP descriptor 保存服务与工具 schema,A2A descriptor 保存 Agent Card;description 使用用户意图语言区分相邻能力。

record = registry.create_registry_record(
    registryId=registry_id,
    name="customer-support-agent",
    description="处理退货、退款、投诉和升级,不负责价格优惠",
    recordType="AGENT",
    descriptors={
        "a2aAgentCard": {
            "data": json.dumps(agent_card),
            "dataSchemaVersion": "0.3",
        }
    },
    recordVersion="1.0",
)

发布生命周期采用 DRAFT → PENDING_APPROVAL → APPROVED。Publisher 与 Approver 使用不同 IAM 权限;只有已批准记录进入可发现数据面。审批应附带契约测试、安全扫描、owner 和过期时间。

Discover:检索的是候选,不是最终授权

records = registry_dp.search_discoverable_registry_records(
    registryIds=[registry_arn],
    searchQuery=user_request,
    maxResults=5,
).get("registryRecords", [])

检索质量取决于描述、查询重写、过滤和 catalog 分布。企业需要离线 query–capability 基准,测 Recall@K、错误候选率和无匹配拒绝率。目录变大不会自动提高召回;同义能力过多会让排名恶化。

在搜索前用租户、环境、风险等级、数据域和地区做硬过滤。不能先返回全公司候选,再让模型决定自己是否有权使用。

Instantiate:按协议创建短期客户端

def instantiate(record, ctx):
    meta = parse_descriptor(record)
    if meta.protocol == "MCP":
        token = credential_broker.issue(
            principal=ctx.agent_id,
            audience=meta.endpoint,
            scopes=meta.required_scopes,
            ttl=300,
        )
        return MCPClient(meta.endpoint, token=token)
    if meta.protocol == "A2A":
        return A2AClient(meta.agent_card, signer=ctx.workload_signer)
    raise UnsupportedProtocol(meta.protocol)

凭证 broker 依据 Agent、用户、任务和目标单独签发,不从 Registry 搜索结果读取秘密。客户端与一次请求绑定,结束即关闭,避免连接池或 token 跨租户复用。

Execute:内部 Agent 只看到最小能力集

async with AsyncExitStack() as stack:
    clients = [await stack.enter_async_context(instantiate(r, ctx)) for r in records]
    tools = [tool for c in clients for tool in await c.list_tools()]
    inner = Agent(model=model, tools=tools, system_prompt=task_policy)
    return await inner.run(user_request)

执行前再次进行工具级策略判定。发现“退款 Agent”不代表它能对当前客户执行写操作。对多个候选设置总工具数、schema token 和并发预算;失败时返回可解释的无能力或无权限,而不是扩大全局搜索直到命中危险工具。

运行时发现不是所有场景的答案

小而稳定的工具集继续显式绑定更简单;固定顺序的合规流程应使用确定性图,不必每次检索。Registry 适合能力多、团队独立发布、请求组合变化大的平台。

生产观测应记录 search query 摘要、候选 record/version、排名、实例化失败、最终选择、授权决策和调用结果。只有能回答“为什么发现了它、为什么允许调用、当时是哪一版”,动态 Agent 平台才不会从代码耦合变成目录黑箱。

参考资料