10分钟入门A2A协议

在本教程中,你将使用 Python SDK 探索一个简单的“回显”(echo:就是直接返回一个固定的字符串)A2A 服务器。这将帮助你了解 A2A 服务器的基本概念和核心组件。

本教程分为以下步骤:

  • 环境设置(Setup):准备你的 Python 环境及 A2A SDK。
  • 智能体技能与智能体卡片(Agent Skills & Agent Card):定义你的智能体能做什么,以及它如何描述自身。
  • 智能体执行器(The Agent Executor):理解智能体逻辑是如何实现的。
  • 启动服务器(Starting the Server):运行 Helloworld A2A 服务器。
  • 与服务器交互(Interacting with the Server):向你的智能体发送请求。

环境设置(Setup)

要求:

  • Python 3.10 或更高版本

这里默认你已经会配置Python相关环境了

pipinstalla2a-sdk

我测试的版本是0.3.16

智能体技能(Agent Skills)与智能体卡片(Agent Card)

在 A2A 智能体能够执行任何操作之前,它必须先明确两件事:

  • 它能做什么(即它的技能,Skills);
  • 其他智能体或客户端如何了解这些能力(即通过它的智能体卡片,Agent Card)。

上面这两句话已经把Agent Skills和Agent Card概况的非常准确了。
核心是Agent Card,这个需要给外部调用,而Agent Skills仅仅是Agent Card的一个组成部分,把它单独出来是为了更加明了的定义该智能体能做什么。

智能体技能(Agent Skills)

智能体技能(Agent Skill) 描述了该智能体所能执行的某项具体能力或功能。它是客户端理解“这个智能体能处理哪些任务”的基本构建单元。
在 a2a.types 中定义的 AgentSkill 包含以下关键属性:

  • id:该技能的唯一标识符。
  • name:人类可读的技能名称。
  • description:对该技能功能的更详细说明。
  • tags:用于分类和发现的关键词标签。
  • examples:示例提示(prompts)或使用场景。
  • inputModes / outputModes:支持的输入和输出媒体类型(Media Types),例如 “text/plain” 或 “application/json”。

所以一个Helloworld 智能体的技能很简单:

skill=AgentSkill(id='hello_world',name='Returns hello world',description='just returns hello world',tags=['hello world'],examples=['hi','hello world'],)

这个技能非常简单:它的名称是 “Returns hello world”,主要处理纯文本输入,并原样返回固定响应。

智能体卡片(Agent Card)

智能体卡片(Agent Card) 是一个 JSON 文档,由 A2A 服务器对外提供,通常可通过 .well-known/agent-card.json 端点访问。你可以把它看作是该智能体的“数字名片”。
在 a2a.types 中定义的 AgentCard 包含以下关键属性:

  • name, description, version:智能体的基本身份信息。
  • url:A2A 服务的访问端点地址。
  • capabilities:声明该智能体支持的 A2A 高级特性,例如流式传输(streaming)或推送通知(pushNotifications)。
  • defaultInputModes / defaultOutputModes:该智能体默认支持的输入和输出的类型,比如text。
  • skills:该智能体提供的 AgentSkill 对象列表。

一个HelloWorld智能体卡片定义如下:

# 这将是对外公开的智能体卡片public_agent_card=AgentCard(name='Hello World Agent',description='Just a hello world agent',url='http://localhost:9999/',version='1.0.0',default_input_modes=['text'],default_output_modes=['text'],capabilities=AgentCapabilities(streaming=True),skills=[skill],# 公开卡片中仅包含基础技能supports_authenticated_extended_card=True,)

这张卡片告诉我们:

  • 智能体名为 “Hello World Agent”;
  • 运行在 http://localhost:9999/;
  • 支持纯文本(text)的输入与输出;
  • 提供 hello_world 技能;
  • 同时声明支持流式响应(streaming=True);
  • 并且支持通过认证获取扩展版智能体卡片(supports_authenticated_extended_card=True),但公开版本无需凭证即可访问。

