議遠(yuǎn)程智能體接入:從零到一的智能體互通實(shí)戰(zhàn)指南)
ADK A2A 協(xié)議遠(yuǎn)程智能體接入從零到一的智能體互通實(shí)戰(zhàn)指南【免費(fèi)下載鏈接】adk-docsAn open-source, code-first toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ad/adk-docs如果你有多個(gè) ADK 智能體分布在不同的進(jìn)程里需要互相調(diào)用A2A 協(xié)議就是標(biāo)準(zhǔn)的打通方式。本文用三步從暴露到消費(fèi)跑通鏈路并解決端口沖突、agent 卡片缺失這類高頻坑。先跑起來(lái)Quick Start倉(cāng)庫(kù)里有一個(gè)現(xiàn)成的 Go 示例 examples/go/a2a_basic直接啟動(dòng)一個(gè)遠(yuǎn)端 A2A 服務(wù)export GOOGLE_API_KEY你的模型Key cd examples/go/a2a_basic/remote_a2a/check_prime_agent go run main.go # 啟動(dòng) A2A 服務(wù)端口 8001 curl http://localhost:8001/.well-known/agent-card.json跑完你會(huì)看到go run打出Starting A2A prime checker server on port 8001而最后那條curl會(huì)返回一份 JSON 智能體卡片里面帶name、skills、url三個(gè)字段??ㄆ苋〉骄驼f(shuō)明這個(gè)智能體已經(jīng)開(kāi)門營(yíng)業(yè)可以被其他智能體調(diào)用了。Python 版本則是pip install google-adk[a2a]后用to_a2a()加uvicorn起服務(wù)下文實(shí)操部分會(huì)展開(kāi)。它到底在干什么A2A 原理拆解問(wèn)題你的客服智能體跑在自己的服務(wù)里庫(kù)存智能體是另一個(gè)團(tuán)隊(duì)維護(hù)、跑在另一個(gè)進(jìn)程里。直接 import 對(duì)方的代碼對(duì)方的任何接口改動(dòng)都會(huì)讓你跟著崩而且根本拿不到人家的源碼。方案給庫(kù)存智能體加一層 A2A Server把它我是誰(shuí)、會(huì)干什么寫成一份固定地址可訪問(wèn)的智能體卡片agent card調(diào)用方只需要知道這張卡片的 URL。機(jī)制ADK 把這件事拆成兩個(gè)組件。服務(wù)提供方用to_a2a()把現(xiàn)成的 Agent 包成一個(gè) Starlette 應(yīng)用自動(dòng)生成智能體卡片——從你的 Agent 配置里提取 description、工具和技能掛在.well-known/agent-card.json這個(gè)約定地址下消費(fèi)方用RemoteA2aAgent指向卡片 URLADK 會(huì)自動(dòng)拉取卡片、完成網(wǎng)絡(luò)請(qǐng)求、事件序列化和格式轉(zhuǎn)換。對(duì)你的 root agent 來(lái)說(shuō)它只是sub_agents列表里多了一個(gè)成員。智能體卡片就像門店的招牌加營(yíng)業(yè)時(shí)間顧客不需要知道倉(cāng)庫(kù)內(nèi)部怎么運(yùn)轉(zhuǎn)照著招牌上的地址下單就行。順帶一提ADK 的 A2A 集成還內(nèi)置了三個(gè)能力透?jìng)髂P偷耐评碥壽EReasoning、追蹤超長(zhǎng)耗時(shí)工具調(diào)用避免超時(shí)、在智能體之間傳遞文件產(chǎn)物Artifacts。選型對(duì)比——什么時(shí)候用 A2A什么時(shí)候別用維度本地子智能體sub_agentsRemoteA2aAgentA2A自寫 REST API tool 函數(shù)部署復(fù)雜度最低同一進(jìn)程中遠(yuǎn)端需單獨(dú)跑 A2A 服務(wù)中高接口需自己定義和維護(hù)延遲內(nèi)存內(nèi)調(diào)用最低多一跳網(wǎng)絡(luò)毫秒到秒級(jí)與 A2A 相當(dāng)?shù)b權(quán)錯(cuò)誤處理全靠自己適用團(tuán)隊(duì)規(guī)模單人或同一團(tuán)隊(duì)多團(tuán)隊(duì)、跨組織協(xié)作小規(guī)模、固定對(duì)接兩三個(gè)服務(wù)語(yǔ)言要求與宿主同語(yǔ)言跨語(yǔ)言Python/Go/Java/Kotlin 均支持任意語(yǔ)言但接口是私有約定幾個(gè)判斷句如果你的協(xié)作只是把一個(gè)應(yīng)用內(nèi)的任務(wù)拆成模塊直接寫本地子智能體如果遠(yuǎn)端智能體由別的團(tuán)隊(duì)維護(hù)或用不同語(yǔ)言編寫比如 Python 主智能體接 Java 庫(kù)存服務(wù)選 A2A如果只是臨時(shí)對(duì)接一個(gè)現(xiàn)成 HTTP 服務(wù)、對(duì)方又不打算改造成 A2A先用 tool 函數(shù)包一層 REST等對(duì)接面變大再遷移。明確不適合的情況高頻低延遲的內(nèi)部調(diào)用、子智能體需要直接讀寫主智能體內(nèi)存狀態(tài)的場(chǎng)景——序列化和網(wǎng)絡(luò)開(kāi)銷會(huì)讓 A2A 變成負(fù)資產(chǎn)。動(dòng)手實(shí)踐從 A2A 暴露到消費(fèi)Step 1用 to_a2a() 暴露智能體from google.adk.agents import Agent from google.adk.a2a.utils.agent_to_a2a import to_a2a inventory_agent Agent( modelgemini-flash-latest, nameinventory_agent, instruction你是庫(kù)存查詢智能體查詢庫(kù)存時(shí)必須調(diào)用 query_stock 工具。, tools[query_stock], ) a2a_app to_a2a(inventory_agent, port8001) # port 只是寫進(jìn)卡片URL真正監(jiān)聽(tīng)端口由 uvicorn 決定這一步做了什么把普通 Agent 變成可被網(wǎng)絡(luò)訪問(wèn)的 A2A 應(yīng)用智能體卡片由 ADK 自動(dòng)生成不用手寫。Step 2起服務(wù)并驗(yàn)證卡片uvicorn my_app:inventory_agent_module --host localhost --port 8001 # 注意 --port 要和 to_a2a 的 port 一致 curl http://localhost:8001/.well-known/agent-card.json預(yù)期輸出節(jié)選{name: inventory_agent, url: http://localhost:8001, description: 你是庫(kù)存查詢智能體……, version: 0.0.1, ...}卡片能取到、url字段指向正確地址服務(wù)端才算就緒。Step 3用 RemoteA2aAgent 消費(fèi)from google.adk.agents import Agent from google.adk.agents.remote_a2a_agent import RemoteA2aAgent remote_inventory RemoteA2aAgent( nameinventory_agent, description遠(yuǎn)程庫(kù)存查詢智能體, agent_cardhttp://localhost:8001/.well-known/agent-card.json, # 填 Step 2 驗(yàn)證過(guò)的卡片地址 ) root_agent Agent( modelgemini-flash-latest, nameservice_root, sub_agents[remote_inventory], # 和本地子智能體寫法完全一樣 )遠(yuǎn)程智能體和本地智能體在代碼里長(zhǎng)得一模一樣root agent 用自然語(yǔ)言決定何時(shí)把任務(wù)委托給它剩下的網(wǎng)絡(luò)細(xì)節(jié) ADK 全包了。除了to_a2a()還有一種暴露方式是adk api_server --a2a它可以直接和adk web搭配調(diào)試且能指向一個(gè)含多個(gè)智能體的父目錄但要求每個(gè)智能體文件夾里手動(dòng)寫好agent.json卡片細(xì)節(jié)見(jiàn) docs/a2a/quickstart-consuming.md。一個(gè)完整的業(yè)務(wù)場(chǎng)景場(chǎng)景電商客服智能體要回答這個(gè) SKU 還有貨嗎而庫(kù)存能力在另一個(gè)團(tuán)隊(duì)維護(hù)的庫(kù)存服務(wù)里。Before沒(méi)有 A2A客服團(tuán)隊(duì)沒(méi)有標(biāo)準(zhǔn)接口可用只能求庫(kù)存團(tuán)隊(duì)導(dǎo)一個(gè)內(nèi)部 REST API自己寫鑒權(quán)、自己解析私有 JSON庫(kù)存服務(wù)接口字段一改客服側(cè)必須跟著發(fā)版兩邊靠口頭約定的契約耦合出問(wèn)題時(shí)各說(shuō)各話After接入 A2A庫(kù)存智能體用to_a2a()暴露會(huì)干什么、收什么格式全寫在卡片里這就是正式契約客服側(cè)只加一個(gè)RemoteA2aAgent對(duì)話里自然語(yǔ)言即可觸發(fā)庫(kù)存查詢庫(kù)存服務(wù)升級(jí)只改服務(wù)端和卡片客服側(cè)代碼不動(dòng)調(diào)試時(shí)把a(bǔ)dk web指向消費(fèi)方智能體左側(cè) Trace/Events 面板能看到遠(yuǎn)程調(diào)用事件的完整鏈路和調(diào)本地工具的體驗(yàn)一致。踩坑與注意事項(xiàng)現(xiàn)象RemoteA2aAgent拉卡片失敗或調(diào)用永遠(yuǎn) 404。原因to_a2a(port8001)只是把 8001 寫進(jìn)卡片 URL它本身不監(jiān)聽(tīng)端口uvicorn --port起在別的端口時(shí)卡片就指向了不存在的地址。解法port參數(shù)必須和uvicorn --port保持一致起完服務(wù)先curl卡片確認(rèn)再連消費(fèi)端?,F(xiàn)象adk api_server --a2a服務(wù)正常啟動(dòng)但對(duì)方找不到你的智能體。原因這條命令只暴露包含agent.json文件的智能體文件夾沒(méi)有卡片等于不存在。解法在智能體目錄補(bǔ)上agent.json至少含name、url、skills并核對(duì)卡片里url與服務(wù)的實(shí)際路徑前綴一致?,F(xiàn)象起調(diào)試界面時(shí)端口被占用服務(wù)起不來(lái)。原因adk web默認(rèn)占 8000 端口示例里的 A2A 服務(wù)在 8001如果你把 A2A 也改成 8000 就會(huì)撞車。解法保持約定8000 留給調(diào)試 UIA2A 服務(wù)從 8001 起排多智能體時(shí)逐個(gè)遞增。一個(gè)to_a2a()讓你的智能體上線一個(gè)RemoteA2aAgent讓對(duì)方把它當(dāng)本地子智能體用這就是 A2A 的核心鏈路。Python 暴露與消費(fèi)的完整流程見(jiàn) docs/a2a/quickstart-exposing.md 和 docs/a2a/quickstart-consuming.mdGo、Java、Kotlin 版本指南匯總在 docs/a2a/index.md。可運(yùn)行的雙端示例在 examples/go/a2a_basic/流式模式下遇到消息重復(fù)可以再看 docs/a2a/a2a-extension.md?!久赓M(fèi)下載鏈接】adk-docsAn open-source, code-first toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ad/adk-docs創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考