尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

[A2A协议与实现-09].NET SDK客户端的设计与实现

[A2A协议与实现-09].NET SDK客户端的设计与实现
📅 发布时间:2026/7/27 9:28:02

A2A的协议提供了四组核心操作的输入和输出数据结构(可以参考我的前面的文章从Protobuf消息详解A2A协议四大核心操作),如何进一步知道具体采用的传输协议,我就可以直接利用HttpClient来编写A2A客户端代码,实际上前面的演示都是这么做得。实际上A2A官方针对.NET的SDK提供了客户端实现。

1. IA2AClient

A2A协议与实现-03:从Protobuf消息详解A2A协议四大核心操作从协议的角度解读了A2A的四组核心操作,A2A协议与实现-08:基于MAF的A2A Server设计与实现介绍了IA2ARequestHandler接口,我们说它是A2A服务端SDK对A2A协议的表达,如下这个IA2AClient具有与IA2ARequestHandler接口完全一致的定义,则是客户端SDK针对A2A协议的表达。我们自然可以利用它的实现来执行A2A的四组核心操作。

publicinterfaceIA2AClient{// 1. Agent调用Task<SendMessageResponse>SendMessageAsync(SendMessageRequestrequest,CancellationTokencancellationToken=default);IAsyncEnumerable<StreamResponse>SendStreamingMessageAsync(SendMessageRequestrequest,CancellationTokencancellationToken=default);// 2. 后台任务管理Task<AgentTask>GetTaskAsync(GetTaskRequestrequest,CancellationTokencancellationToken=default);Task<ListTasksResponse>ListTasksAsync(ListTasksRequestrequest,CancellationTokencancellationToken=default);Task<AgentTask>CancelTaskAsync(CancelTaskRequestrequest,CancellationTokencancellationToken=default);IAsyncEnumerable<StreamResponse>SubscribeToTaskAsync(SubscribeToTaskRequestrequest,CancellationTokencancellationToken=default);// 3. 基于后台任务的通知推送配置管理Task<TaskPushNotificationConfig>CreateTaskPushNotificationConfigAsync(CreateTaskPushNotificationConfigRequestrequest,CancellationTokencancellationToken=default);Task<TaskPushNotificationConfig>GetTaskPushNotificationConfigAsync(GetTaskPushNotificationConfigRequestrequest,CancellationTokencancellationToken=default);Task<ListTaskPushNotificationConfigResponse>ListTaskPushNotificationConfigAsync(ListTaskPushNotificationConfigRequestrequest,CancellationTokencancellationToken=default);TaskDeleteTaskPushNotificationConfigAsync(DeleteTaskPushNotificationConfigRequestrequest,CancellationTokencancellationToken=default);// 4. AgetCard扩展Task<AgentCard>GetExtendedAgentCardAsync(GetExtendedAgentCardRequestrequest,CancellationTokencancellationToken=default);}

2. 针对JSON-RPC的实现

既然是对A2A协议的表达,IA2AClient接口自然与具体的传输协议无关,但是具体的实现则不得不考虑底层采用的传输协议。如下所示的A2AClient类型是针对JSON-RPC的实现。我们在初始化A2AClient对象的时候只需要提供A2A Server的基础地址和一个可选的HttpClient对象。具体的实现很简单,不外乎就是使用操作对应的Method为请求封装成JSON-RPC封套以POST形式发送。如果采用流式调用,由于服务端会采用SSE实时回传生成的内容,这里只需要采用对应的方式解析SSE数据项即可。

publicsealedclassA2AClient:IA2AClient,IDisposable{publicA2AClient(UribaseUrl,HttpClient?httpClient=null);...}

如下所示的是采用A2AClient以阻塞方式调用Agent的例子。

usingA2A;usingAzure.AI.Projects;usingDotNetEnv;usingMicrosoft.Agents.AI.Hosting;usingMicrosoft.Extensions.AI;usingOpenAI;usingOpenAI.Responses;usingSystem.ClientModel;Env.Load();varapiKey=Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;varendpoint=Environment.GetEnvironmentVariable("OPENAI_BASE_URL")!;varagent=newOpenAIClient(credential:newApiKeyCredential(key:apiKey),options:newOpenAIClientOptions{Endpoint=newUri(endpoint)}).GetResponsesClient().AsAIAgent(model:"gpt-5.4-mini",name:"a2a-agent",instructions:""" 你是一个深谙中国古代历史的专家,善于根据正史,以公正客观的态度于人交流历史问题。 对于用户提出的问题,请以简介概括性的语言予以答复,字数尽量保持在200字以内。""");varbuidler=WebApplication.CreateBuilder();buidler.Services.AddA2AServer(agent.Name!).AddAIAgent(agent.Name!,(services,anme)=>agent);varurl="http://localhost:3721/";buidler.WebHost.UseUrls(url);varapp=buidler.Build();app.MapA2AJsonRpc(agent,"/");awaitapp.StartAsync();usingvarclient=newA2AClient(newUri(url));varprompt="春秋初霸郑庄公寤生为何没有成为春秋五霸,是因为郑国不够强大吗?";varrequest=newSendMessageRequest{Message=newMessage{Role=Role.User,Parts=[newPart{Text=prompt}]},};varresponse=awaitclient.SendMessageAsync(request);foreach(varpartinresponse.Message!.Parts){Console.WriteLine(part.Text);}

输出:

不完全是。郑庄公在春秋初年确实一度称霸,尤其在“周郑交质”“射王中肩”等事件后,威望很高,但郑国的霸业有明显局限: 一是国土狭小、人口与资源有限,难以长期支撑霸权; 二是地处四战之地,易受周边大国夹击; 三是郑庄公之后继承者能力不足,国力很快衰落。 “春秋五霸”本身也是后世概括,通常重在齐桓公、晋文公等更具持续影响者,所以郑庄公常被视为“春秋初霸”,而不列入五霸。

如果希望通过逐字输出的效果,可以按照如下的方式采用流式调用:

awaitforeach(varresponseinclient.SendStreamingMessageAsync(request)){foreach(varpartinresponse.Message!.Parts){Console.Write(part.Text);}}

3. 针对HTTP-JSON的实现

如果A2A Server是采用HTTP-JSON协议构建,那么就需要使用如下这个对应的客户端类型A2AHttpJsonClient。它与OpenAIClient具有完全一致的构造函数定义。

publicsealedclassA2AHttpJsonClient:IA2AClient,IDisposable{publicA2AHttpJsonClient(UribaseUrl,HttpClient?httpClient=null);...}

我们将上面演示的程序切换成HTTP-JSON协议,并采用A2AHttpJsonClient作为调用客户端。

usingA2A;usingAzure.AI.Projects;usingDotNetEnv;usingMicrosoft.Agents.AI.Hosting;usingMicrosoft.Extensions.AI;usingOpenAI;usingOpenAI.Responses;usingSystem.ClientModel;Env.Load();varapiKey=Environment.GetEnvironmentVariable("OPENAI_API_KEY")!;varendpoint=Environment.GetEnvironmentVariable("OPENAI_BASE_URL")!;varagent=newOpenAIClient(credential:newApiKeyCredential(key:apiKey),options:newOpenAIClientOptions{Endpoint=newUri(endpoint)}).GetResponsesClient().AsAIAgent(model:"gpt-5.4-mini",name:"a2a-agent",instructions:""" 你是一个深谙中国古代历史的专家,善于根据正史,以公正客观的态度于人交流历史问题。 对于用户提出的问题,请以简介概括性的语言予以答复,字数尽量保持在200字以内。""");varbuidler=WebApplication.CreateBuilder();buidler.Services.AddA2AServer(agent.Name!).AddAIAgent(agent.Name!,(services,anme)=>agent);varurl="http://localhost:3721/";buidler.WebHost.UseUrls(url);varapp=buidler.Build();app.MapA2AHttpJson(agent,"/");awaitapp.StartAsync();usingvarclient=newA2AHttpJsonClient(newUri(url));varprompt="春秋初霸郑庄公寤生为何没有成为春秋五霸,是因为郑国不够强大吗?";varrequest=newSendMessageRequest{Message=newMessage{Role=Role.User,Parts=[newPart{Text=prompt}]},};Console.WriteLine($"{newstring('-',20)}SendMessageAsync{newstring('-',20)}");varresponse=awaitclient.SendMessageAsync(request);foreach(varpartinresponse.Message!.Parts){Console.WriteLine(part.Text);}Console.WriteLine($"{newstring('-',20)}SendStreamingMessageAsync{newstring('-',20)}");awaitforeach(varupdateinclient.SendStreamingMessageAsync(request)){foreach(varpartinupdate.Message!.Parts){Console.Write(part.Text);}}Console.ReadLine();

输出:

--------------------SendMessageAsync-------------------- 不是主要因为“郑国不够强大”,而是郑庄公的霸业更偏“春秋初期的权力中心”,难以长期维持。 郑庄公确实曾挟强郑、制诸侯、周旋王室,一度有霸主气象,但郑国地处中原四战之地,国小地狭,战略纵深不足;加之庄公死后国力迅速下滑,未能形成持续稳定的霸权体系。 而后来的“五霸”多是长期扩张、能整合资源并持续主盟的强国君主,所以郑庄公虽有“初霸”之名,终究未列入传统春秋五霸。 --------------------SendStreamingMessageAsync-------------------- 不只是“郑国不够强大”,更关键是郑庄公的霸业具有明显的**短暂性和局部性**。 春秋初年“霸”多指能号令诸侯、主持会盟者,郑庄公虽曾挟王室、败强邻,威震一时,但其影响主要限于中原局部,且未形成长期稳定的盟主地位。 此后郑国国力有限,又屡受宋、楚、齐等国压力,难以延续霸权。后来“五霸”之所以被后世定型,更多是因为其霸业更持久、影响更大、史书叙事也更集中。

相关新闻

  • 变分自编码器(VAE)原理与应用全解析
  • 2023机器学习五大前沿技术解析与应用实践
  • OpenClaw开源AI框架:低代码开发与硬件需求解析

最新新闻

  • OpenClaw多模态记忆技术解析与实战指南
  • 真实测评,在北京创业找代办,我为什么认准北税企服? - yunying2025
  • 千兆网线和百兆网线的做法区别:水晶头一样,内部线序却决定速度
  • SpringBoot健康服务分享平台设计与实现
  • Java AI 项目选型:当 HTTP 裸调遇上框架,我的三个关键决策维度与实战代码
  • 动态交通下路面三维重建:车辆遮挡优化与精度提升方案

日新闻

  • OpenClaw开源智能体网关:AI助手与即时通讯的完美融合
  • 写一个简单的sh脚本
  • 2026年 西安缝隙天线厂家:5G通信与车载天线专业定制供应商深度分析 - 卓企推荐

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号