.NET,你忘记了么?(八)—— 从dynamic到特性误用
挝温阑鬃A2A 即 Agent-to-Agent它定义了三个关键的角色它们各司其职互相配合支撑多个Agent的运行。那么都是哪几个角色呢下面告诉你image角色1用户User即终端用户可能是人类 或 服务需要使用Agent来完成某个任务。角色2客户端Client一个代表用户向 远程Agent 发送请求的实体它发送的请求是严格按照A2A协议的。它的表现形式可以是一个应用程序、服务 或 一个Agent。例如我们在上一篇的Demo中开发的一个控制台应用程序通过引用A2A包来向远端的Agent发送请求。角色3远程AgentRemote Agent一个执行实际任务的Agent部署在某个远端Server上对于客户端来说是“黑盒”一样的存在仅仅通过Agent Card声明自己提供的接口或技能但内部实现细节或工作机制是不透明的即一个“黑盒”。例如我们在上一篇的Demo中开发的一个WebAPI项目EchoAgent提供了一个ProcessMessage的技能 以及 声明了一个AgentCard公开了一些元数据。A2A的四大对象A2A中定义了一套完整的对象体系其中最核心的就是下面这四个核心对象第一个对象Agent Card又称Agent名片每个A2A的远程Agent都需要发布一个JSON格式的名片被称为“Agent Card”用于描述这个Agent具有哪些技能 及其 认证机制便于Client可以获得这些信息并选择合适的Agent来完成任务。image其实它就和我们在做后端服务开发中的服务注册和发现的机制差不多只不过这个注册的信息被标准化了下面我们可以看看一个典型的Agent Card的JSON格式复制代码{name: Google Maps Agent,description: Plan routes, remember places, and generate directions,url: https://maps-agent.google.com,provider: {organization: Google,url: https://google.com},version: 1.0.0,authentication: {schemes: OAuth2},defaultInputModes: [text/plain],defaultOutputModes: [text/plain, application/html],capabilities: {streaming: true,pushNotifications: false},skills: [{id: route-planner,name: Route planning,description: Helps plan routing between two locations,tags: [maps, routing, navigation],examples: [plan my route from Sunnyvale to Mountain View,whats the commute time from Sunnyvale to San Francisco at 9AM],outputModes: [application/html, video/mp4]}]}复制代码这个JSON数据简要描述了一个名为Google Maps Agent的Agent定义。这个Agent的主要功能是规划路线、记住地点和生成导航指示。这个应用由Google提供版本号是1.0.0采用OAuth2身份验证。它支持文本和HTML格式的输入和输出具有流媒体功能但不支持推送通知。它的一个核心技能是route-planner可以帮助用户规划两个地点之间的路线并输出HTML和视频格式的内容。在A2A .NET SDK中AgentCard的定义如下复制代码public class AgentCard{public string Name { get; set; } // 代理名称public string Description { get; set; } // 代理描述public string Url { get; set; } // 代理 URLpublic AgentProvider? Provider { get; set; } // 提供商信息public string Version { get; set; } // 版本信息public AgentCapabilities Capabilities { get; set; } // 代理能力public List Skills { get; set; } // 代理技能public List DefaultInputModes { get; set; } // 默认输入模式public List DefaultOutputModes { get; set; }// 默认输出模式}复制代码在上一篇的Demo中我们在定义EchoAgent时就实现了一个GetAgentCard方法并将其注册到服务发现中最终被Client探索发现时就会以JSON格式输出给到Client复制代码public class EchoAgent{public void Attach(ITaskManager taskManager){taskManager.OnMessageReceived ProcessMessageAsync;taskManager.OnAgentCardQuery GetAgentCardAsync;}private Task ProcessMessageAsync(MessageSendParams messageSendParams, CancellationToken cancellationToken){......}private Task GetAgentCardAsync(string agentUrl, CancellationToken cancellationToken){return Task.FromResult(new AgentCard{Name Echo Agent,Description Echoes messages back to the user,Url agentUrl,Version 1.0.0,DefaultInputModes [text],DefaultOutputModes [text],Capabilities new AgentCapabilities { Streaming true }});}}复制代码与此同时在Client中也可以主动进行服务发现例如上一篇Demo中的Client示例代码// Discover agent and create clientvar cardResolver new A2ACardResolver(new Uri(https://localhost:7243/));var agentCard await cardResolver.GetAgentCardAsync();var client new A2AClient(new Uri(agentCard.Url));第二个对象Task 任务Task 是 Client 和 远程Agent 之间协作的一个概念很好理解一个Task代表一个需要完成的任务每个Task都有一个唯一的ID号它通常包含了任务状态、历史记录 和 执行结果 等信息。Task的主要具体状态有submitted, working, completed, canceled, failed 等下图展示了Task的状态机转换流。image在A2A .NET SDK中AgentTask的定义如下复制代码public class AgentTask : A2AResponse{public string Id { get; set; } // 任务 IDpublic string? ContextId { get; set; } // 上下文 IDpublic AgentTaskStatus Status { get; set; } // 任务状态public List? Artifacts { get; set; } // 任务产出物public List? History { get; set; } // 消息历史public Dictionary? Metadata { get; set; } // 元数据}复制代码第三个对象Artifact工件 或 成果Artifact 和我们在DevOps CI/CD流水线中的Artifact即工件的概念类似它是 远程Agent执行完某个任务后生成输出的结果即远程Agent返回的结果通过一个Artifact对象输出给Client每个任务的结果可能都不一样。一个Artifact可以包含多个部分parts每个部分part可以是文本、文档、图像 等涉及纯文本、文件 和 结构化数据。image第四个对象Message消息Message 也很好理解它就是 Client 和 远程Agent 之间通信的 一个消息对象它通常包含了 指令 和 状态更新 等内容。同样的一个Message对象也可以包含多个parts用于传递如 文本、文件 或 结构化 等不同类型的内容。每个Message都有发送方设置的一个唯一的messageId且通过一些关键词如user代表Client发送的或“agent”代表服务端发送的来区分角色。在A2A .NET SDK中Message的定义如下复制代码public class Message : A2AResponse{public MessageRole Role { get; set; } // 消息角色 (User/Agent)public List Parts { get; set; } // 消息部分public string? MessageId { get; set; } // 消息 IDpublic string? TaskId { get; set; } // 关联任务 IDpublic string? ContextId { get; set; } // 上下文 IDpublic Dictionary? Metadata { get; set; } // 元数据}复制代码A2A协议的工作流程这里我们来通过一个简单的例子看看A2A协议的 请求-响应 工作流程是怎么样的。例如有这样一个场景“招聘XX岗位候选人搜寻”Step1用户在统一界面下向Client假设它也是一个Agent发送一个请求消息“请帮我寻找一个XX岗位的候选人”。Step2Client将用户的请求消息进行封装并根据岗位需求依次调用一些远程Agent如 简历检索Agent、技能筛选Agent 等等。例如下面的请求示例展示了Client在检索了5位候选人简历之后通过A2A协议向远端技能筛选Agent发送的任务请求复制代码{jsonrpc: 2.0,id: 1,method: tasks/send,params: {id: de38c76d-d54c-436c-8b9f-4c2703648d64,message: {role: user,parts: [{type: text,text: 请分析下面5位候选人是否符合岗位需求并推荐最佳面试人选。}]},metadata: {}}}复制代码Step3各个远端Agent执行各自的任务并返回给Client对应的Artifact对象结果如候选人名单等然后再由Client进行汇总和展示。复制代码{jsonrpc: 2.0,id: 1,result: {id: de38c76d-d54c-436c-8b9f-4c2703648d64,sessionId: c295ea44-7543-4f78-b524-7a38915ad6e4,status: {state: completed},artifacts: [{name: result,parts: [{type: text,text: 第三位候选人最符合你的需求!建议安排面试。}]}],metadata: {}}}复制代码Step4后续Client可以陆续调用其他远端Agent如 面试安排Agent、背景调查Agent等完成端到端的自动化招聘流程。那么该场景的整个工作流程便如下图所示image除此之外实际应用案例中通常是A2A与MCP两个协议一起使用形成更广的应用范围。例如下图展示了一个汽车维修店的场景店长智能体 和 机械师智能体 通过A2A协议完成任务移交hand-off店长可以处理常见问题但机械师可以解决技术难题。机械师智能体再通过MCP协议完成内部工具使用完成具体任务还可以通过A2A协议和零件供应商Agent完成外部协作。image由此可见其实在企业客服 或 售后中心 等场景中A2A协议可以被广泛应用于多Agent协作。小结本文介绍了A2A的三个主要角色User、Client 和 Remote Agent以及 四个核心对象Agent Card、Task、Artifact 和 Message并通过简单的例子介绍了A2A协议的典型工作流程相信对于你加深了解A2A协议会有帮助。下一篇我们将以一个旅行规划的应用场景结合LLM大模型来实现一个A2A协议的案例它会涉及一个Client 和 三个Remote Agent是一个拿来练手的好案例。参考资料

相关新闻

Android 样式常用字段

Android 样式常用字段

取消按钮阴影效果将按钮的 stateListAnimator 属性设置为 false&#xff0c;可以移除默认的按压阴影动画效果。 示例代码&#xff1a;<Buttonandroid:id"id/button"android:layout_width"wrap_content"android:layout_height"wrap_content"an…

2026/7/8 9:19:41 阅读更多 →
报错 ssh: Could not resolve hostname gitee.com: Temporary failure in name resolution 是典型的 WSL DNS 解析失效

报错 ssh: Could not resolve hostname gitee.com: Temporary failure in name resolution 是典型的 WSL DNS 解析失效

在 WSL 中&#xff0c;/etc/resolv.conf 默认是由系统自动生成的软链接&#xff0c;通常指向 Windows 宿主机的地址。要永久修复它且不让它在重启后被覆盖&#xff0c;你需要按照以下步骤操作&#xff1a;第一步&#xff1a;禁止 WSL 自动生成 resolv.conf我们需要告诉 WSL 不要…

2026/7/7 8:24:11 阅读更多 →
3.二叉树的经典算法

3.二叉树的经典算法

一.根据二叉树构建字符串 题目链接:606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), …

