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