[{"data":1,"prerenderedAt":797},["ShallowReactive",2],{"header-counts":3,"footer-counts":6,"wiki-a2a":9},{"tools":4,"reviews":5},65,7,{"tools":4,"reviews":5,"playbooks":7,"news":8},10,8,{"id":10,"title":11,"body":12,"category":779,"description":110,"extension":780,"meta":781,"navigation":310,"path":782,"published":783,"relatedModels":784,"relatedTools":785,"seo":789,"slug":790,"stem":791,"summary":792,"tags":793,"updated":783,"__hash__":796},"wiki\u002Fwiki\u002Fa2a.md","A2A (Agent-to-Agent Protocol)",{"type":13,"value":14,"toc":763},"minimark",[15,20,29,38,41,44,57,60,87,93,96,101,104,203,214,217,225,228,231,341,352,356,443,446,450,453,523,530,533,536,586,589,674,678,707,710,713,724,731,734,759],[16,17,19],"h2",{"id":18},"什么是-a2a","什么是 A2A",[21,22,23,24,28],"p",{},"A2A（Agent-to-Agent Protocol）是 Google 于 2025 年提出的开放协议，解决",[25,26,27],"strong",{},"不同 Agent 之间如何通信和协作","的问题。",[21,30,31,32,37],{},"如果说 ",[33,34,36],"a",{"href":35},"\u002Fwiki\u002Fmcp.html","MCP"," 解决的是\"Agent 如何连接工具\"，那 A2A 解决的是\"Agent 如何连接其他 Agent\"。",[16,39,40],{"id":40},"解决什么问题",[21,42,43],{},"当前 Agent 生态是孤岛：",[45,46,47,51,54],"ul",{},[48,49,50],"li",{},"Coze 上的 Agent 不能调用 Dify 上的 Agent",[48,52,53],{},"Claude Code 不能委派任务给 Manus",[48,55,56],{},"企业自建 Agent 不能与外部 Agent 协作",[21,58,59],{},"A2A 提供标准化的通信协议，让任何 Agent 都能：",[61,62,63,69,75,81],"ol",{},[48,64,65,68],{},[25,66,67],{},"发现"," — 找到其他 Agent 的能力",[48,70,71,74],{},[25,72,73],{},"协商"," — 确认对方能否完成任务",[48,76,77,80],{},[25,78,79],{},"委派"," — 把子任务交给最合适的 Agent",[48,82,83,86],{},[25,84,85],{},"回调"," — 接收其他 Agent 的结果",[88,89,90],"blockquote",{},[21,91,92],{},"这与 SOA \u002F 微服务时代解决\"服务怎么互相找到对方\"是同一类问题。A2A 借鉴了 OpenAPI（自描述）和 OAuth（鉴权）的成熟模式，但把对象从\"服务\"换成\"Agent\"，多出了「长任务」「流式回包」「人在回路」三个 Agent 特有需求。",[16,94,95],{"id":95},"工作原理",[97,98,100],"h3",{"id":99},"agent-card","Agent Card",[21,102,103],{},"每个 Agent 暴露一个 Agent Card（类似名片），描述自己的能力：",[105,106,111],"pre",{"className":107,"code":108,"language":109,"meta":110,"style":110},"language-json shiki shiki-themes github-light github-dark","{\n  \"name\": \"code-review-agent\",\n  \"description\": \"Reviews code for bugs, security, and style\",\n  \"capabilities\": [\"code-review\", \"security-scan\"],\n  \"endpoint\": \"https:\u002F\u002Fexample.com\u002Fa2a\u002Fagent\",\n  \"auth\": \"bearer-token\"\n}\n","json","",[112,113,114,123,140,153,174,187,198],"code",{"__ignoreMap":110},[115,116,119],"span",{"class":117,"line":118},"line",1,[115,120,122],{"class":121},"sVt8B","{\n",[115,124,126,130,133,137],{"class":117,"line":125},2,[115,127,129],{"class":128},"sj4cs","  \"name\"",[115,131,132],{"class":121},": ",[115,134,136],{"class":135},"sZZnC","\"code-review-agent\"",[115,138,139],{"class":121},",\n",[115,141,143,146,148,151],{"class":117,"line":142},3,[115,144,145],{"class":128},"  \"description\"",[115,147,132],{"class":121},[115,149,150],{"class":135},"\"Reviews code for bugs, security, and style\"",[115,152,139],{"class":121},[115,154,156,159,162,165,168,171],{"class":117,"line":155},4,[115,157,158],{"class":128},"  \"capabilities\"",[115,160,161],{"class":121},": [",[115,163,164],{"class":135},"\"code-review\"",[115,166,167],{"class":121},", ",[115,169,170],{"class":135},"\"security-scan\"",[115,172,173],{"class":121},"],\n",[115,175,177,180,182,185],{"class":117,"line":176},5,[115,178,179],{"class":128},"  \"endpoint\"",[115,181,132],{"class":121},[115,183,184],{"class":135},"\"https:\u002F\u002Fexample.com\u002Fa2a\u002Fagent\"",[115,186,139],{"class":121},[115,188,190,193,195],{"class":117,"line":189},6,[115,191,192],{"class":128},"  \"auth\"",[115,194,132],{"class":121},[115,196,197],{"class":135},"\"bearer-token\"\n",[115,199,200],{"class":117,"line":5},[115,201,202],{"class":121},"}\n",[21,204,205,206,209,210,213],{},"Agent Card 一般挂在固定路径（如 ",[112,207,208],{},"\u002F.well-known\u002Fagent.json","），客户端通过 HTTP GET 拉取——和 OpenAPI 的 ",[112,211,212],{},"swagger.json"," 一个套路。",[97,215,216],{"id":216},"任务流程",[105,218,223],{"className":219,"code":221,"language":222},[220],"language-text","Agent A: \"我需要代码审查\"\n  ↓\n发现 Agent B 的 Agent Card → B 能做代码审查\n  ↓\nA 向 B 发送任务请求（附带代码）\n  ↓\nB 接受任务，开始审查\n  ↓\nB 返回审查结果给 A\n  ↓\nA 整合结果，继续主任务\n","text",[112,224,221],{"__ignoreMap":110},[97,226,227],{"id":227},"一次请求长什么样",[21,229,230],{},"A2A 在 HTTP 上跑 JSON-RPC 风格的方法，常见三个：",[105,232,236],{"className":233,"code":234,"language":235,"meta":110,"style":110},"language-jsonc shiki shiki-themes github-light github-dark","\u002F\u002F 1. 发起任务（异步，立刻返回 taskId）\nPOST https:\u002F\u002Fexample.com\u002Fa2a\n{\n  \"jsonrpc\": \"2.0\", \"id\": 1,\n  \"method\": \"tasks\u002Fsend\",\n  \"params\": {\n    \"id\": \"task-001\",\n    \"message\": {\n      \"role\": \"user\",\n      \"parts\": [{ \"type\": \"text\", \"text\": \"Review this diff: ...\" }]\n    }\n  }\n}\n\n\u002F\u002F 2. 查询任务状态（轮询或 SSE 订阅）\n{ \"method\": \"tasks\u002Fget\", \"params\": { \"id\": \"task-001\" } }\n\n\u002F\u002F 3. 取消任务\n{ \"method\": \"tasks\u002Fcancel\", \"params\": { \"id\": \"task-001\" } }\n","jsonc",[112,237,238,243,248,252,257,262,267,272,277,283,288,294,300,305,312,318,324,329,335],{"__ignoreMap":110},[115,239,240],{"class":117,"line":118},[115,241,242],{},"\u002F\u002F 1. 发起任务（异步，立刻返回 taskId）\n",[115,244,245],{"class":117,"line":125},[115,246,247],{},"POST https:\u002F\u002Fexample.com\u002Fa2a\n",[115,249,250],{"class":117,"line":142},[115,251,122],{},[115,253,254],{"class":117,"line":155},[115,255,256],{},"  \"jsonrpc\": \"2.0\", \"id\": 1,\n",[115,258,259],{"class":117,"line":176},[115,260,261],{},"  \"method\": \"tasks\u002Fsend\",\n",[115,263,264],{"class":117,"line":189},[115,265,266],{},"  \"params\": {\n",[115,268,269],{"class":117,"line":5},[115,270,271],{},"    \"id\": \"task-001\",\n",[115,273,274],{"class":117,"line":8},[115,275,276],{},"    \"message\": {\n",[115,278,280],{"class":117,"line":279},9,[115,281,282],{},"      \"role\": \"user\",\n",[115,284,285],{"class":117,"line":7},[115,286,287],{},"      \"parts\": [{ \"type\": \"text\", \"text\": \"Review this diff: ...\" }]\n",[115,289,291],{"class":117,"line":290},11,[115,292,293],{},"    }\n",[115,295,297],{"class":117,"line":296},12,[115,298,299],{},"  }\n",[115,301,303],{"class":117,"line":302},13,[115,304,202],{},[115,306,308],{"class":117,"line":307},14,[115,309,311],{"emptyLinePlaceholder":310},true,"\n",[115,313,315],{"class":117,"line":314},15,[115,316,317],{},"\u002F\u002F 2. 查询任务状态（轮询或 SSE 订阅）\n",[115,319,321],{"class":117,"line":320},16,[115,322,323],{},"{ \"method\": \"tasks\u002Fget\", \"params\": { \"id\": \"task-001\" } }\n",[115,325,327],{"class":117,"line":326},17,[115,328,311],{"emptyLinePlaceholder":310},[115,330,332],{"class":117,"line":331},18,[115,333,334],{},"\u002F\u002F 3. 取消任务\n",[115,336,338],{"class":117,"line":337},19,[115,339,340],{},"{ \"method\": \"tasks\u002Fcancel\", \"params\": { \"id\": \"task-001\" } }\n",[21,342,343,344,347,348,351],{},"任务状态机：",[112,345,346],{},"submitted → working → input-required → completed \u002F failed \u002F canceled","。",[112,349,350],{},"input-required"," 是 A2A 比传统 RPC 多出来的一档——长任务跑到一半需要补输入时，可以挂起等回包。",[16,353,355],{"id":354},"a2a-vs-mcp","A2A vs MCP",[357,358,359,374],"table",{},[360,361,362],"thead",{},[363,364,365,369,371],"tr",{},[366,367,368],"th",{},"维度",[366,370,36],{},[366,372,373],{},"A2A",[375,376,377,389,400,411,422,433],"tbody",{},[363,378,379,383,386],{},[380,381,382],"td",{},"连接对象",[380,384,385],{},"Agent ↔ 工具",[380,387,388],{},"Agent ↔ Agent",[363,390,391,394,397],{},[380,392,393],{},"提出者",[380,395,396],{},"Anthropic",[380,398,399],{},"Google",[363,401,402,405,408],{},[380,403,404],{},"通信模式",[380,406,407],{},"同步调用",[380,409,410],{},"异步任务 + 流式回包",[363,412,413,416,419],{},[380,414,415],{},"状态",[380,417,418],{},"单次往返为主",[380,420,421],{},"长任务有完整生命周期",[363,423,424,427,430],{},[380,425,426],{},"适用场景",[380,428,429],{},"工具调用",[380,431,432],{},"任务委派",[363,434,435,438,441],{},[380,436,437],{},"关系",[380,439,440],{},"互补",[380,442,440],{},[21,444,445],{},"两者可以组合使用：Agent A 通过 A2A 委派任务给 Agent B，Agent B 通过 MCP 调用工具完成任务。",[16,447,449],{"id":448},"a2a-vs-webhook-普通-rest","A2A vs Webhook \u002F 普通 REST",[21,451,452],{},"新人常问\"A2A 和我自己写个 Webhook 调对方 API 有啥不一样\"——主要差异在三处：",[357,454,455,466],{},[360,456,457],{},[363,458,459,461,464],{},[366,460,368],{},[366,462,463],{},"自写 REST\u002FWebhook",[366,465,373],{},[375,467,468,479,490,501,512],{},[363,469,470,473,476],{},[380,471,472],{},"能力发现",[380,474,475],{},"自己读对方文档",[380,477,478],{},"Agent Card 标准化",[363,480,481,484,487],{},[380,482,483],{},"长任务支持",[380,485,486],{},"自己实现轮询\u002F回调",[380,488,489],{},"协议内置任务状态机",[363,491,492,495,498],{},[380,493,494],{},"多 Agent 编排",[380,496,497],{},"每对 Agent 单独适配",[380,499,500],{},"一套协议接入所有 Agent",[363,502,503,506,509],{},[380,504,505],{},"鉴权",[380,507,508],{},"各家一套",[380,510,511],{},"标准 OAuth2 \u002F Bearer",[363,513,514,517,520],{},[380,515,516],{},"流式中间态",[380,518,519],{},"自己定 SSE 格式",[380,521,522],{},"协议规定 message parts 流式回包",[21,524,525,526,529],{},"简言之：能用 REST 解决的双方对接，A2A 并不省事；",[25,527,528],{},"它的价值在 N×M 互联","——一个 Agent 同时要调多家 Agent 服务时。",[16,531,532],{"id":532},"五分钟接入清单",[21,534,535],{},"第一次让你的 Agent 接受 A2A 调用，建议这个顺序：",[61,537,538,544,553,570,576],{},[48,539,540,543],{},[25,541,542],{},"挑一个能力点先暴露","——不要一上来就 mapping 所有内部函数，先选一个无副作用、文档清楚的（比如「查某 ID 的状态」）。",[48,545,546,549,550,552],{},[25,547,548],{},"写 Agent Card","——name \u002F description \u002F capabilities \u002F endpoint \u002F auth 五个字段先填上，跑个 GET ",[112,551,208],{}," 能拿到 200 就算第一关过。",[48,554,555,558,559,562,563,562,566,569],{},[25,556,557],{},"实现最小三方法","——",[112,560,561],{},"tasks\u002Fsend"," \u002F ",[112,564,565],{},"tasks\u002Fget",[112,567,568],{},"tasks\u002Fcancel","。返回先用 mock 数据，验证客户端能正确解析。",[48,571,572,575],{},[25,573,574],{},"接真实业务","——把 mock 换成真实逻辑，注意区分同步立返和异步长任务两种返回。",[48,577,578,581,582,585],{},[25,579,580],{},"加 Auth","——Bearer Token 起步，生产环境上 OAuth2。",[25,583,584],{},"不要","在没鉴权前把 Agent Card 暴露到公网。",[16,587,588],{"id":588},"常见踩坑",[45,590,591,612,624,644,657],{},[48,592,593,596,597,600,601,604,605,600,608,611],{},[25,594,595],{},"Agent Card 字段写\"我什么都能干\"","——客户端会按 capabilities 路由，写得太宽会被发各种意外任务。capabilities 写具体动词（",[112,598,599],{},"code-review","、",[112,602,603],{},"generate-image","），不要写形容词（",[112,606,607],{},"smart",[112,609,610],{},"powerful","）。",[48,613,614,619,620,623],{},[25,615,616,617],{},"同步阻塞 ",[112,618,561],{},"——任务超过几秒就应该立即返回 ",[112,621,622],{},"submitted"," 让对方轮询\u002F订阅；阻塞返回会让客户端的 timeout 各种炸。",[48,625,626,629,630,633,634,637,638,633,641,643],{},[25,627,628],{},"状态机偷懒","——只用 ",[112,631,632],{},"completed"," 和 ",[112,635,636],{},"failed","，跳过 ",[112,639,640],{},"working",[112,642,350],{},"，客户端就没法显示进度，也没法做人在回路。",[48,645,646,649,650,653,654,656],{},[25,647,648],{},"没做幂等","——同一个 ",[112,651,652],{},"taskId"," 被重发（网络重试），如果你的实现会再跑一次，副作用就会重复执行。",[112,655,561],{}," 必须按 ID 去重。",[48,658,659,662,663,666,667,670,671,347],{},[25,660,661],{},"Agent Card 缓存太久","——能力升级了但客户端拿到的还是老 card。带 ",[112,664,665],{},"ETag"," 和合理的 ",[112,668,669],{},"Cache-Control","，或者在 Card 里放 ",[112,672,673],{},"version",[16,675,677],{"id":676},"什么场景不该用-a2a","什么场景不该用 A2A",[45,679,680,686,692,698],{},[48,681,682,685],{},[25,683,684],{},"只有两个 Agent 长期一对一调用","——直接 REST 调用更轻，A2A 是为 N×M 准备的。",[48,687,688,691],{},[25,689,690],{},"延迟敏感（\u003C 100ms）的内部调用","——A2A 那套任务状态机 + 状态轮询有协议开销，进程内函数调用更合适。",[48,693,694,697],{},[25,695,696],{},"强一致事务","——A2A 是异步任务模型，不保证 ACID。账户转账这种场景应该用传统 RPC + 分布式事务。",[48,699,700,703,704,706],{},[25,701,702],{},"纯工具调用而非 Agent 协作","——用 ",[33,705,36],{"href":35},"，工具调用走 A2A 是杀鸡用牛刀。",[16,708,709],{"id":709},"生态现状",[21,711,712],{},"A2A 协议较新（2025 年提出），目前支持的平台：",[45,714,715,718,721],{},[48,716,717],{},"Google AI Studio \u002F Vertex AI",[48,719,720],{},"部分 LangChain Agent",[48,722,723],{},"尚未被 Coze \u002F Dify 等主流平台广泛支持",[21,725,726,727,730],{},"未来如果 A2A 普及，将出现\"Agent 市场\"——不同平台上的 Agent 可以自由组合协作。当下阶段（2026 中），",[25,728,729],{},"生产引入需谨慎","：协议本身在迭代，客户端 SDK 成熟度有限，先在内部 PoC 跑通了再考虑跨组织对接。",[16,732,733],{"id":733},"延伸阅读",[45,735,736,743,751],{},[48,737,738,739,742],{},"工具协议：",[33,740,741],{"href":35},"MCP（Model Context Protocol）","——Agent ↔ 工具的标准",[48,744,745,746,750],{},"基础概念：",[33,747,749],{"href":748},"\u002Fwiki\u002Fai-agent.html","AI Agent","——什么是 Agent、有哪些分类",[48,752,753,754,758],{},"工具调用：",[33,755,757],{"href":756},"\u002Fwiki\u002Ffunction-calling.html","Function Calling","——Agent 调外部函数的底层机制",[760,761,762],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":110,"searchDepth":142,"depth":142,"links":764},[765,766,767,772,773,774,775,776,777,778],{"id":18,"depth":125,"text":19},{"id":40,"depth":125,"text":40},{"id":95,"depth":125,"text":95,"children":768},[769,770,771],{"id":99,"depth":142,"text":100},{"id":216,"depth":142,"text":216},{"id":227,"depth":142,"text":227},{"id":354,"depth":125,"text":355},{"id":448,"depth":125,"text":449},{"id":532,"depth":125,"text":532},{"id":588,"depth":125,"text":588},{"id":676,"depth":125,"text":677},{"id":709,"depth":125,"text":709},{"id":733,"depth":125,"text":733},"protocol","md",{},"\u002Fwiki\u002Fa2a","2026-06-21",null,[786,787,788],"agent\u002Fplatform\u002Fcoze","agent\u002Fplatform\u002Fdify","agent\u002Fplatform\u002Flangflow",{"title":11,"description":110},"a2a","wiki\u002Fa2a","Google 提出的 Agent 间通信协议，让不同平台、不同框架的 AI Agent 能互相发现、协商、协作。",[373,794,795,399],"协议","Agent","La501G--sQWT60PYA--KHvN_CMg7oGI21WfbhHHLvtU",1782316490717]