aws strands agents sdk 的ClientFactory组件与agent的本质区别
agent_card = await resolver.get_agent_card()# GET 请求 http://localhost:9000/.well-known/agent.json。asyncio.run(send_sync_message("what is 3 to the power of 7")) # 3 的 7 次方是多少。agent_card = await resolve
·
不是一个智能体(agent)——它只是一个通信工具。让我澄清一下它们的角色和流程:
ClientFactory 与 Agent 的关键区别
特性 | ClientFactory (通信工具) | Agent (人工智能) |
---|---|---|
目的 | 创建用于与远程智能体通信的 HTTP 客户端 | 处理请求、进行推理、使用工具、生成响应 |
智能 | 零 - 它只是一个创建网络客户端的工厂 | 完整的、由 LLM 驱动的推理和决策能力 |
角色 | 通信基础设施,像电话或电子邮件客户端 | 真正理解并响应用户的人工智能 |
您的代码中实际发生了什么
# 这 NOT 是一个智能体在进行对话 # 这是一个 CLIENT(客户端)在调用一个 REMOTE AGENT(远程智能体) async def send_sync_message(message: str, base_url: str = "http://localhost:9000"): # 1. 创建 HTTP 客户端(只是网络通信) async with httpx.AsyncClient(timeout=DEFAULT_TIMEOUT) as httpx_client: # 2. 发现 REMOTE AGENT(远程智能体)能做什么 resolver = A2ACardResolver(httpx_client=httpx_client, base_url=base_url) agent_card = await resolver.get_agent_card() # GET 请求 http://localhost:9000/.well-known/agent.json # 3. 为该智能体类型创建合适的 HTTP 客户端 factory = ClientFactory(config) client = factory.create(agent_card) # 创建 HTTP 客户端,NOT 创建智能体 # 4. 通过 HTTP 向 REMOTE AGENT(远程智能体)发送消息 msg = create_message(text=message) async for event in client.send_message(msg): # POST 请求 http://localhost:9000/chat # 5. 接收 FROM 远程智能体的响应 return event # 这是在调用一个运行在 localhost:9000 的 REMOTE AGENT(远程智能体) asyncio.run(send_sync_message("what is 3 to the power of 7")) # 3 的 7 次方是多少
真实的流程
[您的代码] ──HTTP 请求──► [运行在 localhost:9000 的远程智能体] │ │ │ ├─ 接收 "3 的 7 次方是多少" │ ├─ 使用 LLM 理解请求 │ ├─ 调用计算器工具: 3**7 │ ├─ 获取结果: 2187 │ └─ 生成响应: "3 的 7 次方是 2187" │ └─◄──HTTP 响应─────────────────────────┘
展示区别的完整示例
远程智能体(真正的人工智能)
# agent_server.py - 运行在 localhost:9000 from strands import Agent, tool from strands.multiagent.a2a import A2AServer @tool def calculate(expression: str) -> str: """计算数学表达式""" try: result = eval(expression) # 使用 eval 计算(注意安全风险) return f"结果: {result}" except Exception as e: return f"错误: {str(e)}" # 这是具有 AI 智能的 ACTUAL AGENT(真正的智能体) math_agent = Agent( name="数学专家", # 智能体名称 prompt="您是一名数学专家。使用计算器工具来解决问题。", # 系统提示词 tools=[calculate] # 工具列表 ) # 通过 A2A 协议提供智能体服务 server = A2AServer(agent=math_agent, port=9000) server.serve() # 智能体运行在 http://localhost:9000
客户端代码(仅负责通信)
# client.py - 调用远程智能体 import asyncio import httpx from strands_tools.a2a_client import A2ACardResolver, ClientFactory, ClientConfig, create_message async def call_remote_agent(message: str): """这只是 HTTP 通信 - 这里 NO AI 智能""" async with httpx.AsyncClient() as httpx_client: # 发现远程智能体的能力 resolver = A2ACardResolver( httpx_client=httpx_client, base_url="http://localhost:9000" # 远程智能体地址 ) agent_card = await resolver.get_agent_card() # 获取智能体卡片 print(f"发现智能体: {agent_card['name']}") # 打印智能体名称 # 创建 HTTP 客户端 (NOT 一个智能体!) config = ClientConfig(httpx_client=httpx_client, streaming=False) # 配置 factory = ClientFactory(config) client = factory.create(agent_card) # 仅仅是 HTTP 客户端 # 向远程智能体发送消息 msg = create_message(text=message) # 创建消息对象 async for event in client.send_message(msg): # 发送消息并等待事件 print(f"来自远程智能体的响应: {event}") return event # 调用远程智能体 asyncio.run(call_remote_agent("3 的 7 次方是多少?"))
ClientFactory 能与用户聊天吗?
不能! ClientFactory 无法聊天,因为:
-
没有 LLM: 它没有语言模型或 AI 智能
-
没有理解能力: 它只是格式化 HTTP 请求
-
没有推理能力: 它不能处理或理解用户意图
-
纯粹的基础设施: 这就像问你的 WiFi 路由器能否进行对话一样
什么 CAN(可以)进行对话?
-
本地智能体 (直接对话)
from strands import Agent, tool @tool def calculate(expression: str) -> str: """计算数学表达式""" return str(eval(expression)) # 这个智能体 CAN 直接与用户聊天 local_agent = Agent( name="本地数学智能体", tools=[calculate] ) # 直接与智能体对话 response = local_agent.run("3 的 7 次方是多少?") # 智能体直接处理并响应 print(response)
-
协调器智能体 (调用其他智能体)
from strands import Agent from strands_tools.a2a_client import A2AClientToolProvider # A2A 客户端工具提供者 # 这个智能体 CAN 聊天并将任务委托给专家智能体 orchestrator = Agent( name="智能协调器", prompt="您与专家智能体协调以帮助用户", tools=[ A2AClientToolProvider(known_agent_urls=[ # 已知的智能体 URL 列表 "http://localhost:9000", # 数学专家 "http://localhost:9001", # 研究专家 ]).tools # 获取工具 ] ) # 协调器与用户聊天并根据需要调用专家智能体 response = orchestrator.run("3 的 7 次方是多少?") print(response) # 协调器调用数学专家并返回结果
总结
-
ClientFactory: 只是创建 HTTP 客户端(就像创建一部电话来打给别人)
-
Client: 只是发送 HTTP 请求(就像拨打一个电话号码)
-
Remote Agent: 真正的 AI,负责处理和响应(就像你打电话联系的那个人)
您的代码本质上是在打电话给一个运行在 localhost:9000
的 AI 智能体。ClientFactory
只是帮助您用正确的协议拨打正确的号码!
更多推荐
所有评论(0)