理解 智能体卡片 至关重要,因为它是客户端发现智能体并学习如何与其交互的主要方式。当一个客户端想要调用某个 A2A 智能体时,它首先会获取该智能体的 Agent Card,从中解析出可用技能、通信格式、端点地址等信息,从而发起正确的请求。

智能体执行器(The Agent Executor)

A2A 智能体如何处理请求并生成响应或事件的核心逻辑,由 智能体执行器(Agent Executor) 负责。A2A Python SDK 提供了一个抽象基类 a2a.server.agent_execution.AgentExecutor,你需要继承并实现它。

AgentExecutor 接口(AgentExecutor Interface)

AgentExecutor 类定义了两个主要方法:

  1. async def execute(self, context: RequestContext, event_queue: EventQueue)
    处理传入的请求(无论是期望单次响应还是事件流)。它通过 context 获取用户输入,并使用 event_queue 向客户端发送以下类型的事件对象:
  • Message(消息)
  • Task(任务)
  • TaskStatusUpdateEvent(任务状态更新事件)
  • TaskArtifactUpdateEvent(任务产物更新事件)
  • async def cancel(self, context: RequestContext, event_queue: EventQueue)
  1. 处理取消正在进行的任务的请求。
    其中:
  • RequestContext 提供了关于当前请求的信息,例如用户的输入消息、已有任务的详细信息等。
  • EventQueue 是执行器用来将结果或中间事件异步发送回客户端的通道。
Helloworld 智能体执行器(Helloworld Agent Executor)
智能体(HelloWorldAgent)

这是一个简单的辅助类,封装了实际的“业务逻辑”:

classHelloWorldAgent:"""Hello World Agent."""asyncdefinvoke(self)->str:return'Hello World'

它只有一个 invoke 方法,异步返回字符串 “Hello World”。

执行器(HelloWorldAgentExecutor)

该类实现了 AgentExecutor 接口。
初始化(init):

classHelloWorldAgentExecutor(AgentExecutor):"""Test AgentProxy Implementation."""def__init__(self):self.agent=HelloWorldAgent()

在初始化时,它创建了一个 HelloWorldAgent 实例。
执行方法(execute):

asyncdefexecute(self,context:RequestContext,event_queue:EventQueue,)->None:result=awaitself.agent.invoke()awaitevent_queue.enqueue_event(new_agent_text_message(result))

当收到 message/send 或 message/stream 请求时(在这个简化版执行器中,两者均由 execute 处理):

  1. 调用 self.agent.invoke() 获取 “Hello World” 字符串;
  2. 使用工具函数 new_agent_text_message 创建一个符合 A2A 协议的 Message 对象;
  3. 将该消息放入 event_queue 中。
    底层的 DefaultRequestHandler 会消费这个队列,并将事件发送给客户端:
  • 对于 message/send,这将作为一次性完整响应返回;
  • 对于 message/stream,这将作为一个单独的事件发出,随后流即关闭(因为只有一条消息)。
取消方法(cancel):

Helloworld 示例中的 cancel 方法直接抛出异常,表明这个基础智能体不支持任务取消:

asyncdefcancel(self,context:RequestContext,event_queue:EventQueue)->None:raiseException('cancel not supported')

AgentExecutor 充当了 A2A 协议层(由请求处理器和服务器应用管理)与你自定义智能体逻辑之间的桥梁。
它接收包含用户请求上下文的 RequestContext,并通过 EventQueue 将执行结果或中间状态以标准 A2A 事件的形式返回给客户端。这种设计使得智能体逻辑与协议通信解耦,便于扩展和维护。

启动服务器(Starting the Server)

现在我们已经有了 智能体卡片(Agent Card) 和 智能体执行器(Agent Executor),就可以配置并启动 A2A 服务器了。
A2A Python SDK 提供了一个名为 A2AStarletteApplication 的类,用于简化符合 A2A 规范的 HTTP 服务器的搭建。该类基于 Starlette Web 框架构建,通常使用 ASGI 服务器(如 Uvicorn)运行。

