首页 / 资讯中心 / 文章详情

Hello-Agents 第十章 智能体通信协议:MCP/A2A/ANP 多协议协作实战与 TaoToken 统一接入

Hello-Agents 第十章 智能体通信协议:MCP/A2A/ANP 多协议协作实战与 TaoToken 统一接入 ★ FEATURED ARTICLE
1. 为什么多智能体协作绕不开通信协议如果你已经跟着 Hello-Agents 写到第十章大概率会遇到一个很具体的困惑单个 Agent 调工具、跑流程都挺顺可一旦让两个 Agent 分工干活代码就开始互相打架。一个负责搜索、一个负责写报告中间靠什么传数据靠全局变量靠临时文件还是靠把对方的输出硬塞进 prompt这些土办法在小 demo 里能跑一旦 Agent 数量上去、工具来源变杂维护成本会指数级上升。通信协议要解决的就是这件事。它给智能体之间、智能体和外部工具之间定了一套标准接口让不同来源、不同语言写的服务能用统一方式被访问不用为每个服务单独写适配器。这个思路和互联网的 TCP/IP 很像设备之间通信不需要为每种设备写专门的通信代码只要都遵守同一套协议就行。Hello-Agents 第十章把当前主流的三种协议放在一起讲分工其实很清晰。MCP 解决的是「智能体怎么访问工具和资源」它是最成熟、生态最广的一类GitHub、文件系统、数据库都有现成的 MCP Server。A2A 解决的是「智能体之间怎么互相调用」适合把多个独立 Agent 串成一条协作链。ANP 解决的是「服务怎么被发现」相当于给 Agent 世界配了一个服务注册中心谁上线了、提供什么能力都能查得到。三者不是替代关系而是组合关系。一个真实的多智能体系统里常见形态是ANP 负责服务发现A2A 负责 Agent 之间的任务流转MCP 负责每个 Agent 去调具体工具。这一章的价值就在于把这套组合方式讲清楚并且给出可运行的代码。不过实际动手时还有一个绕不开的问题这些 Agent 背后都要调大模型而模型接入如果每个 Agent 各配一套 Key、各写一套请求逻辑调试会非常痛苦。我在跑这一章示例时把模型通道统一收到了 TaoToken 上一个 Key、一个 Base URL 就能覆盖多个模型Agent 侧只改环境变量协议层的代码完全不用动。下面按「协议分工 → 统一接入 → 可复制配置 → 验证 → 排障」的顺序展开你可以直接跟着敲。2. MCP、A2A、ANP 在 Hello-Agents 里的分工与 TaoToken 前置准备先把三种协议的定位用一张表对齐避免后面配置时混淆。协议解决的问题典型场景Hello-Agents 中的工具类MCP智能体访问工具/资源调 GitHub、读写文件、查数据库MCPToolA2A智能体之间通信搜索 Agent 把结果交给写作 AgentA2AToolANP服务注册与发现新 Agent 上线后能被其他 Agent 找到ANPToolMCP 的交互流程在书里写得很细用户提问 → Host比如 Claude Desktop→ 模型分析 → 发现需要文件信息 → MCP Client 连接 → 文件系统 MCP Server → 执行操作 → 返回结果 → 模型生成回答。这条链路里MCP Server 是能力提供方MCP Client 是连接方模型只负责决策调哪个工具。A2A 的链路更偏「Agent 对 Agent」。一个 Agent 把任务打包成消息发给另一个 Agent对方处理后回传结果。它和 MCP 的区别在于MCP 是 Agent 调工具A2A 是 Agent 调 Agent后者要处理的是任务状态、上下文传递、多轮协商。ANP 则更像基础设施。服务注册时登记service_id、service_type、endpoint其他 Agent 通过discover_services查询可用服务。没有 ANPAgent 之间的地址就得硬编码扩展性很差。理解了分工接下来是模型通道。Hello-Agents 的示例里用HelloAgentsLLM()初始化模型默认会读环境变量。如果你每个 Agent 都单独配一套模型参数调试时改一处漏一处。我的做法是统一走 TaoToken官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 地址https://taotoken.net/api控制台创建 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite拿到 Key 之后Agent 侧只需要认三个东西Base URL、API Key、Model ID。这三件套在后面的配置片段里会反复出现尤其是你如果用 Claude Code、Cline 或 Codex 这类工具配置项名字不同但本质一样。这里要提醒一句TaoToken 是模型接入通道不是编辑器替代品也不是让你绕过协议层。协议该怎么写还怎么写它只负责把模型请求这条路打通。前置准备做完下面进入可复制配置。3. 可复制的协议配置片段与统一 Key 接入这一节给三段可直接粘贴的配置分别对应环境变量、MCP Server 声明、以及 Claude Code 类工具的 settings。路径和字段名保持和实际使用一致你按自己系统改。先配环境变量。Hello-Agents 示例里用load_dotenv读.env所以把模型通道和 GitHub Token 都放进去# .env 文件放在项目根目录 # 模型统一通道 OPENAI_API_KEY你的TaoTokenKey OPENAI_BASE_URLhttps://taotoken.net/api OPENAI_MODELgpt-4o-mini # GitHub MCP 需要的 Token GITHUB_PERSONAL_ACCESS_TOKEN你的GitHubTokenWindows PowerShell 下临时设置$env:OPENAI_API_KEY你的TaoTokenKey $env:OPENAI_BASE_URLhttps://taotoken.net/api $env:GITHUB_PERSONAL_ACCESS_TOKEN你的GitHubTokenLinux/macOSexport OPENAI_API_KEY你的TaoTokenKey export OPENAI_BASE_URLhttps://taotoken.net/api export GITHUB_PERSONAL_ACCESS_TOKEN你的GitHubToken接着是 MCP Server 的声明。Hello-Agents 里用MCPTool直接传server_command但如果你用的是 Claude Desktop 或 Cline配置写在 JSON 里。下面这段是标准 MCP 配置结构路径按你的实际安装位置改{ mcpServers: { github: { command: npx, args: [-y, modelcontextprotocol/server-github], env: { GITHUB_PERSONAL_ACCESS_TOKEN: 你的GitHubToken } }, filesystem: { command: npx, args: [-y, modelcontextprotocol/server-filesystem, .] } } }如果你用 Claude Code配置走settings.json模型通道和 MCP 可以放在一起{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: 你的TaoTokenKey, ANTHROPIC_MODEL: claude-3-5-sonnet-20241022 }, mcpServers: { github: { command: npx, args: [-y, modelcontextprotocol/server-github], env: { GITHUB_PERSONAL_ACCESS_TOKEN: 你的GitHubToken } } } }Codex 用户走auth.json结构类似把 Base URL 和 Key 填进去即可。Cline 的 MCP 配置在插件设置里字段名是mcpServers和上面 JSON 一致。三件套再强调一次Base URL 填https://taotoken.net/apiKey 填控制台创建的Model ID 按你要用的模型填。这三个值在 MCP、A2A、ANP 三种协议下都一样因为协议层不关心模型从哪来只关心 Agent 能不能正常推理。配置写完下一步是跑起来看消息流转。4. 启动示例智能体并验证跨协议消息流转先跑书里最基础的三协议体验代码确认工具类能正常初始化from hello_agents.tools import MCPTool, A2ATool, ANPTool # MCP调用工具 mcp_tool MCPTool() result mcp_tool.run({ action: call_tool, tool_name: add, arguments: {a: 10, b: 20} }) print(fMCP计算结果: {result}) # ANP服务发现 anp_tool ANPTool() anp_tool.run({ action: register_service, service_id: calculator, service_type: math, endpoint: http://localhost:8080 }) services anp_tool.run({action: discover_services}) print(f发现的服务: {services}) # A2A智能体通信 a2a_tool A2ATool(http://localhost:5000) print(A2A工具创建成功)预期输出里MCP 返回30.0ANP 返回注册的服务列表A2A 打印创建成功。如果 MCP 这步就报错先看第 5 节的排障。接着跑书里的多 Agent 协作案例GitHub 搜索专家 文档生成专家。核心代码结构如下模型通道走前面配的环境变量from hello_agents import SimpleAgent, HelloAgentsLLM from hello_agents.tools import MCPTool from dotenv import load_dotenv load_dotenv(dotenv_path../HelloAgents/.env) # Agent 1GitHub 搜索专家 github_searcher SimpleAgent( nameGitHub搜索专家, llmHelloAgentsLLM(), system_prompt你是一个GitHub搜索专家。 你的任务是搜索GitHub仓库并返回结果。 请返回清晰、结构化的搜索结果包括 - 仓库名称 - 简短描述 保持简洁不要添加额外的解释。 ) github_tool MCPTool( namegh, server_command[npx, -y, modelcontextprotocol/server-github] ) github_searcher.add_tool(github_tool) # Agent 2文档生成专家 document_writer SimpleAgent( name文档生成专家, llmHelloAgentsLLM(), system_prompt你是一个文档生成专家。 你的任务是根据提供的信息生成结构化的Markdown报告。 报告应该包括 - 标题 - 简介 - 主要内容分点列出包括项目名称、描述等 - 总结 请直接输出完整的Markdown格式报告内容不要使用工具保存。 ) fs_tool MCPTool( namefs, server_command[npx, -y, modelcontextprotocol/server-filesystem, .] ) document_writer.add_tool(fs_tool) # 执行任务 search_task 搜索关于AI agent的GitHub仓库返回前5个最相关的结果 search_results github_searcher.run(search_task) print(搜索结果:) print(search_results) report_task f 根据以下GitHub搜索结果生成一份Markdown格式的研究报告 {search_results} 报告要求 1. 标题# AI Agent框架研究报告 2. 简介说明这是关于AI Agent的GitHub项目调研 3. 主要发现列出找到的项目及其特点 4. 总结总结这些项目的共同特点 请直接输出完整的Markdown格式报告。 report_content document_writer.run(report_task) print(报告内容:) print(report_content) with open(report.md, w, encodingutf-8) as f: f.write(report_content) print(报告已保存到 report.md)跑通之后观察三个验证点。第一MCP 工具调用日志里能看到search_repositories被触发参数是query: AI agents language:python。第二A2A 的消息流转体现在search_results从 Agent1 传到 Agent2 的report_task里这是最朴素的 Agent 间通信。第三ANP 的服务发现如果开了能在日志里看到calculator服务被注册和查询。核对调用日志时重点看模型请求有没有正常返回。如果HelloAgentsLLM()报连接错误八成是 Base URL 或 Key 没配对。日志里出现choices字段说明模型返回正常出现401说明 Key 有问题出现local proxy failed说明网络层配置有误。5. 本篇常见报错排查401、local proxy failed、reading choices、OAuth这一节按真实报错对照每条给原因和动作。401 Unauthorized。最常见Key 没填对或没生效。检查.env里OPENAI_API_KEY是不是 TaoToken 控制台创建的 Key注意不要有多余空格或引号。如果你用的是 Claude Code检查ANTHROPIC_API_KEY字段。改完重启进程环境变量不会热加载。local proxy failed。这个报错通常出现在工具配置了本地代理但代理没起来。检查你的 MCP Server 配置里有没有多余的proxy字段或者系统环境变量里有没有残留的代理设置。把HTTP_PROXY、HTTPS_PROXY清掉再试。注意这里说的是本地代理配置问题不是让你去配什么网络工具纯粹是环境变量清理。reading choices 相关报错。一般是模型返回结构不符合预期比如返回了错误信息而不是正常的choices数组。先确认 Model ID 填对了gpt-4o-mini和claude-3-5-sonnet-20241022不能混用。再确认 Base URL 是https://taotoken.net/api末尾不要多加/v1或斜杠具体以接入文档为准https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteOAuth 相关报错。GitHub MCP Server 需要GITHUB_PERSONAL_ACCESS_TOKEN如果你用的是 OAuth 流程检查 Token 权限有没有勾选repo和read:org。Token 过期也会报 OAuth 错误去 GitHub 设置里重新生成。MCP Server 启动失败。npx -y modelcontextprotocol/server-github第一次跑会下载包网络慢会超时。可以先手动执行一次npx -y modelcontextprotocol/server-github看能不能起来。如果报command not found确认 Node.js 和 npx 装了。A2A 连接被拒。A2ATool(http://localhost:5000)里的地址要和你实际启动的 Agent 服务地址一致。端口被占用就换一个服务没启动就先启动。ANP 服务发现为空。注册和发现要在同一个 ANP 实例或同一注册中心里。如果你注册用了一个实例、发现用了另一个自然查不到。确认register_service和discover_services走的是同一个ANPTool对象。排障时如果拿不准是模型通道问题还是协议问题先用模型对话页面单独测一下 Key 能不能正常出结果https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 模型通道通了再回头查协议配置。6. 协议选型与长期接入建议跑完这一章选型其实有个简单判断需要调外部工具就用 MCP需要 Agent 之间传任务就用 A2A需要动态发现服务就用 ANP。三者可以叠加不是三选一。如果你打算长期做多 Agent 项目建议把模型通道固定下来别每个 Agent 各配一套。TaoToken 的 Coding Plan 适合长期编码和 Agent 场景一个 Key 覆盖多个模型切换模型只改 Model IDhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewriteClaude Code 用户如果要把 Anthropic 系模型接进来配置参考https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude-code-anthropicutm_campaignrewrite最后给一个我踩过的坑MCP Server 的server_command里路径尽量用绝对路径相对路径在不同工作目录下跑会找不到文件。文件系统 MCP 的.参数表示当前目录如果你在别的目录启动脚本它读写的就是那个目录不是你以为的项目目录。这个坑不报错但结果会莫名其妙核对日志时留意一下工作目录。
阅读完成 · 觉得有帮助?
咨询建站