2026/7/7 4:59:54 阅读更多 →

最新新闻

基于STM32与TPS61170的智能高压DC-DC转换系统设计

基于STM32与TPS61170的智能高压DC-DC转换系统设计

1. 项目背景与核心器件选型 在工业控制、医疗设备和实验室仪器等领域&#xff0c;经常需要将低压直流电源转换为高压直流电源。传统方案采用分立元件搭建&#xff0c;存在效率低、体积大、稳定性差等问题。本项目采用TI的TPS61170升压转换器与ST的STM32F765ZI微控制器组合&…

2026/7/8 9:15:54 阅读更多 →
Codex运行时三要素:AgentLoop、工具系统与沙箱深度解析

Codex运行时三要素:AgentLoop、工具系统与沙箱深度解析

1. 这不是在读论文&#xff0c;而是在拆解一个“会自己写代码的工人”的操作系统OpenAI Codex 的公开资料里&#xff0c;最常被提起的是它“能根据注释生成函数”——但那只是它露出水面的冰山一角。真正让 Codex 能支撑起 GitHub Copilot、CodeWhisperer 这类产品级工具的&…

2026/7/8 9:15:54 阅读更多 →
【Java毕业设计】基于 SpringBoot+Vue 的地方特色水果商城管理系统的设计与实现 基于前后端分离的农产品线上零售交易系统(源码+文档+远程调试,全bao定制等)