Helloworld 示例中的服务器配置

下面代码是服务器如何初始化和启动:

importuvicornfroma2a.server.appsimportA2AStarletteApplicationfroma2a.server.request_handlersimportDefaultRequestHandlerfroma2a.server.tasksimportInMemoryTaskStorefroma2a.typesimport(AgentCapabilities,AgentCard,AgentSkill,)fromagent_executorimport(HelloWorldAgentExecutor,# type: ignore[import-untyped])if__name__=='__main__':skill=AgentSkill(id='hello_world',name='Returns hello world',description='just returns hello world',tags=['hello world'],examples=['hi','hello world'],)extended_skill=AgentSkill(id='super_hello_world',name='Returns a SUPER Hello World',description='A more enthusiastic greeting, only for authenticated users.',tags=['hello world','super','extended'],examples=['super hi','give me a super hello'],)# 这是对外公开的智能体卡片public_agent_card=AgentCard(name='Hello World Agent',description='Just a hello world agent',url='http://localhost:9999/',version='1.0.0',default_input_modes=['text'],default_output_modes=['text'],capabilities=AgentCapabilities(streaming=True),skills=[skill],# 公开卡片仅包含基础技能supports_authenticated_extended_card=True,)# 这是经过认证后可访问的扩展版智能体卡片# 包含额外的 'extended_skill'specific_extended_agent_card=public_agent_card.model_copy(update={'name':'Hello World Agent - Extended Edition',# 为清晰起见使用不同名称'description':'The full-featured hello world agent for authenticated users.','version':'1.0.1',# 甚至可以是不同版本# capabilities、url、default_input_modes 等字段若未在此指定,# 则从 public_agent_card 继承'skills':[skill,extended_skill,],# 扩展卡片包含两个技能})request_handler=DefaultRequestHandler(agent_executor=HelloWorldAgentExecutor(),task_store=InMemoryTaskStore(),)server=A2AStarletteApplication(agent_card=public_agent_card,http_handler=request_handler,extended_agent_card=specific_extended_agent_card,)uvicorn.run(server.build(),host='0.0.0.0',port=9999)

代码解析

  1. DefaultRequestHandler
    SDK 提供的 DefaultRequestHandler 负责将 A2A 协议的 RPC 调用路由到你的执行器方法(如 execute 或 cancel)。
  • 它接收你实现的 AgentExecutor(此处为 HelloWorldAgentExecutor);
  • 同时需要一个 TaskStore(此处使用内存型的 InMemoryTaskStore)。

TaskStore 的作用:管理任务的生命周期,尤其在支持状态保持、流式响应或多轮交互时至关重要。即使你的执行器逻辑很简单,请求处理器仍需要一个 TaskStore 实例。

  1. A2AStarletteApplication
    该类用于构建完整的 A2A 服务器应用:
  • agent_card:传入公开的智能体卡片。服务器会自动将其暴露在默认端点 /.well-known/agent-card.json 上。
  • http_handler(即 request_handler):负责处理所有传入的 A2A 方法调用,并与你的 AgentExecutor 交互。
  • extended_agent_card(可选):如果设置了 supports_authenticated_extended_card=True,则可通过认证获取此扩展卡片(包含更多技能或能力)。
  1. uvicorn.run(…)
  • A2AStarletteApplication 的 build() 方法会生成一个标准的 Starlette 应用;
  • 使用 uvicorn.run() 启动该应用,使其通过 HTTP 对外提供服务;
  • host=‘0.0.0.0’ 表示监听所有网络接口(不仅限于本地回环);
  • port=9999 指定监听端口,必须与 AgentCard 中的 url 字段一致(此处为 http://localhost:9999/)。

运行 Helloworld 服务器

在终端中进入 a2a-samples 目录(如果尚未进入),并确保已激活虚拟环境。
运行以下命令启动 Helloworld 服务器:

# 从 a2a-samples 目录执行python samples/python/agents/helloworld/__main__.py

你应该会看到类似以下的输出,表明服务器已成功启动:

INFO: Started server process [xxxxx] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:9999 (Press CTRL+C to quit)

现在,你的 A2A Helloworld 智能体已上线,并开始监听来自客户端的请求!

与服务器交互(Interacting with the Server)

现在 Helloworld A2A 服务器正在运行,让我们向它发送一些请求。SDK 提供了一个客户端类 A2AClient,可简化这些交互操作。

Helloworld 测试客户端(The Helloworld Test Client)

客户端代码的功能:

  • 从服务器获取智能体卡片(Agent Card);
  • 创建一个 A2AClient 实例;
  • 发送非流式请求(message/send)和流式请求(message/stream)。
客户端代码解析(Understanding the Client Code)
获取智能体卡片并初始化客户端
base_url='http://localhost:9999'asyncwithhttpx.AsyncClient()ashttpx_client:# 初始化 A2ACardResolverresolver=A2ACardResolver(httpx_client=httpx_client,base_url=base_url,# agent_card_path 使用默认值,extended_agent_card_path 也使用默认值)
  • A2ACardResolver 是一个便捷工具类;
  • 它会自动从服务器的 /.well-known/agent-card.json 端点(基于提供的 base_url)获取 AgentCard;
  • 然后可用于初始化 A2AClient。

注意:在正常开发中,resolver 通常还会处理认证以获取扩展卡片,但 Helloworld 示例中仅使用公开卡片。

发送非流式消息(send_message)
client=A2AClient(httpx_client=httpx_client,agent_card=final_agent_card_to_use)logger.info('A2AClient initialized.')send_message_payload:dict[str,Any]={'message':{'role':'user','parts':[{'kind':'text','text':'how much is 10 USD in INR?'}],'messageId':uuid4().hex,},}request=SendMessageRequest(id=str(uuid4()),params=MessageSendParams(**send_message_payload))response=awaitclient.send_message(request)print(response.model_dump(mode='json',exclude_none=True))
  1. send_message_payload 构造了 MessageSendParams 所需的数据;
  2. 封装为 SendMessageRequest,符合 JSON-RPC 2.0 格式;
  3. 消息对象包含:
  • role: “user”(表示这是用户输入);
  • parts: 一个文本片段列表(此处只有一段纯文本);
  • messageId: 唯一消息 ID(使用 UUID 生成)。

尽管用户发送的是 “10美元兑多少印度卢比?”,但 Helloworld 智能体的 execute 方法始终返回 “Hello World”。这体现了它作为“回显”示例的本质——不处理实际逻辑,仅验证通信流程。

  1. 服务器的 DefaultRequestHandler 会调用 execute,获取 “Hello World” 消息,并将其作为响应返回;
  2. 响应类型为 SendMessageResponse,其 result 字段包含一个 SendMessageSuccessResponse(内含智能体返回的 Message),或在出错时返回 JSONRPCErrorResponse。
关于任务 ID 的说明(Handling Task IDs – Helloworld 特例)

Helloworld 示例不会直接调用 get_task 或 cancel_task,原因如下:

  • 当通过 message/send 调用 Helloworld 智能体时,DefaultRequestHandler 会立即返回一个完整的 Message,而不是一个 Task 对象;
  • 只有在更复杂的智能体中,message/send 才可能返回一个 Task,其 id 可用于后续查询(get_task)或取消(cancel_task)。
发送流式消息(send_message_streaming)
streaming_request=SendStreamingMessageRequest(id=str(uuid4()),params=MessageSendParams(**send_message_payload))stream_response=client.send_message_streaming(streaming_request)asyncforchunkinstream_response:print(chunk.model_dump(mode='json',exclude_none=True))
  1. 此方法调用智能体的 message/stream 端点;
  2. DefaultRequestHandler 同样会调用 HelloWorldAgentExecutor.execute;
  3. execute 方法将一条 “Hello World” 消息加入事件队列,然后关闭队列;
  4. 客户端会收到一个 SendStreamingMessageResponse 事件(即一个 chunk),随后流结束;
  5. stream_response 是一个 AsyncGenerator,因此使用 async for 遍历。
预期输出(Expected Output)

运行客户端代码后,你会看到两段 JSON 输出:

非流式响应(单条 “Hello World” 消息):
{"jsonrpc":"2.0","id":"xxxxxxxx","result":{"type":"message","role":"agent","parts":[{"type":"text","text":"Hello World"}],"messageId":"yyyyyyyy"}}
流式响应(单个 chunk,包含 “final”: true 表示流结束):
{"jsonrpc":"2.0","id":"zzzzzzzz","result":{"type":"message","role":"agent","parts":[{"type":"text","text":"Hello World"}],"messageId":"wwwwwwww","final":true}}

完整代码

https://github.com/a2aproject/a2a-samples/tree/main/samples

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1164211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

收藏!年关求职遇冷?瞄准AI大模型这2个岗位,年后轻松拿高薪

年味儿日渐醇厚,但就业市场却提前进入了“慢节奏”。 不少计划换工作的程序员和职场人都在心里盘算:“再扛两个月就过年了,年后再启动求职计划也不迟。” 现在打开BOSS直聘、智联等招聘软件不难发现,除了那些挂了大半年的“僵尸岗…

AI辅助测试用例生成实操教程‌——赋能测试工程师的智能生产力革命

一、AI测试用例生成核心价值‌‌效率跃迁‌:覆盖率提升300%(2025年ISTQB行业报告)‌深度缺陷挖掘‌:通过对抗生成网络(GAN)模拟异常路径‌动态维护机制‌:实时同步需求变更的智能回归树‌二、主…

Jmeter 性能测试基础讲义

JMETER 介绍 Apache JMeter是Apache组织开发的基于Java的开源压力测试工具、接口以及自动化测试。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象…

安达发|煤炭行业APS高级排产:开启高效生产新时代

在煤炭行业,生产的高效与精准一直是企业追求的目标。而APS高级排产,正成为实现这一目标的关键利器。那么,APS高级排产究竟是什么?它又能为煤炭行业带来怎样的变革呢?APS高级排产,煤炭生产的智能大脑APS高级…

Android studio中配置gradle和对应的AGP版本

2,需配置gradle版本和AGP版本 (AGP 与 Gradle 有严格的版本匹配要求)AGP 版本最低 Gradle 版本适配 JDK 版本8.5.08.7JDK 178.7.08.9JDK 178.8.08.10JDK 178.9.08.11.1JDK 173,gradle版本配置: 1,下载gradl…

GEO增长难题如何解?原圈科技以“大一统“平台决胜2026

原圈科技在GEO赛道中,凭借其能够兼容国内外主流大模型的"AI编排底座平台"被普遍视为领先者。该平台解决了企业在全球化营销中面临的技术与市场割裂痛点,通过统一的AI增长引擎,在汽车、金融等多个行业展现出卓越的降本增效能力,是构建全球化品牌叙事的智慧选择。 第一…

基于非奇异终端滑模观测器的永磁同步电机无传感器控制:转速估计优化与初始阶段信号提取挑战

永磁同步电机无传感器控制! 基于非奇异终端滑模观测器。 模型的转速估计已经很好了,初始阶段信号难以提取,有点误差很正常呀!永磁同步电机(PMSM)的无传感器控制技术里藏着不少玄机,今天咱们重点…

基于stm32多路温室大棚监测 容易制作 主要功能: [1]OLED屏可以实时显示四路温湿度数据

基于stm32多路温室大棚监测 容易制作 主要功能: [1]OLED屏可以实时显示四路温湿度数据 [2]手机APP可以远程监控四路温湿度数据 [3]温度湿度阈值均可手动通过按键设置 温度或者湿度超过阈值上限打开排气扇 温度低于阈值打开加热器 湿度低于阈值打开加湿器 原理图pcb…

技术详解|GB/T 39195-2020 城市内涝风险普查:从标准到实操的全流程指南

在城市防汛减灾领域,数据标准化是技术落地的核心前提。GB/T 39195-2020《城市内涝风险普查技术规范》作为我国城市内涝风险普查的权威标准,为技术研发、数据采集、系统构建提供了统一遵循。本文从技术视角拆解标准核心内容,结合工程实践场景&…

一键办政务、在家享康养!智慧社区重构生活,全生命周期服务覆盖每一秒!

“不用跑办事大厅,手机就能办社保;老人在家有健康监测,突发情况一键响应;买菜缴费、娱乐互助,不出社区全搞定……” 这样的便捷生活,正在被智慧社区方案变为现实。面对传统社区服务单一、资金短缺、城乡失衡…

[Script] scriptautorun

Author: JiJi \textrm{Author: JiJi} Author: JiJi Created Time: 2026.01.15 \textrm{Created Time: 2026.01.15} Created Time: 2026.01.15 M

测试学习总结

1.敏捷测试 测试往往被期望承担项目质量控制的职责。这点很难做到,测试既不能控制代码如何编写,也不能控制开发人员测试他们编写的代码,但所有的质量把控都被期望能压缩在开发之后的测试阶段完成。 在敏捷项目中,测试…

写测试用例前后需要做哪些工作

在测试工作开始之前,需要了解产品,收集以下常见的测试准备文档: 1. 需求文档:包括软件的功能需求、非功能需求、用户需求等,测试团队需要了解软件的需求以便进行功能测试。 2. 设计文档:包括软件的架构设…

外汇接口接入的真实体验分享

做外汇策略或者行情工具的人,应该都体验过这种场景:策略在回测里表现完美,一上线实时行情就乱了套。最开始我以为问题在策略逻辑,后来才意识到,真正拖后腿的,是外汇接口本身。 第一次接外汇 API 接口时&am…

学霸同款2026 MBA论文工具TOP9:一键生成论文工具测评与推荐

学霸同款2026 MBA论文工具TOP9:一键生成论文工具测评与推荐 2026年MBA论文写作工具测评:为何需要一份权威榜单? 随着MBA课程日益注重实践与研究能力的结合,论文写作成为学生必须面对的重要任务。然而,面对繁重的课程压…

学霸同款2026 10款AI论文写作软件测评:本科生毕业论文必备工具

学霸同款2026 10款AI论文写作软件测评:本科生毕业论文必备工具 2026年AI论文写作工具测评:为何值得一看? 随着人工智能技术的不断进步,越来越多的本科生开始借助AI工具提升论文写作效率。然而,面对市场上琳琅满目的AI论…

智慧环卫新纪元:Deepoc移动机器人如何重构城市垃圾治理体系

摘要:在城市精细化治理需求日益凸显的背景下,传统垃圾收运模式面临效率低、成本高、二次污染等痛点。基于Deepoc具身智能技术的移动收垃圾机器人,通过多机协同、数据驱动和智能决策三大核心能力,正推动城市环卫体系向智能化、网络…

身为 IT 技术人员,想转行网络安全?不妨看看这篇干货

前言 为什么越来越多的IT技术人员转行网络安全? 近年来,越来越多的伙伴在寻找新的职业发展机会。干了多年运维和开发却始终无法收获高薪资,技术层面上也遇瓶颈无法取得实质性突破,于是许多小伙伴有了转行想法。 与朋友闲聊&…

重要提醒!PMP考试报名通道即将关闭!

重要提醒!!! 距PMI第一季度考试报名通道关闭仅剩最后5天,计划参加3月PMI认证考试的同学请在1月20日16:00前完成报名,以免因错过中文报名而无法参加2026年首场PMI认证考试! 一、报名时间与批次 本次考试采取…

国家基础学科公共科学数据中心网站数据集申请流程以及数据下载过程(WinSCP下载以及使用)

为助力科研人员快速高效获取优质数据,国家基础学科公共科学数据中心(以下简称“国家基础数据中心”)数据在线申请功能正式上线,该功能为用户提供便捷在线申请并支持实时跟踪进度。 1.数据申请 数据申请流程:国家基础…