【Java毕业设计】基于 SpringBoot+Vue 的地方特色水果商城管理系统的设计与实现 基于前后端分离的农产品线上零售交易系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026/7/8 9:13:53 阅读更多 →
# 2026年AI API中转平台选型指南:高并发能力、协议兼容与白盒计费体系深度解析

# 2026年AI API中转平台选型指南:高并发能力、协议兼容与白盒计费体系深度解析

随着2026年AI应用全面进入产业化阶段&#xff0c;大模型API已经不再只是开发接口&#xff0c;而逐渐演变为企业AI系统中的核心基础设施。 从AI编程助手、自动化Agent&#xff0c;到多模型协同推理平台&#xff0c;企业对于API中转层的要求正在迅速提高。过去只关注“能否调用模…

2026/7/8 9:13:53 阅读更多 →
时间序列滑动窗口分割:5个关键参数对模型性能的影响分析

时间序列滑动窗口分割:5个关键参数对模型性能的影响分析

时间序列滑动窗口分割&#xff1a;5个关键参数对模型性能的影响分析在金融风控、工业设备监测和气象预测等领域&#xff0c;时间序列预测的准确性直接影响决策质量。滑动窗口作为时间序列建模的核心预处理技术&#xff0c;其参数配置往往被开发者忽视&#xff0c;却对模型表现有…

2026/7/8 9:13:53 阅读更多 →
从漂移检测到灰度部署的六步实践

从漂移检测到灰度部署的六步实践

1. 引言&#xff1a;为什么需要标准化的模型更新流程&#xff1f; 在工业AI应用场景中&#xff0c;模型部署上线并非终点&#xff0c;而是持续运营的开始。数据分布会随时间“漂移”&#xff0c;设备工况会变化&#xff0c;新的异常模式也会出现。一个缺乏标准化更新流程的模型…

2026/7/8 9:13:53 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验&#xff1a;MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级&#xff0c;许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中&#xff0c;可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC&#xff0c;配合PIC18F45K22微控制器&#xff0c;能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